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