Il visualizzatore con evidenziazione non si è caricato
(manca cm6.bundle.js o dmautone-shared non è raggiungibile):
il file è mostrato come testo semplice, sempre in sola lettura.
/*** 3. Dato il file testo.txt, produrre in output:
1) Numero di vocali, numero di consonanti, numero di cifre
2) Quale è la lettera più frequente e quella meno frequente
3) La dimensione del file in byte, il numero di spazi e il numero di linee totali
4) Eseguire inoltre una copia del file di testo (nel file testo2.txt) in modo che la copia sia così
modificata:
Le cifre da 0 a 9 vanno sostituite dal carattere * (asterisco)
Le lettere da ‘A’ a ‘Z’ e da ‘a’ a ‘z’ vanno sostituite dal cancelletto e a seguire dal codice ascii
della lettera. (esempio #65 al posto di A) ***/
#include <stdio.h>
// Funzione eVocale (serve a stabilire se un carattere e' una vocale)
int eVocale(int c) {
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' ||
c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U')
return 1;
return 0;
}
// Funzione eLettera (serve a stabilire se un carattere e' nell'alfabeto)
int eLettera(int c) {
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
return 1;
return 0;
}
// Funzione posizioneMax (ritorna la posizione espressa tra 0-25 della lettera piu' frequente)
int posizioneMax(int freq[]) {
int i, indiceMax;
indiceMax = 0;
for (i = 1; i < 26; i++)
if (freq[i] > freq[indiceMax])
indiceMax = i;
return indiceMax;
}
// Funzione posizioneMin (ritorna la posizione espressa tra 0-25 della lettera meno frequente)
int posizioneMin(int freq[]) {
int i, indiceMin;
indiceMin = -1; // -1 = non ho ancora trovato nessuna lettera
for (i = 0; i < 26; i++)
if (freq[i] > 0) // cerca solo le lettere esistenti nel testo
if (indiceMin == -1 || freq[i] < freq[indiceMin])
indiceMin = i;
return indiceMin;
}
// Funzione copiaTrasformata (copia testo.txt in testo2.txt con le sostituzioni)
void copiaTrasformata() {
FILE *fin, *fout;
int c;
fin = fopen("testo.txt", "r");
fout = fopen("testo2.txt", "w"); //"w" crea il file da zero
while ((c = fgetc(fin)) != EOF) {
if (c >= '0' && c <= '9')
fputc('*', fout); // trasforma le cifre in *
else if (eLettera(c))
fprintf(fout, "#%d", c); // trasforma le lettere in # + codice ascii
else
fputc(c, fout); // copia il resto uguale
}
fclose(fin);
fclose(fout);
}
int main() {
FILE *f;
int freq[26];
int c, i, tot, spazi, righe, vocali, consonanti, cifre, ultimo;
int iMax, iMin;
// Azzeriamo tutti i contatori
vocali = 0;
consonanti = 0;
cifre = 0;
spazi = 0;
righe = 0;
tot = 0;
ultimo = 0;
for (i = 0; i < 26; i++)
freq[i] = 0;
f = fopen("testo.txt", "r");
// Un solo giro per aggiornare tutti i contatori
while ((c = fgetc(f)) != EOF) { // fgetc legge 1 carattere; EOF = fine file
tot++; // ogni carattere letto = 1 byte
ultimo = c;
if (c == ' ')
spazi++;
if (c == '\n')
righe++;
if (c >= '0' && c <= '9')
cifre++;
if (eLettera(c)) {
if (eVocale(c))
vocali++;
else
consonanti++;
if (c >= 'A' && c <= 'Z')
c = c + 32; // trasforma le maiuscole in minuscole
freq[c - 'a']++;
}
}
fclose(f);
// se il file non finisce con un \n, l'ultima riga esiste lo stesso
if (tot > 0 && ultimo != '\n')
righe++;
// 1) Visualizza il numero di vocali, consonanti e cifre
printf("Vocali: %d\n", vocali);
printf("Consonanti: %d\n", consonanti);
printf("Cifre: %d\n", cifre);
// 2) Visualizza la frequenza delle lettere
if (vocali + consonanti == 0)
printf("Non ci sono lettere nel file\n");
else {
iMax = posizioneMax(freq);
iMin = posizioneMin(freq);
printf("Lettera piu' frequente: %c (%d volte)\n", 'a' + iMax, freq[iMax]);
printf("Lettera meno frequente: %c (%d volte)\n", 'a' + iMin, freq[iMin]);
}
// 3) Visualizza la dimensione del file, gli spazi e il numero di righe
printf("Dimensione del file: %d byte\n", tot);
printf("Spazi: %d\n", spazi);
printf("Righe: %d\n", righe);
// 4) Crea la copia trasformata
copiaTrasformata();
printf("Copia modificata salvata in testo2.txt\n");
return 0;
}