Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
! Dichiarazioni
! Espressioni
• Istruzioni
• Funzioni
Istruzioni 2
Programmazione strutturata
• [Teorema di Böhm-Jacopini] Un algoritmo descritto da un
diagramma di flusso qualsiasi può essere implementato, in
modo equivalente, usando le tre sole strutture di controllo
1. Struttura sequenza
2. Struttura alternativa (if_then_else)
3. Struttura iterativa (while_do)
Programmazione strutturata in C
Istruzioni 4
Istruzioni semplici
Qualsiasi espressione (logica, condizionale,
assegnamento) seguita da un ; è un istruzione
(semplice)
ESEMPI
x = 0; y = 1; /* due istruzioni */
3; /* non fa nulla */
; /* istruzione nulla */
Istruzioni 5
Blocco
<blocco> ::=
{
[ <dichiarazioni > ]
{ <istruzioni> }
}
Istruzioni 8
Esercizio
• Specifica: Inverti l ordine delle cifre che formano un intero
positivo compreso fra 100 e 999.
– Per esempio: 234 ! 432
• Algoritmo: Utilizzare le operazioni di modulo e di divisione fra
numeri interi. Dato un numero, valgono le seguenti relazioni:
– Unita = (numero)%10;
o Es., 234%10 = 4
– Decine = (numero/10)%10;
o Es., (244/10)%10 = 3
– Centinaia = (numero/100)%10;
o Es., (234/100)%10 = 2
Istruzioni 9
Esercizio - Programma
#include <stdio.h>
main(){
int numero;
int unita, decine, centinaia, risultato;
scanf("%d", &numero);
printf("%d", risultato);
}
Istruzioni 10
Esercizio
• Scrivere un programma che effettua lo scambio dei valori
di due variabili
main(){
int a=10,b=2;
a=b; a 10 2
b=a;
} b 2 2
• Questo programma non può funzionare!!
Istruzioni 11
Esercizio (cont.)
Esercizio
Scrivere un programma per il calcolo del resto per macchine
per pagamenti automatici.
Istruzioni
14
Esercizio (Programma)
Istruzioni 15
Istruzioni 16
Istruzione di scelta (semplice o alternativa)
• Consente di scegliere fra due istruzioni alternative in
base al verificarsi di una condizione
<istruzione-di-scelta> ::=
if (condizione) < istruzione1>
[ else < istruzione2> ] Opzionale
Istruzioni 17
Istruzioni 18
Istruzioni if annidate
• <istruzione1> o <istruzione2> potrebbero essere
un’altra <istruzione-di-scelta>
• In questo caso occorre fare attenzione ad associare le
parti else (che sono opzionali) all’ if corretto
In base alla sintassi del linguaggio C, l else è sempre
associato all if più interno
Se questo comportamento non soddisfa o crea ambiguità,
occorre inserire esplicitamente un blocco
if (n > 0)
? if (a>b) n = a;
else n = b*5; /* else riferito a if (a>b) */
if (n > 0)
{ if (a>b) n = a; }
else n = b*5; /* else riferito a if (n>0) */
Istruzioni 19
Istruzioni 20
Istruzioni if annidate: alcuni esempi
n (prima) a b n (dopo) ?
if (n > 0)
10 11 5
if (a>b) n = a;
else n = b*5; 10 11 12
-10 11 5
-10 11 12
n (prima) a b n (dopo) ?
if (n > 0)
{ if (a>b) n = a; } 10 11 5
else n = b*5; 10 11 12
-10 11 5
-10 11 12
Istruzioni 21
Esempio
Data una temperatura in ingresso, espressa in gradi Celsius o Fahrenheit, calcolare il
corrispondente valore espresso rispettivamente in gradi Fahrenheit o Celsius
#include <stdio.h>
main()
{
const float F1=9.0, F2=5.0, SH=32;
float temp_inp, temp_out;
char scala;
printf("inserire temperatura e scala (C o F):");
scanf("%f", &temp_inp); fflush(stdin);
scanf("%c", &scala);
if (scala == 'C')
temp_out = (SH + temp_inp * F1 / F2);
else
temp_out = (F2 / F1 * (temp_inp - SH));
printf ("%f\n", temp_out);
}
Istruzioni 22
Esempio
Dato il seguente frammento di codice indicare il valore delle variabili al
termine dell'esecuzione.
Notare come l'indentazione sia molto utile per esprimere al meglio la
struttura di un programma e quindi per migliorare la sua leggibilità.
Esercizio
Dato il seguente programma indicare il valore delle variabili a, b, c
e f al termine di ogni istruzione:
(NB: compilare solo le risposte di fianco alle istruzioni
effettivamente eseguite)
a+ = ++b*c; a= b= c= f=
if(b>2) b=c-=a;
else b=c+=2; a= b= c= f=
f = a+b+c / 3; a= b= c= f=
Istruzioni 24
Esercizio
a = b =
Istruzioni 25
Esercizio
Cosa stampa il seguente frammento di programma con i valori delle
variabili specificati ?
int stampa=0;
if ((b && d) || c) stampa = 2;
else if ((b||c) && (!b && a)) stampa = 1;
else if (! (c&&d) && (!b || c)) stampa = 2;
if (stampa) printf ("%d", stampa++); else printf("stampa");
istruzioni 27
istruzioni 28
Soluzione del problema
È quindi necessario
• Inizializzare la somma a 0: Somma(al passo 0)=0
• Ripetere l’operazione di somma per N volte:
Somma(al passo i-esimo) = Somma(al passo i-1) + 1
Algoritmo e Programma
start
READ n
s=0
i=1
finché resta vero che
no i<=n
while (i<=n)
WRITE s yes
{
s=s+i s = s+i;
i = i+1;
end
i = i +1
}
istruzioni 30
Istruzione iterativa while
<istruzione-while> ::=
while (condizione) <istruzione>
falsa
condizione
vera
istruzione
istruzioni 31
while (i<=n)
{ Istruzione di modifica
s = s+i; della condizione del while
i = i+1;
}
istruzioni 32
Esercizio (Programma completo)
#include <stdio.h>
main()
{
int n, i, s;
istruzioni 33
istruzioni 34
Calcolo del valore minimo (Algoritmo)
START
READ K, X
MIN = X
I=1
WRITE
I< K? NO END
MIN
YES
READ X
while(i<k)
{
scanf("%d", &x);
YES X < MIN ? if (x<min)
min = x;
MIN = X
NO
i=i+1;
}
I=I+1
Algoritmi 35
#include <stdio.h>
main(){
int k, i;
int x, min;
Inizializzazione del
printf("Quanti valori vuoi inserire?"); minimo
scanf("%d", &k); (caso base)
printf("Inserisci un valore? ");
scanf("%d", &x); Confronto fra il
min = x; numero di valori
i=1; inseriti e quelli da
while(i<k){ inserire
printf("Inserisci un valore? ");
scanf("%d", &x); Aggiornamento del
if (x<min) minimo
min = x; (caso induttivo)
i=i+1;}
Aggiornamento
printf("Il minimo valore inserito è %d", min);
del numero di
}
elementi inseriti
istruzioni 36
Calcolo del valore minimo (Programma)
#include <stdio.h>
main(){
int k, i;
int x, min;
Uguali a quelle del ciclo!
printf("Quanti valori vuoi inserire?"); Per non ripeterle:
scanf("%d", &k);
printf("Inserisci un valore? ");
scanf("%d", &x); Non avendo x non posso
min = x; inizializzare min
i=1;
while(i<k){
printf("Inserisci un valore? "); Inizializzazione del minimo
scanf("%d", &x); (caso base per i==o)
if (i==0 || x<min) OPPURE
min = x; Aggiornamento del minimo
i=i+1;} (caso induttivo per i>0)
printf("Il minimo valore inserito è %d", min);
}
istruzioni 37
#include <stdio.h>
main(){
int x, min;
char continua;
istruzioni 39
vera
falsa
condizione
istruzioni 40
Osservazioni
• Si noti che, come nel caso del while , si esce dal ciclo
quando la condizione è falsa
count =0;
do {
scanf("%d",&n);
count++;
} while (! ( (n > 0) || (count == 10) ) );
istruzioni 45
Istruzione “break”
• Determina l’uscita immediata dall’istruzione corrente
– determina l’uscita immediata da un ciclo senza valutare
l’espressione di controllo e viene avviata l'esecuzione
dell'istruzione successiva.
– Esempio precedente:
count =0;
do { Se sono state fatte già
if (count == 10) 10 tentativi si
break; interrompe il ciclo
scanf("%d",&n);
count++;
} while (! (n > 0) );
istruzioni 47
espr-inizializzazione
falsa
Struttura condizione
del while
vera
istruzione
espr-modifica
istruzioni 48
Istruzione iterativa for : esempi
main ()
{ … main ()
i = 1; { …
while (i<=n){ for (i=1; i<=n; i++) s = s+i;
s = s+i; …
i++; } }
… Espressione di Espressione di modifica
}
inizializzazione del ciclo della condizione del for
main() main()
{ … { …
i=0; for(i=0; i<k; i++){
while(i<k){ printf("Inserisci un valore?");
printf("Inserisci un valore?"); scanf("%d", &x);
scanf("%d", &x); if (x<min)
if (x<min) min = x;}
min = x; …
i=i+1;} }
…
}
istruzioni 49
istruzioni 50
Esercizio (Specifica)
istruzioni 51
Esercizio (Programma)
#include <stdio.h>
main()
{
int a, b, i, prod;
printf("Inserisci i due valori da moltiplicare: ");
scanf("%d", &a);
scanf("%d", &b);
prod=0; i=0;
while (i<b)
{ prod=prod+a; for (prod=0,i=0; i<b; i++)
i++; prod=prod+a;
}
printf("Risultato prodotto di %d e %d = %d", a, b, prod);
}
istruzioni 52
Esercizio (verifica per un caso)
main()
{
a ? i ?
int a, b, i, prod;
b ? prod ?
printf("Inserisci …:");
scanf("%d", &a); a 5 i 0
scanf("%d", &b);
b 3 prod 0
prod=0; i=0;
while (i<b)
a 5 i 1 2 3
{ prod=prod+a;
i++; b 3 prod 5 10 15
}
printf("Risultato …"); Output: Risultato prodotto di 3 e 5 = 15
}
istruzioni 53
Cicli Innestati
• L’istruzione di una istruzione iterativa può essere a sua
volta una istruzione iterativa (o contenerne una), dando
origine a cicli innestati.
• Esempio: Stampa della “tabellina pitagorica” 10 X 10
Algoritmo principale Algoritmo per la
stampa della tabellina dell’N
- per i valori di N da 1 a 10
- stampa la tabellina dell’N ! - per i valori di M da 1 a 10
- vai a capo - stampa N * M
for(N=1; N<=10;N++){
for(M=1;M<=10;M++)
printf("%d ", N*M);
printf("\n");
}
Istruzioni 54
Esempio
• Calcolo della potenza di interi.
Acquisire l’esponente ed effettuare per ogni numero fornito il
calcolo della potenza.
Si conviene di terminare quando la base fornita è 0.
Istruzioni 55
Esempio (programma)
#include <stdio.h>
main(){
int B,P,E,I;
printf("Inserire l'esponente non negativo > ");
scanf("%d",&E);
printf("Inserire la base (zero per terminare) ");
scanf("%d",&B);
while (B!= 0) {
P=1;
for (I=1;I<=E;I++)
P*=B;
printf("%d elevato a %d = %d\n",B,E,P);
printf("Inserire la base (zero per terminare) ");
scanf("%d",&B);
}
}
Istruzioni 56
Esercizio
• Specifica: Stampare un rettangolo costituito da nxm caratteri
asterisco, dove i valori di m e n sono inseriti da tastiera.
Ad esempio: m=5 n=2 deve apparire il rettangolo
*****
start *****
READ m, n
i=1
no i<=n
- per i valori di i da 1 a n
end yes - stampa riga di m asterischi
Stampa riga di m asterischi
i = i +1
istruzioni 57
Esercizio
• Servono 2 variabili (int) per rappresentare il numero delle righe
e il numero delle colonne: n, m
Descrizione informale
- acquisisci il numero di righe n e di colonne m
- per i valori di i da 1 a n
- per i valori di j da 1 a m
- stampa il carattere '*'
- vai a capo
istruzioni 58
Esercizio (Programma)
#include <stdio.h>
main()
{
int n, m, i, j;
printf("Inserisci il numero di righe e di colonne: ");
scanf("%d", &n);
scanf("%d", &m);
for(i=1; i<=n;i++){
for(j=1;j<=m;j++)
printf("*");
printf("\n");
}
}
istruzioni 59
Esercizio (Quesito)
• È possibile unificare le due inizializzazioni, i=1 e j=1,
ovvero i seguenti frammenti di codice
sono equivalenti?
#####
#***#
#####
istruzioni 61
• <espressione_di_selezione> … break
è un’espressione che denota
un valore numerabile default
che viene valutata all’esecuzione istruzione
dell’istruzione switch
• <etichetta_i>
è una costante dello stesso tipo di
<espressione_di_selezione>
Istruzioni 63
Istruzioni 64
Scelta multipla: Osservazioni
• <istruzioni> denota una sequenza di istruzioni per cui non
occorre un blocco per specificare più istruzioni
• I vari rami non sono mutuamente esclusivi: una volta
imboccato un ramo, l’esecuzione prosegue in generale con le
istruzioni dei rami successivi
• Per avere rami mutuamente esclusivi occorre forzare
esplicitamente l’uscita mediante l’istruzione break
• Per eseguire la stessa <sequenza_istr> per più casi, cioè
per più valori dell’etichetta elencare in sequenza i vari case:
switch (risposta){
case 's': case 'S': case 'y': case 'Y':
printf("risposta affermativa"); break;
default : printf("risposta negativa"); }
Istruzioni 65
Istruzioni 66
Esempio
#include <stdio.h>
main() {
const float F1=9.0, F2=5., SH=32;
int c, f, temp;
char scala;
Istruzioni 67
main(){
int op1, op2, ris;
char op;
printf("Digita l’espressione: ");
scanf("%d %c %d”, &op1, &op, &op2);
switch (op)
{
case '+' : ris = op1+op2; break;
case '-': ris = op1-op2; break;
case '*': ris = op1*op2; break;
case '/': ris = op1/op2; break;
default: printf("Errore\n");
}
printf("%d %c %d = %d", op1, op, op2, ris);
}
Istruzioni 69
• Tuttavia:
– è utilizzabile solo con espressioni ed etichette di tipo
numerabile (int, char)
– non è utilizzabile con numeri reali (float, double) o con
tipi strutturati (stringhe, vettori, strutture...)
Istruzioni 70
Esercizio (Specifica)
• Dati tre valori a " b " c che rappresentano le lunghezze di
tre segmenti, valutare se possono essere i tre lati di un
triangolo.
Se sì, stabilire il tipo di triangolo: scaleno, isoscele,
equilatero.
OSSERVAZIONE
– perché tre segmenti possano costituire i lati di un
triangolo, deve valere la relazione c < (a + b)
Istruzioni 71
Esercizio (Algoritmo)
START
READ a, b, c
triangolo=equilatero=scaleno=isoscele= false
c < a+b V
triangolo = true
END
Istruzioni 72
Esercizio (variabili)
Istruzioni 73
Esercizio (Programma)
#include <stdio.h>
main()
{
float a, b, c;
int triangolo, scaleno, isoscele, equilatero;
Istruzioni 75
Esercizio 2
• Specifica:
Dati tre valori a, b, c, rappresentanti i coefficienti di
un’equazione di secondo grado
a x2 + b x + c = 0,
calcolare le due radici (se reali)
• Algoritmo:
1. Calcolare il valore: delta = b2 - 4 a c
2. Se delta#0
• calcolare d = !delta
• calcolare le due radici:
x1 = - (b + d) / 2a
x2 = - (b - d) / 2a
altrimenti le radici sono complesse e non bisogna calcolarle
Istruzioni 76
Esercizio 2 (variabili)
• Servono 3 variabili (float) per rappresentare i valori dei 3
coefficienti dell’equazione: a, b, c
Istruzioni 77
Esercizio 2 (Programma)
#include <math.h>
main ()
{
float a=1.0, b=2.0, c=-15.0;
float delta, d, x1, x2;
delta = b*b-4*a*c; La direttiva al pre-processore #include<math.h>
if (delta>=0) non è un istruzione C
Ha lo scopo di rendere disponibili le funzioni
{ matematiche, come sqrt(), fornite nella libreria
d = sqrt(delta); math.h del linguaggio C
x1 = -(b+d)/(2*a);
x2 = -(b-d)/(2*a);
}
}
Istruzioni 78
Esercizio 3
Dire quante volte viene visualizzato “Passo!” per i=4 e j=3 .
for (i=0;k<i;k=k+2)
for(s=k;s>-j;s--)
printf(“\nPasso!”);
volte = 8
Istruzioni 79
void main ()
{
int x = 5, j; scanf (“%d”,&j);
if( j %3==0 ) {int x; x = 3;} printf (“%d”,x);
}
Istruzioni 80