Newsgroup: it.comp.lang.pascal
Titolo: problema con case...of

Mi potete spiegare perchč questo codice č errato?
Grazie e ciao.
program quiz;
uses
  crt;
var
  uno,primo:char;
label
  dinuovo;
begin
  dinuovo:
   writeln('Questo e'' un quiz.');
   writeln('Mi raccomando, ad ogni domanda scrivi il numero corrispondente
alla risposta che ritieni corretta');
   delay(1000);
   writeln('Quanti erano i Queen?');
   writeln('1) 3');
   writeln('2) 4');
   writeln('3) 5');
   uno:=readln(primo);
   case uno of
     1:begin
          writeln('Questa era facilissima.La risposta esatta e'' la 2');
        end;
     2:begin
          writeln('Hai risposto esattamenete.Andiamo avanti, questo era solo
un assaggio');
        end;
     3:begin
          writeln('Questa era facilissima.La risposta esatta e'' la 2');
        end;
     else
       begin
         writeln('Numero errato');
       end;
end.

 end.
in fondo manca un end... l'indentazione serve proprio a questo:
quando finisci il programma e sei troppo spostato a destra, vuol
dire che ti sei dimenticato di chiudere qlc blocco
poi per il resto e' "corretto"...
-- Ottimizzazione del codice --
a) il case ti serve solo quando hai bulacchi di casi e possibilita'
   diverse per ogni caso (a.e. gestione tastiera ? perche' no...)
b) ogni volta che fai un copia e incolla di piu' di una riga di codice
    pensa se non puoi risolverlo meglio con un ciclo o qualche
    altro controllo di flusso... il goto e le label lasciale da parte...
c) l'output fallo come vuoi... il mio e' solo un altro modo ma non
    e' probabilmente migliore... e' solo diverso :-)
program quiz;
 uses crt;
 var
  uno : char;
 begin
  writeln (' lalalaralallala e tutto quel che vuoi... ' );
  delay(1000);
  writeln('Quanti erano i Queen?' #13#10 '1) 3' #31#10 '2) 4' #13#10 '3)
5');
 { risparmiamo a stecca sui writeln (a costo della leggibilita' ovviam):
   la sequenza di char #13#10 equivale ad un ritorno a capo
   NB chiudo la stringa, poi scrivo #13#10, poi la riapro, risultato:
    per il compilatore un'unica stringa che contiene dei ritorni a capo
}
   readln(uno);
   while not (uno in ['1'..'3'] ) do
     begin
        writeln ('Numero errato etc etc');
        readln(uno);
     end;
   if uno = '2' then writeln('Hai risposto esattamenete. etc etc')
                      else writeln ('Questa era facilissima. etc etc')
end.
saluti & auguri
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it
(Life would be easier if I had the source code)

Per migliorare la leggibilità potresti dichiarare un costante:
Const
    CR=#13#10;
e se non mi sbaglio puoi addirittura togliere #10 perchè tanto l'effetto è
uguale.
Se dichiari la costante per usarla in un write(o cose simili) devi mettere
in + per concatenarla, forse in Pascal puoi anche usare le virgole :
Write ('Ciao',CR,'Ciao');
ma non ne sono sicuro perchè ste cose le ho provate su Delphi visto che è la
unica cosa che perora capisce il pascal nel mio computer, ho formattato e il
pascal l'ho messo in dischetto ed ora non me lo fa copiare più!!
Neo
ICQ     :  146381266

> Per migliorare la leggibilità potresti dichiarare un costante:
hihihi "leggibilita'"... prima ottimizzazione, poi leggibilita' !
le costanti in pascal non sono "semantiche" come in C (cioe'
vengono sostituite dal preprocessore) quindi ti ritrovi una
variabile in memoria, alla quale devi accedere, quindi copiare
l'indirizzo nel registro etc etc... spreeeeeco di istruzioni :-)
scrivendo il #13#10 in fila alla stringa, questi vengono inseriti
nella stringa al momento della compilazione e quindi non
necessitano nessuna operazione al run-time
ma questa e' paranoia :-)


(Life would be easier if I had the source code)
Concordo :-)

 ---- 8< ---
ehhehehh si, anch'io scherzavo... ma per altre chiamate di
sistema piu' costose della write (a.e. accesso a disco) conviene
concentrarle il piu' possibile :-)
ciao
--
Dreadnaut (dn)
drea...@liberoDALLASPAM.it


La diretiva const introduce 2 concetti.
Le constanti (pezzi di codice SENSA UN OFFSET nei dati compilati (Cioč
vengo sostituiti proprio come in C
e le var preinizializate....
Const
  A : String = 'Ciao';
  B = 'Ciao'
ogni volta che si usa B č come se si usa 'Ciao' ogni volta che si usa
A č come se si usa una var (di fatti il pascal le vede come va).
Per provare (visto che c'č l'egreggio signor Dreadnaut in ballo e di
lui ho un grande rispetto proto un esempio pratico:
Const
  A = 'Ciao';
  B : String = 'Ciao';
Begin
  WriteLn('Inderizzo di mem di A č ', Seg(A),':',Ofs(A));
  WriteLn('Inderizzo di mem di B č ', Seg(B),':',Ofs(B));
End.
Se uno esegue questo codice dara problemi nel trovare l'indirizzo di A
(vuole una var A č una costante, sensa indirizzo) mentre per B non fa
una piega... provare per credere... comentate la prima istruzione e
vedete se compila ritornado SEG:OFF di B.
Il Razziatore,
The Only Good Windows in an uninstalled Windows
-----------------------------------------------
E-MAILs : IlRazziat...@NOSPAMnetscape.net
WEB     : 
http://www.razziatore.dns2go.com/
ICQ     : 67552596

 vedete se compila ritornado SEG:OFF di B.
questo invece funziona... o meglio... giustamente _non_ funziona :-)
un po' come tentare di fare A := 'abcd'; che da errore
P.S.
poi, un filo curioso, ho scritto un programma equiv. in C, definendo
#define CCC "\nciao\n" e' l'ho compilato in Vc6 come release e...
ho trovato una sola occorrenza della stringa 'ciao' anche in quell'exe ?!
la stringa non avrebbe dovuto apparire n volte con n numero delle
volte in cui viene utilizzata ?    boh... a questo punto devo trovare
maggiori info... non mi fido piu' molto :-)
saluti
