Cifrario VIC

di il
13 risposte

Cifrario VIC

Salve, ho un piccolo problema con il java: non siamo fatti per stare insieme
Risate a parte, l'anno scorso mi ero imbatutto con il C e devo dire che mi trovavo abbastanza bene, quest'anno sto "studiando" il java e mi trovo malissimo (ahimè non so perchè)
Dovrei fare un esercizio, in C è semplicissimo mentre in java è un casino: dovrei realizzare il cifrario VIC (http://it.wikipedia.org/wiki/Cifrario_VI).
Il problema lo riscontro durante la verifica se due lettere sono uguali.

Vi mostro il codice:

import java.io.*;

public class vic 
{
 public static void main(String args[]) throws IOException
 {
  InputStreamReader a = new InputStreamReader(System.in);
  BufferedReader IN = new BufferedReader(a);

  String s = new String();

  int  j=0, k=0;
  
  String A = new String("et aon ris");
  String B = new String("bcdfghjklm");
  String C = new String("pq,uvwxyz.");
	  
  System.out.println("Cifrario VIC");
  System.out.print("Word to encrypt : ");
  s = IN.readLine();
  s.replaceAll(" ", "");
  s.toLowerCase();
   
  if((s.length()==0) || (s.length()==13))
  {
   System.out.println("Error data acquisition!");
   System.exit(-1);
  }
   
  System.out.print("Word encrypted: ");
  for(j=0; j<=s.length(); j++)
  {
    for(k=0; k<=A.length(); k++)
      if(A.charAt(k) == s.charAt(j))
       System.out.print(k);

     for(k=0; k<=B.length(); k++)
       if(B.charAt(k) == s.charAt(j))
	System.out.print("2"+k);

     for(k=0; k<=C.length(); k++)
      if(C.charAt(k) == s.charAt(j))
       System.out.print("6"+k);
   }
  }
}
Eclipse mi da errore durante l'esecuzione nella seguente riga:
if(A.charAt(k) == s.charAt(j))
Qualcuno per favore potrebbe aiutarmi?

13 Risposte

  • Re: Cifrario VIC

    Ciao,
    Ho visto che sei online quindi ti scrivo subito magari vedi la risposta. Ho letto il cifrario su wiki, personalmente ti consigliere di usare un switch al posto dei cicli for, e come ogni check dei case usi le lettere dell'alfabeto, che stampa il numero corispondente che gia imposti manualmente,
    esempio
    for( int i=0; i<s.length; i++ )
    {
    switch( s.charAt(i) )
    {
    case a:{ System.out.println( "3" ); break; }
    case b:{ System.out.println( "20" ); break; }
    // continui cosi per tutto l'alfabeto
    }
    }
    e potresti usare un sistema simile anche per decriptare adeguando opportunamente l'algoritmo.
    e in realta' la parte errore di acquisizione potrebbe essere anche saltata perche non verrebbe eseguito il ciclo dal momento che 0 non e' uguale a 0 quindi subito false e il programma esce immediatamente.
    Posta sempre anche il messaggio di errore che e' molto importante, ora devo installare il jdk che ho appena cambiato OS.
    ciao.
  • Re: Cifrario VIC

    Ah dimenticavo
    
     for(k=0; k<=B.length(); k++)
           if(B.charAt(k) == s.charAt(j))
           System.out.print("2"+k); // attento a questa istruzione che non si trova dentro il blocco 
                                                // del codice di esecuzione del ciclo
    // devi mettere dentro a parentesi graffe se sono piu di una istruzione
    /*
    for(k=0; k<=B.length(); k++)
    {
           if(B.charAt(k) == s.charAt(j))
           System.out.print("2"+k);
    } // cosi vengono eseguite entrambe le istruzioni
    */
    
    Quando l'istruzione di un ciclo o di una if possono essere ommesse le parentesi graffe, ma molti preferiscono metterle ugualmente per evitare casi come queste o eventuali aggiunta di righe.
  • Re: Cifrario VIC

    Ciao Lysz210, grazie per aver risposto.
    Avevo già pensato di risolvere il problema come dici tu, però verrebbe un lavoro a dir poco pessimo a cominciare dal punto di vista estetico oltre che funzionale...

    Per quanto riguarda il 2° commento:
    E' un'abitudine che mi porto dal C
    Comunque fino a quando segue una ed una sola istruzione, verrà eseguita correttamente anche senza parentesi graffe. E' una forma per rendere piu "snello" il source, niente di che...
    Per quanto riguarda l'errore, il "compilatore" emette il seguente warning:
    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 10
    	at java.lang.String.charAt(Unknown Source)
    	at vic.main(vic.java:34)
    Sembrerebbe come se non riconoscesse il charAt
    dannato java
  • Re: Cifrario VIC

    Lysz210 ho provato a farlo in C (dopo tantissimi mesi che non mi dedico né alla programmazione né al C ) e funziona alla grande

    Guarda il source:
    
    #include <stdio.h>
    
    int i=0, j=0, k=0;
    char word[16];
    char A[10] = "et aon ris";
    char B[10] = "bcdfghjklm";
    char C[10] = "pq,uvwxyz.";
     
    main()
    {
     printf("Cifrario VIC\n"
           "Word to encrypt: ");
     scanf ("%s", word);
     
     i = strlen(word);
     printf("Word encrypted : ");
     for(j=0; j<i; j++)
     {
      for(k=0; k<=9; k++)
       if(word[j] == A[k])
        printf("%d", k);
      
      for(k=0; k<=9; k++)
       if(word[j] == B[k])
        printf("2%d", k);
      
      for(k=0; k<=9; k++)
       if(word[j] == C[k])
        printf("6%d", k);
     } 
     return 0;
    }
    Non capisco per quale motivo il compilatore del C (Dev-C++) dopo averlo "tradito" ancora mi ama fancendomi funzionare sempre tutto , mentre eclipse sembra che mi odia
  • Re: Cifrario VIC

    Lysz210 ha scritto:


    Ah dimenticavo
    
     for(k=0; k<=B.length(); k++)
           if(B.charAt(k) == s.charAt(j))
           System.out.print("2"+k); // attento a questa istruzione che non si trova dentro il blocco 
                                                // del codice di esecuzione del ciclo
    // devi mettere dentro a parentesi graffe se sono piu di una istruzione
    /*
    for(k=0; k<=B.length(); k++)
    {
           if(B.charAt(k) == s.charAt(j))
           System.out.print("2"+k);
    } // cosi vengono eseguite entrambe le istruzioni
    */
    
    Quando l'istruzione di un ciclo o di una if possono essere ommesse le parentesi graffe, ma molti preferiscono metterle ugualmente per evitare casi come queste o eventuali aggiunta di righe.

    In realtà dovrebbe funzionare lo stesso: la System.out è l'unica eseguita del blocco if (anch'esso senza parentesi)mentre l'unica istruzione del ciclo for è l'if.

    Poi anch'io preferisco sempre mettere le parentesi:
    
    for(k=0; k<=B.length(); k++)
    {
           if(B.charAt(k) == s.charAt(j))
           {
                  System.out.print("2"+k);
           }
    } 
    
  • Re: Cifrario VIC

    Semplicemente devi trasformare i <= che usi in JAVA in < (in C usi < per quello esterno e <= della lunghezza - 1 per quello interno)

    Occhio che l'operatore == ti funziona solo perché charAt restituisce un tipo base (char appunto) se comparassi stringhe o comunque oggetti dovresti usaare equals.

    PS: certo che il C è meglio del JAVA non l'ho sentito dire spesso
  • Re: Cifrario VIC

    Jam3s82 ha scritto:


    In realtà dovrebbe funzionare lo stesso: la System.out è l'unica eseguita del blocco if (anch'esso senza parentesi)mentre l'unica istruzione del ciclo for è l'if.
    Gia vero, distrazione.

    Peppe93 ha scritto:


    Avevo già pensato di risolvere il problema come dici tu, però verrebbe un lavoro a dir poco pessimo a cominciare dal punto di vista estetico oltre che funzionale...
    Ma personalmente preferirei la versione con switch perche' sarebbe molto piu performante dal momento che l'iterazione sarebbe lungo esclusivamente la lunghezza della stringa da decifrare, mentre nel tuo caso a ogni iterazione viene abinato a 3 iterazioni per scorrere nella ricerca, e per quanto riguarda la bruttura sul main sarebbe facilmente risolta grazie ai vantaggi della programmazione ad oggetti creando una classe separata CifrarioVic che esegue quel compito con un metodo public void codifica( String s );
  • Re: Cifrario VIC

    Dire che C è meglio di JAVA è come dire che il Calcio è meglio del Calcetto. sono due cose diverse

    Linguaggio procedurale contro linguaggio ad oggetti (e non solo). cambia la mentalità di programmazione.

    riguardo agli errori/soluzioni, lo switch è sicuramente meglio di tanti for a prescindere ora mi leggo il resto del codice e vediamo cosa ne esce fuori
  • Re: Cifrario VIC

    Alllora l'erore che hai "chiesto" nel primo post è dovuto al fato che tu fai
    
        for(k=0; k<=A.length(); k++)
          if(A.charAt(k) == s.charAt(j))
           System.out.print(k);
    quindi è ovvio che ti dia quell'errore, perchè quando k sarà uguale ad s.length() ti troverai oltre il limite estremo della riga:

    stringa ---> C A S A
    indice----> 0 1 2 3
    length----> 4

    correggi questo e vediamo se ci sono altri errori
  • Re: Cifrario VIC

    Grazie a tutti per avermi aiutato a risolvere il problema.
    Dovevo semplicemente modificare il <= con < . Sono stato uno sciocco a non pensarci

    zaknafein83 ha scritto:


    dire che C è meglio di JAVA è come dire che il Calcio è meglio del Calcetto. sono due cose diverse
    Sinceramente non ho mai detto che il C è migliore del Java, ma solamente che mi trovo meglio con il C. Entrambi hanno pregi e difetti, sappiamo tutti che è impossibile trovare la perfezione...
    Quando mi sono avventurato nella programmazione ho iniziato con il Perl (mi sono trovato benissimo, un linguaggio molto potente e molto semplice), poi ho iniziato con il C (sinceramente non mi piaceva moltissimo, preferivo il Perl, però in seguito grazie ad una persona che ho conosciuto su un forum sono riuscito ad apprezzarlo moltissimo).
    In Java mi applico ma non capisco perchè non riesco a concludere mai niente, forse il motivo è che non mi piace come linguaggio di programmazione in sè
    Ringrazio ancora tutti quelli che mi hanno aiutato.
    Buon pomeriggio
  • Re: Cifrario VIC

    Peppe93 ha scritto:


    In Java mi applico ma non capisco perchè non riesco a concludere mai niente, forse il motivo è che non mi piace come linguaggio di programmazione in sè
    Ci vuole un po di pazienza, io ho dato solo una letta a mezzo manuale di C fermandomi ai puntatori, e non sono molto pratico, e in questo periodo sto' cercando di trasformare un programma in C in C#( il programma tratta di rete neurali ), e ho il problema inverso al tuo, non riesco a capire molto la logica di programmazione del C. Se ti scrivo in privato riusciresti a darmi una mano?? Il problema e' che non ho appena iniziato C#, e reti neurali e' un argomento molto complesso, e se riesci a darmi una mano per trasformarlo in java mi risulterebbe piu' facile in seguito esportarlo in c#.
  • Re: Cifrario VIC

    @Lysz210
    ti posso aiutare nel codare qualcosa in C, però ti anticipo che sono un po arrugginito con la programazzione in generale e che per quanto riguarda la nn (neural network) è un argomento che non ho potuto ancora affrontare sia per mancanza di tempo che di voglia.
    Comunque mandami un pm e ci sentiamo quando vuoi tu

    p.s.: se non mi sbaglio qualche anno fa un certo BlackLight aveva codato qualcosa riguardo le nn.
  • Re: Cifrario VIC

    Ok grazie
Devi accedere o registrarti per scrivere nel forum
13 risposte