Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

18
Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini

Transcript of Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Page 1: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Introduzione al C

Corso di Programmazione Grafica e Laboratorio

Daniele Marini

Page 2: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Il linguaggio C

• Strutture di alto livello

• Controllo a basso livello

• Programmi efficienti

• Può essere compilato su un'ampia gamma di computer e SO

Page 3: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Il linguaggio C - Intro

• Programma minimo– main() {}

• Ogni programma C deve contenereuna e una sola funzione main().

Page 4: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Struttura di un programma C• Comandi per il preprocessore

– #define, #include, #if, #endif, etc.

• Definizione di tipi– typedef, struct, etc...

• Prototipi di funzioni (dichiarazione)– int myFunc(int a, char b, float c);

• Variabili (globali)• Funzioni (implementazione)

– int myFunc(int a, char b, float c){ // implementazione }

• Main

Page 5: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Esempio (parte 1)

#define MY_CONST 50 // Pre-processor

#include <stdio.h> // Pre-processor

typedef int vecInt[3]; // type definition

// function declarations

void printVec(vecInt vec);

int nPrint(vecInt vec, int times);

Page 6: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Esempio (parte 2)

// function implementation

void printVec(vecInt vec)

{

printf(“%d,%d,%d”,vec[0],vec[1],vec[2]);

}

Page 7: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Esempio (parte 3)

int nPrint(vecInt vec, int times)

{

int i; // local var

for(i=0;i<times;i++)

{

printVec(vec); printf(“\n”);

}

return i+1;

}

Page 8: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Esempio (parte 4)

int main(int argc, char *argv[])

{

vecInt myVect;

int res;

myVec[0] = 1; myVec[1] = 8; myVec[2] = 4;

res = nPrint (myVec, 4);

return 0;

}

Page 9: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Struct

• Viene allocata una stringa, un intero, un float– MiaStrutt s //s variabile di tipo MiaStrutt

• Accesso ai campi– s.c = ‘D’; s.num1 = 26; s.num2 = 77.7

typedef struct MiaStruttura { char c; int num1; float num2; } MiaStrutt;

Page 10: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Union

• Viene allocata un float (il più “grande” dei tre)– MiaUn u //u variabile di tipo union

• Accesso ai campi come in struct

• In vari momenti posso utilizzare una delle tre “possibilità” (devo applicare il casting)

typedef union MiaUnion { char c; int num1; float num2; } MiaUn;

Page 11: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Casting

• “Forzatura” del tipo di una variabileint numint;

float numfl=6.34;

char let='A';

numint=(int)numflt; //assegna il valore 6 (parte intera)

numint=(int)let;//assegna il valore 65 (codice ASCII)

Page 12: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Puntatori - 1

• Un puntatore è una variabile che contiene l'indirizzo di memoria di un'altra variabile puntata

int z;int *p;int val=7; //mettiamo che l’indirizzo di memoria sia 6F0p = &val; //p ha valore 6F0z = *p; //z ha valore 7

• Utilizzati per– Gestione dinamica della memoria– Passaggio di parametri per indirizzo

Page 13: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Puntatori - 2

6F0 7

6F1 6F0

6F2 7

Indirizzo memoria

Valore

val

z

p

int z;

int *p;

int val=7;

p = &val;

z = *p;

Page 14: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Puntatori - 3

• Gestione dinamica della memoria

float *misure;

void allocaMisure(int numero){

misure = (float*)malloc(numero * sizeof(float));}

…allocaMisure(15);misure[10] = 3.14;

Page 15: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Puntatori - 4

• Passaggio di parametri per indirizzo

void cambia(int numero){

numero = 15;}void cambiaPtr(int *numero){

*numero = 5;}

int i=10;cambia(i); // i vale sempre 10; ho passato il VALORE della varcambiaPtr(&i); // i vale 5; ho passato l’INDIRIZZO di mem

Page 16: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Dichiarazioni e Header Files

• Separare implementazione e dichiarazioni in diversi files

// functions.h

void printVec(vecInt vec);int nPrint(vecInt vec,

int times);

#include <functions.h>

// implementation

#include <functions.h>

// call

Link

Header File

Page 17: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Compilazione e Link

• Compilazione– File .c compilati in file oggetto (.obj)– In generale un file .obj per ogni file .c

• Link– “Unisce” i file .obj più eventuale codice delle

librerie

Page 18: Introduzione al C Corso di Programmazione Grafica e Laboratorio Daniele Marini.

Bibliografia

• A. Kelley, I. Pohl, C Didattica e Programmazione, Addison-Wesley Italia, 1996.

• R. Sedgewick,

Algoritmi in C, Addison-Wesley Italia, 1993.

• http://alpha.science.unitn.it/~fiorella/guidac/indexc.html