Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Linguaggio C - Informatica generale, Dispense di Elementi di Informatica

Informatica generale - Linguaggio C dispensa completa per l'esame di informatica generale prof. Moscato Bicocca Milano

Tipologia: Dispense

2015/2016

In vendita dal 26/02/2016

Matteobicocca92
Matteobicocca92 🇮🇹

4.6

(8)

15 documenti

1 / 155

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
C
By Example
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c
pf4d
pf4e
pf4f
pf50
pf51
pf52
pf53
pf54
pf55
pf56
pf57
pf58
pf59
pf5a
pf5b
pf5c
pf5d
pf5e
pf5f
pf60
pf61
pf62
pf63
pf64

Anteprima parziale del testo

Scarica Linguaggio C - Informatica generale e più Dispense in PDF di Elementi di Informatica solo su Docsity!

C

By Example

INDICE

ESERCITAZIONE ARGOMENTO PAGINA

Esercitazione 1 Prima parte – Sistemi di numerazione – Conversione di

base

Seconda parte – Codifica binaria dei numeri interi –

Complemento a due

Esercitazione 2 Prima parte – Introduzione alla programmazione 22

Seconda parte – Tipi di dato primitivi 33

Esercitazione 3 Prima parte – IF – Operatori relazionali e booleani 41

Seconda parte - Cicli 47

Esercitazione 4 Prima parte – Ancora sui cicli 63

Introduzione alle funzioni 73

Esercitazione 5 Prima parte – Funzioni: approfondimenti 82

Seconda parte - Array 90

Esercitazione 6 Strutture 104

Esercitazione 7 File 119

Esercitazione 8 Prima parte - Temi d'esame svolti - Esercizi 134

Seconda parte – Temi d'esame svolti - Domande 149

Se il numero ha una parte decimale, svolgete il calcolo separatamente: la somma degli addendi, nella

parte decimale, non supererà mai il valore 1.

2

  • 1
  • 1 * 2
  • 2
  • 0 * 2
  • 3
  • 1 * 2
  • 4

= 1 * 0,25 + 1 * 0,0625 =0, 10

0,F1 16 = 15 * 16

  • 1
  • 1 * 16
  • 2

= 15 * 0,0625 + 1 * 0,0039 = 0,9375 + 0,0039 = 0,9414 10

Perciò:

2

10

2B1,F1 16 = 689,9414 10

E.1.1. Esercizi proposti. Convertire in base 10

2

4

BEA 16 =

12

2

0,B0A 12 =

1.3. Conversione di numeri dalla base 10 in una base qualunque: numeri interi

Per capire, partiamo da un esempio sciocco:

Convertire il numero 135 10

in un numero in base 10.

Da dividere per 10 Resto

Risultato (si legge dal basso in alto): 135 10

Facciamo ora esercizi più seri! (ma il trucco sarà identico, tenendo conto della diversa base).

Convertire 124 10 in base 2:

Da dividere per 2 Resto

10

2

Infatti:

2

10

Convertire 124 10

in base 16:

Da dividere per 16 Resto

7 C (cioè 12 !)

12410 = 7C 16

Convertire 212 10 in base 7:

Da dividere per 7 Resto

Convertire 538 10 in base 12:

Da dividere per 12 Resto

44 A (cioè 10 !)

10

= 38A

12

Convertire 555 10

in base 5:

Da dividere per 5 Resto

10

5

1.4. Conversione di numeri dalla base 10 in una base qualunque: numeri

frazionari

Per capire, partiamo ancora da un esempio sciocco:

Convertire il numero 0,901 10 in base 16:

Da moltiplicare per 16 Parte intera

0,416 E (cioè 14 !)

0,496 A (cioè 10 !)

0,936 7 (etc.)

0,901 10 = 0,E6A7 16

Convertire il numero 0, 10

in base 5:

Da moltiplicare per 5 Parte intera

0,875 1 (etc.)

E.1.2. Esercizi proposti. Convertire i seguenti numeri in base 10 nelle basi indicate:

108610 = in base 2

10

= in base 4

1234510 = in base 16

33310 = in base 3

10

= in base 2

678,8125 10 = in base 16

10

= in base 8

1.5. Conversione tra basi diverse dalla base 10

Agiamo con semplicità:

 convertiamo il numero nella base 10;

 lo riconvertiamo nella nuova base.

Entrambe sono operazioni che sappiamo fare.

Esercizio: convertire il numero 166 7 nella base 5:

2

  • 6 * 7

1

  • 6 * 7

0

= 1 * 49 + 6 * 7 + 6 * 1 = 97 10

