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

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

03.12.2011, 16:21. Показов 3125. Ответов 12
Метки нет (Все метки)

Есть задача:Дана строка-предложение. Зашифровать ее, поместив вначале все символы, расположенные на четных местах, а затем, в обратном порядке, все символы, расположенные на нечетных местах (например, строка "Программа" превратится в "ргамамроП").

Помогите решить! Пожалуйста!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2011, 16:21
Ответы с готовыми решениями:

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

Строки. Зашифровать строку, поместив вначале символы, расположенные на четных позициях, а затем, в обратном порядке, на нечетных
2. Дана строка-предложение. Зашифровать ее, поместив вначале все символы, расположенные на четных...

Зашифровать строку, поместив в начале все символы, расположенные на четных местах
Дана -строка предложение,Зашифровать ее , поместив в начале все символы, расположенные на четных...

Зашифровать строку, поместив вначале все символы, с четных позиций строки, а затем все символы с нечетных позиций
Дана строка-предложение. Зашифровать ее, поместив вначале все символы, расположенные на четных...

12
Эксперт .NET
15349 / 11635 / 3053
Регистрация: 17.09.2011
Сообщений: 19,479
03.12.2011, 16:39 2
C#
1
2
var s = "Программа";
var crypt = string.Join(string.Empty, s.Where((c, i) => (i + 1) % 2 == 0).Concat(s.Where((c, i) => (i + 1) % 2 == 1).Reverse()));
2
1 / 1 / 0
Регистрация: 03.12.2011
Сообщений: 10
03.12.2011, 17:10  [ТС] 3
Спасибо за быстрый ответ! Но объясните момент, я полный чайник! запустил Visual С# вставил Ваш код

но вывод результата не получается!

C#
1
2
3
4
5
6
7
        static void Main(string[] args)
        {
            var s = "Программа";
            var crypt = string.Join(string.Empty, s.Where((c, i) => (i + 1) % 2 == 0).Concat(s.Where((c, i) => (i + 1) % 2 == 1).Reverse()));
            Console.WriteLine(s);
            Console.ReadKey();
        }
Если не сложно полный код. Нужно чтобы строку вводил пользователь. Спасибо заранее
0
Эксперт .NET
15349 / 11635 / 3053
Регистрация: 17.09.2011
Сообщений: 19,479
03.12.2011, 17:19 4
C#
1
2
3
var s = Console.ReadLine();
var crypt = string.Join(string.Empty, s.Where((c, i) => (i + 1) % 2 == 0).Concat(s.Where((c, i) => (i + 1) % 2 == 1).Reverse()));
Console.WriteLine(crypt);
1
54 / 42 / 7
Регистрация: 08.04.2011
Сообщений: 227
03.12.2011, 17:20 5
Лучший ответ Сообщение было отмечено OwenGlendower как решение

Решение

Конечно не получается. Нужно делать так:
C#
1
2
3
4
5
6
7
static void Main(string[] args)
{
var s = Console.ReadLine();
var crypt = string.Join(string.Empty, s.Where((c, i) => (i + 1) % 2 == 0).Concat(s.Where((c, i) => (i + 1) % 2 == 1).Reverse()));
Console.WriteLine(crypt);
Console.ReadKey();
}
1
1 / 1 / 0
Регистрация: 03.12.2011
Сообщений: 10
03.12.2011, 17:46  [ТС] 6
Всем огромное спасибо! Ваши примеры работаю на ура! а я по пояс деревянный

Не сочтите за хамство, но если сделать обратную расшифровку то что нужно изменить в коде?


и вообще что это за методы или функции

C#
1
string.Join(string.Empty, s.Where((c, i) => (i + 1) % 2 == 0).Concat(s.Where((c, i) => (i + 1) % 2 == 1).Reverse()));
?

к примеру если писать используя всякие циклы перемещения символов в строке то получиться код намного больше. А используя такие методы сильно упрощает жизнь!


