Sei sulla pagina 1di 13

VOL_1 / UNITA’ 2 / MOD.

PAROLE CHIAVE e I TIPI DI DATI

[1.2.23]

PAORLE CHIAVE [KEY WORD]

Se si dovesse scrivere dei testi sul linguaggio C servirebbero tanti libri e mille sarebbero pochi.

Se si volesse invece dirlo con parole si potrebbe dire: “un numero limitato di parole riservate (dette parole
chiave) e da una modesta quantità di operatori matematici”.

La potenzialità dei linguaggi di questo tipo è che tutti gli archetipi 1 possibili, realizzati e realizzabili sono una
combinazione tra queste parole, gli operatori e la grammatica che ne definisce le regole sintattiche.

Proprio come in un qualsiasi linguaggio esistono le parole, i simboli e la grammatica, anche nel linguaggio C
la situazione è analoga.

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;

Il significato delle parole chiave allorché usate, sarà messo in evidenza di volta in volta tuttavia tra alcune
parole chiave possiamo distinguere:

 quelle che definiscono i tipi delle variabili e i loro modificatori [ char, double, float, int, long,
short, signed, unsigned, void,]
 le istruzioni per le strutture di controllo [ break, case, default, do, else, for, if, switch, while]

1
Archetipo significa modello o struttura base.
1
I TIPI DI DATI E I MODIFICATORI DI TIPO

Variabili, dati, identificativo, codice simbolico, tipi, sono sostantivi che identificano a vario titolo aspetti
degli elementi logici gestiti dal controllore di processo durante il funzionamento.

Ad esempio per esprimere le seguenti grandezze

Temperatura ambiente = 27,5°C / Abitanti di Bologna = 390.849 / π=3,141592653 …

Sono tutti esempi di variabili e di dati numerici che ne esprimono il contenuto.

Si utilizzano nomi o codici simbolici arbitrari per identificare le grandezze espresse numericamente da una
sequenza di cifre il cui significato è riconducibile ad un senso convenuto e stabilito. Ad esempio il contenuto
numerico 11001 ha un senso diverso se è riferito ad un numero in base 10 o 2.

Variabile: tipo, identificativo e contenuto

Il tipo di una variabile è paragonabile alla forma e alle dimensioni di un contenitore…..

Il contenitore è riconoscibile attraverso un codice identificativo, il nome simbolico deciso dal progettista che
identifica la variabile.

Il contenuto è il dato numerico assunto dalla variabile nel corso del processo.

Volendo estendere l’analogia ad un esempio concreto….

2
TIPI INTERI [char int]

CHAR

Il tipo char (significa carattere) è un numero intero positivo su 8 bit pesati pertanto un numero compreso
tra 0 e 255.

Il tipo char viene utilizzato per codificare i caratteri in ingresso e in uscita. Come è facile intuire, tutti i
caratteri che vengono digitati dalla tastiera o quelli rappresentati a video non sono altro che simboli a cui
corrisponde un codice numerico.

Il formato con cui viene rappresentato o identificato un carattere è numerico oppure testuale.

Un esempio: la lettera D di una tastiera occidentale è identificato con il codice numerico 68, ma anche
quello di una tastiera in cirillico o devnagari (Hindi o Nepali) tuttavia la rappresentazione simbolica (ossa il
formato carattere testuale digitato o stampato) è necessariamente diverso.

68
Formato numerico in base 2 0 1 0 0 0 1 0 0
Formato numerico in base 2 68
Formato numerico in base esadecimale 4 4
Formato carattere occidentale D
Formato carattere cirillico д
Formato carattere devanagari द

Ciò mette in evidenza che le stringhe di caratteri (le sequenze di lettere che formano le parole) sono
identificate come le sequenze dei codici numerici che formano ciascun elemento del testo.

Se ad esempio si volesse verificare cosa succede quando si digitano le parole “SISTEMI” e “sistemi”
attraverso il codice numerico delle loro lettere si vedrebbero le seguenti sequenze di codici.

S I S T M I

s i s t m i

Risulta più chiaro che il concetto di case sensitive attiene proprio al fatto che le lettere maiuscole e
minuscole hanno codici differenti.

Aprendo un editor di testo è facilmente verificabile che digitando dalla tastiera numerica un codice
numerico mentre si tiene premuto il tasto “alt” compare scritto il simbolo del carattere relativo al codice
digitato. Premendo alt+65 comparirà la lettera A.

3
IL CODICE ASCII2

La relazione tra il simbolo garfico del carattere e il codice numerico che lo rappresenta è formalizzato nel
codice ASCII. Essendo la dimensione pari a 8 bit i caratteri rappresentabili sono appunto 256 .

La tabella di comparazione è facilmente disponibile in rete oppure attraverso qualche riga di codice C è
possibile stampare a video un carattere digitando il codice o viceversa.

#include <stdio.h>
#include <stdlib.h>

/* programma che preleva un carattere da tastiera e resituisce in out il carattere e il codice ASCII
corrispondente */

int main(int argc, char *argv[])


{
char c_CAR; //dichirazione della variabile carattere
c_CAR=getchar();//comando che assegna il carattere digitato alla variabile c_CAR
//funzione printf: stanpa a video il carattere digitato sia in formato carattere
// che il codice numerico ASCCI
printf("hai digitato il carattere %c corrispondente al codice ASCII %c\n",c_CAR,c_CAR);
system("pause");
return 0;
}

2
ASCII (acronimo di American Standard Code for Information Interchange, Codice Standard Americano per lo Scambio
di Informazioni) è un codice per la codifica di caratteri. La standard ASCII è stato pubblicato dall'American National
Standards Institute (ANSI) nel 1968. Ha 8 bit.
4
#include <stdio.h>
#include <stdlib.h>

/* programma che preleva da tastiera un numero intero e resituisce in out il carattere corrispondente */

int main(int argc, char *argv[]) {


char c_NUM; //dichirazione della variabile numero
//funzione scanf che consente di acquisire da tastiera un numero intero
//assegandolo alla variabile c_NUM
scanf("%d",&c_NUM);
//funzione printf: stanpa a video il carattere digitato sia in formato carattere
// che il codice numerico ASCCI
printf("hai digitato il numero %d corrispondente al carattere %c\n",c_NUM,c_NUM);
system("pause");
return 0;
}

5
INT

Le variabili int qualificano variabili intere senza segno e la loro dimensione in byte può variare da un
compilatore all’altro. Il DEV C++ assegna una taglia di 4 byte per questo tipo di variabile.

Un tipo intero a seconda di come lo si declina all’atto della dichiarazione (con l’uso dei modificatori di tipo),
è un numero con o senza segno e può essere usato per tutte le variabili numeriche intere.

Le operazioni tra interi danno luogo a numeri interi pertanto il risultato di una divisione tra due interi
restituisce la sola parte intera. Ossia il risultato tra gli interi 15 e 4 è 3 , il viceversa è 0.

Alcune curiosità sull’overflow , il trabocco ….

Supponiamo di avere a disposizione due numeri) interi senza segno di formato 1 byte ciascuno :

NUM_1 = 152 e NUM_2= 230

Si supponga ora di assegnare ad un terzo intero omogeneo con i primi due (1 byte) la somma dei primi due.

La somma tra 152 e 230 dovrebbe dare 382 ma il risultato, espresso su 1 solo byte risulterà troncato dal
8vo bit in poi; pertanto il risultato disponibile sarà quello visibile sul byte.

Il numero 382 in binario è 1 0111 1110 ossia 256 + 126 che in binario è 1 0000 0000 + 111 1110

NUM_1 152 1001 1000


NUM_2 230 1110 0110
NUM_3 126 0111 1110

E’ possibile verificare attraverso un semplice programma C

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {


char NUM_1=152, NUM_2=230, NUM_3;
NUM_3=NUM_1+NUM_2;
printf("%u\n",NUM_3);
return 0;
}

