Fondamenti di Informatica Algoritmi Programmi Linguaggi Problema Algoritmo Linguaggio Programma Programma in C Esempi di problema Tizio deve calcolare l’irpef da pagare Caio deve ordinare il materiale per un certo lavoro Dimensionare le travi per l’edificio B Trovare il telefono di un ristorante in centro Aggiornare l’agenda….. problema Un problema si applica a dati ben precisi Usa eventuali normative disponibili Richiede di individuare un metodo per la risoluzione … Il computer può aiutare a risolvere il problema? Per risolvere un problema: Occorre dei rappresentare le informazioni (struttura dati) Occorre rappresentare il metodo risolutivo (algoritmo) Dobbiamo usare un linguaggio comprensibile all'elaboratore, e scrivere una sequenza di istruzioni (= programma) del linguaggio scelto. La granularità delle operazioni dipende dal linguaggio Spesso la soluzione non si può ottenere con una semplice sequenza di passi ma richiede di ripetere alcuni passi o di prendere strade diverse per diverse situazioni. Algoritmo Insieme di regole o direttive atte a fornire una risposta specifica ad uno o piu' dati in input. Questo termine deriva dal nome del matematico persiano Abu Ja'far Mohammed ibn Mâsâ alKhowârizmî (825 d.C.). Introdusse nel mondo arabo i numeri indiani. Compose il trattato Al-giabr wa'l mu kabala (Del modo di assestare cose opposte) da cui deriva la parola algebra. Stesura di algoritmo Linguaggi diversi per scrivere algoritmi Grafico: Input test Testo: Chiedi il numero di partita IVA fino a che ci sono spese registrale Output valore PROBLEMA -> SOLUZIONE inventare l'algoritmo. Il metodo di soluzione di solito non compare nella formulazione del problema. Proprieta' dell'algoritmo: 1 non ambiguita' - le istruzioni devono essere univocamente interpretabili 2. eseguibilita' - l’esecutore deve essere in grado di eseguire ogni istruzione in un tempo finito 3. finitezza - l’esecuzione dell’algoritmo deve terminare in un tempo finito per ogni ingresso Spesso l’algoritmo si ottiene ragionando per livelli di astrazione Esempio: cercare nella guida telefonica 1. apriamo l'elenco in un punto vicino a quello in cui dovrebbe trovarsi il cognome 2. se e' prima del punto in cui siamo, torniamo indietro; se e' dopo andiamo avanti, fino ad arrivare alla pagina che ci interessa 3. eseguiamo una ricerca sequenziale nella pagina fino a trovare il cognome o scoprire che non esiste 4. fine Il metodo risolutivo dipende dalla struttura dei dati: ad es. se eseguiamo la ricerca in una agenda personale il metodo e’ diverso Cercare in una agenda 1. apriamo l'agenda alla prima pagina che porta come etichetta le lettere dell’alfabeto fra cui esiste l’iniziale del cognome (o nome se cosi’ organizziamo l’agenda) 2. eseguiamo una ricerca sequenziale nelle pagine fino a trovare il cognome o scoprire che non esiste se le pagine corrispondenti a quel gruppo di lettere finiscono fine Dal problema all’algoritmo (parametrizzazione) cercare il numero di telefono di Mario Rossi e di Antonio Neri richiede di eseguire esattamente le stesse istruzioni. Perciò il nome da ricercare e’ un dato del problema; non e’ codificato direttamente nel programma ma viene acquisito in fase di esecuzione. Ipotizziamo di avere un contenitore (memoria) in cui depositare il nome che verrà fornito di volta in volta. Dovremo usare nel programma un nome fittizio, che ci indichi dove è memorizzato il nome da ricercare. Questo e’ il concetto di variabile. problema -> algoritmo-> programma Problema (istanza di una funzione): calcolare la media dei miei 4 voti : 30, 25, 26, 28. Metodo di soluzione: sommo i 4 voti -> (30+25+26+28) = 109 poi divido il risultato per 4 -> 109/4 = 27,25 Algoritmo (calcola la funzione): crea un contatore somma per costruire la somma degli n numeri, ponilo a 0, per ogni voto aggiungilo a somma, dividi somma per n Programma codifica l’algoritmo nel linguaggio scelto Quanti algoritmi? ESEMPIO : MCD 1. Calcola l’insieme I dei divisori di m 2. Calcola l’insieme J dei divisori di n 3. Calcola K, l’insieme intersezione fra I e J 4. Trova il massimo di K 5. MCD e’ il massimo trovato ogni passo va a espanso; ad esempio calcolare il massimo di un insieme di lunghezza nota Scegli un elemento come max_provvisorio per ogni elemento i dell’insieme I se i>max_provvisorio allora eleggi i a max_ provvisorio. Per ottenere un programma: Occorre rappresentare le informazioni e il metodo risolutivo (algoritmo) Dobbiama usare un linguaggio comprensibile all'elaboratore, e scrivere una sequenza di istruzioni (= programma) del linguaggio scelto. Spesso la soluzione non si puo’ ottenere con una semplice sequenza di passi ma richiede di ripetere alcuni passi o di prendere strade diverse per diverse situazioni. Il linguaggio naturale Noam Chomsky - Comprendere i linguaggi naturali la capacità che ogni essere umano ha di capire e produrre frasi nella sua lingua è dovuta ad un insieme di conoscenze implicite presenti nella sua mente: la competenza linguistica. tale competenza è almeno in parte inconsapevole. la maggior parte di questa competenza deve essere innata: non si spiegherebbe la velocità con cui un bambino riesca a parlare una lingua imitando chi lo circonda. Linguaggi formali i linguaggi formali possono essere assunti come veicolo di descrizione scientifica dei linguaggi naturali (storici), ma non possono essere considerati essi stessi il modello dei linguaggi naturali. Linguaggi di programmazione (artificiali) sintassi - si occupa della forma della frase, cioe’ delle regole per la sua costruzione - ci sono delle regole formali che consentono di verificare se una sentenza appartiene al linguaggio semantica - e’ il significato che si attribuisce alla frase, quindi alle istruzioni del programma. Diversi linguaggi sviluppati, nessuno è universale Classificazione dei linguaggi Imperativi (FORTRAN, PASCAL, C, Python…) Funzionali (Scheme, LISP, …) Logici (Prolog, …) A regole (OPS, …) A vincoli (Prolog III, …) Il linguaggio C ideato nei Bell Laboratories della AT&T nel 1972 da Dennis Ritchie come evoluzione del B di Ken Thompson, usato per la scrittura dei primi sistemi operativi UNIX. Il C viene classificato come linguaggio ad alto livello: la scrittura delle istruzioni è indipendente dall'architettura del calcolatore. Però è molto vicino all'hardware: si basa su poche istruzioni che spesso ricalcano l'assembler; riserva un ruolo centrale al concetto di puntatore, che viene generalizzato fino a concidere con l'indirizzamento indiretto rispetto al linguaggio assembler, il C ha in più il controllo sui tipi. Nel 1983, l' American National Standards Institute (ANSI) formò un comitato per stabilire le specifiche standard del C. ANSI C venne adottato dall' International Organization for Standardization (ISO) con il nome di ISO/IEC 9899:1990. Il C flessibilità ed universalità di applicazioni soppianta i linguaggi assembler (ad esempio per la scrittura di sistemi operativi) è un linguaggio imperativo introduce alcuni concetti di astrazione Astrazione sui dati La memoria è composta da un insieme di celle che possono contenere sequenze di bit (1 e 0) e possono essere modificate Esempio: 10011011 rappresenta un simbolo dell’alfabeto tipo di dato: L’informazione memorizzata nelle celle di memoria è vista non come sequenza anonima di bit, ma come valori di un tipo: interi, reali, carattere Ad ogni cella (gruppo di celle) può essere associato un nome simbolico - variabile. Ogni variabile è caratterizzata dal tipo di dato che può memorizzare. La memoria principale 0 1 2 3 4 Ciascuna cella è caratterizzata da un indirizzo Gli indirizzi corrispondono all’ordinamento delle celle nella sequenza Gli Gli indirizzi sono interi positivi indirizzi non sono scritti da nessuna parte, sono solo determinati dall’ordinamento consecutivo Astrazione sui comandi Anche i comandi vengono rappresentati come sequenze di bit (0 e 1) Es. incrementa di 1 il contenuto della cella 11000010 Il processore fornisce due meccanismi base per eseguire i comandi l’elaborazione il in sequenza salto 00101101 10101100 00110101 01111101 ... Aspetto dichiarativo e procedurale in C I dati Le istruzioni (programmi Sono rappresentati nello stesso modo nella macchina ma sono diversi in C; I dati sono letti, scritti, usati in espressioni, … I programmi sono compilati ed eseguiti Ciclo di produzione del software Creazione del codice: editor ASCII generici o dedicati Compilazione: Miofile.c compilatore dal codice al file .obj controllo sintattico controllo lessicale controllo semantico ottimizzazione Link: Miofile.obj linker collegamento con le funzioni di libreria generazione del file eseguibile .exe dati computer Miofile.exe