Programmazione strutturata

Похожие документы
Le Strutture di controllo Del Linguaggio C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

PROGRAMMAZIONE STRUTTURATA

INFORMATICA. Strutture iterative

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

STRUTTURE DI CONTROLLO DEL C++

Algoritmi e basi del C Struttura di un programma

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

Introduzione alla programmazione

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

Le strutture di controllo

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

Introduzione alla programmazione Algoritmi e diagrammi di flusso. Sviluppo del software

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

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

Istruzioni iterative (o cicliche)

Matlab. Istruzioni condizionali, cicli for e cicli while.

Appunti del corso di Informatica 1 (IN110 Fondamenti) 2 Algoritmi e diagrammi di flusso

Introduzione agli Algoritmi

Corso di Informatica. Problemi ed algoritmi. Ing Pasquale Rota

Istruzioni iterative. Istruzioni iterative

3 Costrutti while, for e switch

Algoritmi e soluzione di problemi

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

Rappresentazione con i diagrammi di flusso (Flow - chart)

Il linguaggio di programmazione Python

Strutture di Controllo

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

Istruzioni Condizionali

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

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

Le strutture di controllo in C++

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

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

Le basi del linguaggio Java

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Istruzioni Condizionali in C

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Unità F1. Obiettivi. Il linguaggio C. Il linguaggio C++ Linguaggio C. Pseudolinguaggio. Primi programmi

IL PRIMO PROGRAMMA IN C

Introduzione alla programmazione strutturata

Cosa si intende con stato

1 Esercizi in pseudocodice

linguaggio di programmazione e programma

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

Linguaggio C Informatica Grafica

Unità di apprendimento 6. Dal problema al programma

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

Diagrammi a blocchi 1

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

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

Diagrammi a blocchi 1

Costrutti condizionali e iterativi

Il computer. Il case e l'unità di elaborazione. Il computer, una macchina aggiornabile.

LA METAFORA DELL UFFICIO

ELABORAZIONE DELLE INFORMAZIONI (ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE)

Strutture di controllo decisionali

Università degli Studi di Verona. Algoritmie Diagrammidiflusso. Gennaio Sergio Marin Vargas. Dipartimento di Biotecnologie

Fondamenti di Informatica T-1 Modulo 2

Laboratorio di Python

COMANDI ITERATIVI. Ivan Lanese

Rappresentazione degli algoritmi

Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe.

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Scrivere il software. Scrivere il software. Interprete. Compilatore e linker. Fondamenti di Informatica

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

Programmazione a blocchi. Algobuild Prof. Sergio Roselli

Lezione 6 Introduzione al C++ Mauro Piccolo

Corso di Esercitazioni di Programmazione

Транскрипт:

Programmazione strutturata C O P Y R I G H T ( C ) 2 0 0 8 W W W. F O N D A M E N T I. I N F O P E R M I S S I O N I S G R A N T E D T O C O P Y, D I S T R I B U T E A N D / O R M O D I F Y T H I S D O C U M E N T U N D E R T H E T E R M S O F T H E G N U F R E E D O C U M E N T A T I O N L I C E N S E, V E R S I O N 1. 3 O R A N Y L A T E R V E R S I O N P U B L I S H E D B Y T H E F R E E S O F T W A R E F O U N D A T I O N ; W I T H N O I N V A R I A N T S E C T I O N S, N O F R O N T - C O V E R T E X T S, A N D N O B A C K - C O V E R T E X T S. A C O P Y O F T H E L I C E N S E I S I N C L U D E D I N T H E S E C T I O N E N T I T L E D " G N U F R E E D O C U M E N T A T I O N L I C E N S E ".

Risoluzione di un problema Dato un problema, per arrivare ad un programma che descrive la soluzione dobbiamo: Definire con precisione il risultato: output; Individuare gli elementi a disposizione: input Descrivere la risoluzione attraverso: Un algoritmo, Le strutture dati su cui l'algoritmo opera. Codificare algoritmo e strutture dati in un linguaggio comprensibile alla macchina utilizzata (in questo corso useremo il linguaggio C)

