edutecnica

Esercizio 4                     

Scrivi un programma che legga e restituisca (in chiaro) la stringa contenuta in un file e cifrata secondo il codice di Cesare.
Se il file non esiste se ne deve subito aprire uno, per permettere l'inserimento di una stringa da tastiera, da salvare nello stesso un file (preventivamente cifrata secondo il codice di Cesare). In altri termini, la nuova stringa inserita e cifrata, si sovrappone a quella vecchia.


Premesso che il codice di Cesare si basa su una traslazione del carattere che forma la parola di un numero di posizioni che può essere considerato la chiave di cifratura.
Se per semplicità assumiamo che la chiave valga 1, cioè ipotizziamo che rilevata una lettera dell'alfabeto essa debba essere commutata in quella successiva , cioè se inseriamo la 'a' deve essere restituita la 'b' e che se inseriamo 'z' debba essere restituita la 'a'; può bastare qualcosa del genere.

import java.io.*;
class cesare {
public static void main (String args []) throws IOException {
InputStreamReader input=new InputStreamReader(System.in);
BufferedReader h= new BufferedReader(input);
String s;
char ch;
int n;
System.out.print("vai:");
s=h.readLine();
s=s.toLowerCase();//stringa in minuscolo
ch = s.charAt(0);//prelevo il 1°carattere
if(ch < 'a' || ch > 'z')System.out.println("carattere non ammesso");
else{ n=(int)ch+1;//incr.il codice del carattere
if(n==123)n=97;//se inserisco 'z' restituisce 'a'
System.out.println(n+" "+(char)n);
}//fine else
}//fine main
}// fine classe

Chiaramente, elaborare una intera stringa con questo sistema non dovrebbe essere un problema:
import java.io.*;
class cesare2 {
public static void main (String args []) throws IOException {
InputStreamReader input=new InputStreamReader(System.in);
BufferedReader h= new BufferedReader(input);
String s,cry=""; //s stringa in chiaro cry stringa cifrata
char ch;
int n,i;
System.out.print("vai:");
s=h.readLine();
s=s.toLowerCase();//stringa in minuscolo
for(i=0;i < s.length();i++){
ch = s.charAt(i);
if(ch < 'a' || ch > z'){
   System.out.println("carattere non ammesso");
   break;//uscita forzosa
}else{
   n=(int)ch+1;//incremento il codice del carattere
   if(n==123)n=97;//se c'è 'z' restituisce 'a'
   cry+=(char)n;
}//fine else
}//fine for
System.out.println(cry);
}//fine main
}// fine classe

In questo caso viene stampata a video la stringa cifrata 'cry'.
Se partendo dalla stringa cifrata volessimo risalire alla stringa decifrata 'dec', stampandola a video, dovremmo usare un programma come il seguente:

import java.io.*;
class cesare3 {
public static void main (String args []) throws IOException {
InputStreamReader input=new InputStreamReader(System.in);
BufferedReader h= new BufferedReader(input);
String s,dec=""; //s stringa cifrata dec stringa decifrata
char ch; int n,i;
System.out.print("vai:");
s=h.readLine();
s=s.toLowerCase();//stringa in minuscolo
for(i=0;i < s.length();i++){
ch = s.charAt(i);
if(ch < 'a' || ch > 'z'){
   System.out.println("carattere non ammesso");
   break;
}else{
   n=(int)ch-1;//incr.il codice del carattere
   if(n==96)n=122;//se c'è 'a' restituisce 'z'
   dec+=(char)n;
}//fine else
}//fine for
System.out.println(dec);
}//fine main
}// fine classe

Adesso che siamo in possesso dei due algoritmi, quello della cifratura e quello della decifrazione possiamo scrivere il programma finale che soddisfa alle richieste del problema.

import java.io.*;
class cesare4 {
public static void main (String[] args) throws IOException{
InputStreamReader input=new InputStreamReader(System.in);
BufferedReader h= new BufferedReader(input);
char ch;
int i;
String s=""; //apertura del file
BufferedReader f=null;
try {
   f=new BufferedReader(new FileReader("cesare.txt"));
   s=f.readLine();
   f.close();
}catch (IOException e){System.err.println("errore");}
if(s!=null) {
   s=decifra(s);//decifra
   System.out.println(s);
} else System.out.println("file vuoto");
// input
System.out.print("nuova stringa:");
s=h.readLine();
s=s.toLowerCase();//stringa in minuscolo
for(i=0;i < s.length();i++){
   ch = s.charAt(i);
   if(ch < 'a' || ch > 'z'){
      System.out.println("carattere non ammesso");
      s="a";
      break;
   }//fine if
}//fine for
cifrasalva(s);
} //fine main

// -----

static String decifra(String st){
String dec=""; //dec stringa decifrata
char ch;
int n,i;
for(i=0;i < st.length();i++){
   ch = st.charAt(i);
   n=(int)ch-1;//incr.il codice del carattere
   if(n==96)n=122;//se c'è 'a' restituisce 'z'
   dec+=(char)n;
}//fine for
return dec;
}//fine decifra

// -----

static void cifrasalva(String st){
String cry="";
char ch;
int i,n;
for(i=0;i < st.length();i++){
   ch = st.charAt(i);
   n=(int)ch+1;//incr.il codice del carattere
   if(n==123)n=97;//se c'è 'z' restituisce 'a'
   cry+=(char)n;
}//fine cifraura
//salvataggio stringa cifrata
PrintWriter f=null;
try {
   f=new PrintWriter(new FileWriter("cesare.txt"));
}catch (IOException e){System.err.println("errore");
} //scrittura su file
f.println(cry);
f.close();
}//fine cifrasalva
}//fine classe