Progettazione di un programma, regole di buona programmazione, input/output elementare

OBIETTIVO DELLA LEZIONE
  1. Impiegare correttamente il debugger;
  2. Imparare come trovare documentazione per la nostra attivita' di programmazione;
  3. Capire cosa e' la progettazione TOP-DOWN applicandola a esempi concreti;
  4. Capire come si scrivono programmi corretti, leggibili, portabili e di facile manutenzione;
  5. Usare correttamente l' input/output in C mediante scanf e printf;
  6. Capire gli operatori in C, e la differenza fra istruzioni ed espressioni.
.:. LUCIDI DELLA LEZIONE .:.
.:. NOTE DELLA LEZIONE .:.

Note

Molti buoni manuali di C sono disponibili gratuitamente in rete, ad esempio:




Inciampo

ALCUNE REGOLE DI BUONA PROGRAMMAZIONE



La schematizzazione a blocchi

Inciampo

ESPRESSIONI ed ISTRUZIONI

Esercizio Istruzioni ed espressioni
Individuate le espressioni e le istruzioni nel codice sottostante
#include <stdio.h>
int main()
{
    char sex;
    int eta;

    printf("Inserire il proprio sesso:\n M sta per maschio:\n F sta per femmina:\n");
    scanf("%c", &sex);

    printf("Inserire l'eta\n");
    scanf("%d", &eta);

    if((sex=='M') || (sex=='m')) printf("Sei un maschio e hai %d anni", eta);
    else printf("Sei una femmina e hai %d anni",eta - 1);   // sconto per signore

    printf("\n\nPremi un tasto per uscire");
    fflush(stdin);
    getchar();   // trucco per far rimanere aperta la finestra di testo
}

Inciampo QUINDI uguaglianza NON E' assegnamento (x==3 NON E' x=3;) Inciampo



Operatori e precedenze ([unari, binari e ternari], matematici e logici)

Lab

Prima di iniziare

Rileggi velocemente il riassunto della lezione che trovi in questa pagina (sezione Note), apri i file in allegato questa lezione e tienili aperti, saranno utili (li puoi aprire usando i link sotto la sezione Obiettivo della lezione)

Esercizio 1 (Input/Output in C)
Dato il programma sotto riportato:
  1. dichiara una variabile intera lunghezza ed una volume;
  2. stampa con una printf() la stringa "Immettere la lunghezza del cubo in metri";
  3. memorizza il valore immesso da tastiera nella variabile lunghezza mediante una scanf() usando "%d";
  4. memorizza nella variabile intera volume il cubo della variabile lunghezza;
  5. stampa con una printf() la stringa "Il volume del cubo e' " seguito dal valore della variabile volume;
  6. salva con il nome cubo.c il tuo programma e compilalo. Controlla se funziona correttamente.

#include <stdio.h>

int main()
{
    
    // inserisci qui il tuo codice
    
    printf("\n\nPremi un tasto per uscire");
    fflush(stdin);
    getchar();   // trucco per far rimanere aperta la finestra di testo
    return 0 ;
}

soluzione.
Esercizio 2 (Struttura di un programma C)
Dato il programma sotto riportato:
  1. dichiara una variabile intera peso;
  2. aggiungi una costante (ETICHETTA) PESOMASSIMO che dovrà valere 95.
  3. stampa con una printf() la stringa "Inserire in peso in Kg:";
  4. memorizza il valore immesso da tastiera nella variabile peso mediante una scanf() usando "%d";
  5. stampa con una printf() una frase che riporta il peso e il PESOMASSIMO, per esempio: "Il tuo peso e' %dKg, mentre il peso massimo e' %dKg".
#include <stdio.h>

int main()
{
    char sex;
    int eta;

    printf("Inserire il proprio sesso:\n M sta per maschio:\n F sta per femmina:\n");
    scanf("%c", &sex);

    printf("Inserire l'eta\n");
    scanf("%d", &eta);

    if((sex=='M') || (sex=='m')) printf("Sei un maschio e hai %d anni", eta);
    else printf("Sei una femmina e hai %d anni",eta);

    printf("\n\nPremi un tasto per uscire");
    fflush(stdin);
    getchar();   // trucco per far rimanere aperta la finestra di testo
    return 0 ;
}

