Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Winriks
0 / 0 / 0
Регистрация: 08.11.2022
Сообщений: 11
.NET 8

Критика/советы/помощь с кодом

11.04.2025, 20:45. Показов 1482. Ответов 6

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу помочь в оценке написанного кода. Приму критику, возможно советы по улучшению и оптимизации кода. Заранее спасибо

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
static string Enc(string str)
        {
            char[] abc = {'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f',
            'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N',
            'n', 'O', 'o', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w',
            'X', 'x', 'Y', 'y', 'Z', 'z'};
 
            StringBuilder sb = new StringBuilder(str);
 
            for(int i = 0; i < abc.Length; i++)
            {
                for(int j = 0; j < str.Length; j++)
                {
                    if(str[j] == abc[i])
                    {
                        i += 3;
 
                        if(i >= abc.Length)
                        i -= abc.Length;
 
                        sb[j] = abc[i];
                        str = sb.ToString();
                    }
                }
            }
 
            return str;
        }
 
        static void Main(string[] wsdctr)
        {
            Console.Write("Enter a message: ");
            string msg = Console.ReadLine();
 
            Console.WriteLine(Enc(msg));
        }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2025, 20:45
Ответы с готовыми решениями:

Учим ASP (вопросы, помощь, советы.)
Данный раздел был создан мной с надеждой, что найдется немало таких же болванов, как я, жаждущих...

Поиск в текстовом файле с html-кодом или css-кодом и вывести список всех ссылок
help. Как вообще работает и как вообще мне заставить ориентировать прогу в файле именно за этими...

Заменить в строке символы с кодом 160 на символы с кодом 32
Собственно говоря, в строке заменить неразрывный пробел на обычный не пойму, что надо подсовывать...

6
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
11.04.2025, 21:16
Напоминает шифр Цезаря, только реализован странно. Он ли это?

1. Почему при первом же совпадении вы модифицируете входной параметр? Возможно это надо делать только один раз? Я не знаю вашей задумки.
C#
22
str = sb.ToString();
В общем случае одна и та же позиция может быть заменена несколько раз, такова и была задумка?

2. Вложенный цикл может намекать на квадратичную сложность.
0
 Аватар для Winriks
0 / 0 / 0
Регистрация: 08.11.2022
Сообщений: 11
11.04.2025, 21:25  [ТС]
Да, это шифр Цезаря
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
11.04.2025, 21:26
Если это и вправду шифр Цезаря, то вот еще версия:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
static string Enc2(string str)
{
    char[] abc = {'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f',
        'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N',
        'n', 'O', 'o', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w',
        'X', 'x', 'Y', 'y', 'Z', 'z'};
 
    int offset = 3;
    var map = BuildMapping(offset, abc);
 
    var sb = new StringBuilder();
    foreach(var ch in str.AsSpan())
        sb.Append(map[ch]);
 
    return sb.ToString();
}
 
static  Dictionary<char, char> BuildMapping(int offset, char[] alphabet)
{
    var map = new Dictionary<char, char>();
    for (int i = 0; i < alphabet.Length; i++)
        map.Add(alphabet[i], alphabet[(i + offset) % alphabet.Length]);
    return map;
}
Сравнение вариантов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Diagnostics;
using System.Text;
 
Console.Write("Enter a message: ");
string msg = Console.ReadLine();
 
var sw = Stopwatch.StartNew();
var encoded1 = Enc(msg);
sw.Stop();
var et1 = sw.Elapsed;
sw.Restart();
var encoded2 = Enc2(msg);
sw.Stop();
var et2 = sw.Elapsed;
Console.WriteLine($"Encoded1: {encoded1} (Duration: {et1})");
Console.WriteLine($"Encoded2: {encoded2} (Duration: {et2})");
Миниатюры
Критика/советы/помощь с кодом  
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
11.04.2025, 21:29
Цитата Сообщение от IamRain Посмотреть сообщение
Возможно это надо делать только один раз? Я не знаю вашей задумки.
Имел ввиду, что итоговую позицию надо устанавливать только один раз. + входной параметр не надо модифицировать - это должна быть чистая функция.
И вот этот кусок:
C#
22
str = sb.ToString();
Просто генерирует траффик по памяти.

