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.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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… nový
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

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