La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

COME FARE ESEGUIRE AD UNA MACCHINA ISTRUZIONI RIPETITIVE ? WHILE …….. DO Un ciclo (loop) è una istruzione che permette di far eseguire, in maniera ripetitiva,

Presentazioni simili


Presentazione sul tema: "COME FARE ESEGUIRE AD UNA MACCHINA ISTRUZIONI RIPETITIVE ? WHILE …….. DO Un ciclo (loop) è una istruzione che permette di far eseguire, in maniera ripetitiva,"— Transcript della presentazione:

1

2 COME FARE ESEGUIRE AD UNA MACCHINA ISTRUZIONI RIPETITIVE ? WHILE …….. DO Un ciclo (loop) è una istruzione che permette di far eseguire, in maniera ripetitiva, un blocco di istruzioni che la seguono un numero prefissato di volte.

3 REGOLE SINTATTICHE PER WHILE ….. DO WHILE …. DO espressione booleana WHILE DO istruzioni WHILE Contatore <= N DO Contatore:=Contatore+1 Espressione per il controllo del ciclo Corpo del ciclo

4 WHILE Contatore <= N DO Contatore:=Contatore+1 Precondizioni postcondizioni Invariante di ciclo

5 ESEMPIO Somma:=0; Contatore:=0; WHILE Contatore>=5 DO BEGIN Contatore:=Contatore+1; Somma:=Somma+Contatore; writeln(Contatore:5, Somma:5) END; writeln(FINE); Passo di computazioneContatoreSomma

6 Somma:=0; Contatore:=0; read(Numero); WHILE Numero>0 DO BEGIN Contatore:=Contatore+1; Somma:=Somma+Numero; read(Numero) END; readln; writeln(Numero:1,,Somma:1,,Contatore:1); ALTRO ESEMPIO Passo di computazioneContatore SommaNumero entrata nel loop uscita dal loop418

7 Somma:=0; Contatore:=0; Passo:=0; WHILE Passo<>5 DO BEGIN Passo:= Passo+1; read(Numero); IF Numero<=0 THEN Contatore:=Contatore+1 ELSE Somma:=Somma+Numero END; readln; writeln(Somma:1,,Contatore:1); ALTRO ESEMPIO Passo di computazionePasso Numero ContatoreSomma entrata nel loop uscita dal loop50313

8 Esercizio dal libro pag.214 n.5

9 Pseudo Codice generale per i cicli Inizializza i valori di partenza Esegui il processo di ciclo Usa i valori venuti fuori dal ciclo precondizioni postcondizioni ciclo Un evento è una istruzione che una volta eseguita allinterno del ciclo cambia una parte dello stato del programma Un evento di uscita è un evento che allinterno del ciclo permette luscita dal programma

10 Esempio Somma:=0; Contatore:=0; read(Numero); WHILE Numero>0 DO BEGIN Contatore:=Contatore+1; Somma:=Somma+Numero; read(Numero) END; readln; writeln(Numero:1,,Somma:1,,Contatore:1); precondizioni IF Contatore <>0 THEN writeln(La media dei,Contatore:5, valori introdotti e,,Somma/ Contatore:4:2); ELSE writeln(Il primo numero introdotto e negativo); postcondizioni

11 Alcuni algoritmi di base risolti usando i Cicli (Loops) Conteggio sequenziale di eventi Pseudo codice ContatoreEventi 0 introduci ValoreEvento WHILE ValoreEvento rappresenta un evento da valutare DO ContatoreEventi ContatoreEventi + 1 introduci ValoreEvento Somma:=0; Contatore:=0; read(Numero); WHILE Numero>0 DO BEGIN Contatore:=Contatore+1; Somma:=Somma+Numero; read(Numero) END; readln; writeln(Numero:1,,Somma:1,,Contatore:1);

12 Conteggio di eventi selezionati Pseudo codice ContatoreEventi 0 WHILE ci sono altri eventi da valutare DO introduci ValoreEvento IF ValoreEvento è un evento significativo THEN ContatoreEventi ContatoreEventi + 1 Somma:=0; Contatore:=0; Passo:=0; WHILE Passo<>5 DO BEGIN Passo:= Passo+1; read(Numero); IF Numero<=0 THEN Contatore:=Contatore+1 ELSE Somma:=Somma+Numero END; readln; writeln(Somma:1,,Contatore:1);

13 Accumulazione di eventi Pseudo codice Somma 0 WHILE ci sono altri eventi da valutare DO introduci ValoreEvento Somma Somma + ValoreEvento Può dipendere dal valore di Somma o da quello di ValoreEvento Accumulazione di eventi selezionati Pseudo codice Somma 0 WHILE ci sono altri eventi da valutare DO introduci ValoreEvento IF ValoreEvento è un evento significativo THEN Somma Somma + ValoreEvento

14 Meccanismi di Entrata/Uscita dai Cicli Esecuzione di un numero predeterminato di passi Passo:=0; WHILE Passo<>N DO Passo:=Passo+1 altre istruzioni Controllo con un evento sentinella introduci ValoreEvento WHILE ValoreEvento non è un evento terminale DO elabora ValoreEvento introduci ValoreEvento

15 PROGRAM TestLoop(input,output); VAR Indice,N:integer; BEGIN N:=10; Indice:=0; WHILE Indice

47 ESERCIZIO N.8 Detto F n lennesimo numero di Fibonacci scrivere un programma che calcoli lespressione: A=F n+1 * F n-1 - F 2 n Mostrare i valori di A per N=1,2,3,4,5,6,7,8,9,10

48 Problema Inserire N numeri e mostrare a video il numero più alto inserito fino a quel momento. Pseudo codice readln(N) readln(Numero) PiuAlto Numero IF Numero > PiuAlto THEN PiuAlto Numero FOR Conta:=2 TO N DO BEGIN read(Numero); IF Numero > PiuAlto THEN PiuAlto :=Numero END; readln;

49 Generalizzando {algoritmo per la ricerca dellevento più significativo} introduci il primo evento PiuSignificativo Evento WHILE ci sono altri eventi DO introduci Evento IF Evento è più significativo di PiuSignificativo THEN PiuSignificativo Evento

50 REGOLE SINTATTICHE PER REPEAT ….. UNTIL REPEAT …. UNTIL espressione booleana REPEAT UNTIL istruzioni REPEAT write(Introduci un numero positivo: ); readln(Numero) UNTIL Numero >0 Se lespressione è vera allora si esce Il CICLO REPEAT ….. UNTIL Le istruzioni vengono sicuramente eseguite almeno una volta. write(Introduci un numero positivo: ); readln(Numero) WHILE Numero<=0 DO write(Introduci un numero positivo: ); readln(Numero) END;

51 La differenza tra WHILE e REPEAT consiste principalmente nel fatto che le espressioni booleane di controllo sono tra loro complementari. Nel caso del WHILE si esce quando lespressione diventa falsa; Nel caso del REPEAT si esce quando lespressione diventa vera. istruzioni no si Eseguo il ciclo? istruzioni si no Eseguo il ciclo? WHILE REPEAT

52 DIFFERENZE TRA FOR - REPEAT - WHILE Le condizioni di entrata e uscita dal FOR sono stabilite prima di entrare nel ciclo. La variabile di controllo del ciclo è aumentata o diminuita automaticamente. Questa variabile può essere usate allinterno del ciclo ma non modificata. La sequenza del REPEAT è eseguita almeno una volta sempre. Lespressione booleana di controllo è eseguita dopo le istruzioni interne al ciclo. Quando lespressione diventa vera allora si esce dal ciclo. Nel caso del WHILE lespressione di controllo è valutata prima di entrare nel ciclo. Se essa è vera allora si esegue il ciclo. Si esce dal ciclo quando lespressione diventa falsa e quindi in questo caso non si eseguono le istruzioni del ciclo.

53 Come decidere tra FOR - REPEAT - WHILE Se sono noti i valori della variabile di controllo di inizio e fine ciclo, e questi non devono essere cambiati nel ciclo e la variabile deve essere incrementata o diminuita di 1, allora si usa FOR. Se il FOR non è applicabile e le istruzioni del ciclo devono essere eseguite almeno una volta allora usa REPEAT. Se né il FOR né il REPEAT è utilizzabile allora ricorri al WHILE. In caso di indecisione si usa il WHILE.