Concetti di: Algoritmo / Programma Un algoritmo e' un insieme di istruzioni strutturate. Possiamo rappresentare ogni azione all'interno di un blocco e indicare il tragitto che dovrà seguire il programma, rappresentando in questo modo la struttura dello stesso. Questa rappresentazione viene comunemente definita diagramma di flusso. La rappresentazione di un algoritmo è definita programma I programmi sono formulazioni concrete di algoritmi astratti, che si basano sulle particolari rappresentazioni e strutture dei dati. (N. Wirth)

Lo pseudocodice L algoritmo si può scrivere in vari formalismi (a parole, pseudo-codice, grafico), purché sia non ambiguo. Lo pseudolinguaggio può essere utilizzato alternativamente al diagramma di flusso. Lo pseudolinguaggio è strettamente dipendente dal paradigma di programmazione scelto per risolvere un problema, mentre dovrebbe essere pressoché indipendente dal linguaggio di programmazione.

Lo pseudocodice In informatica, un paradigma di programmazione è uno stile fondamentale di programmazione, ovvero un insieme di strumenti concettuali forniti da un linguaggio di programmazione per la stesura di programmi, e definisce/determina il modo in cui il programmatore concepisce e percepisce il programma. Ogni linguaggio di programmazione è generalmente ispirato (e riconducibile) a un particolare paradigma di programmazione; per esempio, il Pascal e il C sono basati sul paradigma della programmazione strutturata

Teorema di Böhm-Jacopini Il teorema di Böhm-Jacopini, enunciato nel 1966 dagli informatici Corrado Böhm e Giuseppe Jacopini, afferma che qualunque algoritmo può essere implementato utilizzando tre sole strutture: La sequenza La selezione Il ciclo (o iterazione) da applicare ricorsivamente alla composizione di istruzioni elementari. Il teorema ha contribuito alla critica dell'uso sconsiderato delle istruzioni goto (spaghetti programming) e alla definizione delle linee guida della programmazione strutturata che si sono avuti intorno al 1970.

Struttura sequenziale La struttura sequenziale è implicita del linguaggio C. Sempre che non gli si ordini diversamente, il computer esegue automaticamente le istruzioni del C, una dopo l altra, nell ordine in cui sono state scritte. Si usa il simbolo rettangolo, chiamato anche simbolo di azione, per indicare un attività che includa un calcolo o un operazione di input/output.

Istruzioni e Blocchi Un espressione come y = 11 o ++y oppure scanf( ) diventa un istruzione quando è seguita da un punto e virgola come in y=11; ++y; e scanf( ); In C il punto virgola è un terminatore di istruzione. Le parentesi graffe { e } sono utilizzate per raggruppare in un unica istruzione composta detta anche blocco, dichiarazioni ed istruzioni, in modo che, dal puto di vista sintattico, esse formino un entità equivalente ad una solo istruzione.

Strutture di controllo In ogni linguaggio le strutture di controllo permettono di scrivere programmi nei quali il flusso di esecuzione non sia strettamente sequenziale. I costrutti possono essere: Condizionali: if else (e varianti if,else-if) switch Iterativi: while for do while

Controlli condizionali: if-else (selezione doppia) L'istruzione if-else permette di verificare determinate condizioni ed ha la seguente sintassi: if (espressione) istruzione_1 else istruzione_2 Se espressione è vera (o non zero) è eseguita istruzione_1 altrimenti è eseguita istruzione_2 Il comando di selezione if si aspetta una sola istruzione nel proprio corpo. Per includere più istruzioni è necessario creare un blocco. Y N

Controlli condizionali: if (selezione singola) Nel costrutto if-else la parte else è opzionale: if (espressione) istruzione_1 Se espressione è vera (o non zero) è eseguita istruzione_1 Si possono adottare sull istruzione if delle tecniche di codifica molto compatte: E possibile scrivere if (espressione) Invece che if (espressione!= 0) Y N

Controlli condizionali: if annidati La mancanza di un else all interno di una sequenza di if innestati porta ad una ambiguità, che viene risolta associando ogni else all if più interno che ne è sprovvisto. if (x < 10) if (a > b) z = a; else z = b; if (x < 10) { } if (a > b) z = a; else z = b; Il compilatore non rileva l indentazione. Quando si hanno diversi if innestati è necessario utilizzare le parentesi graffe per costruire dei blocchi.

