Skip to content

Orlov 4 tasks#21

Open
orlov-sv wants to merge 13 commits intodemologin:mainfrom
orlov-sv:main
Open

Orlov 4 tasks#21
orlov-sv wants to merge 13 commits intodemologin:mainfrom
orlov-sv:main

Conversation

@orlov-sv
Copy link

@orlov-sv orlov-sv commented Sep 1, 2025

No description provided.

@orlov-sv orlov-sv changed the title Orlov Orlov 4 tasks Sep 1, 2025
Copy link
Owner

@demologin demologin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в данном проекте корректно реализованы три из четырёх методов, написано консольное приложение, есть несколько важных и не очень важных замечаний. В целом весь материал первого модуля так или иначе был использован, я поставил оценку б, однако поскольку форма была не заполнена, то это оценка не отобразится в итоговой таблицы. Напомните мне после заполнения формы чтобы я поставил оценку туда

int key = Validator.scanKey(); // Считываем ключ от пользователя

// Читаем текст из файла
ArrayList<String> text = new ArrayList<>(Files.readAllLines(Path.of("text\\text.txt")));
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Такой путь будет работать только в Windows.
Тут лучше Path.of("text","text.txt")


// Метод для расшифровки текста методом полного перебора (Brute Force)
private static void bruteForceFile() throws IOException {
ArrayList<String> text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt")));
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут для всех файлов жёстко заданный пути и имена, в реальных программах так никогда не делают, пользователь должен иметь возможность указать те пути которые нужны ему

// Метод для расшифровки текста статистическим анализом
private static void statisticalFile() throws IOException {
ArrayList<String> text = new ArrayList<>(Files.readAllLines(Path.of("text\\encrypted.txt")));

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не очень понятно зачем нужны эти пустые строки


// Алфавит, используемый для шифрования и дешифрования
// Содержит русские буквы в нижнем и верхнем регистре, знаки препинания и пробел
public static final char[] ALPHABET = {'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з',
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

по смыслу это константа, но технически это массив, а массивы можно изменять,можно конечно оставить и так, но если делать все совсем строго, то лучше дать этому полю обычное имя


// Выполняет статистический анализ текста для взлома шифра Цезаря
// Объединяет весь текст в одну строку, находит самый частый символ и расшифровывает текст
public ArrayList<String> statisticalAnalysis(ArrayList<String> text) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

метод полностью дублирует название класса

int maxCount = 0;

// Определяем символ с максимальной частотой
for (Map.Entry<Character, Integer> entry : count.entrySet()) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут основная логическая ошибка. Под статическим анализом подразумевается возможность что напротив каждой буквы стоит какая-то другая и они не имеют никакой упорядоченности друг относительно друга. Поэтому вычисления самого часто символа позволяет определить корректно только его, а весь остальной текст не расшифруется


// Вычисляет ключ шифра Цезаря как разницу позиции самого частого символа и пробела
// Если ключ отрицательный, корректирует его, добавляя длину алфавита
public static int differenceWithSpace(char mostFrequent) {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Напишу здесь с другими словами. Статический анализ расшифровывает не именно шифр цезаря а потенциально любой шифр где одной букве соответствует какая-то другая. При этой реализации по сути получился вариант грубого перебора который уже и так реализован

private static final String asterisk = "*".repeat(60);

// Метод отображает главное меню программы и возвращает выбор пользователя
public static int begin() {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Java почти все методы начинаются с глагола

// Мини-словарь частых слов для проверки корректности расшифровки
private static final String[] DICTIONARY = {"и", "в", "на", "что", "как", "это", "он", "она", "они"};

// Метод перебирает все возможные ключи шифра Цезаря и выбирает лучший
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Комментарии это хорошо, но во-первых лучше бы они были на английском языке, а во-вторых в Java активно используется Javadoc


// Главный цикл программы, пока пользователь не выберет выход
while (true) {
int num = Validator.begin(); // Получаем выбор пользователя
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

По логике мы получаем выбор пользователя а по коду начинаем валидацию. Неправильно назван метод и класс

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants