IL PROBLEMA DEL PROGETTO

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

LINGUAGGIO DI PROGRAMMAZIONE C
Linguaggi algoritmici

Algoritmi e Programmazione
Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A CDL in Ingegneria Meccanica - A.A Tipi di dati Ing. Simona Colucci.
Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Tipi di dati Ing. Simona Colucci.
Strategie per la progettazione di algoritmi:
Anno accademico Gli operatori e le espressioni in C.
Il linguaggio C Gli operatori e le espressioni C Language
Fondamenti di Informatica I a.a Il linguaggio C Il preprocessore La sostituzione di macro Le compilazioni condizionali Linclusione di file C.
INFORMATICA typedef.
Programmazione Procedurale in Linguaggio C++
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Semantica Denotazionale
Semantiche dei linguaggi di programmazione
Iterazione enumerativa (for)
Algebra di Boole ed elementi di logica
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Assegnamento di valore a una variabile Anno Accademico 2009/2010.
Introduzione alla programmazione ll
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Fondamentidi Programmazione Corso: Fondamenti di Programmazione Classe: PARI-DISPARI Docente: Prof. Luisa Gargano Testo: Aho, Ulman, Foundations of Computer.
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
mosaic manipola oggetti primitivi (ruota e unisci) regole:
Strutture di controllo in C -- Flow Chart --
Dichiarazioni e tipi predefiniti nel linguaggio C
Fondamenti di Informatica A - Massimo Bertozzi TIPI DI DATO IN C++ What's in a name? That which we call a rose By any other name would smell as sweet.
Il Linguaggio C.
Espressioni condizionali
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
Java base I: Sintassi e tipi di dati
DEFINIZIONE DI NUOVE FUNZIONI & STRATEGIE DI COMPOSIZIONE La capacità di definire nuove funzioni permette: di definire nuove operazioni di introdurre variabili.
RAPPRESENTAZIONE DELL’INFORMAZIONE
INSIEMI NUMERABILI L’analisi matematica introduce il concetto di insieme numerabile come insieme i cui elementi possono essere “contati” ossia che possiede.
LA DOCUMENTAZIONE È noto che un buon programma dovrebbe essere ben documentato.. ma lesperienza insegna che quasi mai ciò viene fatto! –non cè tempo, ci.
L’AUTOMA ESECUTORE Un automa capace di ricevere dall’esterno una descrizione dello algoritmo richiesto cioè capace di interpretare un linguaggio (linguaggio.
LINGUAGGI DI PROGRAMMAZIONE
AN FI Un denominatoe comune Linguaggi di programmazione Un denominatore comune.
AN FI Un denominatoe comune Lo stile funzionale Concetti fondamentali.
Programmazione in Java
Javascript: fondamenti, concetti, modello a oggetti
JAVA Franco Bombi 8 ottobre FB Introduzione Java è un linguaggio di impiego generale, basato su classi e orientato agli oggetti Java.
CODIFICA Da flow-chart a C++.
BIOINFO3 - Lezione 201 Come in ogni corso di introduzione ad un linguaggio di programmazione, proviamo a scrivere lormai celebre primo programma di prova.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Tipi di dati semplici in C (1/3)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algebra di Boole ed elementi di logica Marco D. Santambrogio – Ver. aggiornata.
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
Introduzione a Javascript
Rappresentazione degli algoritmi
Rappresentazione dell’informazione nel calcolatore.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
Algoritmi e basi del C Struttura di un programma
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Progettazione di una base di dati Ciclo di vita di un sistema informativo Studio di fattibilità definisce le varie alternative possibili, i relativi costi.
STRUTTURA DI UN PROGRAMMA C In prima battuta, la struttura di un programma C è definita dalla seguente produzione: ::= { }
Rappresentazione dell'informazione 1 Se ho una rappresentazione in virgola fissa (es. su segno e 8 cifre con 3 cifre alla destra della virgola) rappresento.
La codifica dei numeri.
FI - Algoritmi e Programmazione 1 Variabili Consentono di aumentare notevolmente la potenza espressiva. Una variabile è caratterizzata da:  Un nome 
Conversione binario-ottale/esadecimale
Cloud informatica V anno. Introduzione a PHP Lo scripting PHP PHP è un linguaggio di scripting lato server. Le caratteristiche di un linguaggio di scripting.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
Informatica Problemi e algoritmi. una situazione che pone delle domande cui si devono dare risposte. Col termine problema o situazione problematica s’indica.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Transcript della presentazione:

IL PROBLEMA DEL PROGETTO

IL PROBLEMA DEL PROGETTO Come si costruisce la soluzione a un problema? Quali metodologie e tecniche usare? Come arrivare a intuire l’algoritmo che ci serve?

IL PROBLEMA DEL PROGETTO Due dimensioni progettuali: Programmazione in piccolo (in-the-small) Programmazione in grande (in-the-large) Principi cardine: procedere per livelli di astrazione garantire al programma strutturazione e modularità

IL PROBLEMA DEL PROGETTO La descrizione del problema, in genere, non indica direttamente il modo per ottenere il risultato voluto Occorrono metodologie per affrontare il problema del progetto in modo sistematico per superare la “sindrome del foglio bianco”

METODOLOGIE

METODOLOGIE Procede per decomposizione del problema in sotto-problemi, per passi di raffinamento successivi

METODOLOGIE Procede per composizione di componenti e funziona-lità elementari, fino alla sintesi dell’intero algoritmo (“dal dettaglio all’astratto”)

METODOLOGIA TOP-DOWN Si parte dal problema e dalle proprietà note sul dominio dei dati Si disgrega il problema in sottoproblemi Si affronta ciascun sottoproblema (con la stessa metodologia) fino a raggiungere problemi risolubili con le mosse elementari

IL PROBLEMA DEL PROGETTO Dunque, dato un problema... iniziare subito a scrivere il programma..? NO ! così si scrivono a fatica programmi di dieci righe spesso sono errati, e non si sa perché nessuno capisce cosa è stato fatto (dopo un po’, nemmeno l’autore...)

IL PROBLEMA DEL PROGETTO Dato un problema... iniziare subito a scrivere il programma..? NO ! nessuno sa se questa soluzione sia la migliore o se ce ne fossero altre se domani occorre modificare qualcosa, non si sa dove mettere le mani se si deve cambiare linguaggio… meglio non pensarci!

IL PROBLEMA DEL PROGETTO Quando rischia di accadere tutto ciò? quando la specifica della soluzione coincide con la fase di codifica che invece sono, concettualmente, due momenti distinti e tali devono restare anche in pratica!

UN ESEMPIO Problema: “Data una temperatura espressa in gradi Celsius, calcolare il corrispondente valore espresso in gradi Fahrenheit” Approccio: si parte dal problema e dalle proprietà note sul dominio dei dati

UN ESEMPIO Problema: “Data una temperatura espressa in gradi Celsius, calcolare il corrispondente valore espresso in gradi Fahrenheit” Specifica della soluzione: Relazioni tra grandezze esistenti nello specifico dominio applicativo: c * 9/5 = f - 32 c = (f - 32) * 5/9 oppure f = 32 + c * 9/5

UN ESEMPIO L’Algoritmo corrispondente: Dato c calcolare f sfruttando la relazione f = 32 + c * 9/5 SOLO A QUESTO PUNTO si sceglie un linguaggio si codifica l’algoritmo in tale linguaggio

LINGUAGGI DI PROGRAMMAZIONE Un linguaggio di programmazione ha due componenti ortogonali il linguaggio di Computazione il linguaggio di Coordinazione Linguaggi di computazione Linguaggi di coordinazione Un particolare linguaggio di programmazione

LINGUAGGI DI COMPUTAZIONE Il “potere espressivo” di un linguaggio è caratterizzato da: quali tipi di dati consente di rappresentare (direttamente o tramite definizione dell’utente) quali istruzioni di controllo mette a disposizione (quali operazioni e in quale ordine di esecuzione) PROGRAMMA = DATI + CONTROLLO

IL LINGUAGGIO C Il “Linguaggio di Programmazione” C è costituito da un linguaggio di computazione (il C vero e proprio) un linguaggio di coordinazione fornito come “allegato”, sotto forma di librerie standard

IL LINGUAGGIO C UN PO’ DI STORIA definito nel 1972 (AT&T Bell Labs) per sostituire l’assembler prima definizione precisa: Kernigham & Ritchie (1978) prima definizione ufficiale: ANSI (1983)

IL LINGUAGGIO C CARATTERISTICHE linguaggio sequenziale, imperativo, strutturato a blocchi usabile anche come linguaggio di sistema adatto a software di base, sistemi operativi, compilatori, ecc. portabile, efficiente, sintetico ma a volte poco leggibile...

IL LINGUAGGIO C Basato su pochi concetti elementari dati (tipi primitivi, tipi di dato) espressioni dichiarazioni / definizioni funzioni istruzioni / blocchi

DATI Un elaboratore è un manipolatore di simboli (segni) L'architettura fisica di ogni elaboratore è intrinsecamente capace di trattare vari domini di dati, detti tipi primitivi dominio dei numeri naturali e interi dominio dei numeri reali (con qualche approssimazione) dominio dei caratteri dominio delle stringhe di caratteri

Il concetto di tipo di dato viene introdotto TIPI DI DATO Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi: esprimere in modo sintetico un insieme di valori la loro rappresentazione in memoria, e un insieme di operazioni ammissibili permettere di effettuare controlli statici (al momento della compilazione) sulla correttezza del programma.

TIPI DI DATO PRIMITIVI IN C caratteri char caratteri ASCII interi con segno short (int) -32768 ... 32767 int ??????? long (int) -2147483648 .... 2147483647 naturali (interi senza segno) unsigned short (int) 0 ... 65535 unsigned (int) ??????? unsigned long (int) 0 ... 4294967295

TIPI DI DATO PRIMITIVI IN C ATTENZIONE: la dimensione di int non è fissa, dipende dal compilatore considerato. Unica certezza: short < int < long caratteri char caratteri ASCII interi con segno short (int) -32768 ... 32767 int ??????? long (int) -2147483648 .... 2147483647 naturali (interi senza segno) unsigned short (int) 0 ... 65535 unsigned (int) ??????? unsigned long (int) 0 ... 4294967295

TIPI DI DATO PRIMITIVI IN C caratteri char caratteri ASCII interi con segno short (int) -32768 ... 32767 int ??????? long (int) -2147483648 .... 2147483647 naturali (interi senza segno) unsigned short (int) 0 ... 65535 unsigned (int) ??????? unsigned long (int) 0 ... 4294967295 … e lo stesso vale per l’unsigned int

TIPI DI DATO PRIMITIVI IN C reali float singola precisione (32 bit) double doppia precisione (64 bit) boolean non esistono in C come tipo a sé stante si usano gli interi: zero indica FALSO ogni altro valore indica VERO convenzione: suggerito utilizzare uno per VERO

COSTANTI DI TIPI PRIMITIVI interi (in varie basi di rappresentazione) reali in doppia precisione 24.0 2.4E1 240.0E-1 in singola precisione 24.0F 2.4E1F 240.0E-1F

COSTANTI DI TIPI PRIMITIVI caratteri singolo carattere racchiuso fra apici 'A' 'C' '6' caratteri speciali: '\n' '\t' '\'' '\\' '\"' caratteri indicati tramite la loro codifica ASCII: '\nnn', '\0xhhh' dove nnn = numero ottale, hhh = numero esadecimale '\041' '\0' '\0x31'

STRINGHE Una stringa è una collezione di caratteri delimitata da virgolette "ciao" "Hello\n" In C le stringhe sono semplici sequenze di caratteri di cui l’ultimo, sempre presente in modo implicito, è '\0' "ciao" = {'c', 'i', 'a', 'o', '\0'}

Il C è un linguaggio basato su espressioni Una espressione è una notazione che denota un valore mediante un processo di valutazione Una espressione può essere sempli- ce o composta (tramite aggregazio- ne di altre espressioni)

Quali espressioni elementari? costanti simboli di variabile ESPRESSIONI SEMPLICI Quali espressioni elementari? costanti ‘A’ 23.4 -3 “ciao” .... simboli di variabile x pippo pigreco …. simboli di funzione f(x) concat(“alfa”,”beta”) ...

OPERATORI ED ESPRESSIONI COMPOSTE Ogni linguaggio introduce un insieme di operatori che permettono di aggregare altre espressioni (operandi) per formare espressioni composte con riferimento a diversi domini / tipi di dato (numeri, testi, ecc.)

Esempi ESPRESSIONI COMPOSTE 2 + f(x) 4 * 8 - 3 % 2 + arcsin(0.5) strlen(concat(“alfa”,”beta”)) a && (b || c) ...

CLASSIFICAZIONE DEGLI OPERATORI Due criteri di classificazione: in base al tipo degli operandi in base al numero degli operandi

ESPRESSIONI E OPERATORI ARITMETICI

ESPRESSIONI E OPERATORI RELAZIONALI Sono tutti operatori binari:

ESPRESSIONI E OPERATORI RELAZIONALI Attenzione: non esistendo il tipo boolean, in C le espressioni relazionali denotano un valore intero 0 denota falso (condizione non verificata) 1 denota vero (condizione verificata)

ESPRESSIONI E OPERATORI RELAZIONALI Quindi, sono possibili, in astratto, espressioni miste come: (n != 0) = = n /* Vero se n vale 1 o 0 */ orrende e da evitare!

ESPRESSIONI E OPERATORI LOGICI Anche le espressioni logiche denotano un valore intero da interpretare come vero (1) o falso (0)

ESPRESSIONI E OPERATORI LOGICI Anche qui sono possibili espres-sioni miste, utili in casi specifici 5 && 7 0 || 33 !5 Valutazione in corto-circuito la valutazione dell’espressione cessa appena si è in grado di determinare il risultato il secondo operando è valutato solo se necessario

VALUTAZIONE IN CORTO CIRCUITO - ESEMPI 22 || x già vera in partenza perché 22 è vero 0 && x già falsa in partenza perché 0 è falso a && b && c se a&&b è falso, il secondo && non viene neanche valutato a || b || c se a||b è vero, il secondo || non viene neanche valutato

ESPRESSIONI CONDIZIONALI Una espressione condizionale è introdotta dall’operatore ternario condiz ? espr1 : espr2 L’espressione denota: o il valore denotato da espr1 o quello denotato da espr2 in base al valore della espressione condiz

ESPRESSIONI CONDIZIONALI condiz ? espr1 : espr2 se condiz è vera, l’espressione nel suo complesso denota il valore denotato da espr1 se condiz è falsa, l’espressio-ne nel suo complesso denota il valore denotato da espr2

ESPRESSIONI CONDIZIONALI - ESEMPI 3 ? 10 : 20 denota sempre 10 (3 è sempre vera) x ? 10 : 20 denota 10 se x è vera (diversa da 0), oppure 20 se x è falsa (uguale a 0) (x>y) ? x : y denota il maggiore fra x e y

ESPRESSIONI CONCATENATE Una espressione concatenata è introdotta dall’operatore di concatenazione espr1, espr2, …, esprN tutte le espressioni vengono valutate (da sinistra a destra) l’espressione esprime il valore denotato da esprN

ESPRESSIONI CONCATENATE - ESEMPI Supponiamo che i valga 5 k valga 7 Allora l’espressione: i + 1, k - 4 denota il valore denotato da k-4, cioè 3.

OPERATORI INFISSI, PREFISSI, e POSTFISSI Le espressioni composte sono strutture formate da operatori applicati a uno o più operandi Ma.. dove posizionare l’operatore rispetto ai suoi operandi?

OPERATORI INFISSI, PREFISSI, e POSTFISSI Tre possibili scelte: prima  notazione prefissa Esempio: + 3 4 in mezzo  notazione infissa Esempio: 3 + 4 dopo  notazione postfissa Esempio: 3 4 +

OPERATORI INFISSI, PREFISSI, e POSTFISSI Le notazioni prefissa e postfissa non hanno problemi di priorità e/o associatività degli operatori non c’è mai dubbio su quale operatore vada applicato a quali operandi La notazione infissa richiede regole di priorità e associatività per identificare univocamente quale operatore sia applicato a quali operandi

Notazione prefissa: * + 4 5 6 Notazione postfissa: 4 5 6 + * ESEMPI si legge come (4 + 5) * 6 denota quindi 54 Notazione postfissa: 4 5 6 + * si legge come 4 * (5 + 6) denota quindi 44

PRIORITÀ DEGLI OPERATORI PRIORITÀ: specifica l’ordine di valutazione degli operatori quando in una espressione compaiono operatori (infissi) diversi Esempio: 3 + 10 * 20 si legge come 3 + (10 * 20) perché l’operatore * è più prioritario di + NB: operatori diversi possono comunque avere egual priorità

ASSOCIATIVITÀ DEGLI OPERATORI ASSOCIATIVITÀ: specifica l’ordine di valutazione degli operatori quan-do in una espressione compaiono operatori (infissi) di egual priorità Un operatore può quindi essere associativo a sinistra o associativo a destra

ASSOCIATIVITÀ DEGLI OPERATORI ASSOCIATIVITÀ: specifica l’ordine di valutazione degli operatori quan-do in una espressione compaiono operatori (infissi) di egual priorità Esempio: 3 - 10 + 8 si legge come (3 - 10) + 8 perché gli operatori - e + sono equiprioritari e associativi a sinistra

PRIORITÀ E ASSOCIATIVITÀ Priorità e associatività predefinite possono essere alterate mediante l’uso di parentesi Esempio: (3 + 10) * 20 denota 260 (anziché 203) Esempio: 30 - (10 + 8) denota 12 (anziché 28)

ORDINE DI VALUTAZIONE DEGLI OPERANDI Priorità e associatività dicono in che ordine saranno valutate le operazioni NON in che ordine procurarsi gli operandi!

ORDINE DI VALUTAZIONE DEGLI OPERANDI Esempio: le due espressioni (3 + f(x)) + g(y) 3 + (f(x) + g(y)) possono essere entrambe valutate o calcolando prima f(x) e poi g(y) o viceversa

ORDINE DI VALUTAZIONE DEGLI OPERANDI L’ordine di valutazione degli operandi è una regola semantica: Il C non la precisa  ambiguità! non c’è modo di saperlo! le parentesi non servono a nulla (è una regola semantica, non sintattica!) compilatori diversi potrebbero fare scelte diverse

ORDINE DI VALUTAZIONE DEGLI OPERANDI Per imporre un ordine specifico, bisogna serializzare le operazioni Esempio: anziché (3 + f(x)) + g(y) scrivere 1) z1 = f(x) 2) z2 = g(y) 3) (3 + z1) + z2