soluzione.
Esercizio 3 (Ripasso teoria lezione)
Prova a rispondere alle seguenti domande.
Se non trovi le risposte o non sei sicuro, rivedi la lezione.
--------------------------------------------------------------------------------
1. La seguente porzione di codice (x>3) è:

- una espressione
- una istruzione

--------------------------------------------------------------------------------
2. Quali delle seguenti espressioni sono vere (anche più di una)?

- Una espressione non ha mai effetti sulle variabili
- (x==3) è una istruzione di controllo
- Una istruzione è una espressione con un punto e virgola alla fine
--------------------------------------------------------------------------------
3. Dopo la seguente porzione di codice a=6; if(a=4) b = 6; else b = 9; quanto 
valgono le variabili a e b? 

Se non sei sicuro della risposta scrivi un programma che contiene questo codice 
ed eseguilo.
--------------------------------------------------------------------------------
4. Dopo la seguente porzione di codice a=6; if(a!=4) b = 6; else b = 9; quanto 
valgono le variabili a e b? 


Se non sei sicuro della risposta scrivi un programma che contiene questo codice 
ed eseguilo.
--------------------------------------------------------------------------------
5. Dopo i comandi i = 12; a = i++; quanto valgono le variabili a e i? 

Se non sei sicuro della risposta scrivi un programma che contiene questo codice 
ed eseguilo.
--------------------------------------------------------------------------------
6. Dopo i comandi i = 12; a = ++i; quanto valgono le variabili a e i? 

Se non sei sicuro della risposta scrivi un programma che contiene questo codice 
ed eseguilo.
--------------------------------------------------------------------------------

soluzione.
Esercizio 4 (Warning del compilatore)
Usando DEVC++, crea il file warning.c contenente il programma sotto riportato:
  1. compila warning.c e prova ad eseguirlo;
  2. Selezionate "Compiler Options" dal menu' "Tools" di DEVC++.
  3. Nella finestra che compare, selezionare "Add the following commands when calling compiler".
  4. e aggiungere nel riquadro: -g3 -Wall (esattamente come scritto con la 'W' maiuscola). Selezionare "OK". D'ora in poi il compilatore emette un numero maggiore di messaggi di avviso (warning), molto utili per individuare eventuali malfunzionamenti o errori.
  5. compila warning.c e prova ad eseguirlo;
  6. leggi i warning che il compilatore segnala;
  7. cambia (a=12) con (a==12). Cosa succede ai warning e in esecuzione? Ci sono delle differenze da prima? ;
  8. inserisci return 0; come ultima istruzione. Cosa succede ai warning e in esecuzione? Ci sono delle differenze da prima? ;
#include <stdio.h>
int main()
{
    int i,a,b;
    i = 15;
    a =i;
    if (a=12) b=a; else b=0;
    printf("a = %d , b = %d, i = %d", a , b, i);
    getchar();
}

Esercizio 5 (Debug e occupazione in memoria dei tipi di dato)
Usando DEVC++, crea il file inmemoria.c contenente il programma sotto riportato:
  1. compilalo e prova ad eseguirlo da linea di comando;
  2. inserisci un breack point alla linea printf("inserisci un numero intero:"); e fai partire il debugger;
  3. segui l'esecuzione del programma passo passo, così come presentato lezione;
  4. visualizza il contenuto di ciascuna variabile.
#include <stdio.h>
int main()
{
    int numero_intero;
    char carattere, parere;
    float numero_reale;

    do
    {
        printf("Inserisci un numero intero: ");
        scanf("%d", &numero_intero);
        fflush(stdin);

        printf("Inserisci un carattere: ");
        scanf("%c", &carattere);
        fflush(stdin);

        printf("Inserisci un numero reale: ");
        scanf("%f", &numero_reale);
        fflush(stdin);

        printf("Hai inserito: %d, %c, %f.\n", numero_intero,
            carattere, numero_reale);

        printf("Vuoi continuare [S]/N? ");
        scanf("%c", &parere);
        fflush(stdin);
    }
    while((parere=='S') || (parere=='s')); // Attenzione al ;
  
    return 0;
}
Suggerimenti
Se hai eseguito correttamente l'esercizio avrai potuto esaminare: il codice passo passo, utilizzando il comando NEXT STEP; il valore delle variabili, utilizzando il comando ADD WATCH.
Se invece, i sopraelencati comandi non risultano ABILITATI, significa che non hai lanciato correttamente il debugger.
Esercizio 6 (Operatori)
Usando DEVC++, crea il file operatori.c contenente il programma sotto riportato:
  1. compilalo e prova ad eseguirlo da linea di comando;
  2. inserisci un breack point alla linea printf("risultato1 vale %d \n" , risultato1); e fai partire il debugger;
  3. segui l'esecuzione del programma passo passo, così come presentato lezione;
  4. visualizza il contenuto di ciascuna variabile.
#include <stdio.h>
int main()
{
    int a;
    int b;
    int risultato1, risultato2, risultato3, risultato4;
    
    a = 1 ;
    b = 0 ;
    
    // inserisci qui il codice che calcola 
    // risultato1 come a AND b
    
    
    
    // inserisci qui il codice che calcola 
    // risultato2 come a OR b
    
    
    b = 3;
    // inserisci qui il codice che calcola 
    // risultato3 come a AND b
    
    
    risulato4 = (b==a); // E' sintatticamente corretta questa riga??
        
    printf("risultato1 vale %d \n"   , risultato1);
    printf("risultato2 vale %d \n"   , risultato2);
    printf("risultato3 vale %d \n"   , risultato3);
    printf("risultato4 vale %d \n"   , risultato4);
 
 	
    printf("\n\nPremi un tasto per uscire");
    fflush(stdin);
    getchar();   // trucco per far rimanere aperta la finestra di testo
    return 0 ;
}

Cerca di capire bene come funziona la riga
risulato4 = (b==a);
ragionando come fara' il compilatore: se a vale 1 e b vale 3, quanto vale l'espressione (b==a)? questo valore lo devo assegnare a risultato4.
Esercizio 7 (operatori II)
Individua quante sono le istruzioni e le espressioni contenute nel codice seguente. Per semplicita', conta 1 le istruzioni ed espressioni composte.
#include <stdio.h>
int main()
{
    char sex;
    int eta;

    printf("Inserire il proprio sesso:\n M sta per maschio:\n F sta per femmina:\n");
    scanf("%c", &sex);

    printf("Inserire l'eta\n");
    scanf("%d", &eta);

    if((sex=='M') || (sex=='m')) printf("Sei un maschio e hai %d anni", eta);
    else printf("Sei una femmina e hai %d anni",eta - 1);   // sconto per signore

    printf("\n\nPremi un tasto per uscire");
    fflush(stdin);
    getchar();   // trucco per far rimanere aperta la finestra di testo
    return 0;
}
soluzione.
Esercizio 8 (Progettazione TOP-DOWN)
Per esercitarsi nella programmazione è bene imparare a capire come scomporre un problema in una sequenza di passi più semplici.
A questo scopo può essere utile immaginare di programmare un robot che deve aprire una porta chiusa: la programmazione è costituita da una catena di passi elementari scritti in italiano. A partire dallo schema di seguito proposto prova ad ampliarlo. Con fantasia e capacità di osservazione puoi aggiungere moltissimi passi ed eventualmente ampliare la gerarchia dei passi proposta.
1. Uscire da una porta chiusa: 
  1.1 Avvicinarsi alla porta: 
    1.1.1 muovere il corpo fino a davanti alla porta 
  1.2 Aprire la porta usando la maniglia: 
    - ..... 
    - ..... 
    - ..... 
  1.3 Attraversare la porta: 
    - ..... 
    - ..... 
    - ..... 