Controlli condizionali: else-if Questa sequenza di istruzioni if è il modo più generale per realizzare una scelta plurima. if (espressione_1) istruzione_1 else if (espressione_2) istruzione_2 else if (espressione_3) istruzione_3 else istruzione_4 Simili costrutti possono diventare molto complicati se nella scelta si devono essere valutate molte espressioni. Le espressioni sono analizzate nell ordine in ci si presentano. Se una di esse risulta vera, l istruzione ad essa associata viene eseguita, e ciò termina l intera catena Y Y N N N Y

Espressioni condizionali Il C fornisce l operatore condizionale (?:) che è strettamente correlato al comando if-else. Quello condizionale è l unico operatore ternario del C, ovvero accetta in input tre parametri. Gli operandi insieme all operatore ternario formano una espressione condizionale. espr_1? espr_2 : espr_3 Esempio: if (a > b) z = a; else z = b; E possibile scrivere codice molto sintetico: z = (a > b)? a : b /* z = max(a,b) */ printf( Tu hai %d element%s, n, n ==1? o : i );

Controlli condizionali Esempio 1: Scrivere un programma che dati in input tre numeri visualizza il massimo. Algoritmo: - Acquisisci la terna di misure A,B,C - Se A > B allora - Se A > C allora il massimo è A - Altrimenti il massimo è C - Altrimenti - Se B > C allora il massimo è B - Altrimenti il massimo è C

Programma: Controlli condizionali

Controlli condizionali: switch (selezione multipla) L istruzione switch è una struttura di scelta plurima che controlla se un espressione assume un valore all interno di un insieme di costanti intere. Sintassi: switch (espressione) { case elem_1: istruzione_1; break; case elem_2: istruzione_2; break;... case elem_n: istruzione_n; break; default: istruzione; break; }

Controlli condizionali: switch La sintassi dell istruzione switch è soggetta ai seguenti ulteriori vincoli: espressione e element_n sono espressioni di tipo int o char Non sono ammessi più case con lo stesso valore di element_n default: può comparire una volta sola.

Controlli condizionali: switch Funzionamento dell istruzione switch: L espressione (espressione) viene valutata e confrontata con le espressioni costanti (element_n) Se il valore di una (e quindi una sola) delle espressioni costanti è uguale al valore dell espressione intera, allora Si esegue la prima istruzione in posizione successiva ai due punti che seguono l espressione costante. Altrimenti Se è presente default, si esegue la prima istruzione in posizione successiva ai due punti seguenti default. Tutte le istruzioni seguenti fino all istruzione break vengono eseguite in sequenza.

Esempi Esempio 2: Scrivere un programma che dato in input un numero intero di 5 cifre verifica se il numero è palindromo. Esempio 3: Scrivere un programma che converte un carattere da maiuscolo in minuscolo, utilizzando un espressione condizionale. Esempio 4: Scrivere un programma che letto in input un numero intero minore di 3 visualizzi il numero in caratteri (leggo 3 scrivo tre )

Costrutti Iterativi (Cicli) L iterazione serve a fare in modo che un istruzione o un blocco di istruzioni vengano eseguite ripetutamente per un certo numero di volte. Tale numero può essere: Noto a priori, essendo uguale al valore di una costante o di una variabile che non muta durante l iterazione. Determinato da condizioni dipendenti dall iterazione.

Struttura iterativa (while ) Sintassi: while(condizione) espressione; oppure while(condizione) { } Le istruzioni del blocco vengono ripetute fintanto che la condizione (espressione booleana) risulta essere vera. Se la condizione è falsa prima ancora di iniziare il ciclo, non viene eseguita neanche una iterazione. Y N

Struttura iterativa (while ) Esempio: Calcolo del numero massimo di bit necessari per rappresentare l intero più grande in relazione all architettura della CPU. #include <stdio.h> int main() { int a=2,b=1,bits=1; while(a > b) { b = a; a = a + a; bits++; } printf("numero di bits: %d\n",bits); return 0; }

Struttura iterativa (do while) In questo caso la condizione viene verificata alla fine del ciclo: il ciclo viene ripetuto fintanto che la condizione risulta vera. Quando diventa falsa il ciclo viene interrotto. Il blocco di istruzioni viene quindi eseguito sempre almeno una volta, anche se la condizione dovesse essere falsa a priori. Sintassi: do { } while(condizione); Y N

