La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Introduzione al C Lezione I.

Presentazioni simili


Presentazione sul tema: "Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Introduzione al C Lezione I."— Transcript della presentazione:

1 Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Introduzione al C Lezione I

2

3 Perché scriviamo programmi Abbiamo un problema da risolvere Dobbiamo progettare una soluzione: progettiamo un algoritmo Vogliamo far eseguire tale algoritmo dal nostro elaboratore: scriviamo un programma

4 Linguaggi macchina, assembley e di alto livello Linguaggi macchina : lingua naturale di un particolare computer, esso consiste di sequenze di numeri (1 o 0) e dipende dalla macchina Linguaggi assembly : abbreviazioni simili allinglese, per rappresentare le operazioni elementari del computer LOAD LOAD N ADD ADD X Linguaggi ad alto livello : singole istruzioni contenenti notazioni matematiche utilizzate comunemente x = n + 2;

5 Il linguaggio C Il C fu progettato ed implementato da Dennis Ritchie ed è un linguaggio imperativo ad alto livello, sviluppato nei laboratori della AT&T Bell Laboratories, adatto per lo sviluppo dei sistemi operativi. Benché implementato su un sistema operativo UNIX, questo linguaggio non fu scritto per un particolare sistema operativo ma può essere utilizzato sotto sistemi operativi diversi come UNIX, DOS, OS, POWER PC, ecc Sistema operativo? Linguaggio imperativo?

6 Sistema operativo è un programma di controllo che svolge operazioni fondamentali al funzionamento dellelaboratore risiede in una memoria interna permanente e interpreta i comandi di utente che richiedono diversi servizi (es. la visualizzazione, la stampa o la copiatura di un file, il raggruppamento logico dei file in una directory o l'esecuzione di un programma). si occupa di gestire tutte le periferiche del nostro pc, tutti i processi, e tutti i dati di input/output.

7 Paradigmi di programmazione Esistono diversi approcci alla programmazione, chiamati paradigmi di programmazione: Programmazione imperativa : un programma specifica le azioni che devono essere eseguite in sequenza per calcolare i risultati a partire dai dati in ingresso. Programmazione orientata agli oggetti : un programma modella una realtà di interesse come una collezione di oggetti software che cooperano

8 Programma Java Classe Principale Oggetto Software Oggetto Software Oggetto Software Oggetto Software

9 Il linguaggio C Versione standard del C: ANSI/ISO 9899

10 Le librerie in C moduli funzioniI programmi scritti in C consistono in moduli chiamati funzioni ; esiste una ricca collezione di funzioni già esistenti chiamata libreria standard del C. Obiettivo riusabilità del software: approccio di costruzione a blocchi per creare programmi; inutile ricostruire funzioni già esistenti, ma riusare ciò che già esiste fondendolo con ciò che viene costruito ex-novo. Obiettivo efficienza: utilizzare le funzioni della libreria ANSI potrà migliorare lefficienza del programma. Obiettivo portabilità: utilizzare le funzioni ANSI invece di scrivere le proprie versioni.

11 Il linguaggio C Il C è un tipico linguaggio di programmazione strutturata : scrittura di programmi chiari, dalla correttezza dimostrabile e semplici da modificare. Il linguaggio C permette di scrivere programmi molto compatti Il linguaggio C permette di accedere e gestire direttamente le risorse hardware dellelaboratore (in maniera indipendente dallarchitettura)

12 Lambiente C Editor Disk Fase 1 Programma creato con leditor Preprocessore Fase 2 Disk Il Preprocessore esegue il codice Compilatore Fase 3 Disk Compilatore crea il codice oggetto Linker Fase 4 Disk Collega il codice oggetto alle librerie Loader Memoria Primaria Fase 5 Carica in memoria il programma CPU Fase 6 Memoria Primaria Esegue una istruzione alla volta

13 Un semplice programma C /* Programma che stampa un saluto */ #include main() { printf(Hello World!\n); }

14 Un semplice programma C /* Programma che stampa un saluto */ #include main() { printf(Hello World!\n); } direttiva di compilazione Listruzione è chiamata direttiva di compilazione e serve ad includere informazioni relative a una libreria predefinita del C che contiene le funzioni di input/output.

15 Un semplice programma C /* Programma che stampa un saluto */ #include main() { printf(Hello World!\n); } main() La parola main() identifica il programma principale e rappresenta il punto di ingresso del programma allinizio della sua esecuzione

16 Un semplice programma C /* Programma che stampa un saluto */ #include main() { printf(Hello World!\n); } blocco Le parentesi graffe delimitano un blocco commenti Si possono specificare commenti racchiudendoli tra i simboli /* e */ Ogni Ogni istruzione è conclusa dal simbolo >

17 Un semplice programma C /* Programma che stampa un saluto */ #include main() { printf(Hello World!\n); } printf Per la stampa su video printf e tra apici la stringa costante \n Esistono sequenze nelle stringhe che indicano caratteri speciali: per esempio \n indica il carattere di new line che quando viene incontrato sposta il carattere successivo alla riga seguente

18 Caratteri speciali Tipo di opzioneDescrizione \nRitorno a capo \tTabulazione orizzontale \bTabulazione verticale \aTorna indietro di uno spazio \fSalto pagina

19 Variabili in C /* Programma per il calcolo del fattoriale */ #include main() { int n,fat; printf(Calcolo del fattoriale di:); scanf(%d,&n); fat = 1; while (n>1) { fat = fat * n; n = n-1; } printf(Risultato = %d\n,fat); }

20 Variabili in C /* Programma per il calcolo del fattoriale */ #include main() { int n,fat; printf(Calcolo del fattoriale di:); scanf(%d,&n); fat = 1; variabile Una variabile viene dichiarata scrivendo il tipo seguito dal nome della variabile. Una variabile può essere inizializzata allatto della sua dichiarazione (int a=1).

21 Tipi di dato elementari Tipi di dichiarazioneRappresentazione CharCarattere (es. 'à) IntNumero intero (es. 3) ShortNumero intero corto LongNumero intero lungo FloatNumero reale "corto" (es 14.4) DoubleNumero reale "lungo" In C non esiste il tipo boolean : Si usa la convenzione che lo zero rappresenta il valore falso e luno il valore vero (tutti i valori diversi da zero rappresentano il vero)

22 Input/Output /* Programma per il calcolo del fattoriale */ #include main() { int n,fat; printf(Calcolo del fattoriale di:); scanf(%d,&n); fat = 1; printf, scanf La lettura e la stampa di variabili richiede spesso la specifica del loro formato: le istruzioni printf, scanf hanno in genere più argomenti.

23 Argomenti di printf e scanf

24 Input/Output /* Programma per il calcolo del fattoriale */ #include main() { int n,fat; printf(Calcolo del fattoriale di:); scanf(%d,&n); fat = 1; ---- printf(Risultato = %d\n,fat); printf, scanf La lettura e la stampa di variabili richiede spesso la specifica del loro formato: le istruzioni printf, scanf hanno in genere più argomenti.

25 Argomenti di printf e scanf %Il primo è una stringa di caratteri (da stampare per la printf) nella quale ogni % indica il punto in cui vanno sostituiti, nellordine, gli argomenti che seguono; %Il carattere che segue il simbolo % indica il tipo dellargomento (d indica un valore intero); &Gli altri argomenti specificano le variabili di input/output (quelle di input sono precedute dal simbolo speciale & ).

26 Tipo di argomento da inserire Assegna alla variabile n largomento inserito Tipo di argomento da stampare Stampa nel punto indicato il valore contenuto dalla variabile fat

27 Argomenti di printf e scanf Sintassi da utilizzareDescrizione %dDati di tipo int %lf %l %f Dati di tipo double Dati di tipo long Dati di tipo float %cDati di tipo char %sDati di tipo stringhe

28 Assegnazione in C /* Programma per il calcolo del fattoriale */ #include main() { int n,fat; printf(Calcolo del fattoriale di:); scanf(%d,&n); fat = 1; = Listruzione di assegnazione si indica con il simbolo =

29 Blocchi in C while (n>1) { fat = fat * n; n = n-1; } printf(Risultato = %d\n,fat); } Unistruzione composta è delimitata da un blocco

30 Operatori ed espressioni in C Operazioni con gli int (interi) Descrizione delle operazioni * moltiplicazione4*5=20. Moltiplica i numeri inseriti + addizione2+10=12 Somma i numeri inseriti - sottrazione3-2=1 Sottrae i numeri inseriti / divisione5/4=1 Divide e il risultato è senza resto % divisione con modulo 10%7=3 Divide e come risultato abbiamo il resto

31 Operatori ed espressioni in C Operazioni con i double (reali) Descrizione delle operazioni * moltiplicazione4.5*2.0=9.0 Moltiplica i numeri inseriti + addizione =12.2 Somma i numeri inseriti - sottrazione =0.9 Sottrae i numeri inseriti / divisione3.0/2.0=1.5 Tipo di espressioneDescrizione x++Incremento della variabile x di 1 y--Decremento della variabile y di 1 a+=b e a*=b a=a+b e a=a*b

32 Operatori ed espressioni in C Operatori relazionaliDescrizione x == yTesta se il valore di x è uguale a y x > yTesta se x è maggiore di y x >= yTesta se x è maggiore uguale di y x < yTesta se x è minore di y x <= yTesta se x è minore uguale di y x != yTesta se x è diverso da y

33 Operatori ed espressioni in C Operatori logici Descrizione &&AND ||OR !NOT Operatore condizionale Descrizione ? : Vale se è vero altrimenti Es. (a>b)?a:b calcola il massimo tra a e b

34 Istruzioni di controllo condizionali ifIstruzione condizionale if if ( ) else Se è vera viene eseguito altrimenti verrà eseguito Es. if (a>b) printf(il maggiore è %d, a); else printf(il maggiore è %d, b);

35 Istruzioni di controllo condizionali switchIstruzione condizionale switch switch ( ) { case : [break;] …. default : ; } Se vale vera viene eseguito ; in tutti gli altri casi (caso di default) verrà eseguito. Per convenzione dopo listruzione che si vuole eseguire si usa il comando break per uscire dallistruzione condizionale.

36 Istruzioni di controllo condizionali Es. Vogliamo impostare il numero di giorni n di cui è fatto ogni mese: switch ( mese ) { case 2: n=28; break; case 4 : case 6: case 9 : case 11: n=30; break; default : n=31; }

37 Istruzioni di controllo iterative whileIstruzione while while ( ) oppure do while ( ) Fino a che è vera viene eseguito. Prima valuta espr e poi esegue istr Prima esegue istr poi valuta espr

38 Istruzioni di controllo iterative Es. Calcoliamo il fattoriale di un numero i: while ( i>1 ) { fat *= i; i--; } do { fat *= i; i--; } while ( i>1 );

39 Istruzioni di controllo iterative forIstruzione for for ( ; ; ) corrisponde a: while ( ) { ; } Es. for ( i=n; i>1; i-- ) fat *= i;

40 Costanti simboliche in C #define Si definiscono facendo uso della direttiva define che va messa nellintestazione del programma. Es. #define PIGRECO 3.14 #define N 100 #define TRUE 1 #define FALSE 0 main() { …. }

41 Esempio di programma C Lettura ed analisi del problema: deduzione dei dati di input Costruzione di un procedimento risolutivo: algoritmo Traduzione delle istruzioni dellalgoritmo in linguaggio C

42 Esempio di programma C Lettura ed analisi del problema: deduzione dei dati di input Scrivere un programma C che calcoli le quattro operazioni sui numeri interi. op Input: a op b, in cui a e b sono due interi e op è una delle quattro operazioni [+,-,*,/] Oss. La divisione sui numeri interi emette anche il resto

43 Esempio di programma C Costruzione di un procedimento risolutivo: algoritmo a,b op op = ? a+ba-ba*ba/b,a%b +-*/

44 Esempio di programma C Traduzione delle istruzioni dellalgoritmo in linguaggio C Un programma C consta di tre parti fondamentali: Intestazione : spazio dedicato agli include per includere librerie Dichiarazioni : funzioni, costanti, … Blocco principale : il main() in cui elencare le istruzioni

45 Esempio di programma C Traduzione delle istruzioni dellalgoritmo in linguaggio C /* Programma che calcola le quattro operazioni sui numeri interi */ #include main () { int a,b; char op; printf(Operazione su interi:); scanf(%d %c %d, &a,&op,&b); printf(Risultato:\t);

46 Esempio di programma C Traduzione delle istruzioni dellalgoritmo in linguaggio C /* Calcolo e stampa */ switch (op) { case +: printf(%d,a+b); break; case -: printf(%d,a-b); break; case *: printf(%d,a*b); break; case /: printf(%d con resto di %d,a/b,a%b); break; default: printf(Operatore sconosciuto); }

47 /* Programma che calcola le quattro operazioni sui numeri interi */ #include main () { int a,b; char op; printf(Operazione su interi:); scanf(%d %c %d, &a,&op,&b); printf(Risultato:\t); /* Calcolo e stampa */ switch (op) { case +: printf(%d,a+b); break; case -: printf(%d,a-b); break; case *: printf(%d,a*b); break; case /: printf(%d con resto di %d,a/b,a%b); break; default: printf(Operatore sconosciuto); }

48 Funzioni in C Una funzione è un blocco di istruzioni, che ha parametri in ingresso ( parametri formali ) e restituisce un risultato. (lista parametri) { … blocco istruzioni … return } Lista parametri: (,, …)

49 Funzioni in C Es. int Fatt(int n) { int ris; ris = 1; while (n>=1) { ris = ris*n; n--; } return ris; } int i,j,k; … i = Fatt(4); scanf(%d,&k); j = Fatt(K); Una funzione viene attivata mediante una chiamata nella quale vengono passati i parametri attuali che devono corrispondere in numero, ordine e tipo ai parametri formali.

50 Funzioni in C ATTENZIONE: non è possibile nidificare funzioni; int Fatt(int n) { int Fatt2(int n2) { non è possibile passare parametri per riferimento; int Fatt(int& n) { non esistono procedure (solo funzioni) Fatt(int n) {

51 Visibilità delle variabili Tutte le variabili sono visibili solo allinterno del blocco in cui sono dichiarate. Una variabile definita nellintestazione è visibile in tutto il file: variabile globale. Si può far riferimento anche a variabili (globali) definite in altri file tramite la parola chiave extern. /* file p1.c */ int i; /* file p2.c */ #include p1.c extern int i;

52 Puntatori Permettono la gestione di strutture dinamiche (create e distrutte sotto il controllo dellutente). Un puntatore è una variabile che contiene lindirizzo di memoria di unaltra variabile. Dichiarazione : in C un puntatore si dichiara anteponendo al nome di una variabile il simbolo *. int *i; char *c; float *n;

53 Operazioni sui Puntatori loperatore & applicato ad una variabile restituisce il puntatore ad essa; loperatore * applicato a un puntatore restituisce la variabile puntata int i,j; int *k,*l; … k = &i; /* k punta alla variabile i */ *l = j; /* nella variabile puntata da l va il contenuto di j */ *k = *l; /* nella variabile puntata da k va il contenuto della variabile puntata da l */ k = l; /* k e l puntano alla stessa variabile */

54 Operazioni sui Puntatori ki k = &i; l j *l = j; l k k = l; *k = *l; l k

55 Come ovviare ai limiti delle funzioni Procedure : le definiamo come funzioni che restituiscono il tipo void void PariDispari(int i) { if ((i%2) == 0) printf(%d è un numero pari,i); else printf(%d è un numero dispari,i); } Passaggi per riferimento: non passiamo la variabile da modificare ma il suo puntatore. void SommaProd(int i, int j, int *s, int *p) { *s = i+j; *p = i*j; }

56 Gestione della memoria Durante lesecuzione di un programma C la memoria viene gestita in due maniere. Gestione statica : viene allocata dal sistema operativo unarea di memoria fissa per tutta lesecuzione del programma. Gestione dinamica : vengono allocate due aree di memoria che vengono usate quando necessario e rese disponibili per succesivi usi: 1) lo stack : quando una funzione viene invocata vengono allocate automaticamente tutte le variabili locali e i parametri attuali sullo stack in un record di attivazione; successivamente, quando lesecuzione della funzione termina, il record di attivazione viene cancellato e lo stack viene riportato nella situazione in cui era prima dellinvocazione; 2) lo heap : la gestione viene lasciata al programmatore mediante creazione e distruzione dinamica di variabili (tramite puntatori).

57 … Gestito (dinamicamente) dallutente Gestito (dinamicamente) dallelaboratore

58 … … void Esempio (int x) { int y; } main() { float f = -12,3; Esempio(90); }

59 … … void Esempio (int x) { int y; } main() { float f = -12,3; Esempio(90); } -12,3

60 … … void Esempio (int x) { int y; } main() { float f = -12,3; Esempio(90); } -12,3 90

61 … lo scopriremo piu avanti

62 Ricorsione E possibile definire funzioni in C in maniera ricorsiva. int Fatt(int n) { if (n==0) return 1; else return (n*Fatt(n-1)); } … main() { int fat,n=0; … scanf(%d,&n); fat = Fatt(a); … } La ricorsione viene gestita attraverso luso opportuno dello stack: ogni chiamata della funzione ricorsiva genera un nuovo record di attivazione (con memorizzazione dei parametri attuali e allocazione di memoria delle variabili locali) che maschera la precedente invocazione.

63 Array Un array è una sequenza di elementi omogenei. Un array viene dichiarato in C scrivendo, nellordine, il tipo degli elementi, il nome dellarray, e le sue dimensioni. int c[12]; /*vettore*/

64 Array Un vettore è un gruppo di posizioni (o locazioni) di memoria correlate dal fatto che tutte hanno lo stesso nome e tipo di dato c[0] c[1] c[2] c[9] c[10] c[11] c[6] c[7] c[8] c[3] c[4] c[5] Numero di posizione dellelemento allinterno del vettore c Nome del puntatore (da notare che tutti gli elementi del puntatore hanno lo stesso nome, c)

65 Regole generali su gli Array Il primo elemento di ogni vettore è lelemento zero. Il numero di posizione contenuto allinterno delle parentesi quadre è detto indice. non cè controllo sullaccesso a elementi non esistenti c[0] c[1] c[2] c[9] c[10] c[11] c[6] c[7] c[8] c[3] c[4] c[5]

66 Dichiarazione e inizializzazione dei vettori I vettori occupano dello spazio in memoria. Il programmatore specificherà il tipo di ogni elemento e il numero di quelli richiesti da ognuno dei vettori, così che il computer possa riservare lappropriata quantità di memoria. [ dimensione ] Uso: [ indice ] Oss. E importante notare la differenza tra sesto elemento del vettore e lelemento sei del vettore c[5]; /* il sesto elemento */ c[6]; /* elemento sei del vettore */

67 Dichiarazione e inizializzazione dei vettori I vettori occupano dello spazio in memoria. Il programmatore specificherà il tipo di ogni elemento e il numero di quelli richiesti da ognuno dei vettori, così che il computer possa riservare lappropriata quantità di memoria. #define M 3 #define N 2... int c[M]; int l[N]; int vet[5] = {1, 2, 3, 4, 5}; float r[] = {1.4, 3.2, 5.4 } /* viene allocato un vettore di tre elementi */ È possibile inizializzare un array in fase di dichiarazione. In questo caso, per un vettore, la specifica delle dimensioni è opzionale.

68 Array come parametri di funzioni E possibile passare un array come parametro formale di una funzione. void leggiVettore(int a[MAX], int n); void scriviVettore(int a[MAX], int n); void copia(int a[], int b[], int n);

69 Programma sui vettori #include #define MAX 10 #define TRUE 1 #define FALSE 0 void leggiVettore(int a[MAX], int n) { int i; for (i = 0;i < n;i++) scanf("%d",&a[i]); } void scriviVettore(int a[MAX], int n) { int i; for (i = 0;i < n;i++) printf("%d\t",a[i]); printf("\n"); }

70 Programma sui vettori void copia(int a[], int b[], int n) { int i; for (i = 0; i < n; i++) a[i] = b[i]; } int cerca(int x, int a[MAX], int n) { int i=0, trovato=FALSE; while ((i < n) && (!trovato)) if (x == a[i]) trovato=TRUE; else i++; return trovato; }

71 Programma sui vettori main() { int n,x; int a[MAX],b[MAX]; printf("dim. vettore:"); scanf("%i", &n); leggiVettore(a,n); copia(b,a,n); scriviVettore(b,n); printf("el. da cercare:"); scanf("%i",&x); if (cerca(x,a,n)==TRUE) printf("trovato nel vettore\n"); else printf("non trovato\n"); }

72 Utilizzo degli Array Ordinamento di vettori : lordinamento dei dati è una delle applicazioni più importanti nel campo dellelaborazione; si richiede la sistemazione dei dati in un ordine particolare. 1) Insertion sort 2) Quick sort 3) Merge sort 4) Bubble sort Ricerca nei vettori : i programmatori lavoreranno spesso con grandi quantità di dati immagazzinati in vettori. A volte potrà essere necessario determinare se un vettore contenga un elemento che corrisponda a un dato valore chiave.

