Szyfr Cezara.

0
Scanner skaner = new Scanner(System.in);
        System.out.println("Co mam zaszyfrowac: ");
        String haslo = skaner.nextLine(); //haslo
        System.out.println("Ile przesunac: ");
        int a = skaner.nextInt(); //przesuniecie
        
        
        
       
        char[] tab = haslo.toCharArray();
        //System.out.println(tab[5]);
        
        for(int i=0;i<=tab.length();i++)

co jest nie tak z tab.length?

5

length to właściwość, a nie metoda.
Ale oczywiście patrzyłeś do dokumentacji, szukałeś w internecie i nic tam nie było...

Masz także błędny warunek pętli.

0

Nie rozumiem o co chodzi ze złym warunkiem pętli.

for(int i=0;i<=tab.length;i++){
    if(tab[i]>=97 && tab[i]<=122-a) 
        tab[i]=tab[i+a]; //małe liter
    else if(tab[i]>=123-a && tab[i]<=122) 
        tab[i]=tab[i-26+a]; //małe litery
}
        System.out.println(haslo);
1

Tablica o liczbie elementów n jest indeksowana od 0 do n-1, pomyśl jak ma się to do Twojej pętli.

0

Nie chce zatrybić.. Można prosić bardziej obrazowo?

1

Napisz mi wartości, jakie będzie przyjmować iterator i wewnątrz pętli, jeśli rozmiar tablicy (tab.length) będzie równy 5 i porównaj je z tym, co napisałem wyżej.

0

od 0 do 4 ;

for(int i=0;i<tab.length;i++)

?

1

No, teraz jest już ok ;-)

0

Możesz mi jeszcze to rozjaśnić?

for(int i=0;i<tab.length;i++){
    if(tab[i]>=97 && tab[i]<=122-a) 
        tab[i]=tab[i+a]; //małe liter
    else if(tab[i]>=123-a && tab[i]<=122) 
        tab[i]=tab[i-26+a]; //małe litery
}
        System.out.println(haslo);
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
	at zadanieMetodyNumeryczne.Cezar.main(Cezar.java:37)
0

Możliwe że tutaj:

tab[i]=tab[i+a]; //małe liter

albo tutaj:

tab[i]=tab[i-26+a]; //małe litery

Wychodzisz po za zakres tablicy.

0

Chcialem wykorzystac kod ASCII. Czy to w ogole ma jakikolwiek sens? Jesli tak, to jak to poprawic?

1

Ma sens generalnie, ale musisz odnosić się do znaków, a nie indeksów tablicy.

0

Zrobiłem to inaczej. Nic tu nie jest jeszcze dopracowane. Zastanawiam się nad zaznaczonym fragmentem.

package zadanieMetodyNumeryczne;

import java.util.Scanner;

/**
 *
 * @author Z710
 */
public class cezarv2 {
    public static void main(String[] args){
        
        
        char[] alfabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char[] przerobka = new char[100];
        
        
        
        Scanner skaner = new Scanner(System.in);
        System.out.println("Czas wybierać: 1-szyfrowanie, 2-deszyfrowanie :");
        int wybor = skaner.nextInt();
        for(;wybor!=1 && wybor!=2;){
            System.out.println("Wbierz 1 lub 2, cwaniaczku : ");
            wybor = skaner.nextInt();
            
        }
        System.out.println("Co mam zaszyfrowac/deszyfrowac: ");
        String haslo = skaner.nextLine(); //haslo    //dlaczego w tym miejscu nie pobiera ?
        haslo=skaner.nextLine();                          // i potrzebne jest jeszcze to?
        System.out.println("Ile przesunac: ");
        int a = skaner.nextInt(); //przesuniecie
        
        
        //char[] tab=new char[50];
       
        char[] tab = haslo.toCharArray();
        //System.out.println(tab[5]);
    switch(wybor){
        case 1:
            for(int i=0;i<tab.length;i++){
                for(int j=0;j<alfabet.length;j++){
                    if(tab[i]==alfabet[j]){
                        if(j+a<alfabet.length)
                            przerobka[i]=alfabet[j+a]; //małe litery
                        else if(j+a>alfabet.length)
                            przerobka[i]=alfabet[j-a];
                
    }
    //else if(tab[i]>=123-a && tab[i]<=122) 
        //tab[i]=tab[i-26+a]; //małe litery
            }
    
        }
        System.out.println(przerobka);
        break;
        
        case 2: // deszyfrowanie
            for()
            
    }

    }
}
1

Powoli, powoli.
Wyrzuć ten kod i zrób tak: utwórz tablicę (czy tam stringa) zawierającego znaki hello i przesuń każdy z tych znaków o jeden ASCII w prawo (+1).

0

Później pokombinuje z tym ASCII. Jak to się prezentuje? (oczywiscie nie chodzi mi o wytykanie braku polskich znakow, wielkich liter, mozliwosci wylozenia sie programu) Widać tu jakieś poważniejsze błędy?

