Matematické Fórum

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

#1 04. 04. 2014 20:43 — Editoval jane338 (04. 04. 2014 20:50)

jane338
Příspěvky: 32
Reputace:   
 

Retazec abecedy v C a mazanie pismen

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.

Code:

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

 

#2 05. 04. 2014 16:39 — Editoval hradecek (05. 04. 2014 16:40)

hradecek
Příspěvky: 772
Pozice: Student
Reputace:   25 
Web
 

Re: Retazec abecedy v C a mazanie pismen

↑ 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.

Code:

#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;
}

Netrápte sa nad svojimi problémami s matematikou, môžem vás uistiť, že tie moje sú ešte väčšie. ~~Albert Einstein~~
Jak spozná člověk, že není pitomec ? - Moudrý člověk to nepozná nikdy a blbci je to jedno. ~~Jak přicházejí básnici o iluze~~
Někteří lidi se nikdy nezmění. Anebo se rychle změní a pak se zase rychle změní nazpátek. ~~Homer Simpson~~

Offline

 

#3 05. 04. 2014 19:17 — Editoval jane338 (05. 04. 2014 19:18)

jane338
Příspěvky: 32
Reputace:   
 

Re: Retazec abecedy v C a mazanie pismen

↑ 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:

Code:

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

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson