Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Ahojte.
Mám v Cčku napísanú funkciu, ktorej vstupne parametre sú reťazec abecedy a reťazec x-pismen.
funkcia samotná vytvorí abecedu a potom z nej vymaže písmenká, ktoré sú zadané v druhom reťazci.
problém je ten, že funkcia mi vyrobí reťazec, síce z neho zmaže to, čo má, ale stále vznikne toto:
"abcdefghijklmnopqrstuvwxyz{" teda so znakom "{" na konci.
void aktualizujAbecedu(char pismenka[], char abeceda[]) { int dlzka_pismenok=strlen(pismenka); int pp=strlen(abeceda); int s; int i, j, r; int position; for(i=0; i<27; i++) { abeceda[i]=97+i; } for(i=0; i<dlzka_pismenok; i++) { for(r=0; r<dlzka_pismenok; r++) { for (j=0; j<pp; j++) { if(pismenka[r]==abeceda[j]) { position=j; } } } for(s=position; s<pp; s++) { abeceda[s]=abeceda[s+1]; } pp--; } //printf("%s\n", abeceda); }
prosím, nájde sa tu niekto ochotný? resp. mi poradí, ako tam tie písmenká mazať lepšie/efektívnejšie/ľahšie? Ďakujem
Offline
↑ jane338:
No mne to teda nerobí to čo má (:. Teda ak som správne pochopil. Funkcia ti vytvorí anglickú abecedu, z ktorej odmaže písmená "pismenka" a tú modifovanú vráti...tak?
(i) 97+26=123 (ASCII) ~> '}'
(ii) Existuje nejaký dôvod, prečo abecedu dávaš ako parameter, keď ju potom premažeš. To môže mať veľmi nepríjemný dôsledok. Čo sa stane ak bude pole "abeceda" v argumente veľkosti 5?
Možno niečo takéto? Princíp je, že písmená, ktoré chceš odmazať, si označkujem, prepíšem na 'X'. A potom všetky ostatné skopírujem do nového poľa.
#define ALPHABET_SIZE 26 char* makeAlphabet(int size) { int i; char* alphabet = (char*)malloc(sizeof(char)*size); for(i = 0; i < size; ++i) { alphabet[i] = 97 + i; } return alphabet; } void makeModifiedAlphabet(char** newAlphabeth, char* alphabeth) { int i, j; for(i = 0, j = 0; i < strlen(alphabeth); ++i) { if(alphabeth[i] != 'X') { printf("%c", alphabeth[i]); (*newAlphabeth)[j++] = alphabeth[i]; } } } char* modifyAlphabet(char *letters) { int i, removed = 0; char* alphabet = makeAlphabet(ALPHABET_SIZE); for(i = 0; i < strlen(letters); ++i) { char* c; for(c = strchr(alphabet, letters[i]); c != NULL; c = strchr(c+1, letters[i])) { alphabet[c-alphabet] = 'X'; ++removed; } } char *newAlphabeth = (char*)malloc((ALPHABET_SIZE-removed)*sizeof(char)); makeModifiedAlphabet(&newAlphabeth, alphabet); free(alphabet); return newAlphabeth; }
Offline
↑ hradecek:
áno, dobre chápeš.
ten koncový znak som už vyriešila :) a robí to to, čo má.
a áno, abeceda musí byť ako vstupný parameter (mám to dané).
teraz mám už len taký problém, že po tom, ako mi to prešlo cez CUnit testing, v niektorých prípadoch vypisuje také niečo:
4: getAbeceda("abcdefgh") != "ijklmnopqrstuvwxyz" ["ijklmnopqrstttttttttuvwxyz"]
ale všimla som si, že taká chyba je len pri párnom počte písmen, s nepárnym počtom písmenok nie je problém.
getAbeceda( písmenka, ktoré maju byť zmazané) != (spravny vysledok) [moj vysledok].
a tvoje riešenie sa mi pozdáva, ale kódu veľmi nerozumiem :)
Offline