#include #include //Variabili globali double frqmi[26], frqma[26]; //frequenze lettere minuscole e maiuscole int main(int argc, char *argv[]) { //Funzioni int leggicar(void); int leggistr(char *); void freq(char *); void visualizzafrq(); void trasla(char *, int, int); void convma(char *); void convmi(char *); //Variabili locali char menu[] = "1. Inserisci stringa.\n2. Visualizza stringa corrente.\n3. Converti in maiuscola.\n4. Converti in minuscola.\n5. Trasla.\n6. Visualizza frequenze. \n7. Esci"; char letta[BUFSIZ]; char sc; int cont = 1; //continua se == 1 int acq = 0; //stringa acquisita se acq == 1 int conv = 0; //non convertita se == 0, convertita in maiuscola se == 1, //in minuscola se == -1 int t=0; //trasla di t lettere, t >= 0 (alafabeto inglese) //Inizializzazione for (int i=0; i<26; i++) { frqmi[i]=0; frqma[i]=0; } //Menu do { printf("%s\n> ", menu); if ( (sc=leggicar()) == EOF) { printf("Errore in I/O.\n"); return -1; } switch(sc) { case '1': printf("Inserisci la stringa:\n> "); if ( leggistr(letta) < 0 ) { printf("Errore in I/O.\n"); return -1; } freq(letta); //aggiorna calcolo frequenze acq=1; conv=0; break; case '2': if (acq) printf("%s",letta); else printf("Stringa non ancora acquisita.\n"); break; case '3': if (!acq) printf("Stringa non ancora acquisita.\n"); else { convma(letta); conv=1; } break; case '4': if (!acq) printf("Stringa non ancora acquisita.\n"); else { convmi(letta); conv=-1; } break; case '5': if (!acq) printf("Stringa non ancora acquisita.\n"); else if (!conv) printf("Stringa non ancora convertita.\n"); else { printf("Di quante lettere?\n"); if (scanf("%d",&t)!=1) { printf("Errore in I/O.\n"); return -1; } getchar(); if (t>=0) trasla(letta,t,conv); else printf("Non posso procedere: valore negativo\n"); } break; case '6': visualizzafrq(); break; case '7': cont=0; break; default: printf("Scelta inesistente.\n"); break; } } while (cont); return 0; } int leggicar() { char buf[BUFSIZ]; if ( (fgets(buf, BUFSIZ,stdin)) !=NULL) return buf[0]; return EOF; } int leggistr(char *letta) { if ( (fgets(letta, BUFSIZ,stdin)) !=NULL) return 0; return -1; } void convma (char *s) { while ( (s!=NULL) && ((*s)!='\n') ) { *s=toupper(*s); s++; } } void convmi (char *s) { while ( (s!=NULL) && ((*s)!='\n') ) { *s=tolower(*s); s++; } } void freq(char *s) { double calcf(char *, char); for (int i=0; i<26; i++) { (frqmi[i])+=calcf(s,'a'+i); (frqma[i])+=calcf(s,'A'+i); } } double calcf(char *s, char c) { int count=0; int i=0; if (s==NULL) return 0; for ( ;s[i]!='\n'; i++ ) if ( s[i]==c ) count++; if (i==0) return 0; return count/(double) i; } void visualizzafrq() { int i=0; for (;i<26;i++) printf("%c/%c\t%lf\t%lf\n",'a'+i,'A'+i,frqmi[i],frqma[i]); } void trasla(char *s, int t, int minma) { if (s==NULL) return; if (minma>0) minma='A'; else minma='a'; for (int i=0; s[i]!='\n'; i++) if (isalpha(s[i])) s[i]=((s[i]-minma)+t)%26+minma; }