Ora convertiamo 97 10

in base 5:

Da dividere per 5 Resto

Caso particolare: conversione tra basi che sono potenze di 2 (2, 4, 8, 16 etc.)

In questo caso, la conversione intermedia sarà quella in base 2, come vedremo. Occorre però una

riflessione iniziale.

Osserviamo nuovamente le tabelle che avevo mostrato all'inizio: ora però nella colonna a sinistra

metto la codifica in base 2

Base 2 Base 2 Base 2 Base 4 Base 2 Base 8 Base 2 Base 16

1010 A

1011 B

1100 C

1101 D

1110 E

1111 F

Per passare da queste basi alla base 2, sarà sufficiente sostituire ogni cifra esattamente con la propria

rappresentazione nelle tabelle viste.

Ad esempio:

8

2

(ovviamente il primo 0 è inutile)

8F

16

2

Ed ora, per passare dalla base 2 alle altre basi, occorrerà raggruppare il numero in gruppi di:

 2 cifre per la base 4

 3 cifre per la base 8

 4 cifre per la base 16

 etc.

aggiungendo eventualmente degli 0 a sinistra.

Ad esempio:

2

2

8

1001110110011,1010101 = 0001 0011 1011 0011 , 1010 1010 2 = 13B3,AA 16

Ed ora possiamo fare i passaggi di base qualsiasi (tra basi potenza di 2).

Riporti 1 1 1

4

4

4

7

7

Riporti 0 1

1264916 + 9FA 16 =

Riporti 0 1 1 1

9 FA =

16

+ 9FA

16

16

A0B

12

12

Riporti 0 1

A 0 B +

A 8 6

A0B 12 + 77 12 = A86 12

E.1.4. Esercizi proposti. Eseguire la somma nelle basi indicate.

2

2

8

8

17FA 16 + E0A1 16 =

12

12

1.7. Differenza in base qualsiasi

Rinfreschiamoci le idee con la base 10.

A. 9 - 2 = 7 → scrivo 7

→ prestito 0

B. 5 - 8 = - 3 → chiedo un prestito alla decina successiva

→ scrivo 7 - prestito di (-1)

C. - 1 + 7 - 8 = - 2 → chiedo un prestito alla decina successiva

→ scrivo 8 - prestito di (-1)

D. - 1 + 9 = 8 → scrivo 8

Riassumendo:

Prestiti - 1 - 1 0

Nota utile: ricordate che, nella differenza tra due numeri, i prestiti non sono mai minori di - 1.

Vediamo ora in una base qualunque.

2

2

Prestiti 0 0 - 1 - 1 0 0

(ed infatti 1010001 2 - 11012 = 81 - 13 = 68 10 )

Prestiti - 1 - 1

5

5

Prestiti - 1 - 1

5

5

5

A649 16 - FA 16 =

0 0 0 0 0 0 0 - (riga inutile !)

4

4

(Nota: gli esercizi aggiuntivi sono dopo la divisione)

1.9. Divisione in base qualsiasi

Si procede in modo analogo a quanto si fa coi numeri in base 10.

Esempio:

4

4

A. Il 3 nell'1 non ci sta

B. Il 3 nel 12 (pari a 6 10 ) ci sta 2 volte resto 0

C. Il 3 nel 2 non ci sta

D. Il 3 nel 21 (pari a 9 10

) ci sta 3 volte resto 0

4

4

4

Nota: come vedete, la situazione è piuttosto complessa. Se dovete fare a mano una divisione

complicata, probabilmente vi conviene ricondurre entrambi gli operandi in base 10 (e qui definire la

precisione, con particolare riferimento alle cifre significative dopo la virgola) e poi riconvertire il

risultato nella base voluta.

E.1.6. Esercizi proposti. Moltiplicazione e divisione in base qualsiasi

Fare la tabellina della base 16 (Controllate i risultati, ricordando che le tabelline sono simmetriche

rispetto alla diagonale).

15A

16

* B

16

8

8

Da qui in poi si procede a spanne, ma con un'approssimazione più che sufficiente per i nostri scopi (e

comunque per difetto).

17

= 128 k

18

= 256 k

19

= 512 k

20

= 1024 k = 1 M

21

= 2 M

22

= 4 M

23

= 8 M

24

= 16 M

25

= 32 M

26

= 64 M

27

= 128 M

28

= 256 M

29

= 512 M

30

= 1024 M = 1 G

31

= 2 G

32

= 4 G

Capito il trucco? (

10

= 1 k; 2

20

= 1 M; 2

30

= 1 G; 2

40

= 1 T; etc.)

