Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoVegliantino Gigli Modificato 11 anni fa
1
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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)
2
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! 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! – Si scriva un programma che stampi una linea contenente Il nostro primo programma C! Scrivere il nostro Primo programma C
3
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un primo semplice programma C /* Questo programma stampa il nostro /* Questo programma stampa il nostro primo programma C*/ #include #include /*la funzione main () denota linizio dellesecuzione del programma */ int main() { printf(Il nostro primo programma C \n); return 0; } Le parti di un programma racchiuse tra /* e */ rappresentano un commento i commenti servono a migliorare la leggibilità del codice i commenti sono ignorati dal compilatore C #include è una direttiva per il preprocessore C. Il preprocessore È invocato prima della compilazione Ed effettua delle manipolazioni sul Programma che debbono essere Effettuate prima della compilazione (es includere parti nel file prima della compilazione –librerie- o effettuare delle sostituzioni di testo). #include dice al preprocessore di includere nel file lheader stdio.h della libreria standard di input/output (tale header contiene ad esempio le funzioni standard per lI/O) Il main fa parte di ciascun programma C. Le parentesi graffe che seguono main () indicano che main è un blocco di codice denominato funzione. Un programma può contenere più funzioni ciascuna delle quali svolge un compito. Il main è sempre presente ed è la prima funzione eseguita. Altre funzioni possono essere invocate allinterno del main per svolgere dei sotto-compiti. return indica il valore restituito dalla funzione In questo caso main() chiede che venga restituito un valore intero 0 è il valore di default che indica che il programma è terminato con successo Dice allelaboratore di svolgere una azione o compito, quello di stampare una stringa (sequenza di caratteri tra doppi apici). Quando si esegue Questa linea viene stampato in output Il nostro primo programma C \n non viene stampato in output \ è un escape character, \n indica una andata a capo Altre sequenze di escape riconosciute da printf: \t \a (alert-suono tipo campanella) \\ (inserisce backslash) \ (inserisce )
4
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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 Questo genera un eseguibile a.out Digitando a.out viene eseguito il programma che stampa in output Digitando a.out viene eseguito il programma che stampa in output Il nostro primo programma C
5
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Fasi della compilazione Editor Disco …… Memoria Disco Il programma viene scritto con un editor e salvato sul disco rigido Preprocessore Inserisce.h di librerie, sostituisce MACRO, sostituisce costanti simboliche Compilatore Traduce in inguaggio Macchina. Crea un codice oggetto e lo memorizza su disco Linker Il linker inserisce nel codice oggetto il codice relativo a chiamate a libreria. Produce e memorizza su disco un eseguibile. a.out primoprogramma.c Invocati automaticamente da gcc primoprogramma.c Loader CPU Carica il programma in memoria Il programma viene eseguito DEBUGGING
6
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esercizio 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 x3 x1+x2+x3 x1*x2*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
7
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*/ /* Questo programma calcola la somma, prodotto*/ #include #include 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; } Definizioni di variabili integer1, integer2, integer3 sono i nomi di tre variabili di tipo intero (int). Le variabili devono essere definite prima di essere usate. Un nome di variabile e un identificatore ovvero una serie di caratteri che consistono di lettere, cifre e underscore (_) che inizi con una lettera. Solo i primi 31 caratteri di un identificatore vengono considerati. Il C e case sensitive (fa differenza il fatto che le lettere siano minuscole o maiuscole). E bene scegliere nomi significativi di variabili per un discorso di leggibilita del programma.
8
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; int integer1; … Memoria Vengono associate alla variabile integer1 un numero di celle di memoria consecutive, sufficienti a contenere il tipo della variabile (in questo caso un intero) &integer1 Indica lindirizzo di memoria associato alla variabile integer1 ampersend o operatore di indirizzo 4357
9
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*/ /* Questo programma calcola la somma, prodotto*/ #include #include 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; } Scanf è una funzione della libreria standard di I/O. Ha due argomenti %d (stringa di controllo del formato) specifica che in questo caso si deve prendere dallo standard input un valore intero %d intero %f numero reale &integer1 specifica che lintero preso da Input deve essere memorizzato nella locazione di memoria associata alla variabile integer1
10
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 … Memoria 20 &integer1 Indica lindirizzo di memoria associato alla variabile integer1 ampersend o operatore di indirizzo 4357 Destructive read in
11
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*/ /* Questo programma calcola la somma, prodotto*/ #include #include 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 lespressione a destra delloperatore di assegnamento e ne assegna il valore alla variabile sum
12
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 … 10 4357 integer3 … … 20 … 5 integer1 integer2 sum 2040 3800 5040 integer1+integer2+integer3 35 Non-destructive read-out
13
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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*/ /* Questo programma calcola la somma, prodotto*/ #include #include 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*/ printf (Somma: %d \n, integer1+integer2+integer3); printf (Prodotto: %d \n, integer1*integer2*integer3); return 0; } printf può anche stampare il valore di una espressione direttamente
14
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*/ /* Questo programma calcola la somma, prodotto*/ #include #include 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; } 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 COSA COMPARE SULLO SCHERMO
15
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+7f+7 Sottrazione-F-7F-7 Moltiplicazione*ABA*B Divisione/ A / B Modulo% R mod s R % s Q:Cosa indica R mod s? A: Il resto della divisione di R per s Q:Come si può verificare Se un numero x è pari? A: x % 2 == 0 Uguale in C
16
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+7f+7 Sottrazione-F-7F-7 Moltiplicazione*ABA*B Divisione/ A / B Modulo% R mod s R % s ATTENZIONE: La divizione tra interi da un valore intero (tronca allintero immediatamente piu piccolo il valore delloperazione) Es. 7/4 da 1 Es. 18/5 da 3 MA 7/4.0 da 1.75 La divisione per zero e un Tipico motivo di fatal error (segmentation fault) Si applica solo ad operandi interi
17
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. estressione algebrica m=a+b+c+d+e 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
18
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 Es. espressione algebrica z=pr %q + w/x -y In C:z = p * r % q + w / x – y; 123456 ((p*r)%q)+(w/x)-y
19
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. Es. In C:y = a * x * x + b * c + c; 123456 ((a*x)*x)+(b*c)+c
20
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Precedenza degli operatori aritmetici Es. In C:y = a * x * x + b * x + c; 123456 CASO a= 2, b=3, c=7, x=5
21
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Un altro semplice programma Si scriva un programma che, dato il valore del raggio r, calcoli la lunghezza della circonferenza e larea del cerchio di raggio r /* Questo programma calcola circonferenza e area di un cerchio*/ /* Questo programma calcola circonferenza e area di un cerchio*/ #include #include #define PI 3.14159 int main() { 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); /* calcola circonferenza e area e le stampa in output*/ circonferenza= 2* PI * r; area = PI*r*r; printf (Il valore della circonferenza e %f \n, circonferenza); printf (Il valore dellarea del cerchio e %f \n, area); return 0; } Direttiva per il preprocessore. Definisce una costante simbolica. Il preprocessore sostituira automaticamente ogni occorrenza nel testo di PI con 3.14159 Indica un tipo numero reale
22
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esercizio 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 x2 x3 x1+x2+x3 x1*x2*x3 min(x1,x2,x3) max(x1,x2,x3) 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 Occorre poter confrontare Valori e prendere decisioni operatori relazionali costrutto if
23
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 lordine in cui le istruzioni sono eseguite in un programma è chiamato controllo del programma. Un buon algoritmo per preparsi ad andare al lavoro… 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 PASSI Elementari E SE CAMBIAMISSIMO LORDINE IN CUI QUESTI PASSI SONO ESEGUITI?
24
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 lordine in cui le istruzioni sono eseguite in un programma è chiamato controllo del programma. Un buon algoritmo per preparsi ad andare al lavoro… 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 PASSI Elementari E SE CAMBIAMISSIMO LORDINE IN CUI QUESTI PASSI SONO ESEGUITI? Alzarsi dal letto Svestirsi, togliendosi il pigiama Svestirsi, togliendosi il pigiamaVestirsi Farsi una doccia Fare colazione Fare colazione Guidare fino al posto di lavoro Guidare fino al posto di lavoro
25
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Programmazione strutturata Normalmente le istruzioni di un programma sono eseguite una di seguito allaltra nellordine 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*/ /* Questo programma calcola la somma, prodotto*/ #include #include 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; }
26
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 dallistruzione successiva (trasferimento di controllo) Si scriva un programma che, dati tre interi, ne calcoli la somma, prodotto /* Questo programma calcola la somma, prodotto*/ /* Questo programma calcola la somma, prodotto*/ #include #include 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; }
27
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Programmazione strutturata Negli anni 60 luso 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 dellACM 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 lesecuzione delle istruzioni e sequenziale) La struttura di sequenza ( a meno di indicazioni diverse in C lesecuzione 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 allaltro uno di seguito allaltro o annidati uno dentro laltro
28
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Costrutto if if (condizione) BLOCCO DI CODICE; condizione VERA BLOCCO DI CODICE FALSA Viene analizzata la condizione Del costrutto if. Se tale condizione e vera viene eseguito il blocco di codice che segue lif, altrimenti questo blocco viene saltato
29
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 loperatore di uguaglianza come = if (a=5) printf(il valore di a e 5 \n); Cosa succede nel caso di questo errore quando a vale 7?
30
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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*/ /* Questo programma calcola la somma, prodotto, massimo e minimo di tre interi*/ #include #include 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);
31
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Massimo e minimo di tre numeri… min=integer1; if (integer2 < integer 1) min=integer2; if (integer3 < min) min=integer3; printf (Il minimo dei tre valori e %d \n, min); 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; } Se integer2 è piu piccolo di integer1 Allora sicuramente integer1 non e Il piu piccolo dei tre numeri In min e contenuto il minimo dei tre numeri
32
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 #include 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; }
33
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;
34
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Construtto if …else condizione VERA BLOCCO DI CODICE 1 FALSA BLOCCO DI CODICE 2 Viene analizzata la condizione Del costrutto if. Se tale condizione e vera viene eseguito il primo blocco di codice che segue lif, altrimenti viene eseguito il blocco di codice che Segue lelse
35
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 #include 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) printf (il numero e dispari \n); else printf (il numero e pari \n); return 0; } Se unespressione assume valori Diversi da zero TRUE Se assume valore uguale a zero FALSE
36
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 nellesame di prog1 e stampi se lo studente ha passato o meno lesame /* Questo programma verifica se uno studente ha passato lesame*/ #include #include 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 (lesame NON e stato superato \n); printf (lesame deve essere ripetuto \n); }else printf (lesame e stato superato \n); return 0; }
37
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 #include 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 else printf (temperatura tipicamente estiva \n); } return 0; }
38
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Precedenza degli operatori (riepilogo)
39
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)
40
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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 che segue. VERA BLOCCO DI CODICE condizione FALSA Costrutto while ATTENZIONE: è importante che la condizione in un tempo finito vada a false. Altrimenti non si Esce mai dal ciclo (loop infinito)
41
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esempio Si scriva un programma che calcola la più piccola potenza di 3 maggiore di un valore intero soglia x inserito da input #include #include int main() { int x; int potenza = 1; printf(Inserite il valore soglia x \n); scanf (%d,&x); while (potenza <= x) potenza=potenza*3; printf (potenza di 3 > x: %d, potenza); return 0; } La variabile intera potenza viene definita e contemporaneamente inizializzata a 1 Si può anche scrivere potenza *= 3; In generale variabile = variabile operando espressione; Può essere scritto più concisamente con variabile operando= espressione;
42
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esempio Vediamo cosa succede se x=10 #include #include int main() { int x; int potenza = 1; printf(Inserite il valore soglia x \n); scanf (%d,&x); while (potenza <= x) potenza=potenza*3; printf (potenza di 3 > x: %d, potenza); return 0; } prima iterazione: x=10 potenza=1 la condizione e VERA si entra nel ciclo e si aggiorna il valore di potenza che viene messo a 3 2a iterazione: x=10 potenza=3 la condizione e VERA si entra nel ciclo e si aggiorna il valore di potenza che viene messo a 9 3a iterazione: x=10 potenza=9 la condizione e VERA si entra nel ciclo e si aggiorna il valore di potenza che viene messo a 27 x=10 potenza=27 la condizione e FALSA si esce dal ciclo. Si esegue la stampa del valore trovato ed il programma termina.
43
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 #include int main() { int x; int potenza = 1; printf(Inserite il valore soglia x \n); scanf (%d,&x); while (potenza <= x) { printf (%d \n, potenza); potenza=potenza*3;} return 0; } Q: cosa succederebbe se mi dimenticassi di aggiornare il valore di potenza nel ciclo? RISPOSTA: Avrei un ciclo infinito
44
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 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; SINTASSI
45
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esercizio Si calcoli letà 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 letà del prossimo alunno Somma tale valore a totale Somma uno a contatore –Poni la variabile media pari a totale/contatore –Stampa il valore della variabile media Importante (il perche dopo)
46
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione #include #include int main() { int totale = 0; int temp; int contatore =1; float media; while (contatore <= 30) { printf (inserisci letà dell %d esimo alunno \n, contatore); scanf (%d, &temp); totale += temp; contatore ++; } media = (float) totale /(contatore-1); printf (letà media della classe è: %f \n, media); return 0; } Corrisponde a contatore =contatore +1;
47
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Osservazione sul casting… #include #include int main() { int totale = 0; int temp; int contatore =1; float media; while (contatore <= 30) { printf (inserisci letà dell %d esimo alunno \n, contatore); scanf (%d, &temp); totale += temp; contatore ++; } media = (float) totale /contatore; printf (letà media della classe è: %f \n, media); return 0; } COSA SUCCEDEREBBE SE ELIMINASSIMO (float)? Il risultato della divisione di totale e contatore verrebbe troncato ad un intero perche entrambe le variabili sono intere sbagliato! Loperatore unario di cast (float) produce una copia reale temporanea della variabile totale (conversione esplicita). La divisione di un float ed un intero da un float (viene effettuata una conversione implicita o una promozione dellintero in float accade sempre nel caso di operandi di tipo diverso). Loperatore di cast ha precedenza maggiore rispetto agli operatori * / %
48
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007
49
Soluzione alternativa #include #include #define NUM_ALUNNI 30 int main() { int totale = 0; int temp; int contatore =1; float media; while (contatore <= NUM_ALUNNI) { printf (inserisci letà dell %d esimo alunno \n, contatore); scanf (%d, &temp); totale += temp; contatore ++; } media = (float) totale /contatore; printf (letà media della classe è: %f \n, media); return 0; } In questo caso abbiamo usato una costante simbolica. Se vogliamo rieseguire il programma per una classe di 50 alunni, sara sufficiente cambiare il valore della costante simbolica Inoltre la costante simbolica e molto piu espressiva (leggibilita del codice) Contatore non può mai essere 0
50
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Alcune domande… #include #include #define NUM_ALUNNI 30 int main() { int totale = 0; int temp; int contatore =1; float media; while (contatore <= NUM_ALUNNI) { printf (inserisci letà dell %d esimo alunno \n, contatore); scanf (%d, &temp); totale += temp; contatore ++; } media = (float) totale /contatore; printf (letà media della classe è: %f \n, media); return 0; } DOMANDA: COSA SUCCEDEREBBE SE NEL CICLO MI DIMENTICASSI DI INCREMENTARE IL CONTATORE? RISPOSTA: LOOP INFINITO SE ENTRO NEL CICLO
51
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Alcune domande… #include #include #define NUM_ALUNNI 30 int main() { int totale = 0; int temp; int contatore =1; float media; while (contatore <= NUM_ALUNNI) { printf (inserisci letà dell %d esimo alunno \n, contatore); scanf (%d, &temp); totale += temp; contatore ++; } media = (float) totale /contatore; printf (letà media della classe è: %f \n, media); return 0; } DOMANDA: COSA SUCCEDEREBBE SE NON INIZIALIZZASSI totale o contatore ? Ripetizione definita (il numero di iterazioni è noto a priori, prima che si cominci ad eseguire il ciclo)
52
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Risposta #include #include … int main() { int totale = 0; int temp; int contatore =1; ….} … 17534 4357 totale … … 320 … 5 contatore temp sum 2040 3800 5040 Quando definiamo una variabile le viene associata una locazione di memoria. Se la variabile viene usata prima che sia inizializzata con un valore opportuno conterrà lultimo valore che era stato memorizzato in quella locazione di memoria GRAVE ERRORE !! ESECUZIONI DIVERSE DEL PROGRAMMA ASSOCIERANNO ALLE VARIABILI LOCAZIONI DIVERSE E PRODURRANNO RISULTATI OGNI VOLTA DIVERSI A SECONDA DEL VALORE INIZIALMENTE CONTENUTO NELLA LOCAZIONI DI MEMORIA ASSOCIATA ALLA VARIABILE!
53
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esercizio 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…) 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 dellesecuzione del programma – METODO A: Utilizzo di un valore sentinella –METODO B: inserimento da input del numero di giorni.
54
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Utilizzo di un valore sentinella 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 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 lutente 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… Assunzione e limite Ripetizione indefinita: il numero di iterazioni che verranno eseguite NON è noto prima di entrare nel ciclo.
55
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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
56
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione con utilizzo di un valore sentinella #include #include int 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; contatore++; printf (inserisci valore della temperatura, valore intero >=1000 per terminare \n); scanf(%f, &temperatura); } if (contatore > 1) { media = totale /(contatore-1); media = totale /(contatore-1); printf (la temperatura media del mese è: %f \n, media); } return 0; } I float sono sempre rappresentati in modo approssimato. Attenzione! potrebbe essere critico verificare se due float sono uguali … Il valore soglia deve essere specificato allutente
57
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Inserimento da input del numero di iterazioni Ripetizione definita (prima dellentrata 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).
58
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 #include #include 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) { printf (inserisci primo valore della temperatura \n); 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; } Inserimento da input del numero di iterazioni o equivalentemente i--;
59
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Operatori di incremento e decremento Operatore Espressione di esempioSpiegazione ++++a Incrementa a di 1 e usa il valore risultante nellespressione in cui compare questo termine ++a++ Usa il valore di a nellespressione, quindi incrementa a di 1 ----b Decrementa b di 1 e usa il valore risultante nellespressione in cui compare questo termine --b-- Usa il valore di b nellespressione, quindi decrementa b di 1
60
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Alcuni esempi #include #include 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); return 0; } 556566556566
61
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Precedenza degli operatori (sintesi) Operatori ++ -- + - (type) * / % + - >= >= == != ? : = += -= *= /= %= Operatori unari +, -
62
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 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, per ciascun rifornimento di carburante, i chilometri per litro fatti dallautomobile. Il programma stamperà quindi la media di chilometri per litro nel periodo monitorato. Numero di iterazioni: 3 Si inseriscano i numeri di litri usati: 12.8 Si inserisca il numero di chilometri: 287 I Km/litro per questo pieno sono:22.42 Si inseriscano i numeri di litri usati: 10.3 Si inserisca il numero di chilometri: 200 I Km/litro per questo pieno sono:19.41 Si inseriscano i numeri di litri usati: 5 Si inserisca il numero di chilometri: 120 I Km/litro per questo pieno sono:24 La media sullintero periodo e: 21.6Esercizio ?
63
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007SoluzionePseudocodice –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 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 lintero intervallo di osservazione
64
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include #include 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 sullintero periodo è: %f \n,tot_chilometri/tot_litri ); else printf(nessun valore valido inserito \n); return 0; }
65
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Soluzione #include #include 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 sullintero periodo è: %f \n,tot_chilometri/tot_litri ); return 0; }
66
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.
67
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione Tc = (5/9)*(Tf-32); –Tc = temperatura in gradi Celsius,Tf = temperatura in gradi Fahrenheit Fahrenheit #include #include 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; }
68
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Esercizio 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 ***
69
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione #include #include int main() { int i,j =0; int righe; printf (inserisci il numero di righe della figura \n); scanf(%d, &righe); while (i<righe) { while (j < righe) { printf (*); j++;}printf(\n);j=0;i++;}} Cicli annidati
70
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 * * *
71
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007Soluzione #include #include 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( ); while (j < righe) { printf (* ); j++;}printf(\n);j=0;i++;}} Costrutti In sequenza annidamento
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.