La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 Dal problema all’ algoritmo. 2 Analisi e programmazione Tramite un elaboratore si possono risolvere problemi di varia natura. Il problema deve essere.

Presentazioni simili


Presentazione sul tema: "1 Dal problema all’ algoritmo. 2 Analisi e programmazione Tramite un elaboratore si possono risolvere problemi di varia natura. Il problema deve essere."— Transcript della presentazione:

1 1 Dal problema all’ algoritmo

2 2 Analisi e programmazione Tramite un elaboratore si possono risolvere problemi di varia natura. Il problema deve essere formulato in modo opportuno, perché sia possibile utilizzare un elaboratore per la sua soluzione. analisi e programmazione Per analisi e programmazione si intende l’insieme delle attività preliminari atte a risolvere problemi utilizzando un elaboratore, dalla formulazione del problema fino alla predisposizione dell’elaboratore Scopo dell’analisi:algoritmo Scopo dell’analisi: definire un algoritmo Scopo della programmazione: programma utilizzando un linguaggio di programmazione Scopo della programmazione: tradurre l’algoritmo in un programma utilizzando un linguaggio di programmazione

3 3 Definizione di Algoritmo Un algoritmo è sequenza finita di azioni elementari che descrivono la soluzione di un problema in modo completo Ogni algoritmo è un insieme finito di azioni e deve terminare dopo un numero finito di istruzioni. Completo: deve considerare tutti i casi possibili che si possono verificare durante l’esecuzione e per ogni caso può indicare la soluzione da seguire.

4 4 Un algoritmo non può essere eseguito direttamente dall’elaboratore Programma  insieme di istruzioni (o comandi) Programma  insieme di istruzioni (o comandi) che traducono l’algoritmo in un linguaggio comprensibile ed eseguibile da parte di un elaboratore Un programma è strutturato in: - una parte di dichiarazione in cui si dichiarano tutte le variabili del programma e il loro tipo (intero, reale, stringa, ecc.) - una parte che descrive l’algoritmo risolutivo utilizzato Linguaggio di programmazione  Linguaggio di programmazione  linguaggio che permette la formalizzazione di un algoritmo in un programma traducendolo con un insieme di istruzioni (codice) Programma=algoritmo + dati

5 5 Le fasi del procedimento di analisi e programmazione Risultati Problema ANALISI ELABORAZIONE ELABORAZIONE Dati PROGRAMMAZIONE PROGRAMMAZIONE Algoritmo Programma

6 6 Dati su cui opera un Algoritmo: Costanti e variabili costantivariabili I dati su cui opera un algoritmo sono costanti e variabili costante Una costante è una locazione (cella) di memoria che mantiene lo stesso valore per tutta la durata dell'esecuzione del programma. variabile Una variabile identifica una locazione (cella) di memoria destinata a contenere dei dati, che possono essere modificati nel corso dell'esecuzione di un programma. Una variabile è caratterizzata da un nome (una sequenza di caratteri e/o cifre) e da un tipo di variabile numerica, alfabetica o alfanumerica (in Visual Basic: integer, double, string). Rappresentazione di una variabile NomeValore

7 7 Assegnazione assegnazione L’istruzione di assegnazione definisce il valore di una variabile, che resta inalterato fino all’assegnazione successiva Es. A  5 (a=5) L’assegnazione si rappresenta con il simbolo “  ” nome di variabile  espressione nome di variabile  espressione 5 Es. A  5 si legge “assegna alla variabile A il valore di 5 I nomi delle variabili possono essere scelti in modo arbitrario, ma è opportuno selezionare nomi significativi del contenuto della variabile (senza spazi o caratteri speciali)

8 8 Esempi Assegnazione x  x+3 c 4 x 14 x 17 Dopo l’assegnazione Prima dell’assegnazione a  b*ca  b*c b 6 4 c a 24 b 6 Dopo l’assegnazione a = b*c x = x+3

9 9 Le Istruzioni operative Le Istruzioni operative in un programma possonono essere: Istruzioni di controllo Istruzioni di controllo, che controllano il verificarsi di condizioni specificate e, in base al risultato del controllo, determinano il flusso di istruzioni da eseguire Esistono tre tipi di istruzioni di controllo: sequenza, selezione (alternativa), ripetizione (ciclo) Istruzioni di ingresso/uscita Istruzioni di ingresso/uscita, che specificano come debba essere effettuata una trasmissione di dati tra l’algoritmo risolutivo e l’ambiente esterno Istruzioni di inizio/fine esecuzione Istruzioni di inizio/fine esecuzione, che indicano l’inizio/la fine dell’algoritmo Le istruzioni

10 10 I diagrammi a blocchi (flowchart) diagrammi a blocchi flowchart Il linguaggio dei diagrammi a blocchi è un possibile formalismo per la descrizione di algoritmi; il diagramma a blocchi, o flowchart, è una rappresentazione grafica dell’algoritmo flusso Un diagramma a blocchi definisce il flusso sequenziale di operazioni da eseguire per realizzare la soluzione del problema, descritta nell’algoritmo Ogni istruzione è rappresentata all’interno di un blocco la cui forma grafica è determinata dal tipo di istruzione (blocco di elaborazione, di lettura o di scrittura, di scelta, ecc.) linee di flusso I blocchi sono collegati tra loro da linee di flusso, munite di frecce, che indicano il susseguirsi di azioni elementari

11 11 I diagrammi a blocchi Blocchi elementari Blocco di lettura (input) leggi x leggi x inizio inizio Blocco iniziale Blocco di elaborazione fine fine Blocco finale Blocco di scrittura (output) scrivi X scrivi X Blocco di controllo falsovero scrivi x scrivi x Condizione Elaborazione

12 12 Un diagramma a blocchi è un insieme di blocchi elementari composto da: un blocco iniziale un blocco finale un numero finito di blocchi di elaborazione e blocchi di lettura/scrittura un numero finito di blocchi di controllo I diagrammi a blocchi

13 13

14 14 insieme di definizione Il valore di una variabile deve appartenere all’insieme di definizione, su cui si opera (numeri interi, reali o stringhe). nomevalore Una variabile è caratterizzata dal nome e dal suo valore che è = 0 in fase di definizione dell’algoritmo, ma assume poi valori ben precisi durante ogni esecuzione Esempio Esempio: Nell’algoritmo di risoluzione delle equazioni di 2° grado, a, b, c non corrispondono a nessun valore finché non si esegue l’algoritmo per trovare le soluzioni di una specifica equazione: ad esempio x 2  9x  4=0 : in fase di esecuzione il valore delle variabili a,b,c sarà: a=1, b=  9, c=  4 e nell’istruzione  =b 2  4ac viene calcolato il valore della variabile  (discriminante) Costanti e variabili

15 15

16 16

17 17 Esempio di diagramma a blocchi N S =  A S= S+A N=N-1 N=  S FINE SINO inizio Somma di una sequenza di N numeri

18 18 Linguaggio di progetto o pseudocodifica E un linguaggio formale con regole prive di ambiguità che esprimono i vari tipi di istruzioni. Es. inizio input N (Leggi N) S  ripeti input A S S+A N N-1 finché N=  output S fine

19 19 Algoritmo  Un algoritmo non può essere eseguito direttamente dall’elaboratore Codifica dell ’ algoritmo  Programma  Programma: sequenza ordinata di istruzioni, scritte in un determinato linguaggio di programmazione, che specificano le azioni da compiere dall ’ esecutore (il computer). Programma ALGORITMI e PROGRAMMI Algoritmo

20 20 Un programma è strutturato in: - una parte dichiarativa in cui si dichiarano tutte le variabili del programma e il loro tipo (intero, reale, stringa, ecc.) - una parte che descrive l’algoritmo risolutivo utilizzato Linguaggio di programmazione  Linguaggio di programmazione  linguaggio che permette la formalizzazione di un algoritmo in un programma traducendolo con un insieme di istruzioni (codice) Programma = algoritmo + dati

21 21 ALGORITMI e PROGRAMMI PROBLEMAALGORITMO PROGRAMMA metodo risolutivo linguaggio di programmazione

22 22 LINGUAGGI: SINTASSI E SEMANTICA Sintassi: l’insieme delle regole che consentono di scrivere parole e frasi riconoscibili come appartenenti ad un determinato linguaggio. (collegamento ordinato delle parole nel discorso) Semantica : la disciplina che studia il significato delle parole e delle frasi.

23 23 LINGUAGGI a BASSO e ALTO LIVELLO Linguaggi di Programmazione a basso livello Linguaggi di Programmazione a basso livello impostano la soluzione di un problema a partire da “passi elementari”: risolvono il problema con efficienza ma sono molto vasti per risolvere algoritmi complesssi. Esempio: Assembly Linguaggi di Programmazione ad alto livello Linguaggi di Programmazione ad alto livello (di astrazione) le istruzioni corrispondono ad operazioni più complesse esempi: Pascal, Basic, C, C++, Java, Visual Basic ASTRAZIONE: processo di aggregazione di informazioni e dati per costruire un modello del mondo esterno.

24 24 Linguaggi di programmazione Problema Algoritmo Programma sorgente Programma traduttore Programma oggetto Elaborazione Risultati Dalla formulazione del problema alla sua soluzione

25 25 Linguaggi Orientati agli Oggetti Linguaggi Ibridi Linguaggi di Programmazione Imperativa Evoluzione dei Linguaggi Esistono numerosi linguaggi differenti per funzionalità e tecnologia metà anni ’50 FORTRAN metà anni ’60 BASIC 1968 Pascal 1974 C 1990 C Java 2000 Java 1991 VB anni ‘60 COBOL

26 26 Programma sorgente L’algoritmo risolutivo viene trasformato in un programma che può contenere: Istruzioni di dichiarazione Istruzioni di assegnazione Istruzioni di controllo Istruzioni di input e output Descrivono le variabili utilizzate dal programma, definendone tipo e struttura Consentono di assegnare alle variabili un valore Strutture alternativa e strutture di ripetizione o cicli Richiedono l’ingresso o l’uscita di una informazione da una periferica alla memoria centrale e viceversa

27 27 La traduzione da Linguaggio di programmazione a Linguaggio macchina viene fatta da un programma traduttore di linguaggio Due diversi approcci alla traduzione basata su interprete basata su compilatore I linguaggi di programmazione che richiedono un interprete sono definiti linguaggi interpretati, mentre quelli che richiedono un compilatore sono chiamati linguaggi compilati Programma

28 28 Programma Linguaggi Interpretati La traduzione avviene per mezzo di un interprete, che traduce una riga del programma per volta, ed la esegue immediatamente, Analogia: gli interpreti simultanei nelle trasmissioni televisive o nei congressi Vantaggi: controllo del codice è immediato Svantaggi: i programmi scritti con linguaggi interpretati, per essere eseguiti, hanno bisogno dell'interprete (es. Visual Basic, Java) Linguaggi Compilati La traduzione avviene per mezzo di un compilatore, che traduce per intero il programma in un nuovo oggetto Analogia: i traduttori di libri o riviste Vantaggi: generano un eseguibile, che può essere eseguito senza bisogno di altri supporti (es. C) Svantaggi: correggere gli errori richiede più tempo

29 29 Linguaggi compilati C, C++, Fortran Linguaggi interpretati Perl, PHP, Visual Basic Linguaggi interpretati e compilati Java

30 30 Compilazione codice sorgente es:primo.c Collegamento codice oggetto (ling. macchina) es: primo.obj librerie esterne precompilate es: stdio.h Compilatore Linker codice eseguibile es: primo.exe

31 31 Ambiente di sviluppo E’ necessario disporre di vari strumenti Scrittura del codice del programma editor di testi (es: Blocco Note o TextPad) Compilatore e Linker delle librerie DevC++ Compilatore Borland BCC 5.5 (si utilizza dalla shell DOS)

