Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Turbo Pascal - příkaz case

Dobrý den, učím se programovat v Turbo Pascalu a dostal jsem za úkol naprogramovat telefonní seznam. Nevím ale, jak naprogramovat jednotlivé příkazy.

Ukázka programu:

program tel_seznam;
uses crt;

...

var seznam:useznam;
    A:string;

...

begin
     clrscr;
...

     repeat writeln('Zadej prikaz: ');
     read(A);

     case A of
          'zrusit': zrus;
          'hledat': writeln('Co mam hledat? ');
                    
     else writeln('Neznamy prikaz. Zkus to znovu.');
     end;

     until A=zrusit;

     repeat until keypressed;
end.

Mám zadefinovanou proměnnou A jako řetězec string. Pak v samotném těle programu zadám příkaz, načte se do A a pomocí příkazu case si zavolám procedura (př. zrus). Ale když se pokusím program spustit, napíše mi chybu "ordinal expression expected" u příkazu case. Možná mám nějak špatně to načítání slov do proměnné. Po pravdě moc nevím, jak se to dělá. Ve škole jsme do proměnných načítali většinou jen čísla. Děkuji moc za pomoc. Už si vážně nevím rady.

Předmět Autor Datum
Popravdě o Pascalu nevíš vůbec nic. Máme ti napsat celý program (kterému nebudeš lautr rozumět), neb…
Rce 22.01.2011 00:30
Rce
nejspíš to A nemůže být string to case of se mi zdá dost těžkopádné...solil bych tam klasické IF
MM_tank 22.01.2011 02:25
MM_tank
naopak, case je v případě více než dvou voleb daleko efektivnější. Jinak výše zmíněný "program" je…
touchwood 22.01.2011 08:28
touchwood
My se v něm učíme programovat 3 měsíce, takže se omlouvám, jestli je tam něco špatně. V zadání úkolu…
Milda 22.01.2011 09:24
Milda
Ale když se pokusím program spustit, napíše mi chybu "ordinal expression expected" u příkazu case.…
Pavel 22.01.2011 08:37
Pavel
Zkoušel jsem typ char, ale to je zase jenom jedno písmeno. A jiný ordinální typ, co by se mi hodil j…
Milda 22.01.2011 09:19
Milda
Když dám A typu integer a místo příkazu 'zrusit' a 'hledat' napíšu čísla '1' a '2', tak mi program n…
Milda 22.01.2011 09:12
Milda
naopak mně to připadne velmi efektivní. Než se pokaždé vypisovat, je lepší mačkat jednu klávesu. Nem…
touchwood 22.01.2011 12:25
touchwood
(H)ledej, (P)řidej, (N)ačti, (S)maž) To už by zrovna mohl doprogramovat klávesové zkratky alt + H,…
Redsnake 22.01.2011 12:33
Redsnake
String neni ordinarni typ. To znamena, ze string v case pouzit nemuzes. Bud zmenis prikazy ze string…
Jan Fiala 22.01.2011 12:44
Jan Fiala
Tak jsem se rozhodl, že tam napíšu seznam čísel a příkazů a udělám to pomocí case. Ale ještě mám pro…
Milda 22.01.2011 18:42
Milda
Netuším, kde je chyba - vyzerá to byť OK... Určite by som volil všade Readln nie Read - to znamená,…
pme 22.01.2011 19:00
pme
Netuším proč, ale napsal jsem tam Readln a najednou to jede. Ale před tím jsem to zkoušel a nešlo to…
Milda 22.01.2011 19:03
Milda
To není vada, ale vlastnost, prostě read u řetězců (nebo jednoho znaku) funguje trochu jinak, tam se…
JoDiK 22.01.2011 19:48
JoDiK
readkey se ale v základech pascalu neučí, takže ať tam radši nechá to readln poslední
Nigfire 22.01.2011 21:11
Nigfire

Ale když se pokusím program spustit, napíše mi chybu "ordinal expression expected" u příkazu case.

Jak to chápu já: příkaz case vyžaduje proměnnou ordinálního typu, což evidentně string není. Takže mrkni do helpu nebo na gůgl, co je to ordinální datovej typ.

Pavel

Když dám A typu integer a místo příkazu 'zrusit' a 'hledat' napíšu čísla '1' a '2', tak mi program normálně funguje. Prostě v programu zadám například číslo 1 a ten pak vyvolá proceduru zrušit. Jenom prostě nevím, jak načíst celé slovo. Jestli sem mám napsat i všechny procedury a zadefinovaný seznam, tak to sem klidně dám. Ale s tím nemám problém. Hlavní jsou ty příkazy v samotném programu. Zadávat je pomocí čísel mi přijde dost neefektivní.

naopak mně to připadne velmi efektivní. Než se pokaždé vypisovat, je lepší mačkat jednu klávesu. Nemyslíš?

edit: pokud trváš na stringu, můžeš to udělat tak, že z načteného stringu vytáhneš první písmeno do proměnné char, a to pak použiješ pro Case (tedy např. (H)ledej, (P)řidej, (N)ačti, (S)maž)

String neni ordinarni typ. To znamena, ze string v case pouzit nemuzes.
Bud zmenis prikazy ze stringu na neco jineho:
- u char se brzo dostanes do problemu, protoze budes mit jen omezeny pocet moznosti
- u cisel to bude nepohodlne pro obsluhu, aby si pamatovala, ze zrusit je 12

Takze bud pouzijes IF, pak muzes nechat sva slova nebo si slova prelozis na cisla (treba pomoci stromu :-D ) a pak muzes pouzit CASE.

Vzhledem k tomu, jak je program postaveny, pouzij IF.
Rozdil v ryhlost CASE a IF je v tomto pripade zanedbatelna. Nez ty neco napises na klavesnici, tak program se poradne prospi.

Tak jsem se rozhodl, že tam napíšu seznam čísel a příkazů a udělám to pomocí case. Ale ještě mám problém s procedurou hledat. Pokud napíšu číslo 2, tak chci napsat co mám hledat, to se mi načte to B (string) a pak zavolá proceduru hledej. Ale program napíše 'Co chces hledat? ' a rovnou skočí na proceduru hledej. Nevíte, jak tam zadat slovo, co chci hledat? Omlouvám se, pokud se ptám blbě, ale vážně nejsem zběhlý programátor a ocenil bych radu.

     repeat
     writeln('Zadej prikaz: ');
     read(A);

     case A of
          1: zrus;
          2: begin
                  writeln('Co chces hledat? ');
                  read(B);
                  hledej;
                  end

     else writeln('Neznamy prikaz. Zkus to znovu.');
     end;

     until A=1;       

To není vada, ale vlastnost, prostě read u řetězců (nebo jednoho znaku) funguje trochu jinak, tam se musí použít readln.
Každopádně na čtení toho jednoho znaku 'Zadej prikaz: ' by bylo vhodnější použít funkci ReadKey, u ní se to nemusí odesílat Enter, prostě jak se zmáčne klávesa, do proměnné se uloží odpovídající znak a jede to dál.

     writeln('Zadej prikaz: ');
     A:=readkey;

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