Ora però dobbiamo codificare i numeri interi, che sono positivi e negativi: quali potremo codificare?

Per capirlo, procediamo con l'esempio di un registro di 8 bit (c'è posto per 2

8

= 256 numeri)

Bit che mi avverte del segno: 0 = positivo (o nullo)

1 = negativo

Quindi:

Per i numeri positivi (oltre allo 0) ho a disposizione 7 bit = 128 numeri:

 da 0

 a 127 = 2

(8-1)

  • 1

con una codifica corrispondente all'algebra binaria.

Per i numeri negativi ho a disposizione 7 bit = 128 (quelli con l'1 nel bit a sinistra)

da - 1 a - 128. (uno in più dei positivi, perché lo zero non è né positivo né negativo.

Però il numero - 128 è un po' particolare per un motivo che vi spiegherò

fra poco).

Conclusione:

Codificheremo con registri a n bit numeri che, in valore assoluto, siano minori o uguali di:

(n-1)

  • 1

Ma quale codifica useremo per i numeri negativi?

1.11. Il complemento a due

1.11.1. Definizione

La vediamo con un esempio: - (^310)

Si consideri il valore positivo:

Eseguiamo ora la differenza col seguente numero a 9 bit:

(Assomiglia molto al trucco dei "prestiti" visto nell'esercitazione precedente...)

1.11. 2. Metodo più semplice

A. si codifica il valore assoluto del numero

B. si fa il "complemento a 1", è cioè si complementa ciascun bit (gli 0 diventano 1, gli 1

diventano 0)

C. si aggiunge 1

Esempio: - 3 10

A → 0000 0011

B → 1111 1100

C → - 3

10

Altro esempio: - (^110)

A → 0000 0001

B → 1111 11 10

C → - 1

10

1.11. 3. Qual'è il vantaggio?

Il fatto di trasformare tutte le sottrazioni in semplici addizioni!

Ad esempio: 7 10

10

10

10

Quindi:

Sommo a + (-b)

c = a - b = 000110 (infatti 19 - 13 = 6)

1.12.5. Usando gli stessi valori per a e b, eseguire ora c = b - a

Risposta:

Calcolo - 010011

Sommo b + (-a)

In questo caso non c'è stato il riporto di 1 a sinistra del registro: però il numero risulta negativo (a 1 il

bit che indica il segno). Ma sarà giusto? Proviamo a calcolare il valore assoluto:

cioè 6 10.

c = b - a = 111010 (infatti 13 - 19 = - 6)

1.12.6. Facciamo ora la somma di due numeri negativi, usando il complemento a 2.

 a = - 3 10

 b = - (^610)

 c = a + b

Risposta:

Siccome il risultato vale - 9, avrò bisogno di un registro a 5 bit (

(5-1)

  • 1 = 15)

10

10

c = a + b (1) 1 0 1 1 1

E' un numero negativo, ma sarà giusto? Vediamo il suo valore assoluto:

  • c = 01000 + 1 = 01001 = 9 10

E.1.7. Esercizi proposti.

 Quanti bit sono sufficienti per codificare numeri interi tra - 100 e + 100? E tra - 5000 e +5000?

 Con registri a 16 bit, quale sottoinsieme dei numeri interi posso codificare?

 Codifica il numero - 25 in complemento a 2

 Codifica il numero - 15 in complemento a 2

 Esegui la sottrazione tra i seguenti numeri, usando la tecnica del complemento a 2: 0110011 -

 I seguenti numeri sono codificati in complemento a 2: esegui la somma e controlla il risultato:

 Esegui la somma di questi due numeri negativi e calcola il valore assoluto del risultato: 1111

1.13. Il problema dell' overflow

Sommando numeri con lo stesso segno, posso uscire dall'insieme di definizione con cui avevo codificato

i numeri.

Esempio (codifica con 8 bit, valori tra - 12710 e + 127 10 ):

risulta cioè negativo e pari a: - 122 10

(privo di significato !)

Si ha overflow quando:

 somma di numeri positivi dà un risultato negativo;

 somma di numeri negativi dà un risultato positivo.

Esempio:

Il risultato è scorretto.

Se avessimo voluto egualmente fare la somma, avremmo dovuto ridefinire il registro necessario alla

codifica (inserendo uno o più zeri (0) alla sinistra del numero):

Analogamente coi numeri negativi (inserendo uno o più uni (1) alla sinistra del numero):

Anche qua avremmo dovuto ridefinire il registro, portandolo a 4 bit: