[Un mio programma Java] Scofield i suoi origami e i messaggi in codice.., Perchè non scriveril senza difficoltà? :)

« Older   Newer »
  Share  
view post Posted on 2/9/2009, 12:58
Avatar

Uomo libero

Group:
Member
Posts:
10,796

Status:


Come detto nella mia presentazione, studio Java, e seguo da sempre PB.

NOTA: Descrizione ed introduzione li ho copiati dal commento nel codice sorgente del programma che avevo scritto!

  • Introduzione:

  • Il seguente programma è stato scritto basandosi sulla seconda stagione di Prison Break, in cui Michael Scofield (impersonato da Wentworth Miller), cifra su un origami a forma di gru del testo destinato alla dottoressa Sara Tancredi. Il primo origami contiene tre righe di puntini, separati da spazi. Gli altri 3 origami contengono un apparente numero telefonico disabilitato.
  • Descrizione:

  • Il programma cifra una frase lunga N caratteri utilizzando il procedimento di Scofield.
    Ogni riga di puntini deve essere abbinata al numero disattivato corrispondente.
    Il numero disattivato indica i tasti del cellulare, quindi ogni numero indica un preciso tasto; i puntini indicano la posizione della lettera su quel tasto.

Dopo questa introduzione e alla descrizione del programma posso passare al come esegurlo!
Non preoccupatevi del sistema operativo che state utilizzando perchè è scritto in Java, quindi non avrete problemi ad eseguirlo.

Una volta scaricato il pacchetto zippato, lo dovete estrarre. Ora avete una cartella con al suo interno 3 file: uno il .bat una è l'immagine ed uno il Jar. Spostate la cartella nel suo insieme, non spostate nessun file! ;) (altrimenti in caso fosse l'immagine non verrebbe visualizzata).

Per quelli che non si fidano: nel .bat ci sono 2 righe, potrete controllare voi stessi, una è il comando java (che indicherò li sotto), e l'altra è @pause>null in modo da non far comparire la riga dal DOS.
Il programma può essere eseguito su tutti i sistemi con la JVM installata (sarebbe nella cartella in programmi denominata JRE).
Come ho detto li, chi utilizza windows consiglio il file bat, in modo che venga eseguito senza dover digitare comandi dal DOS.

Chi non usa windows deve fare la seguente operazione:
Aprire il terminale, o DOS: (start > esegui > cmd)

e scrivere:

CODICE
cd c:\


Ovviamente in caso sia ubuntu, dovrete mettere Scrivania

Prendere il file JAR e metterlo in C\:

Ora digitare il seguente comando:
CODICE
java -jar ProgettoScofield.jar


Se avete un problema di qualsiasi tipo segnalatelo qui ;)

Per vedere il file cifrato sotto windows è necessario aprirlo con WordPad. Quindi tasto destro > apri con.. wordpad ;)

Provatelo e poi ditemi che ne pensate..dalle vostre impressioni, miglioramenti..ecc..tutto quello che volete!! :D

EDIT:

Nuova Versione!



Ho aggiornato anche le istruzioni!! ;)

Edited by RootkitNeo - 19/9/2009, 21:21

Download attachment
ProgettoScofield.zip ( Number of downloads: 41 )

 
Web Contacts  Top
Rod
view post Posted on 2/9/2009, 14:42




Pazzesco!!! I miei più sentiti complimenti! :applausi:
 
Top
view post Posted on 2/9/2009, 16:43
Avatar

Uomo libero

Group:
Member
Posts:
10,796

Status:


CITAZIONE (Rod @ 2/9/2009, 15:42)
Pazzesco!!! I miei più sentiti complimenti! :applausi:

Grazie!! :D
 
Web Contacts  Top
¬Rikudou
view post Posted on 4/9/2009, 16:59




Niente male bravo ^_^
 
Top
view post Posted on 6/9/2009, 13:59
Avatar

Uomo libero

Group:
Member
Posts:
10,796

Status:


Ah..siccome l'ho scritto su Ubuntu Linux ci sono dei problemi con la codifica dei caratteri. Teoricamente si dovrebbero vedere una riga di numeri e una di puntini, ma su Win ho visto che aprendolo con il notepad non è così.

Aggiornato il primo post con il codice sorgente.

Per aprirlo e vedere il file cifrato come dev'essere usate WordPad
 
Web Contacts  Top
zappone12345
view post Posted on 11/9/2009, 21:38




uau sei bravo complimenti
 
Top
view post Posted on 19/9/2009, 20:29
Avatar

Uomo libero

Group:
Member
Posts:
10,796

Status:


Ho scritto la nuova versione!
Ora per l'input ci sono le finestrelle, da messaggi tramite le finestrella grafiche..e c'è la foto di Scofield! ;)

Metto il codice in questo post casomai qualcuno fosse interessato..