Спасибо!
0
Эксперт .NET
4341 / 2003 / 387
Регистрация: 27.03.2010
Сообщений: 5,457
Записей в блоге: 1
03.12.2011, 18:53 7
Цитата Сообщение от viktor666 Посмотреть сообщение
и вообще что это за методы или функции
Это LINQ. В книге: "Шилдт Г. - C# 4.0 полное руководство" - Глава 19. Чтобы там что-то понять, нужно прочитать все главы до неё, если с шарпом особо не знаком. И в C# нету функций и процедур, только методы, если не ошибаюсь в этой книге даже про это написано.

Добавлено через 7 минут
Цитата Сообщение от viktor666 Посмотреть сообщение
к примеру если писать используя всякие циклы перемещения символов в строке то получиться код намного больше. А используя такие методы сильно упрощает жизнь!
Думаю новичку лучше использовать как раз циклы. Чтобы понимать, что и как работает. Сам до последнего старался не использовать подобное (ну я не всегда же шарил, что к чему).
2
1 / 1 / 0
Регистрация: 03.12.2011
Сообщений: 10
03.12.2011, 22:08  [ТС] 8
Я пробовал использовать циклы! но не получилось, поэтому и обратился от безысходности.

Вообще если есть строка, я разве не могу (не используя методы работы со строками: вырезка,вставка, объединение) просто менять местами буквы , как если бы я использовал просто массив типа char?

когда я пытался это делать отладчик ругался что индекс присваиваемого индекса в исходной строке превышает размер массива. Хотя за пример брал слово в 9 букв и цикл был 9 раз, индексы в исходной строке соответственно от 0 до 8. поэтому индекс последнего символа(который равен 8) не мог быть больше 9 ...
0
162 / 158 / 19
Регистрация: 22.11.2011
Сообщений: 371
03.12.2011, 22:22 9
Цитата Сообщение от viktor666 Посмотреть сообщение
Вообще если есть строка, я разве не могу (не используя методы работы со строками: вырезка,вставка, объединение) просто менять местами буквы , как если бы я использовал просто массив типа char?
Можете, только в случае со строками по факту каждый раз будет создаваться новая строка. Так что лучше для таких целей использовать или массив char, или StringBuilder в конце-концов.
1
Эксперт .NET
15349 / 11635 / 3053
Регистрация: 17.09.2011
Сообщений: 19,479
03.12.2011, 22:23 10
Цитата Сообщение от viktor666 Посмотреть сообщение
Вообще если есть строка, я разве не могу (не используя методы работы со строками: вырезка,вставка, объединение) просто менять местами буквы , как если бы я использовал просто массив типа char?
Только если через небезопасный код. А так строки в шарпе являются иммутабельными, то бишь после создания не меняются.
1
Эксперт .NET
4341 / 2003 / 387
Регистрация: 27.03.2010
Сообщений: 5,457
Записей в блоге: 1
03.12.2011, 23:10 11
Ради интереса решил разобрать на "составные", но почему-то выдаёт разные результаты шифровки, сколько не глядел в код так и не понял почему.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    class Program
    {
        static void Main(string[] args)
        {
            string s = "Привет! Я текст. Попробуй меня прочитать в зашифрованном виде";
 
            IEnumerable<char> chars1 = s.Where((c, i) => (i + 1) % 2 == 0);
            IEnumerable<char> chars2 = s.Where((c, i) => (i + 1) % 2 == 1);
            IEnumerable<char> concatenatedChars = chars1.Concat(chars2).Reverse(); //Тут была ошибка
 
            string crypt = string.Join(string.Empty, concatenatedChars);
            string cryptOriginal = string.Join(string.Empty, s.Where((c, i) => (i + 1) % 2 == 0)
                                                .Concat(s.Where((c, i) => (i + 1) % 2 == 1).Reverse()));
 
            Console.WriteLine("Разобранный вариант");
            Console.WriteLine(crypt);
            Console.WriteLine();
            Console.WriteLine("Оригинальный вариант");
            Console.WriteLine(cryptOriginal);
            Console.ReadKey();
        }
    }
