Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea in Informatica Università degli Studi “La Sapienza” (lezioni 2 e 3) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un primo semplice programma C Vogliamo stampare una linea di testo “Il nostro primo programma C! “ Un unico passo elementare – Si scriva un programma che stampi una linea contenente “Il nostro primo programma C! “ Scrivere “il nostro Primo programma C” Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Dice all’elaboratore di svolgere una azione o compito, quello di stampare una stringa (sequenza di caratteri tra doppi apici). Quando si esegue Le parti di un programma Questa linea viene stampato in outputtra /* e */ racchiuse Il nostro primo programma rappresentano C un commento /* Questo programma stampa “il nostro” \n non viene stampato in output i commenti servono a migliorare \ è unC*/ escape character, \n la indica primo programma leggibilità del codice una andata a capo i commenti sono ignorati dal #include <stdio.h> Altre sequenze di escape riconosciute compilatore C da printf: /*la funzione main () denota l’inizio dell’esecuzione #include è una direttiva per il return indica il valore restituito \t preprocessore C. Il preprocessore del programma */ dallacampanella) funzione \a (alert-suono Ètipo invocato prima della compilazione In questo caso main() chiede che \\ (inserisce backslash) int main() Ed effettua delle programma manipolazioni sul Il main fa parte di ciascun venga restituito un valore intero \” (inserisce “) Programma che debbono essere C. Le parentesi seguono { 0 è ilgraffe valoreche di default che indica Effettuate prima compilazione main () indicano main della è un blocco che il che programma è terminato con printf(“Il nostro primo programma C \n”); (es includere parti nel file prima della di codice denominato successo funzione. Un compilazione –librerieo effettuare programma può contenere più funzioni return 0; delle quali sostituzioni ciascuna delle svolge di untesto). compito. #includepresente <stdio.h> preprocessore } Il main è sempre eddice è laalprima di includere nelfunzioni file l’header stdio.h funzione eseguita. Altre della libreria standard di input/output possono essere invocate all’interno del Prof.ssa Chiara(tale Petrioliheader -- corso di contiene ad esempio le main per svolgere dei sotto-compiti. programmazione 1, a.a. 2006/2007 funzioni standard per l’I/O) Un primo semplice programma C Esecuzione del programma (Linux/Unix) Scrivete il programma (con un editor) in un file primoprogramma.c Invocate il compilatore C gcc primoprogramma.c Questo genera un eseguibile a.out Digitando a.out viene eseguito il programma che stampa in output Il nostro primo programma C Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Fasi della compilazione primoprogramma.c Editor Invocati automaticamente da gcc primoprogramma.c Disco Preprocessore Disco Compilatore Disco a.out Linker Disco Memoria Disco Loader Inserisce .h di librerie, sostituisce MACRO, sostituisce costanti simboliche Traduce in inguaggio Macchina. Crea un codice oggetto e lo memorizza su disco Il linker inserisce nel codice oggetto il codice relativo a chiamate a libreria. Produce e memorizza su disco un eseguibile. Carica il programma in memoria … Memoria CPU Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Il programma viene scritto con un editor e salvato sul disco rigido … Il programma viene eseguito Esercizio Si scriva un programma che dati tre interi presi da input calcoli la loro somma, il loro prodotto e lo stampi in output. x1 x2 x1+x2+x3 x1*x2*x3 x3 Step0: prendi da input tre valori e memorizzali in tre variabili intere (x1,x2,x3) Step1: calcola la somma, il prodotto, e stampali in output Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un altro semplice programma Si scriva un programma che, dati tre interi, ne calcoli la somma, prodotto /* Questo programma calcola la somma, prodotto*/ #include <stdio.h> int main() { di variabili int integer1,integer2,integer3; /*interi Definizioni che devono essere inseriti da input*/ integer1, integer3 sono i int sum; /*variabile che conterra’ la somma dei treinteger2, interi) nomi didei tretre variabili int product; /*variabile che conterrà il prodotto interi*/ di tipo intero (int). } Le variabili devono essere definite printf(“Inserite il valore del primo intero \n”); prima di essere usate. Un nome di scanf (“%d”, &integer1); variabile e’ un identificatore ovvero printf(“Inserite il valore del secondo intero \n”); una serie di caratteri che consistono scanf (“%d”, &integer2); di lettere, cifre e underscore (_) che printf(“Inserite il valore del terzo intero \n”); inizi con una lettera. Solo i primi 31 scanf(“%d”, &integer3) caratteri /* calcola somma, prodotto, e stampali in output*/ di un identificatore vengono considerati. Il C e’ case sensitive (fa sum= integer1+integer2+integer3; product = integer1*integer2*integer3; differenza il fatto che le lettere siano printf (“Somma: %d \n”, sum); minuscole o maiuscole). printf (“Prodotto: %d \n”, product); E’ bene scegliere nomi significativi return 0; di variabili per un discorso di leggibilita’ del programma. Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… Definizione di variabili – Ciascuna variabile ha un nome, un tipo, un valore int integer1; ampersend o operatore di indirizzo Memoria 4357 &integer1 Indica l’indirizzo di memoria associato alla variabile integer1 … Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Vengono associate alla variabile integer1 un numero di celle di memoria consecutive, sufficienti a contenere il tipo della variabile (in questo caso un intero) Un altro semplice programma Si scriva un programma che, dati tre interi, ne calcoli la somma, prodotto /* Questo programma calcola la somma, prodotto*/ #include <stdio.h> int main() { è unaessere funzione della libreria standard int integer1,integer2,integer3; /*interi Scanf che devono inseriti da input*/ di I/O. due argomenti int sum; /*variabile che conterra’ la somma dei Ha tre interi) “%d” (stringa di controllo del formato) int product; /*variabile che conterrà il prodotto dei tre interi*/ specifica che in questo caso si deve prendere printf(“Inserite il valore del primo intero \n”); dallo standard input un valore intero scanf (“%d”,&integer1); “%d” intero printf(“Inserite il valore del secondo intero \n”); “%f”numero reale scanf (“%d”,&integer2); printf(“Inserite il valore del terzo intero \n”); &integer1 specifica che l’intero preso da scanf(“%d”,&integer3) Input deve essere memorizzato nella /* calcola somma, prodotto, e stampali in output*/ locazione di memoria associata alla sum= integer1+integer2+integer3; product = integer1*integer2*integer3; variabile integer1 printf (“Somma: %d \n”, sum); printf (“Prodotto: %d \n”, product); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… scanf (“%d”,&integer1); – viene letto da input un valore intero (supponiamo 20). Viene inserito il valore letto nella locazione di memoria (4357) associata alla variabile integer1 ampersend o operatore di indirizzo Memoria 4357 &integer1 Indica l’indirizzo di memoria associato alla variabile integer1 20 … Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Destructive read in Un altro semplice programma Si scriva un programma che, dati tre interi, ne calcoli la somma, prodotto /* Questo programma calcola la somma, prodotto*/ #include <stdio.h> int main() { int integer1,integer2,integer3; /*interi che devono essere inseriti da input*/ int sum; /*variabile che conterra’ la somma dei tre interi) int product; /*variabile che conterrà il prodotto dei tre interi*/ printf(“Inserite il valore del primo intero \n”); scanf (“%d”,&integer1); printf(“Inserite il valore del secondo intero \n”); scanf (“%d”,&integer2); printf(“Inserite il valore del terzo intero \n”); scanf(“%d”,&integer3) /* calcola somma, prodotto, e stampali in output*/ sum= integer1+integer2+integer3; product = integer1*integer2*integer3; printf (“Somma: %d \n”, sum); printf (“Prodotto: %d \n”, product); return 0; } espressione di assegnamento Valuta l’espressione a destra dell’operatore di assegnamento e ne assegna il valore alla variabile sum Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Cosa succede in memoria… sum=integer1+integer2+integer3; = è un operatore di assegnamento. Vengono presi i valori di integer1,integer2, integer3, sommati e il valore risultante è memorizzato nella locazione di memoria associata alla variabile sum Memoria integer1+integer2+integer3 Non-destructive read-out … 10 2040 35 integer3 … 3800 sum … 4357 20 integer1 … 5040 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 5 integer2 Un altro semplice programma … una variante Si scriva un programma che, dati tre interi, ne calcoli la somma, prodotto /* Questo programma calcola la somma, prodotto*/ #include <stdio.h> int main() { int integer1,integer2,integer3; /*interi che devono essere inseriti da input*/ int sum; /*variabile che conterra’ la somma dei tre interi) int product; /*variabile che conterrà il prodotto dei tre interi*/ printf(“Inserite il valore del primo intero \n”); printf può anche stampare il valore di una espressione scanf (“%d”,&integer1); printf(“Inserite il valore del secondo intero \n”);direttamente scanf (“%d”,&integer2); printf(“Inserite il valore del terzo intero \n”); scanf(“%d”,&integer3) /* calcola somma, prodotto, e stampali in output*/ printf (“Somma: %d \n”, integer1+integer2+integer3); printf (“Prodotto: %d \n”, integer1*integer2*integer3); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un altro semplice programma Si scriva un programma che, dati tre interi, ne calcoli la somma, prodotto /* Questo programma calcola la somma, prodotto*/ #include <stdio.h> int main() { int integer1,integer2,integer3; /*interi che devono essere inseriti da input*/ int sum; /*variabile che conterra’ la somma dei tre interi) int product; /*variabile che conterrà il prodotto dei tre interi*/ printf(“Inserite il valore del primo intero \n”); scanf (“%d”,&integer1); printf(“Inserite il valore del secondo intero \n”); scanf (“%d”,&integer2); printf(“Inserite il valore del terzo intero \n”); scanf(“%d”,&integer3) /* calcola somma, prodotto, e stampali in output*/ sum= integer1+integer2+integer3; product = integer1*integer2*integer3; printf (“Somma: %d \n”, sum); printf (“Prodotto: %d \n”, product); return 0; } COSA COMPARE SULLO SCHERMO Inserite il valore del primo intero 20 Inserite il valore del secondo intero 5 Inserite il valore del terzo intero 10 Somma: 35 Prodotto: 1000 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Operazioni aritmetiche in C Operazione C Operatore Aritmetico Espressione Algebrica Espressione C Addizione + f+7 f+7 Sottrazione - F-7 Moltiplicazione * AB Divisione / A/B Q:Cosa indica R mod s? F-7 A: Il resto della divisione di R per s Q:Come si può verificare A*B Se un numero x è pari? A: x % 2 == 0 A/B Uguale in C Modulo % R mod s Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 R%s Operazioni aritmetiche in C ATTENZIONE: La divizione tra interi da un valore intero (tronca Operazione C Operatore all’intero immediatamente piu’ piccolo il valore Aritmetico dell’operazione) Addizione + Es. 7/4 da 1 Es. 18/5 da 3 MA 7/4.0 da 1.75 Sottrazione Espressione Algebrica f+7 Espressione C f+7zero e’ un La divisione per Tipico motivo di fatal error (segmentation fault) - F-7 Moltiplicazione * AB A*B Divisione / A/B A/B Modulo % R mod s R % s Si applica solo ad operandi interi Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 F-7 Precedenza degli operatori aritmetici Moltiplicazioni, divisioni e modulo in una espressione sono valutati per prime da sinistra a destra (associano da sinistra a destra ed hanno precedenza rispetto ad addizione/sottrazione). Addizioni e sottrazioni vengono quindi valutate, da sinistra a destra. Es. estressione algebrica m=a+b+c+d+e 5 In C: m = (a+b+c+d+e)/5; Se non si mettessero esplicitamente le parentesi tonde m=a+b+c+d+e/5; corrisponderebbe alla espressione algebrica m=a+b+c+d+e/5 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Precedenza degli operatori aritmetici Moltiplicazioni, divisioni e modulo in una espressione sono valutati per prime da sinistra a destra (associano da sinistra a destra ed hanno precedenza rispetto ad addizione/sottrazione). Addizioni e sottrazioni vengono quindi valutate, da sinistra a destra. Es. espressione algebrica z=pr %q + w/x -y In C: z = p * r % q + w / x – y; 6 1 2 4 3 5 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 ((p*r)%q)+(w/x)-y Precedenza degli operatori aritmetici Moltiplicazioni, divisioni e modulo in una espressione sono valutati per prime da sinistra a destra (associano da sinistra a destra ed hanno precedenza rispetto ad addizione/sottrazione). Addizioni e sottrazioni vengono quindi valutate, da sinistra a destra. Es. In C: y = a * x * x + b * c + c; 6 1 2 4 3 5 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 ((a*x)*x)+(b*c)+c Precedenza degli operatori aritmetici Es. 6 1 2 4 3 5 In C: y = a * x * x + b * x + c; Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 CASO a= 2, b=3, c=7, x=5 Un altro semplice programma Si scriva un programma che, dato il valore del raggio r, calcoli la lunghezza della circonferenza e l’area del cerchio di raggio r Direttiva per eil area preprocessore. /* Questo programma calcola circonferenza di un cerchio*/ Definisce una costante simbolica. #include <stdio.h> Il preprocessore sostituira’ #define PI 3.14159 automaticamente ogni int main() occorrenza nel testo di PI { con 3.14159 float r; float circonferenza; float area; /*inserisce in una variabile r il valore del raggio del cerchio */ printf(“Inserire il valore del raggio \n”); scanf (“%f”,&r); Indica un tipo numero /* calcola circonferenza e area e le stampa in output*/ reale circonferenza= 2* PI * r; area = PI*r*r; printf (“Il valore della circonferenza e’ %f \n”, circonferenza); printf (“Il valore dell’area del cerchio e’ %f \n”, area); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che dati tre interi presi da input calcoli la loro somma, il loro prodotto, il massimo ed il minimo dei tre valori e lo stampi in output. x1 x1+x2+x3 x1*x2*x3 x2 x3 min(x1,x2,x3) Occorre poter confrontare Valori e prendere decisioni max(x1,x2,x3) operatori relazionali costrutto if Step0: prendi da input tre valori e memorizzali in tre variabili intere (x1,x2,x3) Step1: calcola la somma, il prodotto, il minimo, il massimo di tre valori e stampali in output Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Una digressione –programmazione strutturata Un algoritmo è una sequenza di passi elementari che devono essere eseguiti, in un determinato ordine, per risolvere un problema. Specificare l’ordine in cui le istruzioni sono eseguite in un programma è chiamato controllo del programma. Un buon algoritmo per preparsi ad andare al lavoro… – – – – – – Alzarsi dal letto Svestirsi, togliendosi il pigiama Farsi una doccia Vestirsi Fare colazione Guidare fino al posto di lavoro Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 PASSI Elementari E SE CAMBIAMISSIMO L’ORDINE IN CUI QUESTI PASSI SONO ESEGUITI? Una digressione –programmazione strutturata Un algoritmo è una sequenza di passi elementari che devono essere eseguiti, in un determinato ordine, per risolvere un problema. Specificare l’ordine in cui le istruzioni sono eseguite in un programma è chiamato controllo del programma. Un buon algoritmo per preparsi ad andare al lavoro… – – – – – – Alzarsi dal letto Alzarsi dal letto Svestirsi,togliendosi togliendosi il pigiama Svestirsi, il pigiama Farsi una Vestirsi doccia Farsi una doccia Vestirsi Fare colazione Fare colazione Guidare fino al posto di lavoro Guidare fino al posto di lavoro Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 PASSI Elementari E SE CAMBIAMISSIMO L’ORDINE IN CUI QUESTI PASSI SONO ESEGUITI? Programmazione strutturata Normalmente le istruzioni di un programma sono eseguite una di seguito all’altra nell’ordine in cui sono scritte (esecuzione sequenziale) Si scriva un programma che, dati tre interi, ne calcoli la somma, prodotto /* Questo programma calcola la somma, prodotto*/ #include <stdio.h> int main() { int integer1,integer2,integer3; /*interi che devono essere inseriti da input*/ int sum; /*variabile che conterra’ la somma dei tre interi) int product; /*variabile che conterrà il prodotto dei tre interi*/ printf(“Inserite il valore del primo intero \n”); scanf (“%d”,&integer1); printf(“Inserite il valore del secondo intero \n”); scanf (“%d”,&integer2); printf(“Inserite il valore del terzo intero \n”); scanf(“%d”,&integer3) /* calcola somma, prodotto, e stampali in output*/ sum= integer1+integer2+integer3; product = integer1*integer2*integer3; printf (“Somma: %d \n”, sum); printf (“Prodotto: %d \n”, product); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Programmazione strutturata Alcuni costrutti del C consentono al programmatore di specificare che la prossima istruzione da eseguire sia diversa dall’istruzione successiva (trasferimento di controllo) Si scriva un programma che, dati tre interi, ne calcoli la somma, prodotto /* Questo programma calcola la somma, prodotto*/ #include <stdio.h> int main() { int integer1,integer2,integer3; /*interi che devono essere inseriti da input*/ int sum; /*variabile che conterra’ la somma dei tre interi) int product; /*variabile che conterrà il prodotto dei tre interi*/ printf(“Inserite il valore del primo intero \n”); scanf (“%d”,&integer1); printf(“Inserite il valore del secondo intero \n”); scanf (“%d”,&integer2); printf(“Inserite il valore del terzo intero \n”); scanf(“%d”,&integer3) /* calcola somma, prodotto, e stampali in output*/ sum= integer1+integer2+integer3; product = integer1*integer2*integer3; printf (“Somma: %d \n”, sum); printf (“Prodotto: %d \n”, product); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Programmazione strutturata Negli anni ’60 l’uso indiscriminato del trasferimento di controllo (ed in particolare del costrutto GOTO) venne identificato come causa di motivo di eccessiva complessita’ nella progettazione e gestione del SW Bohm e Jacopini (“Flow Diagrams, Turing Machines and Languages with Only two Formations Rules, Communications dell’ACM 1966”) mostrarono come si potesse evitare di usare il GOTO, cosa che porto’ ad una forte riduzione dei tempi di sviluppo del SW. – Tutti i programmi possono essere scritti solo in termini di tre tipi di strutture di controllo La struttura di sequenza ( a meno di indicazioni diverse in C l’esecuzione delle istruzioni e’ sequenziale) La struttura di selezione (if, if…else, switch) La struttura di ripetizione (costrutti iterativi while, do…while, for) – Ciascun programma può essere scritto combinando costrutti di controllo di sequenza, selezione o ripetizione uno di seguito all’altro o annidati uno dentro l’altro Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Costrutto if Viene analizzata la condizione if (condizione) Del costrutto if. Se tale condizione BLOCCO DI CODICE; e’ vera viene eseguito il blocco di codice che segue l’if, altrimenti questo blocco viene saltato VERA condizione BLOCCO DI CODICE FALSA Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Operatori relazionali in C Operatori di uguaglianza algebrici o operatori relazionali Operatori di uguaglianza o op. relazionali in C Es. di condizione in C Significato della condizione C Gli operatori relazionali hanno tutti lo stello livello di precedenza e associano da sinistra a destra Gli operatori di uguaglianza hanno un livello di precedenza minore ed associano da sinistra a destra ATTENZIONE, errore tipico: scrivere l’operatore di uguaglianza come = Prof.ssa Chiara Petrioli -- corso di if (a=5) printf(“il valore di a e’ 5 \n”); programmazione 1, a.a. 2006/2007 Cosa succede nel caso di questo errore quando a vale 7? Massimo e minimo di tre numeri… Si scriva un programma che, dati tre interi, ne calcoli la somma, prodotto, minimo e massimo /* Questo programma calcola la somma, prodotto, massimo e minimo di tre interi*/ #include <stdio.h> int main() { int integer1,integer2,integer3; /*interi che devono essere inseriti da input*/ int sum; /*variabile che conterra’ la somma dei tre interi) int product; /*variabile che conterrà il prodotto dei tre interi*/ int min; /*variabile che conterrà il minimo dei tre interi */ int max; /*variabile che conterrà il massimo dei tre interi */ /*prende da input i tre interi */ printf(“Inserite il valore del primo intero \n”); scanf (&integer1); printf(“Inserite il valore del secondo intero \n”); scanf (&integer2); printf(“Inserite il valore del terzo intero \n”); scanf(&interegr3) /* calcola somma, prodotto, e stampali in output*/ sum= integer1+integer2+integer3; product = integer1*integer2*integer3; printf (“Somma: %d \n”, sum); printf (“Prodotto: %d \n”, product); Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Massimo e minimo di tre numeri… min=integer1; Se integer2 è piu’ piccolo di integer1 if (integer2 < integer 1) Allora sicuramente integer1 non e’ min=integer2; Il piu’ piccolo dei tre numeri if (integer3 < min) min=integer3; In min e’ contenuto il minimo dei tre printf (“Il minimo dei tre valori e’ %d \n”, min); numeri max=integer1; if (integer2 > integer 1) max=integer2; if (integer3 > max) max=integer3; printf (“Il massimo dei tre valori e’ %d \n”, max); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che legga da input un intero e scriva in output se il numero e’ pari o dispari /* Questo programma verifica se un numero e’ pari*/ #include <stdio.h> int main() { int integer1; /*intero che deve essere inserito da input*/ printf(“Inserite il valore del primo intero \n”); scanf (“%d”,&integer1); if (integer1 %2 == 0) printf (“il numero e’ pari \n”); else printf (“il numero e’ dispari \n”); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Costrutto if…else if (condizione) BLOCCO DI CODICE 1; else BLOCCO DI CODICE 2; Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Construtto if …else VERA condizione Viene analizzata la condizione Del costrutto if. Se tale condizione e’ vera viene eseguito il primo blocco di codice che segue l’if, altrimenti viene eseguito il blocco di codice che Segue l’else BLOCCO DI CODICE 1 FALSA BLOCCO DI CODICE 2 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio (soluzione alternativa) Si scriva un programma che legga da input un intero e scriva in output se il numero e’ pari o dispari /* Questo programma verifica se un numero e’ pari*/ #include <stdio.h> int main() Se un’espressione assume valori Diversi da zero TRUE { int integer1 /*intero che deve essere inserito input*/ Se assume valore ugualeda a zero printf(“Inserite il valore del primo intero \n”); FALSE scanf (“%d”,&integer1); if (integer1 % 2) printf (“il numero e’ dispari \n”); else printf (“il numero e’ pari \n”); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che legga da input il voto preso da uno studente nell’esame di prog1 e stampi se lo studente ha passato o meno l’esame /* Questo programma verifica se uno studente ha passato l’esame*/ #include <stdio.h> int main() { int voto; /*voto che deve essere inserito da input*/ printf(“Inserite il valore del vostro voto \n”); scanf (“%d”,&voto); if (voto < 18) { printf (“l’esame NON e’ stato superato \n”); printf (“l’esame deve essere ripetuto \n”); } else printf (“l’esame e’ stato superato \n”); return 0; Prof.ssa Chiara Petrioli -- corso di } programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che legga da input una temperatura e scriva una indicazione sul periodo in cui quella temperatura e’ tipica #include <stdio.h> int main() { float temperatura; printf(“Inserite il valore della temperatura \n”); scanf (“%f”,&temperatura); if (temperatura < 15.0) printf (“temperatura tipicamente invernale \n”); else { if (temperatura <25.0) printf (“temperatura tipicamente autunnale o primaverile \n”); else printf (“temperatura tipicamente estiva \n”); } return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Precedenza degli operatori (riepilogo) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Keyword riservate Identificatori che non possono essere usati in un programma (essendo parole chiave riservate) Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Costrutto while FALSA ATTENZIONE: è importante che la condizione in un tempo finito vada a false. Altrimenti non si Esce mai dal ciclo (loop infinito) condizione VERA BLOCCO DI CODICE Viene analizzata la condizione Del costrutto while. Se tale condizione e’ vera viene eseguito il blocco di codice che segue il while e viene quindi testata nuovamente la condizione. Quando la condizione viene trovata falsa il blocco che segue il while viene saltato (si dice che si esce dal while) E viene eseguita la prima istruzione Prof.ssa Chiara Petrioli -- corso di che segue. programmazione 1, a.a. 2006/2007 Esempio Si scriva un programma che calcola la più piccola potenza di 3 maggiore di un valore intero soglia x inserito da input #include <stdio.h> int main() La variabile intera potenza viene definita e { contemporaneamente int x; inizializzata a 1 int potenza = 1; anche scrivere printf(“Inserite il valore sogliaSixpuò \n”); potenza *= 3; scanf (“%d”,&x); while (potenza <= x) In generale potenza=potenza*3; variabile = variabile operando espressione; printf (“potenza 3 > più x: concisamente %d”, potenza); Può esserediscritto con variabile return 0; operando= espressione; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esempio Vediamo cosa succede se x=10 #include <stdio.h> int main() { int x; x=10 potenza=27 int potenza = 1; la condizione e’ FALSA prima iterazione: x=10 2a iterazione: x=10 sipotenza=1 esce ciclo. x=10 Si esegue printf(“Inserite il valore soglia xdal\n”); 3a iterazione: potenza=3 la stampa del valore trovato la condizione e’ VERA potenza=9 scanf (“%d”,&x); lailcondizione e’termina. VERA ed programma si la entra nel cicloe’ eVERA si condizione si entra nel ciclo e si while (potenza <= x) aggiorna valore si entrailnel ciclodie si aggiorna il valore di potenza cheilviene aggiorna valoremesso di potenza=potenza*3; apotenza che viene messo 3potenza che viene messo a9 printf (“potenza di 3 > x: %d”, a 27potenza); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Una variante… Supponiamo di voler stampare tutte le potenze di 3 minori o uguali ad un valore x inserito da input #include <stdio.h> int main() { int x; int potenza = 1; printf(“Inserite il valore soglia xRISPOSTA: \n”); Avrei un ciclo infinito scanf (“%d”,&x); while (potenza <= x) { printf (“%d \n”, potenza); potenza=potenza*3; Q: cosa succederebbe se mi dimenticassi di aggiornare il valore di potenza nel ciclo? } return 0; Prof.ssa Chiara Petrioli -- corso di } programmazione 1, a.a. 2006/2007 Costrutto while Costrutto di ripetizione Consente al programmatore di specificare che una certa azione deve essere ripetuta fino a quando rimane valida una determianta condizione while (condizione) BLOCCO DI CODICE; Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 SINTASSI Esercizio Si calcoli l’età media di una classe di 30 alunni Pseudocodice – Setta la variabile totale a 0 – Setta la variabile contatore a 1 (contatore conta il numero di alunni finora considerati) – Fino a quando il contatore ha un valore <= 30 (numero di alunni) Inserisci da input l’età del prossimo alunno Somma tale valore a totale Importante (il perche’ dopo) Somma uno a contatore – Poni la variabile media pari a totale/contatore – Stampa il valore della variabile media Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> int main() { int totale = 0; int temp; int contatore =1; float media; while (contatore <= 30) { printf (“inserisci l’età dell’ %d esimo alunno \n”, contatore); scanf (“%d”, &temp); Corrisponde a totale += temp; contatore =contatore +1; contatore ++; } media = (float) totale /(contatore-1); printf (“l’età media della classe è: %f \n”, media); return 0; Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 } Osservazione sul casting… #include <stdio.h> int main() { int totale COSA = 0; SUCCEDEREBBE SE ELIMINASSIMO (float)? int temp; Il risultato della divisione di totale e contatore verrebbe int contatore =1; troncato ad un intero perche’ entrambe le variabili sono intere sbagliato! float media; L’operatore unario di cast (float) produce una copia while (contatore <= 30) reale temporanea della variabile totale (conversione { esplicita). La divisione di un float ed un intero da un printf (“inserisci l’età dell’ %d esimoimplicita alunno o\n”, float (viene effettuata una conversione una contatore); promozione dell’intero in float accade sempre scanf (“%d”, &temp); nel caso di operandi di tipo diverso) . totale += temp; L’operatore di cast ha precedenza maggiore rispetto contatore ++; agli operatori * / % } media = (float) totale /contatore; printf (“l’età media della classe è: %f \n”, media); return 0; Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione alternativa #include <stdio.h> In questo caso abbiamo #define NUM_ALUNNI 30 usato una costante int main() simbolica. Se vogliamo { rieseguire il programma int totale = 0; per una classe di 50 int temp; alunni, sara’ sufficiente int contatore =1; cambiare il valore della float media; costante simbolica while (contatore <= NUM_ALUNNI) Inoltre la costante { simbolica e’ molto piu’ printf (“inserisci l’età dell’ %d esimo alunno \n”, espressiva (leggibilita’ contatore); del codice) scanf (“%d”, &temp); totale += temp; contatore ++; } Contatore non può mai essere 0 media = (float) totale /contatore; printf (“l’età media della classe è: %f \n”, media); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Alcune domande… #include <stdio.h> DOMANDA: COSA #define NUM_ALUNNI 30 SUCCEDEREBBE SE NEL int main() CICLO MI DIMENTICASSI { DI INCREMENTARE IL int totale = 0; CONTATORE? int temp; int contatore =1; float media; while (contatore <= NUM_ALUNNI) { printf (“inserisci l’età dell’ %d esimo alunno \n”, RISPOSTA: contatore); LOOP INFINITO scanf (“%d”, &temp); SE ENTRO totale += temp; NEL CICLO contatore ++; } media = (float) totale /contatore; printf (“l’età media della classe è: %f \n”, media); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Alcune domande… #include <stdio.h> DOMANDA: COSA #define NUM_ALUNNI 30 SUCCEDEREBBE SE NON int main() INIZIALIZZASSI { totale o int totale = 0; contatore int temp; ? int contatore =1; Ripetizione definita float media; (il numero di iterazioni è while (contatore <= NUM_ALUNNI) noto a priori, prima che si { cominci ad eseguire il ciclo) printf (“inserisci l’età dell’ %d esimo alunno \n”, contatore); scanf (“%d”, &temp); totale += temp; contatore ++; } media = (float) totale /contatore; printf (“l’età media della classe è: %f \n”, media); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Risposta #include <stdio.h> … int main() { int totale = 0; int temp; int contatore =1; …. } 2040 Quando definiamo una variabile le viene associata una locazione di memoria. Se la variabile viene 3800 usata prima che sia inizializzata con un valore opportuno 4357 conterrà l’ultimo valore che era stato memorizzato in quella locazione di memoria 5040 … 17534 totale GRAVE ERRORE !! … ESECUZIONI DIVERSE DEL PROGRAMMA ASSOCIERANNO ALLE VARIABILI sum LOCAZIONI DIVERSE E PRODURRANNO RISULTATI OGNI VOLTA DIVERSI A … SECONDA DEL VALORE INIZIALMENTE contatore 320 CONTENUTO NELLA LOCAZIONI … DI MEMORIA ASSOCIATA ALLA VARIABILE! Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 5 temp Esercizio Si scriva un programma che calcola la temperatura media di un mese Variante di prima.. – Mesi diversi hanno un numero diverso di giorni e quindi un numero diverso di valori da inserire da input – Come risolviamo questo problema? Una soluzione è quella di usare una costante simbolica NUM_GIORNI (ogni volta che eseguiamo il programma prima di eseguirlo dobbiamo conoscere il numero di giorni e settare la costante simbolica…) FORTUNATAMENTE esistono soluzioni più semplici ed efficaci che non richiedono di conoscere il numero di valori da prendere da input prima dell’esecuzione del programma – METODO A: Utilizzo di un valore sentinella – METODO B: inserimento da input del numero di giorni. Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Utilizzo di un valore sentinella Assunzione e limite Se ci sono dei valori che la variabile contatore non assume mai uno di tali valori può essere usato per segnalare che si è arrivati alla fine della serie di valori da inserire da input – Es. media dei voti degli esami (0…30). Il valore -1 può essere scelto come valore sentinella quando l’utente da input inserisce -1 significa che la serie di voti da inserire e’ terminata – Es. media delle temperature di un mese: la temperatura di un mese non potrà mai arrivare a migliaia di gradi. 1000 potrebbe essere scelto come valore sentinella… Ripetizione indefinita: il numero diChiara iterazioni chediverranno eseguite NON è noto Prof.ssa Petrioli -- corso programmazione 1, a.a. 2006/2007 prima di entrare nel ciclo. Soluzione con utilizzo di un valore sentinella Pseudocodice – Setta la variabile totale a 0 – Setta la variabile contatore a 1 – Inserisci il primo valore di temperatura – Fino a quando non viene inserito da input il valore sentinella Somma il valore corrente di temperatura a totale Somma uno a contatore Inserisci il prossimo valore di temperatura (o il valore sentinella se sono stati tutti inseriti) – Poni la variabile media pari a totale/contatore – Stampa il valore della variabile media Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione con utilizzo di un valore sentinella I float sono sempre rappresentati in modo approssimato. Attenzione! potrebbe essere critico verificare #include <stdio.h> seint due float sono uguali … main() { float temperatura; float totale=0.0; int contatore = 1; float media; printf (“inserisci primo valore della temperatura, valore intero >=1000 per terminare \n”); scanf(“%f”, &temperatura); while (temperatura < 1000) { totale += temperatura; Il valore soglia contatore++; printf (“inserisci valore della temperatura, deve essere specificato valore intero >=1000 per terminare \n”); all’utente scanf(“%f”, &temperatura); } if (contatore > 1) { media = totale /(contatore-1); printf (“la temperatura media del mese è: %f \n”, media); } return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Inserimento da input del numero di iterazioni Ripetizione definita (prima dell’entrata nel ciclo si conosce il numero di iterazioni da effettuare) Tale valore non ha tuttavia bisogno di essere scritto in una costante simbolica. Viene inserito in una variabile da input. Può variare (senza toccare il codice) ad ogni esecuzione del programma (ad esempio a seconda del numero di giorni del particolare mese di cui si vuole conoscere la temperatura media). Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Inserimento da input del numero di iterazioni #include <stdio.h> int main() { float temperatura; float totale=0.0; int i; int contatore; /*non ho bisogno di inizializzare la variabile, il valore verra’ preso da input */ float media; printf (“inserisci numero di campioni della temperatura \n”); scanf(“%d”, &contatore); i=contatore; while (i > 0) o equivalentemente { i--;della temperatura \n”); printf (“inserisci primo valore scanf(“%f”, &temperatura); totale += temperatura; i= i -1; } if (contatore != 0) { media = totale /contatore; printf (“la temperatura media del mese è: %f \n”, media); } return 0; Prof.ssa Chiara Petrioli -- corso di } programmazione 1, a.a. 2006/2007 Operatori di incremento e decremento Operatore Spiegazione ++ Espressione di esempio ++a ++ a++ Usa il valore di a nell’espressione, quindi incrementa a di 1 -- --b Decrementa b di 1 e usa il valore risultante nell’espressione in cui compare questo termine -- b-- Usa il valore di b nell’espressione, quindi decrementa b di 1 Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Incrementa a di 1 e usa il valore risultante nell’espressione in cui compare questo termine Alcuni esempi #include <stdio.h> int main() { int c; c=5; printf(“%d\n”,c); printf(“%d\n”,c++); printf(“%d\n\n”,c); c=5; printf(“%d\n”,c); printf(“%d\n”,++c); printf(“%d\n\n”,c); 5 5 6 5 6 6 return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Precedenza degli operatori (sintesi) Operatori unari +, - Operatori ++ -- + - (type) */% +< <= > == != >= ?: = += -= *= /= %= Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Una persona ha tenuto traccia dei pieni di gasolio fatti con la sua automobile, e del numero di chilometri fatti con ciascun pieno. Vuole ora scrivere un programma che gli consenta di calcolare e stampare, Numero di iterazioni: 3 Si inseriscano i numeri di di litri carburante, usati: 12.8 per ciascun rifornimento i Si inserisca il numero di chilometri: 287 Km/litro per questo sono:22.42 chilometri I per litro fatti pieno dall’automobile. Il Si inseriscano i numeri di litri usati: 10.3 programma stamperà la 200 media di Si inserisca il numeroquindi di chilometri: Km/litro per questo pieno sono:19.41 chilometri ISiper litro nel periodo monitorato. inseriscano i numeri di litri usati: 5 ? Si inserisca il numero di chilometri: 120 I Km/litro per questo pieno sono:24 Prof.ssa Chiara Petrioli -- corso di La media sull’intero programmazione 1, a.a.periodo 2006/2007 e’: 21.6 Soluzione Pseudocodice – Inserisci il numero di valori da inserire – Inizializza a 0 due variabili reali tot_chilometri e tot_litri – Fino a quando non sono stati considerati tutti i dati prendi da input il numero di chilometri effettuati durante il periodo considerato (memorizza tale valore nella variabile chilometri) prendi da input il numero di litri di carburante acquistati nel periodo considerato (memorizza tale valore nella variabile litri) stampa il numero di chilometri per litro effettuati nel periodo considerato somma chilometri alla variabile tot_chilometri (numero di chilometri finora esaminati) somma carburante alla variabile tot_litri – Stampa la media di consumo per litro durante l’intero intervallo di osservazione Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> int main() { float tot_chilometri=0.0 ; float tot_litri=0.0 int contatore; int i; float chilometri, litri; printf (“inserisci numero di campioni \n”); scanf(“%d”, &contatore); i=contatore; while (i > 0) /*alcuni valori ancora da considerare */ { printf (“inserisci valore chilometri \n”); scanf(“%f”, &chilometri); printf (“inserisci numero di litri di carburante \n”); scanf(“%f”, &litri); if (litri !=0) print (“il numero di Km/litro per questo pieno e’: %f \n”, chilometri/litri); else printf(“nessun litro in questo pieno \n”); tot_chilometri += chilometri; tot_litri +=litri; i= i -1; } if (tot_litri !=0.0) printf (“la media del numero di Km/litro sull’intero periodo è: %f \n”,tot_chilometri/tot_litri ); else printf(“nessun valore valido inserito \n”); return 0; Prof.ssa Chiara Petrioli -- corso di } programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> int main() { float tot_chilometri=0.0 ; float tot_litri=0.0 float chilometri, litri; printf (“inserisci valore chilometri \n”); scanf(“%f”, &chilometri); printf (“inserisci numero di litri di carburante, valore sentinella 0 \n”); scanf(“%f”, &litri); while (litri > 0.0) /*alcuni valori ancora da considerare */ { print (“il numero di Km/litro per questo pieno e’: %f \n”, chilometri/litri); tot_chilometri += chilometri; tot_litri +=litri; printf (“inserisci valore chilometri \n”); scanf(“%f”, &chilometri); printf (“inserisci numero di litri di carburante \n”); scanf(“%f”, &litri); } if (tot_litri !=0.0) printf (“la media del numero di Km/litro sull’intero periodo è: %f \n”,tot_chilometri/tot_litri ); return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva da input un programma che prenda da input una serie di temperature Farenheit e ne calcoli (e stampi) il corrispettivo in gradi Celsius. Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione Tc = (5/9)*(Tf-32); – Tc = temperatura in gradi Celsius ,Tf = temperatura in gradi Fahrenheit #include <stdio.h> int main() { float temperatura; printf (“inserisci un valore di temperatura (se serie completata -1000) \n”); scanf(“%d”, &temperatura); while (temperatura > -1000) /*alcuni valori ancora da considerare */ { printf (“valore temperatura %f F in gradi Celsius: %f \n”, temperatura, (5/9)* (temperatura -32)); printf (“inserisci un valore di temperatura (se serie completata -1000) \n”); scanf(“%d”, &temperatura); } return 0; } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si scriva un programma che legga un valore del lato di un quadrato (numero intero x) e quindi stampi in output un quadrato costituito da x*x asterischi. Es. se x=5 ***** Se x=3 ***** *** ***** *** ***** *** ***** Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> int main() { int i,j =0; int righe; printf (“inserisci il numero di righe della figura \n”); scanf(“%d”, &righe); while (i<righe) Cicli annidati { while (j < righe) { printf (“*”); j++; } printf(“\n”); j=0; i++; } } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Esercizio Si modifichi il programma precedente in modo da stampare la seguente figura geometrica: Es. se x=5 ***** Se x=3 ***** *** ***** *** *** ***** ***** Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include <stdio.h> Int main() { int i,j =0; int righe; printf (“inserisci il numero di righe della figura \n”); scanf(“%d”, &righe); while (i<righe) { if (i%2) printf(“ ”); Costrutti annidamento while (j < righe) In { sequenza printf (“* ”); j++; } printf(“\n”); j=0; i++; } } Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007