2

こんにちは、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 つの関数で static を書き込もうとしましたが、主な問題があります。私は何をしなければならないのですか?(2つのファイルや別のクラスで書きたくないので、独自のファイルで書きたいです。可能であれば、ハウツーをお願いしています。ありがとう。

4

1 に答える 1

1

メイン メソッドで、クラスのインスタンスを作成し、それを使用してメソッドを呼び出します。

CifrarioCesare cc = new CifrarioCesare();
if (code==1){
    c = cc.cripta(s, spost);
}else if (code==2){
    c = cc.decripta(s, spost);
}
于 2013-10-21T08:36:25.453 に答える