73 I vettori multidimensionali E possibile definire strutture dati complesse: array multimensionali, che si muovono su più indici. [ ] [ ] … [ ] int c[2][2]; int a[][] = { {1, 2}, {7, 12} }; a[0][0]a[0][1] a[1][0]a[1][1] Riga 0 Riga 1 Colonna 0Colonna 1

74 I puntatori sono il segreto della potenza e la flessibilita' del C, perchè: - sono l'unico modo per effettuare alcune operazioni; - servono a produrre codici sorgenti compatti ed efficienti, anche se a volte difficili da leggere. In compenso, la maggior parte degli errori che i programmatori commettono in linguaggio C sono legati ai puntatori. In C ogni variabile è caratterizzata da due valori: - un indirizzo della locazione di memoria in cui sta la variabile, - ed il valore contenuto in quella locazione di memoria, che è il valore della variabile. Un puntatore e' un tipo di dato, è una variabile che contiene l'indirizzo in memoria di un'altra variabile, cioè un numero che indica in quale cella di memoria comincia la variabile puntata. Linguaggio C: Puntatori

75 Dinamica dei puntatori int y=5; int *yPunt; 5 yPunt y 5 y Memoria

76 Dinamica dei puntatori int y=5; int *yPunt; yPunt = &y; 5 yPunt y yyPunt Memoria

77 Linguaggio C: Puntatori int a=2, y; int *pa; pa=&a;

78 Linguaggio C: Puntatori y=*pa; Assegna ad y il contenuto della locazione di memoria a cui punta pa *pa=4; Assegna alla cella di memoria a cui punta pa il valore 4

79 Linguaggio C: Puntatori int Value(int n) { return n*n*n; /* eleva al cubo la variabile locale n */ } void Reference(int *nP) { *nP = *nP * *nP * *nP; /* eleva al cubo la variabile puntata */ }

80 Linguaggio C: Puntatori int number = 5; printf(%d,Value(number)); 5 number int Value(int n) { return n*n*n; } indefinita n int number = 5; printf(%d,Value(number)); 5 number int Value(int n) { return n*n*n; } 5 n

81 Linguaggio C: Puntatori int number = 5; printf(%d,Value(number)); 5 number int Value(int n) { return n*n*n; } 5 n 125 int number = 5; printf(%d,Value(number)); 5 number int Value(int n) { return n*n*n; } indefinita n 125

82 Linguaggio C: Puntatori int number = 5; printf(%d,Value(number)); 5 number int Value(int n) { return n*n*n; } indefinita n Stampa 125

83 Linguaggio C: Puntatori int number = 5; Reference(&number); 5 number void Reference(int *nP) { *nP = *nP * *nP * *nP; } indefinita nP int number = 5; Reference(&number); 5 number void Reference(int *nP) { *nP = *nP * *nP * *nP; } nP

