Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 1
Algoritmi di base
{...
MAX=Num; // il primo valore della sequenza è //il ‘primo’ massimo attuale
{ ... // inizia un ciclo per analizzare // gli altri valori nella sequenza
if (Num>MAX) MAX=Num; // aggiorna il massimo attuale // quando trovato un valore // maggiore nella sequenza ....
} // fine ciclo ....
printf (“Massimo = %d”, MAX);
....
}
... Ricerca del valore massimo in una sequenza di valori (ad es. di numeri interi)
Algoritmi di base
{....
MIN=Num; // il primo valore della sequenza è //il ‘primo’ minimo attuale
{... // inizia un ciclo per analizzare // gli altri valori nella sequenza
if (Num<MIN) MIN=Num; // aggiorna il minimoattuale // quando trovato un valore // minore nella sequenza ....
} // fine ciclo ....
printf (“Minimo = %d”, MIN);
...
... Ricerca del valore minimo in una sequenza di valori (ad es. di numeri interi)
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 3
{....
Cerca = ... // Inizializza variabile con valore da cercare // e contare occorrenze nella sequenza
....
Volte=0; // Inizializza contatore occorrenze { ... // inizia un ciclo per analizzare // i valori nella sequenza
if (VAL==Cerca)
Volte=Volte+1; // Incrementa contatore occorrenze // ogni volta che il valore è // trovato nella sequenza ...
} // fine ciclo
printf (“Valore %d presente %d volte \n", Cerca, Volte);
....
}
Algoritmi di base
... Ricerca e conteggio occorernze di un dato valore in una sequenza (ad es. di numeri interi)
Algoritmi di base
{....
scanf (“%d”, &N); //legge estremo superiore sommatoria Sommatoria=0; // Inizializza valore della sommatoria for (i=1;i<=N;i++) // ciclo for per calcolare la sommatoria
Sommatoria = Sommatoria + i;
// Incrementa valore di Sommatoria // con il valore i
printf (“Sommatoria = %d \n", Sommatoria);
}
... Calcolo sommatoria dei numeri interi da 1 a N:
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 5
Algoritmi di base
{....
scanf (“%d”, &N); //legge estremo superiore produttoria produttoria=1; // Inizializza valore della produttoria for (i=2;i<=N;i++) // ciclo for per calcolare la produttoria
produttoria = produttoria * i;
// Incrementa valore di produttoria // con il valore i
printf (“Produttoria= %f \n", produttoria);
}
... Calcolo produttoria dei numeri interi da 1 a N:
Algoritmi di base
{....
scanf (“%d”, &N); //legge cardinalità della serie Sommatoria=0; // Inizializza valore della sommatoria for (i=1;i<=N;i++) // ciclo for per calcolare la sommatoria {...
scanf (“%d”, &numero); //legge un numero della serie Sommatoria = Sommatoria + numero;
// Incrementa valore di Sommatoria // con il valore di numero
...
}
printf (“Sommatoria = %d \n", Sommatoria);
... Calcolo sommatoria di una serie di N numeri interi (immessi da tastiera) ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 7
Algoritmi di base
... qualche considerazione/osservazione ...
... serie/sequenze ‘costruite’ usando una sola variabile ...
... se si volessero stampare tutti i valori della serie/sequenza dopo che sono stati tutti immessi ?
... se si volesse fare una nuova elaborazione sulla stessa serie/sequenza ? ... una serie/sequenza è un insieme di più valori,
... uso di una variabile per ciascun valore ... ???
Necessità di strutture dati che consentono di registrare un insieme di valori .
Tipi strutturati
…. l’informazione può essere decomposta in tipi più semplici ...
…. più informazioni aggregate fra loro in base ad una relazione per costituire una informazione più complessa
Es:
data (giorno, mese, anno)
numero complesso (parte reale, coefficiente immaginario) generalità anagrafiche (cognome, nome, data nascita, indirizzo)
Un tipo strutturato è caratterizzato da:
• tipi componenti
• costruttore
• funzione d’accesso agli elementi
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 9
COSTRUTTORI DI TIPO
Prodotto cartesiano
tipo T = cartesiano (t1, t2, .... , tn)
t1, t2, …, tn: tipi componenti, non necessariemente tutti uguali
forma n-ple ordinate di elementi dei tipi t1,t2, …, tn un tipo strutturato si ottiene mettendo insieme i tipi
componenti attraverso appositi operatori due costruttori:
• prodotto cartesiano
• sequenza
COSTRUTTORI DI TIPO Prodotto cartesiano
… due modi per definire il tipo strutturato:
• indicando solo i tipi componenti tipo T = cartesiano (t1, t2, .... , tn)
tipo complesso = cartesiano(reale, reale) tipo data = cartesiano(intero, intero, intero)
• indicando attributi e tipi componenti
tipo T = cartesiano (a1:t1, a2:t2, .... ,an:tn)
tipo complesso: cartesiano(ParteReale:reale, CoeffImm: reale) tipo data: cartesiano(giorno: intero, mese:intero,anno:intero)
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 11
Sequenza
tipo T = sequenza (t1, t2, ..., tn)
dove t1 = t2 = … = tn tipi componenti tutti uguali COSTRUTTORI DI TIPO
Es.;
parola = sequenza (carattere)
numero decimale = sequenza (cifra decimale) capitolo = sequenza (paragrafi)
coda = sequenza (persone)
Variabili di Tipo strutturato
Una variabile (informazione) di tipo strutturato va dichiarata, come qualsiasi altra variabile, indicandone il tipo ed il nome
<nome_tipo_strutturato> <nome_variabile>;
Es.:
tipo complesso = cartesiano(ParteReale:reale, CoeffImm: reale) complesso Numero;
dichiarazione della variabile di nome Numero di tipo complesso
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 13
Funzione di Accesso
… per potere accedere ad uno degli elementi costituenti la struttura:
• tramite l’indicazione di un attributo:
tipo TS = cartesiano (n1:t1, n2:t2, .... ,nk:tk)
indicando con A una informazione del tipo strutturato TS, TS A;
con
A.nh
si indica l’accesso all’elemento nh (il componente h-esimo) di TS Es.:
tipo complesso = cartesiano(ParteReale:reale, CoeffImm: reale) complesso Numero;
Numero.ParteReale per accedere alla ParteReale
Funzione di Accesso tramite l’indicazione della posizione:
…. Uso di un’informazione indice ...
… indice: informazione di un tipo ordinato ...
Detta A una variabile del tipo strutturato:
A[indice]
indica la componente che occupa la posizione indicata da indice
Es.:
tipo GraduatoriaConcorso = cartesiano(persona, persona, …, persona)
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 15
Array monodimensionali
Tipo strutturato praticamente presente in tutti i linguaggi come tipo strutturato primitivo
• Costruttore: Cartesiano
• Tipi componenti: tutti dello stesso tipo
• Funzione d’accesso: per posizione
tipo array monodimensionale = cartesiano(T 1,T 2, … ,T n) con T 1 = T 2 =...= T n = T
bisogna:
definire T, il tipo dei componenti
definire la dimensione (o cardinalità) dell’array
Array monodimensionali
… concettualmente ...
• un nome ‘collettivo’ associato ad un insieme ordinato di elementi tutti dello stesso tipo
• ciascun elemento è direttamente accessibile attraverso una informazione (l’indice) che ne individua la
posizione nella struttura Es.:
classifica campionato: array di squadre graduatoria concorso: array di persone
prenotati esame universitario: array di studenti
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 17
Array monodimensionali
… un modello interpretativo ...
A
[1]
[2]
[3]
[4]
[5]
Valori dell’indice [6]
(posizione componente)
Nome array A[3]
Terzo componente
Accesso diretto ai componenti
Array monodimensionali
… un modello interpretativo ...
Valori dell’indice (posizione componente)
A
[1]
[2]
[3]
[4]
[5]
[6]
34 281 87 623 15 839
Valori elementi array
A[1] = 34 A[3] = 87 A[5] = 15
… non confondere il valore di un elemento dello array con
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 19
Array monodimensionali Parametri caratterizzanti un array:
• Strutturali:
• Nome dello array
• Tipo componente
• Cardinalità: numero di elementi costituenti lo array
Array monodimensionali
Parametri caratterizzanti un array:
• di utilizzo:
• Indice: appartenete ad un tipo ordinato, indica la posizione di un elemento nello array.
Può essere espresso tramite:
• una costante (es. A[4], quarto elemento dello array)
• una variabile (es. A[I], i-esimo elemento dello array)
• una espressione (es. A[c+d*e],
(elemento dello array nella posizione corrispondente al valore di c+d*e)
• Riempimento: numero di elementi effettivamente utilizzati N.B. non confondere Riempimento con Cardinalità Deve sempre essere :
Riempimento Cardinalità
indice Riempimento Cardinalità
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 21
Array monodimensionali
La dichiarazione di una variabile di tipo array è fatta specificando:
• tipo componente
• nome dello array (nome della variabile)
• cardinalità dello array (racchiusa tra parentesi quadre)
<tipo> <nome_array> [<cardinalità>]
Es.:
int A[10];
float SpesaSettimanale[7];
Array monodimensionali
ad un elemento di un array è possibile assegnare un valore tramite operazioni di:
• lettura Es.:
read(“%d”, A[3]);
legge il valore da assegnare al terzo elemento dello array A
• calcolo e assegnazione Es.:
A[4] = C;
A[I] = 5;
A[I] = f * 9 + d;
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 23
Array monodimensionali
un elemento di un array può essere utilizzato in operazioni di:
• stampa Es.:
write(“%d”, A[3]);
stampa il valore da contenuto nel terzo elemento dello array A
• calcolo e assegnazione Es.:
C = A[4] ;
B= f *9 + d - A[I] ;
• condizione Es.:
if (A[I] > 7) ……
[1]
[2]
[3]
[4]
[5]
[6]
A
21 18 22 5 8
6
B=A[2] + A[4];
printf(“%d --- %d\n”, A[1], A[5]); 18 --- 21
A[1]= 7; =>
A[4]= 41;
[1]
[2]
[3]
[4]
[5]
[6]
A
21 7 22
5 41
6
=> B=22 + 8=30
Array monodimensionali
……
x = 3;
if (A[x] != 24) printf(“VERO”);
……
VERO Indici
Nome array Valori elementi array
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 25
Il tipo stringa di caratteri
• Una stringa di caratteri è una sequenza di caratteri
ASCII, atti a rappresentare una parola, una frase, un testo
• E’ un tipo strutturato costruito con l’operatore sequenza
• Una delle operazioni tipiche sulle stringhe di caratteri è la concatenazione di due o più stringhe, tipicamente
indicata con il simbolo //.
Es.
A=“calcolatore “ B=“elettronico”
C=A//B=“calcolatore elettronico”
Array Bidimensionali
tipo array Bidimensionale= cartesiano(T 1,T 2, … , T n) con T 1 = T 2 =...= T n = T
Tipo T = cartesiano (q1, q2, …, qm) q1=q2= ….. =qm
…. Ovvero un array bidimensionale è un array in cui ciascun elemento è a sua volta un array
… array tutti della stessa dimensione e tipo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 27
Array Bidimensionali
… un modello interpretativo ...
A
Nome array1 2 3 4 5 6
1 2 3 4 5 6 7
Valori dell’indice (posizione componente)
Array Bidimensionali
… la posizione di ciascun elemento è individuata da 2 indici …
… il primo indice, indica la riga …
… il secondo indice, indica la colonna ...
1 2 3 4 5 6
1 2 3 4 5
[1,1] [1,2] [1,3] [1,4] [1,5]
[2,1] [2,2] [2,3] [2,4] [2,5]
[6,1] [6,2] [6,3] [6,4] [6,5]
A[4,2]
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 29
Array Bidimensionali
… la posizione di ciascun elemento è individuata da 2 indici …
1 2 3 4 5 6
1 2 3 4 5
23 47 63 96 8
27 66 23 44 567
42 28 34 125 47
A[4,2] = 57
57
A[6,3] = 34
… il primo indice, indica la riga …
… il secondo indice, indica la colonna ...
… ciascuna posizione conterrà un (solo) valore …
Array Bidimensionali
Parametri caratterizzanti un array bidimensionale:
• Strutturali:
• Nome dello array
• Tipo componente
• Cardinalità di riga: numero di righe costituenti lo array
• Cardinalità di colonna: numero di colonne costituenti
lo array
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 31
Parametri caratterizzanti un array bidimensionale:
• di utilizzo:
• Indice di riga: appartenete ad un tipo ordinato
• Indice di colonna: appartenete ad un tipo ordinato
la coppia ordinata [indice di riga, indice di colonna] indica la posizione di un elemento nello array bidimensionale.
Gli indici possono essere espressi tramite:
• una costante (es. A[4,2], elemento in quarta riga e seconda colonna)
• una variabile (es. A[I, J], elemento in riga i-esima e colonna j-esima)
• una espressione (es. A[c+d*e, k],
(elemento dello array nella riga corrispondente al valore di c+d*e, e k-esima colonna)
Array Bidimensionali
Parametri caratterizzanti un array bidimensionale:
• di utilizzo:
• Riempimento: numero di elementi effettivamente utilizzati
• Riempimento di riga
• Riempimento di colonna
N.B. non confondere Riempimento con Cardinalità Deve sempre essere :
indice riga Cardinalità riga
indice colonna Cardinalità colonna Riempimento riga Cardinalità riga
Riempimento colonna Cardinalità colonna
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 33
Array Bidimensionali
La dichiarazione di una variabile di tipo array bidimensionale è fatta specificando:
• tipo componente
• nome dello array (nome della variabile)
• cardinalità di riga e di colonna dello array (racchiusa tra parentesi quadre)
<tipo> <nome_array_bidim> [<cardinalità_riga] [cardinalità_colonna>]
Es.:
int A[10] [15];
float Mat[7] [22];
Array Multidimensionali
… generalizzando opportunamente ….
… un array di array di array di array …. Quante sono le dimensioni
… tutti array dello stesso tipo …
… per ciascuna dimensione, tutti array con stessa cardinalità …
… posizione individuata mediante tanti indici quanti sono le dimensioni
… un indice per ciascuna dimensione ...
<tipo><nome_array_multidim>[<card_dim1] [card_dim2>] …[card_dimK]
Es.:
int A[10] [15] [20];
float Multi [7] [22] [30] [45];
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 35
Il tipo record
• Quando si vogliono rappresentare informazioni che sono collezioni di dati diversi,
– ad esempio:
• un libro è una entità composta da un titolo, un autore, un editore, il testo
• Le generalità anagrafiche di una persona: cognome, nome, data di nascita, luogo di nascita, indirizzo attuale
• Il tipo record è usato per rappresentare e gestire queste collezioni di dati,
• Il tipo record permette di raggruppare le diverse informazioni, elementari o strutturate, che caratterizzano la collezione di dati.
Il tipo record
• Il record è un tipo strutturato formato da un
predeterminato numero di campi, ciascuno dei quali può essere un tipo semplice o strutturato
• E’ un tipo strutturato costruito con l’operatore prodotto cartesiano
tipo record = cartesiano(a1:T1, a2:T2, …. , an:Tn)
dove a1, …, an sono i nomi dei campi del record
e T1, … , Tn i rispettivi tipi anche diversi tra loro
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 37
Il tipo record
• dichiarazione in LDP di un tipo record:
record <nome record>=
begin
<nome campo1> :<tipo campo1>;
……
<nome campo_n> : <tipo campo_n>;
end;
Il tipo record
Es.
record anagrafico = begin
cognome:string;
nome:string;
data_nascita: record begin
giorno:integer;
mese: integer;
anno:integer;
end;
indirizzo:string;
end;
Per indicare un campo del record si usa la notazione:
<nome record>.<nome campo>
Es. anagrafico.nome
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 39
Dichiarazione di variabili di tipo record
• E’ simile alla dichiarazione di una qualsiasi altra variabile:
<nome tipo> <nome variabile>;
Es. dichiarazione di una variabile del tipo record anagrafico:
record anagrafico persona;
“persona” è una variabile del tipo record anagrafico
Ciascuna variabile persona è composta dai campi del tipo anagrafico Es: persona.cognome
persona.nome
persona.data_nascita.mese persona.indirizzo
Tipo strutturato File
• Tipo strutturato formato da un insieme di elementi tutti dello stesso tipo
• Gli elementi sono registrati su un supporto di memoria di massa
• Individuato da un nome
• Caratterizzato da un metodo di accesso ai suoi elementi (detti genericamente records)
- File ad accesso Sequenziale - File ad accesso Diretto
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 41
Accesso sequenziale
Per accedere all' N-mo record bisogna accedere agli N-1 record precedenti (nastro)
Accesso diretto
Individuazione ed accesso diretti ad un record tramite:
- o il riferimento alla sua posizione - o i valori di uno o piu' campi (chiavi)
FILE SEQUENZIALE
• è una sequenza di oggetti tutti dello stesso tipo T …
• ..ed una ulteriore informazione di tipo T detta buffer che indicheremo con f
• la definizione è completata con le operazioni caratteristiche del tipo file sequenziale
• Operazioni possibili su un file sequenziale:
• Inserimento di un nuovo elemento (WRITEF)
• Lettura degli elementi (READF)
• Riposizionamento all’inizio del file (RESET)
• Riscrittura del file (REWRITE)
• Verifica di fine file (EOF)
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 43
operazione WRITEF(f)
• è una operazione di inserzione che modifica lo stato del file
• inserzione del valore del buffer alla fine di f; il buffer avrà valore indefinito dopo l’operazione
… prima di WRITEF(f) ...
f = f x
… dopo WRITEF (f) ...
f = f ?
a b c d
a b c d x
...una osservazione
• in ogni istante la sequenza di oggetti di un file f può essere vista come concatenazione di altre due sequenze
....una parte sinistra fs ed una parte destra fd ....
f = f
s/ f
dElementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 45
operazione READF(f)
non modifica il contenuto del file f, ma quello del buffer con un valore di f ben definito, inoltre... modifica parte ...sinistra..e destra..
f=
f ?
fs fd
… prima di READF(f)...
… dopo READF(f) ...
f f c
fs fd
Nel buffer sarà presente il primo elemento di fd
a b c d
a b c d
operazione RESET (f)
• posiziona il buffer sul primo elemento del file la parte sinistra risulterà vuota
… prima di RESET (f) ...
… dopo RESET(f) ... f =
fs fd f =
f ?
fs fd
a b c d
a b c d
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 47
f = f ?
… prima di REWRITE ...
… dopo REWRITE(f) ... f = < >
f ? operazione REWRITE (f)
• cancella gli elementi del file svuotandolo
a b c d
il predicato EOF (f)
E’ usato per verificare se si è raggiunta la fine del file EOF = End Of File
• EOF(f)
• TRUE se la parte destra della sequenza è vuota
• FALSE se non lo è
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 49
Alcune regole
Dopo un RESET sono possibili solo operazioni di READF Dopo un REWRITE sono possibili solo operazioni di WRITEF Non è possibile mescolare/alternare operazioni di WRITEF e READF Generazione di un File:
un REWRITE seguito da una o più operazioni di WRITEF Visita (ispezione/lettura) di un FILE:
un RESET seguito da una o più operazioni di READF, fino alla fine del file
File sequenziali in C
I file sequenziali in C possono essere sia File di testo che File binari Facciamo riferimento ai File di Testo
Uso della libreria <stdio.h>
Dichiarazione di una variabile File : FILE *<nome_puntatore_file>;
Es. File *agenda; // dichiara un puntatore a file di nome agenda Un file prima di poter essere elaborato deve essere ‘aperto’ ed alla fine della elaborazione va ‘chiuso’
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 51
File sequenziali in C - apertura
Apertura file :
< nome_puntatore_file > = fopen (“<nomefile>”, <modo_apertura>)
La ‘apertura’ permette di associare il < nome_puntatore_file > al file fisico
<nomefile> registrato sulla memoria di massa.
Diverse modalità di apertura, quali:
• “w” crea un file per scrivere in esso di valori; se il file già esiste esso sarà riscritto cancellando il contenuto precedente
• “r” apre il file in lettura per leggerne il contenuto
• “a” apre il file per scrivere altri valori accodandoli alla fine dello stesso
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt","w"); //apre il file Nomi.txt in scrittura
File sequenziali in C - chiusura
Chiusura file:
fclose(< nome_puntatore_file >)
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt","w"); //apre il file Nomi.txt in scrittura ... ... ...
fclose (fileNomi); // chiude il file Nomi.txt
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 53
File sequenziali in C - scrittura
Scrittura su file:
fprintf(<nome_puntatore_file>, <formato_dati>, <nomi_variabili>)
Scrive nel file puntato da <nome_puntatore_file> il/i valore/i di
<nomi_variabili> secondo il <formato_dati>
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt",“w"); //apre il file Nomi.txt in scrittura ... ...
fprintf(fileNomi,"%s", nome); // scrive il valore della stringa della // variabile nome in Nomi.txt ... ...
fclose (fileNomi);
File sequenziali in C - Lettura
Lettura da file:
fscanf(<nome_puntatore_file>, <formato_dati>, &<nomi_variabili>)
Assegna a <nomi_variabili> il/i valore/i letti nel file puntato da
<nome_puntatore_file> secondo il <formato_dati>
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt",“r"); //apre il file Nomi.txt in scrittura ... ...
fscanf(fileNomi,"%s", &nome); // legge una stringa in Nomi.txt e assgna // il valore letto alla variabile nome ... ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 55
File sequenziali in C
Funzione feof(<nome_puntatore_file>)
permette di verifcare se si è raggiunta la fine del file puntato da
<nome_puntatore_file>
Es. File *fileNomi;
fileNomi =fopen(“Nomi.txt",“r"); //apre il file Nomi.txt in scrittura ... ...
fscanf(fileNomi,"%s",&nome);
if (!feof(FileNomi)) { ... ...
fscanf(fileNomi,"%s",&nome);
... ...
}
fclose (fileNomi);
File sequenziali in C: un programma di esempio
#include <stdio.h>
#include <string.h>
main ()
// Salva nomi in un file di testo {char nome[20];
int conta=0; //conta quanti nomi sono immessi
FILE *Fnomi;
char risp ='S';
//apertura file Nomi.txt in scrittura Fnomi=fopen("Nomi.txt","w");
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 57
File sequenziali in C: un programma di esempio // verifica che il file esiste
if (Fnomi == NULL)
printf ("Il file non puo' essere aperto \n");
else
{ while ((risp=='S')||(risp=='s')) {printf("Nome: \n");
fflush(stdin);
gets(nome);
// scrive sul file il nome digitato fprintf(Fnomi,"%s \n",nome);
conta++;
printf("Vuoi inserire altri nomi?(S/N)");
scanf(“c",&risp);
} }
File sequenziali in C: un programma di esempio
//chiusura del file Nomi.txt fclose(Fnomi);
printf("\nInseriti %d nomi nel file\n", conta);
system("Pause");
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 59
File sequenziali in C:
un programma di esempio
#include <stdio.h>
#include <string.h>
main () // Legge i nomi dal file e li visualizza { int conta = 0;
char nome[20];
FILE*Fnomi;
Fnomi=fopen("Nomi.txt","r"); //apre file in lettura if (Fnomi == NULL)
printf ("Il file non puo' essere aperto \n");
else { do
{ fscanf(Fnomi,"%20s\n", &nome);
puts(nome);
conta++;}
while (!feof(Fnomi));
}
fclose(Fnomi);
printf("\nLetti %d nomi dal file\n", conta);
system("Pause");
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 61
File sequenziali in C:
un programma di esempio
#include <stdio.h>
#include <string.h>
main ()
// Legge nomi da file e li carica in un array { int conta = 0, i;
char nome[20];
struct nomi_str
{char *nome_str[20];};
struct nomi_str arr_nomi[50];
FILE*Fnomi;
Fnomi=fopen("Nomi.txt","r"); // apre in lettura if (Fnomi == NULL)
printf ("Il file non puo' essere aperto \n");
else
{ while (!feof(Fnomi)) //carica in array
{fscanf(Fnomi,"%20s\n", &arr_nomi[conta].nome_str);
conta++;}
}
File sequenziali in C:
un programma di esempio
printf("\n\nARRAY NOMI \n");
for(i=0;i<conta;i++)
printf("arr_Nomi[%d]=%s\n",i, arr_nomi[i].nome_str);
fclose(Fnomi);
system("Pause");
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 63
Esempio
Definizione del problema: Scrivere un programma che consente di salvare i dati di un array monodimensionale di interi in un file
sequenziale di testo, salvando nel file anche il valore del riempimento quale primo elemento del file. Calcolare la sommatoria degli elementi dello array.
Copiare i dati salvati nel file in un nuovo array monodimensionale di interi.
Definizione dei dati del problema:
I: gli elementi dello array Pi:nessuna
U: il file di testo con i valori dello array ed il riempimento; il nuovo array ‘caricato’ con i valori nel file
Pu: nessuna
#include<stdio.h>
main ( ) {FILE*Fmio;
int i, num, riemp=5, tot=0, riemp2;
int vett[]={1,4,7,8,11};
int vett2[15];
int a;
//apre fileint.txt in scrittura Fmio= fopen("fileint.txt","w");
//scrive valore di riemp sul primo rigo del file fprintf(Fmio,"%d\n", riemp);
Un semplice programma C per scrittura e lettura di un file sequenziale
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 65
// scrive i valori di vett sugli altri righi for (i=0;i<riemp;i++)
{ fprintf(Fmio,"%d\n", vett[i]);
// calcola sommatoria elementi array tot=tot+vett[i];
}
printf("tot = %d \n", tot);
printf("FINE SALVATAGGIO\n");
fclose(Fmio); //chiude fileint.txt
system("Pause“);
Un semplice programma C per scrittura e lettura di un file sequenziale
... cosa accade in esecuzione ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 67
// Legge il contenuto del file e riporta i valori in un // array monodimensionale di interi
printf("INIZIO CARICAMENTO\n");
//apre fileint.txt in lettura Fmio= fopen("fileint.txt","r");
fscanf(Fmio,"%d",&riemp2); // legge il primo valore dal // file e lo assegna alla // variabile riemp2
Un semplice programma C per scrittura e lettura di un file sequenziale
// verifica che non si è a fine file if (!feof(Fmio))
// legge gli altri valori dal file e li copia in vett2 {for (i=0;i<riemp2;i++)
{fscanf(Fmio,"%d", &vett2[i]);
printf("vett2[%d]=%d \n",i,vett2[i]);
}
printf("FINE CARICAMENTO\n");
}
else printf("RAGGIUNTA FINE FILE");
fclose(Fmio); //chiude fileint.txt
Un semplice programma C per scrittura e lettura di un file sequenziale
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 69
... cosa accade in esecuzione ...
// Carica da file un array di interi con ciclo WHILE Fmio= fopen("fileint.txt","r");
printf("\n\n\n Cicla su file con while (!feof)\n");
fscanf(Fmio,"%d",&riemp2);
if (!feof(Fmio)) {i=0;
fscanf(Fmio,"%d", &vett2[i]);
while (!feof(Fmio))
{printf("vett2[%d]=%d \n",i,vett2[i]);
fscanf(Fmio,"%d", &vett2[i]);
i++;
}
printf("FINE CARICAMENTO con while\n");
}
else printf("RAGGIUNTA FINE FILE");
Un semplice programma C per scrittura e lettura di un file sequenziale
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 71
// Aggiunge altri valori accodandoli alla fine del file
printf(“INIZIA ACCODAMENTO\n");
Fmio=fopen("fileint.txt","a"); // apre per accodare
// aggiunge in coda al file i valori di vett // moltiplicati per 2;
for (i=0;i<riemp;i++)
fprintf(Fmio,"%d\n", (vett[i]*2));
printf("FINE ACCODAMENTO\n");
fclose(Fmio);
Un semplice programma C per scrittura e lettura di un file sequenziale
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 73
... cosa accade in esecuzione ...
printf("LEGGE E VISUALIZZA TUTTI I VALORI NEL FILE \n");
//apre fileint.txt in lettura Fmio=fopen("fileint.txt","r");
if (!feof(Fmio)) {
//legge e assegna alla variabile a // il primo valore nel file
fscanf(Fmio,"%d", &a);
Un semplice programma C per scrittura e lettura di un file sequenziale
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 75
// cicla fino a che non si è a fine file
// e legge e visualizza gli altri valori dal file i=1;
while (!feof(Fmio)
{printf("valore n.ro %d = %d\n",i,a);
fscanf(Fmio,"%d", &a);
i++;
} }
else printf("RAGGIUNTA FINE FILE");
fclose(Fmio); //chiude fileint.txt system("Pause");
} // fine programma
Un semplice programma C per scrittura e lettura di un file sequenziale
Esempio
Definizione del problema: Scrivere un programma che consente di inserire in un array i dati di una agenda
telefonica, ovvero nome, cognome, e n.ro di telefono di una persona e di salvare poi il contenuto dello array in un file sequenziale di testo. L’agenda contiene al massimo 200 nomi
Definizione dei dati del problema:
I: nome, cognome, e n.ro di telefono
Pi: il numero degli elementi da inserire non può essere maggiore di 200
U: il file di testo con l’agenda telefonica salvata
Pu: nessuna
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 77
Esempio
Nome variabile Descrizione Tipo Cognome stringa nome stringa telefono stringa
Nome variabile Descrizione Tipo
agenda file di testo memorizzante l’agenda File Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo
????
Tabella delle variabili di algoritmo
Esempio
Descrizione del metodo di elaborazione:
…. lo studente riporti la descrizione dell’algoritmo da
utilizzare per il programma …
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 79
#include <stdio.h>
#include <string.h>
void legge(char campo[], int max) // legge una stringa // da tastiera
{ int i = 0; char c;
while ( (c=getchar())!='\n' && (i < max)) {campo[i] = c;
i++;
}
campo[i] = '\0';
}
Esempio - il programma C
main () {
const card=200;
int i, riemp;
struct persona {char nome[20];
char cogno[20];
char tel[15];
};
struct persona pers[card];
FILE*Fmio;
char risp='S';
i=0;
Esempio - il programma C
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 81
while (((risp=='S')||(risp=='s'))&&(i<card)) { fflush(stdin);
printf("Nome: \n"); legge(pers[i].nome, 20);
printf("Cognome: \n"); legge(pers[i].cogno, 20);
printf(" Tel. : \n"); legge(pers[i].tel, 20);
i++;
printf(" Vuoi inserire altre persone? (S/N) ");
risp=getchar();
}
riemp=i;
// stampa contenuto array for(i=0;i<riemp;i++) {
printf(" Cognome = %s - ",pers[i].cogno);
printf(" Nome = %s - ", pers[i].nome);
printf(" Tel = %d \n", pers[i].tel);
}
Esempio - il programma C
printf(" Vuoi salvare i dati su un file? (S/N) ");
scanf("\n%c", &risp);
if ((risp=='S')||(risp=='s')) { Fmio=fopen("agenda.txt","w");
if (Fmio == NULL)
printf ("Il file non puo essere aperto \n");
else
for(i=0;i<riemp;i++)
fprintf(Fmio,"%s %s %s\n",pers[i].cogno, pers[i].nome, pers[i].tel);
printf("Agenda Salvata \n");
Fclose(Fmio);
} else
printf("Agenda non Salvata \n");
Esempio - il programma C
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 83
Esempio - il programma C
………
// Carica lo array dell’agenda leggendo dal file {Fmio=fopen("agenda.txt","r");
if (!feof(Fmio)) { i=0;
fscanf(Fmio,"%20s %20s %15s",
&pers[i].cogno,pers[i].nome, &pers[i].tel);
while (!feof(Fmio))
{ printf(" Cognome = %20s - ",pers[i].cogno);
printf(" Nome = %20s - ", pers[i].nome);
printf(" Tel = %15s \n", pers[i].tel);
i++;
fscanf(Fmio,"%20s %20s %15s",&pers[i].cogno, &pers[i].nome, &pers[i].tel);
}
printf("FINE CARICAMENTO\n");
}
else printf("RAGGIUNTA FINE FILE");
fclose(Fmio);
}