Introduzione_2 - Dipartimento di Matematica

Transcript

Introduzione_2 - Dipartimento di Matematica
SULL’USO DEI CARATTERI
Ricordiamo che:
int x;
si legge con (“%d” ,&x) e si stampa con (“%d”,x)
float x; si legge con (“%f” ,&x) e si stampa con (“%f”,x)
double x;si legge con (“%lf”,&x) e si stampa con
(“%f”,x)
Vediamo ora che:
char x;
si legge con
(“%c”,&x)
e si stampa con (“%c”,x)
ma anche con (“%d”,x)
Ricordiamo che nel Codice ASCII
I caratteri 0-31 e 127 non sono stampabili. Gli altri sì.
Il carattere 32 stampa un singolo spazio.
I codici delle cifre 0-9 sono consecutivi.
I codici delle lettere a-z e A-Z sono consecutivi.
La differenza tra il codice di una lettera maiuscola e di quella corrispondente
minuscola è 32.
DUE ESEMPI
------------------------------------------
ALTRO ESEMPIO
Questo programma stampa:
Il carattere a
Il carattere 3
Il carattere
ha codice ASCII
Il carattere }
Il carattere ~
ha codice ASCII 97.
ha codice ASCII 51.
10.
ha codice ASCII 125.
ha codice ASCII 126.
N.B. In C c’è un insieme di caratteri speciali (alcuni non stampabili)
che sono rappresentati preceduti da \ . L’ insieme completo delle
“escape” sequences è sul libro. Qui ricordiamo:
\n
\a
\\
\?
\'
\''
\ooo
\xhh
newline
alert
\
?
'
''
carattere con codice specificato dalle
tre cifre ottali ooo
carattere con codice specificato dalle
due cifre esadecimali hh
LETTURA E STAMPA DI PAROLE(STRINGHE)
Ricordiamo che:
int x;
float x;
double x;
char x;
si legge con
si legge con
si legge con
si legge con
(“%d”, &x)
(“%f”, &x )
(“%lf”,&x)
(“%c”,&x)
e si stampa con (“%d”,x)
e si stampa con (“%f”,x)
e si stampa con (“%f”,x)
e si stampa con (“%c”,x)
ma anche con (“%d”,x)
Vediamo ora che una parola:
char p[10+1]; si legge con (“%s”,p)e si stampa con(“%s”,p)
Esempio:
int main()
{
char p[10+1];
int i;
/* lettura di una parola */
puts("Scrivi una parola di al piu' 10 caratteri:");
scanf("%s",p);
/* stampa di una parola */
printf("La parola letta e' %s, p);
i=0;
while (p[i]!='\0')
i++;
printf(" e contiene %d caratteri.\n", i);
return 0;
}
Questo programma stampa:
Scrivi una parola di al piu' 10 caratteri:
annamaria
La parola letta e' annamaria e contiene 9 caratteri.
Il formato %s in scanf si aspetta, come argomento corrispondente, una
array di char sufficientemente grande da contenere tutti i caratteri della
parola da leggere più 1 poichè viene appeso ‘\0’.
Il formato %s in printf si aspetta, come argomento corrispondente, una
array di char stampabili e li stampa tutti fino a quando incontra ‘\0’, che
non stampa .
Si poteva procedere, più faticosamente, così:
#include <stdio.h>
#include <math.h>
int main()
{
char p[10+1],c;
int i = 0,j;
/* lettura alternativa di parola carattere per carattere*/
puts("Scrivi una parola di al piu'10 caratteri poi un blank:");
scanf("%c",&c);
while(c!=' '){
p[i++]=c;
scanf("%c",&c);
}
p[i]='\0';
/* stampa alternativa di parola carattere per carattere*/
printf("La parola letta e' ");
for (j=0;j<i;j++)
printf("%c",p[j]);
printf(" e contiene %d caratteri.\n", i);
return 0;
}
Premessa. In C ad ogni espressione può essere associato un
valore logico di vero o falso:
valore espressione zero
valore espressione non-zero
–
–
falso
vero
Esempio: 3 - 4 e` vero
SULL'USO DI OPERATORI LOGICI
Questo programma stampa:
z = 1, t = 0, v = 0.
-----------------------------------------------
Cosa stampa questo programma?
Espressioni aritmetiche (logiche) in C
• Operatori aritmetici:
+, - , * , / , e operatore modulo %
La divisione tra interi tronca il resto.
Così 9 / 5 restituisce 1.
L’ operatore modulo (tra interi) restituisce il resto della divisione.
Così 9 % 5 restituisce 4.
• Operatori relazionali:
> , < , <= , >=
• Operatori di uguaglianza:
== , !=
• Operatori logici:
&&, | | , !
• Altri operatori:
=,(,),{,}
...........
Semplici regole di valutazione delle espressioni
Le precedenze tra gli operatori determinano l’ordine di valutazione di una
espressione. Gli operatori aritmetici hanno la precedenza dettata dalla
matematica; se si desidera un ordine diverso si usano le parentesi.
Esempio:
Media di a, b, c
• Sbagliato: a + b + c / 3
• Corretto: (a + b + c ) / 3
Nella valutazione innanzitutto vengono valutate le parentesi. Se le parentesi
sono annidate quella più interna viene valutata per prima. Se ci sono più
parentesi di pari livello sono valutate da sinistra a destra. Se ci sono più
operatori di pari livello vengono valutati da sinistra a destra.
Esempio:
Somma di a, b, c.
La somma a + b + c viene valutata come se ci fossero le parentesi
seguenti: ((a + b) + c ).
Si dice che l’operatore + associa da sinistra a destra.
Gli operatori fin qui presentati associano tutti da sinistra a destra eccetto
l’operatore = che associa da destra a sinistra.
Esempio:
int x, y, z;
z = y = x = 0;
Tutte le variabili vengono poste a zero, come se fosse scritto:
(z=(y=(x=0)));
N.B. Osservare sul libro la tabella completa che specifica priorità e
associatività di tutti gli operatori.
COSTANTI
•
int, float, double e char
Esempi:
11263
[ 0x3A
0371
11.23F
12.4
54
0xF3
0271
5F
-34.7e-12
'a','3','\n'
'\xF3'
'\177'
di tipo int (notaz. decimale)
di tipo int (notaz. esadecimale)
di tipo int (notaz. ottale)
]
di tipo float
di tipo double!
di tipo char
(specificata con il carattere)
di tipo char
(specificata con due cifre esadecimali)
di tipo char
(specificata con tre cifre ottali)
Oss: '\0' è numericamente uguale a 0.
•
stringa
Esempio:
"ciao, mondo"
occupa in memoria lo spazio occupato da 12 caratteri
consecutivi, che sono:
'c','i','a','o',',',' ','m','o','n','d','o','\0'
Oss:
'a'
è diverso da "a"
Esempio:
char mio_nome[6+1]={'g','i','u','l','i','a','\0'};
char mio_nome[6+1]= “giulia”;
•
enumerativa
Esempio:
enum semi{quadri, cuori, fiori, picche};
int seme = fiori;
/*seme assume valore 2 *
VARIABILI
Ogni variabile corrisponde ad una locazione della memoria
principale (cella, parola, ecc.), nella quale viene memorizzato il
suo valore.
Ogni variabile deve essere dichiarata con un nome (identificatore)
ed un tipo di dato prima di poter essere usata.
Il nome di una variabile è una sequenza di: caratteri, cifre, _
Non deve iniziare con cifra (errore) o con _ (compilatore).
C distingue tra caratteri maiuscoli e caratteri minuscoli.
I tipi di dato che useremo:
• int
• char
• float, double
– numero intero
– carattere o numero intero piccolo
– numero in virgola mobile
Una variabile di tipo int o float di solito occupa 32 bit; invece
una variabile di tipo char di solito ne occupa solo 8 mentre una di
tipo double ne occupa 64.
Quando si assegna un nuovo valore ad una variabile, il vecchio
valore viene perso.
IDENTIFICATORI
Un identificatore è un nome che viene assegnato a variabili, ma
anche a funzioni, ad oggetti in genere definiti dal programmatore.
Come per i nomi di variabili, gli identificatori possono essere
c o m p o s t i d a lettere e/o c i f r e (caratteri alfanumerici) e
sottolineature (underscore); il primo carattere non può essere
numerico.
PAROLE CHIAVE
Il linguaggio C riserva una serie di termini, detti parole chiave,
per la definizione dei costrutti propri del linguaggio. Sono:
auto, break, case, char, const, continue, default, do, double,
else, enum, extern, float, for, goto, if, int, long, register,
return, short, signed, sizeof, static, struct, switch, typedef,
union, unsigned, void, volatile, while
Le parole chiave non possono essere utilizzate come
identificatori.
Si possono usare tante variabili con un nome che le accomuna
e con un indice, come si fa in matematica: v0, v1, v2, v3.......
UN ESEMPIO DI USO DI VETTORI (ARRAYS)
#include <stdio.h>
int main()
{
int v[5] = {10, 20, 30, 40, 50}, s;
//inizializzazione
s = v[0] + v[1] + v[2] + v[3] + v[4]; //calcolo somma
printf("La somma degli elementi dell'array e' %d\n", s);
return 0;
}
I vettori, o array, permettono di allocare un insieme di elementi
dello stesso tipo in zone contigue della memoria.
Nell'esempio, il vettore v ha 5 elementi ed è indicizzato da 0 a 4,
cioè il primo elemento è v[0], il secondo è v[1], l'ultimo è v[4].
Nel caso in cui il vettore venga indicizzato con un indice al di
fuori del range ammesso:
• nel migliore dei casi si ha un errore di “segmentation fault”
• più spesso si va a scrivere/leggere una variabile che appartiene
al programma, allocata subito dopo il vettore e naturalmente
possono verificarsi fatti indesiderati e imprevedibili, spesso
difficili da diagnosticare.
Si può far diversamente e meglio:
int v[5], s, i;
for (i = 1 ; i <= 5; i++)
v[i-1] = i *10;
// inizializzazione
for (s = i = 0; i < 5; i++)
s = s + v[i];
// calcolo somma
I due cicli anche così:
i = 1;
while (i < =5){
v[i] = i *10;
i++;
}
// inizializzazione
s = i = 0;
while (i < 5){
s = s + v[i];
i++;
}
// calcolo somma