SPOILER (click to view)
CODICE
/*
 La versione 0.8 Beta del programma ha superato i test ed è stata aggiornata in modo sufficiente, la versione attuale è la 1.0.
 
   Introduzione:
        Il seguente programma è stato scritto basandosi sulla seconda stagione di Prison Break, in cui Michael Scofield
        (impersonato da Wentworth Miller), cifra su un origami a forma di gru del testo destinato alla dottoressa Sara
        Tancredi. Il primo origami contiene tre righe di puntini, separati da spazi. Gli altri 3 origami contengono
        un apparente numero telefonico disabilitato.
     
    Descrizione:
        Il programma cifra una frase lunga N caratteri, utilizzando il procedimento di Scofield.
        Ogni riga di puntini deve essere abbinata al numero disattivato corrispondente.
        Il numero disattivato indica i tasti del cellulare, quindi ogni numero indica un preciso tasto; i puntini indicano
        la posizione della lettera su quel tasto.
 
 Version: 1.0
 
 Ulteriori aggiornamenti saranno: Controllo caratteri accentati (V). Successivamente output su file (V),
 e a seguire input da file.
 Al momento il programma non gestisce gli "Invio" nel testo.
 
 Copyright (c) Marco "RootkitNeo" 2748355274.
 ja091690MN
 
 Il seguente programma è distrubuito entro i termini della licenza GNU/GPL.
 
 Aggiunta: Lettera prima parola maiuscola, abbellimenti con swing
*/

import java.io.*;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;

// Se si utilizza la classe ricordarsi di gestire nel main il carattere maiuscolo o minuscolo
// e gli spazi tra i caratteri