84 Linguaggio C: Puntatori int number = 5; Reference(&number); 125 number void Reference(int *nP) { *nP = *nP * *nP * *nP; } nP Number rimane con valore 125

85 Quando si usano i puntatori, è molto facile fare confusione fra oggetti puntati e i loro puntatori. Un puntatore è un indirizzo di memoria, mentre l'oggetto puntato è la zona di memoria che inizia con questo l'indirizzo, ed è grande quanto basta per contenere il tipo corrispondente. le variabili di tipo puntatore sono anche esse variabili, ossia zone di memoria. Ad esempio la differenza fra una variabile int e una variabile di tipo puntatore a intero è che la prima contiene un valore intero, mentre la seconda contiene un indirizzo, e in particolare l'indirizzo iniziale della zona di memoria associata a un intero. Quando un puntatore viene dichiarato non punta a nulla. Per poterlo utilizzare deve puntare a qualcosa. Es. int *p; *p=123; /*errore*/ Usare: int *p;int a; p=&a; *p=123; /*corretto*/ Puntatori: avvertenze

86 Aritmetica degli indirizzi Si possono fare operazioni aritmetiche intere con i puntatori, ottenendo come risultato di far avanzare o riportare indietro il puntatore nella memoria, cioè di farlo puntare ad una locazione di memoria diversa. Ovvero con i puntatori è possibile utilizzare due operatori aritmetici + e -, ed ovviamente anche ++ e --. Il risultato numerico di un'operazione aritmetica su un puntatore è diverso a seconda del tipo di puntatore, o meglio a seconda delle dimensioni del tipo di dato a cui il puntatore punta. il compilatore interpreta diversamente la stessa istruzione p++ a seconda del tipo di dato, in modo da ottenere il comportamento seguente: Sommare un'unità ad un puntatore significa spostare in avanti in memoria il puntatore di un numero di byte corrispondenti alle dimensioni del dato puntato dal puntatore.

