Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria per l Ambiente ed il Territorio Corso di Laurea Specialistica in Ingegneria Civile - Strutture FONDAMENTI DI INFORMATICA 2 http://www.diee.unica.it/giacinto/fi2 ESECUZIONE DI PROGRAMMI C SU MACCHINE REALI Docente: Giorgio Giacinto AA 2009/2010 Introduzione! Nella sezione precedente ci siamo concentrati sulla formalizzazione degli algoritmi in linguaggio C! Sono state introdotte solo alcune istruzioni fondamentali! In questa sezione introduciamo gli ulteriori elementi essenziali per la scrittura di un programma in C Giorgio Giacinto 2009 Fondamenti di Informatica 2 2
Struttura dei programmi C /* Somma sequenze di numeri */ #include <stdio.h> main() { int numero, somma; somma = 0; scanf( %d,&numero); while(numero!=0) { somma = somma+ numero; scanf( %d,&numero); } printf( La somma è: %d\n,somma); } Direttive al pre-processore C Dichiarazioni di costanti e di variabili Formato corretto delle istruzioni di I/O printf e scanf Giorgio Giacinto 2009 Fondamenti di Informatica 2 3 La parte dichiarativa dei programmi! Il linguaggio C chiede che tutte gli identificatori usati all interno del programma vengano dichiarati! Facilita l individuazione di errori (ad esempio si scrive alba anziché alfa, dove alfa è stata dichiarata, mentre alba no)! Notifica al C che tipo di valori dovrà memorizzare (caratteri, numeri interi, numeri in virgola mobile, ecc.)! La parte dichiarativa precede la parte esecutiva che contiene le istruzioni. Giorgio Giacinto 2009 Fondamenti di Informatica 2 4
Dichiarazione di variabili! Sintassi <identificatore_di_tipo> <lista_dichiarazione> <identificatore_di_tipo>::=int float char <lista_dichiarazioni>::= <dichiarazione>[{,<dichiarazione>}]; <dichiarazione>::= <identificatore> <identificatore> = <valore_iniziale> tipo: l insieme dei valori che la variabile può assumere int: interi; float: virgola mobile; char: carattere, ecc. Giorgio Giacinto 2009 Fondamenti di Informatica 2 5 Dichiarazione di variabili (cont.) float int char x,y; i,j; simb; Significato: Nel programma si useranno le variabili x e y come numeri in virgola mobile, i e j come interi e simb come carattere Ne consegue che, ad es., j non potrà mai assumere il valore 3.14 (qual è il risultato di j=3.14;?) Giorgio Giacinto 2009 Fondamenti di Informatica 2 6
Dichiarazione di costanti Sintassi const <identificatore_di_tipo> <lista_dichiarazione> <identificatore_di_tipo>::=int float char <lista_dichiarazioni>::= <dichiarazione>[{,<dichiarazione>}]; <dichiarazione>::= <identificatore> = <valore_iniziale> Una dichiarazione di costante associa in maniera permanente un valore ad un identificatore per la durata dell esecuzione del programma Giorgio Giacinto 2009 Fondamenti di Informatica 2 7 Dichiarazione di costanti (cont.) const float PiGreco = 3.14; const float PiGreco = 3.1415, e = 2.718; const int N = 100, M = 1000; const char Car1 = G, Car2 = R ; La definizione di costanti è utile! Per utilizzare un identificatore simbolico nel corpo del programma (ad es. PiGreco al posto di 3.14) che ne migliora la comprensibilità! Per poter parametrizzare il programma. Se si desidera cambiare il valore di una costante non è necessario rintracciarne tutte le occorrenze nel programma, ma è sufficiente modificare la dichiarazione iniziale. Giorgio Giacinto 2009 Fondamenti di Informatica 2 8
Il preprocessore C! Costituisce la prima fase della compilazione di un programma in linguaggio C! La direttiva #include viene usata per includere nel programma corrente il contenuto del file specificato.! La direttiva #define viene usata per sostituire ad un identificatore una stringa arbitraria di caratteri! Ad es. #define DIMENSIONE 100 ad ogni occorrenza di DIMENSIONE il preprocessore sostituisce il valore 100! A differenza di una costante, non è una variabile in memoria, ma la sostituzione viene effettuata dal compilatore prima della compilazione vera e propria Giorgio Giacinto 2009 Fondamenti di Informatica 2 9 #include! E comodo disporre di un certo insieme di funzioni e definizioni di libreria.! Sono funzioni e definizioni che estendono le funzionalità di base del linguaggio C! Le funzioni di libreria possono essere definite dall utente oppure appartenere a un insieme definito dallo standard ANSI C! Le funzioni della libreria standard sono disponibili in qualunque ambiente di programmazione e hanno sempre la stessa sintassi Giorgio Giacinto 2009 Fondamenti di Informatica 2 10
#include <stdio.h>! Il linguaggio C in senso stretto non possiede istruzioni per realizzare I/O! In ciascun ambiente di programmazione sono sempre disponibili le funzioni scanf e printf! Le funzioni per l I/O sono sempre definite nel file stdio.h! #include <stdio.h> produce come effetto l inclusione nel programma corrente del file stdio.h. ed è necessario per usare le funzioni di I/O (come ad es. printf e scanf) Le parentesi angolate <> indicano che il file si trova nella directory predefinita dal compilatore che contiene le libreria standard. Giorgio Giacinto 2009 Fondamenti di Informatica 2 11 Sintassi di printf! E la funzione che consente di generare un output formattato sul dispositivo di uscita standard! printf(stringa_di_controllo, elementi_da_stampare)! La stringa_di_controllo è una stringa (racchiusa fra ) che viene stampata in uscita e che può contenere caratteri di conversione o di formato preceduti dal simbolo % e altri simboli (ad es., \n provoca un salto a nuova riga)! %d per stampare un intero! %c per stampare un carattere! %f per stampare un numero reale (floating point)! %s per stampare una stringa di caratteri Giorgio Giacinto 2009 Fondamenti di Informatica 2 12
Sintassi di printf (cont.)! printf(stringa_di_controllo, elementi_da_stampare)! Gli elementi_da_stampare sono costituiti da una lista di variabili, costanti, espressioni (gli elementi sono separati da virgola), nello stesso ordine in cui compaiono i corrispondenti caratteri di conversione nella stringa_di_controllo.! I caratteri preceduti da % vengono detti di conversione perché devono convertire il contenuto delle variabili, costanti ecc. in caratteri stampabili Giorgio Giacinto 2009 Fondamenti di Informatica 2 13 Esempio di utilizzo di printf printf( Lo stipendio annuo dei dipendenti di categoria %d è pari a %f Euro\n,cat,stip); dove cat è definita come variabile intera (int) e stip come variabile reale (float). Se cat contiene il valore 6 e stip il valore 1570.58, l istruzione stampa la stringa seguente Lo stipendio annuo dei dipendenti di categoria 6 è pari a 1570.5 Euro e il cursore viene spostato sulla riga seguente Giorgio Giacinto 2009 Fondamenti di Informatica 2 14
Esempio di utilizzo di printf (cont.) printf(%s\n%c%c\n\n%s\n, Questo programma è stato scritto da,iniz-nome,iniz-cognome, Buon lavoro! ); Se iniz-nome e iniz-cognome sono definite come variabile carattere (char) e contengono rispettivamente M e P l istruzione stampa la stringa seguente: Questo programma è stato scritto da MP Buon lavoro! e il cursore viene spostato sulla riga seguente Giorgio Giacinto 2009 Fondamenti di Informatica 2 15 Sintassi di scanf scanf(stringa_di_controllo, elementi_da_leggere);! La stringa_di_controllo contiene una lista di caratteri di conversione o di formato preceduti dal simbolo % (la lista è racchiusa fra ) In questo modo di specifica il formato con cui devono essere interpretati i caratteri letti da tastiera! La lista di elementi_da_leggere contiene i nomi preceduti da & delle variabili in cui devono essere memorizzati i dati letti da tastiera (gli elementi sono separati da virgole). Le variabili sono nello stesso ordine degli elementi da leggere specificati dalla stringa_di_controllo. Giorgio Giacinto 2009 Fondamenti di Informatica 2 16
Esempio di utilizzo di scanf scanf( %c%c%c%d%f,&c1,&c2,&c3,&i,&x); Se al momento dell esecuzione l utente inserisce ABC 3 7.345 c1 conterrà A (c1 deve essere definita di tipo char) c2 conterrà B (c2 deve essere definita di tipo char) c3 conterrà C (c3 deve essere definita di tipo char) i conterrà 3 (i deve essere definita di tipo int) x conterrà 7.345 (x deve essere definita di tipo float) N.B. Il significato di & sarà chiaro nella sezione successiva Giorgio Giacinto 2009 Fondamenti di Informatica 2 17