54 ESEMPIO Problema Il signor Esposito vuole fare un viaggio con la moglie e sua figlia. Durante il viaggio si fermerà per fare benzina, per mangiare e per alloggiare. Quando alloggia allora mangia anche. Esposito vuole spendere solo al giorno per lalloggio per tutta la famiglia. Se il prezzo della camera del motel è troppo alto allora lui cambia motel. Supponiamo che Esposito parta e ad ogni tappa aggiorni i suoi conti. Alla fine del viaggio si vuole sapere la spesa totale.

55 Esempio di Input/Output Spese di viaggio Per caricare le spese di viaggio digitare: A per spese alloggio B per spese benzina C per spese cibo U per uscire Quanti soldi puoi spendere ? Sono pronto: B Prezzo benzina: Sono pronto: A Prezzo per camera: Grazie ma e' troppo per noi Nuovo Motel. Prezzo per camera: Perfetto! Si dorme qui. Conto per la persona n. 1 : Conto per la persona n. 2 : Conto per la persona n. 3 : Totale conto pranzo : Lit

56 Sono pronto: C Conto per la persona n. 1 : Conto per la persona n. 2 : Conto per la persona n. 3 : Totale conto pranzo : Lit Sono pronto: U Spese sostenute per la benzina: Spese sostenute per il cibo: Spese sostenute per l'alloggio: Spese sostenute per il viaggio: BRAVO !!! Hai risparmiato

57 Pseudo codice Mostra Istruzioni; InizializzaVariabili(ContoBenzina, ContoCibo, ContoMotel, Capitale); IntroduciSpese; RisultatiFinali(ContoBenzina, ContoCibo, ContoMotel, Capitale) Inizializza variabili Introduci Spese A B C U Risultati Finali ContoBenzina ContoCibo ContoMotel Capitale ContoBenzina ContoCibo ContoMotel NumPersone MaxAlloggio Capitale ContoBenzina ContoCibo ContoMotel Capitale ContoBenzina ContoCibo ContoMotel Capitale ContoBenzina ContoCibo ContoMotel Capitale AlloggiareBenzinaCiboEsci ContoBenzina ContoCibo ContoMotel RAPPRESENTAZIONE GRAFICA Mostra Istruzioni

58 {********** MAIN ***********} BEGIN MostraIstruzioni; InizializzaVariabili(ContoBenzina, ContoCibo, ContoMotel,Capitale); REPEAT WRITELN; write('Sono pronto: '); readln(TipoSpesa); CASE TipoSpesa OF 'A': Alloggiare(ContoMotel, ContoCibo); 'B': Benzina(ContoBenzina); 'C': Mangiare(ContoCibo); 'U': END; UNTIL TipoSpesa = 'U'; RisultatiFinali(ContoBenzina, ContoCibo, ContoMotel, Capitale); readln END.

59 PROGRAM SpeseViaggio(input,output); {Gestione delle spese di viaggio relative a benzina, mangiare, dormire} CONST NumPersone=3; MaxAlloggio=150000; VAR ContoBenzina, ContoCibo, ContoMotel,Capitale: real; TipoSpesa: char; PROCEDURE MostraIstruzioni; BEGIN writeln('Spese di viaggio'); writeln(' Per caricare le spese di viaggio digitare: '); writeln(' A per spese alloggio'); writeln(' B per spese benzina'); writeln(' C per spese cibo'); writeln(' U per uscire'); END; {********** MAIN ***********} BEGIN MostraIstruzioni; InizializzaVariabili(ContoBenzina, ContoCibo, ContoMotel,Capitale); REPEAT WRITELN; write('Sono pronto: '); readln(TipoSpesa); CASE TipoSpesa OF 'A': Alloggiare(ContoMotel, ContoCibo); 'B': Benzina(ContoBenzina); 'C': Mangiare(ContoCibo); 'U': END; UNTIL TipoSpesa = 'U'; RisultatiFinali(ContoBenzina, ContoCibo, ContoMotel, Capitale); readln END.