Suggerimenti
Di seguito sono elencate alcune domande che ti aiuteranno a valutare la gerarchia e/o la sequenza dei passi che hai individuato.
  1. Nelle programma hai considerato che la maniglia ruota per un angolo finito e che il robot deve sentire la chiusura aprirsi?
  2. Hai considerato che il braccio del robot deve adattarsi al movimento circolare della porta sui suoi cardini e non viceversa, altrimenti il robot scardina la porta?
  3. Hai considerato che se la porta si apre dalla parte del robot, il robot deve togliersi di mezzo altrimenti gli sbatte la porta in faccia?
Se la tua sequenza non contempla alcuna di queste considerazioni allora prova ad inserirne almeno una (nella descrizione usa il grado di dettaglio che ti soddisfa).
Esercizio 9 (Schemi a blocchi)
Abbiamo visto che mediante i tre costrutti SEQUENZA, SCELTA ed ITERAZIONE è possibile programmare qualunque algoritmo. Abbiamo visto inoltre, la loro rappresentazione mediante lo schema a blocchi.
Scrivi uno schema a blocchi che legga, attraverso un ciclo, una sequenza di numeri immessi da un ipotetico utente: la sequenza termina con il numero 0. Lo schema deve produrre in uscita la somma dei numeri e la loro cardinalità.

Verifica l'esercizio
Per verificare la correttezza dello schema a blocchi che hai individuato simulane il funzionamento utilizzando in input la seguente sequenza di numeri interi: 1,4,7,0.
soluzione.
Esercizio 10 (Schemi a blocchi II)
Scrivi uno schema a blocchi che calcoli la radice quadrata intera di un numero intero N approssimato per difetto.
La radice quadrata intera calcolata per difetto (indicalo con I nello schema a blocchi) è il numero intero più grande il cui quadrato risulta minore o uguale di N.

Verifica l'esercizio
Per verificare la correttezza dello schema a blocchi che hai individuato simulane il funzionamento utilizzando in input i numeri interi 35, 4, 3 ed ottenendo come output, rispettivamente 5, 2, 1.
soluzione.
Esercizio 11 (Debug)
Usando DEVC++, crea il file cubi.c contenente il programma sotto riportato:
  1. inserisci tutti i breakpoint dove richiesto;
  2. compila;
  3. inizia il debugging (debug);
  4. quando hai raggiunto il primo breakpoint inserisci gli watch richiesti;
  5. fai un passo alla volta usando lo step into;
#include <stdio.h>

int main()
{   
  int lato;
  int quadrato = 0;
  int cubo;
  int dispari;
		
  printf("\nInserire il lato:\n");
  scanf("%d",&lato);
	
  // Inserisci un breakpoint qui sotto
  quadrato = 6;
  // Quando arrivi a questo breakpoint aggiungi gli watch:
  // add watch di lato
  // add watch di quadrato
  // add watch di cubo
  // add watch di dispari
	
  // Inserisci un breakpoint qui sotto
  quadrato = lato*lato;
  // Controlla i valori delle var: quale e' stato modificato?
	
  // Inserisci un breakpoint qui sotto
  cubo = quadrato*lato;
  // Controlla i valori delle var: quale e' stato modificato?
	
  // Inserisci un breakpoint qui sotto
  dispari = cubo%2;
  // Controlla i valori delle var: quale e' stato modificato?
	
  // Inserisci un breakpoint qui sotto
  if (dispari) printf("\nIl cubo di %d e' dispari", lato);
  else printf("\n Il cubo di %d e' pari", lato);
   
  printf("\n\n\n\nPremi enter per chiudere questa finestra");
	
  fflush(stdin);
  getchar();  // solo per non far scomparirie la finestra ....  
  exit(0);
}

Suggerimenti
Se hai eseguito correttamente l'esercizio avrai potuto esaminare: il codice passo passo, utilizzando il comando NEXT STEP; il valore delle variabili, utilizzando il comando ADD WATCH.
Se invece, i sopraelencati comandi non risultano ABILITATI, significa che non hai lanciato correttamente il debugger.




Informazioni sul sito