Il linguaggio C
seconda parte
❑ 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
Le procedure e le funzioni
#include <stdio.h>
int main(){
// Il mio primo programma!
printf("Hello World!");
return 0;
}
Cosa servono?
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
NO!
Ma qualcuno o qualcosa ci proibisce
di creare altre funzioni nostre?
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
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;
}
#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
#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
#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
#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
#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
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
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");
}
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");
}
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.
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:
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
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;
} }
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);
} }
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
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.
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
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
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) ?????
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)
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;
} }
}
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).
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;
✓ 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
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
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
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;
}
I puntatori
Pippo vale 45
Pippo sta nell'indirizzo Via Roma
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;
}
I puntatori
✓ 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
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."
Gli array
24 * 60 / 5 = 288 valori diversi!
Gli array
#include <stdio.h>
int main(){
int var1, var2, var3, … , var288;
var1 = 2;
...
var288 = 3;
...
}
SI!
Non esiste un metodo più agevole per dichiarare un gran numero di
variabili dello stesso tipo?
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
Temperature
Gli array
1
0
2
3
Temperature
Gli array
1 0 2
3
temperature[0] = 25.8;temperature[1] = 32.1;
temperature[2] = 21.6;
temperature[3] = 24.3;
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]);
} }
Gli array
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
Si posso dichiarare array che posso essere strutturati su due (o più)
dimensioni.
Gli array a due dimensioni
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
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]);
}
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;
✓ 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
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!
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
Algoritmi di ordinamento
Ecco alcuni dei principali algoritmi di ordinamento
❖ Bubble sort
❖ Insertion sort
❖ Merge sort
❖ Quick sort
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
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
Bubble sort
Ecco l’esecuzione di un array applicando il Bubble sort
Fonte: Di Swfung8 - Opera propria, CC BY-SA 3.0
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
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
Insertion sort
Ecco l’esecuzione di un array applicando il Insertion sort
Fonte: Di Swfung8 - Opera propria, CC BY-SA 3.0
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.
Merge sort
Ecco l’esecuzione di un array applicando il Merge sort
Fonte: Di Swfung8 - Opera propria, CC BY-SA 3.0
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).
Quick sort
Ecco l’esecuzione di un array applicando il Quick sort
Fonte: Di RolandH - GFDL, CC-BY-SA-3.0
Esercizi
❖ Realizza il codice C dell’algoritmo appena visionato.
✓ 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
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";
}
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’;
}
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>
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)
✓ 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
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.
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);
} }
Struct
Mentre typedef da il nome a un nuovo tipo di dato, per realizzare delle forme aggregate di dati abbiamo bisogno del costrutto struct
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;
}
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;
}
Typedef Struct
struct persona { char* nome;
int eta;
} pippo, paperino;
Struct Typedef
+
typedef int intero;
=
Typedef Struct
typedef struct { char* nome;
int eta;
} PERSONA;
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;
}
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, …)
✓ 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
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.
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
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
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;
...
}
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
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.
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;
}
I File
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.
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