Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 5
1

Использовать циклический сдвиг для расшифровки "заклинания"

27.02.2012, 12:51. Просмотров 1608. Ответов 7
Метки нет (Все метки)

Народ! Нужна помощь в написании программы. Перевод на C# с паскаля не выходит.
Условие
На вход программе подаётся текст заклинания, состоящего не более чем из 200 символов, заканчивающийся точкой (символ «точка» во входных данных единственный). Оно было зашифровано Гарри Поттером следующим образом. Сначала Гарри определил количество букв в самом длинном слове, обозначив полученное число К (словом называется непрерывная последовательность английских букв, слова друг от друга отделяются любыми другими символами, длина слова не превышает 20 символов). Затем он заменил каждую английскую букву в заклинании на букву, стоящую в алфавите на К букв ранее (алфавит считается циклическим, то есть перед буквой А стоит буква Z), оставив другие символы неизменными. Строчные буквы при этом остались строчными, а прописные - прописными. Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран текст расшифрованного заклинания. Например, если зашифрованный текст был таким:

Zb Ra Ca,Dab Rа.

то результат расшифровки должен быть следующим:
Се Ud Pd,Gde Ud.

Здесь то, что я сам пытался сделать, глядя на решение в паскале, но я походу в этом не силён:(
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
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            char c;
            int i, k, t, point, temp;
            k = 0; temp = 0;
            Console.WriteLine("Введите строку");
            string s = Console.ReadLine();
            for (i = 1; i < s.Length; i++)
            {
 
                if (char.IsLetter(s[i]))
                {
                    temp++;
                }
                else if (temp > k)
                {
                    k = temp; temp = 0;
                }
            }
            for (i = 0; i < s.Length; i++)
            {
                if (char.IsLetter(s[i]))
                {
                    s[i] += k;
                    if (char.IsLetter(s[i])) { s[i] -= 26; }
                }
            }
            Console.WriteLine("s");
        }
    }
}


Добавлено через 9 часов 23 минуты
Люди! Ну неужели никто не в курсе, как это всё делается?

Добавлено через 18 часов 14 минут
Ну народ! Помогите, пожалуйста...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2012, 12:51
Ответы с готовыми решениями:

Как синтаксически правильно использовать оператор "and" в цикле "if"?
Исходный код string id = textBox2.Text; foreach (DataRow row in table.Rows) ...

Дан массив строк: "red", "green", "black", "white", "blue". Запишите в файл элементы массива построчно (в новой строке)
пишу так но не помогает: static void Main(string args) { string...

"student" не содержит определения для "Name" и не был найден метод расширения "Name"
Здравствуйте. Помогите пожалуйста найти ошибку (&quot;student&quot; не содержит определения для &quot;Name&quot; и...

Как использовать Thread.Sleep(5000), ошибка: "Элемент "Thread" не существует в текущем контексте"
я так понимаю, что Thread.Sleep(5000); это &quot;тормоз&quot; процесса выполенения программы на 5 сек? А...

7
145 / 142 / 32
Регистрация: 21.01.2012
Сообщений: 545
27.02.2012, 13:42 2
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
static void Main(string[] args)
        {
            string z;
            Console.WriteLine("введите заклинание");
            z = Console.ReadLine();
            char[] let = z.ToCharArray();
            int k = 0;
            int temp = 0;
            for (int ii = 0; ii < let.Length; ii++) //Получаем К
            {
                if (char.IsLetter(let[ii]))
                {
                    temp++;
                    if (temp > k)
                    {
                        k++;
                    }
                }
                else { temp = 0; }
            }
 
            for (int ii = 0; ii < let.Length; ii++) //Преобразуем массив
            {
 
                    if (char.IsUpper(let[ii]))
                    { 
                        // Тут преобразуем верхний регистр
                    }
                    else if(char.IsLower(let[ii]))
                    {
                        //тут преобразуем нижний регистр
                    }
 
            }
            StringBuilder st = new StringBuilder();
            for (int ii = 0; ii < let.Length; ii++) 
            {
             st.Append(let[ii]);   
            }
            Console.WriteLine(st);
            Console.ReadLine();
        }
Не могу вспомнить про кодировку символов
0
Эксперт .NET
14466 / 10912 / 2881
Регистрация: 17.09.2011
Сообщений: 18,429
27.02.2012, 13:49 3
Решение "в лоб", в два обхода строки:
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
var sw = Stopwatch.StartNew();
var sb = new StringBuilder(200);
int k = 0;
int curr = 0;
char ch;
while ((ch = (char)Console.Read()) != '.') {
    sb.Append(ch);
    if (char.IsLetter(ch))
        curr++;
    else {
        k = Math.Max(k, curr);
        curr = 0;
    }
}
k = Math.Max(k, curr);
 
for (int i = 0; i < sb.Length; i++) {
    if (sb[i] >= 'A' && sb[i] <= 'Z')
        sb[i] = (char)('A' + ((sb[i] + k - 'A') % 26));
    else if (sb[i] >= 'a' && sb[i] <= 'z')
        sb[i] = (char)('a' + ((sb[i] + k - 'a') % 26));
}
sb.Append('.');
Console.WriteLine(sb);
Преобразование символов, думаю, можно оптимизировать. Например, через массив, если входящие строки длинные - когда оверхед от перечислений превысит оверхед от выделения памяти для массива.
1
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 5
27.02.2012, 15:53  [ТС] 4
Цитата Сообщение от kolorotur Посмотреть сообщение
Решение "в лоб", в два обхода строки:


Преобразование символов, думаю, можно оптимизировать. Например, через массив, если входящие строки длинные - когда оверхед от перечислений превысит оверхед от выделения памяти для массива.
Спасибо, вроде как работает
0
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 5
13.03.2012, 17:51  [ТС] 5
Народ! А можно эту вот самую программу засунуть в Windows Forms? Чтоб было окошко с 2мя текстовыми полями и кнопочкой, нажав на которую во втором поле вылезает ответ? Помогите, пожалуйста. Я в этом дилетант полнейший.
0
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 5
14.03.2012, 18:15  [ТС] 6
Народ, ну помогите, пожалуйста! Ваще надо сильно...
0
0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 5
20.03.2012, 13:40  [ТС] 7
Цитата Сообщение от iHaron Посмотреть сообщение
Народ, ну помогите, пожалуйста! Ваще надо сильно...
Товарищи! Напомощ!
0
bmstu-team
301 / 136 / 91
Регистрация: 10.01.2012
Сообщений: 420
Записей в блоге: 10
24.04.2013, 16:13 8
iHaron, не мог бы в личку или сюда выложить текст решения на Паскале?
Буду очень признателен
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2013, 16:13

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

Переопределить операции "+" "=" "-" для экземпляров моего класса
Добрый день. Мне нужно переопределить операции &quot;+&quot; &quot;=&quot; &quot;-&quot; для экземпляров моего класса. Я вижу это...

Описать класс "поезд", содержащий поля "пункт назначения", "номер поезда", "время отправления"
Помогите пожалуйста с классом Описать класс «поезд», содержащий следующие закрытые поля:...

"String" не содержит определение для "Lenght". Не удалось найти метод расширения "Lenght"
Здравствуйте, не могу скомпилировать код. Выдает ошибку, что &quot;string&quot; не содержит определение для...

Проблема при сравнении: "Оператор ">" не может применяться к операндам типа "Т" и "Т""
Добрый день , пишу сортировку , все делаю на основе Т , но вот в чем проблемма public class...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.