class BetaScofield  {
 private String caratteri_cell[] = { " ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
 private int contatore=0;
 private String dot="", number="";
 
 // cifra la frase in input
 void cifra(String input) throws IOException {
   
   BufferedWriter file_n = new BufferedWriter(new FileWriter("TxtScofieldCrypt.txt")); // file contenente i numeri
   
   boolean enter=true; // controllo quando entro nel while
   
   // conta la stringa
   for(int i=0; i<input.length(); i++) {
     char ch = (input.charAt(i)=='è')||(input.charAt(i)=='é') ? 'e' : input.charAt(i);
     contatore++;
     
     if(ch<97||ch>122) {
       continue;
     }
     
     // controllo ogni elemento dell'array in modo da abbinarli al carattere corrispondente
     for(int j=2; j<caratteri_cell.length; j++) {
       String temp = caratteri_cell[j];
       
       // controllo ogni carattere dell'elemento
       for(int k=0; k<temp.length(); k++) {
         if(temp.charAt(k)==ch) {
           number+=j;
           int t=k;
             
           while((t+1)>0) {
             dot+=".";
             t--;
             enter=false;
           }
         }
         else {
           continue;
         }
       }
     }
   
     if(!enter) dot+=" ";
     
     if(contatore==10||i==input.length()-1) {
       number+="n";
       // scrivo i numeri
       file_n.write(number);
       dot+="n";
       
       // scrivo i puntini
       file_n.write(dot);
       contatore=0;
       number="";
       dot="";
     }
   }
   
   // chiudo il file
   file_n.close();
   
 }
 
 // Metodo che decodifica il file
 void decifra() throws IOException {
   FileReader fr; // flusso che conterrà il file
   BufferedReader br; // flusso che leggerà dal file attraverso readLine()
   
   // In caso il file non si trovi nella stessa directory viene sollevata
   // un eccezione che lancio al main()
   try {
     fr = new FileReader("TxtScofieldCrypt.txt");
     br = new BufferedReader(fr);
   } catch(FileNotFoundException e) {
     throw e;
   }
   
   // flusso che scrive su di un file
   FileWriter fw = new FileWriter("Prova.txt");
   
   // contatore: conta i puntini, e quindi la posizione della lettera corrispondente
   // k: fa scorrere i caratteri della stringa di puntini.
   int contatore=0, k=0;
   
   do {
     // riga di numeri e di puntini.
     number = br.readLine();
     dot= br.readLine();
     
     if(number!= null) {
       // ciclo che scorre tutta la stringa di numeri
       for(int i=0; i<number.length(); i++) {
         char ch_n = number.charAt(i);
         
         // conto i caratteri '.'
         while((dot.charAt(k)=='.')&&(dot.length()>k)) {
           contatore++;
           k++;
         }
         k++;
         
         // prendo il numero del tasto e lo metto nell'array in modo da avere quel gruppo di lettere
         String tasto_cell = caratteri_cell[Character.digit(ch_n, 10)];
         // prendo l'occorrenza del carattere.
         String lettera =""+ tasto_cell.charAt(contatore-1);
         fw.write(lettera);
       
         lettera="";
         contatore=0;
       }
       k=0;
     }
   } while(number!=null);
   
   // chiudo il file di lettura
   fr.close();
   // chiudo il file di scrittura
   fw.close();
 }
}

class ProgettoScofield {
 public static void main(String args[]) throws IOException {
 
   
   // Flusso per scrivere su console
   PrintWriter pw = new PrintWriter(System.out, true);
   
   // Istanzio la classe - creo un oggetto
   BetaScofield bs = new BetaScofield();
   
   String str="";
   Object possible_values[] = {"1","2"}; // Scelte che compaiono nel menù a tendina
   
   int ch1=0;
   long start, end;
   
   // Apro una finestra grafica che comunica all'utente il messaggio.
   JOptionPane.showMessageDialog(null,"<html>Programma scritto da RootkitNeo.<br>Il seguente programma è distribuito entro i termini della licenza"+
   " GNU/GPL.<br><br>Per una corretta visualizzazione dell'immagine Scofield, lasciarla nella stessa cartella del programma.<br><br>"+
   "Per non avere problemi nella visualizzazione del file cifrato (per chi si trova su win) è necessario aprire il file con l'applicazione WordPad</html>");
   
   do { // Apro una finetra grafica che riceve l'input e fa uso di un'icona personalizzata e del menù a tendina.
     Object ch = JOptionPane.showInputDialog(null,"n<html>Inserisci il numero corrispondente all'operazione desiderata:<ol><li>Cifra una frase con il metodo Scofield.</li><li>Decifra un file di testo con il metodo Scofield.</li></ol></html>","Scegli il numero corrispondente",JOptionPane.QUESTION_MESSAGE,new ImageIcon("Scofield.jpg"),possible_values,possible_values[0]);
     try {
       String p = ch.toString();
       ch1 = Integer.parseInt(p);
     } catch(NullPointerException e) { // si verifica quando si preme 'Annulla'
       JOptionPane.showMessageDialog(null,"L'operazione è stata annullatanIl programma sarà terminato.","Operazione annullata!",JOptionPane.WARNING_MESSAGE);
       break;
     }
   } while(ch1 < 1 || ch1 > 2);
   
   
   switch(ch1) {
     case 1:
     String str1="", input="";
     
     str = JOptionPane.showInputDialog("Inserisci la frase/testo da codificare secondo Scofield:","Rendezvous sundown hotel gila nm");
     try {
       // converto la stringa in minuscolo, se è presente.
       input = str.toLowerCase();
     } catch(NullPointerException e) { // si verifica se viene premuto annulla
       JOptionPane.showMessageDialog(null,"L'operazione è stata annullatanIl programma sarà terminato.","Operazione annullata!",JOptionPane.WARNING_MESSAGE);
       break;
     }
   
     // ciclo che toglie gli spazi e l'apostrofo
     for(int i=0; i<input.length(); i++) {
       str1 += (input.charAt(i)==((char)39))|| (input.charAt(i)==((char) 32)) || (input.charAt(i)==((char)44)) || (input.charAt(i)==((char)46)) || (input.charAt(i)==((char)58)) || (input.charAt(i)==((char)59)) || (input.charAt(i)==((char)45)) ? "" : input.charAt(i);
     }
     
     // calcolo il tempo impiegato per l'esecuzione di questa operazione.
     start = System.currentTimeMillis();
     bs.cifra(str1);
     end = System.currentTimeMillis();
     
     pw.println("nnLa tua frase e' stata scritta e salvata con successo nei file 'TxtScofieldCrypt.txt'.nn"+
                "Per il corretto funzionamento di un eventuale decodifica, lasciare il file presente nella stessa directory del programma JAR.nn"+
                "Questo e' necessario, visto che il programma cerca il file da decodificare nella directory da dove e' stato eseguito.nn"+
                "Il tempo Impiegato nella codifica e': " + (end-start) + " ms");
     break;
     case 2:
     pw.println("nIl file di default che verra' decodificato e' 'TxtScofieldCrypt.txt'.n");
     try {
     
       // ottengo il tempo di elaborazione di questo compito
       start = System.currentTimeMillis();
       bs.decifra();
       end = System.currentTimeMillis();
       
       pw.println("nL'operazione e' stata eseguita correttamente.nn"+
                  "Il tempo di esecuzione e' : " + (end-start) + " ms");
       
     } catch(FileNotFoundException e) {
       JOptionPane.showMessageDialog(null,"nL'errore riscontrato e' di tipo FileNotFoundExceptionnn"+
                  "Il file 'TxtScofieldCrypt.txt' non si trova nella directory corrente.nn"+
                  "Spostare il file nella directory corrente in modo da poter convertire il file nel formato originario.n",null,JOptionPane.ERROR_MESSAGE);
     }
     break;
   }
   System.exit(0);
 }
}
 
Web Contacts  Top
6 replies since 2/9/2009, 12:58   948 views
  Share