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