powerpoint presentation - lezioni di c per fisicifontana/ · i parametri di una funzione vanno...

75
1 Lezioni di C per Fisici Dr. Andrea Fontana Telefono: 0382 507424 Email: [email protected] Ufficio P4, I piano, in fondo al corridoio dopo la segreteria INFN Corso di Informatica per la Fisica I Anno Accademico 2003/2004

Upload: others

Post on 25-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

1

Lezioni di C per FisiciDr. Andrea Fontana

Telefono: 0382 507424Email: [email protected] Ufficio P4, I piano, in fondo al corridoio dopo la segreteria INFN

Corso di Informatica per la Fisica IAnno Accademico 2003/2004

Page 2: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

2

Sito Web del Corsohttp://www.pv.infn.it/~fontana/CorsoC

Page 3: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

3

Libro consigliato

Brian W. KernighanDennis M. Ritchie

Linguaggio CSeconda edizione

Jackson Ed.

E’ un classico! Da avere se si programma in C...

Page 4: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

4

Programma del CorsoFondamenti

Dati, tipi e operatori

Strutture di controllo

Funzioni

Puntatori e vettori

Strutture

Input/Output

Esercizi dal KR

Page 5: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

5

Fondamenti

Programma piu’ bre ve possibile

Hello, World!

Stampa di caratteri e numeri

Semplici programmi introduttivi

Page 6: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

6

vuoto.c

int main(){

return 0;}

Page 7: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

7

Come compilare in C ?

Scrivere il programma con un editor,come nedit, ad esempio:nedit vuoto.c

Compilare con il compilatore gcc (o cc):gcc vuoto.c

Eseguire il programma (default a.out):a.out

Per dare al programma un altro nome:gcc –o vu oto vuoto.cvuoto

Page 8: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

8

linee.c

#include <stdio.h>

/* stampa di caratteri (stringhe) */

int main(){

printf("Ciao a tutti! ;-)\n");printf("Ri-ciao a tutti! \t ;-)\n");printf("\n E ancora ciao a tutti! ;-)\n");

return 0;}

Page 9: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

9

numeri.c (1/2)#include <stdio.h>

/* stampa di variabili numeriche */

int main(){

int i;float f;double d;char c;

i=6;f=6.3;d=5.4;c='A';…

Page 10: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

10

numeri.c (2/2)

…printf("Numero intero: %d\n",i);printf("Numero float: %f\n",f);printf("Numero double: %lf\n",d);printf("Carattere: %c\n",c);

printf("\nNumero float formattato: %5.3f\n",f);printf("Carattere: %d\n",c);

return 0;}

Page 11: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

11

formato.c

#include <stdio.h>int main(){int i;float f;double d;char c;i=6;f=6.3;d=5.4;c='A';printf("Numero intero: %d\n",i);printf("Numero float: %f\n",f);printf("Numero double: %lf\n",d);printf("Carattere: %c\n",c);printf("\nNumero float formattato: %5.3f\n",f);printf("Carattere: %d\n",c);return 0;}

Page 12: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

12

Dati

Modificatori di tipo

Casting

Operatori algebrici e logici

Operatori criptici

Page 13: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

13

modif.c (1/2)

#include <stdio.h>

/* modificatori di variabili numeriche */

int main(){

int i;short int si;long int li;unsigned int ui;float f;double d;long double ld;…

Page 14: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

14

modif.c (2/2)

…printf("i:\t%d\n",sizeof(i));printf("si:\t%d\n",sizeof(si));printf("li:\t%d\n",sizeof(li));printf("ui:\t%d\n",sizeof(ui));printf("f:\t%d\n",sizeof(f));printf("d:\t%d\n",sizeof(d));printf("ld:\t%d\n",sizeof(ld));

return 0;}

Page 15: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

15

cast.c (1/2)

#include <stdio.h>

/* conversione (cast) di variabili numeriche */

int main(){

double d=65.8;float f;long l;int i;short s;char c;…

Page 16: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

16

cast.c (2/2)…

printf("d: %lf\n",d);f=(float)d;printf("f: %f\n",f);l=(long)d;printf("l: %ld\n",l);i=(int)d;printf("i: %d\n",i);s=(short)d;printf("s: %d\n",s);c=(char)d;printf("c: %c\n",c);

f=(float)l;printf("\nf: %f\n",f);

return 0;}

Page 17: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

17

internal.c#include <stdio.h>#include <gsl/gsl_ieee_utils.h>

/* rappresentazione interna di variabili numeriche (GSL) */

int main(){

float f = 1./3.;double d = 1./3.;

printf("f ="); gsl_ieee_printf_float(&f);printf("\n");

printf("d ="); gsl_ieee_printf_double(&d);printf("\n");

return 0;}

Page 18: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

18

aritmetica.c#include <stdio.h>

main(){

int a, b, c;

a = 15; b = 7; c = a + b; c = a - b; c = a * b; c = a / b; c = a % b; c = 4*a - b/3 - a*b + 5*a*(a-b); c = (a-b)/3 - 2*b*b + a;

a = a + 1; b = b * c;

a = b = c = 16; a = b = c = a * b - c/4;

a = (b = (c = 20));

}

Page 19: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

19

logica.c (1/2)#include <stdio.h>

main(){

int x = 11, y = 11, z = 11; char a = 50, b = 50, c = 50; float r = 14.57, s = 14.57, t = 14.57;

if (x == y) z = -16; if (x > y) a = 'B'; if (!(x > z)) a = 'A'; if (b <= c) r = -1; if (r != s) t = b/2;

if (x = (r != s)) z = 999; if (x = y) z = 33; if (x != 0) z = -31; if (x) z = 45; …

Page 20: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

20

logica.c (2/2)…int x = 11, y = 11, z = 11; char a = 50, b = 50, c = 50; float r = 14.57, s = 14.57, t = 14.57;

x = y = z = 7; if ((x == y) && (x == 7)) z = 3; if ((x > y) || (z > 2)) z = 2; if (x && y && z) z = 1; if ((x = 1) && (y = 2) && (z = 3)) r = 12.05; if ((x == 2) && (y = 3) && (z = 4)) r = 14.7;

if (x == x) z = 27.56; if (z != z) x = 45; if (x = 0) z = 27.56;

}

Page 21: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

21

operatori.c (1/2)#include <stdio.h>

main(){

int x = 0, y = 2, z = 255; float a = 0.0, b = 3.141592, c = -7.55;

x = x + 1; x++; ++x; z = y++; /* z = 2, y = 3 */ z = ++y; /* z = 4, y = 4 */

y = y - 1; y--; --y; y = 3; z = y--; /* z = 3, y = 2 */ z = --y; /* z = 1, y = 1 */ …

Page 22: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

22

operatori.c (2/2)…a = a + 5; a += 5; a *= 3.2; a -= b; a /= 10.;

a = (b >= 3.0 ? 2.0 : 9.5);

if (b >= 3.0)

a = 2.0; else

a = 9.5;

c = (a > b ? a : b); c = (a < b ? b : a);

}

Page 23: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

23

Strutture di controllo

Cicli: while, do..while, for

Break e continue

If, elseif

Case

Goto e label

Page 24: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

24

while.c

#include <stdio.h>