60 PROCEDURE InizializzaVariabili(VAR ContoBenzina, ContoCibo, ContoMotel,Capitale:real); {Inizializza i valori delle variabili} BEGIN ContoBenzina:=0; ContoCibo :=0; ContoMotel :=0; writeln('Quanti soldi puoi spendere ? '); readln(Capitale) END; PROCEDURE Benzina(VAR ContoBenzina:real); {in: totale spese benzina escluse quelle attualiout: totale spese benzina incluse quelle attuali} VAR Costo:real;{spesa per la benzina a questo passo} BEGIN write('Prezzo benzina: ');readln(Costo); ContoBenzina:= ContoBenzina+Costo; END; {********** MAIN ***********} BEGIN MostraIstruzioni; InizializzaVariabili(ContoBenzina, ContoCibo, ContoMotel,Capitale); REPEAT WRITELN; write('Sono pronto: '); readln(TipoSpesa); CASE TipoSpesa OF 'A': Alloggiare(ContoMotel, ContoCibo); 'B': Benzina(ContoBenzina); 'C': Mangiare(ContoCibo); 'U': END; UNTIL TipoSpesa = 'U'; RisultatiFinali(ContoBenzina, ContoCibo, ContoMotel, Capitale); readln END.

61 PROCEDURE Mangiare(VAR ContoCibo:real); {in: totale spese pranzi escluse quelle attualiout: totale spese pranzo incluse quelle attuali} VAR Conto, {spesa per il pranzo a persona} TotaleConto:real;{spesa per il pranzo a questo passo} Persona :integer; {persona per la quale si fa la spesa per il pranzo} BEGIN TotaleConto:=0; FOR Persona:=1 TO NumPersone DO BEGIN write('Conto per la persona n. ',Persona:1,' : '); readln(Conto); TotaleConto:= TotaleConto+Conto; END; write('Totale conto pranzo : Lit. ', TotaleConto:4:2); ContoCibo := ContoCibo + TotaleConto; END; {********** MAIN ***********} BEGIN MostraIstruzioni; InizializzaVariabili(ContoBenzina, ContoCibo, ContoMotel,Capitale); REPEAT WRITELN; write('Sono pronto: '); readln(TipoSpesa); CASE TipoSpesa OF 'A': Alloggiare(ContoMotel, ContoCibo); 'B': Benzina(ContoBenzina); 'C': Mangiare(ContoCibo); 'U': END; UNTIL TipoSpesa = 'U'; RisultatiFinali(ContoBenzina, ContoCibo, ContoMotel, Capitale); readln END.

62 PROCEDURE Alloggiare(VAR ContoMotel, ContoCibo :real); {in: totale spese alloggio escluse quelle attualiout: totale spese alloggio incluse quelle attuali} VAR CostoPerAlloggio:real; {costo per camera} BEGIN write('Prezzo per camera: '); readln(CostoPerAlloggio); WHILE CostoPerAlloggio > MaxAlloggio DO BEGIN writeln('Grazie ma e'' troppo per noi'); write('Nuovo Motel. Prezzo per camera: '); readln(CostoPerAlloggio); END; writeln('Perfetto! Si dorme qui.'); ContoMotel:= ContoMotel+ CostoPerAlloggio ; Mangiare(ContoCibo) END; {********** MAIN ***********} BEGIN MostraIstruzioni; InizializzaVariabili(ContoBenzina, ContoCibo, ContoMotel,Capitale); REPEAT WRITELN; write('Sono pronto: '); readln(TipoSpesa); CASE TipoSpesa OF 'A': Alloggiare(ContoMotel, ContoCibo); 'B': Benzina(ContoBenzina); 'C': Mangiare(ContoCibo); 'U': END; UNTIL TipoSpesa = 'U'; RisultatiFinali(ContoBenzina, ContoCibo, ContoMotel, Capitale); readln END.

