Prośba o ocenę i sugestie możliwości poprawy./ polepszenia

0

Szyfr cezara - niestety się wiesza, nie działa nie mam pojęcia dlaczego - prosze o opinie co jest nie tak

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package szyfrcezara;

/**
 *
 * @author DK
 */
import java.util.*;
public class SzyfrCezara {

    /**
     * @param args the command line arguments
     */
     static Scanner sc = new Scanner(System.in);
     //String alphabet = "AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŹŻ";
     static int klucz;
     public static String InputFromUser(){
        System.out.println("Enter your text to encrypt");
        String text = sc.nextLine();
        return sc.nextLine();
    }
     public static int getUserInput(){
        System.out.println("Enter distance between [- 26: 26]");
        klucz = sc.nextInt();
        return sc.nextInt();
    }
     public static String encrypt(String text){
        for(int i = 0; i < text.length(); i++){
           int c = (int)text.charAt(i);
            if(c + klucz > 26){
                c = 65 + (klucz - 62) % 26;
            }
            else{
                c += klucz;
            }
        }
        return text;
    }
     public static void main(String[] args) {
        // TODO code application logic her
        SzyfrCezara sz = new SzyfrCezara(); 
        String text = SzyfrCezara.InputFromUser();
        System.out.println(text);
        klucz = SzyfrCezara.getUserInput();
        System.out.println(klucz);        
        String c = SzyfrCezara.encrypt(text);
        System.out.println(c);
       }
  }



0

Jeśli chodzi o to, że wiesza się po wpisaniu tekstu do szyfrowania i wciśnięciu entera, daj return text zamiast return sc.getNextline().
Skoro zapisujesz coś do zmiennej, to jej użyj - ewentualnie pomiń w ogóle tworzenie zmiennej.
Teraz po wpisaniu tekstu komenda return sc.nextLine() sprawia, że znów czekasz na kolejną linię tekstu wpisanego przez użytkownika, dopóki scanner nic nie przeczyta, nie będzie miał co zwrócić.
To samo z podawaniem dystansu.
Przy okazji nazwij jakoś sensowniej te funkcje, bo InputFromUser i getUserInput są bez sensu :)

0

To jeśli chodzi o to dlaczego Ci się "wieszało". Pobierałeś 2 razy dane w każdej z tych metod. Raz w bloku metody, i raz zwracając wartość. Popraw to np w ten sposób:

     public static String InputFromUser(){
        System.out.println("Enter your text to encrypt");
        String text = sc.nextLine();
        return text;
    }
     public static int getUserInput(){
        System.out.println("Enter distance between [- 26: 26]");
        klucz = sc.nextInt();
        return klucz;
    }

W zasadzie po co tworzysz obiekt klasy SzyfrCezara skoro korzystasz z metod statycznych?
Proponuje np taką poprawę :

import java.util.*;

public class SzyfrCezara {

    private Scanner sc = new Scanner(System.in);
    private int key;
    private String textToEncrypt;

    public void textFromUser() {
        System.out.println("Enter your text to encrypt");
        textToEncrypt = sc.nextLine();
    }

    public void distanceFromUser() {
        System.out.println("Enter distance between [- 26: 26]");
        key = sc.nextInt();
    }

    // Błąd !
    public String encrypt() {
        for (int i = 0; i < textToEncrypt.length(); i++) {
            int c = (int) textToEncrypt.charAt(i);
            if (c + key > 26) {
                c = 65 + (key - 62) % 26;
            } else {
                c += key;
            }
        }
        return textToEncrypt;
    }

    public static void main(String[] args) {
        SzyfrCezara szyfrCezara = new SzyfrCezara();
        szyfrCezara.textFromUser();
        szyfrCezara.distanceFromUser();
        //System.out.println(sz.encrypt());
    }
}

I ostatnia sprawa, rozjaśnij w jaki sposób chciałeś aby metoda encrypt() działała? Obecnie nic ona nie robi poza tworzeniem jakiejś zmiennej c której nigdzie nie wykorzystujesz.