87 Aritmetica degli indirizzi se p è un puntatore di tipo puntatore a char, char *p, poichè il char ha dimensione 1, l'istruzione p++ aumenta effettivamente di un'unita il valore del puntatore p, che punterà al successivo byte. Invece se p è un puntatore di tipo puntatore a short int, short int *p, poiché lo short int ha dimensione 2 byte, l'istruzione p++ aumenterà effettivamente di 2 il valore del puntatore p, che punterà allo short int successivo a quello attuale.

88 In definitiva, ogni volta che un puntatore viene incrementato passa a puntare alla variabile successiva che appartiene al suo tipo base, mentre un decremento lo fa puntare alla variabile precedente. Quindi incrementi e decrementi di puntatori a char fanno avanzare o indietreggiare i puntatori a passi di un byte, mentre incrementi e decrementi di puntatori a dati di dimensione K fanno avanzare o indietreggiare i puntatori a passi di K bytes. Aritmetica degli indirizzi

89 Esiste un legame forte tra array e puntatori dovuta al fatto che: · gli elementi di un array vengono allocati in locazioni contigue della memoria principale; · se si incrementa di uno un puntatore p a un tipo T, il valore di p viene incrementato di una quantità di byte pari alle dimensioni di T (aritmetica dei puntatori). Array e Puntatori Regole che legano gli array con i puntatori: · il nome di un array coincide con lindirizzo della prima componente del vettore; · il puntatore ad un elemento dellarray si ottiene incrementando di uno il puntatore allelemento precedente.

