

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.
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ž)
To už by zrovna mohl doprogramovat klávesové zkratky alt + H, alt + P atd:)
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
) 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.
Netuším, kde je chyba - vyzerá to byť OK...
Určite by som volil všade Readln nie Read - to znamená, že treba vstup potvrdiť Enterom...
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 ani tak... Zajímavé. Každopádně moc děkuju :)
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.
readkey se ale v základech pascalu neučí, takže ať tam radši nechá to readln