Académique Documents
Professionnel Documents
Culture Documents
Obiettivi Contenuti
12BHDxx Informatica Problem solving Cenni storici
Diagrammi di flusso e Concetto di programma
Programmazione in C
pseudo codice Diagrammi di flusso
Pseudo codice
Alcuni problemi di esempio
1800
3
2000 4
5 6
J.M. Jacquard
B. Pascal (1642)
(punched card loom- 1801)
Il software per la
computazione meccanica
7 8
C. Babbage
Hollerith (punched card -1890)
(analyical engine 1833)
9 10
11 12
Il computer moderno (Cont.) La storia recente
2005
1942-47 : tubi a vuoto
2000
1990
1958-63 : transistor 1980
Testi
Dati
Voce
01101100
Musica
Immagini
Filmati
15 16
Satellitare
DTT (digitale terrestre)
17 18
Special - purpose (embedded, dedicated)
I tipi di computer
computer
Esistono due grandi classi di elaboratori: Un elaboratore dedicato (embedded system) un
- Elaboratori di uso generale (general-purpose computer) elaboratore programmato per svolgere funzioni specifiche
- Elaboratori dedicati definite a priori in fase di progetto/produzione
(special-purpose computer) Esempi sono: telefoni cellulari, lettori MP3, computer che
controllano aerei, auto, elettrodomestici...
19 20
Mainframe (host)
Server
21 22
Con il termine server farm si fa riferimento allinsieme di Mainframes (colloquialmente indicati anche come Big
elaboratori server collocati in un apposito locale (centro di Iron) sono elaboratori di grandi prestazioni usati
calcolo) presso una media o grande azienda principalmente da grandi imprese per rilevanti
applicazioni software
(mission critical application)
IBM z890
mainframe
23 24
Supercomputer (novembre 2011) Cosa impariamo in questo corso?
Dalla specifica di un problema alla sua realizzazione come
K computer programma da eseguire su un elaboratore
RIKEN Advanced
Institute for
Computational
Science (AICS) Costruzione di
un programma
25 26
Progettare Difficolt
Realizzazione
27 28
Algoritmo Algoritmo
Con il termine di algoritmo si intende la descrizione precisa Il termine deriva dal tardo latino algorismus che a sua
(formale) di una sequenza finita di azioni che devono volta deriva dal nome del matematico persiano Muhammad
essere eseguite per giungere alla soluzione di un problema ibn Msa 'l-Khwrizm (780-850), che scrisse un noto
trattato di algebra
29 30
Algoritmi e vita quotidiana Algoritmo
31 32
33 34
Algoritmo
2. Traduzione di un programma in un Traduzione
- Soluzione formale
formato comprensibile al calcolatore del programma
Articolato in pi fasi
Programma
Gestito automaticamente da un - Traduzione dellalgoritmo in una forma comprensibile ad un elaboratore
programma chiamato traduttore elettronico
37 38
Librerie
Linker Librerie
Librerie In generale non esiste la soluzione ad un certo
File
oggetto problema
- La programmazione consiste nel trovare la soluzione pi
efficiente, secondo una certa metrica, al problema di interesse
Questo file pu essere File
direttamente caricato eseguibile
in memoria ed eseguito
39 40
Programma
41 42
Stadi di sviluppo di un programma (Cont.) Stadi di sviluppo di un programma (Cont.)
43 44
46
Start
azione azione
Stop generica di I/O
47 48
Diagrammi di flusso: Blocco di decisione Diagrammi di flusso: Blocco di connessione
V condizione F
49 50
Start
Start
1
F
2 5
3 Stop
Stop
4
51 52
53 54
Diagrammi di flusso strutturati (Cont.) Sequenza
struttura-2
55 56
If-Then-Else If-Then
V condizione F V F
condizione
57 58
While-Do do - while
F struttura
condizione
V
condizione
struttura F
V
59 60
Teorema di Bhm - Jacopini Settimana n.2
61 62
La scrittura del programma vero e proprio praticamente Diversi livelli (di astrazione)
immediata a partire dalla soluzione formale - Linguaggi ad alto livello
Elementi del linguaggio hanno complessit equivalente ai blocchi
dei diagrammi di flusso strutturati (condizionali, cicli,)
I linguaggi di programmazione forniscono infatti costrutti - Esempio: C, C++, Basic, Pascal, Fortran, Java, etc.
di diversa complessit a seconda del tipo di linguaggio - Indipendenti dallhardware
- Linguaggi assembler
Elementi del linguaggio sono istruzioni microarchitetturali
- Dipendenti dallhardware
- Esempio: Assembler del microprocessore Intel Pentium
63 64
65 66
Parole chiave (keyword) Dati
67 68
Identificatore Tipo
Indica il nome di un dato (e di altre entit) in un Indica lintepretazione dei dati in memoria
programma
Legato allo spazio occupato da un dato
Permette di dare nomi intuitivi ai dati
Permette di definire tipi primitivi (numeri, simboli)
Esempio: indipendentemente dal tipo di memorizzazione del
- X, raggio, dimensione, sistema
69 70
Memoria
71 72
Istruzioni Esempio di programma
Linguaggio di programmazione
In questo corso:
- Linguaggio C
75
Unit Unit
elaborazione elaborazione
77 78
I chip fondamentali Microprocessore
ALU Registro
Unit di
controllo
81 82
Dati
Interfaccia
(controller)
Controll
o
83 84
Unit di input/output CPU
Unit aritmetica
(ALU)
Unit
di controllo
85 86
Elementi di memoria locale usati per conservare Svolge tutte le elaborazioni richieste (aritmetiche, logiche,
temporaneamente dei dati (es. risultati parziali). grafiche, ...).
E composta di:
Pochi (8...128) - ALU
- flag
- registri
Dimensione di una word (8...64 bit)
87 88
89 90
Ciclo base di un elaboratore CPU e FPU
Esegue listruzione
91 92
Il clock Il clock
T
93 94
Nota Nota
In un Intel Core i7-2700 la frequenza di clock 3.5 GHz Diversi Intel Core i7 e i5 sono costruiti con tecnologia a
- In 3.5 miliardesimi di secondo la luce percorre 1 metro (104.93 32 nm
cm) - Il diametro di un atomo di cesio 0.5 nm
- Un globulo rosso alto 2 000 nm e largo 7 000 nm
- Un capello spesso 100 000 nm
95 96
Tempistica delle istruzioni
97 98
Memoria Indirizzamento
Memorizza i dati e le istruzioni necessarie allelaboratore La memoria organizzata in celle (mimima unit
per operare. accessibile direttamente). Ad ogni cella di memoria
Caratteristiche: associato un indirizzo (numerico) per identificarla
- indirizzamento univocamente.
- parallelismo
- accesso (sequenziale o casuale)
1 7
2 5 8
3 6 9
99 100
Ogni cella di memoria contiene una quantit fissa di bit: Allinterno dellelaboratore
- identica per tutte le celle (di una certa unit di memoria) E` allo stato solido (chip)
- accessibile con ununica istruzione
Solitamente volatile
- un multiplo del byte
Veloce (nanosecondi, 10-9s)
- minimo un byte (tipicamente una word per la memoria principale
a supporto dell'UO) Quantit limitata (qualche GB)
Non rimovibile
Costosa (0.1 / MB)
101 102
Memoria esterna Memoria RAM (Random Access Memory)
103 104
I bit li voglio
nella RAM
Sistema Operativo RAM
Programma davvio
(boot program) ROM
105 106
Le memorie RAM possono essere di due tipi EDO RAM EDO RAM
- SRAM: RAM statiche BEDO RAM
Veloci (10 ns)
SD RAM
Minor impaccamento
Elevato costo per bit DDR2 - DDR3
DRAM (Rambus RAM)
- DRAM: RAM dinamiche
Meno veloci (60 ns) DDR2
Maggior impaccamento (64 Mbit/chip)
Minor costo per bit
Rambus
DDR3
107 108
Le schede delle DRAM Memoria ROM (Read-Only Memory)
109 110
Flash memory
- EEPROM veloce nella cancellazione (un blocco/tutta invece di un
byte alla volta)
111 112
PC (Program Counter)
PC M registro che indica sempre lindirizzo della cella di
memoria che contiene la prossima istruzione da eseguire
IR IR (Instruction Register)
registro che memorizza temporaneamente loperazione
corrente da eseguire
113 114
Esecuzione di unistruzione MIPS (Million Instructions Per Second)
115 116
117 118
Trasporto di un solo dato per volta Un singolo bus suddiviso in tre sotto bus, detti:
- bus dati (DBus)
- bus degli indirizzi (ABus)
Frequenza = n. di dati trasportati al secondo
- bus di controllo (CBus)
119 120
Massima memoria interna
Vecchie CPU Intel per PC
(fisicamente presente)
CPU DBus ABus Cache FPU La dimensione dellAbus determina il max numero di celle
di memoria indirizzabili
8088 8 bit 20 bit No No La dimensione del Dbus indica la dimensione di una
cella di memoria
8086 16 bit 20 bit No No
80286 16 bit 24 bit No No max mem = 2|Abus| x |Dbus| bit
La memoria esterna (es. dischi) non dipende dallAbus Clock Coproc Cache
perch viene vista come un periferico (di input e/o di Host
CPU (L1)
output) bus
BUS veloce
(AGP)
La massima quantit di memoria esterna dipende dal bus
DRAM Cache
di I/O (quello su cui sono collegati i periferici)
(L2)
BUS veloce
(PCI)
123 124
Dual core (due cpu sullo stesso chip) Dual core (due cpu sullo stesso chip)
Architettura a 32 bit Architettura a 32/64 bit
Tecnologia CMOS da 90 nm a 130 nm Tecnologia CMOS da 90 nm a 130 nm
Cache Cache
- L1: 8K dati, 12K istruzioni - L1: 64K dati, 64K istruzioni
- L2: da 256K a 2MB - L2: da 512K a 1MB
- L3: 2MB (versioni di punta) - L3: 2MB (versioni di punta)
Clock da 1.5 a 3.8 GHz Clock da 1.8 a 2.4 GHz
129 130
132
Caratteristiche generali del linguaggio C Storia
Il C un linguaggio: Sviluppo
- Imperativo ad alto livello - 1969-1973
... ma anche poco astratto - Ken Thompson e Dennis Ritchie
- Strutturato - AT&T Bell Labs
... ma con eccezioni
- Tipizzato Versioni del C e Standard
Ogni oggetto ha un tipo - K&R (1978)
- Elementare - C89 (ANSI X3.159:1989)
Poche keyword - C90 (ISO/IEC 9899:1990)
- Case sensitive - C99 (ANSI/ISO/IEC 9899:1999, INCITS/ISO/IEC 9899:1999)
Maiuscolo diverso da minuscolo negli identificatori!
- Portabile
Non tutti i compilatori sono standard!
- Standard ANSI
- GCC: Quasi C99, con alcune mancanze ed estensioni
- Borland & Microsoft: Abbastanza C89/C90
133 134
135 136
Visualizzazione
Immissione dati
risultati
137 138
Compilatore C Scrittura del programma
139 140
Colorazione ed evidenziazione della sintassi Applicazioni software integrate che contengono al loro
Indentazione automatica interno
- Un editor di testi per programmatori
Attivazione automatica della compilazione
- Un compilatore C
Identificazione delle parentesi corrispondenti
- Un ambiente di verifica dei programmi (debugger)
Molti disponibili, sia gratuiti che commerciali IDE: Integrated
Development
Environment
141 142
143 144
Commenti Parole chiave
Testo libero inserito allinterno del programma Riservate!
Non viene considerato dal compilatore
Nel C standard sono 32
Serve al programmatore, non al sistema! auto double int struct
break else long switch
Formato:
- Racchiuso tra /* */ case enum register typedef
- Non possibile annidarli char extern return union
- Da // fino alla fine della linea
const float short unsigned
Esempi: continue for signed void
/* Questo un commento ! */
default goto sizeof volatile
/* Questo /* risulter in un */ errore */
// Questo un altro commento do if static while
145 146
147 148
Parte esecutiva {
- Sequenza di istruzioni } Stop
- Quella che descriviamo con il diagramma di flusso!
file prova.c
149 150
Notazione Pre-processore C
Per specificare la sintassi di unistruzione utilizziamo un La compilazione C passa attraverso un passo preliminare
formalismo particolare che precede la vera e propria traduzione in linguaggio
macchina
Simboli utilizzati
Il programma che realizza questa fase detto
- <nome> Un generico nome
pre-processore
Esempio: <numero> indica che va specificato un generico valore
numerico
Funzione principale: Espansione delle direttive che
- [ <op> ] Unoperazione opzionale iniziano con il simbolo #
Sintassi: Esempio:
file.c mydef.h
- #include <file> #include mydef.h
int x,y;
<file> pu essere specificato come: ....
double z;
<<nomefile>> per includere un file di sistema int main() {
- Esempio: ...
#include <stdio.h> }
<nomefile> per includere un file definito dal programmatore
- Esempio:
#include miofile.h Pre-processore
int x,y;
double z;
Significato: ....
<file> viene espanso ed incluso per intero nel file sorgente int main() {
...
}
153 154
I dati numerici
156
Come contiamo? Sistemi di numerazione
252 = 2 100 + 5 10 + 2 1
= 2 102 + 5 101 + 2 100
157 158
Posizionali: Ibridi:
- babilonese (2 cifre, sessagesimale) - cinese
- inuit, selti, maya (ventesimale)
- indo-arabo (decimale)
159 160
N 1 Aperto = 0
A ai B i
i 0
Chiuso = 1
161 162
Il sistema binario Alcuni numeri binari
163 164
165 166
Terminologia Terminologia
Bit
Byte 10110110
Word
Double word/Long word
MSB LSB
Most Least
Significant Significant
Bit Bit
167 168
Limiti del sistema binario Limiti del sistema binario
(rappresentazione naturale) (rappresentazione naturale)
Consideriamo numeri naturali in binario:
- 1 bit ~ 2 numeri ~ { 0, 1 }2 ~ [ 0 1 ]10 bit simboli min10 max10
- 2 bit ~ 4 numeri ~ { 00, 01, 10, 11} 2 ~ [03]10 4 16 0 15
8 256 0 255
Quindi in generale per numeri naturali a N bit: 16 65 536 0 65 535
- combinazioni distinte
32 4 294 967 296 0 4 294 967 295
2N
- intervallo di valori
0 x 2N 1 [ base 10 ]
(000...0) x (111...1) [ base 2 ]
169 170
Regole base: Si effettuano le somme parziali tra i bit dello stesso peso,
0 + 0 = 0 propagando gli eventuali riporti:
0 + 1 = 1
1 + 0 = 1 11
1 + 1 = 0 ( carry = 1 ) 0110 +
0111 =
1101
171 172
Regole base: Si effettuano le somme parziali tra i bit dello stesso peso,
0 - 0 = 0 propagando gli eventuali riporti:
0 - 1 = 1 ( borrow = 1 )
1 - 0 = 1 1
1 - 1 = 0 0001 -
0110 =
0011
173 174
Overflow Overflow
Si usa il termine overflow per indicare lerrore che si Nella somma in binario puro si ha overflow quando:
verifica in un sistema di calcolo automatico quando il - si lavora con numero fisso di bit
risultato di unoperazione non rappresentabile con la - si ha carry sul MSB
medesima codifica e numero di bit degli operandi.
175 176
Ipotesi: operazioni su numeri da 4 bit codificati in binario base = 8 (talvolta indicata con Q per Octal)
puro - cifre = { 0, 1, 2, 3, 4, 5, 6, 7 }
- utile per scrivere in modo compatto i numeri binari ( 3:1 )
0101 +
1110 = 1 0 1 1 1 0 0 1 2
-------- ---
10011
2 7 1 8
overflow
177 178
10111001 2
B 9 16
+ 25 -9
C C
179 180
I numeri con segno Codifica modulo e segno
Il segno dei numeri pu essere solo di due tipi: un bit per il segno (tipicamente il MSB):
- positivo ( + ) 0 = segno positivo ( + )
- negativo ( ) 1 = segno negativo ( )
E quindi facile rappresentarlo in binario ... ma non N-1 bit per il valore assoluto (anche detto modulo)
sempre la soluzione pi semplice quella migliore!
Modulo e segno
Complemento a uno
Complemento a due
Eccesso X
segno modulo
1 bit N-1 bit
181 182
183 184
185 186
Complemento a 2 Somma e sottrazione in CA2
187 188
verifica: 38 + ( 53) = 15
189 190
191 192
Esempio overflow in CA2 (somma) Overflow nella sottrazione in CA2
193 194
overflow (NaN)
197 198
Errore assoluto (e ) Errore assoluto - esempi
Dato un numero A composto da N cifre, lerrore assoluto Qualunque sia la base ed il numero di cifre, lerrore
della sua rappresentazione non superiore alla quantit assoluto dei numeri interi sempre non superiore a 1:
non nulla pi piccola (in valore assoluto)
rappresentabile con N cifre 510 e 110 2710 e 110
Nota: talvolta lerrore assoluto anche detto precisione
(assoluta) di un numero
Lerrore assoluto dei numeri razionali dipende dal
numero di cifre usate per rappresentarli:
- es. 0.510 e 0.110
- es. 0.5010 e 0.0110
- es. 1.010 e 0.110
199 200
Elaborazione dellinformazione
Interi o floating-point?
non numerica
Interi:
- precisione = 1
- intervallo di valori limitato
- es. (32 bit) ~ 2 000 000 000
- es. (64 bit) ~ 9 000 000 000 000 000 000
Floating-point:
- precisione = variabile
- es. (32 bit) ~ 9 999 999 10 38
- es. (64 bit) ~ 9 999 999 999 999 999 10 308
201 202
oggetti binari 000 001 010 011 100 101 110 111
num. naturali 0 1 2 3 4 5 6 7
num. relativi (M&S) +0 +1 +2 +3 -0 -1 -2 -3
203 204
Caratteri Codice ASCII
Occorre una codifica standard perch il genere di Usato anche nelle telecomunicazioni.
informazione pi scambiata: Usa 8 bit (originariamente 7 bit per US-ASCII) per
- codice ASCII (American Standard Code for Information rappresentare:
Interchange)
- 52 caratteri alfabetici (a...z A...Z)
- codice EBCDIC (Extended BCD Interchange Code)
- 10 cifre (0...9)
- segni di interpunzione (,;!?...)
- caratteri di controllo
205 206
CR ( 13 ) Carriage Return
LF, NL ( 10 ) New Line, Line Feed 01000001 A 00100000
FF, NP ( 12 ) New Page, Form Feed 01110101 u 01110100 t
HT (9) Horizontal Tab 01100111 g 01110101 u
VT ( 11 ) Vertical Tab 01110101 u 01110100 t
NUL (0) Null 01110010 r 01110100 t
BEL (7) Bell 01101001 i 01101001 i
EOT (4) End-Of-Transmission 00100000 00100001 !
... ... ... 01100001 a
207 208
Rappresentazione di un testo in
UNICODE e UTF-8
formato ASCII
Unicode esprime tutti i caratteri di tutte le lingue del Caratteri in codice ASCII
mondo (pi di un milione).
UTF-8 la codifica di Unicode pi usata: Ogni riga terminata dal terminatore di riga:
- 1 byte per caratteri US-ASCII (MSB=0) in MS-DOS e Windows = CR + LF
- 2 byte per caratteri Latini con simboli diacritici, Greco, Cirillico, in UNIX = LF
Armeno, Ebraico, Arabo, Siriano e Maldiviano in MacOS = CR
- 3 byte per altre lingue di uso comune
- 4 byte per caratteri rarissimi
Pagine talvolta separate da FF
- raccomandata da IETF per e-mail
209 210
Codifiche o formati di testo/stampa Formato testi
Caratteri Caratteri
di controllo di stampa(ASCII)
211 212
Il PDF (Portable Document Format) un formato open di In C, tutti i dati devono essere dichiarati prima di essere
file basato su un linguaggio di descrizione di pagina utilizzati!
sviluppato da Adobe Systems per rappresentare
documenti in modo indipendente dallhardware e dal La dichiarazione di un dato richiede:
software utilizzati per generarli o per visualizzarli
- Lallocazione di uno spazio in memoria atto a contenere il dato
Un file PDF pu descrivere documenti che contengono - Lassegnazione di un nome a tale spazio in memoria
testo e/o immagini a qualsiasi risoluzione
In particolare, occorre specificare:
- Nome (identificatore)
- Tipo
- Modalit di accesso (variabile o costante)
213 214
Sono quelli forniti direttamente dal C Sono previsti dei modificatori, identificati da parole chiave
da premettere ai tipi base
- Segno:
Identificati da parole chiave! signed/unsigned
- char caratteri ASCII - Applicabili ai tipi char e int
signed: Valore numerico con segno
- int interi (complemento a 2)
unsigned: Valore numerico senza segno
- float reali (floating point singola precisione) - Dimensione:
- double reali (floating point doppia precisione) short/long
- Applicabili al tipo int
- Utilizzabili anche senza specificare int
La dimensione precisa di questi tipi dipende
dallarchitettura (non definita dal linguaggio)
- |char| = 8 bit = 1 Byte sempre
215 216
Modificatori dei tipi base (Cont.) Variabili
217 218
Esempi:
int x;
char ch; a b a1 a2
long int x1, x2, x3;
double pi;
short int stipendio; num n N somma max
long y, z;
219 220
Esempi Esempi
a 3.1
i 0 float a, b ;
float pigr ;
int i, j ; b
int N ;
float Nav, Qe ; 2.0
int x ; j 2 a = 3.1 ;
i = 0 ;
b = 2.0 ; pigr 3.1415
pigr = 3.1415926 ;
j = 2 ; N
N = 100 ; 100 Nav = 6.02e23 ;
Qe = 1.6e-19 ;
x = -3124 ; Nav 6.021023
x -3124
Qe 1.61019
221 222
Valore contenuto Valore contenuto
Ogni variabile, in ogni istante di tempo, possiede un certo Ogni variabile, in ogni istante di tempo, possiede un certo
valore valore
Le variabili appena definite hanno valore ignoto Le variabili appena definite hanno valore ignoto
- Variabili non inizializzate - Variabili non inizializzate
In momenti diversi il valore pu cambiare In momenti diversi il valore pu cambiare
a ? ? a 37
t t
definizione definizione inizializzazione
Es. int a; Es. a = 37;
223 224
Ogni variabile, in ogni istante di tempo, possiede un certo Ogni variabile, in ogni istante di tempo, possiede un certo
valore valore
Le variabili appena definite hanno valore ignoto Le variabili appena definite hanno valore ignoto
- Variabili non inizializzate - Variabili non inizializzate
In momenti diversi il valore pu cambiare In momenti diversi il valore pu cambiare
? 37 a -4 ? 37 -4 a -3
t t
definizione inizializzazione altra definizione inizializzazione altra incremento
assegnazione assegnazione Es. a = a+1;
Es. a = -4;
225 226
227 228
Costanti speciali Visibilit delle variabili
Caratteri ASCII non stampabili e/o speciali Ogni variabile utilizzabile allinterno di un preciso
ambiente di visibilit (scope)
Ottenibili tramite sequenze di escape
\<codice ASCII ottale su tre cifre>
Variabili globali
- Definite allesterno del main()
Esempi:
- \007
- \013 Variabili locali
- Definite allinterno del main()
- Pi in generale, definite allinterno di un blocco
Caratteri predefiniti
- \b backspace
- \f form feed
- \n line feed
- \t tab
229 230
231 232
Settimana n.3
Obiettivi Contenuti
Struttura base di un scanf e printf a livello
programma in C. elementare
Espressioni aritmetiche ed
Costrutti condizionali
semplici operatori base (+ - * / %) Istruzioni elementari
Operatori relazionali
Condizioni complesse
Algebra di Boole
Costrutti condizionali
Costrutto if e if-else
annidati
Operatori logici e di
incremento
If annidati
233
Istruzioni elementari Assegnazione
235 236
237 238
Sintassi:
printf(<formato>,<arg1>,...,<argn>); int x=2;
<formato>: Sequenza di caratteri che determina il formato di stampa di float z=0.5;
ognuno dei vari argomenti
char c=a;
output
Pu contenere:
- Caratteri (stampati come appaiono) printf(%d %f %c\n,x,z,c);
- Direttive di formato nella forma %<carattere>
2 0.5 a
%d intero
%u unsigned
%s stringa
%c carattere
%x esadecimale output
%o ottale
%f float printf(%f***%c***%d\n,z,c,x);
%g double
0.5***a***2
- <arg1>,...,<argn>: Le quantit (espressioni) che si vogliono stampare
Associati alle direttive di formato nello stesso ordine!
239 240
Istruzione scanf() Significato di scanf()
IMPORTANTE:
Assegnazioni tradizionali = Assegnazioni statiche
I nomi delle variabili vanno precedute dalloperatore & che indica - Lassegnazione dei valori alle variabili scritta nel codice!
lindirizzo della variabile (vedremo pi avanti il perch)
Esempio:
int x;
float z;
scanf(%d %f, &x, &z);
241 242
243 244
245 246
Operatori aritmetici Divisione tra interi: Esempio
Quesito Soluzione
Che operazione svolge il seguente frammento di Che operazione svolge il seguente frammento di
programma? programma?
a = 10;
b = 25; a = 10;
a = b ; b = 25;
b = a ; a = b ;
b = a ;
tempo
a = 10 b = 25 a = 25 b = 25
249 250
Quesito Soluzione
Come fare a scambiare tra di loro i valori di due variabili? E necessario utilizzare una variabile di appoggio
tmp = a;
a = b;
b = tmp;
a 7 b 12
tempo
tmp = 7 a = -12 b=7
251 252
Operatori di confronto in C Operatori relazionali
253 254
255 256
Variabili in grado di assumere solo due valori: Operatori unari (es. Not )
- VERO op : B B
- FALSO
257 258
Tavola della verit (truth table) Espressioni Booleane
259 260
A B AB
263 264
La porta AND Operatore OR
A B A+B
A
Y falso falso falso
B
falso vero vero
265 266
A B AB
A falso falso falso
Y
B
falso vero vero
267 268
AB=BA
A A+B=B+A
Y
B
A B C = ( A B) C = A (B C) = (A C)
B
Y = A B = A B + A B A + B + C = (A + B) + C = A + (B + C) = (A + C) + B
269 270
Propriet distributiva Teorema di De Morgan
Teorema:
A(B+C)=AB+AC
f ( a, b, ..., z; +, ) = f ( a, b, ..., z; , + )
A+(BC)=(A+B)(A+C)
ovvero (negando entrambi i membri):
f ( a, b, ..., z; +, ) = f ( a, b, ..., z; , + )
Ad esempio:
- A + B = ( A B )
- ( A + B ) = A B
271 272
273 274
piedino ( pin )
275 276
Memoria Istruzione if
Significato:
- Se vera <condizione>, esegui le istruzioni di <blocco1>,
altrimenti esegui quelle di <blocco2>
277 278
Leggere due valori A e B, calcolarne la differenza in Operano su espressioni booleane e forniscono un risultato
valore assoluto D = |A-B| e stamparne il risultato booleano:
! && ||
main() NOT AND OR
{ Equivalenti agli operatori booleani di base
int A,B,D; - Stesse regole di precedenza
NOT > AND > OR
scanf(%d %d,&A,&B); Esempi:
if (A > B) - (x>0) && (x<10) (x compreso tra 0 e 10)
D = A-B; - (x1>x2) || (x1 == 3)
else
D = B-A; Le espressioni logiche sono valutate da sinistra a destra
printf(%d\n,D);
} La valutazione viene interrotta non appena il risultato
univocamente determinato
279 280
A4
NOT ! !(a>b)
281 282
Settimana n.4 Istruzione switch
Sintassi:
switch (<espressione>)
Obiettivi Contenuti {
Concetto di ciclo Costrutto switch case <costante1>:
espressione
<blocco1>
Cicli semplici Cast e sizeof
break;
Cicli annidati Costrutto while case <costante2>:
Ciclo for <blocco2>
break;
Ciclo Do-while blocco1 blocco2 blocco default
...
Istruzioni break e continue default:
Concetto di ciclo annidato <blocco default>
ed esempio }
<espressione>: Espressione a valore numerico
Problem solving su dati
<blocco1>, <blocco2>, : Sequenza di istruzioni (no parentesi graffe!)
scalari
283 284
Significato: switch ( e )
- In base al valore di <espressione>, esegui le istruzioni del case {
corrispondenti case v1:
A1 ; e=...
- Nel caso nessun case venga intercettato, esegui le istruzioni
break ; e=v1 e=v2
altrimenti
corrispondenti al caso default
e=v3
case v2: A1
NOTE: A2 ; A2
break ;
- I vari case devono rappresentare condizioni mutualmente A3
ESCLUSIVE! case v3: ...
- I vari case vengono eseguiti in sequenza A3 ;
An
Per evitare questo, si usa listruzione break allinterno di un blocco break ;
...........
default:
An ;
}
285 286
287 288
Operatori di incremento (Cont.) Rango delle espressioni aritmetiche
Possono essere utilizzati sia in notazione prefissa che in In C, possibile lavorare con operandi non dello stesso tipo
notazione postfissa Le operazioni aritmetiche avvengono dopo aver promosso tutti gli
operandi al tipo di rango pi alto:
289 290
E possibile calcolare il numero di byte utilizzato dai tipi di dato di #include <stdio.h>
base utilizzando loperatore sizeof
main()
Sintassi: {
sizeof (<tipo>) printf(tipo n.byte\n);
printf(----------- ------\n);
Ritorna il numero di byte occupato da <tipo> printf(char %d\n, sizeof(char));
printf(int %d\n, sizeof(int));
printf(long %d\n, sizeof(long));
Esempio:
unsigned int size; printf(long long %d\n, sizeof(long long));
size = sizeof(float); /* size = 4 */ printf(float %d\n, sizeof(float));
printf(double %d\n, sizeof(double));
Luso delloperatore sizeof() pu essere esteso al calcolo dello printf(long double %d\n, sizeof(long double));
spazio occupato da espressioni, vettori e strutture }
293 294
Flusso di esecuzione ciclico Istruzione while
Sintassi:
Prima del A while (<condizione>)
ciclo <blocco>
295 296
299 300
Istruzione for (Cont.) Istruzione for (Cont.)
Istruzione di Significato:
inizializzazione I - Equivalente a:
<inizializzazioni>
while (<condizione>) {
V F
for ( I; C; A ) C <blocco>
<incremento>
{ }
B ; Istruzione di
} aggiornamento B
Realizza un ciclo basato su conteggio
Tipicamente contiene una variabile indice che serve da iteratore:
A - Parte da un valore iniziale (inizializzazione)
- Arriva ad un valore finale (condizione)
Corpo Condizione - Attraverso uno specifico incremento (incremento)
301 302
303 304
305 306
Cicli for con iterazioni note Cicli annidati
Struttura:
int i ; int i ; for (...)
{
for ( i=N; i>0; i=i-1 ) for ( i=N-1; i>=0; i=i-1) for (...)
{ { {
....... ....... ...
}
} }
}
307 308
V F V F V F
C C C
while( C )
{
V F V F
C2 while( C2 ) C2
{
B B2 ;
B2 } B2
}
309 310
Esempio Istruzione do
i = 0 ; Sintassi:
do
while( i<N ) <blocco>
{ while (<condizione>);
j = 0 ;
while( j<N ) <condizione>: Una condizione booleana
{ <blocco>: Sequenza di istruzioni
printf("i=%d - j=%d\n", i, j); Se pi di una istruzione, va racchiuso tra graffe
Esempio:
A - Leggere un valore N controllando che il valore sia positivo.
In caso contrario, ripetere la lettura
#include <stdio.h>
main() {
B
int n;
V F do
C scanf (%d, &n);
while (n <= 0);
}
D
313 314
sempre possibile trasformare un ciclo di tipo do in un Il linguaggio C mette a disposizione due istruzioni per
ciclo di tipo while semplice, anticipando e/o duplicando modificare il normale flusso di esecuzione di un ciclo:
una parte delle istruzioni - break:
Termina il ciclo
Lesecuzione continua dalla prima istruzione dopo la fine del ciclo
Esempio:
#include <stdio.h>
- continue:
main() {
Termina literazione corrente
int n; Lesecuzione continua con la prossima iterazione del ciclo
scanf (%d, &n);
while (n <= 0)
scanf (%d, &n);
}
315 316
Trasformano i cicli in blocchi non strutturati In termini di diagrammi di flusso (esempio: ciclo while):
- Usare con cautela (e possibilmente non usare)
- Si pu sempre evitare luso di break/continue!
F F
condizione condizione
Usabili in ogni tipo di ciclo (while, for, do) V V
break continue
blocco blocco
317 318
break : Esempio break : Esempio (Cont.)
Acquisire una sequenza di numeri interi da tastiera; Versione senza break (strutturata)
terminare loperazione quando si legge il valore 0. int valore, finito = 0;
while (scanf("%d", &valore) && !finito)
Versione con break {
if (valore == 0)
int valore; {
while (scanf("%d", &valore)) printf("Valore non consentito\n");
{ finito = 1;
if (valore == 0) }
{ else
printf("Valore non consentito\n");
{
break; /* esce dal ciclo */
/* resto delle istruzioni del ciclo */
}
}
/* resto delle istruzioni del ciclo */ }
}
319 320
Acquisire una sequenza di numeri interi da tastiera; Versione senza continue (strutturata)
ignorare i numeri pari al valore 0.
int valore;
while (scanf("%d", &valore))
Versione con continue {
if (valore == 0)
int valore;
{
while (scanf("%d", &valore)) printf("Valore non consentito\n");
{ }
if (valore == 0) else {
{ /* resto delle istruzioni del ciclo */
printf("Valore non consentito\n"); }
continue; /* va a leggere un nuovo valore */ }
}
/* resto delle istruzioni del ciclo */
}
321 322
dato1
dato2
Obiettivi Contenuti
35 35
Vettori Definizione di vettori 7 7 dato
dato3
Dimensionamento statico dato4
14
dei vettori 14 32
dato5 32 -9
Operazioni elementari:
lettura, stampa, copia, -9 dato6 2
confronto di vettori 2 631
dato7 dato8
-18
631 dato9 -18 4
4 dato10 7
7
323 324
Da evitare... ...cos meglio!
int main(void)
{
int dato1, dato2, dato3, dato4, dato5 ;
int dato6, dato7, dato8, dato9, dato10 ; int main(void)
. . . . . {
scanf("%d", &dato1) ; int dato[10] ;
scanf("%d", &dato2) ; . . . . .
scanf("%d", &dato3) ; for( i=0; i<10; i++)
. . . scanf("%d", &dato[i]) ;
scanf("%d", &dato10) ;
for( i=9; i>=0; i--)
printf("%d\n", dato10) ; printf("%d\n", dato[i]) ;
printf("%d\n", dato9) ; }
printf("%d\n", dato8) ;
. . .
printf("%d\n", dato1) ;
}
325 326
327 328
329 330
Vettori e indici Uso di una cella di un vettore
Lindice che definisce la posizione di un elemento di un Lelemento di un vettore utilizzabile come una qualsiasi
vettore DEVE essere intero! variabile:
- Non necessariamente costante! - utilizzabile allinterno di unespressione
Pu essere unespressione complessa (purch intera) tot = tot + dato[i] ;
- utilizzabile in istruzioni di assegnazione
dato[0] = 0 ;
Esempi:
- utilizzabile per stampare il valore
double a[100]; /* a vettore di double */
printf("%d\n", dato[k]) ;
double x;
- utilizzabile per leggere un valore
int i, j, k;
scanf("%d\n", &dato[k]) ;
x = a[2*i+j-k]; /* corretto! */
331 332
Esempio:
- #define PI 3.1415
- #define N 80
#define N 10 Definizione
- ... della
- double z = PI * x; costante
- int vect[N]; int main(void)
{ Uso della
int dato[N] ; costante
. . .
}
335 336
Modificatore const Sintassi
337 338
339 340
35 12 35 35
7 2 7 7
14 73 14 14 /* copia il contenuto di v[] in w[] */
32 -12 32 32
-9 0 -9 -9 for( i=0; i<N; i++ )
2 0 Copia v in w 2 2 {
w[i] = v[i] ;
631 -17 631 631 }
-18 44 -18 -18
4 1 4 4
7 17 7 7
v w v w
341 342
Esercizio 1 Esercizio 1: Soluzione
#include <stdio.h>
Leggere 10 valori interi da tastiera, memorizzarli in un main()
vettore e calcolarne il minimo ed il massimo {
int v[10];
int i, max, min;
343 344
345 346
347 348
Ricerca di un elemento: Esempio (1/3) Ricerca di un elemento: Esempio (2/3)
trovato = 0 ;
pos = -1 ;
int dato ; /* dato da ricercare */
int trovato ; /* flag per ricerca */
for( i=0 ; i<N ; i++ )
int pos ; /* posizione elemento */
{
if( v[i] == dato )
...
{
trovato = 1 ;
printf("Elemento da ricercare? ");
pos = i ;
scanf("%d", &dato) ;
}
}
349 350
351 352
Dato un vettore (di interi o reali), determinare float max ; /* valore del massimo */
- quale sia lelemento di valore massimo int posmax ; /* posizione del max */
- quale sia la posizione in cui si trova tale elemento
...
Conviene applicare la stessa tecnica per lidentificazione max = r[0] ;
del massimo gi vista in precedenza posmax = 0 ;
- Conviene inizializzare il max al valore del primo elemento
for( i=1 ; i<N ; i++ )
{
if( r[i]>max )
{
max = r[i] ;
posmax = i ;
}
}
353 354
Ricerca del massimo: Esempio (2/2) Ricerca di esistenza o universalit
355 356
Esempi Formalizzazione
Verificare che tutti i dati inseriti dallutente siano positivi vero che tutti i dati verificano la propriet?
Determinare se una sequenza di dati inseriti dallutente - x : P(x)
crescente vero che almeno un dato verifica la propriet?
Due numeri non sono primi tra loro se hanno almeno un - x : P(x)
divisore comune vero che nessun dato verifica la propriet?
- esiste almeno un numero che sia divisore dei due numeri dati - x : not P(x)
Un poligono regolare ha tutti i lati di lunghezza uguale vero che almeno un dato non verifica la propriet?
- ogni coppia di lati consecutivi ha uguale lunghezza - x : not P(x)
357 358
Esistenza: x : P(x) Universalit: x : P(x) Esistenza: x : not P(x) Universalit: x : not P(x)
- Inizializzo flag F = 0 - Inizializzo flag F = 1 - Inizializzo flag F = 0 - Inizializzo flag F = 1
359 360
Esempio 1 Esempio 2
Verificare che tutti i dati inseriti dallutente siano positivi Determinare se una sequenza di dati inseriti dallutente
crescente
int positivi ;
... int crescente ;
positivi = 1 ; ...
i = 0 ; crescente = 1 ;
while( i<n ) precedente = INT_MIN ;
{ i = 0 ;
... while( i<n )
if( dato <= 0 ) {
positivi = 0 ; ...
.... if( dato < precedente )
i = i + 1 ; crescente = 0 ;
} precedente = dato ;
if( positivi == 1 ) ....
printf("Tutti positivi\n"); i = i + 1 ;
}
361 362
Esempio 3 Esempio 4
Due numeri non sono primi tra loro se hanno almeno un Un poligono regolare ha tutti i lati di lunghezza uguale
divisore comune
int rego ;
int A, B ; ...
int noprimi ; rego = 1 ;
... precedente = INT_MIN ;
noprimi = 0 ; i = 0 ;
i = 2 ; while( i<n )
while( i<=A ) {
{ ...
... if( lato != precedente )
if( (A%i==0) && (B%i==0) ) rego = 0 ;
noprimi = 1 ; precedente = lato ;
.... ....
i = i + 1 ; i = i + 1 ;
} }
363 364
Ripetibile su pi livelli
Pulizia
casa
Sottoproblemi terminali = Risolvibili in modo semplice
Pulizia Pulizia Pulizia
bagno cucina camera
367 368
Funzioni:
La gerarchia delle operazioni si traduce in una gerarchia - Sottoprogrammi che ritornano un risultato (di qualche tipo
di sottoprogrammi primitivo o non)
parametri f risultato
369 370
371 372
Definizione di una funzione (Cont.) Prototipi
Tutte le funzioni sono definite allo stesso livello del Cos come per le variabili, buona pratica dichiarare
main() allinizio del programma le funzioni prima del loro uso
- NON si pu definire una funzione dentro unaltra (prototipi)
373 374
- Una funzione pu anche invocare se stessa (funzione ricorsiva) int modabs (int v1, int v2) // definizione
{
int v;
if (v1>=v2) {
v = v1-v2;
} else {
v = v2-v1;
}
return v;
}
377 378
Parametri formali e attuali Parametri formali e attuali (Cont.)
379 380
383 384
Passaggio dei parametri (Cont.) Vettori e funzioni
Il passaggio dei parametri per indirizzo indispensabile Le funzioni possono avere come parametri dei vettori o
quando la funzione deve ritornare pi di un risultato matrici:
- Parametri formali
Si indica il nome del vettore, con [ ] senza dimensione
- Parametri attuali
Il nome del vettore SENZA [ ]
Parametri F Risultati
Il nome del vettore indica lindirizzo del primo elemento,
quindi il vettore passato per indirizzo!
385 386
389 390
math.h math.h (Cont.)
funzione definizione
double sin (double x) sin (x)
double cos (double x) funzione definizione
cos (x)
double pow (double x, double y) xY
double tan (double x) tan (x)
double sqrt (double x) radice quadrata
double asin (double x) asin (x)
double log (double x) logaritmo naturale
double acos (double x) acos (x)
double log10 (double x) logaritmo decimale
double atan (double x) atan (x)
double exp (double x) eX
double atan2 (double y, double x) atan ( y / x )
double sinh (double x) sinh (x)
double cosh (double x) cosh (x)
double tanh (double x) tanh (x)
391 392
393 394
y 7 W ! %
121 55 87 33 37
F u l v i o 0 6 A Z N
70 117 108 118 105 111 48 54 65 90 78
0 1 1 - 5 6 4 6 3 3 2
48 49 49 45 53 54 52 54 51 51 50
395 396
I/O a caratteri EOF
397 398
scanf("%s", nome) ;
407 408
Esempio Esempio
printf("Buongiorno, ") ;
const int MAX = 20 ;
printf("%s", nome) ;
char nome[MAX+1] ;
printf("!\n") ;
printf("Come ti chiami? ") ;
gets(nome) ;
printf("Buongiorno, %s!\n", nome) ;
409 410
Obiettivi Contenuti
Stringhe Funzioni <string.h>
Matrici Vettori multidimensionali
printf("Buongiorno, ") ; Vettori di Stringhe Matrice come estensione
puts(nome) ; dei vettori
/* No!! printf("!\n") ; */ Problem solving su dati
testuali
411 412
Data la loro natura di tipo aggregato, le stringhe non Utilizzabili includendo in testa al programma
possono essere usate come variabili qualunque #include <string.h>
funzione definizione
definizione
Esempi di operazioni non lecite: concatenazione
char* strcat (char* s1, char* s2); concatenazione s1+s2
char s1[20], s2[10], s3[50]; s1+s2
... char* strchr (char* s, int c); ricerca di c in s
s1 = abcdefg; int strcmp (char* s1, char* s2); confronto
confronto
s2 =
s3 =
hijklmno;
s1 + s2;
NO! char* strcpy (char* s1, char* s2); s1
s1 <= s2
<= s2
int strlen (char* s); lunghezza di ss
lunghezza di
A questo scopo esistono apposite funzioni per la char* strncat (char* s1,char* s2,int n); concat.
concat. nn car.
car. max
max
manipolazione delle stringhe char* strncpy (char* s1,char* s2,int n); copia
copia nn car.
car. max
max
char* strncmp(char* dest,char* src,int n); cfr.
cfr. n car. max
n car. max
413 414
Funzioni di libreria per stringhe (Cont.) Esercizio 1
415 416
417 418
421 422
423 424
425 426
Matrice bidimensionale Vettori multidimensionali e cicli
5 10 15 20 25
N-1 6 12 18 24 30 for (i=0;i < 3; i++) { /* per ogni riga i */
for (j=0; j < 5; j++) { /* per ogni colonna j */
... // operazione su x[i][j]
}
pitagora }
427 428
Stampa per righe matrice di reali Lettura per righe matrice di reali
429 430
431 432
Esercizio 1: Soluzione Esercizio 2
#include <stdio.h>
Scrivere un programma che legga da tastiera una matrice
main() quadrata di dimensioni massime 32x32 e stampi su video
{ la matrice stessa con accanto a destra la somma di
int matrice[5][5], i, j;
ciascuna riga ed in basso la somma di ciascuna colonna
printf("Inserire gli elementi per righe:\n"); - Le dimensioni della matrice devono essere inserite da tastiera
for (i=0; i<5; i++)
for (j=0; j<5; j++)
scanf("%d", &matrice[i][j]); Esempio:
printf("\n\n");
4 3 1 2 10
/* stampa della matrice trasposta */ 1 7 2 2 12
for (j=0; j<5; j++) {
for (i=0; i<5; i++) 3 3 5 0 11
printf("%5d", matrice[i][j]);
printf("\n");
8 13 8 4
}
}
433 434
435 436
/* calcolo della somma delle righe */ /* stampa matrice e vettore somma delle righe*/
for (i=0; i<nrighe; i++) { printf("\n\n");
somma = 0; for (i=0; i<nrighe; i++) {
for (j=0; j<ncol; j++) for (j=0; j<ncol; j++)
somma = somma + matrice[i][j]; printf("%4d", matrice[i][j]);
vet_righe[i] = somma; printf("%7d\n", vet_righe[i]);
} }
/* stampa vettore somma delle colonne */
/* calcolo della somma delle colonne */ printf("\n");
for (j=0; j<ncol; j++) { for (j=0; j<ncol; j++)
somma = 0; printf("%4d", vet_col[j]);
for (i=0; i<nrighe; i++) printf("\n\n");
somma = somma + matrice[i][j];
vet_col[j] = somma; }
}
437 438
Settimana n.9 Il sistema dei tipi C
Obiettivi Contenuti
Tipi di dato scalari Il sistema dei tipi scalari in Tipo di dato
Argomenti sulla linea di Attivazione di programmi Tipi interi Tipi reali Enumerazioni Vettori
439 440
=
Tipo Descrizione Esempi sizeof(char) 1
char Caratteri ASCII 'a' '7' '!'
<
int Interi +2 -18 0
+24221
sizeof(short int) sizeof(int) sizeof(long int)
short int con meno bit
long int con pi bit
= = =
unsigned int Interi senza 0 1 423
segno 23234
sizeof(unsigned sizeof( sizeof(unsigned
unsigned short int con meno bit short int) unsigned int) long int)
unsigned long int con pi bit
441 442
443 444
I tipi reali in C Numero di bit
segno esponente
segno esponente
eeeeee eeeeee
A 1
.mmmmm
2 A 1
.mmmmm
2
mantissa mantissa
445 446
float
Tipo scanf printf
0 char %c %c %d
int %d %d
1.17549435E-38 short int %hd %hd %d
3.40282347E+38 long int %ld %ld
unsigned int %u %o %x %u %o %x
double unsigned short int %hu %hu
0
unsigned long int %lu %lu
2.2250738585072014E-308 float %f %f %g
double %lf %f %g
1.7976931348623157E+308
447 448
Il modello console
Sistema Operativo
Finestra di comando
Argomenti sulla linea Argomenti Codice di uscita
di comando
Programma utente
int main()
450
Argomenti sulla linea di comando Argomenti del main()
451 452
Struttura:
- Esempio: c:\> prog.exe 3 file.dat 3.2
C:\progr>quadrato Numero argomenti = 0
argv[0] prog.exe\0
Ciclo per lelaborazione degli argomenti Il C mette a disposizione tre funzioni per la conversione
for (i=0; i<argc; i++) { di una stringa in valori numerici
/* int atoi(char *s);
elabora argv[i] come stringa long atol(char *s);
*/ double atof(char *s);
}
Esempio:
NOTA: int x = atoi(2) ; // x=2
- Qualunque sia la natura dellargomento, sempre una stringa long y = atol(23L); // y=23
- Necessario quindi uno strumento per convertire in modo double z = atof(2.35e-2); // z=0.0235
efficiente stringhe in tipi numerici
Definite in stdlib.h
455 456
atoi, atof, atol: esempi Conversione degli argomenti (Cont.)
gets(line) ; gets(line) ;
x = atol(line) ; x = atof(line) ; NOTA: Importante controllare il valore di ogni argv[i]!
457 458
459 460
Esiste inoltre la funzione di libreria exit, dichiarata in Scrivere un programma che legga sulla linea di
<stdlib.h>, che: comando due interi N e D, e stampi tutti i numeri minori
- Interrompe lesecuzione del programma o uguali ad N divisibili per D
- Ritorna il valore specificato
Il vantaggio rispetto allistruzione return che pu
essere usata allinterno di qualsiasi funzione, non solo
del main
461 462
Esercizio 1: Soluzione Esercizio 2
#include <stdio.h> Scrivere un programma m2m che legga da input un
main(int argc, char* argv[]) { testo e converta tutte le lettere maiuscole in minuscole e
int N, D, i; viceversa, a seconda dei flag specificati sulla linea di
if (argc != 3) { comando
fprintf(stderr,Numero argomenti non valido\n); -l, -L conversione in minuscolo
return 1;
-u, -U conversione in maiuscolo
}
if (argv[1] != NULL) N = atoi(argv[1]); Un ulteriore flag -h permette di stampare un help
if (argv[2] != NULL) D = atoi(argv[2]);
for (i=1;i<=N;i++) {
Utilizzo:
Altrimenti le operazioni m2m l
if ((i % D) == 0) {
successive operano su m2m -L
printf(%d\n,i);
stringhe = NULL m2m u
}
} m2m -U
} m2m -h
463 464
467 468
Settimana n.10
Obiettivi Contenuti
Strutture Struct. Operatore .
Vettori di strutture Definizione vettori di struct
Definizione di struct Tipi aggregati
contenenti vettori (es.
stringhe)
469
struct <identificatore> {
campi
};
471 472
Una struttura permette di accedere ai singoli campi E possibile definire un nuovo tipo a partire da una
tramite loperatore ., applicato a variabili del struct tramite la direttiva typedef
corrispondente tipo struct - Passabile come parametro
<variabile>.<campo> - Indicizzabile in vettori
Esempio:
struct complex { Sintassi:
double re; typedef <tipo> <nome nuovo tipo>;
double im;
}
Esempio:
... typedef struct complex {
struct complex num1, num2; double re;
num1.re = 0.33; num1.im = -0.43943; double im; compl z1,z2;
num2.re = -0.133; num2.im = -0.49; } compl;
475 476
477 478
479 480
Esercizio 1: Soluzione (Cont.) Esercizio 2
main()
{ Data una struct che rappresenta un punto nel piano
int i, NumIns; cartesiano a due dimensioni:
studente Lista[NSTUD];
struct point {
/* assumiamo che il programma riempia double x;
con valori opportuni la lista */ double y;
NumIns = ContaInsufficienti(Lista, NSTUD); };
printf("Il numero di insufficienti e': %d.\n", NumIns); ed il relativo tipo typedef struct point Point; scrivere le
}
seguenti funzioni che operano su oggetti di tipo Point:
int ContaInsufficienti(studente s[], int numstud) - double DistanzaDaOrigine (Point p);
{ - double Distanza (Point p1, Point p2);
int i, n=0;
- int Quadrante (Point p); /* in quale quadrante */
for (i=0; i<numstud; i++) { - int Allineati(Point p1, Point p2, Point p3);
if (s[i].voto < 18) /* se sono allineati */
n++;
} - int Insterseca(Point p1, Point p2);
return n; /* se il segmento che ha per estremi p1 e p2
} interseca un qualunque asse*/
481 482
483 484
Settimana n.11
Obiettivi Contenuti
File di testo Concetto di file e funzioni
fopen/fclose
Funzioni fgets+sscanf Files
Approfondimenti su printf
e scanf
485
Vista dinsieme dei formati di file File sequenziali
487 488
Il C vede i file come un flusso (stream) sequenziale di Accesso tramite una variabile di tipo FILE*
byte
- Nessuna struttura particolare: Definita in stdio.h
La strutturazione del contenuto a carico del programmatore
- Carattere terminatore alla fine del file: EOF Dichiarazione:
FILE* <file>;
Byte 0 1 2 . N-1
FILE* contiene un insieme di variabili che permettono laccesso per
EOF tipi
489 490
La struttura dati FILE contiene vari campi: stdin automaticamente associato allo standard input
(tastiera)
- short level; /* Fill/empty level of buffer */
- unsigned flags; /* File status flags */
- char fd; /* File descriptor */ stdout e stderr sono automaticamente associati allo
- unsigned char hold; /* Ungetc char if no buffer */ standard output (video)
- short bsize; /* Buffer size */
- unsigned char *buffer; /* Data transfer buffer */
- unsigned char *curp; /* Current active pointer */ stdin,stdout,stderr sono direttamente utilizzabili
- unsigned istemp; /* Temporary file indicator */
- short token; /* Used for validity checking */
nelle istruzioni per laccesso a file
- In altre parole, sono delle variabili predefinite di tipo FILE*
491 492
File: Operazioni Stati di un file
Luso di un file passa attraverso tre fasi fondamentali Directory Apertura del file Stream
- Apertura del file Nome file Posizione attuale
- Accesso al file Lettura / Scrittura
- Chiusura del file Testo / Binario
File aperto
File chiuso
Prima di aprire un file occorre dichiararlo! Risiede su disco,
Risiede su disco, il programma ha
il programma non accesso al suo
ha accesso al suo contenuto
contenuto attraverso lo
stream associato
Chiusura del file
493 494
495 496
Quando lutilizzo del file fisico terminato, consigliabile FILE *fp; /* variabile di tipo file */
chiudere il file: ...
- Chiusura:
Cancellazione della connessione di un file fisico (su disco) ad un /* apro file testo.dat in lettura *\
file logico (interno al programma) fp = fopen(testo.dat,r);
Apertura del file Leggi riga / Apertura del file Scrivi riga /
Leggi carattere Scrivi carattere
Posizione intermedia
La posizione intermedia (n-esimo carattere
diviene posizione finale dopo lultimo)
Scrittura: Lettura:
- int putc (int c, FILE* <file>); char* fgets(char* <s>,int <n>,FILE* <file>);
- int fputc (int c, FILE* < file>); - Legge una stringa dal file fermandosi al pi dopo n-1 caratteri
Scrive un carattere alla volta nel file - Leventuale \n NON viene eliminato (diverso da gets !)
Restituisce il carattere scritto o EOF in caso di errore - Restituisce il puntatore alla stringa letta o NULL in caso di fine file
o errore
NOTA: putchar() equivale a putc(,stdout)
NOTA: gets() equivale a fgets(,stdin)
503 504
Scrittura a righe Lettura formattata
Scrittura: Lettura:
int fputs(char* <s>, FILE* <file>); int fscanf(FILE* <file>,char* <formato>,...);
- Scrive la stringa <s> nel senza aggiungere \n - Come scanf(), con un parametro addizionale che rappresenta
(diverso da puts !) un file
- Restituisce lultimo carattere scritto, oppure EOF in caso di errore - Restituisce il numero di campi convertiti, oppure EOF in caso di
fine file
NOTA: puts() equivale a fputs(,stdout)
NOTA: scanf() equivale a fscanf(stdin,)
505 506
507 508
509 510
Esempio 1 Esempio 1 (Cont.)
Lettura di un file formattato (esempio: Un intero per riga) Versione compatta senza memorizzare il risultato di
- Uso dei valori restituiti dalle funzioni di input (fscanf) fscanf()
- Usiamo fscanf() direttamente nella condizione di fine input
res = fscanf (fp, %d, &val);
while (res != EOF) while (fscanf (fp,%d,&val) != EOF)
{ {
elabora val; elabora val;
res = fscanf (fp, %d, &val); }
}
511 512
Esempio 2 Esempio 3
Lettura di un file formattato (esempio: Un intero per riga) Lettura di un file non formattato
- Uso di feof() - Uso dei valori restituiti dalle funzioni di input (getc)
513 514
Lettura di un file non formattato Lettura di un file formattato in cui ogni riga abbia un dato
- Uso dei valori restituiti dalle funzioni di input (fgets) numero di campi di tipo noto (esempio un intero, ed una
stringa)
s = fgets(s,80,fp); - Uso di fgets per leggere la riga, e di sscanf per leggere i campi
while (s != NULL)
{ Versione 1
elabora s;
s = fgets(s,80,fp); while ((s = fgets(s,80,fp))!= NULL)
} {
sscanf( s, %d %s, &intero, stringa );
}
515 516
Esercizio Esercizio: Soluzione
517 518
519 520
523 524
525 526
527 528
Stringa di formato (1/2) Stringa di formato (2/2)
529 530
Tipo scanf
char %c Istruzione Input Risultato
int %d scanf("%d", &x) ; 134xyz x = 134
short int %hd scanf("%2d", &x) ; 134xyz x = 13
long int %ld scanf("%s", v) ; 134xyz v = "134xyz"
unsigned int %u %o %x scanf("%2s", v) ; 134xyz v = "13"
unsigned short int %hu
unsigned long int %lu
float %f
double %lf
char [] %s %[...]
531 532
scanf("%*d %s", v) ; 10 Pippo x immutato - EOF se linput era gi in condizione End-of-File allinizio della
lettura
v = "Pippo"
533 534
Lettura di stringhe Esempi (Cont.)
535 536
Settimana n.12
Obiettivi Contenuti
Comprensione degli Cenno ai puntatori
operatori & e * Puntatori e vettori
Puntatori e stringhe Puntatori
Cenno alla allocazione
dinamica di un vettore
537
Puntatori = Variabili che contengono indirizzi di memoria Lindirizzo di una variabile (da assegnare, per esempio, ad un
- Indirizzi = Indirizzi di una variabile (di qualche tipo) puntatore) determinabile tramite loperatore unario & posto a
fianco dellidentificatore della variabile
Definiti tramite loperatore unario * posto accanto al nome della
variabile Sintassi:
& <identificatore>
Sintassi:
<tipo> * <identificatore> Esempio:
int a, *ptr;
Per ogni tipo di variabile puntata, esiste un tipo diverso di ptr = &a;
puntatore
- Esempi:
int x; int *px;
double y; double *py;
539 540
Puntatori: Esempio Puntatori (Cont.)
int x=5, *px; Gli operatori * e & sono luno linverso dellaltro
Indirizzi - Lapplicazione consecutiva in qualunque ordine ad un puntatore
fornisce lo stesso risultato
px = &x; /* px = indirizzo di x */ Esempio:
*&px e &*px sono la stessa cosa!
x 5 10016
printf(%d\n,x); --> 5 In termini di operatori:
- *= Operatore di indirezione
printf(%d\n,px); --> 10016
Opera su un indirizzo
printf(%d\n,&x); --> 10016 Ritorna il valore contenuto in quellindirizzo
printf(%d\n,*px); --> 5 - & = Operatore di indirizzo
Opera su una variabile
px 10016 28104 Ritorna lindirizzo di una variabile
/* x e *px sono la stessa cosa! */
Quindi:
*(&px): Fornisce il contenuto della casella che contiene lindirizzo di px
Memoria &(*px): Fornisce lindirizzo della variabile (*px) puntata da px
541 542
Puntatori (Cont.)
Esempio:
main()
{
int a, *aptr;
a=7;
aptr = &a;
543
La relazione tra puntatori e vettori in C molto stretta Lanalogia tra puntatori e vettori si basa sul fatto che, dato
Elemento di connessione: un vettore a[]
- Il nome di un vettore rappresenta un indirizzo a[i] e *(aptr+i) sono la stessa cosa
Indirizzo del primo elemento!
- Esempio:
int a[8], *aptr;
Due modi per accedere al generico elemento del vettore:
Lassegnazione aptr = a; fa puntare aptr al primo
1. Usando larray (tramite indice)
elemento del vettore a 2. Usando un puntatore (tramite scostamento o offset)
int a[8]
aptr a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] Interpretazione:
aptr+i = Indirizzo dellelemento che si trova ad i posizioni dallinizio
*(aptr+i) = Contenuto di tale elemento
aptr = a
a
545 546
Puntatori e vettori: Analogie (Cont.) Puntatori e vettori: Esempio
main()
E possibile equivalentemente: {
- Accedere al vettore tramite offset usando il nome del vettore int b[] = {1,2,3,4};
int *bptr = b;
*(a+i) int i, offset;
- Accedere al vettore tramite indice usando il puntatore printf(== notazione indicizzata ==\n);
for(i=0; i<4; i++) {
aptr[i] printf(b[%d] = %d\n,i, b[i]);
}
printf(== notazione tramite offset e vettore ==\n);
Riassumendo: for(offset=0; offset<4; offset++) {
- Dati int a[], *aptr=a; laccesso al generico elemento i del printf(*(b+%d) = %d\n,offset, *(b+offset));
}
vettore a pu avvenire mediante: printf(== notazione tramite indice e puntatore ==\n);
a[i] for(i=0; i<4; i++) {
printf(bptr[%d] = %d\n,i, bptr[i]);
*(a+i) }
aptr[i] printf(== notazione tramite offset e puntatore ==\n);
for(offset=0; offset<4; offset++) {
*(aptr+i) printf(*(bptr+%d) = %d\n,offset, *(bptr+offset));
}
}
547 548
Esempio:
Puntatori e stringhe
int v[10], *vptr;
...
vptr = a; /* OK */
vptr += 3; /* OK */
v = vptr; /* NO, v non si pu modificare */
v += 3; /* NO, v non si pu modificare */
549
553
555 556
Questa limitazione pu essere superata allocando Lallocazione dinamica assegna memoria ad una variabile
esplicitamente la memoria (allocazione dinamica della in unarea apposita, fisicamente separata da quella in cui
memoria): vengono posizionate le variabili dichiarate staticamente
- Su richiesta:
Concettualmente:
Il programma in grado di determinare, ogni volta che lanciato, di
quanta memoria ha bisogno - Mappa di memoria di Istruzioni e dati
un programma allocati
staticamente
- Per quantit definite al tempo di esecuzione:
Il programma usa ad ogni istante soltanto la memoria di cui ha Memoria
bisogno, provvedendo periodicamente ad allocare la quantit di
memoria da usare e a liberare (deallocare) quella non pi utilizzata
Dati allocati Memoria
In tal modo si permette ad eventuali altri processi che lavorano in dinamicamente dinamica
parallelo sullo stesso sistema di meglio utilizzare la memoria
disponibile
557 558
Memoria dinamica: malloc Memoria dinamica: malloc (Cont.)
Sintassi:
Lallocazione dinamica permette di superare la
void* malloc(<dimensione>) limitazione del caso statico
559 560
561 562
Settimana n.14
Obiettivi Contenuti
Preparazione allesame Svolgimento temi desame
563