Fondamenti di Informatica 1 - uniroma2.it · Diagramma a blocchi o flow chart IL Flow-chart è la...
Transcript of Fondamenti di Informatica 1 - uniroma2.it · Diagramma a blocchi o flow chart IL Flow-chart è la...
28/03/2011 2
Sommario
• Istruzioni di controllo– Iterative– Condizionali
• Algoritmi e Diagrammi di flusso• Esercizi
28/03/2011 4
Semantica del ciclo while
istruzione
vero
condizione
falso
E' composto da una condizione di controllo (o uscita) e da un corpo del ciclo. All'ingresso del ciclo viene verificata la validità della condizione di controllo. Se la condizione è vera vengono eseguite tutte le istruzioni contenute nel corpo. Il ciclo termina quando la condizione, costituita da un'espressione booleana, restituisce il valore false.
28/03/2011 10
Confronto tra i cicli
La differenza fra while e do-whileconsiste nel fatto che:• il corpo del ciclo nel do-while viene
sempre eseguito almeno una volta (cioè la prima volta);
• nel while invece se la condizione booleana è falsa il corpo del ciclo non viene mai eseguito.
28/03/2011 12
if ( boolean-expression ) istruzione1;
if
Espressionebooleana
Continuazione
istruzione1
true
falseContinuazione del programma
28/03/2011 13
if ( boolean-expression ) istruzione1;
elseistruzione2;
If-else
Espressionebooleana
istruzione2istruzione 1
true false
Continuazione del programma
Continuazione
28/03/2011 14
Istruzioni condizionali annidate
Mediante strutture di controllo condizionali annidate l’una dentro l’altra è possibile scrivere insiemi di istruzioni che corrispondono a una selezione a più vie, ovvero a un blocco condizionale dove l’elemento che decide i blocchi di istruzioni da eseguire è una variabile (X) che può assumere due o più valori.
28/03/2011 15
Istruzioni condizionali annidate
if (x==0) System.out.println("zero");else if (x==1) System.out.println("uno");
else System.out.println("non capisco");
28/03/2011 16
import java.io.*;public class provaif {public static void main(String[] args) throws NumberFormatException, IOException {// TODO Auto-generated method stubInputStreamReader In = new InputStreamReader(System.in);BufferedReader Tastiera = new BufferedReader(In);
int x; do{System.out.print("Immettere un numero: ");x=Integer.parseInt(Tastiera.readLine()); }while (x<0); System.out.println("numero inserito: " + x);
if (x==0) System.out.println("zero");else if (x==1) System.out.println("uno");
else System.out.println("non capisco");}}
28/03/2011 17
Istruzioni condizionali annidate
if (x==0) System.out.println("zero");else if (x==1) System.out.println("uno");else if (x==2) System.out.println("due");
else System.out.println("non capisco");}}
gli else si legano sempre all’if precedente
28/03/2011 19
Istruzioni condizionali annidate
if (x==0) System.out.println("zero");else if (x==1) System.out.println("uno");else if (x==2) System.out.println("due");
else System.out.println("non capisco");}}
28/03/2011 20
Istruzioni condizionali annidate
if (x==0) System.out.println("zero");else if (x==1) System.out.println("uno");else <3>
}}
28/03/2011 21
Istruzioni condizionali annidate
if (x==0) System.out.println("zero");else if (x==1) System.out.println("uno");else <3>
}}
Algoritmi
L’algoritmo è un procedimento risolutivo di un problema costituito da una sequenza finita di operazioni (istruzioni)
L’algoritmo ha le seguenti proprietà:
1. Finito
2. Deterministico
3. Non ambiguo
4. generale
indipendente dai computer e dall'informatica (es. ricetta di cucina)
Diagramma a blocchi o flow chartIL Flow-chart è la rappresentazione grafica di un algoritmo.
I blocchi (simboli) sono figure geometriche nelle quali sono inserite le operazioni elementari e sono collegate tra loro da linee di giunzione orientate.
I dati che interessano l’algoritmo possono essere:
Costanti quando nello svolgimento mantengono sempre lo stesso valore
variabili quando durante l’elaborazione possono assumere valori diversi e vengono rappresentate di solito con lettere
…una alternativa ai diagrammi di Nassi Shneiderman pag.41 libro
28/03/2011 28
Esercizio
Scrivere un programma che dopo aver letto un numero intero N in INPUT stampa se è positivo o negativo (0 è considerato positivo)
Rappresentazione dell’algoritmo mediante diagramma a blocchi
Problema: Dati in input un numero, controllare se è positivo.
Inizio
Leggi numero
Numero>o
È Negativo
È positivo
VF
Fine
28/03/2011 30
…. riprendiamo il programma che leggeva un intero …
System.out.print("Immettere un numero: ");numero=Integer.parseInt(Tastiera.readLine());
System.out.println("numero inserito: " + numero);
28/03/2011 31
ora effettuiamo il controllo se numero è positivo o negativo e stampiamo il risultato
if (numero >=0 ){System.out.println(numero +" è positivo");}else {System.out.println(numero +" è negativo");}
28/03/2011 32
Esercizio
Scrivere un programma che dopo aver letto un numero intero N>0 in INPUT stampa se è pari o dispari
Inizio
numero%2==0
È dispari
È pari
VF
Fine
numero<=0 ?
leggi numero
Rappresentazione dell’algoritmo mediante diagramma
V
28/03/2011 34
…. riprendiamo il programma che leggeva un intero e applichiamo i concetti fin qui appresi
Facciamo in modo che in input venga letto un intero >0
System.out.print("Immettere un numero: ");numero=Integer.parseInt(Tastiera.readLine());
System.out.println("numero inserito: " + numero);
28/03/2011 35
do{System.out.print("Immettere un numero: ");numero=Integer.parseInt(Tastiera.readLine()); }while (numero<=0);
System.out.println("numero inserito: " + numero);
Ora effettuiamo il controllo se numero è pari o dispari e stampiamo il risultato
if (numero %2==0 ){System.out.println(numero +" è pari");}else {System.out.println(numero +" è dispari");}
Altre caratteristiche degli algoritmi
eseguibilità ogni passaggio deve poter essere messo in pratica con le risorse disponibili
strutturazione non devono essere presenti dei passaggi che rimandano ad altri passaggi in modo caotico che compromettono la leggibilità dell’algoritmo stesso
riusabilità deve poter essere riutilizzato per problemi analoghi
efficienza deve sfruttare le risorse (spazio di memoria e tempo di esecuzione) in modo ottimale, non devono esistere passaggi inutili
leggibilità deve essere enfatizzata la comprensibilità dei passaggi con l’eventuale introduzione di commenti esplicativi (tutto ciò ne agevola il riuso).
28/03/2011 36
28/03/2011 37
Diagrammi di flussoQualsiasi algoritmo può essere rappresentato da un diagramma di
flusso derivante dalla connessione di un numero finito di strutture
elementari.
• Sequenza
• Iterazione
• Selezione
28/03/2011 38
Sequenza
• Nella struttura di sequenza le istruzioni vengono eseguite una dietro l’altra.
Istruzione 1
Istruzione 2
Istruzione n
28/03/2011
39
Selezione• Nella struttura di selezione sono possibili strade
alternative legate ad una condizione
Istr. 2
CondizioneV F
Istr. 2Istr. 1
CondizioneV F
Istr. 1
28/03/2011 40
Iterazione
• La struttura di ripetizione permette un ciclo condizionato (con pre-condizione):
V
F
Condizione
Istruzione
28/03/2011 41
• La struttura di ripetizione permette un ciclo condizionato (con post-condizione):
V
F
Condizione
Istruzione
Iterazione
28/03/2011 45
EsercizioProgettare un algoritmo per calcolare il
fattoriale di n (>0).
nn ...3.2.1!Pre-condizionen numero naturale
Post- condizionefattoriale (n) = n · (n-1) · (n-2) · … · 2· 1fattoriale (0) = 1
28/03/2011 46
si
nonumero<=0 ?
stampaF
i<numero ?
F=1
i=1
F=F*i
i=i+1
si
leggi numero
Costrutto for
Costrutto do
28/03/2011 47
si
nonumero<=0 ?
stampaF
i<numero ?
F=1
i=1
F=F*i
i=i+1
si
leggi numero
Costrutto for
Costrutto do
do { System.out.print("Immettere un numero compreso fra 1 e 30: ");numero=Integer.parseInt(Tastiera.readLine()); }while (numero<=0);
28/03/2011 48
si
nonumero<=0 ?
stampaF
i<numero ?
F=1
i=1
F=F*i
i=i+1
si
leggi numero
Costrutto for
int F =1;for( int i = 2; i <= numero; i++ )
F = F*i;
28/03/2011 49
si
nonumero<=0 ?
stampaF
i<numero ?
F=1
i=1
F=F*i
i=i+1
si
leggi numero
Costrutto while
28/03/2011 50
si
nonumero<=0 ?
stampaF
i<numero ?
F=1
i=1
F=F*i
i=i+1
si
leggi numero
Costrutto while
while (i<numero) { i=i+1; F=F*i;}
28/03/2011 51
import java.io.*;public class fatt1 {
/*** @param args* @throws IOException * @throws NumberFormatException */public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stubInputStreamReader In = new InputStreamReader(System.in);
BufferedReader Tastiera = new BufferedReader(In);int numero=0; do { System.out.print("Immettere un numero compreso fra 1 e 30: ");numero=Integer.parseInt(Tastiera.readLine()); }while (numero<=0);int F=1;int i=1; //i indica il fattore già moltiplicato per Fwhile (i<numero) { i=i+1; F=F*i;}System.out.println("fattoriale di "+numero+" = "+F);
}
28/03/2011 53
si
no
leggi numero
numero<=0 ?
stampaF
i<=numero ?
F=1
i=1
F=F*i
i=i+1
si
Costrutto do
28/03/2011 54
do { F=F*i;i=i+1;}while
(i<=numero);
si
no
leggi numero
numero<=0 ?
stampaF
i<=numero ?
F=1
i=1
F=F*i
i=i+1
si
Costrutto do
28/03/2011 55
import java.io.*;public class fatt1 {
/*** @param args* @throws IOException* @throws NumberFormatException*/public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stubInputStreamReader In = new InputStreamReader(System.in);
BufferedReader Tastiera = new BufferedReader(In);int numero=0; do { System.out.print("Immettere un numero compreso fra 1 e 30: ");numero=Integer.parseInt(Tastiera.readLine()); }while (numero<=0);int F=1;int i=1;do {
F=F*i;i=i+1;}while (i<=numero);
System.out.println("fattoriale di "+numero+" = "+F);
}
28/03/2011 56
Esercizio
Progettare un algoritmo che calcola an
Successivamente tradurre l’algoritmo in codice Java assumendo a ed n >0.
Algoritmi - Esercizio
28/03/2011 58
Soluzione - pseudocodice
• Problema: Calcolare a elevato alla n– Utilizziamo le variabili i, Ris– Inizialmente Ris=1 e i=1
• Algoritmo:– Fino a che i<=n
Calcola Ris * a e memorizzalo in RisIncrementa i