Il linguaggio C Notate che ....

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

Corso di Fondamenti di Programmazione canale E-O
INFORMATICA Altre Istruzioni di I/O
LINGUAGGIO DI PROGRAMMAZIONE C
Introduzione al linguaggio C
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
PHP.
I DATI I PRINCIPALI TIPI DI DATO UTILIZZATI IN PROGRAMMAZIONE
1 Semantica Operazionale di un frammento di Java: lo stato.
Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A CDL in Ingegneria Meccanica - A.A Tipi di dati Ing. Simona Colucci.
Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Tipi di dati Ing. Simona Colucci.
Introduzione al linguaggio C
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
Programmazione Procedurale in Linguaggio C++
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Funzioni definite dall’utente
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
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.
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
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.
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
Struct, enum, Puntatori e Array dinamici
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
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.
Le funzioni.
Espressioni condizionali
Java base I: Sintassi e tipi di dati
Programmazione in Java
Programmazione in Java Claudia Raibulet
CODIFICA Da flow-chart a C++.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Tipi di dati elementari
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Unità Didattica 3 Linguaggio C
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Unità Didattica 1 Linguaggio C
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
1 Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 11 e 12 -
JAVA Per iniziare. Verificare installazione javac –version java –version Cercare i files e sistemare eventualmente il path.
CORSO DI PROGRAMMAZIONE II Lezione 22
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Introduzione a Javascript
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
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Programmazione in Java
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Operatori di incremento e decremento
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.
Il linguaggio C Puntatori e dintorni.
Il linguaggio C Un primo programma C : un primo programma (2) /* Programma che calcola il massimo fra tre numeri inseriti da tastiera */ #include #define.
1 Laboratorio di Programmazione di Sistema - C Susanna Pelagatti Ricevimento: Me ,
Copyright © Istituto Italiano Edizioni Atlas
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (III)
Cloud informatica V anno. Introduzione a PHP Lo scripting PHP PHP è un linguaggio di scripting lato server. Le caratteristiche di un linguaggio di scripting.
Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 9 e 10 - Segmenti.
Lezione 9 e 10 - Segmenti di memoria e puntatori - Aritmetica dei puntatori - Formattazione dei dati - Significato ed impiego del cast - Tipi di dato strutturato.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Transcript della presentazione:

Il linguaggio C Notate che ...

Il C è un linguaggio a blocchi int main (void) { } blocco

Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi ! int main (void) { } Dichiarazione di variabili locali Comandi

Variabili non inizializzate Le variabili non inizializzate non producono nessun errore!!!! int main (void) { /* ed esempio …. */ int min, max, out; min = max * out; … } Controllate sempre di aver inizializzato le variabili prima del loro uso!

E se non me lo esegue? Se avete cercato di eseguire a.out e non ci riuscite: $$ a.out

E se non me lo esegue?(2) Se avete cercato di eseguire un file eseguibile e non ci siete riusciti: $$ a.out bash:command not found Significa che la variabile di ambiente PATH non contiene la directory corrente quindi usate il path completo $$ ./a.out

E se non me lo esegue?(3) Se avete cercato di eseguire un file eseguibile e non ci siete riusciti: $$ a.out bash:command not found Per settare il PATH bash $$ export PATH=$PATH:. csh e tcsh $$ setenv PATH=${PATH}:.

Informazioni sulle funzioni di libreria Usare la sezione 3 dei manuali in linea, es: $$ man 3 printf

Informazioni sulle funzioni di libreria (2) NAME printf SYNOPSIS #include <stdio.h> int printf(const char* format,…); DESCRIPTION …… cosa fa EXAMPLES …… esempi di uso SEE ALSO … … altre funzioni simili

Le FAQ www.di.unipi.it/~susanna/LPS/FAQ.htm Alla pagina Trovate le domande e risposte più comuni

Tipi di dato, costanti, operatori (parte1) Il linguaggio C Tipi di dato, costanti, operatori (parte1)

I tipi di dato primitivi Interi : short, int, long, 2,4,8,16 byte (dipende dalla implementazione) segnaposto %d rappresentazione decimale %x,%o rappresentazione esadecimale o ottale costanti intere : 1, -2, 4565 La funzione predefinita sizeof() fornisce la lunghezza in byte di un qualsiasi tipo o variabile C es. sizeof(int)

I tipi di dato primitivi (2) Caratteri : char, 1 byte, cod. ASCII, segnaposto %c costanti carattere : `a`, `b`, `c` i caratteri sono visti da C come interi un po’ speciali : è possibile operare sui caratteri con le normali operazioni su interi es: char c = `a`; c++; putchar(c); /* ???? */