main(){

int conta;conta=0;

while(conta<10){

printf( "Il valore di conta e' %d\n”, conta);

conta = conta+1;}

}

Page 25: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

25

do.c

#include <stdio.h>

main(){

int conta;conta=0;

do{ printf("Il valore di conta e' %d\n”, conta);

conta = conta+1;} while (conta<10);

}

Page 26: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

26

for.c

#include <stdio.h>

main(){

int num;

for(num=0;num<10;num=num+1){ if(num==2)

printf( "Il valore di num e' %d\n”, num); if(num<5) printf( "Il valore di num e' ora %d, che e'

minore di 5.\n”,num);

else printf( "Il valore di num e' ora %d, che e'

maggiore di 4.\n”,num);}

}

Page 27: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

27

Istruzioni condizionali

if(condizione)istruzioni;

if(condizione){

istruzioni;}else{

altre istruzioni;}

if(condizione){

istruzioni;}else if(condizione){

altre istruzioni;}else{

ancora istruzioni;}

Tre modi di utilizzare l’ istruzione if:

Page 28: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

28

break.c

#include <stdio.h>

main(){

int x; for (x = 4; x < 10; x = x + 1) { if (x == 8)

break; printf(“Break! Il valore di x e' %d\n“,x); }

for (x = 4; x < 10; x = x + 1) { if (x == 8)

continue; printf("Continue! Il valore di x e' %d\n“,x);

} }

Page 29: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

29

switch.c#include <stdio.h>

main(){

int scelta;for(scelta=4;scelta<14;scelta=scelta+1){

switch(scelta){

case 4: printf("Il valore e' quattro.\n”);break;case 5: printf( "Il valore e' cinque.\n”);break;case 6:case 7:case 8:case 9: printf( "Il valore e' tra sei e

nove.\n”);break;case 11: printf( "Il valore e' undici.\n”);break;default: printf( "Il valore non e'

predefinito!\n”);break;

}}

}

Page 30: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

30

goto.c

#include <stdio.h>

main(){

int a,b,c;

goto partenza_reale;

punto:printf(“Linea della falsa partenza.\n”);goto stop;

partenza_reale:for(a=0;a<4;a=a+1){

for(b=5;b>3;b=b-1)printf("a = %d \t b = %d\n”,a,b);

}goto punto;

stop:printf( "Questa e' la fine!\n”);

}

Page 31: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

31

Page 32: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

32

Funzioni

Fondamenti

Scope: variabili locali e globali

Ricorsione

Puntatori

Page 33: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

33

Funzioni in C

Quando e’ rich iesto l’ uso di una funzione?

Programmazione modulare:

suddivisione delle operazioni da svolgere in funzioni che agiscono come sottoprogrammi;

maggiore chiarezza nella comprensione di un codice sorgente;

possibilita’ di riutilizzare funzioni in altri programmi.

Page 34: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

34

quadcubo.c

#include <stdio.h>

int somma=0;

main(){

int num;

for(num=0;num<5;num++)printf(“%d\t %d\t %d\n”,num,num*num,num*num*num);

printf(“\n”);

int indice=0;

titolo();for(indice=0; indice<5; indice++)

quadrato(indice);cubo(indice);fine();

}

Page 35: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

35

funzioni.c

void titolo(){

printf("Questo e' il titolo del programma\n”);}

void quadrato(int variabile){

int quad;

quad = variabile*variabile;somma += quad;printf("Il quadrato di %d e' %d\n”,variabile,quad);

}

Page 36: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

36

funzioni.c

void cubo(int variabile){

int cubo;

cubo = pow(variabile,3);printf("Il cubo di %d e' %d\n”,variabile,cubo);

}

void fine(){

printf("Questa e' la fine e la somma dei quadrati e' %d\n”, somma);

}

Page 37: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

37

quadrato.c

#include <stdio.h>

main(){

int x, y;

for(x=0; x<5; x++){

y = quad(x);printf("Il quadrato di %d e' %d\n”,x,y);

}

printf(“\n”);for(x=0; x<5; x++){

printf("Il quadrato di %d e' %d\n”,x,quad(x));}

}

Page 38: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

38

quad.c

int quad(int variabile){

int quadrato;

quadrato = variabile*variabile;return(quadrato);

}

Page 39: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

39

ricorsione.c

#include <stdio.h>

main(){ int indice; indice = 10; countdown(indice); }

void countdown(int num) { printf("Il valore di num e' %d\n”,num); num--; if (num>0) countdown(num); }

Page 40: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

40

scambio_1.c

#include <stdio.h>

main(){ int a, b; a = 5; b = 10; printf("In main a vale: %d\n”,a); printf("In main b vale: %d\n\n”,b); swap1(a, b); printf("In main a vale: %d\n”,a); printf("In main b vale: %d\n\n”,b);}

Page 41: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

41

swap_1.c

int swap1(int a, int b){ int temp;

temp = a; a = b; b = temp;

printf("In swap a vale: %d\”,a); printf(“In swap b vale: %d\n\n”,b);

return 0;}

Page 42: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

42

Puntatori e vettori

Gestione della memoria

Vettori numerici

Aritmetica degli indirizzi

Stringhe: vettori di caratteri

Page 43: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

43

Gestione memoria

... ... ...

p: c:

int c=1,d;int *p;

p = &c;d = *p;

indirizzo (puntatore)

valore(variabile)

& = address of (variable)* = contents of (pointer)

p e’ un puntatore ad intero

p punta a cd vale 1

Page 44: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

44

scambio_2.c

#include <stdio.h>

main(){ int a, b; a = 5; b = 10; printf("In main a vale: %d\n”,a); printf("In main b vale: %d\n\n”,b);

swap2(&a, &b); printf("In main a vale: %d\n”,a); printf("In main b vale: %d\n\n”,b);}

Page 45: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

45

swap_2.c

int swap2(int *a, int *b){ int temp;

temp = *a; *a = *b; *b = temp;

printf("In swap a vale: %d\”,a); printf(“In swap b vale: %d\n\n”,b);

return 0;}

Page 46: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

46

Argomenti per valore o per indirizzo?

In C tutti gli argomenti delle funzioni vengono passati per valore: la funzione chiamata non puo’ alterare direttamente una variabile nella funzione chiamante.

I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori copia di variabili del programma chiamante.

E’ possibile effettuare chiamate per riferimento utilizzando i puntatori: in questo caso una funzione puo’ modificare una variabile del programma chiamante.

Page 47: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

47

array.c

#include <stdio.h>

main(){

int vettore[12], indice;

for(indice=0; indice<12; indice++) vettore[indice] = 3 * (indice - 5);

for(indice=0; indice<12; indice++) {

printf("Il valore all' indice %d e’ %d\n”,vettore[indice]);

printf("Il valore all' indice %d e' %d\n”,*(vettore+indice));

printf(”\n”); }

}

Page 48: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

48

stringa.c#include <stdio.h>

main(){

char nomec[5], *nomes;

nomec[0] = 'S'; nomec[1] = 'a'; nomec[2] = 'r'; nomec[3] = 'a'; nomec[4] = 0; nomes = "Sara";

printf("Il nome e' %s\n”,nomec); printf("Una lettera e' %c\n”,nomec[2]); printf("Parte del nome e' %s\n”,&nomec[1]); printf("Parte del nome e' %s\n”,nomec+1);

printf("Il nome e' %s”,nomes); printf("Una lettera e' %c”,nomes[2]); printf("Parte del nome e' %s”,&nomes[1]); printf("Parte del nome e' %s”,nomes+1);

}

Page 49: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

49

Strutture

Variabili composte

Numeri complessi in C

Page 50: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

50

point.c#include <stdio.h>#include <math.h>

main(){

double dist;struct point { int x; int y;};struct point pt1;struct point pt2 = { 2, 2 };

pt1.x=5;pt1.y=2;printf(”%d,%d\n”, pt1.x, pt1.y);

dist=sqrt(pt2.x*pt2.x + pt2.y*pt2.y);printf(“%f\n”,dist);

}

Page 51: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

51

rectangle.c#include <stdio.h>

main(){

double area;struct point { int x; int y;};struct rect { struct point pt1; struct point pt2;};struct rect screen;

screen.pt1.x=1;screen.pt1.y=1;screen.pt2.x=5;screen.pt2.y=5;

}

Page 52: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

52

Numeri complessi in C

#include <stdio.h>

main(){

struct complex { float a; float b;};struct complex i = { 0, 1 };struct complex z = { 5, -7 };struct complex w;

w.a = i.a + z.a;w.b = i.b + z.b;

printf(”%f,%f\n”, i.a, i.b);printf(”%f,%f\n”, z.a, z.b);printf(”%f,%f\n”, w.a, w.b);

}

Page 53: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

53

Input/Output

Accesso a files

fprintf e fscanf

Interazione con Unix:compilare e linkare con make

Page 54: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

54

I/O con files

In Unix e’ po ssibile reindirizzare lo standard input (di solito la tastiera) e lo standard output (di solito il video)con gli operatori di shell < e >:

conta_linee < numeri.ctemperatura > celsius.dat

Nessuna modifica e’ r ichiesta in questo caso al codice sorgente.

Page 55: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

55

files.c#include <stdio.h>

main(){

float fahr,celsius;FILE *fp1,*fp2;

fp1=fopen(“fahr.dat”,”r”);fp2=fopen(“celsius.dat”,”w”);

fscanf(fp1,”%f”,&fahr);/* converti e’ una funzione analoga al programma

temperatura.c */celsius = converti(fahr);fprintf(fp2,”%f\n”,celsius);

fclose(fp1);fclose(fp2);

}

Page 56: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

56

Utilizzo di make

Come compilare e linkare programmi il cui codice sorgente e’ in piu’ files?

gcc –c funzioni.cgcc –o quadrato funzioni.o quadrato.c

Oppure... si edita un file di nome Makefile e si esegue:

make

Solo i files modificati vengono ricompilati e rilinkati.

Page 57: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

57

Makefile

quadrato: quadrato.o funzioni.o gcc –o qua drato funzioni.o quadrato.c

quadrato.o: quadrato.c gcc –c –o quadrato.o quadrato.c

funzioni.o: funzioni.c gcc –c –o funzioni.o funzioni.c

Questo e’ un tabulatore!!!

Page 58: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

58

Esempi dal Kernigham-Ritchie

Conversione di temperatura

Copia di caratteri

Conteggio di caratteri e di numeri

Ricerca di linee di testo

Page 59: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

59

temperatura.c#include <stdio.h>

/* stampa la tabella Fahrenheit-Celsius per fahr = 0, 20, ..., 300 */main(){

int fahr, celsius;int lower, upper, step;

lower = 0;upper = 300;step = 20;

fahr = lower;while(fahr <= upper){celsius = 5 * (fahr - 32) / 9;

/* printf("%d\t%d\n", fahr, celsius); */printf("%3d\t%6d\n", fahr, celsius); fahr = fahr + step;}

}

Page 60: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

60

temperatura_def.c

#include <stdio.h>

#define LOWER 0#define UPPER 300#define STEP 20

/* stampa la tabella Fahrenheit-Celsius per fahr = 0, 20, ..., 300 */main(){

int fahr;

for(fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) printf("%3d\t%6.1f\n", fahr, (5.0/9.0)*(fahr-32));

}

Dal KR

Page 61: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

61

temperatura_float.c#include <stdio.h>

/* stampa la tabella Fahrenheit-Celsius per fahr = 0, 20, ..., 300 */main(){

float fahr, celsius;int lower, upper, step;

lower = 0;upper = 300;step = 20;

fahr = lower;while(fahr <= upper){ celsius = (5.0/9.0) * (fahr - 32); printf("%3.0f\t%6.1f\n", fahr, celsius); fahr = fahr + step;}

}

Dal KR

Page 62: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

62

temperatura_for.c#include <stdio.h>

/* stampa la tabella Fahrenheit-Celsius per fahr = 0, 20, ..., 300 */main(){

int fahr;

for(fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%3d\t%6.1f\n", fahr, (5.0/9.0)*(fahr-32));

}

Dal KR

Page 63: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

63

caratteri.c#include <stdio.h>

main(){

long nc;

nc = 0;while(getchar() != EOF)

++nc;printf("%ld\n",nc);

}

Page 64: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

64

caratteri_for.c#include <stdio.h>

main(){

double nc;

for(nc = 0; getchar() != EOF; ++nc);

printf("%.0f\n",nc);}

Dal KR

Page 65: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

65

copia.c#include <stdio.h>

main(){

int c;

c = getchar();while(c != EOF){ putchar(c); c = getchar();}

}

Dal KR

Page 66: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

66

copia_corto.c#include <stdio.h>

main(){

int c;

while((c = getchar()) != EOF)putchar(c);

}

Dal KR

Page 67: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

67

conta_linee.c#include <stdio.h>

main(){

int c, nl;

nl = 0;while((c = getchar()) != EOF)if(c == '\n')

++nl;printf("%d\n",nl);

}

Page 68: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

68

conta_parole.c#include <stdio.h>

#define IN 1#define OUT 0

main(){

int c, nl, nw, nc, state;

state = OUT;nl = nw = nc = 0;while((c = getchar()) != EOF){

++nc;if(c == '\n')

++nl;if(c == ' ' || c == '\n' || c == '\t')

state = OUT;else if (state == OUT){

state = IN;++nw;

}}printf("%d %d %d\n",nl,nw,nc);

}

Dal KR

Page 69: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

69

conta_cifre.c#include <stdio.h>

main(){

int c, i, nwhite, nother;int ndigit[10];

nwhite = nother = 0;for(i = 0; i<10; ++i)

ndigit[i] = 0;

while((c = getchar()) != EOF)if(c >= '0' && c <= '9')

++ndigit[c - '0'];else if(c == ' ' || c == '\n' || c == '\t')

++nwhite;else

++nother;

printf("cifre =");for(i = 0; i<10; ++i)

printf(" %d",ndigit[i]);printf(", spaziature = %d, altri = %d\n",nwhite, nother);

}

Dal KR

Page 70: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

70

conta_tutto.c#include <stdio.h>

main(){

int c, i, nwhite, nother;int ndigit[10],nalpha[26];

nwhite = nother = 0;for(i = 0; i<10; ++i)

ndigit[i] = 0;for(i = 0; i<26; ++i)

nalpha[i] = 0;

while((c = getchar()) != EOF)if(c >= '0' && c <= '9')

++ndigit[c - '0'];else if(c >= 'a' && c <= 'z')

++nalpha[c - 'a'];else if(c == ' ' || c == '\n' || c == '\t')

++nwhite;else

++nother;

printf("cifre =");for(i = 0; i<10; ++i)

printf(" %d",ndigit[i]);printf("\nalpha =");for(i = 0; i<26; ++i)

printf(" %d",nalpha[i]);printf("\nspaziature = %d, altri = %d\n",nwhite, nother);

}

Dal KR

Page 71: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

71

power.c#include <stdio.h>

int power(int m, int n);

main(){

int i;

for(i=0;i<10;++i)printf("%d\t%d\t%d\n",i,power(2,i),power(-3,i));

return 0;}

int power(int base, int n){

int i,p;

p=1;for(i=1;i<=n;++i)

p=p*base;return p;

}

int power2(int base, int n){

int p;

for(p=1;n>0;--n)p=p*base;

return p;}

Dal KR

Page 72: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

72

trovalinea.c#include <stdio.h>#define MAXLINE 1000

int getline(char line[], int maxline);void copy(char to[], char from[]);

main(){

int len;int max;char line[MAXLINE];char longest[MAXLINE];

max=0;while((len=getline(line,MAXLINE))>0)

if(len>max){

max=len;copy(longest,line);

}if(max>0)

printf("%s",longest);return 0;

}

Dal KR

Page 73: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

73

Funzioni in trovalinea.cint getline(char s[],int lim){

int c,i;

for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='\n';++i)s[i]=c;

if(c=='\n'){

s[i]=c;++i;

}

s[i]='\0';return i;

}

void copy(char to[], char from[]){

int i;

i=0;while((to[i]=from[i])!='\0')

++i;}

Dal KR

Page 74: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

74

trovalinea_scope.c#include <stdio.h>#define MAXLINE 1000

int max;char line[MAXLINE];char longest[MAXLINE];

int getline(void);void copy(void);

main(){

int len;extern int max;extern char longest[MAXLINE];

max=0;while((len=getline())>0)

if(len>max){

max=len;copy();

}if(max>0)

printf("%s",longest);return 0;

}

Dal KR

Page 75: PowerPoint Presentation - Lezioni di C per Fisicifontana/ · I parametri di una funzione vanno considerati come variabili locali, definite nella funzione chiamata e contenenti valori

75

Funzioni in trovalinea_scope.cint getline(void){

int c,i;extern char line[];

for(i=0;i<MAXLINE-1 && (c=getchar())!=EOF && c!='\n';++i)line[i]=c;

if(c=='\n'){

line[i]=c;++i;

}

line[i]='\0';return i;

}

void copy(void){

int i;extern char line[],longest[];

i=0;while((longest[i]=line[i])!='\0')

++i;}

Dal KR