Добавлено через 1 минуту
А всё нашёл, надо было внимательнее на скобки смотреть:
C#
1
            IEnumerable<char> concatenatedChars = chars1.Concat(chars2.Reverse());
Добавлено через 17 минут
Вот, надеюсь прояснится картина, что вообще происходит:
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
    class Program
    {
        static void Main(string[] args)
        {
            string s = "Привет! Я текст. Попробуй меня прочитать в зашифрованном виде";
            //первый вариант разберём таким способом
            IEnumerable<char> chars1 = s.Where(new Func<char, int, bool>(
                delegate(char ch, int i)
                {
                    return (i + 1) % 2 == 0;
                }));//predicateOne));
            //второй другим
            IEnumerable<char> chars2 = s.Where(new Func<char, int, bool>(predicateTwo));
            IEnumerable<char> concatenatedChars = chars1.Concat(chars2.Reverse());
 
            string crypt = string.Join(string.Empty, concatenatedChars);
 
            string cryptOriginal = string.Join(string.Empty, s.Where((c, i) => (i + 1) % 2 == 0)
                                        .Concat(s.Where((c, i) => (i + 1) % 2 == 1).Reverse()));
 
            Console.WriteLine("Разобранный вариант:\n{0}\n", crypt);
            Console.WriteLine("Оригинальный вариант:\n{0}", cryptOriginal);
            Console.ReadKey();
        }
 
        //не используется в данном примере, но для наглядности оставил (когда тестил, он использовался)
        static bool predicateOne(char ch, int i) 
        {
            return (i + 1) % 2 == 0;
        }
 
        static bool predicateTwo(char ch, int i)
        {
            return (i + 1) % 2 == 1;
        }
    }
1
1 / 1 / 0
Регистрация: 03.12.2011
Сообщений: 10
04.12.2011, 11:13  [ТС] 12
Ещё раз спасибо!

А если не использовать метод join?

я накидал алгоритм на бумаге, суть в том чтобы в цикле применить два условия :
К примеру возьмём слово "ПРОГРАММА";
1) первый цикл оставляет строку как есть и просто переносит первый символ в конец строки
"РОГРАММАП"
2) а в остальные циклы происходят по следующему правилу:
кавычками выделена обрабатываетмая строка
Р"ОГРАММА"П - переносим первый символ выделенной строки в конец выделенной строки, получаем
Р"ОГРАММА"П -> Р"ГРАММАО"П
Обрабатываемая строка уменьшается по 1 символу с конца и с начала...
и так далее пока не достигнем середины строки
РГ"РАММА"ОП->РГ"АММАР"ОП
РГА"ММА"РОП->РГА"МАМ"РОП

Поидее получили что и требовалось
только как это реализовать программно?
0
162 / 158 / 19
Регистрация: 22.11.2011
Сообщений: 371
04.12.2011, 11:31 13
Вот реализация Вашего алгоритма
C#
1
2
3
4
5
6
7
            string word = "программа";
            StringBuilder mas = new StringBuilder(word, word.Length + 1);
            for (int i = 0; i < mas.Length / 2; i++)
            {
                mas.Insert(mas.Length - i, mas[i]);
                mas.Remove(i, 1);
            }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2011, 11:31

Зашифровать строку, поместив вначале все символы, расположенные на четных местах
2. Дана строка-предложение. Зашифровать ее, поместив вначале все символы, расположенные на четных...

Зашифровать строку, поместив вначале все символы, расположенные на четных местах
Кто нибуть может помочь с парой програмок простеньких (На Паскале)? :) За полный код буду очень...

Зашифровать строку, записав все ее символы в обратном порядке
Дана фраза. Зашифровать ее, записав все ее символы в обратном порядке. Помогите написать программу...

Преобразовать текст: слова на четных местах переписать в обратном порядке, на нечетных - укоротить до 4-х символов
Товарищи! Нужна помощь!!! Вот задание: А)Преобразовать текст по правилу: слова на четных местах...


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

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

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