• Non ci sono risultati.

il file di testo con l’agenda telefonica salvata Pu: nessuna

Nel documento Array monodimensionali in C (pagine 88-102)

File sequenziali in C - Lettura

U: il file di testo con l’agenda telefonica salvata Pu: nessuna

Elementi di Informatica

Esempio

Nome variabile Descrizione Tipo Cognome Cognome persona stringa nome Nome persona stringa telefono N.ro telefono persona 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

????

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 177

Esempio

Descrizione del metodo di elaborazione:

…. lo studente riporti la descrizione dell’algoritmo da utilizzare

per il programma …

#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

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 179

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 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); }

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 181

fflush(stdin);

printf(" Vuoi salvare i dati su un file? (S/N) "); scanf("%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 183

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; lo array ‘caricato’ con i valori nel file, la sommatoria degli elementi dello array

Pu: nessuno

… lo studente definisca tabelle del dizionario dati e descrizione dell’algoritmo ….

Elementi di Informatica

#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);

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 185

// 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

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 187

Esempio

Definizione del problema: Scrivere un programma che consente di leggere

dati da un file sequenziale ed inserirli un array monodimensionale di interi. Aggiungere in coda al un file sequenziale nuovi valori uguali al doppio di quelli contenuti nello array.

Definizione dei dati del problema:

I: il file di testo con i valori dello array ed il riempimento Pi:nessuna

U: il nuovo array ‘caricato’ con i valori aggiunti nel file Pu: nessuna

… lo studente definisca tabelle del dizionario dati e descrizione dell’algoritmo ….

Elementi di Informatica

// Carica da file un array di interi con ciclo WHILE

printf("\n\n INIZIO CARICAMENTO \n");

Fmio=fopen("fileint.txt","r"); //apre fileint.txt in lettura

if (!feof(Fmio))

{ i=0;

while (!feof(Fmio)) // cicla fino a fine file

{fscanf(Fmio,"%d", &vett2[i]); // legge valori in vett2

i++; }

printf("FINE CARICAMENTO \n"); }

else printf("RAGGIUNTA FINE FILE");

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 189

printf("\n\n STAMPA VALORI CARICATI IN ARRAY \n\n"); riemp2=i;

for(i=0;i<riemp2;i++) //stampa valori caricati in vett2

printf("vett2[%d]=%d\n",i,vett2[i]);

// Aggiunge altri valori accodandoli alla fine del file

printf("\n\n INIZIA ACCODAMENTO\n\n");

Fmio=fopen("fileint.txt","a"); // apre per accodare

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

{fprintf(Fmio,"\n%d", (vett2[i]*2));

// accoda i valori di vett // moltiplicati per 2;

printf("Valore accodato = %d \n",(vett2[i]*2)); }

printf("\nFINE ACCODAMENTO\n"); fclose(Fmio);

printf("\n\n LEGGE TUTTI I VALORI NEL FILE E LI STAMPA A VIDEO\n");

Fmio=fopen("fileint.txt","r"); //apre fileint.txt in lettura

if (!feof(Fmio)) { i=0;

while (!feof(Fmio)) // cicla fino a fine file

{fscanf(Fmio,"%d", &a); // legge i valori dal file

printf("valore n.ro %d = %d\n",i,a); i++;

} }

else printf("RAGGIUNTA FINE FILE");

fclose(Fmio); //chiude fileint.txt

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 191

... cosa accade in esecuzione ...

Elementi di Informatica

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. L’agenda contiene al massimo 200 nomi. Inoltre il programma deve:

• Salvare l’agenda su un file di testo

• Caricare l’agenda dal file in un nuovo array

• Ordinare l’agenda alfabeticamente rispetto al cognome. • Stampare l’agenda prima e dopo l’ordinamento.

• Salvare l’agenda ordinata sul file di testo

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 193

Esempio

... Lo studente definisca il dizionario dei dati e l’algoritmo che intende usare ...

#include <stdio.h> #include <string.h> typedef struct {char nome[20]; char cogno[20]; char tel[15]; } PERSONA;

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 195

// prototipo procedure per leggere una stringa da tastiera

void legge(char campo[], int max);

// prototipo procedure per immettere i dati nello array di struct

void riempiarraystruct(PERSONA pers[],int *riemp, int card);

// prototipo procedure per stampare lo array di struct

void stampaarraystruct(PERSONA pers[], int riemp);

// prototipo della procedure per ordinare lo array di struct

void ordinaAgenda(PERSONA person[], int card);

// prototipo procedure per salvare il contenuto dello array di // struct in un file di testo

void scrivifile(int riemp, PERSONA pers[]):

// prototipo procedure per riportare il contenuto di un file

// sequenziale in un array di struct

void leggifile(int riemp, PERSONA pers2[]);

Elementi di Informatica

main ()

{const card=200; int i, riemp;

PERSONA persone[card]; //persone: array di struct da // salvare su file di testo PERSONA persone2[card]; //persone2: array di struct da

// caricare dal file di testo char risp='S';

// inserimento dati nello array persone riempiarraystruct(persone, &riemp, card); // stampa contenuto array persone

stampaarraystruct(persone, riemp);

printf(" Vuoi salvare i dati su un file? (S/N) "); scanf("\n%c", &risp);

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 197

if ((risp != 'S')||(risp != 's'))

printf("Agenda non Salvata!! FINE PROGRAMMA \n"); else

{scrivifile(riemp, persone); //salva array sul file di testo //Carica persone2 leggendo dal file i dati dell’agenda leggifile(riemp, persone2);

// stampa contenuto array persone2 stampaarraystruct(persone2, riemp);

// ordina contenuto array persone2 e lo salva sul file ordinaAgenda(persone2, riemp);

scrivifile(riemp, persone2);

printf("\n\n STAMPA AGENDA ORDINATA \n\n"); stampaarraystruct(persone2, riemp);

}

system("Pause"); }

// procedura per leggere una stringa da tastiera void legge(char campo[], int max)

{ int i = 0; char c;

while ((c=getchar())!='\n' && (i < max)) {campo[i] = c;

i++; }

campo[i] = '\0'; }

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 199

// procedure per immettere i dati nello array di struct

void riempiarraystruct(PERSONA pers[],int *riemp, int card) { char risp='S'; int i=0; 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, 15); i++;

printf(" Vuoi inserire altre persone? (S/N) "); risp=getchar();

}

*riemp=i; }

Elementi di Informatica

// procedure per stampare lo array di struct

void stampaarraystruct(PERSONA pers[], int riemp) {int i;

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

{ printf(" Cognome = %s - ",pers[i].cogno); printf(" Nome = %s - ", pers[i].nome); printf(" Tel = %s \n", pers[i].tel); }

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 201

void ordinaAgenda(PERSONA person[], int card)

// ordina lo array di struct contenente i dati della agenda

{PERSONA swap; int i, k; for(i=0;i<card-1;i++) for(k=i;k<card;k++) { if(strcmp(person[i].cogno,person[k].cogno)>0) { swap=person[i]; person[i]=person[k]; person[k]=swap; } }

void scrivifile(int riemp, PERSONA pers[])

//salva il contenuto dello array di struct in un file di testo

{FILE *Fm; int i;

Fm = fopen("agenda.txt","w"); if (Fm == NULL)

printf ("Il file non puo’ essere aperto \n"); else { for(i=0;i<riemp;i++) fprintf(Fm,"%20s %20s %15s\n",pers[i].cogno, pers[i].nome, pers[i].tel); printf("Agenda Salvata \n"); fclose(Fm); } }

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 203

void leggifile(int riemp, PERSONA pers2[])

{//Caricacontenuto del file sequenziale in un array di struct FILE *Fmio;

int i;

printf("\n\n LEGGE DAL FILE E CARICA IN ARRAY \n\n"); Fmio=fopen("agenda.txt","r"); if (!feof(Fmio)) { i=0; do {fscanf(Fmio,"%20s %20s %15s", &pers2[i].cogno, pers2[i].nome, &pers2[i].tel); i++; } while (!feof(Fmio)); printf("FINE CARICAMENTO\n"); }

else printf("RAGGIUNTA FINE FILE"); fclose(Fmio);

}

Definizione del problema:

Scrivere un programma per gestire le seguenti operazioni da eseguirsi sui dati di una agenda telefonica memorizzata in un file di testo:

• Creazione dell’agenda ed inserzione in essa del cognome, nome e numero di telefono di una persona

• Stampa/visualizzazione del contenuto della agenda • Aggiunta di nuovi nomi nell’agenda

• Ricerca dei dati di una persona fornendone il cognome

• Cancellazione di un contatto nell’agenda fornendone il cognome • Ordinamento della agenda in modo crescente rispetto al cognome

... Con sottoprogrammi ...

Nel documento Array monodimensionali in C (pagine 88-102)

Documenti correlati