Esercizi su File 1 Esercizio • Dato un file di testo chiamato dati.txt già esistente contenente uno per riga valori che rappresentano numeri relativi, scrivere un programma in linguaggio C in cui si dichiarino due struct ST1 e ST2 ciascuna con due campi a e b di tipo int e che effettua le seguenti operazioni: – scrive su video quanti valori contiene il file dati.txt; – pone nel campo a di ST1 il più grande valore contenuto in dati.txt; – pone nel campo b di ST1 il più piccolo valore contenuto in dati.txt; – pone nel campo a di ST2 la differenza fra il più grande e il più piccolo valore contenuto in dati.txt; – pone nel campo b di ST2 il prodotto fra il più grande e il più piccolo valore contenuto in dati.txt. 2 #include <stdlib.h> #include <stdio.h> typedef struct {int a, b;} ST; int main() { ST ST1, ST2; FILE *f; int val; f = fopen("dati.txt","r"); if (f==NULL) exit(-1); fscanf(f,"%d",&ST1.a); ST1.b = ST1.a; while(feof(f) == 0) { fscanf(f,"%d",&val); if(val > ST1.a) { ST1.a = val; } else if (val < ST1.b) { ST1.b = val; } } fclose(f); ST2.a = ST1.a - ST1.b; ST2.b = ST1.a * ST1.b; printf("%d %d\n\t %d %d\n", ST1.a,ST1.b,ST2.a,ST2.b); return 0; } 3 Esercizio • Dato un file di testo chiamato dati.txt già esistente contenente uno per riga valori che rappresentano numeri relativi, scrivere un programma in linguaggio C in cui si dichiarino due file F1 e F2 che esternamente si chiameranno rispettivamente dati1.txt e dati2.txt e effettua le seguenti operazioni: – – – – – scrive quanti valori contiene il file dati.txt; pone in dati1.txt gli elementi di dati.txt divisibili per 7; pone in dati2.txt gli elementi di dati.txt divisibili per 5; scrive su video quanti valori contiene il file dati1.txt; scrive su video quanti valori contiene il file dati2.txt; 4 #include <stdlib.h> #include <stdio.h> int main() { FILE *f, *f1, *f2; int val, cont=0, cont7=0, cont5=0; f = fopen("dati.txt","r"); f1 = fopen("dati1.txt","w"); f2 = fopen("dati2.txt","w"); if (f==NULL || f1==NULL || f2==NULL) exit(-1); 5 while(fscanf(f,"%d",&val) != EOF) { cont++; if(val % 7 == 0) { cont7++; fprintf(f1,"%d\n",val); } if(val % 5 == 0) { cont5++; fprintf(f2,"%d\n",val); } } printf("%d %d %d\n",cont,cont7,cont5); fclose(f); fclose(f1); fclose(f2); system("pause"); return 0; } 6 Esercizio • Scrivere un programma in linguaggio C che: – definisce due vettori P e D contenenti ciascuno 100 numeri interi; – legge da standard input una sequenza di numeri interi ed inserisce i valori pari nel vettore P e i valori dispari nel vettore D, l’operazione di lettura termina quando almeno uno dei due vettori è stato riempito; – inserisce in un file di testo denominato dati.txt i valori contenuti in P e D in modo alternato. 7 #define N 100 int main() { int P[N], D[N], i=0, j=0; do { scanf(“%d”,&temp); if(temp%2==0) { P[i]=temp; i++; } else { D[j]=temp; j++; } } while (i<N && j<N); if(i>j) { max=i; } else { max=j; } fp=fopen(“dati.txt”,”w”); for(k=0;k<max;k++) { if(k<i) fprintf(fp,”%d\n”, P[k]); if(k<j) fprintf(fp,”%d\n”, D[k]); } fclose(fp); return 0; } 8 Esercizio Scrivere un programma C che: • ha in ingresso due file denominati rispettivamente A.txt e B.txt contenenti su ogni riga un numero intero. Il numero di righe dei due file non è noto a priori ma è uguale nei due file; • definisce una matrice di nome MATRI 2 X 10 di tipo opportuno e riempie la prima riga di MATRI con gli elementi di A.txt fino al riempimento della riga o all'esaurimento dei dati letti dal file; poi riempie la seconda riga di MATRI con gli elementi di B.txt fino al riempimento della riga o all'esaurimento dei dati letti dal file; • copia in un vettore VETT gli elementi presenti nella prima riga della matrice che soddisfano i seguenti criteri: – il valore è copiato solo se è maggiore o uguale al valore corrispondente nella seconda riga della matrice; – il vettore non deve presentare buchi, ovvero deve essere riempito senza soluzione di continuità. • Il programma stampa i valori effettivamente inseriti in VETT. 9 #include <stdio.h> #include <stdlib.h> int main() { FILE *fA, *fB; int MATRI[2][10], VETT[10], el; int indR, indV, j; fA = fopen("A.txt","r"); fB = fopen("B.txt","r"); if(fA == NULL || fB== NULL) exit(-1); 10 indR=0; while(fscanf(fA,"%d",&el) != EOF && indR<10) { MATRI[0][indR] = el; indR++; } for(j=0;j<indR; j++) //fA e fB contengono lo stesso num di el fscanf(fB,"%d",&MATRI[1][j]); for(indV=0, j=0; j<indR; j++) { if(MATRI[0][j] >= MATRI[1][j]) { VETT[indV] = MATRI[0][j]; indV++; } } for(j=0; j<indV; j++) printf("%d\n",VETT[j]); fclose(fA); fclose(fB); system("pause"); return 0; } 11