Università degli Studi di Brescia Fondamenti di Programmazione Docente: Alessandro Saetti A.A. 2012/2013 ESERCITAZIONE STRUTTURE DI CONTROLLO E VETTORI Università degli Studi di Brescia A.A. 2012/2013 Scrivere un programma C che: - Acquisisca da tastiera numeri interi fintantoché i numeri immessi sono positivi. - Determini (stampando a video un messaggio) se i numeri immessi sono pari oppure dispari Scrivere un programma C che: - Acquisisca da tastiera numeri interi fintantoché i numeri immessi sono positivi. - Determini (stampando a video un messaggio) se i numeri immessi sono pari oppure dispari #include <stdio.h> #include <stdlib.h> int main() { // . . . Impostiamo la struttura di partenza di un programma C system("pause"); exit(0); } Scrivere un programma C che: - Acquisisca da tastiera numeri interi fintantoché i numeri immessi sono positivi. - Determini (stampando a video un messaggio) se i numeri immessi sono pari oppure dispari Partiamo considerando il sotto problema: «Stabilire se un numero è pari o dispari ?» Scrivere un programma C che: - Acquisisca da tastiera numeri interi fintantoché i numeri immessi sono positivi. - Determini (stampando a video un messaggio) se i numeri immessi sono pari oppure dispari Il problema da risolvere può essere così «umanamente» schematizzato: Impostiamo la struttura di partenza di un programma C O DISPARI ? PARI Questo è il dilemma! 1 -ACQUISISCO PARI! 4 Possiamo dettagliare con maggior rigore la sequenza di operazioni tramite il seguente flowchart: INIZIO 1) INPUT Acquisisco il dato da analizzare (un numero) e lo tengo a mente. Acquisisco N 2) ALGORITMO Valuto, in base alla mia esperienza, se il numero è pari o dispari. Nel flowchart il rombo indica una decisione (IF). E’ pari ? NO SI Soluzione=«Dispari» Soluzione=«Pari» 3) OUTPUT Espongo il risultato (soluzione) della mia analisi Espongo la soluzione FINE Immaginando un approccio «umano» userò la mia esperienza per individuare i passaggi (algoritmo) che mi consentono l’individuazione della corretta soluzione del problema (è pari ?) PROBLEMA DA RISOLVERE ESPERIENZA + ANALISI ALGORITMO DISPOSITIVI DI INPUT DISPOSITIVI 6 DI OUTPUT L’attività umana svolta per giungere alla soluzione deve essere «decodificata» con le «risorse» messe a disposizione da un calcolatore PROBLEMA DA RISOLVERE ISTRUZIONI + ALGORITMO PROGRAMMA DA ESEGUIRE DISPOSITIVI DI INPUT DISPOSITIVI 7 OUTPUT DI Scrivere un programma consiste nel decodificare l’algoritmo in una sequenza di istruzioni #include <stdio.h> comprensibili dal computer #include <string.h> INIZIO Acquisisco N E’ pari ? NO SI Soluzione=«Pari» Soluzione=«Dispari» Espongo la soluzione FINE PARI O DISPARI ? Questo è l’algoritmo! int main() { int n; char soluzione[20]; printf("Digita un numero intero : "); scanf("%d", &n); if(n % 2 == 0) strcpy(soluzione,"pari"); else strcpy(soluzione,"dispari"); printf("%d: %s!\n", n, soluzione); } PARI O DISPARI ? Questo è il programma! 8 L’algoritmo utilizza «istruzioni umane elementari» (comprensibili ed eseguibili da parte di una persona) per risolvere un determinato problema. Per creare un programma, comprensibile ed eseguibile sul calcolatore, occorre tradurre le «istruzioni umane» in comandi riconosciuti dal computer. Occorre quindi disporre di un set di comandi che il computer sia in grado di comprendere ed eseguire (ad esempio un linguaggio di programmazione). 1 - INPUT Leggo, Ascolto, Memorizzo … 1 - INPUT scanf(), cin >>, int N, char Esito[10] … 2 - ALGORITMO: SE N … o E’ divisibile per 2 ? o E’ multiplo di 2 ? o Diviso per 2 da resto zero ? Allora Memorizzo come soluzione … Altrimenti Memorizzo come soluzione … 2 - ALGORITMO: if ( N Non traducibile Non traducibile % 2== 0 ) strcpy(Esito, "Pari") else strcpy(Esito , "Dispari") 3 - OUTPUT Scrivo, Dico, … TRADUCO 3 - OUTPUT 9 printf(), cout << … 1 – INPUT: ACQUISIZIONE DEI DATI INIZIO (A) Dammi un numero: Acquisisco N E’ pari ? NO SI Soluzione=«Pari» (C) Soluzione=«Dispari» Espongo la soluzione FINE (B) 12 La fase di acquisizione dei dati può corrispondere ad una esplicita richiesta (A) seguita dall’ascolto della corrispondente risposta (B). Ricevuto il dato lo tengo a mente (C) per la successiva fase di analisi 1 – INPUT: ACQUISIZIONE DEI DATI La fase di acquisizione dei dati inizia con l’esplicita richiesta (A) … printf("Digita un numero intero: "); (A) C:\Laboratorio>pari Digita un numero intero: (B) … seguita dalla lettura del dato digitato (B) scanf("%d", &n); Dobbiamo anche tradurre l’azione di «ricordare» il dato appena letto (C) definendo una variabile che lo contenga: int n; (C) 2 – ALGORITMO: ELABORAZIONE DEI DATI INIZIO «E’ PARI ?» è un concetto generico. Devo trasformarlo in Acquisisco N una sequenza di istruzioni elementari che posso eseguire. Tale sequenza deve definire una «corretta procedura» per E’ pari ? risolvere il problema. Questa «procedura» corrisponde SI NO ad uno degli ALGORITMI di soluzione possibili. Soluzione=«Pari» Soluzione=«Dispari» Il risultato, ottenuto eseguendo l’algoritmo, deve essere Espongo la soluzione «ricordato» per poi essere utilizzato nella fase successiva. DATO FINE Il rombo rappresenta una decisione basata sulla condizione scritta al suo interno. E’ pari ? SI NO DATO SI Esito="Pari" E’ divisibile per 2 ? E’ multiplo di 2 ? Il resto della divisione per 2 è zero ? NO Esito=«Dispari" 2 – ALGORITMO: ELABORAZIONE DEI DATI Dobbiamo trasformare il concetto «E’ pari ?» in una sequenza di istruzioni elementari che possiamo «umanamente» eseguire. Devo vedere se il linguaggio di programmazione utilizzato dispone di istruzioni analoghe che consentano al computer di eseguire la stessa valutazione svolta dalla persona E’ pari ? E’ divisibile per 2 ? NON ESISTE E’ multiplo di 2 ? NON ESISTE Il resto della divisione per 2 è zero ? ESISTE N % 2 == 0 13 2 – ALGORITMO: ELABORAZIONE DEI DATI Dobbiamo ora tradurre l’istruzione umana che consente di «prendere una decisione partendo da una condizione» con una istruzione equivalente nel linguaggio di programmazione scelto. ESISTE CONDIZIONE VERA if (N % 2 == 0) … else … FALSA … … Dobbiamo anche tradurre l’azione di «ricordare» il risultato del nostro ragionamento ESISTE #include <string.h> char Esito[10]; strcpy(Esito, "Pari"); 14 strcpy(Esito, "Dispari"); 3 – OUTPUT: ESPOSIZIONE DEI RISULTATI L’esposizione dei risultati corrisponde alla visualizzazione a video della soluzione. ESISTE printf("%d: %s!\n", n, Esito); C:\Laboratorio>pari Digita un numero intero:12 12: pari! INIZIO Acquisisco N E’ pari ? NO SI Soluzione=«Pari» Soluzione=«Dispari» Espongo la soluzione FINE 15 Scrivere un programma C che: - Acquisisca da tastiera numeri interi fintantoché i numeri immessi sono positivi. - Determini (stampando a video un messaggio) se i numeri immessi sono pari oppure dispari #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int n; char Esito[10]; // INPUT - Leggi Dato printf("Dammi il numero intero: "); scanf("%d",&n); // ALGORITMO - Elaboro if (n % 2 == 0) strcpy(Esito,"Pari"); else strcpy(Esito,"Dispari"); // OUTPUT - Stampa esito printf("%d: %s\n",n,Esito); system("pause"); exit(0); } Chiaramente il programma poteva essere semplificato in questo modo #include <stdio.h> #include <stdlib.h> int main() { int n; // INPUT - Leggi Dato printf("Dammi il numero intero: "); scanf("%d",&n); // ALGORITMO - OUTPUT if (n % 2 == 0) printf("%d: Pari\n",n,Esito); else printf("%d: Pari\n",n,Esito); system("pause"); exit(0); } Scrivere un programma C che: - Acquisisca da tastiera numeri interi fintantoché i numeri immessi sono positivi. - Determini (stampando a video un messaggio) se i numeri immessi sono pari oppure dispari START #include <stdio.h> #include <stdlib.h> int main() { int n; do { // INPUT printf("Dammi un numero: "); scanf("%d",&n); // ALGORITMO - OUTPUT if (n % 2 == 0) printf("%d:pari\n",n); else printf("%d:dispari\n",n); Acquisizione numero n e valutazione se pari/dispari } while (n > 0); n>0? STOP system("pause"); exit(0); }