Programmare è un arte

Documenti analoghi
opport unamen e t i d en t a i tti if (pippo > 17) { printf( Sei magg ggiorenne! ); } else { printf( Sei minorenne! ); } if (age >= 18)

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Fondamenti di Informatica T-1 Modulo 2

Istruzioni decisionali

Unità Didattica 2 Linguaggio C. Espressioni, Operatori e Strutture linguistiche per il controllo del flusso

Le Strutture di controllo Del Linguaggio C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

INFORMATICA. Strutture iterative

Programmazione strutturata

Le strutture di controllo

STRUTTURE DI CONTROLLO DEL C++

Corso di Fondamenti di Informatica

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Tipo carattere. Campo di variabilità. Intervallo finito. Tipo. Dimensione (byte) char

Istruzioni iterative (o cicliche)

C espressioni condizionali

Esercitazione 4. Comandi iterativi for, while, do-while

Sviluppo di programmi. E ora, finalmente. Si comincia! 1. Analizzare il problema. 2. Progettare una soluzione (1) E necessario capire:

Alcuni esercizi. 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli

IL PRIMO PROGRAMMA IN C

Corso di Informatica B - Sezione D. Esercitazioni Linguaggio C

3 Costrutti while, for e switch

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Le strutture di controllo in C++

Corso di Fondamenti di Programmazione canale E-O ... Un esempio per iniziare. printf) Altri cenni su printf() Esercizi 8. (printf(

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO III Indice

Programmazione a blocchi. Algobuild Prof. Sergio Roselli

Strutture di Controllo

Esercitazione 6. Array

Esercitazione 3. Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else, while, printf, scanf

Istruzioni Condizionali in C

Algoritmi e basi del C Struttura di un programma

Esercitazione 3. Espressioni booleane I comandi if-else e while

Istruzioni iterative. Istruzioni iterative

JavaScript Core Language. Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132

ISTRUZIONI DI ITERAZIONE

Istruzioni di ripetizione in Java 1

PROGRAMMAZIONE STRUTTURATA

Dall analisi alla codifica (1)

Le basi del linguaggio Java

RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO

5 - Istruzioni condizionali

Istruzioni di Ciclo. Unità 4. Domenico Daniele Bloisi

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1

Strutture di Controllo

- Dispensa III - PROGRAMMAZIONE C (Parte I)

Strutture di controllo decisionali

Fondamenti di Programmazione. Strutture di controllo

$QDOLVLGHOSURJUDPPDTXDGUDWR

Input / Output, Espressioni Condizionali e Cicli

Fondamenti di Informatica L-A

Strutture di controllo iterative

Laboratorio Progettazione Web Il linguaggio PHP Lezione 6. Andrea Marchetti IIT-CNR 2011/2012

Rappresentazione degli algoritmi

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Operatori in Java. Il Costrutto Condizionale if

7. Strutture di controllo

Laboratorio Progettazione Web Il linguaggio PHP Le Istruzioni. Andrea Marchetti IIT-CNR AA 2015/2016

Input/Output di numeri

Esercitazioni di Fondamenti Informatica - Modulo A 1

Tipi di dato semplici

Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.

Esercitazione 11. Liste semplici

Linguaggio C Informatica Grafica

Strutture iterative. Strutture iterative. I cicli in C. Strutture iterative. con i che assume i valori da 0 a 1000

Diagramma a blocchi per la selezione, in un mazzo di chiavi, di quella che apre un lucchetto

Elementi di C++ di base

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Introduzione alla programmazione Esercizi risolti

Istruzioni di ciclo. Unità 4. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Perché il linguaggio C?

PROGRAMMAZIONE: Le strutture di controllo

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Introduzione al C. Introduzione. Linguaggio ad alto livello. Struttura di un programma C

Laboratorio Progettazione Web Il linguaggio PHP Le Istruzioni. Andrea Marchetti IIT-CNR AA 2014/2015

Programmazione di base

Variabili e Istruzioni

PROGRAMMAZIONE: ESERCITAZIONE N. 6

Lettura da tastiera e scrittura su monitor

Esercizi di programmazione in linguaggio C - Costrutto iterazione

Gocce di Java. Gocce di Java. Selezione e ripetizione. Pierluigi Crescenzi. Università degli Studi di Firenze

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Elementi di informatica

INTRODUZIONE. ALLA PROGRAMMAZIONEColonna 1. in linguaggio C

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Caratteri e stringhe

Programmare in C. Esempio: Algoritmo del Risveglio

Strutture di iterazione

Corso di Informatica. Problemi ed algoritmi. Ing Pasquale Rota

COMANDI ITERATIVI. Ivan Lanese

# include<stdio.h> int main() { // Dichiarazioni int n; int i;

Programmazione web lato client con JavaScript. Marco Camurri 1

while Istruzione while Cicli ed iterazioni Istruzioni di ripetizione in C Comportamento del while

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA

Strutture di Controllo. if (<condizione>) statement; if (<condizione>) statement; Istruzioni condizionali. Istruzione condizionale if.

Introduzione a. Funzioni di Ingresso e Uscita. Compilazione

Transcript:

Programmare è un arte Si tratta di mettere insieme tanti piccoli elementi nel migliore dei modi possibile per ottenere un risultato che soddisfi le specifiche Dato un problema, ci sono virtualmente infiniti programmi in grado di risolverlo (vedi parte 1 del corso) Sono tutti equivalenti? Prima di scrivere un programma occorre: Aver compreso il problema in maniera approfondita Determinare precisamente un algoritmo che possa portare ad una soluzione efficiente Mentre si scrive un programma è necessario: Conoscere quali sono i mattoni disponibili Linguaggio di programmazione Librerie Saper applicare buoni principi di programmazione 1

Principi di programmazione Principi di base (ma che cosa significano?) Efficienza Modularità della soluzione Ordine e leggibilità Efficienza: determinazione di un algoritmo che consumi poche risorse (in termini di uso di memoria e di tempo di CPU principalmente) e sua codifica efficace e sostenibile (minime risorse utilizzate, senza penalizzare modularità e leggibilità) 2

Modularità Problema complicato (lo scoprirete sempre più quando programming-in-the-large) Alla base di tutto sta l impostazione della soluzione (top-down) Determinare precisamente l algoritmo di soluzione Dividerlo in sotto problemi Dividere in sotto-sotto problemi i sotto problemi Costruire le singole sotto-parti di soluzione in modo che possano essere riusabili in altri contesti Integrare opportunamente le sotto-parti 3

Modularità La modularità/riusabilità è un concetto chiave Si evita di reinventare la ruota tutte le volte Si fa affidamento su librerie ampiamente diffuse, quindi testate e affidabili Moduli scritti per utilizzo da parte di una comunità Come gradevole effetto collaterale, il codice così scritto è più leggibile ci saranno adeguati esempi più avanti 4

Ordine È fondamentale che un programma sia leggibile: Facile comprensione del codice da parte di chi non l ha scritto ma vorrà manutenerlo (il codice deve essere autoesplicativo anche buon uso dei commenti) Chiara strutturazione Per aumentare la leggibilità: Regole di naming Regole di strutturazione del codice 5

Regole di Naming I nomi di variabili e funzioni DEVONO avere nomi autoesplicativi Variabili di nome pippo, pluto, paperino, a23, kk1, pa3, ecc. non dicono nulla su ciò che contengono Usare il Camel Casing (prima lettera minuscola) sia per le variabili, sia per le funzioni: rowindex, columnindex, colorconverter void swapvalues(int &firstvalue, int &secondvalue); void savetofile(int buffer[], int buffersize); 6

Regole di Indentazione Blocchi di codice innestati vanno opportunamente indentati Normalmente l indentazione è automaticamente effettuata dall editor (specializzato non il notepad) if (pippo > 17) { printf( Sei maggiorenne! ); } else { printf( Sei minorenne! ); } Quale è più chiaro? if (age >= 18) { printf( Sei maggiorenne! ); } else { printf( Sei minorenne! ); 7 }

Regole di indentazione Poche e semplici Parentesi graffe sempre a capo Contenuto delle parentesi graffe sempre indentato (di un tab) rispetto alle parentesi stesse Non più di uno statement per linea Se sulle slide queste regole non sono rispettate è solo perché gli esempi non sempre vogliono stare racchiusi in una sola slide 8

Un po di idee Problema di calcolo Può essere risolto eseguendo una serie di operazioni in un ordine opportuno Algoritmo: procedimento di soluzione in termini di Azioni che devono essere eseguite Ordine in cui queste azioni devono essere eseguite Controllo del programma (o del flusso di esecuzione) Specifica l ordine con cui le azioni devono essere eseguite 9

Pseudocodice Linguaggio informale che aiuta nello sviluppo e nella rappresentazione degli algoritmi Simile al linguaggio di tutti i giorni Non comprensibile dai calcolatori Aiuta il programmatore a visualizzare il programma prima di scriverlo Facile da convertire nel corrispondente programma C 10

Bohm and Jacopini Tutti i programmi possono essere scritti in termini di tre strutture di controllo Sequenza: nativa in C Gli statement sono eseguiti per default in modo sequenziale Strutture di selezione: C ne ha tre tipi if, if else, switch Strutture di ripetizione: C ne ha tre tipi while, do while, for 11

Espressioni logiche Alla base di tutto ci sono le condizioni, rappresentate da espressioni logiche Un espressione logica è un espressione che può essere valutata come vero oppure falso In C i valori vero e falso sono rappresentati, rispettivamente, da un valore intero diverso da zero e da un valore intero uguale a zero 12

Operatori Relazionali Operatore standard Operatore C Esempio di condizione C = == x == y Significato della condizione C x è uguale a y!= x!= y x è diverso da y > > x > y < < x < y >= >= x >= y <= <= x <= y x è maggiore di y x è minore di y x è maggiore o uguale a y x è minore o uguale a y Operatori relazionali per costruire condizioni 13

Operatori Logici && (AND logico) Restituisce true se entrambe le condizioni sono true (OR logico) Restituisce true se una delle due condizioni è true! (NOT logico, negazione logica) Rovescia la verità/falsità della condizione Operatore unario: ha un solo operando! 14

if else Struttura tipica if (espressione logica) { /* sequenza di istruzioni */ } else { /* sequenza di istruzioni */ } 15

Primo esempio: voto di un esame Richiedere in ingresso un voto (valore da 0 a 33) Se il valore è inferiore a 18, stampare Bocciato Se il valore è almeno 18, stampare Promosso Se il valore è superiore a 30, stampare Promosso con Lode 16

Primo esempio: voto di un esame Definire una variabile per inserire il voto Stampare un messaggio per richiedere l inserimento del valore Leggere il valore inserito dall utente e inserirlo nella variabile Verificare il valore inserito Se è minore di 18 Bocciato Altrimenti Promosso Se è maggiore di 30 Lode!!! 17

Primo esempio: voto di un esame #include <stdio.h> int main() { int voto; printf( Inserire un voto (fra 0 e 33): ); scanf( %d, &voto); if (voto < 18) { printf( Bocciato ); } } else { printf( Promosso ); if (voto > 30) { printf( con Lode ); } } Blocco innestato Come sarebbe con l espressione condizionale? 18

Assegnamento vs. Confronto Assegnamento e confronto sono due operatori DIVERSI. Errore pericoloso! Non causa errori di sintassi Ogni espressione che produce un valore può essere usata come condizione in una struttura di controllo Valori diversi da zero sono true, valori uguali a zero sono false Esempio usando == if ( paycode == 4 ) printf( Hai ottenuto un bonus!\n" ); Controlla il paycode, se vale 4 allora viene concesso un bonus 19

Assegnamento vs. Confronto Per esempio, sostituendo == con = if ( paycode = 4 ) printf( Hai ottenuto un bonus!\n" ); Assegna a paycode il valore 4 L assegnamento, come tutti gli statement, restituisce un valore, in particolare il valore assegnato; 4 è diverso da zero quindi l espressione è true e il bonus è assegnato qualsiasi fosse il valore di paycode è un errore LOGICO e non di SINTASSI! 20

Selezione Multipla - switch switch Utile quando una variabile o espressione deve dar luogo a diverse azioni per i diversi valori assunti Formato Una serie di etichette case (caso) e una etichetta (un caso) default opzionale switch ( value ) { case '1': Azioni; break; case '2': Azioni; break; default: Azioni; break; } break; esce dallo statement 21

Menu All interno di un applicazione, dà all utente la possibilità di scegliere quale azione compiere Nei programmi a console (interfaccia testuale) si stampano a video le varie possibilità poi si attende un input dall utente A seconda di ciò che l utente ha digitato, si esegue una particolare azione 22

Menu 1. Stampare tutte le opzioni possibili (compreso il comando di uscita) e un messaggio per far capire all utente che cosa debba fare printf("1: Opzione 1\n"); printf("2: Opzione 2\n"); printf("0: Esci\n"); printf("\nscegli un'opzione: "); 2. Attendere la scelta dell utente scanf("%d", &option); 23

Menu 3. Selezionare l azione da compiere switch (option) { case 1: printf("opzione 1"); break; case 2: printf("opzione 2"); break; case 0: printf("uscita"); break; default: printf("opzione errata"); break; } 24

Menu 4. Se non è stata scelta l opzione di uscita, ricominciare da capo Serve un istruzione di iterazione Ad esempio ciclo while di ripetizione Il programmatore specifica una azione che deve essere ripetuta mentre (while) una certa espressione logica rimane true Il loop while viene ripetuto finché la condizione diventa false 25

Menu Ok, fatelo voi ma un piccolo (molto piccolo) suggerimento non si nega a nessuno int option=-1; while (option!= 0) { } 26

Somma dei primi n numeri Predisporre le variabili necessarie a contenere: numero intero da raggiungere (da chiedere all utente) contatore: conta da 1 al numero suddetto accumulatore della somma Chiedere all utente di inserire un numero intero Leggere il numero intero Azzerare accumulatore e contatore Fintanto che il contatore è inferiore o uguale al numero inserito Sommare il contatore all accumulatore Incrementare il contatore Stampare il risultato 27

Ciclo do while Altro costrutto sintattico di ripetizione Il programmatore specifica una azione che deve essere ripetuta mentre (while) una certa espressione logica rimane true A differenza del while semplice, condizione in fondo, quindi il corpo del ciclo viene eseguito almeno una volta Il loop do while viene ripetuto finché la condizione diventa false 28

Lettura Controllata Chiedere all utonto l inserimento di dati da tastiera è un operazione semplice ma va fatta con criterio Che cosa succede se gli si chiede l inserimento di un numero intero e lui inserisce qualcos altro? Come leggere sequenze di valori? 29

Lettura Controllata Controllo d Errore 1. Richiedere l inserimento di un valore intero 2. Attendere l inserimento del valore da parte dell utente 3. Il valore inserito è un valore intero? Se non lo è, segnalare l errore e chiedere all utente se annullare l operazione In caso negativo riprendere dal punto 1 In caso positivo terminare la lettura Note Che tipo di ciclo iterativo utilizzare? while? do while? Come accorgersi che la lettura non è andata a buon fine? 30

Lettura Controllata Controllo d Errore Che cosa c è dentro al ciclo? Lettura del valore da tastiera Verifica correttezza del valore letto Quante volte va eseguito il ciclo? Almeno una volta senza condizioni poi tutte le volte che è necessario Quindi, quale ciclo è più conveniente usare? Come accorgersi che la lettura non è andata a buon fine? La funzione scanf() restituisce un intero che indica quante sono le variabili lette con successo Non indica dove si sia verificato l errore di lettura 31

Lettura Controllata - Pseudocodice 1. Dichiarare le variabili necessarie n: valore letto success: lettura effettuata con successo (o meno) cancel: lettura annullata dall utente 1. ----- Iniziare il ciclo 2. Stampare a video la richiesta di inserimento di un valore intero 3. Leggere il valore digitato dall utente (inserire nella variabile n) e inserire il conteggio dei valori convertiti con successo nella variabile success 4. Se success vale 0 (nessun valore convertito) iniziare il trattamento dell errore 32

Lettura Controllata - Pseudocodice 5. Trattamento dell errore 1. Dichiarare una variabile (op) che possa contenere una risposta sì/no dell utente 2. Chiedere all utente se voglia annullare l operazione 3. Leggere la risposta dell utente (inserire nella variabile op) 4. Se op contiene una risposta affermativa mettere a true la variabile cancel, false altrimenti 6. Continuare il ciclo se nessun valore convertito (success == 0) e l utente non ha richiesto la terminazione (!cancel) 33

Lettura Controllata int n, success = 0, cancel = 0; do { printf("inserisci un intero: "); success = scanf("%d", &n); if (success == 0) { char op; printf("il valore inserito non è intero!"); printf("\n"); printf("annullare l'operazione? (s/n)"); while (getchar()!= 10); //Svuota il buffer scanf("%c", &op); getchar(); //Mangia solo il fine linea cancel = (op == 's' op == 'S'); } } while (success == 0 &&!cancel); 34

Lettura controllata i perché Perché sono necessari: while (getchar()!= 10); getchar(); //dopo scanf( %c, ); Se la lettura non va a buon fine, scanf() lascia nel buffer i caratteri non consumati (e anche se va a buon fine ) Per continuare a lavorare correttamente con il buffer di ingresso, questi caratteri vanno eliminati In una linea inserita, l ultimo carattere è sempre il carattere 10 (LF Line Feed) generato dal tasto invio while termina quando incontra l ultimo carattere della linea (appunto il 10) 35

Lettura Controllata i perché Se la lettura va a buon fine, il carattere LF (10) rimane nel buffer Ovviamente, anche nel caso di lettura di carattere ( %c ), LF rimane nel buffer Ulteriori informazioni quando si vedrà l input/output in modo dettagliato 36

Ciclo for for (inizializzazione; testdicontinuazione; ultimaistruzioneblocco) statement; Equivalente a: inizializzazione; while (testdicontinuazione) { } statement; ultimaistruzioneblocco; Tipicamente: int counter; for (counter = 1; counter <= 10; counter++) { dosomethingwiththecounter; } 37

Tavola Pitagorica Dato un fattore massimo, scrivere a video la tavola pitagorica con fattori da 1 al valore massimo Due cicli for innestati: uno per le righe e uno per le colonne (ognuno col proprio contatore) Nel ciclo più interno si stampa il risultato della moltiplicazione fra i due contatori Possibili problemi di allineamento nella stampa: il risultato c è ma è bruttino 38

Tavola Pitagorica Pseudo e codice 1. Determinazione del fattore massimo (maxfactor) 2. Ciclo con indice i per righe da 1 a fattore massimo 1. Ciclo con indice j per colonne da 1 a fattore massimo 1. Stampa i * j vai a capo for (i = 1; i <= maxfactor; i++) for (j = 1; j <= maxfactor; j++) printf( %d, i * j); 39

Soluzione Tavola Pitagorica #include <stdio.h> #define NMAX 10 int main(void) { int riga, colonna; int i; /* indice usato per la stampa dei '-' */ } /* stampa della riga di intestazione */ printf(" "); /* stampa 5 spazi bianchi */ for (colonna = 1; colonna <= NMAX; colonna++) printf("%4d", colonna); printf("\n"); for (i = 1; i <= NMAX * 4 + 5; i++) printf("-"); printf("\n"); /* stampa della righe della tavola */ for (riga = 1; riga <= NMAX; riga++) { printf("%2d ", riga); /* stampa della numero della riga */ for (colonna = 1; colonna <= NMAX; colonna++) printf("%4d", riga * colonna); printf("\n"); } return 0; /* output 1 2 3 4 5 6 7 8 9 10 --------------------------------------------- 1 1 2 3 4 5 6 7 8 9 10 2 2 4 6 8 10 12 14 16 18 20 3 3 6 9 12 15 18 21 24 27 30 4 4 8 12 16 20 24 28 32 36 40 5 5 10 15 20 25 30 35 40 45 50 6 6 12 18 24 30 36 42 48 54 60 7 7 14 21 28 35 42 49 56 63 70 8 8 16 24 32 40 48 56 64 72 80 9 9 18 27 36 45 54 63 72 81 90 10 10 20 30 40 50 60 70 80 90 100 */ 40

Tavola Pitagorica e l allineamento? Calcolare l occupazione massima in termini di cifre degli interi da stampare e adattare la stampa di volta in volta Qual è l intero più grande (quello che occupa più spazio)? maxfactor * maxfactor Di quante cifre è composto? (int)log10(maxfactor * maxfactor) Un idea potrebbe essere di inserire davanti alla cifra da stampare tanti spazi bianchi quanti sono necessari affinché tutti i valori stampati occupino lo stesso spazio Cifre di cui è composto il valore da stampare: (int)log10(i * j) Spazi bianchi necessari: (int)log10(maxfactor * maxfactor) - (int)log10(i * j) 41