6
FLOAT e DOUBLE

Le variabili float qualificano formati numerici che servono a rappresentare numeri in virgola mobile.

La variabile double è sempre un formato in virgola mobile ma di dimensione doppia rispetto al float.

Sebbene abbiano la stessa dimensione di un intero, i 4 byte che compongono il float sono organizzati in
modo diverso poiché è necessario rappresentare una parte intera la virgola e una mantissa.

Senza entrare nel dettaglio della loro natura basta sapere che ogni volta che si eseguono programmi che
implicano un dato in virgola mobile bisogna definire tutte le variabili coinvolte nel calcolo come variabili in
virgola mobile.

Il calcolo del quoziente in virgola mobile di due numeri (anche se interi) possono generare un numero non
intero pertanto tutti i numeri vanno dichiarati in virgola mobile.

L’esempio mostra chiaramente il concetto:

Divisione tra due interi (definiti come int) con risultato in float stampato sia come formato 3 intero che (più
correttamente) con formato float

Nel caso in cui è stampato come intero il risultato è pari a 0 mentre nell’altro 1, se stampato come numero
in virgola mobile risulta 1.000000. In entrambi i casi sabgliati.

Divisione tra due interi (definiti come float) con risultato in float

In questo caso il risultato è corretto.

3
Il formato do stampa è spiegato nel capitolo MARCATORE DI TIPO
7
MODIFICATORI DI TIPO

Per consentire un migliore controllo delle variabili sono disponibili 4 parole chiave che consentono di
qualificare in modo più dettagliato i tipi interi e con virgola mobile.

unsigned signed short long

La sintassi per l’uso dei modificatori di tipo è :

modificatore tipo variabile=numero;

(unsigned int ui_VAR=65;)

<La variabile ui_VAR è di tipo intero senza segno (il bit usato per il segno è impiegato come cifra msb) ed è
inizializzata a 65>

I modificatori unsigned e signed sono utilizzati per i tipi interi e ineriscono all’uso o meno del bit di
segno. Di default il tipo int è già con segno per cui il modificatore signed è utilizzato solo per il tipo
char.

I modificatori short e long consentono di ridurre o ampliare la quantità di memoria assegnata al tipo
non modificato.

8
LA PAROLA CHIAVE sizeof

La parola chiave sizeof , rispettando la sintassi indicata, consente di visualizzare in byte la taglia di un
formato.

i_taglia = sizeof(tipo);

La variabile i_taglia conterrà il numero di byte del tipo indicato tra parentesi.

Il programma che segue mostra alcune combinazioni di tipo e modificatore e la rispettiva dimensione di
memoria occupata.
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])


{
printf ("dimensione in byte di un char = %d \n", sizeof(char));
printf ("dimensione in byte di un unsigned char = %d \n", sizeof(unsigned char));
printf ("dimensione in byte di un int = %d \n", sizeof(int));
printf ("dimensione in byte di un short int = %d \n", sizeof(short int));
printf ("dimensione in byte di un long long int = %d \n", sizeof(long long int));
printf ("dimensione in byte di un float = %d \n", sizeof(float));
printf ("dimensione in byte di un double = %d \n", sizeof(double));
printf ("dimensione in byte di un long double = %d \n", sizeof(long double));

system("PAUSE");
return 0;
}

Si suggerisce a titolo di verifica di sperimentare tutte le combinazioni possibili.

9
INTERI CON O SENZA SEGNO

Un numero intero può essere espresso con o senza segno. Nel caso in cui si voglia utilizzare numeri negativi
si tenga conto che l’ultimo bit del gruppo di byte utilizzato è impegnato per indicare il segno.

A titolo di esempio in un byte senza segno utilizza 8 bit per esprimere la cifra che potrà assumere 256 valori
compresi numericamente tra 0 e 255 mentre in un byte con segno, l’ultimo bit sarà usato per
rappresentare il segno. Dunque il numero rappresentabile sarà dimezzato in senso assoluto pur rimanendo
complessivamente 256 i valori computati.

