#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MAXLUN 50
#define N 26
char *LeggiNomeFile(char *mess);
void AzzeraArray(int *a);
void LeggiUnaRiga(FILE *f, char c, int *a, char primalett);
int TrovaMax(int *a);
void OutputFrequenti(FILE *f, int *a, char primalett, char sep);
void OutputMancanti(FILE *f, int *a, char primalett, char sep);
void OutputPresenti(FILE *f, int *a, char primalett, char sep);
void CompitoA(FILE *fin, FILE *fout);
void CompitoB(FILE *fin, FILE *fout);
void CompitoC(FILE *fin, FILE *fout);
void CompitoD(FILE *fin, FILE *fout);
int main(void);
char *LeggiNomeFile(char *mess) {
char temp[MAXLUN], *nome;
printf("%s", mess);
gets(temp);
nome = malloc(sizeof(char) * (strlen(temp) + 1));
strcpy(nome, temp);
return nome;
}
void AzzeraArray(int *a) {
int i;
for(i = 0; i < N; i++)
a[i] = 0;
return;
}
void LeggiUnaRiga(FILE *f, char c, int *a, char primalett) {
AzzeraArray(a);
while(c != '\n') {
if((c >= primalett) && (c < primalett + N))
a[c - primalett]++;
c = fgetc(f);
}
return;
}
int TrovaMax(int *a) {
int max = *a;
int i;
for(i = 1; i < N; i++)
if(a[i] > max)
max = a[i];
return max;
}
void OutputFrequenti(FILE *f, int *a, char primalett, char sep) {
int i, max;
int flag = 0;
max = TrovaMax(a);
for(i = 0; i < N; i++)
if(a[i] == max)
if(flag == 0) {
fprintf(f, "%c", i + primalett);
flag = 1;
} else
fprintf(f, "%c%c", sep, i + primalett);
fprintf(f, "\n");
return;
}
void OutputMancanti(FILE *f, int *a, char primalett, char sep) {
int i;
int flag = 0;
for(i = 0; i < N; i++)
if(a[i] == 0)
if(flag == 0) {
fprintf(f, "%c", i + primalett);
flag = 1;
} else
fprintf(f, "%c%c", sep, i + primalett);
fprintf(f, "\n");
return;
}
void OutputPresenti(FILE *f, int *a, char primalett, char sep) {
int i;
int flag = 0;
for(i = 0; i < N; i++)
if(a[i] != 0)
if(flag == 0) {
fprintf(f, "%c", i + primalett);
flag = 1;
} else
fprintf(f, "%c%c", sep, i + primalett);
fprintf(f, "\n");
return;
}
void CompitoA(FILE *fin, FILE *fout) {
int cont[N];
char ch;
ch = fgetc(fin);
while(feof(fin) == 0) {
LeggiUnaRiga(fin, ch, cont, 'A');
OutputFrequenti(fout, cont, 'A', ',');
ch = fgetc(fin);
}
return;
}
void CompitoB(FILE *fin, FILE *fout) {
int cont[N];
char ch;
ch = fgetc(fin);
while(feof(fin) == 0) {
LeggiUnaRiga(fin, ch, cont, 'a');
OutputFrequenti(fout, cont, 'a', ';');
ch = fgetc(fin);
}
return;
}
void CompitoC(FILE *fin, FILE *fout) {
int cont[N];
char ch;
ch = fgetc(fin);
while(feof(fin) == 0) {
LeggiUnaRiga(fin, ch, cont, 'a');
OutputMancanti(fout, cont, 'a', ';');
ch = fgetc(fin);
}
return;
}
void CompitoD(FILE *fin, FILE *fout) {
int cont[N];
char ch;
ch = fgetc(fin);
while(feof(fin) == 0) {
LeggiUnaRiga(fin, ch, cont, 'A');
OutputPresenti(fout, cont, 'A', ',');
ch = fgetc(fin);
}
return;
}
int main() {
char *infile, *outfile, compito;
FILE *fin, *fout;
do {
printf("Immetti compito su cruciverba (A/B/C/D): ");
compito = getchar();
(void)getchar();
} while((compito < 'A') || (compito >'D'));
infile = LeggiNomeFile("Immetti nome file input: ");
fin = fopen(infile, "r");
assert(fin != NULL);
free(infile);
outfile = LeggiNomeFile("Immetti nome file output: ");
fout = fopen(outfile, "w");
assert(fout != NULL);
free(outfile);
if(compito == 'A')
CompitoA(fin, fout);
else if(compito == 'B')
CompitoB(fin, fout);
else if(compito == 'C')
CompitoC(fin, fout);
else
CompitoD(fin, fout);
fclose(fin);
fclose(fout);
return 0;
}