32 32 Il Mio primo programma /* Calcolo area rettangolo */ #include int main(){ using namespace std; int base=13; int altezza=5; int AreaRettangolo; AreaRettangolo = base*altezza; cout << "Area rettangolo con base " << base; cout << " e altezza " << altezza; cout << " e' uguale a " << AreaRettangolo << endl; }

33 33 Modifichiamo il primo programma /* Calcolo area rettangolo */ #include int main(){ using namespace std; int base=13; int altezza=5; int AreaRettangolo; cout<< "Iserisci base "; cin>>base; cout<< "Inserisci altezza "; cin>>altezza; AreaRettangolo = base*altezza; cout << "Area Rettangolo: " << AreaRettangolo << endl; }

34 34 Struttura di Base di un Programma #include void main(){ }

35 35 Direttive di preprocessore servono ad “includere” nel programma codice già scritto (librerie) in particolare: #include ( in C #include ) ( in C #include ) include il codice relativo alle operazioni di lettura e stampa dei dati da console è necessaria un’operazione di collegamento tra le librerie incluse ed il codice del programma (linker)

36 36 Tipi di Dato e Dichiarazione variabili Tipi di dato Parole chiave: int float double bool char string Dichiarazione variabili Esempi: int x, y; string cognome; bool trovato;

37 37 Dichiarazioni di Costanti Parole chiave: const Esempio: const int N=10; const float pigreco = 3.14; const char segno = ‘X’; const string corso = “Informatica”;

38 38 Operatori e Funzioni Predefinite Principali operatori: + - * / % && || ! == > >= < <= != Principali funzioni predefinite: abs() pow() sqrt() exp() cos() atan() log() log10()

39 Istruzioni di Assegnazione Esempio: int x,y; bool z; x = 3; x = x+1; x = pow(y,2); z = (x>y) && (y <=10); 39

40 Procedure Predefinite di Lettura e Stampa Lettura da tastiera: >> operatore di lettura cin input stream Stampa su video: << operatore di stampa cout output stream Esempio: float x; cout << “Immetti il valore di x: “; cin >> x; cout << “Il valore di x e’ :” << x; 40

41 Strutture di Controllo Istruzioni Condizionali Parole chiave: if..... else Esempio1: int x,y; if (x>2) cout << x; 41 Esempio2: if ((x==3) || (x==5)) { cout << x; x = x+1; }; Esempio3: if ((x==3) || (x==5)) { cout << x; x = x+1; }; Esempio4: #include int main(){ using namespace std; int primo, secondo,maggiore, minore; cout<<"Inserire primo numero"; cin>>primo; cout<<"Inserire secondo numero"; cin>>secondo; if (primo<=secondo) {minore=primo; maggiore=secondo; } else{ minore=secondo; maggiore=primo; } cout<<"Numero minore"<

42 Cicli di tipo “FOR” Parole chiave: for Esempio1: #include int main(){ int i,j; for (i=1; i<=10; i++) cout << i << endl; 42 for (i=1; i<=10; i++) { for (j=1; j<=10; j++) cout << i*j<<"\t"; cout << endl; }