Byte senza segno:

msb lsb
B7 B6 B5 B4 B3 B2 B1 B0
0 0 0 0 0 0 0 0 0
127 0 1 1 1 1 1 1 1
128 1 0 0 0 0 0 0 0
255 1 1 1 1 1 1 1 1

Byte con segno:

msb lsb
B7 B6 B5 B4 B3 B2 B1 B0
0 0 0 0 0 0 0 0 0
127 0 1 1 1 1 1 1 1
-128 1 0 0 0 0 0 0 0
-1 1 1 1 1 1 1 1 1

10
Il seguente codice consente di prelevare un numero intero (a 4 byte) e di assegnarlo rispettivamente ad una
variabile formato carattere con e senza segno. La variabile viene poi stampata con la funzione printf nei due
formati. Si potrà verificare che acquisendo uno stesso numero da tastiera , il suo valore dipenderà dal tipo
di variabile cui è assegnato.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {


char c_A;
unsigned char uc_B;
int i_numero;
printf ("digita un numero intero positivo \n");
scanf ("%d",& i_numero);
c_A=i_numero;
uc_B=i_numero;
printf ("hai digitato %d %d \n",c_A,uc_B);
return 0;
}

11
IDENTIFICARE LE VARIABILI

Il nome delle variabili è scelto dal programmatore e avviene nelle fasi preliminari del progetto
dell’algoritmo.

Tuttavia si suggeriscono alcune linee guida per nominare le variabili sottolineando che, ancor prima dei
limiti oggettivi, una regola sempre valida è: “semplicità e chiarezza”.

Per il nomi delle variabili si possono usare:

- tuti i caratteri a…z e A…..Z


- Il carattere (_)
- I caratteri 0….9 fuorché in prima posizione

UNA PROPOSTA PER NOMINARE LE VARIABILI

Poiché le variabili sono caratterizzate ancor prima di un nome simbolico rappresentativo, di un tipo, un
format potrebbe essere il seguente:

codicetipo_CODICENOME

Ad esempio:

tipo: char tipo: int tipo: flloat tipo: long iint tipo: unsigned int
Nome: Nome: Nome: Nome: Nome:
testo conteggio temperatura fattoriale secondo resto
c_TXT I_CNT f_TEMP li_FTT ui_2RTS

12
VETTORI

Il vettore è un dato formato da più elementi omogenei.

Così come un tipo di dato carattere è l’unione di 8 bit , un vettore di n caratteri è un tipo di dato formato n
caratteri ciascuno dei quali è formato da 8 bit ciascuno.

Viene definito in funzione del tipo che lo caratterizza (char, int, float, ecc…) e la sua dimensione è dichiarata
tra due parentesi graffe.

char c_vVECT [5];

Significa una variabile (il cui nome è c_vVECT) formata da 5 elementi (estensione 5) di tipo intero (è il tipo di
ciascun elemento). In tutto la dimensione della nuova variabile è 5x1 byte.

I singoli elementi del vettore sono identificati e identificabili attraverso la numerazione da 0 a n in questo
caso da 0 a 4.

La variabile char c_vVECT [5];è dunque rappresentata da 5 elementi omogenei ma indipendenti. Il


loro uso è esteso e saranno ampiamente usate nei prossimi passaggi.

Un esempio di variabile vettore è una stringa di testo. La parola BELLO può essere organizzata in C come
l’unione di 5 elementi carattere ciascuno dei quali ha in comune con gli altri l’appartenenza alla parola pur
avendo tuttavia ciascuno un proprio valore.

c_vVECT [0] c_vVECT [1] c_vVECT [2] c_vVECT [3] c_vVECT [4]
B E L L O
66 69 76 76 79

Come si può notare il numero contenuto tra le parentesi identifica:

 Gli elementi del vettore all’atto della dichiarazione


 L’indice che punta all’enn-esimo elemento

Gli elementi con indice 2 e 3 hanno lo stesso contenuto ma sono formalmente diversi.

13

Potrebbero piacerti anche