Professional Documents
Culture Documents
Introduzione al linguaggio
e allambiente di lavoro Dev-C++
Universit degli Studi di Brescia
Prof. Massimiliano Giacomin
Prof. M. Giacomin
Perch il C?
Linguaggio ad alto livello:
- astrazione vs. linguaggio macchina
- portabilit
Efficienza
- Ad oggi, uno dei linguaggi pi utilizzati per applicazioni
embedded o che comunque richiedono efficienza
(es: controllo di sistemi industriali, sistemi real-time)
Sufficientemente semplice, ma
Base per linguaggi pi evoluti
Prof. M. Giacomin
C
(D. Ritchie, Bell Labs, 1972)
UNIX
C tradizionale
(Kernighan & Rithchie, 1978,
Il linguaggio di Programmazione C )
Prof. M. Giacomin
C tradizionale
(Kernighan & Rithchie, 1978,
Il linguaggio di Programmazione C )
C89
(ANSI-C)
Aggiornato
C99
Non supportato da tutti i compilatori
Prof. M. Giacomin
Il C ed altri linguaggi
Simula 67
(comparsa degli oggetti
C++
(B. Stroustrup, Bell Labs, 80)
Java
(J. Gosling, Sun Microsystems, 90)
Prof. M. Giacomin
Uso di un compilatore:
programma che traduce tutte le istruzioni di un linguaggio di alto
livello (il C) in linguaggio binario, che pu essere interpretato
dal calcolatore
programma
sorgente
compilatore
Programma
oggetto o
eseguibile
linguaggio macchina
segnalazione errori
Prof. M. Giacomin
int n, g;
scanf("%d",&primo);
LINGUAGGIO C
COMPILATORE
0
1
Prof. M. Giacomin
0101011110011001
1101011110011111
0111000000011001
1101011100011101
0110011110011001
0101000111011000
1010011110011001
0101111110000000
0101010010011001
0111000000011001
0101000111011000
0101111110000000
0101111110000000
0001111110000000
zona della
memoria che
contiene le
istruzioni
IMPLEMENTAZIONE
zona della
memoria che
contiene i dati
Prof. M. Giacomin
editor
programma
sorgente
Calcolosomma.c
(programma in C)
compilatore
programma
eseguibile
DATI
RISULTATI
ESECUZIONE
AL
CALCOLATORE
Calcolosomma.exe
ERRORI A TEMPO
DI COMPILAZIONE
Prof. M. Giacomin
ERRORI A TEMPO
DI ESECUZIONE
ERRORI
LOGICI
10
IDE
Integrated Development Environment: Ambiente di sviluppo integrato
> comprende una variet di strumenti coordinati per supportare il
processo di sviluppo dei programmi (creazione, traduzione,
esecuzione, test, ), tra cui:
- editor
- compilatore
- linker
- debugger
- strumenti per la gestione delle configurazioni
- analizzatori statici, strumenti per il test,
> riesce a supportare e automatizzare (parte del) proc. di sviluppo
Dev-C++: IDE per programmi C/C++
- free
- tra i pi semplici a disposizione
(ma noi ne useremo comunque solo una piccola parte!)
Prof. M. Giacomin
11
Note:
Dev-C++ richiede Windows 95/98/NT/2000/XP
All indirizzo www.codeblocks.org reperibile
anche Code::Blocks, per:
- Windows 2000 / XP / Vista
- Linux (Ubuntu & Debian, 32 & 64 bits)
- Mac OS X 10.4+
Un qualunque compilatore va bene per preparare l esame
(non ci saranno domande/esercizi relative ad un compilatore
piuttosto che ad un altro)
Prof. M. Giacomin
12
Installazione di Dev-C++
Scaricare il programma di installazione (vedi sito esercitazioni)
ed eseguirlo, selezionare il linguaggio per installazione ed accettare
i termini di licenza
Select type of install: scegliere full
Scegliere la directory in cui si desidera sia installato Dev-C++
(conviene lasciare quella preimpostata)
Scegliere se installarlo per tutti gli utenti o meno + FINISH
Si arriva alle finestre di configurazione:
- Scegliere il linguaggio (english forse la scelta migliore) + NEXT
- Scegliere se installare la caratteristica di completamento
automatico del codice + NEXT [NB: non necessaria per noi]
- in caso affermativo, appare un altra finestra in cui si chiede se usare
una cache per ottimizzare il processo [NB: come volete] + OK
Prof. M. Giacomin
13
Creazione di un progetto
Per usare Dev-C++ occorre creare un progetto che include tutti i
file necessari nel processo di sviluppo: non solo .c, .obj, .exe ma anche
tutti i file necessari a Dev-C++ per gestire l intero processo
Per creare un progetto:
> Menu File/New/Project
> Appare una finestra per selezionare le caratteristiche del progetto:
- tipo: console, windows, vari tipi di librerie, empty project
- linguaggio: C++, C (spuntate la casella make default language)
- nome del progetto (es. primoprogramma): corrisponder al nome
delleseguibile (es. primoprogramma.exe)
> Viene data la possibilit di selezionare la directory in cui saranno
creati tutti i file del progetto
(consiglio: per ogni progetto createvi una directory separata,
p.es. primoprogramma)
Prof. M. Giacomin
14
15
QUI SCRIVEREMO
IL PROGRAMMA
16
Stampa a video
Premere un tasto per continuare
e aspetta che lutente digiti un tasto prima di continuare
Noi lo utilizziamo per fare in modo che la finestra
di esecuzione non scompaia prima che lutente abbia
potuto vedere il risultato dellesecuzione del programma!
Prof. M. Giacomin
17
Compilazione ed esecuzione
Compilazione + linking:
Menu Execute/Compile
Se tutto ok compare la scritta Done , altrimenti nella finestra in
basso compare una lista di errori (con il doppio click viene sottolineata
la riga del codice sorgente corrispondente)
Esecuzione (dopo aver compilato):
Menu Execute/Run
Salvataggio e caricamento
Per i nostri scopi, si pu salvare l intero progetto con
Menu File/Save all
Per caricare un progetto esistente:
Menu File/Open project or file
e caricare il file progetto (.dev)
Prof. M. Giacomin
18
Linguaggio C:
Variabili e assegnamento
e semplici comandi di I/O
Universit degli Studi di Brescia
Prof. Massimiliano Giacomin
Prof. M. Giacomin
Esempio di programma C
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int x;
Dichiarazione
int y, z;
x=4;
y=5;
z=x+y;
x=x+1;
x=x+y+z;
Istruzioni
- Terminate da ;
- Eseguite in sequenza
delle
variabili usate nel
programma
printf("Ciao mondo\n");
printf(Il valore di x %d\n, x);
system("pause");
return 0;
}
Prof. M. Giacomin
Nome
Valore
LINGUAGGIO C
(Indirizzo)
0101011110011001
1101011110011111
Indirizzo 0111000000011001
1101011100011101
0110011110011001
0101000111011000
1010011110011001
0101111110000000
0101010010011001
Prof. M. Giacomin
IMPLEMENTAZ.
Prof. M. Giacomin
operatori disponibili:
=, +, -, *, ecc. ecc.
st1
spazio di memoria per
matricola
nome
cognome
num_esami
operatori disponibili:
=, .
Dichiarazione di variabili
Prima di essere usata, una variabile deve essere dichiarata
int x;
SINTASSI GENERALE
<tipo> <identificatore>;
<tipo> <identificatore1>, <identificatore2>, ;
Prof. M. Giacomin
IDENTIFICATORI
Nomi usati per identificare le variabili, le funzioni, le macro
Sono sequenze di lettere, cifre e underscore tali che:
- iniziano con una lettera o lunderscore
- non sono keyword (parole riservate del linguaggio C)
Gli identificatori sono case-sensitive
Esempi
int
int
int
int
un_albero, albero1;
1albero;
un-albero;
Abete, abete;
int int;
Prof. M. Giacomin
//
//
//
//
//
//
OK
ERRATO
ERRATO (- non underscore)
CORRETTO (due variabili)
ma non raccomandabile
ERRATO (keyword)
Assegnamento di variabili
Il valore di una variabile pu essere impostato mediante
loperatore di assegnamento =
Sintassi:
<identificatore> = <espressione>;
- variabile
- costante
- costruita a partire da variabili e/o costanti
mediante operatori. Esempio: x + (3*y)
Significato delloperatore di assegnamento:
> prima lespressione viene valutata (viene calcolato un valore)
> poi il valore viene assegnato alla variabile a sinistra
Prof. M. Giacomin
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
x
int x;
int y, z;
1511
x=4;
y=5;
z=x+y;
x=x+1;
x=x+y+z;
printf("Ciao mondo\n");
printf(Il valore di x %d\n, x);
system("pause");
return 0;
}
Prof. M. Giacomin
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
x
int x;
int y, z;
x=4;
y=5;
z=x+y;
x=x+1;
x=x+y+z;
printf("Ciao mondo\n");
printf(Il valore di x %d\n, x);
system("pause");
return 0;
}
Prof. M. Giacomin
10
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
x
int x;
int y, z;
x=4;
y=5;
z=x+y;
x=x+1;
x=x+y+z;
printf("Ciao mondo\n");
printf(Il valore di x %d\n, x);
system("pause");
return 0;
}
Prof. M. Giacomin
11
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
x
int x;
int y, z;
x=4;
y=5;
z=x+y;
x=x+1;
x=x+y+z;
printf("Ciao mondo\n");
printf(Il valore di x %d\n, x);
system("pause");
return 0;
}
Prof. M. Giacomin
12
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
x
int x;
int y, z;
x=4;
y=5;
z=x+y;
x=x+1;
x=x+y+z;
printf("Ciao mondo\n");
printf(Il valore di x %d\n, x);
system("pause");
return 0;
}
Prof. M. Giacomin
13
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
x
int x;
int y, z;
x=4;
y=5;
z=x+y;
x=x+1;
x=x+y+z;
19
printf("Ciao mondo\n");
printf(Il valore di x %d\n, x);
system("pause");
return 0;
}
Prof. M. Giacomin
14
Prof. M. Giacomin
15
16
Inizializzazione di variabili
Nella definizione le variabili possono essere inizializzate con
un valore, assegnato loro contestualmente alla creazione
int x=3 ,y, z=5;
Es. 2
int x;
x=3;
Prof. M. Giacomin
// definizione
// assegnamento
Elementi di Informatica e Programmazione Universit di Brescia
17
somme=x+y;
18
Input/Output
Torniamo al programma di esempio
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
x=x+y+z;
printf("Ciao mondo\n");
printf(Il valore di x %d\n, x);
system("pause");
return 0;
Ciao mondo
Il valore di x 19
Premere un tasto per
continuare
Prof. M. Giacomin
19
Effetto:
stampa la stringa di formato, che contiene caratteri comuni
e specifiche di conversione che iniziano con il simbolo % (es: %d)
i caratteri comuni vengono stampati normalmente
ad ogni specifica di conversione corrisponde unespressione
nella lista degli elementi da stampare: una specifica di conversione
provoca la stampa del corrispondente valore, dopo averlo
convertito nel formato di stampa specificato dalla specifica
di conversione stessa (es: %d per il formato decimale degli interi)
Prof. M. Giacomin
20
\n
Esempio 1
printf( fuori );
printf( gioco\n );
Esempio 2
int gbarca=2;
int gmilan=2;
printf( Gran risultato\nBarcellona %d Milan %d ,gbarca,gmilan);
21
Es.
scanf( %d , &variabile);
22
Esempio
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int num;
int successivo;
printf("Inserisci un numero\n");
scanf("%d",&num);
successivo=num+1;
printf(Successivo a %d uguale a %d\n",num,successivo);
system("pause");
return 0;
}
Prof. M. Giacomin
23
24
Commenti in C
Si possono inserire commenti per spiegare alcuni dettagli del
codice: ovviamente necessario che vengano marcati affinch
il compilatore li possa ignorare
Tutto ci che tra /* e */ (anche su pi righe) un commento:
/* questo
un commento */
Prof. M. Giacomin
25
Linguaggio C
strutture di controllo:
strutture sequenziali e condizionali
Strutture di controllo
Controllano il flusso di esecuzione delle istruzioni: quali istruzioni
devono essere eseguite sulla base dello stato di esecuzione
Tipologie di strutture di controllo:
- struttura sequenziale
- istruzioni di selezione (condizionali)
- istruzioni cicliche (iterative)
Prof. M. Giacomin
STRUTTURA SEQUENZIALE
Istruzioni non composte
Istruzioni composte o blocchi
Prof. M. Giacomin
<istruzione3>
...
Struttura di base del C: le istruzioni sono eseguite in sequenza
(una dopo laltra)
Due tipi di istruzioni:
- non composta - termina con un punto e virgola
- composta racchiusa tra parentesi graffe, non termina con ;
Prof. M. Giacomin
// istruzione vuota!
<tipo> <identificatore>;
// dichiarazione variabile
<identificatore> = <espressione>;
//assegnamento
Prof. M. Giacomin
Prof. M. Giacomin
ESEMPIO 1
printf(Ciao);;
Prof. M. Giacomin
ESEMPIO 2
int a=3;
{ int primo, secondo, somma;
printf("Inserisci due numeri interi\n");
scanf("%d%d",&primo,&secondo);
somma=primo+secondo;
printf("Somma uguale a %d\n",somma);
}
Prof. M. Giacomin
ESEMPIO 3
int a=3;
{ int primo, secondo, somma;
printf("Inserisci due numeri interi\n");
scanf("%d%d",&primo,&secondo);
somma=primo+secondo;
printf("Somma uguale a %d\n",somma);
};
ESEMPIO 4
{ int primo, secondo, somma;
printf("Inserisci due numeri interi\n");
scanf("%d%d",&primo,&secondo);
somma=primo+secondo;
printf("Somma uguale a %d\n",somma);
{
int a;
printf(Inserisci un numero per continuare\n);
scanf(%d, &a);
}
}
Prof. M. Giacomin
10
ISTRUZIONI
CONDIZIONALI
Prof. M. Giacomin
11
Istruzioni condizionali
Permettono di eseguire unistruzione (non composta o blocco)
solo se si verifica una data condizione
La condizione pu essere vera o falsa
In C, esistono diverse istruzioni condizionali
Prof. M. Giacomin
12
Semantica
if (<condiz>)
<istruzione>
condiz
istruzione
13
ESEMPIO 1
int n;
scanf(%d, &n);
int n;
scanf( %d , &n);
n<0
if(n<0)
printf( Numero inserito negativo!\n );
printf(Ciao\n);
printf(negativo!\n);
printf(Ciao\n);
Prof. M. Giacomin
14
Prof. M. Giacomin
15
int n;
printf( Inserisci et );
scanf( %d , &n);
if(n>=18)
{
printf( Hai %d anni , n);
printf( quindi sei maggiorenne\n );
printf()
printf()
n>=18
}
printf( Ti saluto\n );
printf()
Prof. M. Giacomin
16
uguale
minore
minore o uguale
maggiore
maggiore o uguale
non uguale
17
Esercizio
Scrivere un frammento di codice C che, data una variabile intera
n, la trasforma nel suo valore assoluto.
Prof. M. Giacomin
18
Esercizio
Scrivere un frammento di codice C che, data una variabile intera
n, la trasforma nel suo valore assoluto.
int n;
if(n <0)
n = -n;
Prof. M. Giacomin
19
Sintassi
if (<condiz>)
<istruzione-1>
else
<istruzione-2>
condiz
istruzione-1
istruzione-2
...
20
ESEMPIO
printf()
printf( la variabile a contiene un numero );
if(a>=0)
printf( positivo\n );
else
printf( negativo\n );
a>=0
printf
( positivo );
F
printf
( negativo );
Prof. M. Giacomin
21
Prof. M. Giacomin
22
Esempio errato
if(x==1)
printf( La variabile x vale solo 1\n );
if(x==2)
printf( La variabile x ha valore 2\n );
else printf( La variabile x ha valore diverso da 1 e 2\n );
Prof. M. Giacomin
23
Esempio 2
if(x>y){
if(x>=0)
printf( il maggiore x ed positivo\n );
}
else printf( il maggiore y\n );
Prof. M. Giacomin
24
NOTA TECNICA
Nel caso di istruzioni IF-ELSE una dentro laltra , un else
si riferisce sempre allif pi vicino (privo di else)
Esempio
if(x>y)
if(x>=0)
printf( il maggiore x ed positivo\n );
else printf( il maggiore x ed negativo\n );
EQUIVALENTE A
if(x>y){
if(x>=0)
printf( il maggiore x ed positivo\n );
else printf( il maggiore x ed negativo\n );
}
Prof. M. Giacomin
25
Esercizio finale
Scrivere un programma che determini il massimo valore tra
quattro numeri acquisiti da tastiera.
Prof. M. Giacomin
26
Esercizio finale
Scrivere un programma che determini il massimo valore tra
quattro numeri acquisiti da tastiera.
UNIDEA
1) Acquisisci i numeri (x, y, v, z)
2) max=x;
se(y>max) max=y;
se(v>max) max=v;
se(z>max) max=z;
Prof. M. Giacomin
27
#include <stdlib.h>
#include<stdio.h>
int main(int argc, char *argv[]){
int x,y,v,z,max;
printf("Inserisci x\n");
scanf("%d",&x);
//lo stesso per y,v,z
max=x;
if(y>max)
max=y;
if(v>max)
max=v;
if(z>max)
max=z;
printf("Massimo = %d\n", max);
system("pause");
}
Prof. M. Giacomin
28
ERRORI TIPICI
Prof. M. Giacomin
29
30
31
Linguaggio C
strutture di controllo:
strutture iterative
Istruzioni iterative
Sono chiamate anche cicli
Permettono di eseguire pi volte unistruzione, o un blocco di
istruzioni, che costituisce il corpo del ciclo
Prevedono di specificare una condizione di permanenza del ciclo:
fintantoch la condizione vera viene eseguita una nuova
iterazione del ciclo (ovvero, le istruzioni nel corpo del ciclo
vengono eseguite)
Tipologie di cicli:
- cicli a condizione iniziale: while e for
- cicli a condizione finale: do-while
Prof. M. Giacomin
Istruzione while
Sintassi
Semantica
while (<condiz>)
<istruzione>
<condiz>
V
<istruzione>
Esempio
Acquisizione dallutente di un intero, continuando a ripetere linput
se lutente inserisce un numero strettamente negativo
printf( Inserire un numero maggiore o uguale a 0\n );
scanf( %d ,&n);
while(n<0)
scanf( %d ,&n);
Nota
Poich la condizione valutata allinizio del ciclo, il corpo
del ciclo potrebbe non essere mai eseguito (nellesempio, se
l utente inserisce subito un valore positivo)
Prof. M. Giacomin
Semantica
do
<istruzione>
while (<condiz>);
<istruzione>
V
<condiz>
F
...
Prof. M. Giacomin
Prof. M. Giacomin
Un primo modo
Ovviamente, mi serve un ciclo che continui ad acquisire
numeri fino a quando il numero inserito non sia corretto
(strettamente maggiore di 100).
Dato che devo acquisire almeno un numero, posso pensare di
usare un ciclo do-while (a condizione finale)
do{
printf( Inserisci un numero strettamente maggiore di 100\n );
scanf( %d , &n);
}
while (n<=100);
printf(Numero inserito = %d\n, n);
Prof. M. Giacomin
Il programma completo
#include <stdio.h>
#include <stdlib.h>
do{
printf("Inserisci un numero strettamente maggiore di 100\n");
scanf("%d", &n); }
while (n<=100);
10
11
Il programma completo
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char*argv[]){
int n;
printf("Inserisci un numero strettamente maggiore di 100\n");
scanf("%d", &n);
while (n<=100){
printf( Forse non mi sono spiegato bene: ");
printf( il numero deve essere strettamente maggiore di 100\n );
printf( Riprova per favore\n );
scanf("%d", &n);
}
printf("Numero inserito = %d\n", n);
system("PAUSE");
return 0;
}
Prof. M. Giacomin
12
CASI PARADIGMATICI
Alcuni esempi fondamentali che necessario comprendere
Nella pratica questi schemi vanno combinati in vario modo,
a seconda del problema da affrontare: non sono ricette semplici
da consultare e applicare pedissequamente, quindi non bisogna
impararli ma assimilarli come un gesto tecnico sportivo
(come? P.es. ricostruendoli da soli)
Saranno proposti esercizi individuali che costituiscono
varianti degli esempi successivi
Prof. M. Giacomin
13
Prof. M. Giacomin
14
ESEMPIO
Stampa 10 asterischi utilizzando un ciclo
n=1;
while(n<=10){
printf(* );
n=n+1;
}
15
CONSIGLIO
Abituatevi subito a
dare un significato preciso alle variabili :
stabilire cosa rappresentano esattamente ad ogni
iterazione (quando viene controllata la condizione)
Anche se adesso sembra inutile,
meglio imparare su esempi facili
Se imparate adesso, gli esercizi desame
non saranno tanto pi difficili di questi;
altrimenti, sembreranno pi complicati di
quello che in realt sono
Prof. M. Giacomin
16
Prof. M. Giacomin
17
Prof. M. Giacomin
18
Esempio
Vogliamo stampare i numeri da 10 a 1
int n;
n=10;
while(n>=1){
printf( %d\n ,n);
n=n-1;
}
Prof. M. Giacomin
19
Esempio
Scrivere un programma che acquisisce un intero positivo n
e stampa tutti i numeri pari da 2 a n.
Prof. M. Giacomin
20
Esempio (continua)
Scrivere un programma che acquisisce un intero positivo n
e stampa tutti i numeri pari da 2 a n.
Soluzione
Uso un ciclo while con i che va da 2 a n (max pari<=n)
e che scandisce i numeri pari: deve essere incrementata di 2
[es: se n = 11 deve stampare 2, 4, 6, 8, 10]
Prof. M. Giacomin
21
Esempio (continua)
Scrivere un programma che acquisisce un intero positivo n
e stampa tutti i numeri pari da 2 a n.
Soluzione
Uso un ciclo while con i che va da 2 a n (max pari<=n)
e che scandisce i numeri pari: deve essere incrementata di 2
[es: se n = 11 deve stampare 2, 4, 6, 8, 10]
i=2;
// numero da stampare
while(i<=n){
printf( %d\n ,i);
i=i+2;
}
Prof. M. Giacomin
22
Il programma completo
#include <stdio.h>
#include <stdlib.h>
while(i<=n){
printf(%d\n,i);
i=i+2;
}
system("PAUSE");
return 0;
}
Prof. M. Giacomin
23
Prof. M. Giacomin
24
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dallutente fino a quando lutente inserisce il numero 0.
Per ogni numero acquisito (0 escluso), il programma stampa a video
il numero successivo.
ESEMPIO DI ESECUZIONE:
2
Successivo = 3
5
Successivo = 6
0
Premi un tasto per continuare
Prof. M. Giacomin
25
Variante 1
int num;
(!!!)
Variante 2
int num;
(!!!)
26
NUOVO
ELEMENTO
aggregatoprec
aggregato
Esempi: somma/prodotto/minimo/massimo di sequenze di valori
Idea di base:
o Si usa una variabile per laggregato inizializzata a un valore
opportuno (tipicamente: elemento neutro di una operazione
o sulla base del primo elemento delle sequenza)
o Si scandiscono gli elementi aggiornando la variabile
Prof. M. Giacomin
27
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dallutente fino a quando lutente inserisce il numero 0 e stampa
la somma degli elementi inseriti (se lutente inserisce subito 0,
il programma stampa 0).
Prof. M. Giacomin
28
Prof. M. Giacomin
29
Esempio
Scrivere un programma che continua ad acquisire un intero fino
a quando lutente inserisce il numero 0, quindi stampa il minimo
tra i valori inseriti (zero escluso).
Ad esempio, se l utente inserisce 10 3 4 7 2 9 9 2 0
il programma stampa 2.
Prof. M. Giacomin
30
Prof. M. Giacomin
31
32
Prof. M. Giacomin
33
Seconda bozza :
Acquisisci primo numero e assegnalo a min
if(min==0) stampa messaggio di errore
else{
Acquisisci nuovo numero
while(numero!=0){
aggiorna eventualmente min
acquisisci nuovo numero
}
stampa min
}
Prof. M. Giacomin
34
Ad ogni iterazione
controllo
della condizione
35
36
Prof. M. Giacomin
37
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dallutente fino a quando lutente inserisce il numero 0 e verifica
se esiste almeno un numero inserito (0 escluso) pari, stampando
un opportuno messaggio.
Prof. M. Giacomin
38
if(num%2==0)
trovato=1;
scanf(%d, &num);
}
if(trovato==1)
printf(Esiste un numero pari\n);
else printf(Non esiste alcun numero pari\n);
Prof. M. Giacomin
39
40
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dallutente fino a quando lutente inserisce il numero 0 e verifica
se tutti i numeri inseriti (0 escluso) sono pari, stampando
un opportuno messaggio.
Prof. M. Giacomin
41
if(num%2!=0)
tuttipari=0;
scanf(%d, &num);
}
if(tuttipari==1)
printf(Tutti i numeri inseriti sono pari\n);
else printf(Esiste un numero dispari nella sequenza\n);
Prof. M. Giacomin
42
Prof. M. Giacomin
43
Esempio
Scrivere un programma che acquisisce una serie di numeri interi
dallutente fino a quando lutente inserisce il numero 0 e stampa
la somma dei numeri dispari (0 se non ce ne sono).
Prof. M. Giacomin
44
if(num%2!=0)
somma=somma+num;
scanf(%d, &num);
}
printf(Somma numeri dispari = %d\n, somma);
Prof. M. Giacomin
45
con for
n=1;
while(n<=10){
46
n=1;
while(n<=10){
n=n+1;
}
Prof. M. Giacomin
47
ASTRAENDO
Sintassi
Semantica
for(<ass>;<condiz>;<agg>)
<istruz>
<ass>
<condiz>
V
<istruz>
<agg>
48
ESEMPIO A
Stampa numeri da 10 a 1
int n;
for(n=10; n>=1; n=n-1)
printf( %d\n ,n);
ESEMPIO B
Acquisizione di n e stampa numeri pari da 2 a n
int i, n;
scanf(%d, &n);
for(i=2; i<=n; i=i+2)
printf( %d\n ,i);
Prof. M. Giacomin
49
50
for(n=1;n<=10;n=n+1){
if(n==5) break;
if(n==5) continue;
Stampa 1, 2, 3, 4
Prof. M. Giacomin
Stampa 1, 2, 3, 4, 6, 7, 8, 9, 10
51
Esempio
Scrivere un programma che acquisisce 10 numeri interi dallutente
e, per ogni numero acquisito, il programma stampa a video
il numero successivo. Inoltre il programma interrompe lacquisizione
(senza la stampa del successivo) se lutente inserisce il numero 0.
Prof. M. Giacomin
52
scanf(%d, &num);
if(num==0)
break;
printf(Successivo = %d\n , num+1);
}
Prof. M. Giacomin
53
ERRORI TIPICI
Prof. M. Giacomin
54
Prof. M. Giacomin
55
Prof. M. Giacomin
56
(1)
Prof. M. Giacomin
57
(2)
Prof. M. Giacomin
58
Prof. M. Giacomin
59
Linguaggio C
Condizioni composte
(operatori logici)
Universit degli Studi di Brescia
Prof. Massimiliano Giacomin
Prof. M. Giacomin
Condizioni composte
Talvolta nelle strutture if, if-else, while, do-while, for
necessario specificare condizioni composte da condizioni elementari
Esempio
Scrivere un programma in linguaggio C che riceve in ingresso due
interi strettamente positivi: il programma deve ripetere lacquisizione
di entrambi i numeri finch questa condizione non sia verificata.
do{
scanf(%d, &n1);
scanf(%d, &n2);
}while(n1<=0 || n2<=0);
Prof. M. Giacomin
// || indica OR
Operatori logici
Permettono di esprimere una condizione complessa, costruita
a partire da condizioni pi semplici
Il valore di verit della condizione complessa dipende dai
valori di verit delle condizioni pi semplici
!
&&
||
OR (operatore binario)
(<c1> || <c2>) vera se almeno una tra <c1> e <c2>
vera
Prof. M. Giacomin
Esempio
5 <= n < 10
printf(n nellintervallo );
printf([5, 10)\n);
}
printf()
printf()
n=20;
n = 20
Prof. M. Giacomin
Esercizio 1
Scrivere un programma che determini il massimo valore tra
quattro numeri acquisiti da tastiera.
Prof. M. Giacomin
Esercizio 1
Scrivere un programma che determini il massimo valore tra
quattro numeri acquisiti da tastiera.
UNIDEA DIVERSA DA QUELLA GIA VISTA
1) Acquisisci i numeri (x, y, v, z)
2) Se (x>y && x>v && x>z)
il maggiore x
altrimenti //siamo sicuri che x non massimo
se (y>v && y>z)
il maggiore y
altrimenti //siamo sicuri che n x n y siano massimi
se (v>z)
il maggiore v
altrimenti il maggiore z
Prof. M. Giacomin
int x, y, v, z, max;
printf("Inserisci x\n");
scanf("%d%d%d%d",&x, &y, &v, &z);
if(x>y && x>v && x>z)
max=x;
else if(y>v && y>z)
max=y;
else if(v>z)
max=v;
else max=z;
printf("Massimo = %d\n", max);
Prof. M. Giacomin
Esercizio 2
Scrivere un programma che continua ad acquisire un intero fino
a quando lutente non inserisce un numero strettamente positivo
e multiplo di 100, dopodich lo stampa a video.
Esempio:
Lutente inserisce
-100
34
49
200
Prof. M. Giacomin
Lidea
Ovviamente, mi serve un ciclo che continui ad acquisire
numeri fino a quando il numero inserito non sia corretto
(strettamente positivo e multiplo di 100).
Dato che devo acquisire almeno un numero, posso pensare di
usare un ciclo do-while (a condizione finale)
do{
printf(Inserisci un numero str. positivo multiplo di 100\n);
scanf(%d, &n);
} while (!(n>0 && n%100==0));
lo stesso:
Prof. M. Giacomin
Esercizio 3
Scrivere un programma che determini se un anno acquisito
da tastiera bisestile. Un anno bisestile se il suo numero
divisibile per 4, con l'eccezione che gli anni secolari
(quelli divisibili per 100) sono bisestili solo se divisibili per 400
Prof. M. Giacomin
10
Esercizio 3
Scrivere un programma che determini se un anno acquisito
da tastiera bisestile. Un anno bisestile se il suo numero
divisibile per 4, con l'eccezione che gli anni secolari
(quelli divisibili per 100) sono bisestili solo se divisibili per 400
int anno;
printf("Inserisci lanno\n");
scanf(%d, &anno);
if( ((anno % 100 !=0) && (anno % 4 ==0)) || anno%400==0)
printf(Anno bisestile\n");
else printf(Anno non bisestile\n);
Prof. M. Giacomin
11
RISOLVERE
I TEMI DESAME
Docente: M. Giacomin
Arianna Follis
SVILUPPO DI UN PROGRAMMA C
Capire il problema
(eventualmente: provare a risolvere qualche istanza!)
Pensare a come risolverlo (come faremmo noi?)
Arrivare ad un algoritmo per passi successivi,
partendo da una descrizione pi astratta e poi
scomponendola in passi sempre pi elementari
[NB: possibile tornare indietro e modificare
lo schema di partenza]
fino ad arrivare al linguaggio C
Docente: M. Giacomin
PASSI 1 e 2
molto utile risolvere delle istanze a mano
- favorisce la comprensione corretta del problema
- tipicamente suggerisce unidea informale di un algoritmo
NB: se non sapete risolvere voi il problema, improbabile che
ci riesca il vostro programma!
quasi sempre inutile ripescare formule o metodi astrusi
dalla vostra memoria
Docente: M. Giacomin
Docente: M. Giacomin
AVVISI
Vedremo una serie di esercizi tratti dai temi desame:
in un singolo esercizio, i diversi passi possono avere un
ruolo pi o meno accentuato [per alcuni pi complesso il processo
di raffinamento successivo, per altri si arriva direttamente al codice
ma la chiave dare un significato preciso alle variabili, ecc. ecc.]
In aula, vedremo pochi esercizi significativi: tanti esercizi sarebbero
controproducenti, perch quello che importante
- esaminare approfonditamente pochi esercizi significativi, per
imparare in teoria la tecnica
- provare a rifarli da soli (NB: non esiste una sola soluzione!) per
imparare in pratica la tecnica
- provare poi da soli (con l aiuto del compilatore) a farne altri, per
far diventare la tecnica spontanea
QUINDI:
Faremo in aula esercizi tratti dai temi d esame e verranno
poi proposti esercizi desame individuali senza soluzione perch:
- possibile risolverli studiando bene gli esempi gi visti:
se non avete idea di come risolverli, significa che non avete
capito bene la tecnica in teoria e non bisogna guardare la
soluzione, ma riesaminare gli esempi fatti in aula e rifletterci su
- per imparare la tecnica in pratica dovete arrivare in fondo
da soli, senza guardare la soluzione (altrimenti non imparate)
- assolutamente indispensabile commettere errori ma abituarsi
a scoprirli e correggerli da soli (usando il compilatore!)
per poi non commetterli pi: guardando la soluzione uno
non sbaglia e se non si sbaglia non si impara
Docente: M. Giacomin
10
ESERCIZIO 1
Scrivere un programma che calcoli il fattoriale di un numero intero
maggiore o uguale a 0 fornito dallutente.
Docente: M. Giacomin
11
In generale, N! pari a:
1
se N = 0 o N = 1
2**N
se N > 1
0! = 1
Docente: M. Giacomin
12
fatt=fatt*N
Docente: M. Giacomin
13
Docente: M. Giacomin
14
fatt=fatt*i;
printf( Fattoriale di %d = %d\n ,n,fatt);
Docente: M. Giacomin
15
16
ESERCIZIO 2
Scrivere un programma che, ricevuto in ingresso un intero strettamente
maggiore di 0, determini se tale numero primo.
Docente: M. Giacomin
17
ESERCIZIO 2
Scrivere un programma che, ricevuto in ingresso un intero strettamente
maggiore di 0, determini se tale numero primo.
Primo passo: provare a risolvere a mano qualche istanza del problema
Es. 8 non primo ( divisibile per 2 e per 4)
7 primo ( divisibile solo per 1 e per 7, non per 2, 3, 4, 6)
Secondo passo: individuare un metodo risolutivo
Dato N, verifico se divisibile per 2, 3, n-1
se non divisibile per nessuno: il numero primo
se esiste un divisore: il numero non primo
E facile rendersi conto che basta un ciclo con un indice i che
va da 2 a n/2 (divisione intera)
Docente: M. Giacomin
18
if(n%i == 0)
primo=0;
if(primo==1)
printf( Il numero primo\n );
else printf( Il numero non primo\n );
Docente: M. Giacomin
19
ESERCIZIO 3
Scrivere un programma che acquisisce da tastiera un numero intero n
maggiore o uguale a 0 (ripetendo lacquisizione in caso di numero
negativo) ed un intero x, quindi calcola e stampa la sommatoria
n
i
x
i =0
Docente: M. Giacomin
20
21
Docente: M. Giacomin
22
B)
int n, sommatoria, i, potenza;
do
scanf(%d, &n);
while(n<0);
sommatoria=0;
for(i=0;i<=n; i=i+1){
CALCOLA: potenzaxi
x*x*x
i volte
sommatoria = sommatoria+potenza;
}
printf(La sommatoria risulta %d, sommatoria);
Docente: M. Giacomin
23
C)
int n, sommatoria, i, j, potenza;
do
scanf(%d, &n);
while(n<0);
sommatoria=0;
for(i=0;i<=n; i=i+1){
potenza=1;
for(j=1; j<=i; j=j+1)
potenza=potenza*x;
sommatoria = sommatoria+potenza;
}
printf(La sommatoria risulta %d, sommatoria);
Docente: M. Giacomin
24
Ad ogni iterazione:
potenza=potenza*x;
sommatoria=0;
for(i=0;i<=n; i=i+1){
sommatoria = sommatoria+xi;
}
printf(La sommatoria risulta %d, sommatoria);
Docente: M. Giacomin
25
C)
int n, sommatoria, i, j, potenza;
do
scanf(%d, &n);
while(n<0);
sommatoria=0;
potenza=1;
for(i=0;i<=n; i=i+1){
sommatoria = sommatoria+potenza;
potenza=potenza*x;
}
printf(La sommatoria risulta %d, sommatoria);
Docente: M. Giacomin
26
2 3
[10]
27
28
min2
num
E pi facile se mantengo min1 e min2 ordinati
(min1<=min2)
Docente: M. Giacomin
29
Docente: M. Giacomin
30
Docente: M. Giacomin
31
scanf( %d , &num);
while(num!=0){
if(num<min1){
min2=min1;
min1=num;
}
else if(num<min2)
min2=num;
scanf( %d , &num);
}
printf( I numeri minimi sono %d e %d\n , min1, min2);
Docente: M. Giacomin
32
ESERCIZIO 5
Scrivere un programma che, ricevuto in ingresso un intero N0,
calcoli lN-simo elemento della sequenza F dei numeri di Fibonacci,
definita cos:
F(0) = 0
F(1) = 1
F(K) = F(K-1)+F(K-2)
per K2
Docente: M. Giacomin
33
il programma restituisce 1
N=3: 0, 1, 1, 2
il programma restituisce 2
34
Docente: M. Giacomin
35
i = 1;
while(i<N){
Docente: M. Giacomin
36
i = 1;
while(i<N){
Aggiorna Fultimo
Aggiorna Fpenultimo
i=i+1;
}
Docente: M. Giacomin
37
i = 1;
while(i<N){
Aggiorna Fultimo
Aggiorna Fpenultimo
i=i+1;
}
Docente: M. Giacomin
38
i = 1;
while(i<N){
NEWFIB= Fpenultimo+Fultimo;
Fpenultimo=Fultimo;
// aggiorno Fpenultimo
Fultimo=NEWFIB;
// aggiorno Fultimo
i=i+1;
Docente: M. Giacomin
39
i = 1;
while(i<N){
NEWFIB= Fpenultimo+Fultimo;
Fpenultimo=Fultimo;
// aggiorno Fpenultimo
Fultimo=NEWFIB;
// aggiorno Fultimo
i=i+1;
40
fultimo=0;
printf("Numero di Fibonacci %d = %d\n",n,fultimo);
Docente: M. Giacomin
41
Linguaggio C
Tipi predefiniti
int i2;
float f;
LINGUAGGIO C
COMPILATORE
16 bit!
CA2
o CA1 o
32 bit!
CA2
o CA1 o
32 bit!
IMPLEMENTAZIONE
IEEE754
o IBM o DIGITAL o
Prof. M. Giacomin
I TIPI INTERI
Prof. M. Giacomin
Inserire il numero n!
30!
2 elevato alla 30 = 1073741824!
!
Inserire il numero n!
31!
2 elevato alla 31 = -2147483648!
Prof. M. Giacomin
????
6
Inserire il numero n!
31!
2 elevato alla 31 = 2147483648!
!
Inserire il numero n!
32!
2 elevato alla 32 = 0! ????
Prof. M. Giacomin
Prof. M. Giacomin
Specchietto
[signed] char
[signed] int
unsigned char
unsigned int
Prof. M. Giacomin
short int
16 bit
Prof. M. Giacomin
10
32 bit
int
long int
64 bit
Prof. M. Giacomin
11
Esempio 2
int a;
a=300;
Prof. M. Giacomin
12
b = c+13;
13
Costanti carattere
Un carattere tra singoli apici indica il corrispondente valore
numerico secondo il codice adottato (es. ASCII). A rigore il tipo
delle costanti carattere int, non char
Caratteri di escape: rappresentano caratteri particolari, es:
new-line
\b backspace
\ apice singolo
\n
Esempio
char carattere, a=5;
carattere=a;
// carattere=97 (codice ASCII del carattere a)
carattere=a;
// carattere=5
carattere=\n;
// OK
Prof. M. Giacomin
14
15
Formato di stampa
%d (%i)
Notazione decimale
%c
%u
Notazione decimale
%o
Notazione ottale
%x, %X
Notazione esadecimale
(x: lettere minuscole, X: maiuscole)
%ld (%li)
long int
Notazione decimale
%lu
Notazione decimale
%lo
Notazione ottale
%lx, %lX
Notazione esadecimale
(x: lettere minuscole, X: maiuscole)
Prof. M. Giacomin
16
17
Input
%d
int
%c
char
%u
unsigned int
%hd
short int
%hu
%ld
long int
%lu
Esempio
short unsigned int unsint;
scanf(%hu, &unsint);
Prof. M. Giacomin
18
Esempio 2
char carattere;
scanf(%c, &carattere);
printf(Il carattere %c, ma anche %d\n, carattere, carattere);
scanf(%d, &carattere);
ESEMPIO DI
ESECUZIONE
ESEMPIO DI
ESECUZIONE
Prof. M. Giacomin
a
Il carattere a, ma anche 97
97
Il carattere a, ma anche 97
1
Il carattere 1, ma anche 49
19
Esercizio individuale
Acquisire da tastiera un carattere. Determinare se si tratta di
una vocale o di una consonante.
Prof. M. Giacomin
20
Soluzione
Acquisire da tastiera un carattere. Determinare se si tratta di
una vocale o di una consonante.
char n;
printf(Inserisci un carattere\n);
scanf(%c, &n);
if(n==a || n==e || n==i || n==o || n==u)
printf(Il carattere una vocale\n);
else printf(Il carattere una consonante\n);
Prof. M. Giacomin
21
Prof. M. Giacomin
22
double
long double
double
32 bit
Prof. M. Giacomin
64 bit
23
float b=6.3f;
long double c=10.0L;
Prof. M. Giacomin
24
Formato di stampa
%f
float, double
Notazione decimale
%e, %E
float, double
%g, %G
float, double
%Lf
long double
Notazione decimale
%Le, %LE
long double
%Lg, %LG
long double
Prof. M. Giacomin
25
Esempio
float gradi=36.6f;
printf( La tua temperatura di %f gradi , gradi);
Prof. M. Giacomin
26
Esempio
float fl;
double dbl;
long double longdbl;
scanf(%f, &fl);
scanf(%lf, &dbl);
scanf(%Lf, &longdbl);
Prof. M. Giacomin
27
// r1=1
r2=x+(y+1.0)f;
// r2=0
Prof. M. Giacomin
28
Linguaggio C
Operatori, Espressioni e
Conversioni di tipo
Universit degli Studi di Brescia
Prof. Massimiliano Giacomin
Prof. M. Giacomin
Expression statement
<espressione>;
Un particolare tipo di istruzione non composta
Effetto: viene calcolata lespressione (e il risultato si butta via)!!!
Definizione non esaustiva di <espressione>:
- una costante
- una variabile
- un operatore applicato ad espressioni
Prof. M. Giacomin
((a+2)*5)+4;
// IDEM
a==b;
// non <espressione>;
{a==b;}
// non <espressione>;
// bens un blocco!
Prof. M. Giacomin
ESEMPIO SEMPLICE
int a=3, b=7, c=10;
a + b + c*2 + a*(b-a);
Prof. M. Giacomin
Concetto di operatori in C
Sono delle specie di funzioni:
- ricevono in ingresso uno o pi operandi dello stesso tipo
- restituiscono un risultato di un certo tipo (eventualmente diverso)
Esistono operatori binari (due operandi) ed operatori unari
5+2
-(-5)
Per ogni tipo operatori specifici: p.es. per int esiste %, per il float no
Diversi operatori possono avere nome uguale:
p.es. / diverso per int vs. float
* sia binario (moltiplicazione) sia unario (cf puntatori)
Prof. M. Giacomin
DOMANDA LECITA
A COSA SERVONO GLI EXPRESSION STATEMENT?
- tipicamente negli expression statement il programmatore usa
operatori che, oltre a produrre un valore, hanno degli effetti
collaterali (es. cambiano il valore di una variabile, chiamano
una funzione)
Prof. M. Giacomin
Operatore di assegnamento
Sintassi:
<identificatore> = <espressione>
ESEMPIO
int x = 3;
int y;
y = (x+2)*3;
y=(x=3);
y=y+(x=5);
// expression statement
// Effetto: x=5, y=8
Prof. M. Giacomin
Operatori aritmetici
Permettono di effettuare le normali operazioni aritmetiche
Corrispondono a funzioni:
- ricevono in ingresso uno o pi valori (rvalue) dello stesso tipo
- restituiscono un valore (rvalue) dello stesso tipo rispetto a operandi
Sono leggermente diversi per tipi interi o virgola mobile
Prof. M. Giacomin
Prof. M. Giacomin
10
a%2==0
printf(pari)
printf(pari\n);
printf
(dispari)
else
printf(dispari\n);
printf(E comunque un numero!\n);
printf()
Prof. M. Giacomin
11
12
Prof. M. Giacomin
13
Prof. M. Giacomin
14
Prof. M. Giacomin
15
Prof. M. Giacomin
7.666667
16
OVERFLOW
Tra interi signed: comportamento non definito
Tra interi unsigned: risultato modulo 2n (n: numero di bit usati)
Tra valori in virgola mobile: comportamento non definito
Esempi (ipotizzando limiti tipici su macchina a 32 bit)
// max per unsigned long int: 4294967295
unsigned long int ul1=4294967290, ul2=10, ul3;
ul3= ul1+ul2; // ul3=4
// max per signed long int: 2147483647
long int l1=2147483647, l2=1, l3;
l3= l1+l2;
Prof. M. Giacomin
17
Prof. M. Giacomin
18
Prof. M. Giacomin
// y=5, x=6
// equivale a y=x; x=x+1
// x=6, y=6
//x=6, y=6
//equivale a x=x+1;y=x
19
Assegnamenti composti
<e1> <op>= <e2> equivalente a <e1> = <e1> <op> (<e2>)
<e1> lvalue, <e2> rvalue
Disponibile con operatori aritmetici pi comuni, p.es.
Prof. M. Giacomin
a+=b;
// a=a+b
a-=b;
// a=a-b
a*=b;
// a=a*b
a/=b;
// a=a/b
a%=b;
// a=%b
20
Prof. M. Giacomin
21
22
23
Esempio tecnico
int x=5, y, z;
y = (x==5);
\\ y=1
z = (x=5);
\\ z=5
z = (x>5);
\\ z=0
x = (x=x);
\\ x inalterato
x = (x==x);
\\ x=1
x = (x!=x);
\\ x=0
\\ z=0
z = ((x<y) || (y!=1));
\\ z=1
z = !(x<y);
\\ z=0
Prof. M. Giacomin
24
if (<espressione>)
<istruzione>;
<espressione>
0
<istruzione>
Esempio
if(1)
printf(*); //eseguito sempre!
Prof. M. Giacomin
25
WHILE
while (<espressione>)
<istruzione>
<espressione>
0
<istruzione>
Esempio
while(1)
printf(*); //ciclo infinito!
Prof. M. Giacomin
26
FOR
for(<exp1>;<exp2>;<exp3>)
<istruz>
<exp1>;
<exp2>
NB: <exp1>, <exp2>, <exp3>
sono semplicemente espressioni
che tipicamente corrispondono a
un assegnamento, una condizione,
un incremento, rispettivamente!
0
<istruz>
<exp3>;
Prof. M. Giacomin
27
ESEMPI
for(a==b; 5; a++);
// sintatticamente corretto
// a==b non ha effetto
// genera un ciclo infinito!
// sintatticamente scorretto!
printf(*);
for(for(i=1; i<=5; i++) printf(*); a<10; a++)
//sintatt. scorretto!
printf(*);
Prof. M. Giacomin
28
Operatore virgola
Sintassi:
<espressione1> , <espressione2>
Significato:
- prima viene valutata <espressione1>
- poi viene valutata <espressione2>
- il valore restituito quello di <espressione2>
Uso tipico: pi espressioni di inizializzazione in un ciclo for
Esempio: calcolare 1+2++10
for(somma=0, i=1; i<=10; i=i+1)
somma=somma+i;
Prof. M. Giacomin
29
Prof. M. Giacomin
30
Operatori
prefissi
Associativita
++ -- () [] -> . indirez.
postfissi unari
++ -- + - ! ~ & * sizeof
() cast
* / %
binari
+ << >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %= &= ^= |= <<= >>=
,
Prof. M. Giacomin
da sinistra a destra
da destra a sinistra
da destra a sinistra
da sinistra a destra
da sinistra a destra
da sinistra a destra
da sinistra a destra
da sinistra a destra
da sinistra a destra
da sinistra a destra
da sinistra a destra
da sinistra a destra
da sinistra a destra
da destra a sinistra
da destra a sinistra
da sinistra a destra
31
Esempi
int x=5, y=6, z=3;
x= 6+x*y+z;
// x=6+(x*y)+z
y*=x+1;
x=y=z;
ovvero 39
printf();
// x=6 e restituisce 6,
// 6+10 valore dellespressione non usato!
Prof. M. Giacomin
32
Esempio 2
if((i==0) || (j/i >100))
printf (Divisione per 0 o maggiore di 100\n);
Prof. M. Giacomin
33
Conversioni di tipo
Due modalit per convertire un valore di un tipo in un altro tipo
- conversioni implicite:
operate dal compilatore (principalmente) quando un
operatore applicato ad operandi di tipo diverso:
conversione per assicurare che loperatore sia applicato ad
operandi dello stesso tipo!
- conversioni esplicite:
forzate dal programmatore con istruzioni opportune
Prof. M. Giacomin
34
Esempio 2
int a;
float b=2.5f;
double c=3;
a=b+c;
Prof. M. Giacomin
35
int
x+y
float
a*b
double
36
i = f;
c = 20000;
Prof. M. Giacomin
37
ESEMPIO BANALE
long int i;
float f;
i=5L;
i=5;
//nessuna conversione
//conversione da int a long int
f=5;
f=5.0;
f=5.0f;
Prof. M. Giacomin
38
Prof. M. Giacomin
39
Prof. M. Giacomin
40
Prof. M. Giacomin
41
7.000000
Prof. M. Giacomin
42
Prof. M. Giacomin
43
7.666667
Prof. M. Giacomin
44
Prof. M. Giacomin
45
//conversione di 23 a double
//divisione in double
//conversione del risultato a float
printf(La media tra %d e %d e %d fa %f\n, a,b,c,media);
7.666667
Prof. M. Giacomin
46
ESEMPIO DI OVERFLOW
float f;
int x=100000;
f=x*100000;
// 10000000000
Prof. M. Giacomin
47
UN ESEMPIO SEMPLICE?
float a;
a=0.1;
if (a==0.1)
printf(S, uguale\n);
else printf(No, non uguale\n);
Prof. M. Giacomin
48
Prof. M. Giacomin
49
0 0111011 10011001100110011001100
0 0..0111011 1001100110011001100110011001100....
float a;
a=0.1;
if (a==0.1)
esteso
0 0..0111011 10011001100110011001100110011
double:
0 0..0111011 10011001100110011001100000000
Prof. M. Giacomin
50
MORALE
Attenzione ad usare loperatore di confronto == con i tipi non interi
(luguaglianza dovrebbe essere sostituita con lappartenenza
ad un intervallo)
Prof. M. Giacomin
51
Prof. M. Giacomin
52
Prof. M. Giacomin
// fraz=0.2
53
// quoziente=2.5
oppure
quoziente= (float) dividendo / (float) divisore;
ma non con
quoziente= (float) (dividendo / divisore);
Prof. M. Giacomin
54
// 10000000000
Prof. M. Giacomin
55
Commento:
perch non usare sempre il tipo pi grande?
Per risparmiare memoria
- es: sistemi embedded
Per velocizzare lesecuzione degli operandi
- es: calcoli in virgola mobile pi lenti dei calcoli tra interi
Gli interi non sempre rappresentati precisamente in virgola mobile
float f=2123456789;
int x=2123456789;
printf(Come int = %d, x);
// 2123456789
// 2123456768
Prof. M. Giacomin
56
ERRORI TIPICI
Prof. M. Giacomin
57
La condizione SEMPRE
verificata
per qualunque n!!!
La condizione non
MAI verificata
per qualunque n!!!
58
Prof. M. Giacomin
59
Esempio 3
while(n=1){
scanf(%d, &n);
Prof. M. Giacomin
60
APPENDICE TECNICO
Regole di conversione implicita applicate dal C
Prof. M. Giacomin
61
int
unsigned int
62
int
NOTA: assumendo rappresentazione di interi signed in complemento a 2,
la conversione da signed a unsigned viene fatta:
- estendendo il segno se il tipo di arrivo pi grande, poi
- lasciando i bit cos come sono (interpretati come unsigned)
I numeri negativi (bit di segno a 1) diventano positivi grandi!
Prof. M. Giacomin
63
//lo stampa!!!
64
Linguaggio C
Funzioni,
struttura dei programmi,
visibilit e permanenza delle variabili
Universit degli Studi di Brescia
Prof. Massimiliano Giacomin
UN ESEMPIO PILOTA
Scrivere un programma che acquisisce da tastiera un numero intero n
maggiore o uguale a 0 e due numeri in virgola mobile p e q, quindi
calcola e stampa la sommatoria
n
pi
! qi+3
i=0
Vediamo direttamente un possibile pseudocodice
Prof. M. Giacomin
Pseudocodice 1
ACQUISIZIONE n, p, q;
sommatoria=0;
for(i=0;i<=n; i=i+1)
sommatoria = sommatoria+pi/qi+3;
STAMPA sommatoria
Prof. M. Giacomin
Pseudocodice 2
ACQUISIZIONE n, p, q;
sommatoria=0;
for(i=0;i<=n; i=i+1)
CALCOLA: potppi
CALCOLA: potqqi+3
sommatoria = sommatoria+potp/potq;
STAMPA sommatoria
Prof. M. Giacomin
Codice
int n, i, j, k, potp, potq;
float p, q, sommatoria;
scanf(%d, &n);
scanf(%f%f, &p, &q);
sommatoria=0;
for(i=0;i<=n; i=i+1){
potp=1;
for(j=1; j<=i; j++)
potp=potp*p;
potq=1;
for(k=1; k<=i+3; k++)
potq=potq*q;
// potp=pi
// potq=qi+3
sommatoria = sommatoria+potp/potq;
}
printf(La sommatoria risulta %f, sommatoria);
Pseudocodice 1 (REPRISE)
ACQUISIZIONE n, p, q;
sommatoria=0;
for(i=0;i<=n; i=i+1)
sommatoria = sommatoria+pi/qi+3;
STAMPA sommatoria
Prof. M. Giacomin
restituisce 30.25
Codice ipotetico
int n, i;
float p, q, sommatoria;
scanf(%d, &n);
scanf(%f%f, &p, &q);
sommatoria=0;
for(i=0;i<=n; i=i+1)
sommatoria = sommatoria+potenza(p,i)/potenza(q,i+3);
printf(La sommatoria risulta %f, sommatoria);
al linguaggio C
Una funzione ha un nome e:
- riceve in ingresso uno o pi parametri (formali), i cui nomi
sono solo utilizzati come riferimento nella definizione
- esegue un compito specifico
- restituisce un risultato (valore)
Sia i parametri sia il valore restituito hanno ciascuno un tipo
In C, la definizione si esprime con un codice C!
La funzione pu essere chiamata passandole un valore!
Prof. M. Giacomin
DEFINIZIONE DI FUNZIONI
Tipo del
valore restituito
Parametri formali
(parametri della funzione)
return <exp>;
CORPO
DELLA
FUNZIONE
}
Restituisce il valore
ESEMPIO
Nome della
funzione
float
Parametri formali
(parametri della funzione)
Tipo del
valore restituito
pot=pot*b;
return pot;
}
Prof. M. Giacomin
10
ESEMPIO
float
Variabili
locali
float pot=1;
for(k=1;k<=e;k++)
pot=pot*b;
CORPO
DELLA
FUNZIONE
return pot;
}
Prof. M. Giacomin
11
ESEMPIO
float
Tipo del
valore restituito
pot=pot*b;
return pot;
}
Restituisce il valore
(di tipo float)
Prof. M. Giacomin
12
return 0;
}
Esempio
A= potenza(5.5, 2);
float
return pot;
}
Prof. M. Giacomin
14
A= potenza(5.5, 2);
Prof. M. Giacomin
5.5
PARAMETRI
15
A= potenza(5.5, 2);
5.5
PARAMETRI
k
pot
Prof. M. Giacomin
16
A= potenza(5.5, 2);
5.5
PARAMETRI
k 3
pot 30.25
Prof. M. Giacomin
17
A= potenza(5.5, 2.5);
float
return pot;
}
18
// expression statement
// numero di caratteri visualizzati
Prof. M. Giacomin
19
Prof. M. Giacomin
// 5
20
int num;
printf(Inserisci un numero maggiore o uguale a 0\n);
scanf(%d, &num);
while(num<0){
printf(numero negativo, reinseriscilo\n);
scanf(%d, &num);
}
return num;
}
Prof. M. Giacomin
21
Prof. M. Giacomin
22
}
Prof. M. Giacomin
23
}
Prof. M. Giacomin
24
Esempio di chiamata:
printfquadrato(5);
Prof. M. Giacomin
25
DICHIARAZIONE DI FUNZIONI
Concetto valido per tutti gli oggetti (funzioni e variabili):
- dichiarazione: introduce solo il nome e tipologia di un oggetto
- definizione: crea anche loggetto allocando spazio in memoria
Per poter usare un oggetto, questo deve essere stato prima dichiarato
Nel caso di programma in un solo file, per le variabili definizione
e dichiarazione coincidono
Una funzione pu essere invece essere dichiarata prima di essere
definita: la dichiarazione si ottiene con il suo prototipo
(negli esempi precedenti, le funzioni venivano sempre definite
contestualmente alla loro dichiarazione)
Prof. M. Giacomin
26
Prof. M. Giacomin
27
Prof. M. Giacomin
28
}
float potenza(float x, int n){
int i;
float pot=1;
for(i=1;i<=n;i++)
pot=pot*x;
return pot;
}
Prof. M. Giacomin
29
VARIANTE 1
float potenza (float b, int e);
}
float potenza(float x, int n){
int i;
float pot=1;
for(i=1;i<=n;i++)
pot=pot*x;
return pot;
}
Prof. M. Giacomin
30
}
Prof. M. Giacomin
31
Prof. M. Giacomin
32
Prof. M. Giacomin
33
return 0;
}
Prof. M. Giacomin
34
return 0;
}
35
STRUTTURA DI UN PROGRAMMA C
int globale1, globale2;
VARIABILI GLOBALI
VARIABILI LOCALI
e PARAMETRI DEL BLOCCO main
}
int f(int p1, float p2){
int loc1, loc2;
{ int bl1;
float bl2;
{ char bll1;
VARIABILI LOCALI
e PARAMETRI DEL BLOCCO f
VARIABILI DEFINITE
IN UN BLOCCO contenuto in blocco f
VARIABILI DEFINITE IN UN
BLOCCO contenuto nel precedente
}
}
Prof. M. Giacomin
36
Blocco f
Blocco
Blocco
Prof. M. Giacomin
37
f1
chiamata 2
chiamata 1
main
Prof. M. Giacomin
38
A=potenza(5.5, 2);
RECORD DI
ATTIVAZIONE
main
PARAMETRI
e VARIABILI
LOCALI
AMBIENTE
GLOBALE
Prof. M. Giacomin
MEMORIA
PER VARIABILI
GLOBALI
39
RECORD DI
potenza
ATTIVAZIONE
e
k
PARAMETRI
VARIABILI
LOCALI
pot
indirizzo di ritorno
RECORD DI
ATTIVAZIONE
main
PARAMETRI
e VARIABILI
LOCALI
AMBIENTE
GLOBALE
Prof. M. Giacomin
MEMORIA
PER VARIABILI
GLOBALI
40
RECORD DI
potenza
ATTIVAZIONE
5.5
PARAMETRI
VARIABILI
LOCALI
pot
indirizzo di ritorno
RECORD DI
ATTIVAZIONE
main
PARAMETRI
e VARIABILI
LOCALI
AMBIENTE
GLOBALE
Prof. M. Giacomin
MEMORIA
PER VARIABILI
GLOBALI
41
return pot;
RECORD DI
potenza
ATTIVAZIONE
5.5
k 3
pot 30.25
PARAMETRI
VARIABILI
LOCALI
indirizzo di ritorno
RECORD DI
ATTIVAZIONE
main
PARAMETRI
e VARIABILI
LOCALI
AMBIENTE
GLOBALE
Prof. M. Giacomin
MEMORIA
PER VARIABILI
GLOBALI
42
return pot;
A= potenza(5.5, 2);
RECORD DI
ATTIVAZIONE
main
A 30.25
AMBIENTE
GLOBALE
Prof. M. Giacomin
PARAMETRI
e VARIABILI
LOCALI
MEMORIA
PER VARIABILI
GLOBALI
43
int main(){
f1();
}
int f1(){
f2();
f3();
Prof. M. Giacomin
44
main
f1()
AMBIENTE
GLOBALE
Prof. M. Giacomin
45
f1
main
f2()
f1()
AMBIENTE
GLOBALE
Prof. M. Giacomin
46
f2
f1
main
return
f2()
f1()
AMBIENTE
GLOBALE
Prof. M. Giacomin
47
f1
main
f3()
f1()
AMBIENTE
GLOBALE
Prof. M. Giacomin
48
f3
f1
main
return
f3()
f1()
AMBIENTE
GLOBALE
Prof. M. Giacomin
49
f1
main
return
f1()
AMBIENTE
GLOBALE
Prof. M. Giacomin
50
main
AMBIENTE
GLOBALE
Prof. M. Giacomin
51
x=2;
y=3;
f(3);
}
int z;
x=x+1;
}
Prof. M. Giacomin
52
53
Blocco1
Blocco2
Prof. M. Giacomin
In un blocco si
vede (si pu
accedere a)
quanto definito
nel blocco e in
quelli che lo
comprendono
(a meno della
regola successiva)
54
int x;
Blocco1
Blocco2
int x;
Prof. M. Giacomin
Un oggetto
definito in un
blocco B maschera
(rende non visibili)
gli oggetti con lo
stesso nome
definiti nei blocchi
che comprendono B
55
ESEMPIO
VARIABILI GLOBALI
x
i
int x, int i;
int main(int argc,){
int x;
}
f
y
x=5;
i=6;
y=7;
}
Prof. M. Giacomin
x
i
y
Elementi di Informatica e Programmazione Universit di Brescia
56
VARIANTE ESEMPIO
INDEFINITA
int main(int argc,){
int x, int i;
}
int f(int y){
int i;
x=5;
i=6;
y=7;
}
Prof. M. Giacomin
57
58
VARIABILI GLOBALI
Permanenza statica
- Definite una sola volta, esistono fino a fine esecuzione programma
(mantenendo lo stesso spazio in memoria)
Visibili ovunque, mascherate da variabili locali omonime (cf. regole)
Consentono comunicazione tra tutte le funzioni (effetti collaterali)
vglob
funzione1{
.
}
Prof. M. Giacomin
funzione2{
.
}
59
ESEMPIO
int globale;
// esiste sempre!
// stampa 12
void f1(){
globale=globale+1;
}
// globale=6
void f2(){
globale=globale*2;
}
// globale=12
Prof. M. Giacomin
60
Nota
Luso di variabili globali dovrebbe essere limitato a casi specifici
- rendono meno leggibile e comprensibile il codice
- ostacolano il riuso delle funzioni che le riferiscono
Esempio pessimo
int esponente;
float base, potenza;
void potenza();
int main(int argc, char *argv[]){
float x;
base=5.5;
esponente=2;
potenza();
x=potenza;
}
Prof. M. Giacomin
61
Prof. M. Giacomin
//stampa sempre 5
62
// globale
}
void f(){
int x=10;
x=x+1;
}
Prof. M. Giacomin
// maschera x globale
// x=11
63
Nota
Esempio
// scambio di x e y nascondendo temp
if(){
int temp;
temp=x;
x=y;
y=temp;
}
Prof. M. Giacomin
64
65
printf(%d\n, b1);
b1++;
}
66
printf(%d, count);
count=count+1;
}
Prof. M. Giacomin
67
//eccezione
}
Elementi di Informatica e Programmazione Universit di Brescia
68
NOTE RIASSUNTIVE
Permanenza in memoria (o tempo di vita) :
periodo temporale durante il quale la variabile esiste
(dalla creazione: allocazione di memoria ad essa dedicata
alla distruzione: de-allocazione della memoria)
Visibilit:
parte del programma da cui la variabile pu essere riferita.
Permanenza e Visibilit sono concetti distinti:
- la permanenza si riferisce allo stack di attivazione
- la visibilit si determina staticamente dalla struttura del
programma
Prof. M. Giacomin
69
ESERCIZIO INDIVIDUALE
- ESAMINARE IL PROGRAMMA provapermvis
- CERCARE DI INDOVINARE I VALORI
STAMPATI DALLE VARIE printf
- ESEGUIRE IL PROGRAMMA E VERIFICARE
LE PROPRIE RISPOSTE
Prof. M. Giacomin
70
SVILUPPARE PROGRAMMI
CON LE FUNZIONI
Prof. M. Giacomin
71
72
ESEMPIO
Acquisire dallutente due numeri interi n e k.
Calcolare quindi il coefficiente binomiale
n
n!
=
k k!(n k )!
NB: il coefficiente binomiale corrisponde al numero di insiemi
di k elementi scelti da un insieme prefissato di n elementi
Prof. M. Giacomin
73
PASSO 1
int main(int argc, char *argv[]){
int n, k;
unsigned long int binom;
printf("Inserisci n\n");
scanf("%d", &n);
printf("Inserisci k\n");
scanf("%d", &k);
binom=(fattoriale(n)/fattoriale(k))/fattoriale(n-k);
printf("Coefficiente binomiale = %lu\n", binom);
}
Elementi di Informatica e Programmazione Universit di Brescia
74
PASSO 2
unsigned long fattoriale(int num);
int main(int argc, char *argv[]){
int n, k;
unsigned long int binom;
printf("Inserisci n\n");
scanf("%d", &n);
printf("Inserisci k\n");
scanf("%d", &k);
binom=(fattoriale(n)/fattoriale(k))/fattoriale(n-k);
printf("Coefficiente binomiale = %lu\n", binom);
}
Elementi di Informatica e Programmazione Universit di Brescia
75
76
Prof. M. Giacomin
77
BUONE PRATICHE
1) Ogni funzione un compito specifico
2) Scegliere un nome specifico esplicativo per la funzione
ESEMPIO:
una funzione che riceve in ingresso un numero positivo
e controlla se primo va spezzata in due:
- acquisiscipositivo
- primo (controlla se un numero primo)
3) Fattorizzare il pi possibile i compiti in funzioni significative
Prof. M. Giacomin
78
Prof. M. Giacomin
80
NOTA
Un algoritmo pi efficiente di calcolo del coefficiente binomiale
pu fare uso della seguente equazione:
n
n!
n(n 1) (n k + 1)
=
=
k!
k k!(n k )!
Si pu cambiare lalgoritmo senza riflessi sul main
(LASCIATO PER ESERCIZIO!)
Prof. M. Giacomin
81
Linguaggio C
puntatori
NOME
Valore
0101011110011001
1101011110011111
Indirizzo 0111000000011001
1101011100011101
0110011110011001
0101000111011000
1010011110011001
0101111110000000
0101010010011001
IMPLEMENTAZ.
indirizzo
TIPO
int
count
10
int *
Il tipo di un indirizzo (che un valore):
<tipo> *
(puntatore a <tipo>)
Motivo: per accedere alloggetto puntato tramite il suo indirizzo,
il C deve conoscerne il tipo!
Prof. M. Giacomin
Operatori & e *
indirizzo
(unari)
int
&count
*indirizzo
count
10
// count=count+20
TUTTO IL RESTO
CONSEGUE DA QUANTO VISTO!
Prof. M. Giacomin
VARIABILI PUNTATORE
Sono normali variabili, i cui valori sono indirizzi (di altre variabili)
ESEMPIO
500000
countPtr
600000
Rappresentazione
schematica
countPtr
600000
count
10
MEMORIA
CENTRALE
Prof. M. Giacomin
count
10
NB: si dice che countPtr
punta a o si riferisce a
count
Esempio 1
int count=10;
int *countPtr;
Prof. M. Giacomin
countPtr
count
10
Esempio 1
countPtr
int count=10;
count
10
int *countPtr;
countPtr=&count;
Prof. M. Giacomin
Esempio 1
countPtr
int count=10;
count *countPtr
20
int *countPtr;
countPtr=&count;
*countPtr = 20; // equivalente a count=20
Prof. M. Giacomin
10
ESEMPIO COMPLETO
int count, *countPtr=&count;
int count2, *countPtr2=&count2;
*countPtr=20;
printf( %d\n , count);
// stampa 20
// stampa 20
// stampa un indirizzo
// idem
*countPtr2=*countPtr;
// count2=count (==20)
*countPtr2=30;
// count2=30 (count==20)
countPtr2=countPtr;
// count2==30, count==20
*countPtr2=40;
// count2==30, count=40
Prof. M. Giacomin
11
Prof. M. Giacomin
12
PARAMETRI ATTUALI
modulo chiamante
per valore
CHIAMATA
indirizzo
per
indirizzo
per valore
AGGIORNAMENTI
per
indirizzo
Docente: M. Giacomin
13
Docente: M. Giacomin
14
CHIAMANTE
F.NE CHIAMATA
int funz(int *punt, )
punt
int a;
.
funz(&a, );
PASSAGGIO PER VALORE,
MA DI UN INDIRIZZO!
Prof. M. Giacomin
15
CHIAMANTE
F.NE CHIAMATA
int funz(int *punt, )
punt
int a;
.
funz(&a, );
.
*punt=10;
Prof. M. Giacomin
16
CHIAMANTE
F.NE CHIAMATA
int funz(int *punt, )
10
punt
int a;
.
funz(&a, );
.
*punt=10;
Prof. M. Giacomin
17
Prof. M. Giacomin
18
Esempio
di chiamata
Prof. M. Giacomin
19
ESEMPIO 2
void scambia (int *a, int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
Prof. M. Giacomin
20
Prof. M. Giacomin
21
Linguaggio C
tipi di dati definiti dallutente: enumerazioni
Tipi di dati in C
Semplici
Strutturati
Predefiniti
Definiti
dallutente
enum
struct, array
TIPO DI
DATO CASTELLO
Prof. M. Giacomin
Enumerazione
Tipo che prevede un insieme specificato di valori ammissibili,
chiamati costanti di enumerazione
il tipo definito dallutente
Esempio:
enum squadre {Inter, Juventus, Milan};
enum nomi {Giovanni, Luca, Marco, Matteo};
int main(){
enum squadre squadrona; //variabile di tipo enum squadre
squadrona=Milan;
enum nomi Ev_1=Giovanni;
if(squadrona==Juventus)
printf( Rilevato errore\n );
Prof. M. Giacomin
Esempio
enum squadre {Inter, Juventus, Milan} squadrina, squadrona;
Prof. M. Giacomin
Enumerazioni e interi
In realt, il C tratta lenumerazione come una ridefinizione di int:
le costanti di enumerazione rappresentano interi
Se non si specifica nulla, le costanti cominciano da 0 e rappresentano
valori consecutivi. E possibile specificare i valori di una o pi costanti
Esempi:
enum mesi {GEN=1, FEB, MAR, APR, MAG, GIU, LUG, AGO, SET};
enum nomi {Giovanni=3, Luca, Marco, Matteo=3};
// stampa 0, 1, 2
// non ha molto senso ma vabbe
}
}
Prof. M. Giacomin
Linguaggio C
tipi di dati definiti dallutente: strutture
STRUTTURE
Struttura: collezione di valori, anche di tipo diverso tra loro
(tipicamente concettualmente collegati)
Esempio: vogliamo rappresentare (non disegnare, ma
memorizzare e gestire) figure geometriche in due dimensioni (in
un piano):
- un punto rappresentato da due coordinate (float) x, y
- un cerchio da un centro (punto) e da un raggio (float)
- un rettangolo pu essere rappresentato da due punti
- ecc. ecc.
Prof. M. Giacomin
struct punto{
float
x;
float
y;
};
Definizione
del tipo
struct
punto
punto
float x
float y
Definizione variabili p1 e p2
p1
p1.x
p2
p2.x
p1.y
Prof. M. Giacomin
p2.y
struct punto{
float
x;
float
y;
};
Definizione
del tipo
struct
punto
Prof. M. Giacomin
float x
float y
Definizione variabili p1 e p2
p1
p1.x=0.5;
p1.y=3;
p2.x=2*p1.x;
punto
Assegnamenti
0.5
3
p1.x
p2
p2.x
p1.y
p2.y
Attenzione:
concluso da
punto e virgola
};
Nota
Ovviamente ciascun campo pu essere di qualunque tipo e
non necessariamente i campi sono tutti dello stesso tipo!
struct puntocolorato{
float
x;
float
y;
int colore;
// scala di grigi
};
Prof. M. Giacomin
Prof. M. Giacomin
Operatore di selezione .
Data una variabile struttura v:
v.<nomecampo>
int
char
0
200
10
?
0
?
200
10
??
x;
float
y;
};
ad
struct rettangolo{
struct punto bs;
struct punto ad;
bs
};
struct cerchio{
struct punto centro;
float raggio;
};
Prof. M. Giacomin
10
}
Prof. M. Giacomin
11
//ERRORE
12
struct puntocolorato{
float
x;
float
y;
int colore;
} p1, p2;
Prof. M. Giacomin
13
14
ESEMPIO (continua)
int main(){
struct cerchio c1={{10,5},{3}};
struct rettangolo r;
r=quadratocircoscritto(c1);
Prof. M. Giacomin
15
16
STRUTTURE E PUNTATORI
Loperatore puntatore a struttura o freccia semplifica laccesso
ad un campo attraverso un puntatore:
strPtr->campo equivalente a (*strPtr).campo
VARIANTE EQUIVALENTE ESEMPIO PRECEDENTE
float arearettangolo(struct rettangolo *pr){
float base, altezza;
base=(pr->ad).x-(pr->bs).x;
altezza=(pr->ad).y-(pr->bs).y;
return base*altezza;
}
Prof. M. Giacomin
17
Linguaggio C
tipi di dato definiti dallutente: vettori
Concetti generali
Variabili capaci di memorizzare un singolo valore (anche aggregato)
non sono sufficienti per tutti gli scopi
Esempio: programma per gestire un campionato di calcio con un
numero generico di squadre: non basta la struttura squadra
- si dovrebbero definire variabili sq1, sq2, , sq60
- e se voglio meno squadre? E se ne voglio di pi?
- prima o poi si dovranno ordinare le squadre (classifica):
come riferire la singola squadra?
Serve un tipo di dato che aggreghi pi elementi dello stesso tipo
e permetta il riferimento dellelemento i-esimo
uso di un vettore (array)
Prof. M. Giacomin
I vettori (array)
Un esempio
int vettore1[20];
int vettore2[20];
0
vettore1 ?
0
vettore2 ?
Prof. M. Giacomin
19
? ? ? ? ? ? ? ? ? ? ?
1
19
? ? ? ? ? ? ? ? ? ? ?
I vettori (array)
Un esempio
int vettore1[20];
int vettore2[20];
0
vettore1 ?
0
vettore2 ?
19
? ? ? ? ? ? ? ? ? ? ?
1
19
? ? ? ? ? ? ? ? ? ? ?
vettore1[0]=5;
vettore2[19]=-6;
Prof. M. Giacomin
I vettori (array)
Un esempio
int vettore1[20];
int vettore2[20];
0
vettore1 5
0
vettore2 ?
...
19
? ? ? ? ? ? ? ? ? ? ?
1
...
19
? ? ? ? ? ? ? ? ? ? -6
vettore1[0]=5;
vettore2[19]=-6;
Prof. M. Giacomin
I vettori (array)
Un esempio
int vettore1[20];
int vettore2[20];
0
vettore1 5
0
vettore2 ?
19
? ? ? ? ? ? ? ? ? ? ?
1
...
19
? ? ? ? ? ? ? ? ? ? -6
a = vettore1[0];
Prof. M. Giacomin
...
In generale
Vettore: lista ordinata di elementi dello stesso tipo (qualunque!)
Definizione di una variabile vettore:
<tipo><identificatore>[<dimensione>];
Prof. M. Giacomin
if(amici[3]>Paolo)
Prof. M. Giacomin
ESERCIZIO 1
Definire un vettore v capace di memorizzare 10 interi.
Memorizzare quindi nel vettore gli interi da 1 a 10.
Prof. M. Giacomin
ESERCIZIO 1
Definire un vettore v capace di memorizzare 10 interi.
Memorizzare quindi nel vettore gli interi da 1 a 10.
int v[10];
for(i=0; i<10; i++)
v[i]=i+1;
Prof. M. Giacomin
10
ESERCIZIO 2
Sviluppare un programma che acquisisca dallutente un vettore
di 10 interi. Successivamente, ne calcoli il massimo e il minimo.
Infine, stampi gli elementi del vettore, il massimo e il minimo.
Prof. M. Giacomin
11
Scomposizione
ACQUISIZIONE:
user un ciclo per acquisire i 10 numeri (indice i da 0 a 9)
CALCOLO massimo e minimo:
user un ciclo per confrontare due variabili max e min con
tutti gli elementi del vettore.
Problema: con quali valori inizializzo max e min?
Posso inizializzarli con vettore[0]
STAMPA:
user un ciclo per stampare i 10 numeri (indice i da 0 a 9)
Prof. M. Giacomin
12
13
ESERCIZIO 3
Sviluppare un programma che acquisisce dallutente al massimo 50
numeri interi (interrompendo lacquisizione se viene inserito
il numero 0), li memorizza in un vettore vet_1 e produce un vettore
vet_2 che li contiene in ordine inverso.
Prof. M. Giacomin
14
ESERCIZIO 3
Sviluppare un programma che acquisisce dallutente al massimo 50
numeri interi (interrompendo lacquisizione se viene inserito
il numero 0), li memorizza in un vettore vet_1 e produce un vettore
vet_2 che li contiene in ordine inverso.
Algoritmo (per la parte di inversione)
vet_1
...
50
...
50
4 1 5 2
i=0 i=1
vet_2
1 4
3-i
Prof. M. Giacomin
3-i
15
ESERCIZIO 3
Sviluppare un programma che acquisisce dallutente al massimo 50
numeri interi (interrompendo lacquisizione se viene inserito
il numero 0), li memorizza in un vettore vet_1 e produce un vettore
vet_2 che li contiene in ordine inverso.
Algoritmo (per la parte di inversione)
vet_1
...
50
...
50
4 1 5 2
i=0 i=1
vet_2
1 4
3-i
3-i
16
do{
scanf("%d", &num);
if(num!=0){
vet_1[i]=num;
i++;
}
} while(num!=0 && i<50);
n=i-1; //ora n indica l ultima posizione occupata del vettore
for(i=0; i<=n; i++)
vet_2[n-i]=vet_1[i];
printf("Vettore invertito\n");
for(i=0; i<=n; i++)
printf("%d\n", vet_2[i]);
Prof. M. Giacomin
17
ESERCIZIO 4
Sviluppare un programma che acquisisca da tastiera due array
contenenti 10 numeri interi (int v1[10], int v2[10]),
assicurandosi (per ogni array) che lutente non inserisca un
numero gi inserito (in questo caso, ripetere lacquisizione
di ogni elemento che sia gi stato inserito).
Si trovino quindi tutti gli elementi comuni ad entrambi gli array
e si stampi un messaggio indicante, per ogni elemento comune,
lindice occupato nel primo array e nel secondo.
Prof. M. Giacomin
18
v1[i]=num;
}
Prof. M. Giacomin
19
scanf( %d , &num);
while(<numero ripetuto>);
v1[i]=num;
}
Raffiniamo il
codice in modo da
calcolare nella variabile
ripetuto la condizione da
verificare
Prof. M. Giacomin
20
con i=0, 9
Prof. M. Giacomin
21
con i=0, 9
for(i=0;i<10;i++)
for(j=0; j<10; j++)
if(v1[i]==v2[j])
printf("Elemento in comune %d, in posizione %d e %d\n", v1[i], i, j);
Prof. M. Giacomin
22
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int v1[10], v2[10];
int i, j, comune;
printf("Inserisci il secondo vettore (10 numeri interi)\n");
int num;
for(i=0;i<10;i++){
do{
scanf("%d",&num);
for(i=0;i<10;i++){
comune=0;
do{
scanf("%d",&num);
if(v2[j]==num)
comune=0;
for(j=0; j<i; j++)
comune=1;
if(v1[j]==num)
}while(comune);
printf("Inserito numero %d\n", num);
comune=1;
}while(comune);
v2[i]=num;
v1[i]=num;
for(i=0;i<10;i++)
Prof. M. Giacomin
23
Inizializzazione di un vettore
La definizione di un vettore lascia i valori dei suoi elementi indefiniti
Per definire e inizializzare un vettore:
int vett[]={-10, 11, 4, 3};
/* equivale a
/* equivale a
int vett[4];
vett[0]=-10;
vett[1]=11;
vett[2]=4;
vett[3]=3;
*/
int vett[10];
vett[0]=-10;
vett[1]=11;
vett[2]=4;
vett[3]=3;
vett[4]=0;
vett[5]=0;
vett[9]=0;
*/
ATTENZIONE
Inizializzazione, non assegnamento (che tra laltro non esiste)!
Prof. M. Giacomin
24
vett[i]=i;
Il codice corretto :
int i;
int vett[10];
for(i=0; i<10; i++)
vett[i]=i;
Prof. M. Giacomin
25
Nota
La dimensione di un vettore fissa: compito del programmatore
fare in modo di riferirsi a celle che compongono il vettore
(ovvero, fare in modo che se si usa v[i] sia 0 i dimensione-1)
Esempio
int vett[20], i;
for(i=1; i<=20; i++)
vett[i]=0;
Prof. M. Giacomin
26
0 1 2 3 4
stringa N e l m
18 19 20
i n 0
29
0
stringa[20]=o;
stringa[21]=\0;
Prof. M. Giacomin
stringa[21]=0;
27
// \0 viene aggiunto
0 1 2 3 4
stringa2 P e t t e
Prof. M. Giacomin
// vettore di 15 elementi!
12 13 14
u g \0
28
ESERCIZIO 5
Supponendo che il vettore
char stringa[20];
Prof. M. Giacomin
29
ESERCIZIO 5
Supponendo che il vettore
char stringa[20];
printf(lunghezza=%d\n, i);
Prof. M. Giacomin
0 lo stesso, non 0!
30
Vettori multidimensionali
I vettori possono avere pi di un indice
Esempio tipico: rappresentazione di matrici (o tabelle)
int a[3][4];
Prof. M. Giacomin
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
a[2][2]
a[2][3]
31
Prof. M. Giacomin
32
Prof. M. Giacomin
33
Linguaggio C
vettori, puntatori, funzioni, strutture
1)
ESEMPIO
0
int v[]={1,5,2,3,2};
int *p;
p=v;
Prof. M. Giacomin
1 5 2 3 2
v
p
ESEMPIO
0
int v[]={1,5,2,3,2};
int *p=v;
*(p+2)=5;
// v[2]=5;
1 5 2 3 2
v
p
p+2
Prof. M. Giacomin
3)
Lespressione
v[i]
equivalente a *(v+i)
ESEMPIO
int v[]={1,5,2,3,2};
int *p=v;
Prof. M. Giacomin
v[2]=5;
// *(v+2)=5
p[2]=5;
// *(p+2)=5
Prof. M. Giacomin
ESEMPIO COMPLETO
int v[6]={1, 2, 3, 4, 5, 6};
int distanza, *vPtr;
vPtr=v;
// equivale a vPtr=&v[0];
vPtr+=2;
vPtr++;
*(vPtr+1)=20;
// v[4]=20
vPtr[2]=30;
// v[5]=30
distanza=vPtr-v;
// distanza=3
Prof. M. Giacomin
ALTRO ESEMPIO
int i;
char s1[10]=G. Gullo;
char s2[10];
char *s3, *s4;
s2=G. Gullo;
s3=s1;
s2=s3;
for(i=0;i<10;i++)
s2[i]=s1[i];
for(s3=s1,s4=s2;*s3!=\0;s3++,s4++)
*s4=*s3;
*s4=*s3;
Prof. M. Giacomin
//copia \0
Elementi di Informatica e Programmazione Universit di Brescia
STRINGHE LETTERALI
A parte il caso dellinizializzazione di un vettore di char,
Mela
Mela
Prof. M. Giacomin
ESEMPIO
char *s = aBETE;
// inizializzazione
// inizializzazione
r = aLBERO;
s = aLBERO;
// OK
r[0]=A;
// OK
s[0]=A;
Prof. M. Giacomin
10
printf(%s, Mela\n);
printf(str, stringa);
scanf( %s , stringa);
Prof. M. Giacomin
11
VETTORI E FUNZIONI
I vettori possono essere passati per riferimento: per specificare
che un parametro formale un vettore, si aggiunge []
Esempio
void modificavett (int v[], int lung){
int i;
for(i=0; i<lung; i++)
v[i]=v[i]*10;
}
//vettore ha 10 elementi
12
//vettore ha 10 elementi
13
Esempio
14
};
struct studente stud1;
stud1.nome[0]=J;
// OK
stud1.nome=Jim;
// ERRORE DI COMPILAZIONE
Prof. M. Giacomin
15
ESEMPIO MODIFICATO
struct studente{
int matricola;
char *nome;
char *cognome;
int num_esami;
int voti[30];
};
struct studente stud1;
stud1.nome=Jim;
// OK
// per non acquisibile via scanf
// e modifica con [] non ammessa!
Prof. M. Giacomin
16
stud1=stud2;
Prof. M. Giacomin
17
Prof. M. Giacomin
//vettore di 20 studenti!
18
ESEMPIO
Acquisizione da tastiera dei dati per tutti gli studenti della classe
(cfr lucido precedente)
for(i=0; i<20; i++){
printf(Studente n. %d\n, i);
printf(Inserisci nome: );
scanf(%s, classe[i].nome);
printf(Inserisci cognome: );
scanf(%s, classe[i].cognome);
printf(Inserisci matricola: );
scanf(%d, &(classe[i].matricola));
Prof. M. Giacomin
19
ESEMPIO (continua)
printf(Inserisci il numero di esami: );
scanf(%d, &(classe[i].num_esami));
for(j=0; j<classe[i].num_esami; j++){
printf(Inserisci voto esame n. %d, j);
scanf(%d, &((classe[i].voti)[j]) );
}
}
Prof. M. Giacomin
20
Prof. M. Giacomin
21
22
Esempio 2
void scambiaelem (int v[], int ix, int iy){
int temp;
temp=v[ix];
v[ix]=v[iy];
v[iy]=temp;
}
int v[5]={1,2,3,4,5};
scambiaelem(v, 2, 3);
Prof. M. Giacomin
23
Esempio 3
struct vettstr{
int v[5];
};
void scambiaelem (struct vettstr v, int ix, int iy){
int temp;
temp=v.v[ix];
v.v[ix]=v.v[iy];
v.v[iy]=temp;
}
24
Esempio 4
struct vettstr{
int v[5];
};
void scambiaelem (struct vettstr *v, int ix, int iy){
int temp;
temp=v->v[ix];
v->v[ix]=v->v[iy];
v->v[iy]=temp;
}
25
SOLUZIONE
1: la funzione non scambia nulla, opera su compie locali di
v[2] e v[3] (nei parametri formali x e y)
2: la funzione scambia effettivamente gli elementi, perch opera
sul vettore del chiamante, passato per indirizzo
3: la funzione non scambia gli elementi del vettore (della struttura)
del chiamante, perch opera su una copia locale della struttura
4: la funzione scambia gli elementi del vettore (della struttura)
del chiamante, perch opera sulla struttura del chiamante
passata per indirizzo
Prof. M. Giacomin
26
Prof. M. Giacomin
27
Complementi di C
Qualificatore const
Ridefinizione di tipo
Prof. M. Giacomin
IL QUALIFICATORE CONST
Introdotto nella versione ANSI-C del linguaggio
Specifica che una variabile (eventualmente un parametro) non pu
essere modificata dal programma: assegnamenti risultano in errori
a tempo di compilazione
La qualifica const si riferisce specificamente a ci che si trova
alla sua destra (vedi esempi successivi)
Esempio 1
const float limitefebbre=36.6;
// Inizializzazione
limitefebbre=37;
// ERRORE!
Prof. M. Giacomin
a=10;
b=20;
intPtr = &b;
// OK
*intPtr = 20;
// ERRORE!
Prof. M. Giacomin
a=10;
b=20;
*intPtr = 20;
// OK, assegna 20 ad a
intPtr = &b;
// ERRORE!
Prof. M. Giacomin
a=10;
b=20;
*intPtr = 20;
// ERRORE!
intPtr = &b;
// ERRORE!
Prof. M. Giacomin
//stringa s2
// non modificata
Prof. M. Giacomin
RIDEFINIZIONE DI TIPO
Un nuovo tipo pu essere definito uguale ad un altro tipo:
typedef <tipoesistente> <nomenuovotipo>
Esempio:
typedef int numeromaglia;
typedef float mediagoal;
x;
float
y;
};
typedef struct punto Punto;
Prof. M. Giacomin
x;
float
y;
} Punto;
Prof. M. Giacomin
Prof. M. Giacomin
10
Linguaggio C
Algoritmi di ordinamento e ricerca
ORDINAMENTO DI VETTORI
Dato un vettore, es. int v[10]
0
9 5 2 3 2 10 2 10 4 1
permutare i suoi elementi in modo da ottenere un vettore ordinato,
ad esempio tale che v[0] v[1] v[2] v[3] v[9]
0
1 2 2 2 3 4 5 9 10 10
COME? Esistono diversi algoritmi standard, ne vediamo uno
Prof. M. Giacomin
9 5 2 3 2 10 2 10 4 1
0
5 9 2 3 2 10 2 10 4 1
0
5 2 9 3 2 10 2 10 4 1
0
5 2 3 9 2 10 2 10 4 1
Prof. M. Giacomin
5 2 3 2 9 10 2 10 4 1
0
5 2 3 2 9 10 2 10 4 1
0
5 2 3 2 9 2 10 10 4 1
0
5 2 3 2 9 2 10 10 4 1
Prof. M. Giacomin
5 2 3 2 9 2 10 4 10 1
0
5 2 3 2 9 2 10 4 1 10
DOPO UNA PASSATA, LELEMENTO
MASSIMO POSTO PIU A DESTRA
E FINITO IN ULTIMA POSIZIONE
(QUELLA CORRETTA)
Prof. M. Giacomin
9 5 2 3 2 10 2 10 4 1
PRIMA PASSATA da 0 a n-1 v[n-1] contiene MAX v[0..n-1]
0
5 2 3 2 9 2 10 4 1 10
SECONDA PASSATA da 0 a n-2 v[n-2] contiene MAX v[0..n-2]
0
2 3 2 5 2 9 4 1 10 10
TERZA PASSATA da 0 a n-3 v[n-3] contiene MAX v[0..n-3]
Prof. M. Giacomin
2 1 2 2 3 4 5 9 10 10
ULTIMA PASSATA da 0 a 1 v[1] contiene MAX v[0..1]
vettore v ORDINATO!
0
1 2 2 2 3 4 5 9 10 10
Prof. M. Giacomin
// i= n-1, n-2, , 1
ALGORITMO BUBBLE-SORT
for(i=n-1; i>=1; i--)
for(j=0; j<i; j++){
// i= n-1, n-2, , 1
// PASSATA DA 0 A i
if(v[j]>v[j+1]){
temp=v[j];
v[j]=v[j+1];
v[j+1]=temp;
}
}
MIGLIORAMENTO ALGORITMO
0
1 1 2 2 3 4 7 9 10 10
SE IL VETTORE RISULTA
GIA ORDINATO, NON SI
EFFETTUA NESSUNO SCAMBIO!
IDEA: effettuare la passata successiva solo se
ci sono stati scambi nella passata precedente!
Prof. M. Giacomin
10
// i= n-1, n-2, , 1
fattoscambio=0;
for(j=0; j<i; j++){
// PASSATA DA 0 A i
if(v[j]>v[j+1]){
temp=v[j];
v[j]=v[j+1];
v[j+1]=temp;
fattoscambio=1;
}
}
if(!fattoscambio)
break;
}
Prof. M. Giacomin
11
n-1
Passata 0..n-2:
n-2
Passata 0..1:
Totale: 1 + 2 + + n-1
n!1
n(n !1)
= "i =
i=0
2
ovvero: O(n2)
Prof. M. Giacomin
12
ALGORITMI DI ORDINAMENTO
IL PROBLEMA DELLORDINAMENTO
Ordinare un insieme di elementi, ciascuno dotato di chiave, in
modo che sia rispettata una relazione dordine tra le chiavi.
TABELLA ALGORITMI DI ORDINAMENTO
caso: migliore medio
Selection Sort
O(n2)
O(n2)
O(n2)
peggiore
O(n2)
STABILE
Bubble Sort
O(n)
O(n2)
STABILE
Quick Sort
STABILE
Heap Sort
Prof. M. Giacomin
13
ALGORITMI DI RICERCA
IL PROBLEMA
Determinare se in un insieme di elementi, ciascuno dotato di chiave,
esiste un elemento dotato di chiave k.
DUE ALGORITMI FONDAMENTALI
Nessuna informazione sullinsieme:
RICERCA SEQUENZIALE
Insieme ordinato:
RICERCA BINARIA (migliore complessit)
Prof. M. Giacomin
14
RICERCA SEQUENZIALE
Si scorrono gli elementi del vettore dal primo allultimo
trovato=0;
for(i=0; i<n; i++)
if(v[i]==k){
trovato=1;
break;
}
Prof. M. Giacomin
15
RICERCA BINARIA
IPOTESI: il vettore ordinato
IDEA DI BASE (es: k=2)
0
1 2 2 3 5 6 6 7 10 10
inf
med
sup
16
v[med] > k
0
1 2 2 3 5 6 6 7 10 10
inf med
sup
- se inf >sup:
Prof. M. Giacomin
17
RICERCA BINARIA
inf=0, sup=n-1, med=(inf+sup)/2;
trovato=0;
while(inf<=sup){
if(v[med]==k){
trovato=1;
break;
}
if(v[med]<k)
inf=med+1;
else sup=med-1;
med=(inf+sup)/2;
}
Prof. M. Giacomin
18