Università degli Studi di Brescia Elementi di Informatica e Programmazione ESERCITAZIONE Docente: A. Saetti Esercitatori: M. Sechi, A. Bonisoli Vers. 04/10/2017 Docente: Alessandro Saetti Elementi di informatica e programmazione Università degli studi di Brescia D.I.M.I A.A. 2017/2018 Dipartimento di Ingegneria dell'informazione Corsi di Laurea di Ing. Informatica, Ing. Elettronica e delle Telecomunicazioni, Ing. dell'automazione Industriale Elementi di informatica e programmazione
2 Visualizzare i numeri primi inferiori a 1000 sfruttando la seguente proprietà: un numero x è primo se e solo se non è divisibile per alcun numero primo y < x maggiore di 1. Suggerimenti Procedere per step successivi lasciando inizialmente "in sospeso" la modalità che ci permette di stabilire se un numero x è primo oppure no. Calcolare il resto della divisione intera tra l'intero corrente x e tutti gli interi minori o uguali a x.
3 Per risolvere l'esercizio occorre: Duello tra Orazi e Curiazi Roma e Alba Longa 1) Scorrere un numero da 2 a 1000 2) Essere in grado di stabilire se un numero è primo oppure no DIVIDE ET IMPERA!
4 ciclo a condizione iniziale Decodifico Lascio in sospeso il metodo che mi permette di stabilire se un numero è primo!
5 Analizzo ora come determinare se un numero è primo
Il numero corrente è primo? 6
7 Visualizzare i primi 1000 numeri primi sfruttando la seguente proprietà: un numero x è primo se e solo se non è divisibile per alcun numero primo y < x Suggerimenti Procedere per step successivi lasciando inizialmente "in sospeso" la modalità che ci permette di stabilire se un numero x è primo oppure no. Posso diminuire il numero di iterazioni se considero che un numero x non è primo quando esiste un intero y minore di x e maggiore di 1 che risulti essere un suo divisore intero.
8 Per risolvere l'esercizio occorre: Duello tra Orazi e Curiazi Roma e Alba Longa 1) Saper contare man mano i numeri primi trovati 2) Essere in grado di stabilire se un numero è primo o meno 3) Scorrere un numero imprecisato di interi a partire da 2. DIVIDE ET IMPERA!
9 ciclo a condizione iniziale ciclo a condizione finale
Decodifico 10
11 Riutilizzo lo stesso diagramma del precedente esempio
Il numero corrente è primo? 12
13 α Per valutare se un numero è primo o meno si poteva procedere anche nel seguente modo α A B A B
14 Calcolare il massimo comune divisore tra 2 interi Suggerimenti Per individuare se un candidato divisore i è un effettivo divisore devo verificare se x mod i == 0 AND y mod i == 0 Questa verifica deve essere effettuata per tutti i candidati divisori da 1 a MIN, ovvero MIN volte Quando il corpo del ciclo deve essere ripetuto un determinato numero di volte è facile impostare la condizione di permanenza del ciclo in funzione del numero di iterazioni In questo caso non c è convenienza ad utilizzare il ciclo a condizione finale (non c è alcuna duplicazione di blocchi). Quando non c è convenienza si preferisce lo schema a blocchi a condizione iniziale per facilità di lettura
1 X Y MCD 15
16
17 Diagramma di flusso dell algoritmo che calcola il MCD E' l'unica soluzione?
1 MCD X Y Versione 2 18
1 X Y MCD Versione 2B 19
1 MCD X Y Versione 2B 20
21 Diagramma di flusso dell algoritmo che calcola il MCD e se x e y sono uguali? fine min x no MCD =, mcd inizio x y 3 sì no x < y 3 3 6 contatore 1 contatore<=min 10 7 11 1 e 2 min y 4 e 5 sì (x mod contatore == 0) AND (y mod contatore == 0) no contatore contatore + 1 sì Ciclo a condizione iniziale 8 mcd contatore 9
22 Calcolare il massimo comune divisore tra 2 interi Suggerimenti Algoritmo di Euclide Si basa sulla constatazione che: Se x = y allora MCD(x,y) = x (oppure y) Se x y t.c. x>y, allora MCD(x,y) = MCD(x y,y) Infatti k è divisore di x,y k è divisore di x y e y: 1. Dimostriamo quindi che "se k è divisore di x e y allora ( ) k è divisore di x y e y". Per ipotesi abbiamo che k è un divisore comune a x e a y. Pertanto possiamo scrivere x = k * d e y = k * r. La differenza x y = k*(d r) per cui k divide x y. 2. Dimostriamo ora l'implicazione inversa ovvero che "se k è divisore di x y e y allora ( ) k è divisore di x e y". Pertanto possiamo scrivere x y = k * d e y = k * r. La somma (x y)+y = k*d+k*r= k*(d+r). Chiaramente (x y)+y = x pertanto k è un divisore comune ad x e y. La relazione appena dimostrata evidenzia che tutti i divisori comuni di x e y coincidono con i divisori comuni di x y e y e dunque anche i massimi comuni divisori fra le due coppie di numeri coincidono.
23 Diagramma di flusso dell algoritmo di Euclide che calcola il MCD no inizio x y x y Ciclo a condizione iniziale fine sì x > y no x x y y y x z y MCD =, z sì
24 Acquisire da tastiera una successione di interi che termina col primo intero x pari. Visualizzare due numeri primi la cui somma è uguale a x. Suggerimento: Perognicoppiadinumeriprimilacuisommaèpariax devo determinare la numerosità div1 e div2 dei loro divisori. Questa operazione va ripetuta fino a quando determino la prima coppia di numeri primi la cui somma è pari a x. Almeno per una coppia devo calcolare la quantità dei loro divisori, quindi il corpo del ciclo va eseguito almeno una volta pertanto è meglio utilizzare un ciclo a condizione finale. Sia a 1 il primo addendo e a 2 il secondo. Affinché la somma a 1 + a 2 sia uguale a x, il secondo addendo a 2 deve essere necessariamente uguale ad x a 1 La condizione di terminazione del ciclo è che entrambi i numeri siano primi, quindi div1 == 0 AND div2 == 0. Negando la condizione ed applicando De Morgan si ottiene la condizione di permanenza. Esercizio per casa: Visualizzare i tre numeri primi la cui somma è pari ad un intero maggiore di 5 acquisito da tastiera
25 L'esercizio prende spunto dalla congettura di Goldbach, uno dei più vecchi problemi irrisolti nella teoria dei numeri. Essa afferma che qualsiasi numero pari maggiore di 2 può essere scritto come somma di due numeri primi (che possono essere anche uguali). Dato un numero N tutte le scomposizioni additive tali per cui X=a 1 +a 2 possono essere ottenute ponendo a 1 =i e a 2 =X i con i che scorre da 2 fino a i X/2. In realtà tale condizione non ci serve. Poiché per via della congettura tali primi esistono! N a 1 +a 2 N 2+(N 2) N 3+(N 3) N i+(n i) N (N 3)+3 N (N 2)+2
26 inizio x Diagramma di flusso dell algoritmo che esprime un numero pari come somma di due numeri primi x mod 2 == 0 sì no a1= 2 a2 = x a1 div1 = divisori(a1) div2 = divisori(a2) div1== 0 && div2=0 No a1= a1+ 1 Si a1 a2 fine Versione 1
27 inizio x sì x mod 2 == 0 sì a1= 1 a1= a1+ 1 a2 = x a1 div1 = divisori(a1) div2 = divisori(a2) no div1!= 0 OR div2!= 0 no a1 a2 Ulteriore diagramma di flusso dell algoritmo che esprime un numero pari come somma di due numeri primi fine Versione 2
29 Acquisire da tastiera una sequenza di interi che termina col primo 0. Successivamente determinare se la sequenza di interi (0 escluso) acquisiti è palindroma Suggerimento: Per determinare se una sequenza è palindroma devo confrontare il primo e l ultimo elemento, il secondo ed il penultimo, ecc. Quindi prima di effettuare la verifica sulla simmetria della sequenza devo prima averla completamente acquisita. Quindi mi serve una sequenza di variabili. Chiamiamo questa sequenza X e facciamo riferimento alle variabili che compongono la sequenza con la notazione x i Utilizziamo 2 variabili i (inizio) ed f (fine) per fare riferimento alla prima e ultima variabile della sequenza da confrontare. Devo confrontare progressivamente variabili verso il centro quindi i deve essere incrementata mentre f deve essere progressivamente decrementata di 1 unità. Queste due operazioni devono essere ripetute per cui mi serve un ciclo. Nel caso in cui la sequenza contiene 1 singolo intero (i è uguale a f) posso concludere subito che la sequenza è palindroma senza alcun incremento o decremento. Per cui il corpo del ciclo può essere eseguito 0 volte. Quindi meglio un ciclo a condizione iniziale. Devo interrompere l incremento di i ed il decremento di f anche se x i è differente da x f. Quindi la condizione di permanenza è i < f AND x i == x f. Al termine del ciclo posso concludere che la sequenza è palindroma nel caso in cui i >= f. Esercizio per casa: Inizializzare una sequenza di n interi con dati acquisiti da tastiera. Ribaltare la sequenza e visualizzarla ribaltata.
NOT OK OK OK 30
I>=F OK OK OK OK 31
32 inizio Leggo una sequenza di valori che termina con zero sì sì n = 0 n = n + 1 x n x n!= 0 no i = 1 f = n i < f AND x i == x f i = i + 1 f = f - 1 no i >= f palindroma fine sì no Diagramma di flusso dell algoritmo che determina se una sequenza di interi è palindroma