Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Jazyk C (program pro výpočet četnosti znaků vstupního textu)

Dobrý den,
Neotravoval bych, kdybych nebyl fakt zoufalej, zítra máme deadline prvního projektu a já se nemůžu dostat dál. Jak už říká téma, máme vytvořit program, který bude skenovat znaky ze vstupu a seřazovat je od nejčetnějšího. Co mám a funguje je tohle:

    unsigned char c;
    int cetnost[255]={0};
    while ((c=getchar())!=EOF)                //uklada znaky textu do c
    {
    cetnost[c] = cetnost[c]+1;                //pricita jednicky do jednotlivych poli
    printf("%d '%c': %d\n",c,c,cetnost[c]);   //zkouska

Na co bych potřeboval nakopnout je seřazení těch četností a eliminace znaků, který už byly vypsaný. Každý nápad, který příjde beru a zkusím a předem za něj děkuju.

Předmět Autor Datum
Příkladů na seřazení (sort) v C je plný internet.
Wikan 27.10.2012 19:59
Wikan
Zdravím kolegu z FITu :-). Ty znaky není potřeba v paměti seřazovat. Je to i v zadání. Ptal jsem se…
Niko Bellic 27.10.2012 20:28
Niko Bellic
Díky za rady, takhle jsem o tom nepřemýšlel.:-P Jasný no, je to pozdě, byl sem pořád v klidu, že to…
Imunee 27.10.2012 20:38
Imunee
Hele díky moc, seřazení v pohodě. Jen mi ještě nejde do hlavy jedna věc a to jak udělat, aby to vyps…
Imunee 28.10.2012 16:38
Imunee
argv je typu string, a je integer takze by to chcelo pouzit daku vtipnu funkciu na prevod, napr atoi
nl12345 28.10.2012 16:54
nl12345
Hodnotu vstupního parametru příkazového řádku musíte vyčíslit sami. Je zakázáno používat knihovní fu… poslední
Imunee 28.10.2012 17:08
Imunee

Zdravím kolegu z FITu :-). Ty znaky není potřeba v paměti seřazovat. Je to i v zadání. Ptal jsem se zde na ten samý problém.

http://pc.poradna.net/q/view/894110-pole-struktur- v-c-vypis-prvku-podle-kriterii

Tehdy jsem ještě nevěděl, jak to vyřešit bez řazení a moje implementace přes strukturu byla zbytečně složitá. Ale ono je to jednoduché. V cyklu opakuješ tyto kroky:

1. Procházej polem a hledej max. hodnotu. Jak to udělat je snad jasné. Současně si však ukládej index toho prvku, kde se nachází to nejvyšší číslo. Já si na to třeba udělal funkci, která ten index vrací.
2. Máš index nejčetnějšího prvku - vypiš ho podle zadání. Index představuje ord. hodnotu (vypiš jako znak) a pole[index] četnost (vypiš jako číslo).
3. Vynuluj četnost toho konkrétního znaku - pole[index] = 0

Tento cyklus opakuj N-krát (N je parametr z příkazové řádky, tedy 1 - 256). Vynulování četnosti způsobí, že při dalším hledání největší hodnoty v poli se tato právě vypsaná hodnota už nezohledňuje - najdeš tak druhou, třetí, čtvrtou, pátou ... největší četnost. Prvky jsou už navíc z principu seřazeny podle ord. hodnoty, takže pokud má několik znaků stejnou četnost, vypíší se automaticky v pořadí podle ord. hodnoty a nemusíš to nijak řešit.

Ještě poznámka k tomu poli. Máme pracovat s 8-bitovou tabulkou - musí to teoreticky rozpoznat 256 znaků, ale ty máš pole pouze na 255 znaků. A datový typ pro práci s četností má být unsigned char, aby max. četnost byla UCHAR_MAX-1, tedy 254 - to je taky ze zadání. Pokud četnost bude vyšší, má to vypsat NNN.

Jinak je trochu pozdě to řešit až teď. Co třeba konzultace na cvičeních, na oficiálním fóru k projektům, nebo na fitušce?

Díky za rady, takhle jsem o tom nepřemýšlel.:-P Jasný no, je to pozdě, byl sem pořád v klidu, že to nějak udělám a jak to dopadlo. A psát na fitušku nebo tak někam by mi přišlo teď už trošku blbý. Mám mezery v základech, utekla mi nějaká ta přednáška a už v tom lítám.:-P Každopádně ještě jednou díky za rady, vypadá to, že mám na večer o zábavu postaráno. :-)

Hele díky moc, seřazení v pohodě. Jen mi ještě nejde do hlavy jedna věc a to jak udělat, aby to vypsalo jen tolik řádků, kolik si zadám v příkazovým řádku. Mam tam neco jako:

...
int a=0;
...
while(a<argv[1])
{
...
a++;
}

Zkoušel jsem všechno možný, ale většinou mi to ani překladač nepřeložil nebo to prostě nefungovalo, jak má. Budu zase rád za jakoukoliv radu. Předem díky moc.

Hodnotu vstupního parametru příkazového řádku musíte vyčíslit sami. Je zakázáno používat knihovní funkce jazyka C, které řeší problémy převodu z textového řetězce na číslo. Tohle je přímo v zadání, takže bohužel to asi neprojde.:-D Každopádně díky za nápad.

Zpět do poradny Odpovědět na původní otázku Nahoru