Struttura iterativa (for ) La terza struttura di controllo per implementare la struttura iterativa è l istruzione for Il ciclo viene iterato fintanto che la condizione risulta essere vera; l istruzione di incremento viene eseguita al termine di ogni iterazione, prima di verificare la condizione finale. Sintassi: for (istr_1; espr_2; istr_3) { Blocco istruzioni } Istr_3 Istr_1 espr_2 N istr_1 = assegnazione iniziale espr_2 = condizione finale istr_3 = incremento Y Blocco

Struttura iterativa (for ) Questa istruzione è molto comoda (e naturale) quando l esecuzione del ciclo è controllata da una variabile (un contatore, ad esempio) il cui valore varia da un certo valore iniziale ad uno finale, subendo un incremento (o un decremento) ad ogni iterazione del ciclo. Il significato dell istruzione for è riconducibile alla seguente istruzione while: assegnazione iniziale ; while (condizione finale ) { istruzione; incremento ; }

Struttura iterativa (for ) Esempio: Visualizzare i cubi degli interi da 1 a 10 #include <stdio.h> int main() { int j; for (j=0; j<=10; j++) { printf( %d\n,j*j*j); } } return 0;

Esempi Esempio 5: Scrivere un programma che calcoli la divisione fra due numeri interi non negativi usando solo somme algebriche e sottrazioni. Esempio 6: Scrivere un programma che calcoli il fattoriale di un numero intero.

Cicli annidati Una ripetizione nidificata è un istruzione contenuta in una istruzione di ripetizione che è a sua volta una istruzione di ripetizione. Esempio 7: Per ogni numero non negativo B (letto in input), calcola la potenza B^E con esponente E (letto in input) Algoritmo. - Acquisisci l esponente E - Visualizza messaggio - Acquisisci un numero B - Fino a quando B è diverso da zero - Calcola la potenza B elevato a E - Acquisisci un numero B - Visualizza il risultato

Cicli annidati Consideriamo allora il sottoproblema Problema. Calcolare la potenza B elevato a E Algoritmo. - inizializza P a uno - per tutti i valori di I da 1 a E - moltiplica P per B Nidificando il secondo algoritmo nel primo Algoritmo. - Acquisisci l esponente E - Visualizza messaggio - Acquisisci un numero B - Fino a quando B è diverso da zero - Calcola la potenza B elevato a E - Acquisisci un numero B - Visualizza il risultato

Cicli annidati Implementazione in C dell algoritmo Ciclo per il calcolo della potenza Ciclo per l inserimento della base o del valore di terminazione

Cicli annidati Esempio 8: Scrivere un programma che stampa la tavola pitagorica utilizzando i cicli annidati L output del programma dovrà essere simile a quanto evidenziato nella seguente figura:

TROVA L errore Cicli annidati

Cicli infiniti A volte sorge la necessità di creare un ciclo per eseguire un programma all infinito, ovvero fino a che l utente lo interrompe, presumibilmente con una istruzione di break o continue. La maggior parte delle volte i cicli infiniti sono dovuti ad errori di programmazione. Alcuni esempi: while(1) { } for( ; ; ) istruzione; for (j=0;j<10;j++) {... j=1; /* si modifica l indice del ciclo */ }

Istruzione Break L istruzione break provoca l uscita incondizionata da un ciclo for, do while, while senza eseguire le istruzioni successive né valutare la condizione di controllo. La prossima istruzione da eseguire diventa la prima istruzione seguente il blocco che contiene break La lettura dei programmi risulta più difficile Non se ne consiglia l uso quando esistono alternative più semplici

Istruzione Break Esempio (deprecato utilizzo di break). Calcolare la somma dei numeri in input, terminando al primo numero negativo, che non deve essere aggiunto alla somma. #include <stdio.h> #include <stdio.h> void main() { int n,s; while (1) { scanf("%d", &n); if (n < 0) break; s += n; } } void main() { int n,s; } scanf("%d", &n); while ( n >= 0 ) { s += n; scanf("%d", &n); }

Riferimenti C Corso completo di programmazione, H.M. Deitel P.J. Deitel, 3ª edizione, Apogeo The C Programming Language,Brian Kernighan and Dennis Ritchie, 2 nd Edition, Prentice Hall