Corso di Fondamenti di Programmazione canale E-O

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

Introduzione al linguaggio C++
INFORMATICA Altre Istruzioni di I/O
LINGUAGGIO DI PROGRAMMAZIONE C
INFORMATICA Algoritmi fondamentali
Uso avanzato di C.
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
Introduzione al linguaggio C
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Stringhe di caratteri In linguaggio C.
Introduzione alla programmazione A. Ferrari. Il linguaggio C Nel 1972 Dennis Ritchie nei Bell Laboratories progettò il linguaggio C Il linguaggio possiede.
Selezione - approfondimento
I DATI I PRINCIPALI TIPI DI DATO UTILIZZATI IN PROGRAMMAZIONE
Introduzione al linguaggio C
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
Puntatori e Heap in C Prof.Ing.S.Cavalieri.
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
FUNZIONI DI BIBLIOTECA
Caratteri e stringhe di caratteri
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Algoritmi Politecnico di Milano C Primi programmi Politecnico di Milano.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 7 (5 novembre 2008) Programmazione in Java: lessico, variabili, tipi primitivi, assegnamento a variabile.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Variabili e tipi primitivi Anno Accademico 2009/2010.
Introduzione agli stream e alle classi
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
8) Classi numeriche e operatori Lab. Calc. I AA2002/03 - cap.82 Classi numeriche Esempi di classi numeriche: int, numeri interi che occupano una parola.
Lab. Calc. AA 2005/061 Classi. Lab. Calc. AA 2005/062 C e C++ Fino a questo punto abbiamo introdotto gli elementi base di qualsiasi linguaggio di programmazione,
A.A. 2010/2011Ambienti di Programmazione per il Software di Base1 (Es. – 6) Ambienti di Programmazione per il Software di Base Le Stringhe in C Input.
Struct, enum, Puntatori e Array dinamici
Strutture di controllo nel C
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
File di testo, file binari
Dichiarazioni e tipi predefiniti nel linguaggio C
Fondamenti di Informatica A - Massimo Bertozzi TIPI DI DATO IN C++ What's in a name? That which we call a rose By any other name would smell as sweet.
I File.
Il Linguaggio C.
Espressioni condizionali
Java base I: Sintassi e tipi di dati
PUNTATORI Un puntatore è una variabile destinata a contenere lindirizzo di unaltra variabile Vincolo di tipo: un puntatore a T può contenere solo lindirizzo.
Equazione di secondo grado.
CODIFICA Da flow-chart a C++.
In molti casi è utile assegnare a degli identificatori dei valori che restino costanti durante tutto il programma e che non possano essere cambiati nemmeno.
Tipi di dati elementari
void binario(int n); …………………
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Tipi di dati semplici in C (1/3)
1 Numeri interi e numeri in virgola mobile F. Bombi 2 6 novembre 2003.
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
Vettori, indirizzi e puntatori Finora abbiamo usato gli indirizzi nel chiamare  la funzione scanf()  le altre funzioni per riferimento Tuttavia la vera.
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
Arduino: introduzione alla programmazione
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
Programmazione in Java
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Il linguaggio C Notate che ....
Informatica 6 Tipi di dato. Nelle celle di memoria di un calcolatore ci sono solo “0” e “1”, fisicamente realizzati tramite due diversi livelli di tensione.
STRUTTURA DI UN PROGRAMMA C In prima battuta, la struttura di un programma C è definita dalla seguente produzione: ::= { }
Laboratorio di Linguaggi... altre D O M A N D E ! Marco Tarini Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (III)
Il C `e un linguaggio di programmazione di uso generale, originariamente sviluppato per la scrittura del sistema operativo Unix, ed oggi disponibile su.
Lezione 2 : Basi del linguaggio Variabili. Come visto nella lezione 1 le classi registrano il proprio stato nelle variabili  int cadenza = 0;  int velocita.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Esercizi sui dati strutturati 13 Tipi di dati strutturati.
Appunti su formati numerici. Tipi numerici Il C dispone di due tipi numerici: tipi interi e tipi reali; I tipi reali sono anche detti floating, ovvero.
Introduzione al linguaggio C
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

Corso di Fondamenti di Programmazione canale E-O Tiziana Calamoneri Le variabili in C KP Cap. 3, pp. 95-129 Cap. 5, pp. 190-193 DD Cap. 9, pp.352-355

Tipi di dato Abbiamo già parlato delle variabili, ed abbiamo fin ora usato il tipo int, ma abbiamo molte altre possibiltà… I tipi di cui parleremo sono: char int (short, long, unsigned) float double (long) Ricordiamo che queste parole chiave NON possono essere usate come nomi di variabili.

Tipo char Una variabile di tipo char occupa 1 byte in memoria. In C, i caratteri sono sempre delimitati da ‘ ‘ (ad es.’a’) Esempio: #define LETTERA ‘a’ In realtà, in C, i caratteri sono interi, poiché si memorizzano tramite la loro codifica (ASCII o EBCDIC). N.B. Non c’è relazione tra il valore di un char ed il carattere corrispondente (il valore del carattere ‘2’ NON è 2 ma 50!) Alcuni caratteri non stampabili richiedono una sequenza di escape (ad es. tab=\t). Tali sequenze occupano comunque un solo carattere. Le funzioni di I/O (ad es. scanf() e printf()) gestiscono i caratteri tramite %c

Un esempio Problema: dato in input un carattere, se esso è una lettera minuscola, trasformarla in maiuscola. N.B. i caratteri sono ordinati secondo il loro codici, quindi possono essere trattati come degli interi (confrontati e addi- zionati). #include<stdio.h> int main(void) { char c; scanf("%c", &c); if (c>='a' && c<='z') printf("%c", c+'A'-'a'); else putchar(c); return 0; } ‘A’-’a’ …abc…xyzABC…XYZ…

isdigit(c) in <ctype.h> Un altro esempio Problema: dato in input un carattere, se esso rappresenta una cifra, trasformarla nel suo equivalente numerico. #include<stdio.h> int main(void) { char c; int n; scanf("%c", &c); if (c>='0' && c<='9') { n=c-'0'; printf("%d", n); } else printf(“il carattere inserito non è una cifra”);; return 0; } ‘6’-’0’ isdigit(c) in <ctype.h> …’0’ ‘1’…..’6’…’9’ … 48 49 54 57 L’intestazione standard <ctype.h> definisce un gruppo di funzioni che forniscono test e conversioni legate al set dei caratteri. Ad es. tolower(c) restituisce la minuscola se c è maiuscola.

Tipo int (1) Una variabile di tipo int occupa di solito 2 o 4 bytes in memoria. Questo significa che non è possibile rappresentare tutti gli interi ma solo un numero finito di essi. Quindi: attenzione all’overflow! Se si ha bisogno di valori grandi si può usare long (4 byte). Il valore di LONG_MAX e LONG_MIN non è sempre uguale, ma varia da macchina a macchina ed è in limits.h Se la quantità di memoria usata è critica e non si usano interi grandi si può usare short (2 byte) Se i valori necessari sono solo non negativi, si può usare unsigned, che permette di memorizzare lo stesso numero di interi, ma tutti non negativi. Il valore di ULONG_MAX è in limits.h

Tipo int (2) DD p. 352 Le funzioni di I/O gestiscono gli interi tramite %d, %u, %o, %x, %h, %l. Vediamoli uno ad uno: %d intero decimale con segno; solo il - viene visualizzato, il + è sottinteso (es. -35, 24, 0, …) %u intero decimale senza segno; se un intero negativo viene letto con %u la lettura risulta errata! (es. -465 diventa 4294966841) %o %x interi senza segno ottali (cifre da 0 a 7; es. 256=2x82+5x81+6x80) o esadecimali (cifre da 0 a 9 e lettere da a ad f; es.1c7=1x162+12x161+7x160) %h %l posti davanti ad uno degli indicatori precedenti indicano rispettivamente short e long; sono detti modificatori di lunghezza

Tipi reali (1) C’è una grossa differenza tra reali “matematici” e reali “digitali”: i primi sono continui, gli altri discreti. Anche qui: attenzione all’overflow! Per memorizzare un intero come reale bisogna scriverlo con il . (ad es. 2.0) I reali possono scriversi con il punto decimale o tramite notazione esponenziale che, quando non c’è, è sottintesa (ad es. 1.342e3 vale 1342.3, mentre 3.14 è come se fosse 3.14e0) In C sono previsti 3 tipi reali: float, double e long double float numero in virgola mobile, precisione singola double numero in virgola mobile, precisione doppia long double numero in virgola mobile, precisione multipla ATTENZIONE: anche qui, il num. dei byte usati dipende dalla macchina, quindi le dimensioni distinte potrebbero essere 1, 2 o 3.

Tipi reali (2) Le funzioni di I/O gestiscono i reali tramite %e, %f, %L. %e visualizza in forma esponenziale (es. 1,502876e+02=1,502876 x 102=150,2876) %f visualizza con la virgola (es. 345,872000); visualizza sempre almeno una cifra a sx della virgola N.B. i valori visualizzati tramite %e ed %f sono visualizzati di default con 6 cifre di precisione. %L posto davanti ad uno degli indicatori precedenti indica long double

Costanti Abbiamo detto che le costanti si definiscono tramite una direttiva del preprocessore. Esse non vengono definite con un tipo, che deve essere ricavato dal processore. La costante 1234 è un int Una costante long si scrive con una L finale: 123456789L Le costanti in virgola mobile si scrivono con il punto decimale (123.45) oppure in forma esponenziale (1e-2) ed il loro tipo è double I suffissi F ed L indicano i tipi float e long double Una costante carattere è un intero, scritto come carattere tra apici. Quindi le costanti carattere possono prendere parte alle operazioni numeriche anche se si usano di solito in confronto ad altri caratteri N.B. attenzione alla differenza tra 0 e ‘0’!!

Esercizi 10 (tipi interi e reali) scrivere un programma C che stampi i numeri +875 e -875 con tutti gli indicatori di conversione disponibili scrivere un programma C che stampi i numeri +1234567.89 e -1234567.89 con tutti gli indicatori di conversione disponibili scrivere un programma C che determini la gamma di valori possibili dei tipi short, int, long, con e senza segno, per calcolo diretto o visualizzando valori appropriati dalle intestazioni standard.

sizeof Il C fornisce l’operatore unario sizeof per determinare il numero di byte usati per memorizzare un oggetto. Esempio. sizeof(oggetto) dove oggetto può essere un tipo (come int o float), una variabile (come x) o un’espressione (come a+b). N.B. i risulati di sizeof possono variare da una macchina all’altra, ma è sempre vero che: sizeof(char)=1 sizeof(char)≤sizeof(short)≤sizeof(int)≤sizeof(long) sizeof(float)≤sizeof(double)≤sizeof(long double)

Esercizi 11 (tipi di var., sizeof) Stampare una variabile char come carattere e come intero Provare ad eseguire operazioni tra interi e memorizzare il risultato in un int ed in un float, e poi stampare entrambi Provare a memorizzare in un int un numero troppo grande Stampare il numero di byte usati da tutti i tipi descritti

Conversioni implicite (1) p. 115 Ogni espressione aritmetica, come x+y, ha un valore ed un tipo. Se sia x che y sono int, x+y è un int, ma se x ed y sono short, x+y è comunque un int, e non short, perché nelle espressioni i valori short vengono convertiti in int. In generale, se un’espressione coinvolge tipi diversi, i tipi inferiori vengono promossi ai tipi superiori. Ad esempio, se x è int e y è float, x+y sarà float. Questa operazione si chiama conversione implicita o automatica.

Conversioni implicite (2) In genere, le uniche conversioni automatiche sono quelle che consentono ad un tipo di ampliare il proprio campo di variabilità senza perdita di informazione (ad es. da int a float) Espressioni prive di senso, come reali usati come indici, provocano un errore Espressioni che potrebbero causare perdita di informazione (come assegnare un numero in virgola mobile ad un intero) NON SONO ILLEGALI, quindi ATTENZIONE!! Gli assegnamenti implicano conversioni: il valore del membro destro è convertito nel tipo del membro sinistro prima di essere copiato.

Cast (1) Oltre alle conversioni implicite, che avvengono durante gli assegnamenti o nelle espressioni miste, sono possibili anche conversioni esplicite o forzate (cast). Esempio. Se x è intero, allora (double)x; converte il suo valore in double, ma la variabile x NON viene modificata. Quindi il cast si può usare nelle espressioni. Esempi. se i è un intero: f=(float)(i+1); /* i+1 sarebbe un int */ d=(double)i/3; /* i/3 sarebbe un float */ L’operatore unario cast ha la stessa priorità degli altri operatori unari (ad es. segno).

Cast (2) Attenzione: il casting modifica il valore della variabile ma il contenuto non viene modificato! #include<stdio.h> #include<math.h> int main() { int i=4; float a=4.0; printf("radice di interi=%d\n", sqrt(i)); printf("radice di reali=%f\n", sqrt(a)); return 0; } Ci sono funzioni di libreria (come sqrt) che hanno dei parametri di un certo tipo (double), e non producono cose sensate se l’argomento che si passa è di un altro tipo. Output: radice di interi=1073741824 radice di reali=2.000000

Visibilità delle variabili(1) REGOLA BASE: le variabili sono accessibili solo all’interno del blocco nel quale sono dichiarati: al di fuori sono sconosciute. Esempio: … { int a=2; printf(“%d”,a); { int a=5; printf(“%d”,a++); } printf(“%d”,a); … Per evitare confusione, meglio non usare gli stessi identificatori: … { int a=2; printf(“%d”,a); { int b=5; printf(“%d”,b++); } printf(“%d”,a); … output: 2 5 2 N.B. La a più interna non sovrascrive l’altra!

Visibilità delle variabili (2) Le variabili definite in un blocco sono dette locali, quelle definite fuori qualunque blocco, all’inizio del programma, sono dette globali. Esempio: int i; int a; int main() { scanf(“%d”, &a); if (a==1) { i=1; while (i <=10) printf(“%d”, i); } else printf (“%d”, a); printf (“%d”, ++i); } Esempio: int a; int main() { scanf(“%d”, &a); if (a==1) { int i=1; while (i <=10) printf(“%d”, i); } else printf (“%d”, a); printf (“%d”, ++i); ??? } Le variabili globali sono visibili dappertutto, le locali solo all’interno del blocco nel quale sono definite.

Visibilità delle variabili (3) Due blocchi possono trovarsi uno dopo l’altro; in tal caso il secondo blocco non vede nulla di quello che accade nel primo, e viceversa. Le variabili esterne ai blocchi sono viste da entrambi. Esempio: … { int a; int b; … { int c; float a; … } … { int d; float b; … } } a e b sono visibili sia in 1 che in 2 c non è visibile in 2 blocco 1 a intera non è visibile perché è stata definita un’altra a d non è visibile in 1 blocco 2 b intera non è visibile perché è stata definita un’altra b

Visibilità delle variabili (4) E’ buon norma usare il più possibile variabili locali, posizionando la loro definizione in modo che la loro visibilità sia ristretta ai blocchi che le usano. Un programma con molte variabili globali non è un buon programma. Ad esempio, non c’è motivo che i contatori siano variabili globali. La globalità dovrebbe essere riservata solo a quelle variabili che ricorrono per tutto il programma. Le variabili globali dovrebbero essere poche.