FONDAMENTI DI INFORMATICA 2
Transcript
FONDAMENTI DI INFORMATICA 2
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 2008/2009 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 2008 Fondamenti di Informatica 2 2 Struttura dei programmi C /* Somma sequenze di numeri */ #include <stdio.h> Direttive al pre-processore C main() { Dichiarazioni di costanti e di int numero, somma; variabili somma = 0; scanf(“%d”,&numero); while(numero!=0) Formato corretto { somma = somma+ numero; delle istruzioni di scanf(“%d”,&numero); I/O printf e scanf } printf(“La somma è: %d\n”,somma); } Giorgio Giacinto 2008 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 2008 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 2008 Fondamenti di Informatica 2 5 Dichiarazione di variabili (cont.) float x,y; int i,j; char 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 2008 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 2008 Fondamenti di Informatica 2 7 Dichiarazione di costanti (cont.) const const const const float float int char PiGreco = 3.14; PiGreco = 3.1415, e = 2.718; N = 100, M = 1000; 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 2008 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 2008 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 2008 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 2008 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 2008 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 2008 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 2008 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 2008 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 2008 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 2008 Fondamenti di Informatica 2 17 Esercizi 1. Scrivere un programma che legge un numero e ne stampa il valore assoluto o modulo. Usare un’istruzione condizionale priva del ramo else. 2. Scrivere un programma che, letto un numero, stampi il valore 1 se questo è dispari, 0 se è pari. 3. Scrivere un programma che legga un numero n da stdin ed esegua la sommatoria dei successivi n numeri di posto pari e la sommatoria dei successivi n numeri di posto dispari. 4. Scrivere un programma per il calcolo del minimo comune multiplo tra due numeri. 5. Scrivere un programma che, dati un numero diverso da 0, e una sequenza di numeri terminata da uno 0, stampi in uscita 1 se il primo numero esiste nella sequenza, 0 in caso contrario. Giorgio Giacinto 2008 Fondamenti di Informatica 2 18 Esercizi (cont.) 6. Scrivere un programma C che realizzi la seguente operazione di “taglia e incolla”: viene fornito un testo costituito da una sequenza di parole separate fra loro da uno spazio e terminate da un %. Dopo il % vi sono tre numeri positivi n, m, p con n ! m. Il testo in uscita deve essere ottenuto da quello di ingresso spostando la porzione compresa fra la n-esima e la m-esima posizione, estremi inclusi, in posizione p-esima. 7. Siano date in stdin due serie di numeri separate tra loro da un & e chiuse da un %. Scrivere un programma che stampa in uscita una serie contenente tutti e solo i numeri presenti in entrambe le serie. Anche se un numero fosse contenuto più di una volta in una serie, dovrebbe comunque essere presente una sola volta nella serie di uscita. Giorgio Giacinto 2008 Fondamenti di Informatica 2 19