90 Array e Puntatori Quindi, avendo definito int a[5]; abbiamo che: a e &a[0] sono la stessa cosa, *a e a[0] sono la stessa cosa, *(a + 3) e a[3 ] sono la stessa cosa (a + 2) e &a[2] sono la stessa cosa.

91 Array e Puntatori Per i vettori (gli array monodimensionali di dati di tipo tipo) l'accesso ai dati avviene secondo queste modalità vet[k], perchè in C, il nome di un array è TRATTATO dal compilatore come un puntatore COSTANTE alla prima locazione di memoria dell'array stesso. A differenza dei vettori però, l'area di memoria a cui il puntatore punta non viene allocata staticamente ma può essere allocata dinamicamente mediante alcune funzioni che richiedono al sistema operativo di riservare memoria e restituire un indirizzo a quell'area di memoria allocata, oppure può non essere allocata affatto.

92 Array e Puntatori char st[10]; char *p; p = st; 3…12…0 st p Con questo assegnamento viene assegnato al puntatore p l'indirizzo della prima locazione di memoria del vettore. Da questo momento in avanti potremo accedere ai dati del vettore sia tramite str, sia tramite p esattamente negli stessi modi, - o tramite l'indicizzazione tra parentesi quadre, - o tramite l'aritmetica dei puntatori. str[10] *(str+10) p[10] *(p+10) sono tutti modi uguali per accedere alla 11-esima posizione del vettore str puntato anche da p.