63 PROCEDURE RisultatiFinali(ContoBenzina, ContoCibo, ContoMotel,Capitale:real); {in: totale spese parziali out: totale spese viaggio} VAR Totale:real; {costo per camera} BEGIN writeln('Spese sostenute per la benzina: ', ContoBenzina:8:0); writeln('Spese sostenute per il cibo: ', ContoCibo:8:0); writeln('Spese sostenute per l''alloggio: ', ContoMotel:8:0); writeln('Spese sostenute per il viaggio: ', (ContoBenzina+ ContoCibo +ContoMotel):8:0); Totale:=(ContoBenzina+ ContoCibo +ContoMotel); IF Totale < Capitale THEN writeln('BRAVO !!! Hai risparmiato ',(Capitale-Totale):8:0) ELSE writeln(' Hai fatto debiti per ',(Totale - Capitale):8:0); END; {********** MAIN ***********} BEGIN MostraIstruzioni; InizializzaVariabili(ContoBenzina, ContoCibo, ContoMotel,Capitale); REPEAT WRITELN; write('Sono pronto: '); readln(TipoSpesa); CASE TipoSpesa OF 'A': Alloggiare(ContoMotel, ContoCibo); 'B': Benzina(ContoBenzina); 'C': Mangiare(ContoCibo); 'U': END; UNTIL TipoSpesa = 'U'; RisultatiFinali(ContoBenzina, ContoCibo, ContoMotel, Capitale); readln END. (viaggio)

64 CICLI ANNIDATI Sono cicli annidati quei cicli contenuti in altri cicli più esterni. Quando sono necessari cicli annidati si progettano prima i cicli più esterni e poi quelli più interni.

65 ESEMPIO Problema Scrivere le tabelline dei numeri da 0 a 9 come in figura. * Output

66 Pseudo codice mostra * FOR Moltiplicatore 0 TO 9 DO mostra Moltiplicatore writeln FOR Moltiplicando 0 TO 9 DO mostra Moltiplicando mostra il prodotto su una linea writeln mostra il prodotto su una linea FOR Moltiplicatore 0 TO 9 DO mostra Moltiplicatore * Moltiplicando

67 PROGRAM Tabelline(output); {Mostre le tabelline tra 0 e 9} CONST Spazi=4; VAR Moltiplicando, Moltiplicatore: integer; BEGIN write(*); FOR Moltiplicatore:=0 TO 9 DO write(Moltiplicatore:Spazi); writeln; FOR Moltiplicando :=0 TO 9 DO BEGIN write(Moltiplicando :1); FOR Moltiplicatore:=0 TO 9 DO write(Moltiplicando * Moltiplicatore:Spazi); writeln; END END.

68 I cicli annidati possono anche avere le variabili di controllo dipendenti dalle variabili dei cicli esterni. Supponiamo di voler stampare una serie di asterischi come in figura. * ** *** **** ***** Supponiamo di voler assegnare dallesterno il numero di asterischi della riga finale. Pseudo codice Introduci NumeroAsterischi desiderato FOR Riga 1 TO NumeroAsterischi mostra una linea di asterischi FOR Asterisco 1 TO Riga DO mostra un asterisco;

69 PROGRAM Asterisco(input,output); CONST Stella=*; VAR NumeroAsterischi, Riga, Asterisco: integer; BEGIN write(Quanti asterischi vuoi sullultima riga: ); readln(NumeroAsterischi); FOR Riga:=1 TO NumeroAsterischi DO BEGIN FOR Asterisco:=1 TO Riga DO write(Stella); writeln END END;

70 Esercizio Stampare un albero di asterischi come in figura sapendo che deve essere formato da N linee più due di tronco e una linea di base. * *** **** ***** ****** * ******

71 SUGGERIMENTI PER TESTARE I PROGRAMMI Quando bisogna fare manutenzione a procedure proprie o di altri bisogna fare attenzione ad una serie di possibili errori non rilevati dal compilatore.

72 Esempio procedura Viaggio. Se poniamo PROCEDURE Alloggiare(VAR ContoMotel, ContoCibo :real); {in: totale spese alloggio escluse quelle attualiout: totale spese alloggio incluse quelle attuali} VAR CostoPerAlloggio:real; {costo per camera} BEGIN write('Prezzo per camera: '); readln(CostoPerAlloggio); WHILE CostoPerAlloggio > MaxAlloggio DO; BEGIN writeln('Grazie ma e'' troppo per noi'); write('Nuovo Motel. Prezzo per camera: '); readln(CostoPerAlloggio); END; writeln('Perfetto! Si dorme qui.'); ContoMotel:= ContoMotel+ CostoPerAlloggio ; Mangiare(ContoCibo) END; Non far mai seguire a DO un ; sia con WHILE che con FOR

