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