I tipi di dato primitivi (3) Reali : float, double, long double 4,8,16 byte, rappresentazione in virgola mobile segnaposto : stampa (es. printf()) %f, %lf lettura (es. scanf()) %f (float) , %lf (double), %Lf (long double),

I tipi di dato primitivi (4) Libreria matematica (libm) fornisce tutte le più comuni operazioni matematiche per operare sui reali es. sqrt() per utilizzarla includere il file #include <math.h> compilare con gcc … … … -lm effettua il link esplicito della libreria

I tipi di dato primitivi (5) Non esistono i tipi byte e bool !!! Le stringhe sono rappresentate come array di caratteri. signed/unsigned modificatore per i tipi interi e caratteri permette di scegliere fra la rappresentazione di soli interi positivi (es 0-255 su un byte) o quella in complemento a due (es -128,+127) es. unsigned int, signed char

I tipi di dato primitivi (6) limits.h contiene macro che definiscono i massimi ed i minimi numeri rappresentabili per tutti i tipi es. INT_MIN, INT_MAX per utilizzarli includere il file limits.h

I tipi di dato primitivi (7) Conversioni fra tipi diversi : sono automatiche in C posso scrivere espressioni con operandi di tipo diverso int a=0; float b, r=3.1; b = a + r; di solito viene convertito tutto nel tipo più accurato, le regole p.115 nel testo KP conversioni esplicite r =(float) a / b

Il linguaggio C Funzioni

Funzioni C Le funzioni C sono l’unico modo per strutturare i programmi e non si possono annidare Non esistono le procedure Non esistono i metodi Dichiarazione di funzioni : descrive il prototipo della funzione ovvero: nome della funzione, il tipo del valore restituito ed il tipo di tutti gli argomenti utilizzati

Funzioni C (2) Dichiarazione di funzioni : es: prototipo della funzione di somma di due interi int somma (int, int); oppure int somma (int x, int y); x, y sono inutili, ma vengono convenzionalmente specificati per documentazione

Funzioni C (3) Definizione di funzioni : la definizione di una funzione è divisa fra : una intestazione (head) che fornisce il prototipo della funzione a i nomi per i parametri formali, ed un corpo (body) che specifica le azioni da compiere es: int somma (int x, int y) { return (x + y); } intestazione

Funzioni C (4) Definizione di funzioni : la definizione di una funzione è divisa fra una intestazione (head) che fornisce il prototipo della funzione a i nomi per i parametri formali, ed un corpo (body) che specifica le azioni da compiere es: int somma (int x, int y) { return (x + y); } corpo

Funzioni C (5) La dichiarazione o la definizione di una funzione deve sempre precedere il suo uso! Vedimo la tipica struttura di un programma C (unico file):

Funzioni C (5.1) /* direttive al preprocessore */ #include … #define … /* dichiarazioni di varibili globali*/ int k; /* dichiarazione di funzioni (prototipi)*/ int somma (int x, int y); int main (…) {… somma(4,5); … } /* definizione di funzioni */ int somma (int x, int y) {….}

Esempio di funzione #include <stdio.h> int max (int a, int b); int main (void){ printf(“Il massimo è %d \n”, max(10,2)); return 0; } int max (int a, int b) { int tmp; tmp = (a < b)? b : a return tmp;

Funzioni C (6) Tutti i parametri sono passati per valore una copia viene messa sullo stack all’atto della chiamata la copia viene rimossa qundo la funzione termina e non è più accessibile Scope delle variabili: Il corpo di una funzione contiene le variabili locali sono allocate sullo stack, sono accessibili solo a quella funzione perdono il valore fra un’invocazione e l’altra

Esempio di funzione (.1) #include <stdio.h> int max (int a, int b); int main (void){ printf(“Il massimo è %d \n”, max(10,2)); return 0; } int max (int a, int b) { int tmp; tmp = (a < b)? b : a return tmp; /* definizione */ Parametri attuali copiati sullo stack

Esempio di funzione (.2) #include <stdio.h> int max (int a, int b); int main (void){ printf(“Il massimo è %d \n”, max(10,2)); return 0; } int max (int a, int b) { int tmp; tmp = (a < b)? b : a return tmp; /* definizione */ Variabili locali sullo stack

