BREVE STORIA DELL’ALGORITMO Da dove proviene il termine algoritmo? Logaritmo ? Un anagramma. Algorismo ? Dal Medio Evo : maniera di fare l’arimetica usando i numerali arabi. Algiros + arithmos ? Dal greco: Complesso + numero Abu Ja’Far Mohammed Ibn Mûsa Al-Khovârizm (825 d.C.) Padre di Ja’Far Mohammed Figlio di Moses Nativo di Kovarism (odierna Khiva (Russia)) Autore del famoso “Kitab Al Jabr W’Al-Muqabala” Regole di accorpamento e riduzione REGOLE SINTATTICHE Programma Testa del programma Header BEGIN …………………... END. PROGRAM ………………………………... PROGRAM identificatore . BLOCCO ( identificatore ) , PROGRAM IpotTrianRett (input, output, ...); ; PROGRAM IpotTrianRett(input, output); {calcolo ipotenusa del triangolo rettangolo} {moltiplicata per un fattore di scala} CONST Scala=3; VAR Lato1, {primo lato del triangolo} Lato2, {secondo lato del triangolo} Ipotenusa: real; {ipotenusa } BEGIN writeln('Il fattore di scala e''= ', Scala:3); write('Dammi il primo lato '); readln(Lato1); write('Dammi il secondo lato '); readln(Lato2); Ipotenusa:=sqrt(sqr(Lato1)+sqr(Lato2))*Scala; writeln('Ipotenusa del triangolo rettangolo Ipotenusa:7:3); readln END. = ', IDENTIFICATORI Gli identificatori standard vengono messi tutti in minuscolo. Es. NomeDelProgramma(input, output, File1, ….) È previsto l’uso di una periferica di input È previsto l’uso di una periferica di output È previsto l’uso di un file denominato File1 N.B. Gli identificatori non possono cominciare con un numero (33ident) né contenere caratteri diversi da lettere o numeri (a_prov) BLOCCO CONST Scala=3; Definizione costanti Definizione variabili BEGIN Istruzioni BEGIN writeln('Il fattore di scala e'’=', Scala:3); write('Dammi il primo lato '); readln(Lato1); write('Dammi il secondo lato '); readln(Lato2); Ipotenusa:=sqrt(sqr(Lato1)+sqr(Lato2))*Scala; writeln('Ipotenusa del triangolo rettangolo readln END. VAR Lato1, Lato2: real; Ipotenusa: real; END . = ’, Ipotenusa:7:3); ALCUNE NOTE E OSSERVAZIONI Le parentesi …... si usano per delimitare i commenti writeln(…, …, .) dopo la scritta va a capo write(…, …, .) dopo la scritta non va a capo N.B. Terminare una sequenza di write sempre con un writeln Ogni dialetto Pascal ha una dimensione del campo dei numeri di default quindi se non dichiarata usa quella. N.B. Nel Turbo Pascal questa dimensione vale 1. Quindi write( 3, 2, 5) sarà mostrato come 325. Le stringhe vanno messe tra apici ‘…stringaaa…’ Se nella stringa è necessario mettere un apice allora se ne scrivono due ‘io l’’avevo detto’ OPERATORI NUMERICI + addiziona numeri interi e reali - sottrae numeri interi e reali * moltiplica / divide numeri reali DIV divide i numeri interi MOD resto della divisione tra interi NUMERI INTERI E REALI La divisione di due numeri può essere eseguita da DIV se i numeri da dividere sono interi e il risultato è posto in una variabile intera / se i numeri da dividere sono interi o reali e il risultato è posto in una variabile reale I numeri reali possono essere rappresentati dalle notazioni FIXED POINT es. 75.351 (almeno una cifra prima del .) FLOITING POINT es. 75351E-3 N1, N2, intero :integer; R1, R2, reale:real; N1=3 N2= 12 R1= 3.00 R2= 12.00 intero= N1 DIV N2= 0 intero= N1 DIV R2= non ammesso intero= N1 / N2= non ammesso intero= N1 / R2= non ammesso reale= N1 DIV N2= 0.00 reale= N1 DIV R2= non ammesso reale= N1 / N2= 0.25 reale= N1 / R2= 0.25 reale= R1 / N2= 0.25 (corso\lezioni Mod A\esercizi\cap2\Division) reale= R1 / R2= 0.25 SCRITTURA INTERI E REALI ALCUNI ESEMPI write(3+100:2) write(3+100:1) write(3+100:10) write(3.1456:2) write(3.1456:1) write(3.1456:10) write(0.0000009876:9) write(3.1456:2:4) write(3.1456:1:3) write(3.1456:10:2) write(-0.0000009876:9:3) write(-0.0000009876:9:13) |103| |103| |…….103| | 3.1E+00| | 3.1E+00| | 3.146E+00| | 9.88E-07| |3.1456| |3.146| | 3.15| | -0.000| |-0.00000098760| (Formati) COSTANTI Un parametro che non varia durante l’esecuzione del programma CONST identificatori = CONST Scala=3; Spazio=‘ ‘; VelocitaLuce=3E+08; PiGreco=3.145 costante ; VARIABILI Un parametro che può variare durante l’esecuzione del programma VAR identificatori : , VAR Lato1, Lato2 : real; Numero : integer; Stringa : char; type ; PROGRAM IpotTrianRett(input, output); {calcolo ipotenusa del triangolo rettangolo} {moltiplicata per un fattore di scala} CONST Scala=3; VAR Lato1, {primo lato del triangolo} Lato2, {secondo lato del triangolo} Ipotenusa: real; {ipotenusa } BEGIN writeln('Il fattore di scala e''= ', Scala:3); write('Dammi il primo lato '); readln(Lato1); write('Dammi il secondo lato '); readln(Lato2); Ipotenusa:=sqrt(sqr(Lato1)+sqr(Lato2))*Scala; writeln('Ipotenusa del triangolo rettangolo = ', readln END. Ipotenusa:7:3); ALLOCAZIONE IN MEMORIA CONST Scala=3; VAR Lato1 : real; Lettera : char; Numero: integer; {ipotenusa } Scala 3 Lato1 ??E?? Lettera ????? Numero ? BEGIN END INTRODUZIONE DATI read ( variabile ) readln , ATTENZIONE !!! Introdurre i dati così come definiti dalla variabile ESEMPI LETTURA DATI VAR Lato1: real; Int1, Int2 : integer; readln(Int1, Lato1, Int2) 73 98.56 54 <eoln> 73 Int1=73 Lato1=98.56 Int2=54 98.56 <eoln> 54 <eoln> Int1=73 Lato1 =98.56 Int2=54 73 98.56 54 Ciao <eoln> Int1=73 Lato1 =98.56 Int2=54 73.1 98.56 54 <eoln> Error T73 98.56 54 <eoln> Error ISTRUZIONI DI ASSEGNAZIONE variabile := espressione ; Assegnare un valore ad una variabile a seguito di una elaborazione. Es. Int1:=7 DIV 3; Int2:=Int1*2; VAR Int1: Real1: Caratt1: integer; real; char; Int1:=73 Lato1:=98.56 Caratt1:=‘A’ Int1:=73 DIV 4 Lato1:=98.56 DIV 3 Error Caratt1:=‘7’ Error Int1:=73.01 Error Lato1:=98A Caratt1:=‘Ciao’ Error Int1:=73/2 Lato1:=98+Caratt1 Caratt1:=‘A’+2 Error Error Error Maxint = 32767 +/14 13 12 11 10 9 8 7 2 2 2 2 2 2 2 2 2 16384 8192 4096 2048 1024 512 256 128 6 5 4 2 64 3 2 32 2 2 16 1 2 8 0 2 4 2 2 (Limiti) 1 32767 Esercizio Dire quale è l’output del seguente programma: PROGRAM Test(input,output); CONST A=130; B=1000; VAR Somma, Prod, Potenza : integer; BEGIN Somma:=A+B; Prod:=(A+B)*Somma; writeln('Valori letti: ', A:7, 'e ', B:7); writeln; writeln('Somma = ', Somma:7); writeln('Prodotto = ', Prod:7); readln END. (test) Esercizio Assegnate le seguenti variabili A, B, C intere X, Y, Z reali M, N, O caratteri eseguire le seguenti operazioni A diviso B M+N O+A X diviso C Y diviso Z trovare il resto della divisione di A per C trovare il resto della divisione di B per Y Mostrare i risultati delle operazioni o segnalare quelle eventualmente errate. MODO BATCH Un programma che opera senza interagire con l’utente. Esempio un programma che legge i dati da un file e li scrive su un altro. A questo scopo è necessario utilizzare delle variabili per riferirsi ai nomi dei file adoperati. Esempio Sia Dat il nome del file da cui leggere i dati di input Sia Risultat il nome del file su cui scrivere i dati di output VAR Dati, Risultati : Int1: Real1: Caratt1: text; integer; real; char; Per leggere da un file bisogna aprirlo in lettura reset(Dati) Per scrivere su un file bisogna aprirlo in scrittura rewrite(Risultati) {legge dal file Dati due numeri reali Re1 e Re2 e scrive la loro somma Somma e il loro prodotto Prod in un file Risultat} PROGRAM ProvaFiles(input,output,Dat,Risult); VAR Dat, Risult: text; {esempio di lettura e scrittura di files} Re1, Re2, Somma, Prod: real; BEGIN assign(Dat,'C:\TP\ESEMPI\MODA\DATI.TXT'); assign(Risult,'C:\TP\ESEMPI\MODA\RISULTAT.TXT'); reset(Dat); rewrite(Risult); readln(Dat, Re1, Re2); Somma:=Re1+Re2; Prod:=Re1*Re2; writeln('Valori letti: ', Re1:7:5, 'e ', Re2:7:5); writeln; writeln('Somma= ', Somma:7:5); writeln('Prodotto= ', Prod:7:5); writeln(Risult, 'Valori letti: ', Re1:7:5, ' e ', Re2:7:5); writeln(Risult, ' Somma e Prodotto ', Somma:7:5, ' e ', Prod:7:5); close(Risult); readln END. (ProvaFile)