Dal problema al programma Concetti fondamentali dell’informatica: Analisi - Algoritmo - Programma
Definizione di problema Un problema è un quesito nel cui enunciato si forniscono i dati necessari per giungere, mediante calcoli o elaborazioni, alla soluzione richiesta nell’enunciato stesso. Dal punto di vista informatico, risolvere un problema significa ricercare ed esprimere un elenco di istruzioni, ”algoritmo”, che interpretate da un esecutore, conducono da determinate informazioni iniziali (dati di input) a delle informazioni finali (risultati output). Uno degli scopi fondamentali dell’informatica è la risoluzione di problemi, in modo automatico da un calcolatore.
Definizione di problema In sintesi possiamo dire che: Chiamiamo problema una qualsiasi situazione per cui è necessario elaborare una strategia per identificare una sua soluzione. Esempi: Individuare la strada più corta per arrivare a scuola. Disporre una lista di nomi in ordine alfabetico. Calcolare l’area di un rettangolo conoscendo le dimensioni. Preparare una ricetta.
Comprendere il problema Un problema è formato dai seguenti elementi: Dati di input/ingresso, dati noti iniziali, sui quali basare la soluzione del problema. Eventuali vincoli sui dati: pre-condizioni. Dati calcolati in output o risultati, sono i dati che vogliamo ottenere. Le condizioni sono in generale le limitazioni a cui sono sottoposti i dati di input o i dati di output. Esempio problema: calcolare la somma di due numeri. Dati di input A=2 B=3 Dati di output Somma=5 Risolutore
Le specifiche di un problema Insieme di ingresso o parametri I parametri del problema. L’insieme di ingresso è suddiviso in un insieme di dati di ingresso ( o un insieme di oggetti di ingresso). Pre-condizione Condizione relativa all’insieme di ingresso. Descrive le proprietà soddisfatte dai dati di ingresso e dagli oggetti di ingresso (considerati nel loro stato iniziale).
La specifica di un problema Insieme di uscita o risultati Le informazioni che devono essere calcolate nella risoluzione del problema. L’insieme di uscita è suddiviso in dati di uscita (o oggetti di uscita). Post-condizione Condizione relativa all’insieme di uscita. Descrive le proprietà soddisfatte dai dati di uscita dallo stato finale degli oggetti coinvolti dal problema, anche con riferimento ai dati di ingresso e allo stato iniziale degli oggetti di ingresso.
Entità coinvolte Nel processo di risoluzione di un problema, sono generalmente coinvolte le seguenti entità: Committente: colui che pone il quesito. Risolutore: colui che mette a punto l’algoritmo stabilendo quali calcoli e/o elaborazioni sono necessarie per ottenere i risultati richiesti. Esecutore: chi, uomo o macchina, esegue l’algoritmo. Utente: chi fornisce i dati iniziali all’esecutore e attende i risultati.
Fasi che ci portano alla soluzione di un Problema Esecuzione Verifica dei Risultati Procedimento Risolutivo Interpretazione Modello
Fasi che ci portano alla soluzione di un Problema Per compiere l’analisi di un problema il risolutore deve svolgere una attività creativa nella ricerca della risoluzione del problema: Interpretare e comprendere l’enunciato del problema e definire gli obiettivi da realizzare. Individuare i dati del problema e costruire un modello opportuno, algoritmo(modello: è una rappresentazione degli aspetti che conducono alla soluzione del problema). Descrivere il procedimento risolutivo individuando le operazioni da compiere sui dati iniziali per ottenere i risultati finali. Eseguire nell’ordine le operazioni descritte nel processo risolutivo (il risolutore in questa fase è detto esecutore). Verificare se i risultati ottenuti rispondono alle finalità del problema reale (attendibilità).
Strategie per la risoluzione dei problemi La prima fase dell’analisi di un problema, ossia la definizione dell’obiettivo da raggiungere, può essere realizzata attraverso processi di analisi sempre più dettagliati. Si tratta di scomporre un problema complesso in sotto-problemi più semplici, utilizzando la tecnica del top-down: Il problema viene esaminato nelle direttrici generali; Scomposto in sotto-problemi; Di ciascun sotto-problema si determinano le operazioni specifiche; Esso viene scomposto in ulteriori sotto-sotto-problemi, fino a giungere alle operazioni elementari. Implementare l’algoritmo in un linguaggio di programmazione.
Definire un procedimento risolutivo Implementare l’algoritmo: Un algoritmo è una sequenza di istruzioni che, se eseguite ordinatamente, permettono di risolvere un certo problema. Gli algoritmi vengono scritti mediante un linguaggio per esprimere algoritmi basato sull’uso di un numero limitato di tipologie di istruzioni (chiamato pseudo-codice). La progettazione degli algoritmi avviene solitamente per raffinamenti successivi, in cui i passi di un algoritmo vengono descritti via via con maggior dettaglio. la verifica delle qualità di un algoritmo (in particolare, la correttezza e l’efficienza).
Definizione di algoritmo L’insieme dei comandi che definiscono una sequenza finita di azioni/operazioni da eseguire mediante le quali si risolve uno o una classe di problemi, e al termine genera un risultato, prende il nome di algoritmo. Le principali caratteristiche di un algoritmo sono: Finito, costituito cioè da un numero finito di passi. Definito, ogni istruzione deve consentire un’interpretazione univoca; Eseguibile, cioè la sua esecuzione deve essere possibile con gli strumenti di cui si dispone; Deterministico, ad ogni passo deve essere definita una ed una sola operazione successiva. Analista Programmatore Problema Algoritmo Programma
Un algoritmo per un problema è.. Una sequenza di istruzioni che permette di far evolvere gli oggetti di interesse da uno stato iniziale che soddisfa la pre- condizione a uno stato finale che soddisfa la post-condizione Sulla base di eventuali ulteriori dati di ingresso. Calcolando eventuali dati in uscita. Ciascuna istruzione deve poter essere eseguita dall’esecutore in tempo finito. Linguaggio per scrivere algoritmi: Diagramma a blocchi. Pseudo codifica.
I Diagrammi a Blocchi. Tra le tecniche utilizzate per rappresentare in maniera chiara e sintetica la struttura degli algoritmi, quella del Diagramma a Blocchi ,anche detto flow-chart, ha il pregio di evidenziare visivamente l’avanzamento in sequenza e le varie strutture che compongono l’algoritmo. I Blocchi elementari per costruire un flow-chart Esempio di un diagramma a blocchi per la risoluzione di un problema START Start / End Leggi Numero(A) Input / Output Resto = A / 2 Operazioni V Resto = 0 F Test Stampa è pari Stampa è dispari Frecce direzionali END
Pseudo codifica Un algoritmo può essere rappresentato anche mediante un linguaggio speciale che descrive le istruzioni e la logica di avanzamento dell’esecuzione con frasi (stringhe) anziché con un diagramma. Si parla in tal caso di pseudo codifica o notazione lineare strutturata. Tale linguaggio formale, non è un linguaggio di programmazione ma è molto sintetico ed è composto da un vocabolario e una sintassi molto ristretta, utilizzando termini o parole del linguaggio comune, applicando però una serie di regole. Esempio di Parole utilizzate: INIZIO / FINE; IMMETTI o INSERISCI SCRIVI o STAMPA CALCOLA oppure +, -, *, /, =, ecc. SE, ALLORA, ALTRIMENTI ESEGUI MENTRE, RIPETI, RIPETI MENTRE PER, DA, A Esempio di pseudo codifica: INIZIO SCRIVI "Inserisci un numero intero n" INSERISCI n (dall'utente) SE (il resto di n/2 è = 0) ALLORA SCRIVI "Il numero è pari" ALTRIMENTI SCRIVI "Il numero è dispari". FINE
Definizione di programma I computer funzionano seguendo una lista di istruzioni, chiamata programma, che è stato scritto per svolgere un particolare compito. Si dice programma la rappresentazione della sequenza di istruzioni di un algoritmo, espresse in un linguaggio formale (linguaggio di programmazione). In generale, ogni linguaggio di programmazione dispone di un insieme di ”parole chiave” (keywords), attraverso le quali è possibile esprimere il flusso di azioni descritto dall'algoritmo. Ogni linguaggio è caratterizzato da una sintassi e da una semantica: Sintassi: è l'insieme di regole formali per la composizione di programmi nel linguaggio scelto. Le regole sintattiche dettano le modalità di combinazione tra le parole chiave del linguaggio, per costruire correttamente istruzioni. Semantica: è l'insieme dei significati da attribuire alle frasi (sintatticamente corrette) costruite nel linguaggio scelto.
Concetti fondamentali dei linguaggi di programmazione Funzionalità di input/output dati attraverso i cosiddetti canali standard (standard input, standard output). Variabile e costante: un dato o un insieme di dati, noti o ignoti, già memorizzati o da memorizzare; Espressione: una combinazione di variabili e costanti, unite da operatori; Strutture dati, meccanismi che permettono di organizzare e gestire dati complessi. Strutture di controllo, che permettono di governare il flusso di esecuzione del programma, alterandolo in base al risultato o valutazione di una espressione. Sottoprogramma: un blocco di codice che può essere richiamato da qualsiasi altro punto del programma. Possibilità di inserire dei commenti sul codice scritto.
Esempio Algoritmo Consideriamo il seguente semplice problema: Si vuole leggere dalla tastiera una coppia di numeri A e B, calcolarne la somma e visualizzarla sullo schermo. Diagramma di flusso Pseudo codifica Analisi: lettura e somma di due numeri interi. Dati di ingresso Una coppia di numeri interi, A e B. Pre-condizione Nessuna. Dati di uscita Un numero S Post-condizione S è la somma di A e B. START INIZIO Leggi (Input dalla tastiera) i due numeri interi A e B calcola la somma di A e B S=A+B Visualizza il risultato della somma S (Output sullo schermo) FINE Inserimento A e B Esegue la somma di A e B STAMPA la somma END
Dall’algoritmo al programma Esempi di codifica Codifica in linguaggio Scratch Codifica in linguaggio Pascal Program sommanumeri; uses crt; var A,B,S: integer; begin writeln ('Inserisci il primo numero:'); readln (A); writeln ('Inserisci secondo numero:'); readln (B); S:= A + B; writeln ('Il risultato è ',S,''); readln; end.
Altre codifiche Codifica in linguaggio C Codifica in linguaggio C++ #include <stdio.h> int main() { int somma; int A,B,S; printf("Inserisci il primo numero: "); scanf("%d", &A); printf("Inserisci il secondo numero: "); scanf("%d", &B); S = A + B; printf(”Il risultato è : %d \n", S); return 0; } #include <iostream> using namespace std; int main() { int A,B,S; cout << "Inserisci il primo numero: "; cin >> A; cout << "Inserisci il secondo numero: "; cin >> B; S=A+B; cout << "il risultato è : " << S << endl; system("pause"); }
Codifica in linguaggio Altre codifiche Codifica in linguaggio Java import java.util.Scanner; public class Sommanumeri { public static void main(String[] args){ int S = 0, A, B; Scanner inputNumScanner = new Scanner(System.in); System.out.println("Inserisci il primo numero: "); A = inputNumScanner.nextInt(); System.out.println("Inserisci il secondo numero: "); B = inputNumScanner.nextInt(); S = A + B; System.out.println("Il risultato è = " + S); }
Esempio Algoritmo 2 Consideriamo il seguente semplice problema: Si vuole leggere dalla tastiera un numero intero N, e verificare se è pari o dispari, visualizzare la risposta sullo schermo. START INIZIO Leggi (Input da tastiera) N Dividi N per 2 (Divisione intera) Resto = N / 2 Se Resto = 0 Allora Scrivi “N è pari” Altrimenti Scrivi “N è dispari” FINE Leggi Numero (N) Resto = N / 2 V Resto = 0 F Stampa è pari Stampa è dispari STOP
Esempi di codifica Codifica in linguaggio Scratch Codifica in linguaggio Pascal Program paridispari; uses crt; var N: integer; begin writeln('Inserisci un numero '); readln(n); if (N mod 2 =0) then writeln('Il numero è pari ') else writeln('Il numero è dispari '); readln; end.
Altre codifiche Codifica in linguaggio C Codifica in linguaggio C++ #include <stdio.h> int main() { int N; printf("Inserisci il numero: "); scanf("%d", &N); if (N%2==0) printf("Il numero è pari: \n"); else printf("Il numero è dispari: \n"); return 0; } #include <iostream> using namespace std; int main() { int N; cout << "Inserisci un numero: "; cin >> N; if (N%2 == 0) cout << "il numero è pari "<<endl; else cout << "il numero è dispari "<<endl; system("pause"); }
Codifica in linguaggio Altre codifiche Codifica in linguaggio Java import java.util.Scanner; public class Pari_Dispari { public static void main(String[] args){ int N; Scanner inputNumScanner = new Scanner(System.in); System.out.println("Inserisci un numero: "); N= inputNumScanner.nextInt(); if ((N%2) == 0) System.out.println("Il è pari"); else System.out.println("Il è dispari"); }
Esempio Algoritmo 3 Consideriamo il seguente semplice problema: Si vuole leggere dalla tastiera due numeri interi Op1 e Op2, realizzare il loro prodotto con il metodo delle somme successive, visualizzare il risultato sullo schermo. START INIZIO Leggi (Input da tastiera) Op1 prod = 0, i = 0 Ripeti fino a quando i<Op2 prod = prod + Op1 i = i + 1 fine ripeti Scrivi “il risultato è prod” FINE Leggi Numero (Op1) Leggi Numero (Op2) prod = 0; i = 0 i < Op2 F V Stampa prod prod = prod + Op1 STOP i = i + 1
Esempi di codifica Codifica in linguaggio Scratch Codifica in linguaggio Pascal Program SommeSuccessive; Uses Crt; Var Op1,Op2,i,prod: integer ; Begin clrscr; writeln('Inserisci il primo operando:'); readln(Op1); writeln('Inserisci il secondo operando:'); readln(Op2); p:=0; for i:=1 to Op2 do prod:=prod + Op1; writeln('Il risultato finale è:' ,prod); readln; end.
Altre codifiche Codifica in linguaggio C Codifica in linguaggio C++ #include<stdio.h> int main() { int Op1,Op2,i,prod; printf("inserisci il primo operando "); scanf("%d",&Op1); printf("inserisci il secondo operando "); scanf("%d",&Op2); prod=0; for(i=0;i<Op2;i++) prod=prod+Op1; } printf("il risultato finale e' : %d",prod); return 0; #include <iostream> using namespace std; int main() { int Op1, Op2, i, prod=0; cout<<"Inserisci il primo operando "; cin>>Op1; cout<<"Inserisci il secondo operando "; cin>>Op2; i=0; while(i<Op2) prod=prod+Op1; i++; } cout<<"Il risultato e' "<<prod<<endl; system("pause");
Codifica in linguaggio Altre codifiche Codifica in linguaggio Java import java.util.Scanner; public class Sommesuccessive { public static void main(String[] args){ int Op1,Op2,i,prod=0; Scanner inputNumScanner = new Scanner(System.in); System.out.println("Inserisci il primo operando: "); Op1 = inputNumScanner.nextInt(); System.out.println("Inserisci il secondo operando: "); Op2 = inputNumScanner.nextInt(); for(i=0;i<Op2;i++) prod=prod+Op1; System.out.println("Il risultato è = " + prod); }
Considerazioni Abbiamo visto come avviene il passaggio dall’algoritmo risolutore di un problema al corrispondente programma mediante la codifica in un linguaggio di programmazione. Si può notare come i linguaggi di programmazione differiscono tra di loro per la simbologia e per le regole sintattiche con cui si compongono le istruzioni. Tutti i linguaggi riproducono una stessa serie di operazioni, eseguibili dell’elaboratore, utilizzano una stessa tipologia di istruzioni.