#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define MAXLUN 50
#define N 26

/* prototipi */
	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;
}