43 Cicli di tipo “WHILE” Parole chiave: while Esempio1: int main(){ using namespace std; int i,j; i=1; while (i<=10) { cout << i << endl; i=i+1; } 43 Esempio2: i=1; while (i<=10) { j=1; while (j<=10) { cout << i*j<<" "; j=j+1; } cout << endl; i++; }

44 Sottoprogrammi Procedure #include using namespace std; void stampaLogo() // dichiarazione e definizione della procedura{ cout<

45 Funzioni #include int addizione (int a, int b); // Prototipo della funzione addizione int main() { int z= addizione (5,3); cout<<"il risultato e': "<

46 Esercizio #include int main () {int a; a = pow(2, 3); // 2 e' la base e 3 e' l'esponente cout << a<< endl; system("Pause"); return 0; } 46

47 47 Fine

48 48 La programmazione strutturata È stato dimostrato (Teorema fondamentale della programmazione strutturata di Jacopini e Böhm) che ogni programma può essere codificato attenendosi esclusivamente a tre strutture fondamentali: 1. Sequenziale 2. Condizionale o alternativa 3. Iterativa o di ripetizione v f

49 49 Le strutture di controllo La sequenza Struttura condizionale o alternativa Il ciclo con controllo alla fine Il ciclo con controllo all'inizio Il ciclo con contatore

50 50 La sequenza È una struttura di controllo che permette di inserire una successione di elaborazioni che saranno eseguite una di seguito all'altra. Sintassi Le istruzioni vengono scritte una di seguito all'altra, una per riga: istruzione1 istruzione2... ….

51 51 La Struttura alternativa È una struttura di controllo che permette di inserire una scelta tra due possibilità, che porteranno a due elaborazioni distinte (ovvero due distinti percorsi nel diagramma di flusso). Se la condizione risulterà vera, saranno eseguite le istruzioni del ramo VERO, se invece risulta falsa, saranno eseguite le istruzioni del ramo FALSO.

52 52 Struttura di controllo iterativa o ciclo Il ciclo con controllo alla fine È una struttura di controllo che permette di ripetere un blocco di istruzioni finché la condizione indicata è falsa. L'uscita dal ciclo si ha solo quando la condizione diventa vera. In questo tipo di ciclo il blocco delle istruzioni viene sempre eseguito almeno una volta.

53 53 Struttura di controllo iterativa o ciclo Il ciclo con controllo all'inizio È una struttura di controllo che permette di ripetere un blocco di istruzioni fintanto che la condizione indicata risulta vera. L'uscita dal ciclo si ha solo quando la condizione diventa falsa. In questo tipo di ciclo il blocco delle istruzioni può non essere mai eseguito, a seconda della condizione impostata.

54 54 Strutture di controllo Mediante i blocchi fondamentali, è possibile costruire delle strutture tipicamente utilizzate per il controllo del flusso di esecuzione dell’algoritmo: Selezione Iterazione o cicli Selezione Esprime la scelta tra due possibili azioni

55 55 Strutture di controllo Iterazione o cicli Esprime la ripetizione di una sequenza di istruzioni. Nel caso piu` generale, e` costituita da: Inizializzazione: assegnazione dei valori iniziali alle variabili caratteristiche del ciclo (viene eseguita una sola volta); Corpo: esecuzione delle istruzioni fondamentali del ciclo che devono essere eseguite in modo ripetitivo; Modifica: modifica dei valori delle variabili che controllano l'esecuzione del ciclo (eseguito ad ogni iterazione); Controllo: determina se il ciclo deve essere ripetuto o meno.

56 56 Il ciclo con contatore FOR È una struttura di controllo che permette di ripetere un blocco di istruzioni un numero prestabilito di volte. La variabile contatore verrà inizializzata con il valore minimo (I=0) e, alla fine di ogni ripetizione (NEXT), la variabile verrà incrementata di uno. Solo quando la variabile assume un valore superiore al massimo previsto si uscirà dal ciclo. INUM

57 57 Un ciclo è detto enumerativo quando è noto a priori il numero di volte che deve essere eseguito si usa la tecnica del contatore per controllarne l’esecuzione: si usa cioè una variabile detta contatore del ciclo che viene incrementata (o decrementata) fino a raggiungere un valore prefissato Un ciclo è indefinito quando non è noto a priori il numero di volte che deve essere eseguito Questo accade quando la condizione di fine ciclo dipende dal valore di una o più variabili contenute nell’interazione. Ciclo Enumerativo Ciclo Indefinito

58 58 Somma di due valori forniti dall’utente

59 59 Note sullo schema di iterazione enumerativa E’costituito da una sequenza di azioni di assegnazione dette istruzioni di inizializzazione e una iterazione (ripetizione) di una sequenza di azioni per un numero specificato di volte

60 60 schemi fondamentali di composizione Fra tutti i possibili schemi di flusso ne esistono alcuni che sono detti schemi fondamentali di composizione Schema di sequenza: Schema di sequenza: è uno schema elementare o uno schema di sequenza Struttura di sequenza fine A inizio

61 61 Struttura di selezione Schema di selezione: Schema di selezione: un blocco di controllo subordina l’esecuzione di due possibili schemi di flusso al verificarsi di una condizione Nel primo caso, lo schema S viene eseguito solo se la condizione C è vera; se C è falsa, non viene eseguita alcuna azione Nel secondo caso, viene eseguito solo uno dei due schemi S v o S f, in dipendenza del valore di verità della condizione

62 62 cicloloop Il ciclo o loop è uno schema di flusso per descrivere, in modo conciso, situazioni in cui uno gruppo di operazioni deve essere ripetuto più volte Struttura iterativa o di ripetizione condizione di fine ciclo esce dal ciclo La condizione di fine ciclo viene verificata ogni volta che si esegue il ciclo; se la condizione assume valore vero (falso), le istruzioni vengono reiterate, altrimenti si esce dal ciclo La condizione di fine ciclo può essere verificata prima o dopo l’esecuzione dell’iterazione istruzioni di inizializzazione Le istruzioni di inizializzazione, assegnano valori iniziali ad alcune variabili (almeno a quella che controlla la condizione di fine ciclo) Ciclo con controllo in coda Ciclo con controllo in testa

63 63 Gli algoritmi iterativi Problema Problema: Calcolare la somma di tre interi consecutivi( es ) Note Note: La fase di inizializzazione riguarda la somma e l’indice del ciclo Il controllo di fine ciclo viene effettuato in coda

64 64 definito enumerativo Un ciclo è definito quando è noto a priori il numero di iterazioni: un ciclo definito è detto anche enumerativo contatore del ciclo Un contatore del ciclo tiene memoria di quante iterazioni sono state effettuate; può essere utilizzato in due modi: incremento del contatore incremento del contatore: il contatore viene inizializzato ad un valore minimo (ad es. 0) e incrementato ad ogni esecuzione del ciclo; si esce dal ciclo quando il valore del contatore eguaglia il numero di iterazioni richieste decremento del contatore decremento del contatore: il contatore viene inizializzato al numero di iterazioni richiesto e decrementato di uno ad ogni iterazione; si esce quando il valore del contatore raggiunge 0 Gli algoritmi iterativi  4

65 65 indefinito Un ciclo è indefinito quando non è possibile conoscere a priori quante volte verrà eseguito La condizione di fine ciclo controlla il valore di una o più variabili modificate da istruzioni che fanno parte dell’iterazione terminazione Comunque, un ciclo deve essere eseguito un numero finito di volte, cioè si deve verificare la terminazione dell’esecuzione del ciclo Gli algoritmi iterativi  5

66 66 Gli algoritmi iterativi Problema Problema: Calcolo della media di un insieme di numeri; non è noto a priori quanti sono i numeri di cui deve essere calcolata la media I numeri vengono letti uno alla volta fino a che non si incontra un x = 0, che segnala la fine dell’insieme

67 67 Fine

68 68 Proposizioni e predicati proposizione Una proposizione è un costrutto linguistico del quale si può asserire o negare la veridicitàEsempi falsa “Roma è la capitale della Gran Bretagna” falsa vera “ 3 è un numero intero” vera valore di verità Il valore di verità di una proposizione è il suo essere vera o falsa predicato Una proposizione è un predicato se il suo valore di verità dipende dall’istanziazione di alcune variabiliEsempi “la variabile età è minore di 30 ” “la variabile base è maggiore della variabile altezza”

69 69 valutazione di un predicato La valutazione di un predicato è l’operazione che permette di determinare se il predicato è vero o falso, sostituendo alle variabili i loro valori attuali verofalsovalori logicibooleani I valori vero e falso sono detti valori logici o booleani operatori relazionali Proposizioni e predicati possono essere espressi concisamente per mezzo degli operatori relazionali: = (uguale)  (diverso) > (maggiore) < (minore)  (maggiore o uguale)  (minore o uguale) semplici I predicati che contengono un solo operatore relazionale sono detti semplici Proposizioni e predicati

70 70 pnotpoppostonegazione logicap p Dato un predicato p, il predicato not p, detto opposto o negazione logica di p, ha i valori di verità opposti rispetto a p pqcongiunzione logicapqp and q pq Dati due predicati p e q, la congiunzione logica di p e q, p and q, è un predicato vero solo quando p e q sono entrambi veri, e falso in tutti gli altri casi pqdisgiunzione logicapqp or q pq Dati due predicati p e q, la disgiunzione logica di p e q, p or q, è un predicato falso solo quando p e q sono entrambi falsi, e vero in tutti gli altri casi not andorcomposti I predicati nei quali compare almeno uno fra gli operatori logici not, and, or sono detti composti tavola di verità La tavola di verità di un predicato composto specifica il valore del predicato per ognuna delle possibili combinazioni dei suoi argomenti Proposizioni e predicati

71 71 Proposizioni e predicati Esempio pand qp or q Le tavole di verità per i predicati p and q e p or q sono le seguenti:pq p and q p or q falso verofalsovero falso vero

72 72 Esempio not not (base > altezza) è vero solo quando il valore di base è minore o uguale del valore di altezza and età > 30 and età < 50 è vero solo quando il valore di età è compreso tra 30 e 50 or base > altezza or base > 100 è vero quando il valore di base è maggiore del valore di altezza, o quando il valore di base è maggiore di 100, o quando entrambe le condizioni sono verificate Proposizioni e predicati

73 73 nome, valore scalari Le variabili, definite come coppie, sono scalari nome, insieme di valori vettorearray elementocomponente Una coppia è una variabile vettore o array e può essere immaginata come un contenitore diviso in scomparti; ciascun scomparto può contenere un valore, detto elemento o componente del vettore indice Ciascuna componente è individuata dal nome del vettore, seguito dal relativo numero progressivo, racchiuso fra parentesi tonde: l’indice del vettore dimensione La dimensione di un vettore è il numero dei suoi elementi I vettori sono particolarmente utili per collezionare dati fra loro correlati, sui quali devono essere effettuate le stesse operazioni I vettori

74 74 L’utilizzo di variabili vettoriali, in un algoritmo, presuppone la dichiarazione esplicita della loro dimensione La dimensione del vettore costituisce un limite invalicabile per la selezione delle componenti del vettore Esempio Esempio: v(100) asserisce che il vettore v è costituito da 100 elementi; possono essere selezionati v(12), v(57), v(89), ma non v(121) o v(763), che non esistono I vettori v(4) v(1) v(2) v(3) Vettore v, costituito dai 4 elementi v(1), v(2), v(3), v(4)

75 75 I vettori Esempio Esempio: Calcolare il vettore somma di due vettori di uguale dimensione n a(4) a(1) a(2) a(3) 3570 b(4) b(1) b(2) b(3) 569 1111 c(4) c(1) c(2) c(3) 1111

76 76 Esempio Esempio: algoritmo per calcolare il vettore somma di due vettori Note Note: L'utilità dei vettori consiste nel- l’impiego della tecnica iterativa in modo da effettuare la stessa operazione su tutti gli elementi del vettore Usando la variabile contatore di un ciclo come indice degli elementi di un vettore è possibile considerarli tutti, uno alla volta, ed eseguire su di essi l’operazione desiderata I vettori

77 77 I vettori Esempio Esempio: Algoritmo per il calcolo del massimo elemento di un vettore vero

78 78 La pseudocodifica  1 pseudocodifica La pseudocodifica è un linguaggio per la descrizione di algoritmi La descrizione di un algoritmo mediante pseudocodifica si compone di due parti... dichiarazione delle variabili la dichiarazione delle variabili usate nell’algoritmo descrizione delle azioni la descrizione delle azioni dell’algoritmo

79 79 Tipo delle variabili tipo Il tipo di una variabile indica l’insieme dei valori che possono essere assegnati a quella variabile Su costanti e variabili di un tipo è possibile effettuare le operazioni che sono proprie di quel tipo e tutte le operazioni di confronto (utilizzando gli operatori relazionali) integersingle, double booleanstring Sono permessi i seguenti 4 tipi: integer, single, double, boolean, string La pseudocodifica  2

80 80 integer integer: sono le variabili cui possono essere assegnati numeri interi; le costanti di tipo integer sono numeri interi, ad es. 1,  3, 150 real notazione scientifica real: sono le variabili cui possono essere assegnati numeri razionali; le costanti real possono essere rappresentate in notazione decimale, con un “.” che separa la parte intera dalla parte decimale (ad es., 5.17, ,  123., 0.005) o in notazione scientifica (23.476E+2=2347.6, E  4= ) boolean truefalse boolean: sono le variabili cui possono essere assegnati i valori logici; le costanti logiche sono true e false string  q stringhe string  q: sono le variabili cui possono essere assegnate parole (o stringhe) costituite da q caratteri; le costanti string  q sono costituite da parole di q caratteri racchiusi tra apici (che non fanno parte della costante); ad es., ‘FABIO’ è una costante string  5,‘+’ è una costante string  1 e ‘124’ string  3 La pseudocodifica  3

81 81 Dichiarazione delle variabili var La dichiarazione delle variabili è un elenco, preceduto dalla parola var, delle variabili sulle quali l’algoritmo opera Le variabili sono suddivise per tipo: quelle dello stesso tipo sono separate l’una dall’altra da una “,”; l’elenco delle variabili dello stesso tipo è seguito dai “:” e dall’indicazione del tipo; gli elenchi di variabili di tipo diverso sono separati dal “;”, l’ultimo elenco è seguito da un “.” Esempio Esempio: varinteger var i, j, a(20): integer; real p, q: real; string  20 nome: string  20; boolean sw: boolean. La pseudocodifica  4

82 82 Descrizione delle azioni Gli schemi di flusso fondamentali sono descritti utilizzando convenzioni linguistiche: ad ogni schema di composizione corrisponde una convenzione linguistica La descrizione di un algoritmo deve soddisfare le seguenti regole: begin a)La prima azione dell’algoritmo è preceduta dalla parola begin; end b)L’ultima azione dell’algoritmo è seguita dalla parola end; read c)L’azione di lettura è rappresentata dalla parola read; write d)L’azione di scrittura è rappresentata dalla parola write; e)Lo schema di sequenza di n flussi S 1, S 2,…, S n è rappresentato da S 1 ; S 2 ; S n ; La pseudocodifica  5 …

