APPUNTI SUL LINGUAGGIO DI PROGRAMMAZIONE PASCAL In informatica il Pascal è un linguaggio di programmazione creato da Niklaus Wirth ed é un linguaggio di programmazione strutturata. I linguaggi di programmazione strutturati iniziarono a emergere intorno all'inizio degli anni settanta e sono costituiti da un insieme di strutture di controllo completo che possono essere in forma di sequenza, in forma alternativa e in forma di iterazione. Questa è la struttura generale di un programma in linguaggio Pascal: INTESTAZIONE La prima riga introduce il programma con la parola chiave program, a cui segue il titolo del programma. Non possono essere utilizzati caratteri speciali né spazi, solo dopo program si deve mettere uno spazio. Ad esempio: program mio_programma;
SEZIONE DICHIARAZIONI In questa sezione devono essere dichiarate le costanti e le iabili usate nel programma. Ad esempio per dichiarare una costante: const A=5; Il Pascal mette a disposizione molti tipi di iabili: Tipi interi: utilizzati per memorizzare valori numerici interi, con o senza segno e compresi entro l'intervallo numerico da -32768 a 32767. Ad esempio: A,B,C: integer; Tipi reali: numeri reali da -2.9E-39 a 1.7E38 (viene usata la notazione esponenziale). Ad esempio: A,B,C: real; Tipo carattere (char): iabile carattere, contiene un solo carattere. Ad esempio: A:char; Tipo stringa (string): iabile che contiene più caratteri Si può indicare la lunghezza massima della stringa inserendo [n] durante la dichiarazione, se non viene specificata, la lunghezza, sarà di 256 caratteri. Ad esempio: PAROLA:string; Tipo booleano (boolean): iabile binaria (vero/falso). Ad esempio: A: boolean; FUNZIONI PREDEFINITE All'interno di un programma in Pascal è possibile inserire delle funzioni predefinite che servono ad eseguire rapidamente delle operazioni. Le più importanti sono: 1) a DIV b fornisce il quoziente intero della divisione tra a e b; 2) a MOD b fornisce il resto intero della divisione tra a e b;
3) SQR(a) calcola il quadrato di a; 4) SQRT(a) calcola la radice quadrata di a; 5) ABS(a) determina il valore assoluto di a; 6) INT (a) determina la parte intera di a; 7) TRUNC(a) effettua il troncamento di a eliminando le eventuali cifre decimali; 8) ROUND(a) effettua l'arrotondamento di a all'intero più vicino. E' importante sapere che tutte le parole utilizzate da queste funzioni sono riservate e pertanto non possono essere utilizzate come iabili. SEZIONE ISTRUZIONI La parte esecutiva del programma é racchiusa tra le due parole riservate e end e le istruzioni al suo interno terminano tutte con un punto e virgola (solo dopo non si mette mai). Dopo l'ultimo end si mette un punto. E' importante che il numero dei sia sempre uguale al numero degli end. ISTRUZIONI DI LETTURA E DI SCRITTURA L' istruzione di lettura si scrive: readln (nome iabile); L'istruzione di scrittura si scrive: writeln (nome iabile); Nel caso non voglia far scrivere il valore della iabile, ma voglio che venga scritto esattamente ciò che si trova tra le parentesi dovrò scrivere: writeln ('messaggio'); Le strutture del programma vero e proprio possono essere di tre tipi: 1) Sequenza 2) Selezione 3) Iterazione STRUTTURA IN SEQUENZA Le istruzioni vengono eseguite esattamente nello stesso ordine in cui sono scritte. Ad esempio un programma per fare la somma di due numeri interi avrà questo diagramma di flusso:
Il programma sarà: Program somma_di_due_numeri_interi; a,b,c:integer; writeln('inserire un numero intero:'); readln(a); writeln('inserire un altro numero intero:'); readln(b); c:=a+b; writeln('la somma di ',a,' e ',b,' è: ',c); end. STRUTTURE DI SELEZIONE 1) Struttura IF...THEN...ELSE IF (condizione) THEN (istruzione 1) ELSE (istruzione 2);
In questo caso se la condizione é verificata viene eseguita l'istruzione 1 altrimenti viene eseguita l'istruzione 2. Da notare che il punto e virgola deve essere messo solo al termine della struttura. Ad esempio un programma per il calcolare il massimo di tre numeri assegnati avrà questo diagramma di flusso: Il programma sarà: program massimo; A,B,C,MAX : real; writeln ('immetti tre numeri in ordine qualsiasi'); readln (A,B,C); if A>B then if A>C then MAX:=A else MAX:=C end else if B>C then MAX:=B else MAX:=C end; writeln ('Il massimo dei tre numeri é: ',MAX) end.
2) Struttura CASE... OF CASE (selettore) OF selezione 1 selezione 2 selezione 3 -------------- L'istruzione CASE é composta da un selettore e da una lista di istruzioni individuate da un'etichetta CASE dello stesso tipo del selettore. Viene eseguita l'istruzione la cui etichetta é uguale al valore del selettore. Ad esempio un programma che dati due numeri farà eseguire una delle quattro operazioni a scelta con essi avrà il seguente diagramma di flusso Il corrispondente programma sarà: PROGRAM OPERAZIONI; VAR X, Y, RIS: REAL; OP: CHAR; BEGIN WRITE('X =?'); READLN(X); WRITE('Y =?'); READLN(Y); WRITE('OPERAZIONE =?'); READLN(OP); WRITELN; CASE OP OF 'A': BEGIN WRITELN('ADDIZIONE: '); RIS:=X+Y;
END; 'S': BEGIN WRITELN('SOTTRAZIONE: '); RIS:=X-Y; END; 'M': BEGIN WRITELN('MOLTIPLICAZIONE: '); RIS:=X*Y; END; 'D': BEGIN WRITELN('DIVISIONE: '); RIS:=X/Y; END END; WRITELN('RISULTATO= ', RIS); END. STRUTTURE ITERATIVE 1) Struttura Iterativa FOR... DO Il costrutto FOR è adatto per situazioni in cui una istruzione o una serie di istruzioni debbano essere ripetute N volte, ove N deve essere noto prima che il ciclo iterativo abbia inizio. Si rende necessario l'uso di una coppia /end per consentire l' esecuzione di più di una istruzione all'interno di un ciclo FOR...DO. La struttura é: FOR <iabile> := <numero iniziale> TO <numero finale> DO <Istruzione/i> Ad esempio, il ciclo iterativo seguente fa apparire il messaggio 'Ciao!' per dieci volte (N è una iabile intera): for N := 1 to 10 do Writeln('Ciao!'); Ad esempio un programma che somma i primi N interi avrà il seguente diagramma di flusso:
Il corrispondente programma sarà: program somma_dei_primi_n_numeri_naturali; N,I,SOM: integer; writeln ('Dammi quanti numeri naturali devo sommare'); readln (N); SOM:=0; for I:=0 to N do SOM:= SOM + I; writeln ('La somma dei primi ',N,' numeri naturali é ',SOM); end. 2) La Struttura Iterativa WHILE... DO
La struttura WHILE...DO è un costrutto iterativo per impieghi generali in cui il test di controllo di uscita dal ciclo viene collocato all'inizio della struttura stessa. La struttura é: WHILE <condizione> DO <istruzione/i)> Finchè la condizione é verificata, l'istruzione viene eseguita. Se la condizione non é verificata sin dalla prima esecuzione, l'istruzione non viene mai eseguita. In modo analogo alla struttura iterativa FOR, si rende necessario l'uso di una coppia /end per consentire l'esecuzione di più di una istruzione all'interno di un ciclo WHILE. Ad esempio un programma che trasforma un numero da base 10 a base 2 avrà il seguente diagramma di flusso:
Il corispondente programma sarà: program cambiamento_in_base_due_di_un_numero_in_base_dieci; n,quoziente,resto:integer; writeln ('Scrivere il numero in base 10'); readln (n); while n>0 do quoziente:=n div 2; resto:=n mod 2; writeln (resto); n:=quoziente; end; writeln ('Il numero deve essere letto dal basso in alto'); end. 3) La Struttura Iterativa REPEAT... UNTIL La struttura REPEAT... UNTIL è un costrutto iterativo per impieghi generali in cui il controllo di uscita dal ciclo viene collocato alla fine della struttura stessa. La struttura é: REPEAT<istruzione/i>...UNTIL <condizione>; Finchè la condizione é verificata il blocco <istruzione(i)> contenuto fra REPEAT ed UNTIL viene eseguito. Si noti che le istruzioni che compongono il ciclo iterativo vengono sempre eseguite almeno una volta. Questo comportamento è del tutto diverso da quello delle strutture iterative WHILE e FOR, nelle quali, con opportuni valori iniziali delle iabili di controllo, è possibile che le istruzioni che compongono il ciclo non vengano eseguite nemmeno una volta. Contrariamente a quanto previsto nelle strutture iterative FOR e WHILE, non è richiesto il blocco Begin/End per consentire l'esecuzione di più di una istruzione nel ciclo. Ad esempio un programma che calcola i primi 10 multipli di un numero X avrà il seguente diagramma di flusso:
Il corrispondente programma sarà: program primi_10_multipli_del_numero_x; X,I,Y: integer; writeln ('Dammi il numero X');
readln (X); I:=1; writeln ('I primi 10 multipli del numero ',X,' sono'); repeat Y:=X*I; I:=I+1; writeln (Y); until I=11; end.