char[] alfabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char[] przerobka = new char[100];
        
        
        
        Scanner skaner = new Scanner(System.in);
        System.out.println("Czas wybierać: 1-szyfrowanie, 2-deszyfrowanie :");
        int wybor = skaner.nextInt();
        for(;wybor!=1 && wybor!=2;){
            System.out.println("Wybierz 1 lub 2, cwaniaczku : ");
            wybor = skaner.nextInt();
            
        }
        System.out.println("Co mam zaszyfrowac/deszyfrowac: ");
        String haslo = skaner.nextLine(); //haslo
        haslo=skaner.nextLine();
        System.out.println("Ile przesunac: ");
        int a = skaner.nextInt(); //przesuniecie
       
        char[] tab = haslo.toCharArray();
   
            for(int i=0;i<tab.length;i++){
                for(int j=0;j<alfabet.length;j++){
                    if(tab[i]==alfabet[j]){
                        if(j+a<alfabet.length)
                            switch(wybor){
                        case 1:
                            if(j+a<alfabet.length)
                            przerobka[i]=alfabet[j+a]; 
                        else if(j+a>alfabet.length)
                            przerobka[i]=alfabet[j-a];
                        case 2:
                            if(j+a<alfabet.length)
                            przerobka[i]=alfabet[j-a];
                        else if(j+a>alfabet.length)
                            przerobka[i]=alfabet[j+a];
                        }
                    }

                }
    
            }
        System.out.println(przerobka);
1

Widać tu jakieś poważniejsze błędy?

1.Brak podziału na odpowiednie metody.
2.char[] przerobka = new char[100]; żyjemy w epoce kamienia łupanego? Wykorzystaj normalny string, a nie jakąś sztywną tablicę.
3.char[] alfabet = {'a','b','c'...} w sumie to mogłoby być po prostu string alfabet = "abcd..";
4.char[] tab = haslo.toCharArray(); po kiego zamieniasz to na tablicę charów tak właściwie? :P
5.Nigdy rób metody odpowiedzialnej za więcej niż jedną rzecz, ta Twoja, w uproszczeniu, odpowiada jednocześnie za kodowanie i dekodowanie - to złe.

0

Zastanawiam się co jest tego powodem? Myślałem, że już to zabezpieczyłem.

run:
Czas wybierać: 1-szyfrowanie, 2-deszyfrowanie :
1
Co mam zaszyfrowac/deszyfrowac: 
e
Ile przesunac: 
7
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -3
	at zadanieMetodyNumeryczne.cezarv2.main(cezarv2.java:55)
1

Powodem jest to, że zabierasz się do rozwiązywania zadania nie rozumiejąc podstaw ;)
Napisz to zadanko, które Ci wyżej wskazałem;

0
String a = "koteczek";
    char b=a[2]; //a temu co nie pasuje?
    System.out.println(a);
    a += 1;
    System.out.println(a);
0

Nie, przeczytaj raz jeszcze polecenie :P

ja napisał(a)

i przesuń każdy z tych znaków o jeden ASCII w prawo (+1).

0

Wielkie dzięki za pomoc. Ostatecznie działa :) ufff

public class cezarv2 {
    public static void main(String[] args){
        
        
        char[] alfabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char[] przerobka = new char[100];
        
        
        
        Scanner skaner = new Scanner(System.in);
        System.out.println("Czas wybierać: 1-szyfrowanie, 2-deszyfrowanie :");
        int wybor = skaner.nextInt();
        for(;wybor!=1 && wybor!=2;){
            System.out.println("Wybierz 1 lub 2, cwaniaczku : ");
            wybor = skaner.nextInt();
            
        }
        System.out.println("Co mam zaszyfrowac/deszyfrowac: ");
        String haslo = skaner.nextLine(); //haslo
        haslo=skaner.nextLine();
        System.out.println("Ile przesunac: ");
        int a = skaner.nextInt();
        for(;a>26 || a<0;){
            System.out.println("Wybierz liczbe od 0 do 26, cwaniaczku : ");
        a = skaner.nextInt(); //przesuniecie
        }
        int d = 0;
        
       
        char[] tab = haslo.toCharArray();
        
        switch(wybor){
            
            case 1:
                
            for(int i=0;i<tab.length;i++){
                for(int j=0;j<alfabet.length;j++){
                    if(tab[i]==alfabet[j]){
                        if(j+a<=alfabet.length)
                            przerobka[i]=alfabet[j+a]; //małe litery
                        else if(j+a>alfabet.length){
                            d=26-a;
                            przerobka[i]=alfabet[j-d];
                        }        
                    }
                }
            }
            break;
                        
                            
                    
            case 2:
                for(int i=0;i<tab.length;i++){
                    for(int j=0;j<alfabet.length;j++){
                        if(tab[i]==alfabet[j]){
                            if(j+a<alfabet.length)
                                przerobka[i]=alfabet[j-a];
                            else if(j+a>alfabet.length){
                                d=26-a;
                                przerobka[i]=alfabet[j+d];
                            }        
                        
                        }
                    }
                }
            break;
                 
        }       
        System.out.print("Ale sobie zakodowałem/zdekodowałem hehe: ");
        System.out.println(przerobka);
           
        
        
            
            
     
        
            
    }

    
}
0

Ale kombinujesz nadal.
Wystarczy Ci de facto jedna metoda robiąca kodowanie, a dekodowanie jest tak naprawdę kodowaniem z szyfrem przeciwnym...
Ten kod w dalszym ciągu nadaje się tylko na śmietnik.

1 użytkowników online, w tym zalogowanych: 0, gości: 1