83 83 f)Gli schemi di selezione sono rappresentati come: g)Gli schemi di iterazione sono rappresentati come: La pseudocodifica  6 S, S f, S v, sono schemi

84 84 Esistono convezioni linguistiche alternative in relazione a particolari schemi di flusso Esempio Esempio: Ciclo enumerativo La pseudocodifica  7 step forendfor Nel caso che il valore di “incremento” sia 1, la parte “step incremento” della frase for...endfor può essere omessa

85 85 Esempio Esempio: Algoritmo per il calcolo del vettore somma di due vettori di numeri razionali La pseudocodifica  8 var real var a(100), b(100), c(100) : real; integer i, n : integer. begin read read n ; forfromtodo for i from 1 to n do read read a(i), b(i) ; c(i)  a(i) + b(i) ; write write c(i) endfor end

86 86 Esempio Esempio: Algoritmo per il calcolo del massimo elemento di un vettore di numeri razionali La pseudocodifica  9 varreal var max, v(100) : real; integer i, n : integer.begin read read n ; forfromtodo for i from 1 to n do read read v(i) endfor max  v(1) ; for from todo for i from 2 to n do if if max < v(i) then then max  v(i) endif endfor write write maxend

87 87 La pseudocodifica  10 Esempio Esempio: Algoritmo per il calcolo delle radici di equazioni di 2° grado varreal var x1, x2, a, b, c, delta : real.begin read read a, b, c ; delta  b 2  4ac ; if if delta < 0 then write then write “non esistono radici reali” else if else if delta = 0 then then x1   b/2a ; x2  x1 else else x1  (  b +  delta)/2a ; x2  (  b   delta)/2a endif write write x1, x2 endif end