Esempio di funzione: il frame (.3) printf(“Il massimo è %d \n”, max(10,2)); XX: return 0; } int max (int a, int b) { int tmp; tmp = (a < b)? b : a return tmp; stack stack

Esempio di funzione: il frame (.4) printf(“Il massimo è %d \n”, max(10,2)); XX: return 0; } int max (int a, int b) { int tmp; tmp = (a < b)? b : a return tmp; stack stack 2 10 XX

Esempio di funzione: il frame (.5) printf(“Il massimo è %d \n”, max(10,2)); XX: return 0; } int max (int a, int b) { int tmp; tmp = (a < b)? b : a return tmp; stack stack 2 10 XX &tmp 676186815

Esempio di funzione: il frame (.6) printf(“Il massimo è %d \n”, max(10,2)); XX: return 0; } int max (int a, int b) { int tmp; tmp = (a < b)? b : a return tmp; stack stack 2 10 XX &tmp 10

Esempio di funzione: il frame (.7) printf(“Il massimo è %d \n”, max(10,2)); XX: return 0; } int max (int a, int b) { int tmp; tmp = (a < b)? b : a return tmp; stack stack

Funzioni C (7) Scope delle variabili (cont.) : Le variabili globali sono variabili dichiarate al di fuori delle funzioni sono accessibili all’interno di tutte le funzioni sono allocate nell’area dati e vengono deallocate solo alla terminazione del programma Le globali sono sconsigliate a meno di casi motivati! Devono essere sempre adeguatamente documentate

Esempio di funzione #2 /* un esempio di var globale */ #include <stdio.h> int max (int a, int b); int k = 0; /* var globale */ int main (void){ printf(“Il massimo è %d \n”, max(10,2)); printf(“Il valore di k è %d \n”, k); return 0; } int max (int a, int b) { k = k + 1; /* side effect */ return (a < b)? b : a ;

Esempio di funzione #2 (.1) Risultato esecuzione > max Il massimo è 10 Il valore di k è 1

Funzioni C (8) Scope delle variabili (cont.) : Le variabili statiche locali (static) sono accessibili all’interno della funzione che le dichiara mantengono il valore fra una invocazione e l’altra

Esempio di funzione #3 /* un esempio di var statica */ #include <stdio.h> int max (int a, int b); int main (void){ printf(“Il massimo è %d \n”, max(10,2)); /*k non è più accessibile fuori da max*/ return 0; } int max (int a, int b) { static int k = 0; k++; printf(“Il valore di k è %d \n”, k); return (a < b)? b : a ;

Esempio di funzione #3 (.1) Risultato esecuzione (lo stesso di prima) > max Il valore di k è 1 Il massimo è 10

Funzioni C: commenti La nostra convenzione per i commenti per dichiarazioni e definizioni usa le stesse categorie viste a Metodologie Programmazione, con sintassi un po’ diversa /* @description -- somma due interi @param x -- significato del parametro @require -- (opz) condizioni sui parametri es. x positivo) @return x -- descriz valore restituito (if any) @modify -- decrizione effetti su variabili globali, array etc*/

Funzioni C: commenti (esempio) /* @description -- somma due interi @param a -- intero @param b -- intero @return x -- la somma @modify -- incrementa k, globale*/ int max (int a, int b) { k = k + 1; return (a < b)? b : a ; }

Funzioni C: commenti (esempio) (.1) /* @description -- max di due interi @param a -- intero @param b -- intero @return x -- la somma @modify -- incrementa k, globale*/ int max (int a, int b) { extern int k; k = k + 1; return (a < b)? b : a ; }

Tipi di dato, costanti, operatori (parte2) Il linguaggio C Tipi di dato, costanti, operatori (parte2)

I valori booleani Rappresentazione dei valori booleani in C : non esiste il tipo bool! sono rappresentati con int 0 rappresenta FALSO, qualsiasi valore != 0 rappresenta VERO es. 456 viene interpretato come VERO es. if (4) printf(“VERO”); è un condizionale con condizione legale e sempre vera, che quindi stampa sempre VERO sullo schermo.

Gli operatori di confronto ==, !=, (uguale, diverso) definiti sui tipi base e sulle struct se usati con gli array confrontano solo il puntatore al primo elemento lo stesso vale con le stringhe <, <=, >, >= definiti sui tipi base (numerici) per le stringhe si usano funzioni di libreria (es. strcmp(), strncmp()) restituscono sempre un valore di tipo int

Gli operatori booleani && (and), || (or), ! (not) valore : 0 se sono falsi e 1 se sono veri restituscono un valore di tipo int operatori bit a bit : & (and), | (or), ^ (xor), << (lshift), >> (rshift), ~ (complemento) es. 1 << 3 // maschera con 1 in terza posizione a = a & ~ (1 << 3 ) // azzera il quarto bit di a

Es operatori bit-a-bit a = a & ~ (1 << 3 ) 1 7 6 5 4 3 2 1

Es operatori bit-a-bit (2) a = a & ~ (1 << 3 ) 1 1

Es operatori bit-a-bit (3) a = a & ~ (1 << 3 ) 1 1 1

Es operatori bit-a-bit (4) a = a & ~ (1 << 3 ) 1 1

Es operatori bit-a-bit (5) a = a & ~ (1 << 3 ) 1 1 1

Es operatori bit-a-bit (6) a = a & ~ (1 << 3 ) 1 1 1

Es operatori bit-a-bit (7) a = a & ~ (1 << 3 ) 1 1 1 1 1 1 Nuovo valore di a Abbiamo azzerato il bit 3

Selezionare l’n-esimo bit di un intero int bitn (int c, int n){ if (((1<<n) & c)!= 0) return 1; else return 0; } n 1 1 1 1 1 1<<n 1 1 (1<<n) & c

Stampare i K bit meno significativi di un intero void bitstampa (int c){ int i; for (i=0; i<K; i++) if (bitn(c,K-1-i)!= 0) printf(”1”); else printf(”0”); }

Gli array Aggregati di variabili dello stesso tipo : dichiarazione (array statici): int a[4]; gli indici partono da 0 non viene effettuato nessun controllo sugli indici nell’accesso : se cerco di accedere a a[15]il compilatore non dà errore ed in fase di esecuzione il risultato dipende dal contenuto della memoria adiacente ad a 1 2 3 posizione 1 3 7 8 valore a[1]

Le stringhe Sono array di caratteri terminati da ´\0´ dichiarazione : char parola[8]=“mango”; permette di memorizzare una qualsiasi parola di al più 7 caratteri (l’ottavo serve per il terminatore) è inizializzata con la parola “mango” string.h fornisce tutte le più comuni funzioni per manipolare stringhe

Le strutture (record) Aggregati di variabili di tipo diverso dichiarazione di una nuova struttura: struct studente { char nome[40]; char cognome[40]; double voto; } ; dichiarazione di variabili di tipo struttura : struct studente x; struct studente classe[140];

Le strutture (record) (2) Ridenominazione tipi : typedef tipo nome; es : typedef int Intero; Intero nome[40]; typedef char stringa40[41]; stringa40 nome;

Le strutture (record) (3) Ridenominazione tipi : typedef struct { char nome[40]; char cognome[40]; double voto; } studente ; così si può eliminare struct dalle dichiarazioni studente x; studente classe[140];

Le strutture (record) (4) Ridenominazione tipi : typedef struct studente { char nome[40]; char cognome[40]; double voto; } studente ; così si può eliminare struct dalle dichiarazioni studente x; studente classe[140]; Opzionale (serve per i tipi ricorsivi)

Le strutture (record) (5) Accesso ai campi : tramite l’operatore punto (.) es : studente x; studente classe[140]; classe[i].nome = x.nome;

I tipi enumerati Rappresentano insiemi finiti: giorni: lunedi, martedi, … mesi: gennaio, febbraio, … bool: true, false. Associano un identificatore (costante) ad ogni elemento dell’insieme Sono rappresentati con degli interi .. Ma il compilatore controlla che le funzioni siano chiamate con il tipo giusto (type checking)

I tipi enumerati (2) Esempio: enum giorni {lun,mar,mer,gio,ven,sab,dom}; enum giorni x; /* dichiarazione */ x = lun; … Si può evitare di ripetere enum con un typedef I valori interi assegnati partono da 0 : lun == 0,mar == 1,mer == 2,…

I tipi enumerati (3) Esempio: typedef enum {true = 1, false = 0} bool; bool trovato; /* dichiarazione */ trovato = false; … Si possono scegliere i valori interi assegnati ad ogni elemento

I tipi union Nei tipi union più valori di tipi diversi condividono la stessa zona di memoria noti anche come record con varianti Esempio: union numero { int intero; long double reale; struct complex complesso; }; solo uno dei tre viene memorizzato ogni volta

I tipi union (2) … in memoria ... union numero { int intero; /* 4 byte */ long double reale; /* 8 byte */ struct complex complesso; /* 16 byte */ }; union numero n; … in memoria ... &n 16 byte

I tipi union (3) union numero { int intero; /* 4 byte */ long double reale; /* 8 byte */ struct complex complesso; /* 16 byte */ }; union numero n; /* specifico come interpretare n */ n.intero = 5; 5 &n Parte significativa

I tipi union (4) Uso tipico: in una struct che contenga (oltre alla union) un campo ‘tipo del valore’ typedef enum {INT,REAL,COMPLEX} numtyp; struct numero { numtyp tipo; union {/* union anonima */ int intero; long double reale; struct complex complesso; } };

I tipi union (5) Uso tipico: (cont.) struct numero x ; … switch (x.tipo) { case INT : …. x.intero = ...; case REAL: …. X.reale = ...; case COMPLEX: …. X.complesso = ...; …..