FONDAMENTI DI PROGRAMMAZIONE ESERCITAZIONI Corso di

Transcript

FONDAMENTI DI PROGRAMMAZIONE ESERCITAZIONI Corso di
FONDAMENTI DI PROGRAMMAZIONE
ESERCITAZIONI
Corso di Laurea in MATEMATICA
a.a. 2016/17
Chiara Bodei
1 Dipartimento
di Informatica
email: [email protected]
C. Bodei
–
Dip.to Informatica
FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 –
pag. 1
Semplici algoritmi
Esempi di algoritmi
Vediamo dapprima due esercizi, in cui ci concentriamo sullo stato.
Esempio: Ordinare tre valori interi distinti tra loro
Stato iniziale:
Stato finale:
x
x
y
z
A, y
B, z
C con A,B,C distinti tra loro
max({A,B,C}),
max([{A,B,C} \ {max({A,B,C})}]),
min({A,B,C})
Algoritmo
Passo 1.
Passo 2.
Passo 3.
C. Bodei
–
“Ordiniamo” x e y,
x
Stato 1:
“Ordiniamo” x e z,
x
Stato 2:
z
“Ordiniamo” y e z,
Dip.to Informatica
portandoci nello stato intermedio
max({A,B}), y
min({A,B}), z
C
portandoci nello stato intermedio
max({A,B,C}), y
min({A,B})
min(max({A,B}), C)
portandoci nello stato finale desiderato
FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 –
pag. 2
Semplici algoritmi
Cuore della soluzione
if (x < y)
{
temp = x;
x = y;
y = temp;
}
x
max({A,B}), y
if (x < z)
{
temp = x;
x = z;
z = temp;
}
x
max({A,B,C}), y
if (y < z)
{
temp = y;
y = z;
z = temp;
}
Stato finale
C. Bodei
–
Dip.to Informatica
min({A,B}), z
min({A,B}), z
C
min(max({A,B}), C)
FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 –
pag. 3
Semplici algoritmi
Esempio: Calcolare il massimo di tre interi.
Stato iniziale: {x
A, y
B, z
C}
Stato finale:
{massimo
max({A,B,C})}
Cuore della soluzione 1 (migliore)
if (x > y)
massimo = x;
else
massimo = y;
max
max({A,B})}
if (z > massimo)
massimo = z;
Stato finale
Cuore della soluzione 2
if (x > y)
if (x > z)
massimo =
else
massimo =
else
if (y > z)
massimo =
else
massimo =
C. Bodei
–
x;
z;
y;
z;
Dip.to Informatica
FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 –
pag. 4
Semplici algoritmi
Vediamo ora due esercizi e la loro soluzione con tutti i dettagli.
Esempio: Calcolare il massimo di N interi dati da linea di
comando, con N dato da linea di comando
C. Bodei
I
Dobbiamo calcolare il massimo mano a mano che gli interi
vengono inseriti
I
Utilizziamo un ciclo controllato da una variabile di controllo i
che assume tutti i valori fino a N.
I
Facciamo in modo che, ad ogni iterazione, il massimo tra i
valori fino a quel punto inseriti. Per ottenere questo ad ogni
iterazione confrontiamo l’elemento corrente con il “massimo
in carica”.
I
Alla fine del ciclo abbiamo il massimo tra tutti i valori.
–
Dip.to Informatica
FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 –
pag. 5
Semplici algoritmi
Soluzione:
include <stdio.h>
int main()
{
int n,corr;
int max;
printf("Introduci il numero di interi\n");
scanf("%d", &n);
printf("Introduci il primo intero della sequenza\n");
scanf("%d", &max);
while (n - 1 > 0)
{
printf("Introduci il nuovo intero della sequenza\n");
scanf("%d", &corr);
if (corr > max)
max = corr;
n = n-1;
}
printf("Il massimo e’: %.d\n",max);
}
Per calcolare il massimo di K elementi devo fare K-1 confronti,
dato che sono proprio K-1 gli elementi che devono uscire perdenti.
C. Bodei
–
Dip.to Informatica
FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 –
pag. 6
Semplici algoritmi
I
C. Bodei
Scrivere un programma che simuli il gioco della morra cinese
fra due giocatori, ovvero che legge due valori v1 e v2 che
rappresentano uno dei tre valori “forbici”, “carta” e “sasso” e
quindi stampa il vincitore oppure indicare che il gioco è pari.
Si ricorda che “forbici” batte “carta”, “carta” batte “sasso” e,
infine,“sasso” batte “forbici”.
–
Dip.to Informatica
FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 –
pag. 7
Semplici algoritmi
Soluzione 1:
Supponiamo si tratti di caratteri.
include <stdio.h>
int main()
{
char v1, v2;
printf("Digitare i valori di v1 e v2 \n");
scanf("%c %c", &v1, &v2);
if (v1 == v2)
printf("Il gioco pari \n");
else
if ((v1 == ’f’ && v2 == ’c’)||(v1 == ’c’ && v2 == ’s’)||
(v1 == ’s’ && v2 == ’f’))
printf("Il vincitore il primo giocatore \n");
else
printf("Il vincitore il secondo giocatore \n");
}
C. Bodei
–
Dip.to Informatica
FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 –
pag. 8
Semplici algoritmi
Soluzione 2: Codificando i tre valori con tre interi, cioè ’f’ = 3,
’c’ = 2 e ’s’ = 1, si vede che esiste una sorta di ordinamento
modulo 3: 3 vince su 2, 2 vince su 1 e 1 vince su 3.
include <stdio.h>
int main()
{
int v1, v2,v;
printf("Digitare i valori di v1 e v2 \n");
scanf("%d %d", &v1, &v2);
if (v1 == v2)
printf("Il gioco pari \n");
else
v = v1-v2 % 3;
printf("%d \n",v);
if (v == 1)
printf("Il vincitore è il primo giocatore \n");
else
printf("Il vincitore è il secondo giocatore \n");
}
C. Bodei
–
Dip.to Informatica
FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 –
pag. 9