• Non ci sono risultati.

Il linguaggio C

N/A
N/A
Protected

Academic year: 2021

Condividi "Il linguaggio C"

Copied!
91
0
0

Testo completo

(1)

Il linguaggio C

seconda parte

(2)

❑ Le funzioni e le procedure

❑ I puntatori

❑ Gli array

❑ Gli algoritmi di ordinamento

❑ Le stringhe e la loro gestione

❑ Typedef e Struct

❑ La gestione dei file

Indice degli argomenti

(3)

Le procedure e le funzioni

#include <stdio.h>

int main(){

// Il mio primo programma!

printf("Hello World!");

return 0;

}

Cosa servono?

(4)

Nella prima parte abbiamo detto che:

❖ Con la parola main indichiamo la funzione principale;

❖ Con return 0; indichiamo al sistema operativo che il programma è terminato correttamente ritornando il valore 0;

Le procedure e le funzioni

(5)

NO!

Ma qualcuno o qualcosa ci proibisce

di creare altre funzioni nostre?

(6)

La funzione è un tipo di sottoprogramma che ci permette di isolare una parte di codice in un blocco separato

pronto per essere richiamato tutte le volte che ce ne la necessità

Le procedure e le funzioni

(7)

Creazione della funzione

#include <stdio.h>

long miaSomma(int, int);

int main(){

int var1, var2;

long somma;

var1 = 2;

var2 = 3;

somma = miaSomma(var1, var2);

printf("La somma e’ %d", somma);

return 0;

}

long miaSomma(int a, int b){

long sum = a + b;

return sum;

}

(8)

#include <stdio.h>

long miaSomma(int, int);

int main(){

int var1, var2;

long somma;

var1 = 2;

var2 = 3;

somma = miaSomma(var1, var2);

printf("La somma e’ %d", somma);

return 0;

}

long miaSomma(int a, int b){

long sum = a + b;

return sum;

}

Creazione della funzione

Dichiarazione della funzione

Implementazione della funzione

(9)

#include <stdio.h>

long miaSomma(int, int);

int main(){

int var1, var2;

long somma;

var1 = 2;

var2 = 3;

somma = miaSomma(var1, var2);

printf("La somma e’ %d", somma);

return 0;

}

long miaSomma(int a, int b){

long sum = a + b;

return sum;

}

Creazione della funzione

Parametri FORMALI

Valore ritornato dalla funzione

(10)

#include <stdio.h>

long miaSomma(int, int);

int main(){

int var1, var2;

long somma;

var1 = 2;

var2 = 3;

somma = miaSomma(var1, var2);

printf("La somma e’ %d", somma);

return 0;

}

long miaSomma(int a, int b){

long sum = a + b;

return sum;

}

Creazione della funzione

Chiamata della funzione

Parametri ATTUALI

(11)

#include <stdio.h>

long miaSomma(int, int);

int main(){

int var1, var2;

long somma;

var1 = 2;

var2 = 3;

somma = miaSomma(var1, var2);

printf("La somma e’ %d", somma);

return 0;

}

long miaSomma(int a, int b){

long sum = a + b;

return sum;

}

Creazione della funzione

Parametri ATTUALI

Parametri FORMALI Il valore della variabile viene copiato dal

parametro attuale al parametro formale in base all’ordine

(12)

#include <stdio.h>

long miaSomma(int, int);

int main(){

int var1, var2;

long somma;

var1 = 2;

var2 = 3;

somma = miaSomma(var1, var2);

printf("La somma e’ %d", somma);

return 0;

}

long miaSomma(int a, int b){

long sum = a + b;

return sum;

}

Creazione della funzione

Attenzione ai tipi dei parametri!

I tipi dei parametri attuali devono

essere gli stessi dei tipi dei parametri formali

(13)

La procedura è un particolare tipo di funzione. A

differenza della funzione la procedura non ritorna alcun valore all’istruzione chiamante.

All’atto della dichiarazione e

implementazione il tipo dichiarato per il ritorno dovrà essere

void (vuoto).

Le procedure

(14)

Le procedure

#include <stdio.h>

void stampaMenu();

int main(){

int scelta, var1, var2;

int var2;

float risultato;

stampaMenu();

scanf("%d", & scelta);

// continua ...

}

void stampaMenu(){

printf("– Programma calcolatrice--\n");

printf("Premi 1 per fare una addizione\n");

printf("Premi 2 per fare una sottrazione;\n");

printf("Premi 3 per fare una moltiplicazione;\n");

printf("Premi 4 per fare una divisione.\n");

}

(15)

Le procedure

#include <stdio.h>

void stampaMenu();

int main(){

int scelta, var1, var2;

int var2;

float risultato;

stampaMenu();

scanf("%d", & scelta);

// continua ...

}

void stampaMenu(){

printf("– Programma calcolatrice--\n");

printf("Premi 1 per fare una addizione\n");

printf("Premi 2 per fare una sottrazione;\n");

printf("Premi 3 per fare una moltiplicazione;\n");

printf("Premi 4 per fare una divisione.\n");

}

(16)

La ricorsione

La ricorsione è una tecnica che consiste ad una funzione di far richiamare se stessa facendo passare come

parametro un set di input ridotto.

Questa tecnica permette di scrivere in maniera più elegante alcuni tipi di algoritmi.

(17)

La ricorsione

Una funzione ricorsiva è formata da due parti:

❖ Condizione di terminazione o caso base

condizione che se vera ritorna o meno un valore e termina la catena delle chiamate ricorsive.

❖ Chiamata ricorsiva

chiamata alla funzione stessa passando come parametri attuali un sottoinsieme dei parametri ricevuti in input:

(18)

Esempio – il fattoriale

il fattoriale di un numero naturale n si indica con n! ed esso viene usato nel campo della statistica e nel calcolo delle probabilità.

n! è uguale al prodotto di tutti i numeri naturali tra n e 1 n! = n * (n – 1) * … * 2 * 1

Esempio

5! = 5 * 4 * 3 * 2 * 1 = 120

(19)

Il fattoriale – versione iterativa

#include <stdio.h>

#include <stdlib.h>

int main(){

int fatt_n = 1;

int n = 8;

for(int i = 1; i <= n; i++) { fatt_n = fatt_n * i;

} }

(20)

Il fattoriale – versione ricorsiva

#include <stdio.h>

#include <stdlib.h>

int fibonacci(int fib_n);

int main(){

int fatt_n, n = 8;

fatt_n = fattoriale(n);

return 0;

}

int fattoriale(int n){

if(n == 1) { return 1;

} else {

return n * fatt(n - 1);

} }

(21)

Il fattoriale – versione ricorsiva

#include <stdio.h>

#include <stdlib.h>

int fibonacci(int fib_n);

int main(){

int fatt_n, n = 8;

fatt_n = fattoriale(n);

return 0;

}

int fattoriale(int n){

if(n == 1) { return 1;

} else {

return n * fatt(n - 1);

} }

CASO BASE

CHIAMATA RICORSIVA

(22)

La successione di Fibonacci

Leonardo da Pisa meglio conosciuto come Fibonacci ha descritto una legge matematica per studiare la popolazione dei conigli:

Le sue ipotesi erano le seguenti:

❖ C’è una coppia di conigli appena nati;

❖ Questa coppia dopo il primo anno diventa fertile e da alla luce un’altra coppia di conigli a partire dal secondo anno per ogni anno;

❖ Le coppie generate si comportano in maniera analoga alla prima coppia;

❖ I conigli sono immortali.

(23)

La successione di Fibonacci

Anno Coppie di conigli NON fertili Coppie di conigli fertili Coppie di conigli Totali

1 0 1 1

2 0 1 1

3 1 1 2

4 1 2 3

5 2 3 5

6 3 5 8

7 5 8 13

8 8 13 21

9 13 21 34

(24)

La successione di Fibonacci

Anno Coppie di conigli NON fertili Coppie di conigli fertili Coppie di conigli Totali

1 0 1 1

2 0 1 1

3 1 1 2

4 1 2 3

5 2 3 5

6 3 5 8

7 5 8 13

8 8 13 21

9 13 21 34

(25)

La successione di Fibonacci

n Fib(n-2) Fib(n-1) Fib(n)

1 0 1 1

2 0 1 1

3 1 1 2

4 1 2 3

5 2 3 5

6 3 5 8

7 5 8 13

n Fib(n-2) Fib(n-1) ?????

(26)

La successione di Fibonacci

n Fib(n-2) Fib(n-1) Fib(n)

1 0 1 1

2 0 1 1

3 1 1 2

4 1 2 3

5 2 3 5

6 3 5 8

7 5 8 13

n Fib(n-2) Fib(n-1) Fib(n-1) + Fib(n-2)

(27)

La successione di Fibonacci

#include <stdio.h>

#include <stdlib.h>

int main(){

int fib_n, fib_n1, fib_n2, n = 8;

for(int i = 1; i <= n; i++) { if(i == 1) {

fib_n = 1;

fib_n1 = 1;

fib_n2 = 0;

} else {

fib_n = fib_n1 + fib_n2;

fib_n2 = fib_n1;

fib_n1 = fib_n;

} }

}

(28)

Stili di scrittura del codice

❖ Descrivi il nome delle variabili con un sostantivo;

❖ Descrivi una funzione/procedura con un verbo;

❖ Scrivi il nome delle variabili/funzioni/procedure sempre in minuscolo;

❖ Per concatenare due o più parole non inserire spazi (che non sono permessi)

ma inserisci la prima lettera della parola successiva in maiuscolo (camel case).

(29)

Esercizi

❖ Riscrivi il programma della calcolatrice con l’uso delle funzioni (una funzione per ogni operazione aritmetica)

❖ Riscrivi la procedura della stampa del menu come funzione;

❖ Scrivi il codice ricorsivo

per calcolare la successione di Fibonnacci;

(30)

✓ Le funzioni e le procedure

❑ I puntatori

❑ Gli array

❑ Gli algoritmi di ordinamento

❑ Le stringhe e la loro gestione

❑ Typedef e Struct

❑ La gestione dei file

Indice degli argomenti

(31)

I puntatori

Una variabile è una allocazione di spazio contenuta all’interno della memoria RAM.

Tramite l’operatore unario & possiamo accedere all’indirizzo di questa area di memoria.

Memoria RAM

005da28c 005da290

a02 -279

&var1 var1

(32)

I puntatori

Per contenere l’indirizzo di una variabile (tipo dato

primitivo) dobbiamo dichiarare una variabile a puntatore.

La variabile a puntatore si dichiara anteponendo davanti al nome della variabile * (asterisco);

int var1; // variabile numero intero

int *ind1; // variabile puntatore ad intero ind1 = &var1; // estrazione dell’indirizzo di

// memoria

(33)

I puntatori

#include <stdio.h>

int main(){

int pippo;

int *indPippo;

pippo = 45;

indPippo = &pippo;

printf(“Pippo vale %d\n",pippo);

printf(“Pippo sta

nell'indirizzo %d", indPippo);

return 0;

}

(34)

I puntatori

Pippo vale 45

Pippo sta nell'indirizzo Via Roma

(35)

I puntatori

#include <stdio.h>

int main(){

int var1, var2;

int *ind1, *ind2;

var1 = 2;

var2 = 3;

ind1 = &var1;

ind2 = &var2;

printf(“var1 vale %d e L'indirizzo e' %d\n", var1, ind1);

printf(“var2 vale %d e L'indirizzo e' %d\n", var2, ind2);

return 0;

}

(36)

I puntatori

(37)

✓ Le funzioni e le procedure

✓ I puntatori

❑ Gli array

❑ Gli algoritmi di ordinamento

❑ Le stringhe e la loro gestione

❑ Typedef e Struct

❑ La gestione dei file

Indice degli argomenti

(38)

Gli array

Esempio di un programma:

"Considerando i dati di una rilevazione della temperatura nell’arco di 24 ore (con un campionamento ogni

5 minuti) calcolare il valore massimo, minimo ed il

valore medio."

(39)

Gli array

24 * 60 / 5 = 288 valori diversi!

(40)

Gli array

#include <stdio.h>

int main(){

int var1, var2, var3, … , var288;

var1 = 2;

...

var288 = 3;

...

}

(41)

SI!

Non esiste un metodo più agevole per dichiarare un gran numero di

variabili dello stesso tipo?

(42)

Gli array (vettori in italiano) sono una sorta di "variabile- cassettiera", dove grazie ad un indice numerico possiamo accedere ad una sorta di cassetto che conterrà il singolo

valore

Gli array

(43)

Temperature

Gli array

1

0

2

3

(44)

Temperature

Gli array

1 0 2

3

temperature[0] = 25.8;

temperature[1] = 32.1;

temperature[2] = 21.6;

temperature[3] = 24.3;

(45)

Gli array

#include <stdio.h>

#include <stdlib.h>

int main(){

// Dichiarazione con assegnazione della // dimensione dell’array

float temperature[288];

srand(0);

for(int i = 0; i < 288; i++) {

temperature[i] = 25 + rand()*5;

}

for(int i = 0; i < 288; i++) {

printf("Temp %d = %f;\n", i+1, temperature[i]);

} }

(46)

Gli array

(47)

Gli array

Quando dichiariamo un array nella memoria RAM viene allocato uno spazio contiguo grande quanto la dimensione dell’array per la dimensione del singolo tipo di dato primitivo.

Memoria RAM

005da28c 005da2ac 005da2cc 005da2ec

25.8 32.1 temperature

21.6 24.3

= 32 bit * 4

= 128 bit

(48)

Si posso dichiarare array che posso essere strutturati su due (o più)

dimensioni.

Gli array a due dimensioni

(49)

Temperature giornaliere

Gli array a due dimensioni

1 0

2 3

1 0

2 3

1 0

2 3

giorno 1 giorno 2 giorno 3

(50)

Gli array a due dimensioni

#include <stdio.h>

#include <stdlib.h>

int main(){

// Dichiarazione con assegnazione della // dimensione dell’array bidimensionale float temperature[3][288];

srand(0);

for(int i = 0; i < 3; i++) {

for(int h = 0; h < 288; h++) {

temperature [h][i] = 25 + rand()*5;

} }

for(int i = 0; i < 3; i++) {

for(int h = 0; h < 288; h++) {

printf("Temp %d di giorno %d = %f;\n", h+1, i+1, temperature[h][i]);

}

(51)

Esercizi

❖ Esegui le operazioni richieste dall’esperimento (calcolare il valore minimo, massimo e la media);

❖ Calcola il valore minimo, massimo e la media su base giornaliera;

(52)

✓ Le funzioni e le procedure

✓ I puntatori

✓ Gli array

❑ Gli algoritmi di ordinamento

❑ Le stringhe e la loro gestione

❑ Typedef e Struct

❑ La gestione dei file

Indice degli argomenti

(53)

Algoritmi di ordinamento

Il programma prevedeva la memorizzazione di 288 valori di temperatura in un array.

I valori in questo array sono stati inseriti in ordine temporale.

E se vogliamo vedere queste misure dal valore più basso a quello più alto?

Dobbiamo ordinare l’array!

(54)

Algoritmi di ordinamento

L’ordinamento è una di quelle operazioni che richiedere tanto tempo di calcolo e/o memoria RAM, ed è per questo che nel tempo sono state elaborate tanti algoritmi di

ordinamento, da quelli di "nief" (ingenui) ma dispendiosi, a quelli più complitati ma efficienti

(55)

Algoritmi di ordinamento

Ecco alcuni dei principali algoritmi di ordinamento

❖ Bubble sort

❖ Insertion sort

❖ Merge sort

❖ Quick sort

(56)

Bubble sort

Il Bubble sort (ordinamento a bolle) è l’algoritmo di

ordinamento più banale.

Esso prevede di "far salire"

il valore più alto (come le bolle) scambiando i valori che man mano incontra e lasciando dietro i valori più

bassi. Fonte: Di Simpsons contributor - Opera propria, CC BY-SA 3.0

(57)

Bubble sort

INIZIO

int valori[100];

int dim = 100;

int c1 =0; int c2 = dim;

c1++

c2 > 0

temp = valori[c1+1]

valori[c1+1] = valori[c1]

valori[c1] = temp

SI

valori[c1] >

valori[c1+1]

c1 < c2+1 SI

SI

c2--

c1=0

NO NO

FINE

(58)

Bubble sort

Ecco l’esecuzione di un array applicando il Bubble sort

Fonte: Di Swfung8 - Opera propria, CC BY-SA 3.0

(59)

Esercizi

❖ Realizza il codice C dell’algoritmo appena visionato.

❖ Scrivi il codice sia con l’ausilio del costrutto for che con il costrutto while;

❖ Scrivi il codice Bubble Sort dove il senso di ordinamento va dal più grande

al più piccolo

(60)

Insertion sort

L’Insertion sort (ordinamento ad inserimento) è un l’algoritmo di ordinamento dove si inserisce un elemento alla volta e lo si va a

posizionare in maniera tale che l’array o sotto array preso in esame risulti ordinato.

Questo tipo di ordinamento è simile a quello che si fa riordinando un mazzo

di carte. Fonte: Di Simpsons contributor -

Opera propria, CC BY-SA 3.0

(61)

Insertion sort

Ecco l’esecuzione di un array applicando il Insertion sort

Fonte: Di Swfung8 - Opera propria, CC BY-SA 3.0

(62)

Merge sort

Il Merge sort (ordinamento ad unione) è un algoritmo di

ordinamento che applica il paradigma

"Divide et impera", ovvero:

1. Suddivide l’array in sotto-array, fino ad ottenere un sotto array di uno o due elementi;

2. Ordina il sotto-array;

3. Dai due sotto-array ordinati, li unisce in un unico array ordinato.

(63)

Merge sort

Ecco l’esecuzione di un array applicando il Merge sort

Fonte: Di Swfung8 - Opera propria, CC BY-SA 3.0

(64)

Quick sort

Il Quick sort (ordinamento rapido) è il più veloce algoritmo di ordinamento per confronti.

1. Sceglie una posizione casuale dell’array, chiamata pivot;

2. Scansiona tutti gli elementi

dell’array, spostando gli elementi minori del pivot a sinistra e quelli maggiori a destra;

3. Esegue il Quicksort sui sotto-array (a sinistra e a destra del pivot).

(65)

Quick sort

Ecco l’esecuzione di un array applicando il Quick sort

Fonte: Di RolandH - GFDL, CC-BY-SA-3.0

(66)

Esercizi

❖ Realizza il codice C dell’algoritmo appena visionato.

(67)

✓ Le funzioni e le procedure

✓ I puntatori

✓ Gli array

✓ Gli algoritmi di ordinamento

❑ Le stringhe e la loro gestione

❑ Typedef e Struct

❑ La gestione dei file

Indice degli argomenti

(68)

Le stringhe

In C non esiste un tipo per definire una stringa, ma è possibile definire una successione di

caratteri come un array di char delimitato alla fine con il carattere nullo ‘\0’

C 0

i 1

a 2

o 3 4

M 5

o 6

n 7

d 8

o 9

\0 10

#include <stdio.h>

#include <stdlib.h>

int main(){

// Dichiarazione ed

// assegnazione della stringa char miastringa[11];

miastringa = "Ciao Mondo";

}

(69)

Le stringhe

Esattamente come negli array, possiamo

accedere e modificare ogni singolo carattere accedendo alla

posizione interessata

C 0

i 1

a 2

u 3 4

M 5

o 6

n 7

d 8

o 9

\0 10

#include <stdio.h>

#include <stdlib.h>

int main(){

char miastringa[11];

miastringa = "Ciao Mondo";

miastringa[3] = 'u’;

}

(70)

string.h

Nella Standard Library di C è stata inclusa una libreria che permette la gestione semplificata delle stringhe.

Procedura Descrizione

int strlen(char str[]) Ritorna la lunghezza di una stringa void strcpy(char str1[], char str2[]) Copia la stringa str1 in str2

void strcat(char str1[], char str2[]) Concatena a str1 il contenuto di str2

int strcmp(char str1[], char str2[]) Confronta str1 con str2

#include <stdio.h>

#include <string.h>

(71)

Esercizi

❖ Presa una parola in input, dire se questa parola è

palindroma (ovvero se la parola viene capovolta essa non cambia, es. oro, radar, tot, osso, otto)

(72)

✓ Le funzioni e le procedure

✓ I puntatori

✓ Gli array

✓ Gli algoritmi di ordinamento

✓ Le stringhe e la loro gestione

❑ Typedef e Struct

❑ La gestione dei file

Indice degli argomenti

(73)

Typedef

C definisce al suo interno alcuni tipi di dato cosiddetti primitivi, che sono:

▪ char

▪ short

▪ int

▪ long

▪ long long

▪ float

▪ double

▪ long double Però, per usare gruppi di dati

aggregati (es. i dati di una persona),

possiamo (ri)definire dei nuovi tipi di dati.

(74)

Typedef - ridefinizione

#include <stdio.h>

//Ridefinisco ‘int’ come ‘intero’

typedef int intero;

int main(){

//Dichiaro la variabile con il nuovo tipo ‘intero’

intero i;

for(i = 0; i < 288; i++) {

printf(“Ciao %d;\n", i+1);

} }

(75)

Struct

Mentre typedef da il nome a un nuovo tipo di dato, per realizzare delle forme aggregate di dati abbiamo bisogno del costrutto struct

(76)

Struct

#include <stdio.h>

struct persona { char* nome;

int eta;

} pippo, paperino;

struct animale { char* nome;

char* razza;

} pluto, lessie;

int main(){

pippo.nome = "Pippo";

pippo.eta = 70;

pluto.nome = "Pluto";

pluto.razza = "cane";

printf("Personaggio: %s;

eta': %d", pippo.nome, pippo.eta);

return 0;

}

(77)

Struct

#include <stdio.h>

struct persona { char* nome;

int eta;

} pippo, paperino;

struct animale { char* nome;

char* razza;

} pluto, lessie;

int main(){

pippo.nome = "Pippo";

pippo.eta = 70;

pluto.nome = "Pluto";

pluto.razza = "cane";

printf("Personaggio: %s;

eta': %d", pippo.nome, pippo.eta);

return 0;

}

(78)

Typedef Struct

struct persona { char* nome;

int eta;

} pippo, paperino;

Struct Typedef

+

typedef int intero;

=

Typedef Struct

typedef struct { char* nome;

int eta;

} PERSONA;

(79)

Typedef Struct

#include <stdio.h>

typedef struct { char* nome;

int eta;

} PERSONA;

typedef struct { char* nome;

char* razza;

} ANIMALE;

int main(){

PERSONA pippo, paperino;

ANIMALE pluto, lessie;

pippo.nome = "Pippo";

pippo.eta = 70;

pluto.nome = "Pluto";

pluto.razza = "cane";

printf("Personaggio: %s;

eta': %d", pippo.nome, pippo.eta);

return 0;

}

(80)

Esercizi

❖ Creare un programma "Anagrafe" che permette

l’inserimento, la lettura , la modifica e l’eliminazione dei dati di una persona (nome, cognome, codice

fiscale, luogo e data di nascita, …)

(81)

✓ Le funzioni e le procedure

✓ I puntatori

✓ Gli array

✓ Gli algoritmi di ordinamento

✓ Le stringhe e la loro gestione

✓ Typedef e Struct

❑ La gestione dei file

Indice degli argomenti

(82)

I File

I file sono unità logiche di memoria gestite dal sistema operativo (S.O.) ospitante (tramite

il filesystem).

I programmi posso accedere ai file tramite

le API fornite dal S.O. e, nel caso dello sviluppo di applicazioni con lo il linguaggio standard C, tramite la libreria stdio.h inclusa nella standard library.

(83)

I File

In C, i file

possono essere trattati come

File testuali

Sequenza di caratteri terminati con un

ritorno a capo (\n)

File binari

Sequenza di bit

(84)

I File

Tutte le operazioni di lettura e scrittura vengono

effettuate in maniera

sequenziale (cioè dall’inizio fino alla fine del file).

Pippo.txt C i a o

m o n

(85)

I puntatore a file

Il tipo di variabile adottato da C è il

*FILE (puntatore a file), dichiarato all’interno della stdio.h .

Tale variabile contiene tutte le

informazione per la gestione del file (posizione del puntatore interno per la lettura/scrittura del file,

riferimento alla risorsa del S.O. che gestisce il file, etc.)

#include <stdio.h>

int main(){

FILE *fp;

...

}

(86)

Operazioni su file

Procedura Descrizione

FILE* fopen(char *filename, char *mode)

Apre il file filename con la modalità indicata in mode

uint fread(void *data, uint len, unit element_size, FILE* fp)

Legge dal file len byte e li scrive dentro la risorsa (es. array) che punta a data.

uint fwrite(void *fp, uint len, unit element_size, FILE* fp)

Scrive len byte dalla risorsa data

dentro il file.

void fprintf(FILE* fp,

char *format, ...)

Scrive la stringa generata con

format combinata con gli elementi in maniera simile a printf.

void fscanf(FILE* fp,

char *format, ...)

Legge la stringa data in input nel formato indicato da format e scrive i valori negli elementi in

(87)

Operazioni su file

Procedura Descrizione

int fclose(FILE* fp) Chiude il file. Se il valore di ritorno è uguale a 0 tutto è andato bene, altrimenti ritorna il codice di errore.

int feof(FILE* fp) Testa se è arrivato alla fine del file. Se ritorna un numero diverso da 0 si è giunti alla fine del file.

void rewind(FILE* fp) Riporta il puntatore interno del file all’inizio.

int fflush(FILE* fp) Finalizza la scrittura del buffer sul file.

(88)

I File

#include <stdio.h>

int main(){

FILE *fp;

char buf[30];

fp = fopen("mioFile.txt",

"w");

fprintf(fp, "Pane\n");

fprintf(fp, "Latte \n");

fprintf(fp, "Uova\n");

fprintf(fp,"Formaggio\n");

fclose(fp);

fp = fopen("mioFile.txt",

"r");

printf("Stampa della lista della spesa dentro il file\n");

while(

fscanf(fp,"%s",buf)>0) { printf("%s\n", buf);

}

fclose(fp);

return 0;

}

(89)

I File

(90)

Esercizi

❖ Nel programma "Anagrafe" creato nell’argomento precedente effettuare la memorizzazione, la lettura, l’aggiornamento e l’eliminazione dei dati di una

persona con i file.

(91)

Il linguaggio C

Prof. Daniele Contarino

Questa presentazione è disponibile su danielecontarino.it

Tutti i marchi riportati appartengono ai legittimi proprietari; marchi di terzi, nomi di prodotti, nomi commerciali, nomi corporativi e società citati

Riferimenti

Documenti correlati

del verbale di gara per l’affidamento di restauro architettonico-artistico adeguamento degli impianti e sistemazione degli spazi esterni del Liceo Artistico di Piazza Collegio

In particolare, alcuni elementi attraversano l'array velocemente (come bollicine che emergono dal fondo del bicchiere), altri più lentamente (a differenza di quanto avviene nel

• Settori: Costruzione infrastrutture blockchain , gestione di risorse digitali, servizi di mining , mining machines, costruzioni laboratori blockchain nelle università. •

 A swap of &#34;far away&#34; elements may result in a duplicate key passing over to the left of a. preceding instance of the

 Focusing of the task of sorting, the heap sort ordering algorithm, is implemented through 3 functions.  heapify

Scrivi in ordine i pianeti dal più vicino al più lontano dal

La Interamnia World Cup è uno dei maggiori e più longevi tornei internazionali che, negli anni, ha assunto un ruolo di primo piano nella promozione dello sport e della

1) Aumento dei livelli retributivi (in Francia cresciuti di 1.000 euro al mese in fase Covid-19, in Germania dell’8%) attraverso l’incremento del valore