0 / 0 / 0
Регистрация: 26.02.2012
Сообщений: 5
1

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

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

Author24 — интернет-сервис помощи студентам
Народ! Нужна помощь в написании программы. Перевод на 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
Ответы с готовыми решениями:

Логический сдвиг влево,логический сдвиг вправо,алгоритм обмена двух переменных,циклический сдвиг
Битовые сдвиги.FW4,msstudio 13,на C# 1)Реализовать быстрое умножение на 2(логический сдвиг влево)...

Матрица. Для каждой строки дважды произвести циклический сдвиг элементов влево
Ввести матрицу A n×m , вывести ее. В матрице для каждой строки дважды произвести циклический сдвиг...

Циклический побитовый сдвиг числа вправо на указанное количество бит, но только для нечетных битов
Реализовать циклический побитный сдвиг числа вправо на указанное число(n), но только для нечетных...

перевести программу из паскаля в с++ (для среды Borland C++). Дан массив размера N. Осуществить циклический сдвиг элементов массива влево на одну
Помогите пожалуйста перевести программу из паскаля в с++(для среды Borland C++) Условие:дан массив...

Циклический сдвиг
Надо осуществить циклический сдвиг элементов матрицы размерности m×n вправо на k элементов таким...

7
146 / 143 / 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
17706 / 12887 / 3370
Регистрация: 17.09.2011
Сообщений: 21,156
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
24.04.2013, 16:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2013, 16:13
Помогаю со студенческими работами здесь

Циклический сдвиг
Добрый день, столкнулся с такой задачей : для массива вещественных чисел, начинающийся с...

Циклический сдвиг
Осуществить циклический сдвиг элементов прямоугольной матрицы на n элементов вправо или вниз (в...

Циклический сдвиг
Строка символов состоит из произвольных десятичных цифр в пределах от 1 до 9, разделенных...

Циклический сдвиг
Произвести циклический сдвиг текста вправо на одно слово.

Циклический сдвиг
Произвести циклический сдвиг элементов массива вправо не застрагивая максимум и минимум

Циклический сдвиг
Осуществите циклический сдвиг компонент заданного вектора A(N) вправо на две позиции, то есть...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru