QUARTA ESERCITAZIONE AUTOGUIDATA

Obiettivo dell'esercitazione:

  • esercitarsi ulteriormente sulle funzioni
  • uso del debugger nella individuazione degli errori,
  • uso del debugger nell'esecuzione di codici contenenti ricorsioni (semplici e multiple)
  • fare un esempio di funzione ricorsiva.
  • scrittura di funzioni ricorsive

1. ESERCIZIO 0

(soluzione nel file rettang.c -fare questo esercizio se si hanno ancora problemi sulla gestione delle funzioni)

Scrivere un programma che:

  1. prende in input due interi (che rappresentano la base e l'altezza di un rettangolo) e un carattere,
  2. visualizza un rettangolo pieno riempito con il carattere letto in input
  3. stampa l'area e il perimetro del rettangolo.

Per risolvere l'esercizio bisogna definire i seguenti moduli:

  1. AreaRettangolo e PerimetroRettangolo, che prendono due valori (base e altezza) e restituiscono rispettivamente l'area e il perimetro del rettangolo;
  2. StampaRettangolo ,
    • che prende tre valori (base, altezza e carattere) ,
    • visualizza a schermo il rettangolo
    • stampa area e perimetro del rettangolo usando i due moduli precedenti;
  3. il modulo main che
    • legge l'input e
    • chiama il modulo StampaRettangolo
    • .

2. INDIVIDUAZIONE DEGLI ERRORI

Per correggere gli eventuali errori logici del programma usare gli strumenti di correzione offerti dal debugger dall'ambiente Turbo C che riassumiamo brevemente:

  1. esecuzione passo passo con il comando Trace into (F7) del menų Run (il programma viene compilato e viene posta la barra di esecuzione all'inizio della funzione main().
    Ogni volta che si preme F7 viene eseguita l'istruzione successiva)
  2. esecuzione passo passo con il comando Step over (F8) del menų Run (analogo al precedente , ma tratta una chiamata di funzione come se fosse un'unica istruzione, senza entrare nel corpo della funzione stessa)
  3. ispezione delle variabili : scegliere il comando Watches dal menų Debug;
    1. si attiva un sottomenų nel quale si deve scegliere Add watch.
    2. Immettere nel campo Watch Expression il nome delle variabili di cui si vuole controllare il flusso)
  4. visualizzazione della pila delle attivazioni delle funzioni con il comando Call stack nel menų Debug (Ctrl-F3)
    questo comando, durante l'esecuzione di un programma, apre una finestra in cui č mostrata la pila delle attivazioni nello stato corrente del programma e permette quindi di seguire le chiamate delle funzioni;
    per ogni attivazione di un sottoprogramma vengono mostrati nome del modulo e valore dei parametri attuali usati nella chiamata, dal basso verso l'alto, nell'ordine di attivazione.

3. ESERCIZIO 1

  1. Esecuzione di un programma con ricorsione semplice usando il debugger
    1. Copiare il file fattdeb.c nel direttorio C:\TEMP,
    2. aprire il file all'interno del TurboC, ed
    3. eseguire il programma passo-passo usando i comandi del debugger
    .

    In particolare

    1. aprire le finestre Watches e Call stack e ridimensionare e riposizionare le varie finestre in modo che siano tutte visibili contemporaneamente;
    2. aggiungere un watch per il parametro n ed uno per la variabile prec;
    3. seguire l'evoluzione del programma quando il numero immesso e` 5 (facendo attenzione all'evoluzione dello stack delle attivazioni e dei valori di n e prec).

  2. Esecuzione di un programma con ricorsione multipla usando il debugger
    1. Copiare il file fibodeb.c nel direttorio C:\TEMP,
    2. aprire il file all'interno del TurboC, ed
    3. eseguire il programma passo-passo usando i comandi del debugger
    .

    In particolare

    1. aprire le finestre Watches e Call stack e ridimensionare e riposizionare le varie finestre in modo che siano tutte visibili contemporaneamente;
    2. aggiungere un watch per il parametro n e per le variabili f1 e f2;
      (ricordarsi di cancellare il watch per la variabile prec usato nell'esercizio precedente)
    3. seguire l'evoluzione del programma quando il numero immesso e` 6 (facendo attenzione all'evoluzione dello stack delle attivazioni e dei valori di n, f1 e f2;).

4. ESERCIZIO 2

(soluzione nel file potenza.c)

  1. Scrivere una funzione ricorsiva potenza che
    1. prende due valori , numero e esponente, e
    2. restituisce il valore del numero elevato a esponente
    .
  2. Utilizzare la funzione in un programma che
    1. legge i due valori e
    2. stampa la potenza
    .

5. ESERCIZIO 3

Scrittura di funzioni ricorsive

Copiare il file driveint.c nel direttorio C:\TEMP ed aprire il file all'interno del Turbo C. Il file contiene un programma che implementa un menu per verificare il risultato dell'esecuzione di alcune funzioni su interi.

Nel programma mancano le definizioni di alcune funzioni: si richiede di completarlo. In particolare, le funzioni da aggiungere devono implementare le operazioni aritmetiche di somma, prodotto ed esponenziazione tra interi nonnegativi, supponendo di NON POTER USARE GLI OPERATORI del C + e - SUGLI INTERI, ma di POTER USARE SOLO l'istruzione di assegnazione e il confronto tra due variabili di tipo intero

(Fate finta che la versione del TurboC con la quale state lavorando sia difettosa e non vi permetta di usare gli operatori + o - e il valore 1).

Le funzioni vanno realizzate in modo ricorsivo, utilizzando le seguenti definizioni induttive

somma prodotto esponenziazione
somma(x,y) = x
se y = 0
prod(x,y) = 0
se y = 0
esponente(x,y) = 1
se y = 0
somma(x,y) = 1 + (somma(x, y-1))
se y > 0
prod(x,y) = somma(x, prod(x, y-1))
se y > 0
esponente(x,y) = prod(x, esponente(x, y-1))
se y > 0