La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Ricorsione e Debug. Fattoriale function fatt (n: integer): integer; begin if n=0 then fatt:=1 else fatt:= n* fatt (n-1); end; Begin readln(numero); writeln(Il.

Presentazioni simili


Presentazione sul tema: "Ricorsione e Debug. Fattoriale function fatt (n: integer): integer; begin if n=0 then fatt:=1 else fatt:= n* fatt (n-1); end; Begin readln(numero); writeln(Il."— Transcript della presentazione:

1 Ricorsione e Debug

2 Fattoriale function fatt (n: integer): integer; begin if n=0 then fatt:=1 else fatt:= n* fatt (n-1); end; Begin readln(numero); writeln(Il fattoriale e, fatt(numero); Readln; End;

3 Fattoriale di n=4 numeronFatt(4)Fatt(3)Fatt(2)Fatt(1) 444*fatt(3) 3*fatt(2) 2*fatt(1) 1*fatt(0)=1 2*1=2 3*2=6 4*6=24 Risultato: 24 function fatt (n: integer): integer; begin if n=0 then fatt:=1 else fatt:= n* fatt (n-1); end;

4 Esercizio Scrivere una funzione che data una stringa, restituisca la stringa invertita. Se x= abraca Loutput è acarba

5 Esercizio Scrivere una funzione che data una stringa, restituisca la stringa invertita. var n:integer; //Variabile globale P:string; function inverti(parola:string):string; var V:char; begin if length(parola)=1 then inverti:=parola else begin V:=parola[1]; delete(parola,1,1); inverti:=inverti(parola) + V; end; begin writeln('inserisci la parola'); readln(P); n:=length(p); writeln('La parola invertita e'' ', inverti(P)); readln; end.

6 inverti(abraca) v=a parola=braca inverti:=inverti(braca)+ a inverti(braca) v=b parola=raca inverti:=inverti(raca)+ b inverti(raca) v=r parola=aca inverti:=inverti(aca)+ r inverti(aca) v=a parola=ca inverti:=inverti(ca)+ a inverti(ca) v=c parola=a inverti:=inverti(a)+ c inverti(ca) v=c parola=a inverti:=a + c = ac inverti(aca) v=a parola=ca inverti:= ac + a=aca inverti(raca) v=r parola=aca inverti:=aca+ r=acar inverti(braca) v=b parola=raca inverti:=acar + b = acarb inverti(abraca) v=a parola=braca inverti:=acarb +a = acarba stringaInversa P =abraca inverti(P) = acarba inverti(a) inverti:= a Program stringaInversa; var P:string; function inverti(parola:string):string; var V:char; begin if length(parola)=1 then inverti:=parola else begin V:=parola[1]; delete(parola,1,1); inverti:=inverti(parola) + V; end; begin writeln('inserisci la parola'); readln(P); writeln('La parola invertita e'' ', inverti(P) ); readln; end. stringaInversa P =abraca inverti(P) La parola invertita e acarba

7 Che succede? var P:string; function inverti(parola:string;):string; var V:char; begin if length(parola) then inverti:=parola else begin V:=parola[1]; delete(parola,1,1); inverti:= v + inverti(parola); end; begin writeln('inserisci la parola'); readln(P); writeln('La parola invertita e'' ', inverti(P) ); readln; end.

8 Debug Il debugger integrato dà al programmatore il controllo sullesecuzione del codice. Utile soprattutto quando ci sono errori logici non facili da individuare. Durante il debug, una barra di esecuzione evidenzia la successiva istruzione del codice da eseguire. Go TO CURSOR (F4): permette di interrompere momentaneamente il programma nel punto specificato dal cursore. BREAKPOINT: punto prefissato in una riga del codice sorgente che interrompe momentaneamente lesecuzione. I breakpoint vanno prefissati e rimangono finchè non vengono rimossi, mentre il Go to Cursor dipende dalla posizione corrente del cursore. Il breakpoint (o il cursore) deve essere posizionato su righe contenenti unistruzione eseguibile, quindi non su righe vuote, righe di commento, direttive del compilatore, dichiarazioni dei dati o altre parti non eseguibili dal programma.

9 Esecuzione passo per passo TRACE INTO (F7): consente di eseguire unistruzione alla volta. In particolare esegue quella evidenziata dalla barra di esecuzione, sposta la barra sullistruzione successiva e restituisce il controllo al programmatore. Se la riga su cui si trova la barra è una procedura o una funzione, Trace into salta a quella parte del programma continuandone lesecuzione passo per passo. STEP OVER (F8): attiva lesecuzione del programma una riga alla volta, ma a differenza di Trace Into tralascia le chiamate alle procedure e alle funzioni. In pratica esegue la procedura o la funzione in una singola istruzione (come se fosse una semplice istruzione), sposta la barra di esecuzione nellistruzione successiva e restituisce il controllo al programmatore.

10 Controllare variabili e stack WATCH: è un riquadro che consente di controllare il contenuto di una o più variabili scelte dal programmatore. Può visualizzare solo il contenuto delle variabili dove esse sono visibili (regole di visibilità). LOCAL VARIABLES: è un riquadro che contiene tutte e sole le variabili locali della procedura o funzione in cui si trova la barra dellesecuzione. CALL STACK: è un riquadro che permette di controllare il percorso effettuato dal programma fino al punto in esame. E un elenco in ordine discendente di tutte le precedenti chiamate alle procedure o alle funzioni.

11 Debug - Esempi Procedura (Procedura annidata) Funzione (ParametriEglobale) Funzione (EC) Vettori e Record (elenco) Procedura ricorsiva (TrovaPosizioneMinimo) Funzione ricorsiva (stringaInversa)

12 program EC; {$APPTYPE CONSOLE} uses SysUtils; var b, ris: integer; Function doppio(Var a: integer): integer; begin a:=2*a; doppio:=a; end; begin b:=3; ris:=2* doppio (b); writeln('Primo risultato: ', ris); writeln; b:=3; ris:= doppio (b) + doppio (b); writeln ('Secondo risultato: ', ris); readln; end. Cosa stampa?

13 Primo risultato: ris:=2* doppio (B) B3 A B6 A B3 La funzione doppio(b) = 2 ris = 2 * 6 = 12 Quindi writeln('Primo risultato: ', ris); stampa Primo risultato: 12 Function doppio (Var a: integer): integer; begin a:=2*a; doppio:=a; end;

14 Secondo risultato: ris:=doppio(B)+doppio(B) B3 A B6 A B3 La funzione doppio(B) = 6 Ris = 6 + doppio(B) B6 A B12 A B6 La funzione doppio(B) = 12 Risultato = = 18 Function doppio (Var a: integer): integer; begin a:=2*a; doppio:=a; end;


Scaricare ppt "Ricorsione e Debug. Fattoriale function fatt (n: integer): integer; begin if n=0 then fatt:=1 else fatt:= n* fatt (n-1); end; Begin readln(numero); writeln(Il."

Presentazioni simili


Annunci Google