88 88 Introduzione ai linguaggi di programmazione di alto livello

89 89 Benché siano macchine in grado di compiere operazioni complesse, i calcolatori devono essere “guidati” per mezzo di istruzioni appartenenti ad un linguaggio specifico e limitato, a loro comprensibile set di istruzioni linguaggio macchina A livello hardware, i calcolatori riconoscono solo comandi semplici, del tipo “copia un numero”, “addiziona due numeri”, “confronta due numeri” : questi comandi definiscono il set di istruzioni della macchina e i programmi che li utilizzano direttamente sono i programmi in linguaggio macchina In linguaggio macchina ogni operazione richiede l’attivazione di numerose istruzioni base (il linguaggio riflette l’organizzazione della macchina più che la natura del problema da risolvere); inoltre, qualunque entità  istruzioni, variabili, dati  è rappresentata da numeri binari: i programmi sono difficili da scrivere, leggere e mantenere Cenni storici  1

90 90 assembly assembler Negli anni `50, tutti i programmi erano scritti in linguaggio macchina o in assembly (o assembler) assembly In assembly ogni istruzione è identificata da una sigla piuttosto che da un numero e le variabili sono rappresentate da nomi piuttosto che da numeri Esempio Esempio: carica il numero 8 nel primo registro libero della CPU LOAD  LOAD 8 assemblatore I programmi scritti in assembly necessitano di un apposito programma assemblatore per tradurre le istruzioni tipiche del linguaggio in istruzioni macchina Cenni storici  2 Assembly Linguaggio macchina Codice istruzione

91 91 Cenni storici  3 L’assembly definisce una notazione simbolica che è in stretta relazione con i codici in linguaggio macchina LOAD R1, MEM1 CMP R1, R2 BEQ RISZERO STORE R1, MEM1 RISZERO: LOAD R2, MEM2 Assemblatore OPCODE (LOAD) registro

92 92 linguaggi di alto livello Oggi si utilizza l’assembly solo se esistono vincoli stringenti sui tempi di esecuzione; viceversa si usano linguaggi più vicini al linguaggio naturale, i linguaggi di alto livello I linguaggi di alto livello sono elementi intermedi di una varietà di linguaggi ai cui estremi si trovano il linguaggio macchina, da un lato, ed i linguaggi naturali, come l’italiano e l’inglese, dall’altro Cenni storici  4 I linguaggi di programmazione, progettati per manipolare informazioni, differiscono dai linguaggi naturali: sono infatti meno espressivi ma più precisi (non ambigui)

93 93 I linguaggi di programmazione di alto livello consentono al programmatore di trattare oggetti complessi senza doversi preoccupare dei dettagli della particolare macchina sulla quale il programma viene eseguito compilatoreinterprete Richiedono un compilatore o un interprete che sia in grado di tradurre le istruzioni del linguaggio di alto livello in istruzioni macchina di basso livello eseguibili dal calcolatore Un compilatore è un programma “simile” ad un assemblatore, ma più complesso, infatti… esiste una corrispondenza biunivoca fra istruzioni in assembler ed istruzioni macchina ogni singola istruzione di un linguaggio di alto livello corrisponde a molte istruzioni in linguaggio macchina: quanto più il linguaggio di programmazione si discosta dal linguaggio macchina, tanto più il lavoro di traduzione del compilatore è difficile Scopi e caratteristiche  1

94 94 Scopi e caratteristiche  2 Esempio PASCAL Esempio: In PASCAL, l’assegnazione e := (a+b)  (c+d) ; calcola l’espressione e, ottenuta eseguendo una serie di operazioni aritmetiche sulle variabili a, b, c, e d, salvando opportunamente il risultato nella posizione di memoria etichettata da e ; in linguaggio assembly la stessa istruzione potrebbe essere riscritta nel modo seguente: LOAD LOAD a, %r0 LOAD LOAD b, %r1 ADD ADD %r0, %r1 LOAD LOAD c, %r2 LOAD LOAD d, %r3 ADD ADD %r2, %r3 MULT MULT %r1, %r3 STORE STORE %r3, e

95 95 I linguaggi che non dipendono dall’architettura della macchina offrono due vantaggi fondamentali: i programmatori non devono cimentarsi con i dettagli architetturali di ogni calcolatore i programmi risultano più semplici da leggere e da modificare portabilitàleggibilitàmantenibilità  portabilità, leggibilità, mantenibilità Scopi e caratteristiche  3

96 96 Scopi e caratteristiche  4 Portabilità Portabilità: i programmi scritti per un calcolatore possono essere utilizzati su qualsiasi altro calcolatore, previa ricompilazione Leggibilità Leggibilità: la relativa similitudine con i linguaggi naturali rende i programmi più semplici, non solo da scrivere, ma anche da leggere Mantenibilità Mantenibilità: con questo termine si intende far riferimento a modifiche di tipo correttivo, perfettivo, evolutivo e adattivo; i programmi scritti in linguaggi di alto livello sono più semplici da modificare e da correggere analisi di correttezza La possibilità di codificare algoritmi in maniera astratta si traduce in una migliore comprensibilità del codice e quindi in una più facile analisi di correttezza astrazione L’essenza della programmazione di alto livello, ovvero dell’uso di linguaggi di elevata potenza espressiva, risiede nella capacità di astrazione, cioè nella possibilità di prescindere dai dettagli considerati inessenziali ai fini della soluzione di un problema, favorendo con ciò la concentrazione sugli elementi fondamentali. Un linguaggio di programmazione deve fornire all'utente buoni meccanismi per definire autonomamente tutte le astrazioni di cui ha bisogno: il programmatore, deve disporre di strumenti sufficienti per spiegare al calcolatore tutte le operazioni che intende effettuare. La funzione svolta da un programma ben strutturato in un linguaggio di programmazione di alto livello può essere facilmente compresa da un lettore: i simboli e le istruzioni utilizzate si avvicinano più ai simboli ed alle istruzioni di uso comune che non a quelle interne del calcolatore. astrazione L’essenza della programmazione di alto livello, ovvero dell’uso di linguaggi di elevata potenza espressiva, risiede nella capacità di astrazione, cioè nella possibilità di prescindere dai dettagli considerati inessenziali ai fini della soluzione di un problema, favorendo con ciò la concentrazione sugli elementi fondamentali. Un linguaggio di programmazione deve fornire all'utente buoni meccanismi per definire autonomamente tutte le astrazioni di cui ha bisogno: il programmatore, deve disporre di strumenti sufficienti per spiegare al calcolatore tutte le operazioni che intende effettuare. La funzione svolta da un programma ben strutturato in un linguaggio di programmazione di alto livello può essere facilmente compresa da un lettore: i simboli e le istruzioni utilizzate si avvicinano più ai simboli ed alle istruzioni di uso comune che non a quelle interne del calcolatore.

97 97 riduzione di efficienza Eventuale svantaggio dell’uso dei linguaggi di alto livello è la riduzione di efficienza: È possibile utilizzare istruzioni macchina diverse per scrivere programmi funzionalmente equivalenti: il programmatore ha un controllo limitato sulle modalità con cui il compilatore traduce il codice Tuttavia… i compilatori attuali ricorrono a trucchi di cui molti programmatori ignorano l’esistenza La ragione fondamentale per decretare la superiorità dei linguaggi di alto livello consiste nel fatto che la maggior parte dei costi di produzione del software è localizzata nella fase di manutenzione, per la quale la leggibilità e la portabilità sono cruciali Scopi e caratteristiche  5

98 98 Un esempio di programma PASCAL Problema run  time Problema: Si legga una lista di valori, la cui lunghezza non è nota a priori (è un dato in ingresso), stampando un opportuno messaggio se un certo valore, anch’esso letto a run  time, appartiene o non appartiene alla lista “trovato un numero uguale ” Falso leggi ncorr trovato  FALSE i  1 begin Falso ncorr = ncomp Vero leggi n, ncomp i  i+1 trovato  TRUE i  n Vero trovato = TRUE “non trovato un numero uguale ” Vero Falso end

99 99 PROGRAM PROGRAM Search(input,output); (* Ricerca di un valore desiderato in una lista *)VAR INTEGER n : INTEGER; (* lunghezza della lista *) INTEGER ncomp : INTEGER; (* termine di paragone *) INTEGER ncorr : INTEGER; (* valore nella lista *) BOOLEAN trovato : BOOLEAN; (* TRUE se si è trovato *) INTEGER i : INTEGER; (* contatore dei valori della lista *)BEGIN READ READ( n ); WRITELN WRITELN(‘Ci sono’, n, ‘valori.’); READ READ( ncomp ); WRITELN WRITELN(‘Ricerca di’, ncomp, ‘.’); FALSE trovat o := FALSE; (* non ancora trovato alcun valore *) FORTODO FOR i = 1 TO n DO BEGIN BEGIN READ READ( ncorr ); WRITELN WRITELN( ncorr ); IF IF ncorr = ncomp THENTRUE THEN trovato := TRUE; (* trovato un valore uguale *) END END (* fine ciclo for *) IF IF trovato THEN WRITELN THEN WRITELN (‘Trovata corrispondenza’) ELSE WRITELN ELSE WRITELN (‘Non trovata corrispondenza’); END END (* fine programma Search *)

100 100 Schema di iterazione: Schema di iterazione: si itera l’esecuzione di un dato schema di flusso Nel primo caso, S può non venire mai eseguito, se la condizione C è subito falsa; nel secondo caso, S viene eseguito almeno una volta iterazione per veroiterazione per falso Quando lo schema S viene eseguito finché la condizione C si mantiene vera si parla di iterazione per vero; si ha un’iterazione per falso quando S viene eseguito finché C è falsa Schemi di composizione  3

101 101 Gli algoritmi iterativi  1 Note Note: somma La variabile somma è un contenitore di somme parziali, finché non si ottiene la somma totale richiesta La soluzione del problema viene raggiunta eseguendo azioni simili per un numero opportuno di volte Accade spesso che, per risolvere un problema, un certo insieme di operazioni debba essere eseguito un dato numero di volte Esempio Esempio: Calcolare la somma di tre interi consecutivi

102 102 Affinché un elenco di istruzioni, possa essere considerato un algoritmo, devono essere soddisfatti i seguenti requisiti: Finitezza: Finitezza: ogni algoritmo deve essere finito, cioè composto da un numero finito di istruzioni, ciascuna delle quali deve essere eseguita in tempo finito ed un numero finito di volte Generalità: insieme di definizionedominio dell’algoritmo insieme di arrivo codominio Generalità: ogni algoritmo deve fornire la soluzione per una classe di problemi; deve pertanto essere applicabile a qualsiasi insieme di dati appartenenti all’insieme di definizione o dominio dell’algoritmo e deve produrre risultati che appartengono all’insieme di arrivo o codominio Non ambiguità: Non ambiguità: devono essere definiti in modo chiaro i passi successivi da eseguire; devono essere evitati paradossi, contraddizioni ed ambiguità; il significato di ogni istruzione deve essere univoco per chiunque esegua l’algoritmo Inoltre sono importanti la correttezza e l’efficienza di un algoritmo Proprietà degli algoritmi

103 103 Sintassi La condizione è sempre un'espressione di tipo booleano (VERO/FALSO). Il ramo ELSE (corrispondente all'alternativa falsa) può essere omesso. If condizione Then Istruzione1 Istruzione2 ……….. Else istruzioni End If Esempio: If valore > 0 Then Label1.Caption= "Il valore è positivo“ Else Label1.Caption= "Il valore è minore o uguale a zero“ End If

104 104 Il ciclo con controllo alla fine Do istruzioni Loop Until condizione (La condizione è una espressione di tipo booleano). Esempio: Somma di N numeri Dim numero, somma As Single Do numero = Val(InputBox("Inserisci un numero (zero per finire)", "Inserimento")) somma = somma + numero Loop Until numero = 0 Label1.Caption = CStr(somma)

105 105 Il ciclo con controllo all'inizio Do While condizione Istruzioni Loop (La condizione è una espressione di tipo booleano). Esempio: Somma N numeri Dim numero, somma As Single Do While numero <> -1 numero = Val (InputBox("Inserisci un numero (-1 per finire)", "Inserimento")) somma = somma + numero Loop Label1.Caption = CStr(somma)

106 106 Compiti del Programmatore Analizzare il problema riducendolo in termini astratti, eliminando ogni componente non indispensabile e formulando un modello del problema. Individuare una strategia risolutiva e ricondurla ad un algoritmo. Codificare l’algoritmo in modo tale da renderlo comprensibile al calcolatore (programma). Analizzare il risultato dell’elaborazione evidenziando eventuali errori nella formulazione del problema, nella strategia risolutiva, nella codifica dell’algoritmo (debugging, errori di sintassi o logici)

107 107 Definizione di Algoritmo corretto Un algoritmo è corretto se perviene alla soluzione del compito cui è preposto efficiente Un algoritmo è efficiente se perviene alla soluzione del problema nel modo più veloce possibile e/o usando la minor quantità di risorse fisiche (memoria, tempo di esecuzione, ecc.) Gli algoritmi devono essere formalizzati per mezzo di un linguaggio di programmazione, dotato di precise strutture linguistiche (sintassi e semantica)

108 108 Il ciclo con contatore FOR For contatore = minimo To massimo Istruzioni Next (La variabile contatore è sempre di tipo numerico intero) Esempio Dim cont As Integer For cont = 1 To 10 Print "Il valore di CONT è: " + CStr(cont) Picture1.Print "Il valore di CONT è: " + CStr(cont) ‘con PictureBox Next

109 109 Cicli

110 110 maggiore

111 111 Problema: Problema: Calcolo delle radici reali dell’equazione di secondo grado ax 2 +bx+c=0Algoritmo: 1) Acquisire i coefficienti a, b, c 2) Calcolare  = b 2  4ac 3) Se  <0 non esistono radici reali, eseguire l’istruzione 7) 4) Se  = 0, x 1 = x 2 =  b/2a, poi eseguire l'istruzione 6) 5) Calcolare x 1 = (  b +  )/2a x 2 = (  b  )/2a 6) Comunicare i valori x 1, x 2 7) Fine Esempio  Radici di equazioni di 2 ° grado

112 112 Problema: Problema: Calcolo delle radici reali dell’equazione di secondo grado ax 2 +bx+c=0Algoritmo: 1) Acquisire i coefficienti a, b, c 2) Calcolare  = b 2  4ac 3) Se  <0 non esistono radici reali, eseguire l’istruzione 7) 4) Se  = 0, x 1 = x 2 =  b/2a, poi eseguire l'istruzione 6) 5) Calcolare x 1 = (  b +  )/2a x 2 = (  b  )/2a 6) Comunicare i valori x 1, x 2 7) Fine Esempio  Radici di equazioni di 2 ° grado

113 113 I diagrammi a blocchi Diagramma a blocchi dell’algoritmo per il calcolo delle radici dell’equazione di 2° grado ax 2 + bx + c = 0 fine Leggi a,b,c delta  b 2  4ac delta=0 delta<0 x 2  (  b  sqrt(delta))/2a x 1  (  b+sqrt(delta))/2a x 2   b/2a x 1   b/2a scrivi x 1 e x 2 scrivi “non ci sono radici reali” inizio Vero Falso Vero Falso Algoritmo (pseudocodifica): 1. Acquisire i coefficienti a,b,c 2. Calcolare  = b2  4ac 3. Se  <0 non esistono radici reali, eseguire l’istruzione 7 4. Se  = 0, x1= x2 =  b / 2a, poi eseguire l'istruzione 6 5. Calcolare x1 = (  b +  ) / 2a Calcolare x2 = (  b  ) / 2a 6. Stampare i valori x1, x2 7. Fine


Scaricare ppt "1 Dal problema all’ algoritmo. 2 Analisi e programmazione Tramite un elaboratore si possono risolvere problemi di varia natura. Il problema deve essere."

Presentazioni simili


Annunci Google