93 Array e Puntatori char st[10]; char s = a; char *p; p = &s; st = p; 3…12…0 st p a s ERRORE: NON E POSSIBILE REINDIRIZZARE IL PUNTATORE DI UN ARRAY NO

94 I vettori multidimensionali

95 Strumenti per la compilazione Ambiente Linux: istallazione di una versione quale Mandrake o Red Hat; ci sono due ambienti di sviluppo per C. 1) Kdevelop : ambiente di sviluppo per KDE 2) Anjuta : ambiente di sviluppo per Gnome Ambiente Windows: esiste il borland cBuilder o il Devc, ambienti di sviluppo per linguaggi C/C++.

96 Pseudo-Codifica di Algoritmi Pseudo-codifica: strutturazione dellalgoritmo astratto, facente uso di alcune convenzioni proprie del linguaggio di programmazione 1) indentazione : rientro verso destra delle righe, utile per indicare la struttura a blocchi dello pseudocodice (per evitare luso di parentesi). 2) costrutti di chiusura : delimitare lalgoritmo con begin- end 3) costrutti di controllo : è possibile impiegare i costrutti di controllo if-then-else 4) costrutti iterativi : è possibile impiegare i costrutti iterativi while-do, for-to-do, repeat-until

97 Pseudo-Codifica di Algoritmi 5) assegnazioni : vengono indicate con il simbolo come ad esempio x 4 6) commenti : si usa a inizio riga il simbolo 7) utilizzo di procedure : si possono scrivere procedure da utilizzare nellalgoritmo (i parametri sono sempre passati per valore) 8) utilizzo di array : è possibile impiegare array 9) utilizzo di oggetti : è possibile impiegare oggetti (visti quindi come strutture complesse con attributi o campi)

98 Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Introduzione al C FINE


Scaricare ppt "Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Introduzione al C Lezione I."

Presentazioni simili


Annunci Google