java中的Caesar Cipher无法识别方法

时间:2013-10-21 08:18:26

标签: java encryption non-static

您好我的java程序问题凯撒密码: 它给了我这个错误:

CifrarioCesare.java:27: error: non-static method cripta(String,int) cannot be referenced from a static context
            c = cripta(s, spost);
                ^
CifrarioCesare.java:31: error: non-static method decripta(String,int) cannot be referenced from a static context
            c = decripta(s, spost);
                ^
2 errors

这是代码

import java.util.*;
/*
Cifrario di Cesare
*/
public class CifrarioCesare
{
public static void main(String[] args)
{
    String c;
    System.out.println(" ");
    System.out.println("\t#################################");
    System.out.println("\t####### Cifrario Di Caesar ######");
    System.out.println("\t### ........................ ###");
    System.out.println("\t############# Crypt #############");
    System.out.println("\t#################################");
    System.out.println(" ");
    Scanner t = new Scanner(System.in);
    System.out.println("> Desideri codificare o decodificare un messaggio?\n(1) Codifica\n(2) Decodifica");
    int code = t.nextInt();
    System.out.println("> Scrivi la stringa  da codificare");
    String s = t.nextLine();
    s = s.replaceAll(" ","");
    System.out.print("> Scrivi la chiave numerica intera: ");
    int spost = t.nextInt();
    if (code==1)
    {
        c = cripta(s, spost);
    }
    else if (code==2)
    {
        c = decripta(s, spost);
    }
    else
    {
        System.exit(0);
    }
    System.out.print("> Stringa criptata:\n\t" + c + "\n\n");
}

/* Cript */

public String cripta(String s, int spost) 
{
    String alfabeto = "abcdefghijklmnopqrstuvwxyz";
    String stringa = "";
    // ex: s = "ciao" -> j=4
    int j = s.length();
    int index;
    char y;
    // per i che va da zero a 4 (non compreso)...
    for (int i=0; i<j; i++)
    { // inizia ciclo for
        // se i=0, y="c".. i=1, y="i".. i=2, y="a".. i=3, y="o"
        y = s.charAt(i);
        // se y="c", string.indexOf("c") va a cercare dove quel carattere è 
        // situato nell'alfabeto. In questo caso (partendo da a=0, b=1...) 
        // il carattere "c" è uguale a 2, quindi index=2.
        /*  ---------------------
        >>> stessa cosa per le altre lettere <<<
            ---------------------     */
        index = alfabeto.indexOf(y);
        // ora inserisco in y il nuovo carattere "crittografato" perchè
        // aggiungo al carattere iniziale lo spostamento inserito dall'utente
        /* In pratica:
            Se spost=3; (con l'alfabeto semplificato)
            "c"+3="f".."i"+3="n".. ecc..    
        Il problema quel'e'? Che se la ad esempio ho "z"+3 dovrebbe essere "c", 
        ma per far questo, devo impostare un while in modo che 
        se la somma è maggiore di 27 (z=25) -> 25+3=28, e non va bene perchè la stringa alfabeto
        arriva massimo a 25, quindi se è maggiore devo cavare 26 cosicche torni entro i 25 caratteri */
        while ((index+spost)>25)
        {
            index -= 26;
        }
        y = alfabeto.charAt(index+spost);
        // infine inserisco nella nuova stringa volta per volta i nuovi caratteri
        // N.B. a+=b corrisponde ad a=a+b
        stringa += y;
    } // fine ciclo for
    // ora restituisco la stringa finale criptata
    return stringa;
}

/* Decript */

public String decripta(String s, int spost) 
{
    String alfabeto = "abcdefghijklmnopqrstuvwxyz"; 
    String stringa = "";
    // ex: s = "afjgr" -> j=5
    int j = s.length();
    int index;
    char y;
    // per i che va da zero a 5 (non compreso)...
    for (int i=0; i<j; i++)
    { // inizia ciclo for
        y = s.charAt(i);
        index = alfabeto.indexOf(y);
        while ((index-spost)<0)
        {
            index += 26;
        }
        y = alfabeto.charAt(index-spost);
        stringa += y;
    } // fine ciclo for

    // ora restituisco la stringa finale decriptata
    return stringa;
}
}

我试过在两个函数中写静态,但我遇到了主要问题。 我该怎么办? (我不想在2个文件中写或使用其他类,我想在一个独特的文件中。 如果有可能,我问你怎么做。 感谢。

1 个答案:

答案 0 :(得分:1)

在main方法中,创建一个类的实例并使用它来调用方法。

CifrarioCesare cc = new CifrarioCesare();
if (code==1){
    c = cc.cripta(s, spost);
}else if (code==2){
    c = cc.decripta(s, spost);
}