73 Per caricare le spese di viaggio digitare: A per spese alloggio B per spese benzina C per spese cibo U per uscire Quanti soldi puoi spendere ? Sono pronto: A Prezzo per camera: Grazie ma e' troppo per noi Nuovo Motel. Prezzo per camera: Perfetto! Si dorme qui. Conto per la persona n. 1 : Conto per la persona n. 2 : Conto per la persona n. 3 : Totale conto pranzo : Lit Sono pronto: U Spese sostenute per la benzina: 0 Spese sostenute per il cibo benzina: Spese sostenute per l'alloggio: Spese sostenute per il viaggio: Hai fatto debiti per

74 Usare sempre BEGIN … END per delimitare blocchi di istruzioni Quanti soldi puoi spendere ? Sono pronto: C Conto per la persona n. 1 : Conto per la persona n. 2 : Conto per la persona n. 3 : Totale conto pranzo : Lit Sono pronto: A Prezzo per camera: PROCEDURE Mangiare(VAR ContoCibo:real); {in: totale spese pranzi escluse quelle attualiout: totale spese pranzo incluse quelle attuali} VAR Conto, {spesa per il pranzo a persona} TotaleConto:real;{spesa per il pranzo a questo passo} Persona :integer; {persona per la quale si fa la spesa per il pranzo} BEGIN TotaleConto:=0; FOR Persona:=1 TO NumPersone DO {BEGIN} write('Conto per la persona n. ',Persona:1,' : '); readln(Conto); TotaleConto:= TotaleConto+Conto; {END; } write('Totale conto pranzo : Lit. ', TotaleConto:4:2); ContoCibo := ContoCibo + TotaleConto; END;

75 Essere sicuri che la condizione di uscita di un WHILE o REPEAT si verifichi sempre. Cosa mostra il video con questo programma? Somma:=0; read(Numero); WHILE Numero > 0 DO writeln(Somma:10); Somma:=Somma + Numero; read(Numero); Quando in un programma vi sono procedure contenenti cicli è opportuno in fase di test mettere scritte di controllo in ingresso e in uscita alle singole procedure. Il WHILE viene eseguito allinfinito

76 Si vuole mostrare la somma dei numeri positivi introdotti. Cosa mostra il video di questo programma? Somma:=0; REPEAT read(Numero); Somma:=Somma + Numero UNTIL Numero <= 0; writeln(Somma:10); Uscita dalla procedura mal controllata. Si vuole mostrare la somma dei primi 100 numeri interi. Cosa mostra il video di questo programma? Somma:=0; Conta:=1; REPEAT Somma:=Somma + Conta; Conta:=Conta+1; UNTIL Conta=100; writeln(Somma:10); Somma prima di uscire anche il numero negativo Non somma il numero 100

77 Cosa mostra il video di questo programma? Somma:=0; FOR Conta:=1 TO 100 DO BEGIN IF Conta MOD 5 =0 THEN writeln(La somma dei primi,Conta:1, e,Somma :1); Somma:=Somma + Conta; END; Cosa mostra il video di questo programma? readln(Numero); IF Numero <=0 THEN BEGIN writeln(Introduci un numero positivo ); readln(Numero); END; writeln(Numero=,Numero:1) Posizione errata dellistruzione E necessario mettere un loop

78 Consigli per testare i cicli. Testare il ciclo innanzitutto con un piccolo insieme di dati. Quindi non fare un ciclo di 100 o più passi ma solo di pochi passi e quindi fare il test. Gli errori mostrati prima emergono più facilmente. Testare il ciclo relativamente ai valori di entrata/uscita. Verificare cioè che le condizioni di entrata/uscita previste siano rispettate. Testare il corpo del ciclo con valori sicuramente sbagliati. Testare il corpo del ciclo con valori sicuramente corretti. Testare il corpo del ciclo anche forzando con asserzioni alcuni valori.

79 Esercizi dal libro pag. 259 n. 22, 25 pag. 260 n. 28 pag. 261 n. 32

80


Scaricare ppt "COME FARE ESEGUIRE AD UNA MACCHINA ISTRUZIONI RIPETITIVE ? WHILE …….. DO Un ciclo (loop) è una istruzione che permette di far eseguire, in maniera ripetitiva,"

Presentazioni simili


Annunci Google