250 likes | 442 Vues
Dichiarazioni e tipi predefiniti nel linguaggio C. Variabili, costanti, tipi semplici, conversioni di tipo. Premessa. Programmi provati sul compilatore Borland C++ 1.0 Altri compilatori: lievi differenze Istruzioni per l’uso: Cercate di capire gli algoritmi Provate i programmi!!!
E N D
Dichiarazioni e tipi predefiniti nel linguaggio C Variabili, costanti, tipi semplici, conversioni di tipo.
Premessa • Programmi provati sul compilatore Borland C++ 1.0 • Altri compilatori: lievi differenze • Istruzioni per l’uso: • Cercate di capire gli algoritmi • Provate i programmi!!! • Errori di sintassi • Errori a run-time • Modificate i programmi!!! • Cosa succede se cambio/scambio/tolgo/aggiungo istruzioni? • … e se volessi che facesse anche quest’altra cosa?
Le variabili • Nome simbolico • Rappresenta un dato in memoria • Occupa una certa quantità di celle di memoria • Lettura e scrittura • Es.:a = 3;a = b;3 = a;NO!!! • Ha un tipo.
I tipi ed il linguaggio C • Un tipo influenza: • L’interpretazione dei bit (carattere? intero? reale? …) • Lo spazio occupato (allocato) in memoria • L’intervallo dei valori che possono essere memorizzati • Le operazioni permesse sulla variabile e la semantica associata • Il C possiede le seguenti categorie (tipi semplici): • Caratteri • Numeri naturali • Numeri interi • Numeri in virgola mobile.
Dichiarazione variabili • Dichiarazione:tipo nome; • Dichiarazione con inizializzazione:tipo nome = espressione; • Valore non definito (ovvero, casuale) se non inizializzo • Più variabili dello stesso tipo:tipo nome1, nome2,…, nomen;tipo nome1=espr1,nome2=espr2,…,nomen=esprn; • Esempio:int x = 24, y, z = 34;
Dichiarazione costanti • Assegno un valore permanentemente • Dichiarazione:consttipo nome = espressione; • Più costanti:consttipo nome1 = espressione1, nome2 = espressione2,…, nomen = espressionen; • Esempioconst int x = 24, y = 55; • A cosa servono? .
Caratteri Nome Significato Occupazione* e Range • Operazioni consentite: • assegnamento (=) • relazionali (==, !=, <, >, <=, >=) • logici (&&, ||, !) • operazioni aritmetiche (+, -, *, /(intera), %) ??? • Costante esplicita: char pluto; pluto = 'a'; • 'a' è detta literal o costante esplicita. char carattere ASCII 8 bit tabella ASCII * Valore indicativo
Naturali e interi Nome Significato Occupazione* e Range short int intero “corto” 16 bit [-32768, +32767] int intero 16 bit [-32768, +32767] long int intero “lungo” 32 bit [-231, 231–1] unsigned short intnaturale “corto” 16 bit [0, 65535] unsigned int naturale 16 bit [0, 65535] unsigned long intnaturale “lungo” 32 bit [0, 232-1] * Valore indicativo
Naturali e interi • I valori espressi per Occupazione e Range sono indicativi • Lo standard C stabilisce però le seguenti regole: • Occupazione short occupazione int occupazione long • Occupazione unsigned short occupazione unsignedintoccupazione unsigned long • Inoltre, vale anche: • Occupazione int = occupazione unsigned int .
Naturali e interi • Operazioni consentite: • assegnamento (=) • operazioni aritmetiche (+, -, *, /(intera), %) • relazionali (==, !=, <, >, <=, >=) • logici (&&, ||, !) • Costante esplicita (literal):int pippo;pippo =10;
Numeri in virgola mobile Nome Significato Occupazione* e Range float “singola precisione” 32 bit [-10+38, +10+38] double “doppia precisione” 64 bit [-10+308, +10+308] long double “precisione estesa” 80 bit [-10+4932, +10+4932] • La precisione massima che posso ottenere è circa : • float: 10-38 • double: 10-308 • long double: 10-4932 • Questa precisione si ottiene nell’intorno dello zero. * Valore indicativo
Numeri in virgola mobile • I valori espressi per Occupazione e Range sono indicativi • Vale però: • Occupazione float occupazione double occupazione long double • Operazioni consentite: • assegnamento (=) • operazioni aritmetiche (+, -, *, /) • relazionali (==, !=, <, >, <=, >=) • attenzione: (x/y)*y == x in generale non è vera! • Costante esplicita (literal): • float: pippo = 10.321f; • double: pippo = 15.0; oppure pippo = 15.0d; • Notazione esponenziale: pippo = -10.0E+23;
Regole di conversione implicita • Espressioni miste del tipo: x operatore y • char, shortint • se l’espressione è ancora eterogenea:int long unsigned int unsigned long float double long double • il risultato dell’espressione sarà uguale a quello del più alto livello gerarchico • 5.0 / (23 / 9) 5.0 / 2 5.0 / 2.0 2.5 • double d1 = 3.4E+100, d2 = 6.8E-100;float f = 1250.35f;d1= f; la f viene convertita a double f = d2; le cifre frazionarie di d2 sono troncate f = d1; la d1 provoca un overflow • Esiste anche la conversione esplicita (type cast).
Primi esempi in “quasi C” Una versione semplificata del linguaggio C
Il mio primo programma! /* Il mio primo programma in “quasi C” */ main() { printf ("Hello world!!!"); printf ("Ovvero: ciao mondo!!!"); } Il “punto d’ingresso” del programma I blocchi L’ordine di esecuzione delle istruzioni I commenti La “sintassi colorata”.
Somma /* Non è proprio C… */main() { unsignedintoperando1, operando2, somma; operando1 = 10; operando2 = 15; somma = operando1 + operando2; printf (somma); } • Le keyword (parole chiave)predefinite: • if, while, else, unsigned, int, … Il vocabolario del C • I comandi definiti usando il linguaggio stesso: • printf(), scanf(), … Funzioni di libreria • operando1, operando2, …
Area cerchio /* non è proprio C… */main() { constfloat PI = 3.1415f; float raggio, area; scanf (raggio); area = raggio * raggio * PI; printf (area); } .
Esempi in C: tipi semplici Variabili, costanti, tipi semplici, specificatori di formato,cast implicito.
Il mio primo programma! #include <stdio.h> /* Il mio primo programma in C!!! */ void main() { printf ("Hello world!!!"); printf ("Ovvero: ciao mondo!!!"); } La printf() è una “funzione di libreria” #include specifica dove andare a cercarela definizione void main() lo vedremo più avanti…
x Area cerchio e quadrato #include <stdio.h> voidmain() { constfloatPI = 3.1415f; float x, area; scanf ("%f", &x); area = x * x * PI; printf ("Area cerchio: %f", area); x = 2 * x; /* cambia “significato” */ area = x * x; printf ("Area quadrato: %f", area); } .
Cast implicito #include <stdio.h> voidmain() { intx = 3, y = 4; float k = 4.0, z, w; z = x / k; /* z: 0.75 */ w = 75.0 / z; /* w: 100 */ printf ("%f", w); z = x / y; /* z: 0 */ w = 75.0 / z; /* Divisione per zero */ printf ("%f", w); } .
Alcuni specificatori di formato • Per la scanf() e la printf(): • "%u" indica un unsigned int • "%lu" indica un unsigned long int • "%d" indica un int • "%ld" indica un long int • "%c" indica un char • "%f" indica un float.
Minuscolo maiuscolo #include <stdio.h> voidmain() { char carattere; printf ("Inserisci un carattere minuscolo: "); scanf ("%c", &carattere); carattere = carattere - 32; printf ("Carattere maiuscolo: %c\n", carattere); } .