12 10 8 INTRODUZIONE 6 4 ALLA PROGRAMMAZIONEColonna 1 Colonna 2 Colonna 3 in linguaggio C 2 0 Riga 1 Riga 2 Riga 3 Riga 4 di Mauro Casula {
Scopi del seminario Essere chiaro ed esauriente; Spiegare nei dettagli i concetti della programmazione in generale; Usare tali concetti per trovare soluzioni nel miglior modo possibile; Vedere esempi pratici di programmazione in C (approfondimenti nel Workshop).
Importanza del linguaggio di programmazione Non esiste un linguaggio PERFETTO per risolvere bene tutti i possibili problemi nel miglior modo Quindi bisogna conoscere più linguaggi e usare quello più adatto alla soluzione trovata Quindi avere chiare le implicanze informatiche (anche di programmazione) del problema affrontato
Importanza del linguaggio di programmazione (II) Ogni linguaggio ha: i suoi pregi e i suoi difetti (compilato/interpretato, ottimizzaz., facilità di sviluppo); una sua sintassi specifica (ma i concetti rimangono); le sue librerie native (più quelle aggiuntive); le sue scorciatoie (liste, dizionari...); il suo fascino.
Prevenire è meglio che curare Prima di iniziare a programmare bisogna: pensare e avere chiaro lo scopo del programma da sviluppare; pensare e avere chiaro il modo in cui si intende risolvere il problema (algoritmo) e fissarlo tramite diagramma a blocchi o pseudo-codice; pensare e scegliere il linguaggio/architettura di sviluppo più adatto alla soluzione trovata coi punti precedenti; i problemi nasceranno sempre anche dopo aver pensato, ma almeno si parte in vantaggio (e di molto anche).
Esempio pratico Nel nostro caso: perché usare il C e non un altro linguaggio?
Un po' di curiosità Sviluppato da Dennis Ritchie e Ken Thompson ai Bell Labs nel 1972 per realizzare il sistema operativo UNIX Si chiama C, poiché è l evoluzione di un linguaggio più grezzo, meno funzionale e obsoleto chiamato B (ispirato al BCPL), inventato precedentemente sempre da Ken Thompson
Tipi di dati void: vuoto int / long / short / unsigned: numero intero float / double: numero decimale (reale) bool: booleano (vero/falso)
Istruzioni e Blocchi di istruzione Espressioni come y=5 o i++ sono istruzioni singole e devono essere seguite da un punto e virgola. In C, il punto e virgola quindi è un terminatore di istruzione; L'esecuzione delle istruzioni avviene sempre in modo sequenziale; Un blocco è una sequenza di istruzioni raggruppate all'interno di parentesi graffe { ; Il blocco, se viene eseguito, viene eseguito tutto e solo nel momento in cui il programma entrerà nel blocco e non in altri momenti.
Esempi di istruzioni e blocchi (I) ISTRUZIONI testo = pippo ; a = 210 ; b = 1 ; printf ( pippo ) ; y++ ; printf ( a+b=%d, a+b); if / else, do / while, switch; BLOCCHI { a++ ; printf ( a+b=%d, a+b); { a = 10 ; b = 7 ; printf ( a+b=%d, a+b); break / continue;
Esempi di istruzioni e blocchi (II) BLOCCHI { delta = b * b 4 * a * c ; if ( delta > 0 ) { printf ( Soluzioni distinte in campo Reale ) ; return 1 ; else if ( delta = 0 ) { printf ( Soluzioni coincidenti in campo Reale ) ; return 0 ; else { printf ( Non ha soluzioni in campo Reale ) ; return -1 ;
Struttura di un programma in C #include <stdio.h> #include void funzione1( void ); void funzione2( void ); int main ( int argc, char *argv[ ] ) {... funzione1();... funzione2();... void funzione1( void ){... void funzione2( void ){...
Problema 1 Sviluppare una semplice routine prima in pseudocodice, e poi in C, che chiuda una valvola quando il liquido di un serbatoio raggiunge un certo livello e la apra ad un altro certo livello. I livelli sono scelti da voi. Il serbatoio contiene max 10 litri. Si hanno a disposizione le seguenti funzioni e variabili definite esternamente: chiudi_valvola() apri_valvola() livello
Soluzione 1 (pseudo-codice) Inizio se: livello = 9.5 litri livello = 9.5? SI allora: chiudi_valvola() altrimenti: non fare nulla NO chiudi_valvola() se: livello = 0.5 litri livello = 0.5? SI allora: apri_valvola() altrimenti: non fare nulla NO apri_valvola() Fine
Soluzione 1 (codice C) void gestisci_valvola(void){ if (livello == 9.5){ chiudi_valvola(); if (livello == 0.5){ apri_valvola();
Problema 2 Sviluppare una semplice routine, in pseudo-codice, e poi in C, che stampi dei messaggi personalizzati al raggiungimento di certi livelli del liquido nel serbatoio dell' esempio precedente. I livelli sono scelti da voi. Il serbatoio contiene max 10 litri. Si hanno a disposizione le seguenti funzioni e variabili definite esternamente: printf( Testo da stampare ) livello
Soluzione 1 (pseudo-codice) Inizio se: livello = 9 litri allora: stampa( Quasi pieno ) livello = 9 NO SI stampa( Quasi pieno ) se: livello = 5 litri allora: stampa( Metà ) livello = 5 NO SI stampa( Metà ) se: livello = 1 litri allora: stampa( Quasi vuoto ) livello = 1 NO SI stampa( Quasi vuoto ) Fine
Soluzione 1a (codice C) void verifica_livello( int livello ) { if (livello == 9){ printf( Quasi pieno ); if (livello == 5){ printf( Metà ); if (livello == 1){ printf( Quasi vuoto );
Soluzione 1b (codice C) void verifica_livello(void){ switch(livello){ case 9: printf( Quasi pieno ) break; case 5: printf( Metà ); break; case 1: printf( Quasi vuoto ); break;
Problema 3 Modificare la precedente routine gestione_valvola(), in pseudo-codice, e poi in C, in maniera che il controllo del livello sia continuativo ed interrompibile. I livelli sono scelti da voi. Il serbatoio contiene max 10 litri. Si hanno a disposizione le seguenti funzioni e variabili definite esternamente: chiudi_valvola() apri_valvola() livello
Soluzione 3 (pseudo-codice) inizio ciclo Inizio ciclo se: livello = 9.5 litri allora: chiudi_valvola() se: livello = 0.5 litri allora: apri_valvola() livello = 9.5 NO livello = 0.5 SI SI chiudi_valvola() apri_valvola() se interrotto NO allora: esci altrimenti: torna a Inizio ciclo NO interrotto? SI Fine
Soluzione 3a (codice C) void verifica_livello(void){ while(!interrotto){ if (livello == 9.5) chiudi_valvola(); if (livello == 0.5) apri_valvola(); //while
Soluzione 3b (codice C) void verifica_livello(void){ bool interrotto = false; char input; do{ if (livello == 9.5){ chiudi_valvola(); if (livello == 0.5){ apri_valvola(); input = getch(); if (input == 'E' input == 'e') interrotto=true; while(!interrotto);
Problema 4 Sviluppare una semplice routine (basandosi anche sulle precedenti) in pseudo-codice, e poi in C, che verifichi lo stato dei 3 serbatoi di vernice da 50 litri ciascuno di un apparecchio per il tracciamento delle strisce delle strade. Si hanno a disposizione le seguenti funzioni e variabili definite esternamente: printf( Testo da stampare ) livello0, livello1, livello2, livello3
Soluzione 4 (pseudo-codice) n_serbatoi = 4 n_serbatoi = 4 cont_serb < 4 NO per ciascuno verifica: SI se: livello = 9 litri allora: stampa( Quasi pieno ) se: livello = 5 litri livello = 9 NO SI stampa( Quasi pieno ) allora: stampa( Metà ) livello = 5 SI stampa( Metà ) se: livello = 1 litri NO allora: stampa( Quasi vuoto ) NO livello = 1 SI stampa( Quasi vuoto ) Fine
Soluzione 4a (codice C) int liv_serbatoio, n_serbatoi = 4; for ( int n_ciclo = 0 ; n_ciclo < n_serbatoi ; n_ciclo++ ) { switch (n_ciclo) { case 0: liv_serbatoio = serbatoio0; break; case 1: liv_serbatoio = serbatoio1; break; case 2: liv_serbatoio = serbatoio2; break; case 3: liv_serbatoio = serbatoio3; break; void verifica_livello ( int livello ) { if (livello == 9){ printf( Quasi pieno ); if (livello == 5){ printf( Metà ); if (livello == 1){ printf( Quasi vuoto ); verifica_livello ( liv_serbatoio ) ;
Soluzione 4b (codice C) int liv_serbatoio [ 4 ] ;... assegna_livello ( liv_serbatoio );... for ( int n_ciclo = 0 ; n_ciclo < n_serbatoi ; n_ciclo++ ) { verifica_livello ( liv_serbatoio [ n_ciclo ] ) ; void verifica_livello ( int livello ) { if (livello == 9){ printf( Quasi pieno ); if (livello == 5){ printf( Metà ); if (livello == 1){ printf( Quasi vuoto );
Bibliografia e approfondimenti Il linguaggio C, B. Kernighan, D. Ritchie, 2 a ed., 2004, Pearson/Prentice-Hall C - Corso completo di programmazione, H. Deitel, P. Deitel, 3 a ed., Apogeo, 2007 http://staff.polito.it/claudio.fornaro/corsoc/02- LinguaggioC.pdf https://www.quora.com/what-is-the-most-obfus cated-c-code-you-have-ever-seen
Contatti su FB: https://www.facebook.com/mauro.casula sito: http://www.bodale.it email personale: bodale@gmail.com email personale GULMh: segretario@gulmh.it
FINE