Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
[1.2.23]
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.
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.
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.
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 */
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 */
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.
Supponiamo di avere a disposizione due numeri) interi senza segno di formato 1 byte ciascuno :
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
#include <stdio.h>
#include <stdlib.h>
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.
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
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.
<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>
system("PAUSE");
return 0;
}
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.
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
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>
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”.
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
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.
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.
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
Gli elementi con indice 2 e 3 hanno lo stesso contenuto ma sono formalmente diversi.
13