RIASSUNTO OPERATORI DEL C (1/2)

RIASSUNTO OPERATORI DEL C (2/2)

GRAMMATICA DELLE ESPRESSIONI Associatività e priorità degli operatori sono determinate dalle regole sintat-tiche definite dalla grammatica delle espressioni. Regole diverse possono comportare diversa priorità fra gli operatori diversa associatività fra operatori equiprioritari

GRAMMATICA DELLE ESPRESSIONI Alcune delle produzioni principali:

GRAMMATICA DELLE ESPRESSIONI La scelta di riscrivere <espressione> come somma algebrica di <termine> <termine> come prodotto o rapporto di <fattore> impone una gerarchia fra gli operatori corrispondenti, e dunque definisce la priorità degli operatori (*, / più prioritari)

GRAMMATICA DELLE ESPRESSIONI Esempio

GRAMMATICA DELLE ESPRESSIONI La scelta di scrivere una grammatica ricorsiva a sinistra rende gli operatori aritmetici associativi a sinistra, e dunque definisce la loro associatività In questo modo otteniamo operatori che “si comportano” come quelli della aritmetica a cui siamo abituati.

ALBERO SINTATTICO DELL’ESPRESSIONE 2 – 3 + 4 * (6 % ( 2 + 3 )) - 2 3 * 4 % 6

GRAMMATICHE : UN CONTROESEMPIO Attenzione: una grammatica ricorsiva a destra sarebbe lecita in astratto… ma darebbe luogo a una matematica alquanto “inusuale”!

GRAMMATICHE: UN CONTROESEMPIO Ad esempio, qui 2 - 5 + 6 verrebbe valutata come 2 - (5 + 6)…. !!!

UN ULTERIORE CONTROESEMPIO Con regole non ricorsive, non esiste associatività In effetti, espressioni come 3+4+5 non sono possibili: occorrono sempre le parentesi!