Diskuze: Cykly a problém s ordinální hodnotou

Aktivity (2)
Avatar
Nicolas Snopek:25. února 21:24

Ahoj, nejde mi vypsat nejmenší a nejvyšší ordinální hodnota znaků, tzn. char typ..

Zkusil jsem: Zkoušel jsem již zoufalou situaci a to:

do
{
        if ((zn>='a')&&(zn<='z'))
        {
                PM++;
        }
        if ((zn>='A')&&(zn<='Z'))
        {
                PV++;
                printf ("\nPismeno bylo automaticky prevedno na male: %c",zn+32);
        }
        if ((zn>='K')&&(zn<='P'))
        {
                PVINT++;
        }
        if (max<zn)
        {
                max=zn;
        }
        if (min>zn)
        {
                min=zn;
        }
        printf ("\n");
scanf (" %c",&zn);

}while (zn!='k');

printf ("\nPocet velkych pismen: %d",PV);
printf ("\nPocet malych pismen: %d",PM);
printf ("\nPocet pismen v intervalu K az P: %d",PVINT);
printf ("\nZnak s nejvetsi ordinalni hodnotou: %d",zn);
printf ("\nZnak s nejmensi ordinalni hodnotou: %d",zn);

Chci docílit: Aby mi to vypsalo nejvyšší a nejmenší ordinální hodnotu.

 
Odpovědět 25. února 21:24
Avatar
Odpovídá na Nicolas Snopek
Tomáš Novotný:25. února 21:28

poslední 2 řádky? vypsat zn? nemá tam být max a min?

Nahoru Odpovědět 25. února 21:28
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Tomáš Novotný:25. února 21:34

navíc jak může být ve while !='k' když 'k' je obsaženo v rozsahů malých písmen jejichž počet zjišťuješ?
tj.... aksdfsdflkadsjhfjas­gdfjgFAAGfg
hned druhý znak (k) by ukončil while cyklus...

Nahoru Odpovědět 25. února 21:34
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Odpovídá na Tomáš Novotný
Nicolas Snopek:25. února 21:47

Promiň, že náš profesor je tak trochu mimo. Zadal, že koncový znak je k.

 
Nahoru Odpovědět 25. února 21:47
Avatar
Odpovídá na Nicolas Snopek
Tomáš Novotný:25. února 21:52

takže 'k' není nikde jinde? jen na konci? nebo se to skutečně má ukončit u prvního 'k'? docela záleží na zadání, které mi tu chybí... jako může to tak být, ale je to divné, možná je to školní chyták, než že by to mělo praktický význam :-)

// aha edit pardon obrázku jsem si fakt nevšiml :D

Editováno 25. února 21:55
Nahoru Odpovědět 25. února 21:52
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Tomáš Novotný:25. února 22:01

tak to tak může být ... podle zadání je správně když prvním 'k' se to ukončí...
takže uprav

printf ("\nZnak s nejvetsi ordinalni hodnotou: %d",max);
printf ("\nZnak s nejmensi ordinalni hodnotou: %d",min);

nastav si třeba max = 0 a min = 9999
a mělo by to fungovat...

Nahoru Odpovědět 25. února 22:01
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Odpovídá na Tomáš Novotný
Nicolas Snopek:25. února 22:10

Jojo, už mi to funguje, byl problém pouze v tom, jak píšeš. I s max = 9999 a min = -9999 to funguje.. :D

Každopádně díky moc.

 
Nahoru Odpovědět 25. února 22:10
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Nicolas Snopek
DarkCoder:25. února 22:44

Promiň, že náš profesor je tak trochu mimo.

Ač mám na výuku programování na školách svůj názor, tohle je dosti odvážné tvrzení. Zvláště když zadání úlohy není v absolutně žádném rozporu. Úloha, ač možná není nejpraktičtější, má za úkol zlepšit programátorovo logické uvažování. Doporučuji se připravit na obhajobu následujícího (nejdůležitějších bodů):

  1. Proč vkládáš do programu knihovnu stdlib.h? Jaký tam má význam?
  2. Proč v programu bezdůvodně používáš knihovnu conio.h? Je opravdu nutná?
  3. Proč používáš v programu funkci main() s návratovou hodnotou void nikoli int? Proč si nechceš nechat otestovat operačním systémem to, zda aplikace skočila v pořádku?
  4. Proč používáš pro načtení znaku funkci scanf() a nikoli getchar()?
  5. Po spuštění programu, je uživateli vše dostatečně srozumitelné co má dělat?
  6. Proč bod d vypisuje číselnou hodnotu nikoli znak, který zadání vyžaduje?
  7. Proč je čtecí funkce na konci cyklu a ne na jeho začátku?

Zamysli se dobře nad těmito body. Úloha na pár řádek a kolik se toho dá zlepšit...

Nahoru Odpovědět 25. února 22:44
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Nicolas Snopek:25. února 23:26

Dobrá, to, že jsem napsal tuhle kravinu neřešme, byl to zcela zbytečný argument. Každopádně by mě zajímalo, jak zapsat ten znak nikoliv max,min hodnotu, jelikož vždy to vyhodí znak 'k', protože je uložen v proměnné zn, jelikož koncový znak je k a program to bere zřejmě jako poslední uloženou hodnotu v proměnné zn.

  1. Netuším, sám nevím, jaký to má význam a je třeba se to doučit.
  2. conio.h používám k tomu, aby se mi program nezavřel po dokončení.
  3. Napraveno.
  4. Používám scanf, protože nám bylo ve výuce řečeno ať používáme normálně scanf.., samozřejmě zítra tuto otázku využiji a poptám se.
  5. Nad srozumitelností programu se nedívám, jelikož je to pouze na cvičení, tak mi na tom nezáleží. Ovšem, pokud by se jednalo o program danému uživateli, tak by určitě došlo k velkým změnám.
  6. Zodpovězeno nahoře.. :D
  7. Chápu, je to blbost a přesunul jsem to na vrch.

Díky zatím za tvé rady!

 
Nahoru Odpovědět 25. února 23:26
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Nicolas Snopek
DarkCoder:25. února 23:59

Zde jsou odpovědi na otázky výše:

  1. Vložení knihovny stdlib.h je zde naprosto zbytečné, neboť nevyužíváš žádnou z její funkcí. (např. exit(), rand(), malloc(), atd.). Využíváš zde a pouze funkce standartní knihovny jazyka C stdio.h.
  2. Knihovna conio.h není součástí standardní knihovny jazyka C. Není tedy zaručeno, že aplikace bude vždy a všude fungovat. Ano, knihovna conio.h má spoustu vysoce užitečných funkcí (kbhit(), getch(), getche(), atd.), ale zde se dá program pozastavit např. pomocí funkce getchar().
  3. Je rozhodně lepší používat funkci main() s návratovou hodnotou int a vracet hodnotu pomocí return popř. pomocí exit().
  4. Funkce scanf() se používá zejména pro načítání číselných hodnot a pro vícero vstupních dat v jednom kroku. Je obecnější a oproti getchar() pomalejší. Ač to funguje, v profesionálně psaných programech tohle neuvidíš.
  5. Uživatel není přesně obeznámen s tím co se po něm chce. Má zadat písmeno a enter nebo celou sadu písmen, neví co způsobí klávesa 'k'. Může být překvapen z neočekávaného výstupu. Je třeba se naučit přesně podávat informace, jen tak se můžeš dočkat správných výsledků. Není to o tolik znaků navíc za jasný požadavek uživateli.
  6. Zadání očekává znak s nejvyšším ordinálním číslem (hodnotou ASCII), nikoli ordinální hodnotu znaku s nejvyšší ordinální hodnotou. Tedy jako specifikaci formátu ve funkci printf() použiji %c nikoli %d.
  7. Již první načtení znaku bude na začátku do-while cyklu. Vím že si chtěl aby se hodnota znaku 'k' do výsledku nezapočítávala. To však není vůbec v rozporu se zadáním ji tam nechat.
Nahoru Odpovědět 25. února 23:59
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.