ricorsione e debug. fattoriale function fatt (n: integer): integer; begin if n=0 then fatt:=1 else...

14
Ricorsione e Debug

Upload: gaetano-baldi

Post on 01-May-2015

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

Ricorsione e

Debug

Page 2: 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

Fattorialefunction 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;

Page 3: 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

Fattoriale di n=4

numero n Fatt(4) Fatt(3) Fatt(2) Fatt(1)

4 4 4*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;

Page 4: 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

Esercizio

Scrivere una funzione che data una stringa, restituisca la stringa invertita.

Se x= abraca

L’output è acarba

Page 5: 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

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; end;

begin writeln('inserisci la parola'); readln(P); n:=length(p); writeln('La parola invertita e'' ', inverti(P)); readln;end.

Page 6: 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

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

stringaInversaP =‘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; end;

begin writeln('inserisci la parola'); readln(P); writeln('La parola invertita e'' ', inverti(P) ); readln;end.

stringaInversaP =‘abraca’inverti(P)

La parola invertita e’ acarba

Page 7: 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

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; end;

begin writeln('inserisci la parola'); readln(P); writeln('La parola invertita e'' ', inverti(P) ); readln;end.

Page 8: 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

DebugIl debugger integrato dà al programmatore il controllo sull’esecuzione

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 l’esecuzione.

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 un’istruzione eseguibile, quindi non su righe vuote, righe di commento, direttive del compilatore, dichiarazioni dei dati o altre parti non eseguibili dal programma.

Page 9: 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

Esecuzione passo per passo

• TRACE INTO (F7): consente di eseguire un’istruzione alla volta. In particolare esegue quella evidenziata dalla barra di esecuzione, sposta la barra sull’istruzione 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 l’esecuzione passo per passo.

• STEP OVER (F8): attiva l’esecuzione 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 nell’istruzione successiva e restituisce il controllo al programmatore.

Page 10: 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

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 dell’esecuzione.

• 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.

Page 11: 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

Debug - Esempi

• Procedura (Procedura annidata)

• Funzione (ParametriEglobale)

• Funzione (EC)

• Vettori e Record (elenco)

• Procedura ricorsiva (TrovaPosizioneMinimo)

• Funzione ricorsiva (stringaInversa)

Page 12: 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

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?

Cosa stampa?

Page 13: 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

Primo risultato: ris:=2*doppio (B)

B 3

A

B 6

A

B 3

La funzione doppio(b) = 2

ris = 2 * 6 = 12Quindi writeln('Primo risultato: ', ris); stampa

Primo risultato: 12

Function doppio (Var a: integer): integer;begin a:=2*a; doppio:=a;end;

Page 14: 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

Secondo risultato: ris:=doppio(B)+doppio(B)B 3

A

B 6

A

B 3

La funzione doppio(B) = 6 Ris = 6 + doppio(B)

B 6

A

B 12

A

B 6

La funzione doppio(B) = 12 Risultato = 6 + 12 = 18

Function doppio (Var a: integer): integer;begin a:=2*a; doppio:=a;end;