0

Dziękuję bardzo za pomoc i podpowiedzi. Poprawiłam i jest ok, tylko nie działa poprawnie. Szyfruje poprawnie jedynie przy przesunięciu o 3. a jak chce przesunąć o więcej to źle szyfruje.

import java.util.*;
public class SzyfrCezara {

    /**
     * @param args the command line arguments
     */
     static Scanner sc = new Scanner(System.in);
     private int key;
     private String textToEncrypt;
     String cipherText = "";
     public void textFromUser(){
        System.out.println("Enter your text to encrypt");
        textToEncrypt = sc.nextLine();
    }
     public void distanceFromUser(){
        System.out.println("Enter distance between [- 26: 26]");
        key = sc.nextInt();
    }
     public String encrypt(){
        textToEncrypt = textToEncrypt.toLowerCase();
        for(int i = 0; i < textToEncrypt.length(); i++){
           int c = (int)textToEncrypt.charAt(i);
             c = c - (key % 26);
            if(c  > 26){
               c = c - 26;
            }
            cipherText += (char)c;
        }
        return cipherText;
    }
     public static void main(String[] args) {
        // TODO code application logic her
        SzyfrCezara szyfrCezara = new SzyfrCezara(); 
        szyfrCezara.textFromUser();
        szyfrCezara.distanceFromUser();
        System.out.println(szyfrCezara.encrypt());
       }
  }


0

Ale co to znaczy, że źle szyfruje? W kodzie nie widzę odniesień do liczby 3, a więc może po prostu porównujesz wyniki z nieodpowiednimi przykładowymi wartościami? Z każdą liczbą powinien inaczej szyfrować.

0

http://eduinf.waw.pl/inf/alg/001_search/0063.php

na podstawie tego alfabetu i tekjst jawny jest pokazana litera i jaka powinna byc po zaszyfrowaniu i testujac moj kod jak wpisze tekst 'anna' i przesuniecie 3 to szyfruje poprawnie i jest DQQD, a jak dam 'anna' i przesuniecie o 5 to zle
i ogolnie kazde slowo sprawdzane z przesunieciem o 3 dobrze, a z inny mprzesuenieciem zle

0

Nie będę przepisywać, bo na podanej stronie jest to dość dobrze wytłumaczone, ale przykładowo, dla (wielkiej) litery "A" (o kodzie 65):

  • Przy przesunięciu równym 1 kod nowej litery będzie równy (65 + (65 - (65 - 1)) mod 26) == (65 + (65 - 64) mod 26) == (65 + 1 mod 26) == (65 + 1) == 66 (litera "B").
  • Przy przesunięciu równym 2 kod nowej litery będzie równy (65 + (65 - (65 - 2)) mod 26) == (65 + (65 - 63) mod 26)... i tak dalej... == 67 (litera "C").

Więc wzorując się na przykładzie, będzie to dla mnie wyglądać (pseudokod):

string napis = ... // jakis fajny napis pobrany z wejscia programu
string napis_zaszyfrowany = "";
char poczatekAlfabetu = 'A'; // to dobry poczatek, wiekszosc alfabetow tak sie zaczyna
int dlugoscAlfabetu = 26; // standardowo angielski alfabet
char koniecAlfabetu = znak(kod(poczatekAlfabetu) + dlugoscAlfabetu);

for (int i = 0; i < napis.length; ++i) {
    if (kod(napis[i]) < poczatekAlfabetu || kod(napis[i]) > koniecAlfabetu) {
        continue;
    }
    napis_zaszyfrowany += znak(kod(poczatekAlfabetu) + (kod(napis[i]) - mod(kod(poczatekAlfabetu) - przesuniecie, dlugoscAlfabetu))); // mam nadzieje, ze nie brakuje nawiasow
}

To, co napisałem, co ma prawdopodobnie bliskie przełożenie na Javę.

Dawno miałem styczność z algorytmami, więc mam nadzieję, że żadnej bzdury tu nie napisałem.

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