Как вариант, шифр Цезаря частенько идет в своей версии с ключевый словом - можете добавить.
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
11.04.2025, 21:39
Если словарь создать заранее, то encoding получается сильно быстрее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
char[] abc = {'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f',
    'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N',
    'n', 'O', 'o', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w',
    'X', 'x', 'Y', 'y', 'Z', 'z'};
 
Console.Write("Enter a message: ");
string msg = Console.ReadLine();
 
int offset = 3;
 
var sw = Stopwatch.StartNew();
var encoded1 = Enc(msg);
sw.Stop();
var et1 = sw.Elapsed;
sw.Restart();
var encoded2 = Enc2(msg, offset);
sw.Stop();
var et2 = sw.Elapsed;
var map = BuildMapping(offset, abc);
 
sw.Restart();
var encoded3 = Enc2(msg, offset, map);
sw.Stop();
var et3 = sw.Elapsed;
 
Console.WriteLine($"Encoded1: {encoded1} (Duration: {et1})");
Console.WriteLine($"Encoded2: {encoded2} (Duration: {et2})");
Console.WriteLine($"Encoded2: {encoded3} (Duration: {et3})");
 
 
static string Enc2(string str, int offset, Dictionary<char, char>? map = null)
{
    char[] abc = {'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f',
        'G', 'g', 'H', 'h', 'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l', 'M', 'm', 'N',
        'n', 'O', 'o', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u', 'V', 'v', 'W', 'w',
        'X', 'x', 'Y', 'y', 'Z', 'z'};
    
    map ??= BuildMapping(offset, abc);
 
    var sb = new StringBuilder();
    foreach(var ch in str.AsSpan())
        sb.Append(map[ch]);
 
    return sb.ToString();
}
Вам осталось только оформить это в виде сервиса, принимающего алфавит. + два метода encoding-а: 1) просто offset 2) offset + ключевое слово.
Миниатюры
Критика/советы/помощь с кодом  
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,234
11.04.2025, 21:54
Лучший ответ Сообщение было отмечено Winriks как решение

Решение

Получается со словарем encoding за линейное время, ваш вариант - квадратичное время и некорректная реализация.

Добавлено через 41 секунду
И симметрично еще надо два метода на обратное преобразование.

Добавлено через 1 минуту
3 микросекунды чтобы зашифровать 5 букв...

Добавлено через 7 минут
Создайте CaesarEncoder, у него четыре метода и конструктор, принимающий алфавит.
Алфавит можно генерить через статический метод этого же encoder-а.
Конструктор без параметров у CaesarEncoder может вызывать другой конструктор, принимающий алфавит, где вы будете передавать вашу версию алфавита, которую указали в начальном посте.

Добавлено через 3 минуты
А если на Rust переписать, то вообще бомба будет
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.04.2025, 21:54
Помогаю со студенческими работами здесь

Критика - Способ привязки к железу
Я сейчас опишу принцип привязки к железу, и хочу услышать - КАК этот принцип можно взломать... ...

Создание клиента(Платформы) [Обсуждение, критика] #2
Вот уже вторая версия моего творения.. Пофиксил относительно баг - Когда пустые поля и жмёшь...

Создание клиента(Платформы) [Обсуждение, критика] #3 Relase AlfaTest(#1)
Здравствуйте... Сейчас решил много каких проблем и много что пофиксил... Сделал ClientProtect...

Найти сумму цифр введенного с клавиатуры натурального числа N. Критика кода
Здравствуйте. Я учу C# и хочу критику, правильно ли я делаю всё? ну в плане того, не говнокод ли я...

Найти вторые минимальный и максимальный элементы заданного с клавиатуры вектора. Критика кода
Здравствуйте. Снова я :) и снова критика кода) Найти вторые минимальный и максимальный элементы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru