Fase territoriale 2005
Chicco e Spillo comunicano con dei messaggi scritti in codice per non essere scoperti.
Il loro codice funziona così: ogni vocale è rappresentata con la vocale successiva in ordine alfabetico, e ogni consonante con la consonante successiva.
La Y, che è l’ultima vocale, è rappresentata in codice dalla A, che è la prima vocale.
Allo stesso modo, la Z è rappresentata in codice dalla B.
Per le cifre il discorso è simile: ogni cifra è rappresentata dalla successiva, e 9 è rappresentato da 0.Il codice mantiene la distinzione maiuscole/minuscole.
Gli spazi e i segni d’interpunzione (compresi gli accenti) non sono modificati dal codice segreto.Aiutiamo Chicco e Spillo scrivendo un programma per codificare i loro messaggi!
Dati di input
Il file input.txt contiene un intero N nella prima riga.
Le successive N righe contengono del testo in chiaro, con al più 80 caratteri per riga.Dati di output
Il programma, leggendo il file di input, deve scrivere in output N righe contenenti il corrispondente testo in codice.
Assunzioni
- Il testo in input è composto soltanto da lettere, cifre e segni d’interpunzione.
Non ci sono caratteri accentati: al posto degli accenti, si usano gli apostrofi.- Ogni riga di testo contiene al più 80 caratteri in formato ASCII.
- L’alfabeto è quello esteso a 26 lettere: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z.
Le vocali sono A E I O U Y.
Tutte le altre lettere sono consonanti.Esempio
input.txt output.txt 2
Il cellulare di Elena e’ 338-4189961.
Ti aspetta alla stazione alle 8, VAI!Om dimmymesi fo Imipe i' 449-5290072.
Vo etqivve emme tveboupi emmi 9, WEO!Nota
- Chicco e Spillo sono due personaggi di una canzone di Samuele Bersani.
/* www.valcon.it OII 2005 - Fase territoriale - Codice segreto */ #include#include #include #include #include using namespace std; char trasforma(char c) { int minuscolo=islower(c); c=toupper(c); switch(c) { case 'A': c='E'; break; case 'B': c='C'; break; case 'C': c='D'; break; case 'D': c='F'; break; case 'E': c='I'; break; case 'F': c='G'; break; case 'G': c='H'; break; case 'H': c='J'; break; case 'I': c='O'; break; case 'J': c='K'; break; case 'K': c='L'; break; case 'L': c='M'; break; case 'M': c='N'; break; case 'N': c='P'; break; case 'O': c='U'; break; case 'P': c='Q'; break; case 'Q': c='R'; break; case 'R': c='S'; break; case 'S': c='T'; break; case 'T': c='V'; break; case 'U': c='Y'; break; case 'V': c='W'; break; case 'W': c='X'; break; case 'X': c='Z'; break; case 'Y': c='A'; break; case 'Z': c='B'; break; case '0': c='1'; break; case '1': c='2'; break; case '2': c='3'; break; case '3': c='4'; break; case '4': c='5'; break; case '5': c='6'; break; case '6': c='7'; break; case '7': c='8'; break; case '8': c='9'; break; case '9': c='0'; break; } if(minuscolo) c=tolower(c); return c; } int main() { int N; string buffer; int lung; ifstream fin ( "input.txt"); ofstream fout("output.txt"); getline(fin, buffer); N=atoi(buffer.c_str()); for(int i=1; i <= N; i++) { getline(fin, buffer); lung=buffer.length(); for(int j=0; j < lung; j++) buffer[j]=trasforma(buffer[j]); fout << buffer << endl; } return 0; }
/* www.valcon.it Fase territoriale 2005 - CODICE SEGRETO */ #include#include // atoi() #include // islower() - toupper() - tolower() #define LMAX 80 char trasforma(char c) { int minuscolo=islower(c); c=toupper(c); switch(c) { case 'A': c='E'; break; case 'B': c='C'; break; case 'C': c='D'; break; case 'D': c='F'; break; case 'E': c='I'; break; case 'F': c='G'; break; case 'G': c='H'; break; case 'H': c='J'; break; case 'I': c='O'; break; case 'J': c='K'; break; case 'K': c='L'; break; case 'L': c='M'; break; case 'M': c='N'; break; case 'N': c='P'; break; case 'O': c='U'; break; case 'P': c='Q'; break; case 'Q': c='R'; break; case 'R': c='S'; break; case 'S': c='T'; break; case 'T': c='V'; break; case 'U': c='Y'; break; case 'V': c='W'; break; case 'W': c='X'; break; case 'X': c='Z'; break; case 'Y': c='A'; break; case 'Z': c='B'; break; case '0': c='1'; break; case '1': c='2'; break; case '2': c='3'; break; case '3': c='4'; break; case '4': c='5'; break; case '5': c='6'; break; case '6': c='7'; break; case '7': c='8'; break; case '8': c='9'; break; case '9': c='0'; break; } if(minuscolo) c=tolower(c); return c; } int main() { int N; char buffer[LMAX+1]; int i,j; FILE *fin =fopen( "input.txt", "r"); FILE *fout=fopen("output.txt", "w"); fgets(buffer, LMAX, fin); N=atoi(buffer); for(i=1; i <= N; i++) { fgets(buffer, LMAX, fin); for(j=0; buffer[j]!='\0'; j++) buffer[j]=trasforma(buffer[j]); fputs(buffer, fout); } fclose(fin ); fclose(fout); return 0; }
La funzione trasforma() può essere più compatta...
char trasforma(char c) { if(isdigit(c)) { c++; if(c > '9') c='0'; } else if(isalpha(c)) { int minuscolo=islower(c); c=toupper(c); switch(c) { case 'A': c='E'; break; case 'E': c='I'; break; case 'I': c='O'; break; case 'O': c='U'; break; case 'U': c='Y'; break; case 'Y': c='A'; break; case 'Z': c='B'; break; default : { c++; if(c == 'E' || c == 'I' || c == 'O' || c == 'U' || c == 'Y') c++; } } if(minuscolo) c=tolower(c); } return c; }