42
Tipo carattere Tipo carattere
Finora abbiamo lavorato con valori numerici.
I numeri costituiscono molta parte del lavoro dei computer, ma non tutta. I computer sono macchine per il trattamento dell’informazionee l’informazione è costituita per la maggior parte da testi, che a loro volta sono composti da caratteri
Campo di variabilità Campo di variabilità
Intervallo finito
char TipoTipo
1
Dimensione Dimensione
(byte) (byte)
44
Codifiche binarie Codifiche binarie
Ogni carattere è rappresentato da uno specifico codice binario:
ad ogni carattere corrisponde una rappresentazione numerica univoca
Le codifiche binarie più diffuse nel mondo informatico sono:
Codifica ASCII
(American Standard Code for Information Interchange)
Codifica EBCDIC
(Extended Binary Coded Decimal Interchange Code)
Codice ASCII Codice ASCII
Rappresenta 128 simboli diversi (codice di 7 bit ):
lettere dell’alfabeto, cifre, segni di punteggiatura e altri simboli
46
Codice ASCII (
Codice ASCII (cont cont.) .)
'A' è maggiore di ';' che è maggiore di '&' Si ha che: a<b<c<...<z
A<B<C<....<Z 0<1<2<...<9
1111011 123
{
1100001 97
a
0100110 38
&
0110011 51
3
0111011 59
;
1000001 65
A
66 Decimale Decimale
1000010 B
Binario Binario Carattere
Carattere
Metodi di input/output Metodi di input/output
char x;
Output Output
printf("%c", x);
Input Input
48
… … approfondimento approfondimento
In C il tipo char è un tipo intero su 1 byte utilizzato principalmente per rappresentare caratteri
#include<stdio.h>
main() {
char x=65;
printf("%c", x); // stampa A printf("%d", x); // stampa 65 x='A';
x=x+1;
printf("%c", x); // stampa B }
Esercizi Esercizi
… sul tipo carattere
50
Esercizio Esercizio
Scrivere un programma che legge prima due caratteri e poi li stampa per due volte in ordine inverso.
Esempio:
ab
Î
babaSoluzione Soluzione
#include<stdio.h>
main() {
char x, y;
printf("Digita due caratteri: ");
scanf("%c%c", &x, &y);
printf("Hai digitato per 2 volte (ordine
52
Esercizio Esercizio
Scrivere un programma che legge prima un carattere e poi stampa i due caratteri che lo lo precedono
Esempio:
Se leggo
dstampa:
cbSoluzione Soluzione
#include<stdio.h>
main() {
char x;
printf("Digita un carattere: ");
scanf("%c", &x);
x=x-1;
printf("%c", x);
x=x-1;
printf("%c", x);
54
Altri esercizi … Altri esercizi …
Esercizio Esercizio
Scrivere un programma che legge prima tre caratteri e poi li stampa in ordine inverso.
Esempio:
Se leggo CDE stampa:EDC
56
Soluzione Soluzione
#include<stdio.h>
main() {
char x, y, z;
printf("Digita tre caratteri: ");
scanf("%c%c%c", &x, &y, &z);
printf("Hai digitato (ordine inverso): ");
printf("%c%c%c", z, y, x);
}
Esercizio Esercizio
Scrivere un programma che legge prima un carattere e poi stampa il carattere che lo segue e quello che lo precede
Esempio:
Se leggo D stampa: E C
58
Soluzione Soluzione
#include<stdio.h>
main() {
char x;
printf("Digita un carattere: ");
scanf("%c", &x);
x=x+1;
printf("Il succ = %c\n", x);
x=x-2;
printf("Il prec = %c\n", x);
}
Operatori di incremento e Operatori di incremento e decremento
decremento
60
Operatori di incremento e decremento Operatori di incremento e decremento
Operatori unari
++ aggiunge uno -- sottrae uno
x++ equivale a x=x+1
x-- equivale a x=x-1
Operatori di incremento e decremento Operatori di incremento e decremento
Operatori
Operatori postfissipostfissi
x++;
prima usa x, poi incrementala
Operatori prefissi Operatori prefissi
++x;
prima incrementa x, poi usala
62
Operatori di incremento e decremento Operatori di incremento e decremento
La variabile viene comunque incrementata
Attenzione: quando compaiono in istruzioni meno semplici
x++; //equivale a x=x+1;
++x; //equivale a x=x+1;
y=x++; //equivale a y=x; x=x+1;
y=++x; //equivale a x=x+1; y=x;
Operatori di incremento e decremento Operatori di incremento e decremento
int n, m=0;
n=m++;
n vale 0 m vale 1
int n, m=0;
n=++m;
n vale 1 m vale 1
int n, m=0;
64
Costanti Costanti
Perché usare costanti?
Perché usare costanti?
Evitare di scrivere più volte in un programma un'espressione che rappresenta un numero,
per esempio quando è molto complicata, o per garantire che non ci siano difformità tra le varie occorrenze
Migliorare la leggibilità dei programmi,
per esempio usare sempre una costante per pigreco
Riutilizzare i programmi
per esempio un programma che manipola matrici quadrate di dimensione 100 può essere facilmente riutilizzato per le matrici di dimensione 200, se tale dimensione è
66
#define
#define
Sintassi
Sintassi
#define Nome costante
Semantica
Semantica
Tutte le occorrenze di Nome (purché non siano racchiuse tra apici e non facciano parte di un’altra stringa) vengono rimpiazzate con costante
Nota Nota
Nomi delle costanti scritti con caratteri maiuscoli (per convenzione)
Dopo alla fine #define non serve il ;
68
Esempio Esempio
#define SIZE 10
int i=SIZE;
Viene tradotto dal preprocessore preprocessore in int i=10;
La definizione di costante implica che il suo valore non può essere modificato
Costanti Costanti
/* Calcolo area cerchio */
#include <stdio.h>
#define PI_GRECO 3.14 main()
{
float raggio, area;
printf("Dammi raggio: ");
scanf("%f", &raggio);
area = raggio*raggio*PI_GRECO;
printf("Area: %f", area);
}
NOTA
Le direttive non terminano con il ;
70
Esempio Esempio
#include<stdio.h>
#define SIZE 3 main()
{
int x=SIZE;
int y= SIZE+2;
printf("%d %d", x, y);
}
Stampa:
3 5
3 3
Esempio Esempio
#include<stdio.h>
#define SIZE 3 main()
{
printf("SIZE");
Stampa:
SIZE
Semantica Semantica
Tutte le occorrenze (purché non siano racchiuse tra apicie non facciano parte di un’altra stringa) vengono rimpiazzate con costante
72
Esempio Esempio
#include<stdio.h>
#define SIZE 3 main()
{
int MYSIZE = 2;
int y = MYSIZE;
printf("%d", y);
}
Stampa:
2
SIZEparte di MYSIZE, quindi non si rimpiazza con 3 SIZE parte di MYSIZE, quindi
non si rimpiazza con 3
Semantica Semantica
Tutte le occorrenze (purché non siano racchiuse tra apici e non facciano parte di un’altra stringa) vengono rimpiazzate con costante
Strutture di controllo
74
Teorema di
Teorema di Bohm Bohm e Jacopini e Jacopini
Tutti i programmi possono essere scritti in termini di tre strutture di controllo:
La sequenza, permette di eseguire le istruzioni secondo l’ordine sequenziale in cui sono scritte
La selezione, permette di scegliere, in base al valore di una condizione, l’esecuzione di quale istruzione eseguire
L’iterazione, permette di eseguire ripetutamente un blocco di istruzioni
Linguaggio naturale Linguaggio naturale
se...allora...altrimenti....
qualora...ma ...nel caso in cui...
ripeti ... fino a quando...
mentre...
nel primo caso...., nel secondo caso...,... nell’ennesimo caso...
nei linguaggi di programmazione questi costrutti
76
Strutture di controllo del flusso Strutture di controllo del flusso
Le strutture di controllo del flusso specificano l’ordine secondo il quale le operazioni devono essere effettuate
istruzioni decisionali
istruzioni cicliche
Istruzioni decisionali Istruzioni decisionali
1. if
2. if-else
3. switch
78
La struttura di selezione singola if
Usata per scegliere tra diverse azioni alternative.
Esempio (Pseudocodice):
Se il voto di uno studente è maggiore o uguale a 18 Stampa “Promosso”
Se la condizione è true, viene eseguita l’istruzione di stampa e il programma prosegue con la prossima istruzione.
Se la condizione è false, l’istruzione di stampa è ignorata e il programma prosegue con la prossima istruzione.
• L’indentazione delle istruzioni migliora la leggibilità del programma Esempio (Codice C corrispondente allo pseudocodice):
if ( voto >= 18 )
printf( “Promosso\n" );
if if
Sintassi Sintassi
if (espressione) istruzione
Semantica Semantica
Valuta espressione
80
if if : diagramma di flusso : diagramma di flusso
I0;
if (E) I1;
I2;
I0
I1
I2 E
vero falso
la struttura introduce due possibili sequenze:
1. la sequenza (se E è vera):
I0 I1 I2
2. la sequenza (se E è falsa):
I0 I2
Esempio Esempio
#include <stdio.h>
main() {
int i;
printf("Dammi un intero: ");
scanf("%d", &i);
if (i<100)
printf("Minore di 100\n");
Stampa "Minore di 100" se il
numero letto è minore di 100
82
Sintassi
Sintassi
if (espressione) istruzione
if if
Operatori relazionali Operatori relazionali
== uguale
!= diverso
< minore
<= minore o uguale
> maggiore
>= maggiore o uguale
84
Attenzione Attenzione
==
diverso da
=uguaglianza
assegnamento
blocco
#include <stdio.h>
main() {
int i;
int min_100=0;
printf("Dammi un intero: ");
scanf("%d", &i);
if (i<100) {
printf("Minore di 100\n");
min_100=1;
} }
if if + istruzione composta + istruzione composta
86
Esercizio Esercizio
Scrivere un programma che richieda in ingresso un valore intero e stampa il suo valore assoluto.
Valore assoluto di un numero n:
Se n < 0: -n Se n >= 0: n Esempio
Esempio
9 9 ÎÎ 99 --27 27 ÎÎ 2727
Soluzione Soluzione
#include<stdio.h>
main() {
int n;
printf("Dammi un intero: ");
scanf("%d", &n);
if (n<0)
88
Istruzioni decisionali Istruzioni decisionali
1. if
2. if-else
3. switch
if- if - else else
Sintassi
Sintassi
if (espressione) istruzione_1 else
istruzione_2
90
if- if - else else : semantica : semantica
Viene valutata espressione
Se l’espressione è vera (cioè assume valore diverso da zero) viene eseguita
istruzione_1
Se l’ espressione è falsa (cioè assume valore nullo) viene eseguita istruzione_2
if- if - else else : diagramma di flusso : diagramma di flusso
I0;
if (E) I1;
else I2;
I3;
I0
I2 vero E falso
I1
la struttura introduce due possibili sequenze:
1. la sequenza (se E è vera):
92
Esempio Esempio
/* Utilizzo if-else */
#include <stdio.h>
main() {
int i;
printf("Dammi un intero: ");
scanf("%d", &i);
if (i<100)
printf("Minore di 100\n");
else
printf("Maggiore o uguale a 100\n");
}
Stampa "Minore di 100"
se il numero letto è minore di 100 Stampa "Maggiore o uguale a 100"
se il numero letto è maggiore o uguale di 100
blocco blocco
if- if - else else + istruzione composta + istruzione composta
#include <stdio.h>
main() {
int i;
int mag_100=0;
int min_100=0;
printf("Dammi un intero: ");
scanf("%d", &i);
if (i<100) {
printf("Minore di 100\n");
min_100=1;
} else {
printf("Maggiore o uguale a 100\n");
mag_100=1;
94
; errore
Osservazione Osservazione
#include<stdio.h>
main() {int x;
scanf("%d", &x);
if (x==0) {
printf("pippo "); printf("pluto ");
}
else printf("minnie");
}