Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 31.03.2019
Сообщений: 12
1

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

04.04.2019, 15:30. Показов 2753. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Помогите пожалуйста с проблемой:
"Зашифровать введенную с клавиатуры строку, поменяв местами первый символ со вторым, третий с четвертым и т. д. Провести дешифровку."
У меня получается её зашифровать. Ну т.е. я понял как это сделать циклом, но вот обратно никак.
По идее надо провести все операции назад, но у меня не получается.
Я создаю цикл, который совершает противоположные действия и он просто не работает.
Подскажите в какую сторону копать, пожалуйста.

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N 25
 
int main()
{
    char str1[N];
    char str2[N];
    int i, t;
    printf("\n Please enter text: ");
    gets(str1);
    memcpy(str2, str1, sizeof(str1));
    printf("\n Your text is: %s\n", str1);
    for(i=0; i<N-1; i=i+2)
    {
        t=str1[i]; str1[i]=str1[i+1]; str1[i+1] = t;
    }
    if(N % 2 == 1)
    {
        t = str1[N];
        str1[N] = str1[N-1];
        str1[N-1] = t;
    }
    printf("\n Cipher text: %s ",str1);
    return 0;
}
Добавлено через 20 минут
Вот я пытаюсь сделать все те же шаги назад, но не получается:
C
1
2
3
4
5
6
7
8
9
10
    for(i; i<N-1; i=i+2)
    {
        t=str1[i]; str1[i]=str1[i-1]; str1[i-1] = t;
    }
    if(N % 2 == 1)
    {
        t = str1[N];
        str1[N] = str1[N-1];
        str1[N-1] = t;
    }
Никак не могу понять в чем моя ошибка...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2019, 15:30
Ответы с готовыми решениями:

Зашифровать введенную с клавиатуры строку, поменяв местами первый символ с третьим, второй с четвертым и т. д
Если пересматривать каждый символ через цикл с нуля, то мы скорее всего вылетим из массива...

Зашифровать введённую с клавиатуры строку, поменяв местами первый символ со вторым, третий с четвёртым и т.д. Провести дешифровку
Зашифровать введённую с клавиатуры строку, поменяв местами первый символ со вторым, третий с...

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

Зашифровать введенную с клавиатуры строку, поменяв местами первый символ с третьим, второй с четвертым
Доброго времени суток! Кто может помогите пару заданий в контрольной.... темный лес, а разбираться...

10
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
04.04.2019, 15:47 2
Цитата Сообщение от Wardan Посмотреть сообщение
в чем моя ошибка...
Ошибка (и очень серьезная) уже в первом коде.
Объявлено char str1[N];
Строка 22
Цитата Сообщение от Wardan Посмотреть сообщение
t = str1[N];
str1[N] просто не существует. Это какая-то чужая память. В Си индексация начинается с 0 и последний индекс N-1.
1
0 / 0 / 0
Регистрация: 31.03.2019
Сообщений: 12
04.04.2019, 15:52  [ТС] 3
И вылезает еще проблема: если количество знаков четное - добавляется левый символ, а если нечетное- то последний символ не отображается. Что за фигня...

Добавлено через 3 минуты
Цитата Сообщение от Байт Посмотреть сообщение
str1[N] просто не существует. Это какая-то чужая память. В Си индексация начинается с 0 и последний индекс N-1.
Поправил
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N 36
 
int main()
{
    char str1[N];
    /*char str2[N];*/
    int i, t;
    printf("\n Please enter text: ");
    gets(str1);
    /*memcpy(str2, str1, sizeof(str1));*/
    printf("\n Your text is:\t%s", str1);
    for(i=0; i<N-1; i=i+2)
    {
        t=str1[i]; str1[i]=str1[i+1]; str1[i+1] = t;
    }
    if(N % 2 == 1)
    {
        t = str1[N-1];
        str1[N-1] = str1[N-2];
        str1[N-2] = t;
    }
    printf("\n Cipher text:\t%s ",str1);
    for(i; i<N-1; i=i+2)
    {
        t=str1[i]; str1[i]=str1[i-1]; str1[i-1] = t;
    }
    if(N % 2 == 1)
    {
        t = str1[N-1];
        str1[N-1] = str1[N-2];
        str1[N-2] = t;
    }
    printf("\n Decipher text:\t%s\n", str1);
    return 0;
}
Все равно не работает...
Т.е. он символы то переворачивает, пока не дойдет до конца, там начинается: если символов четное количество - он добавляет еще 1 знак, если нечетное - не дописывает знак.
А назад вообще не меняет, по второму циклу for. Как будто его и нет.
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
04.04.2019, 15:56 4
Цитата Сообщение от Wardan Посмотреть сообщение
Что за фигня...
Все фигня (ну, может быть, не вся) объясняется в посте 2.

Добавлено через 3 минуты
Цитата Сообщение от Wardan Посмотреть сообщение
Поправил
Ерунда. Прокрутите программу вручную (или отладчиком) на небольших строках типа "abc", "abcd" и посмотрите, что получается.
1
0 / 0 / 0
Регистрация: 31.03.2019
Сообщений: 12
04.04.2019, 16:06  [ТС] 5
Название: oboik.ru_31125.jpg
Просмотров: 55

Размер: 23.2 Кб
Вот что я имею ввиду

Он не использует второй цикл for для смены символов назад. Я не понимаю почему...
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
04.04.2019, 16:12 6
А это что за фигня? (строка 27)
Цитата Сообщение от Wardan Посмотреть сообщение
for(i; i<N-1; i=i+2)
Ну и кончился цикл, не успев начаться.
Wardan, Это не программирование. Это тыканье пальцем в небо. Не суетитесь и прислушайтесь к советам.
1
0 / 0 / 0
Регистрация: 31.03.2019
Сообщений: 12
04.04.2019, 16:32  [ТС] 7
Так я же исправил ошибку, N-1 везде.
Да, не заметил что счетчик не обнулил. Но ведь все равно получается не верно.
Я пытаюсь выяснить правильно ли я понял логику и верно ли
C
1
 t=str1[i]; str1[i]=str1[i-1]; str1[i-1] = t;
для обратного преобразования.

Как учить то, если не понятно...

Добавлено через 11 минут
Для того, что бы понять, что именно я не понял в этом всем, мне нужно увидеть ошибку.
По ошибке я пойму, где я не правильно понял и смогу изучить\исправить этот момент. Да, тыкая пальцем в небо потому, что у меня нет преподавателя, который мог бы объяснить в чем мои выводы не верны.

Вот я исправил и теперь все работает как надо (почти, с концом строки беда осталась).
C
1
t=str1[i-1]; str1[i-1]=str1[i-2]; str1[i-2] = t;
Вот верный дешифратор потому, что я строку саму сдвинул, а не просто временной переменной передал значение адреса символа. Т.е. я думал, что после цикла t=(NULL) как оно выводилось при попытке печати, но по окончанию цикла for и str1[i+1] и t=str1[i+1].
Вот что я пытался выяснить...
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
04.04.2019, 18:29 8
Wardan, Ну как, справился? Получилось?
Цитата Сообщение от Wardan Посмотреть сообщение
у меня нет преподавателя,
Самый лучший учитель - собственный опыт. Это я серьезно говорю.
Если еще есть сомнения и недоумения - выкладывай код - посмотрим.
Только вот я не пониманию, что делать с последним символом в строке нечетной длины? Логичнее всего оставить его как есть. Менять-то не с чем...
1
35 / 28 / 8
Регистрация: 01.03.2019
Сообщений: 135
04.04.2019, 20:00 9
Что-то не то накодил... Требуется доработка. Вроде это:

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
#include <stdio.h>
#include <stdlib.h>
 
#define SIZE 256
 
 
int main(
    int argc,
    char** argv
)
{
    char str[SIZE] = "C is the best programming language ever!";
 
    printf("Text:\n%s\n", str);
 
    for (size_t i = 1; i < SIZE - 2; i += 2)
    {
        char tmp = str[i];
        str[i] = str[i + 1];
        str[i + 1] = tmp;
    }
 
    printf("Text is encoded:\n%s\n", str);
 
    for (size_t i = SIZE - 2; i > 1; i -= 2)
    {
        char tmp = str[i];
        str[i] = str[i - 1];
        str[i - 1] = tmp;
    }
 
    printf("Text is decoded:\n%s\n", str);
 
    return 0;
}
1
2495 / 1096 / 489
Регистрация: 17.11.2018
Сообщений: 2,788
05.04.2019, 00:15 10
Лучший ответ Сообщение было отмечено Wardan как решение

Решение

Цитата Сообщение от Wardan Посмотреть сообщение
У меня получается её зашифровать. Ну т.е. я понял как это сделать циклом, но вот обратно никак.
Wardan, этот же самый цикл является и дешифратором.
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
#define N 36
 
int main()
{
    char str1[N];
    int i, t, len;
 
    printf( "Please enter text: " );
    fgets( str1, N, stdin );
 
    len = strlen( str1 ) - 2;
    for( i = 0; i < len; i += 2 )
    {
        t = str1[i];
        str1[i] = str1[i + 1];
        str1[i + 1] = t;
    }
    printf( "Cipher text      : %s", str1 );
 
    for( i = 0; i < len; i += 2 )
    {
        t = str1[i];
        str1[i] = str1[i + 1];
        str1[i + 1] = t;
    }
    printf( "Decipher text    : %s", str1 );
    return 0;
}
2
0 / 0 / 0
Регистрация: 31.03.2019
Сообщений: 12
05.04.2019, 01:33  [ТС] 11
Цитата Сообщение от analogov net Посмотреть сообщение
Wardan, этот же самый цикл является и дешифратором.
Я тихонько сижу и офигеваю...
У вас все работает независимо от длины строки и при этом никаких лишних символов...
Пойду изучать функции строк еще раз...
я даже не подумал про длину строки
0
05.04.2019, 01:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2019, 01:33
Помогаю со студенческими работами здесь

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

Дана строка. Зашифровать строку, поменяв местами первый символ с третьим, второй с четвертым и т.д.
:) Здравствуйте! 3. Даны 2 предложения. В каком из них доля (%) буквы «б» больше? Определить...

В массиве S поменять местами элементы: первый со вторым, третий с четвертым и т.д.
Помогите написать код к заданию: &quot;В массиве S поменять местами элементы: первый со вторым, третий...

Первый столбец матрицы поменять местами со вторым, третий - с четвёртым и т.д
В двухмерном массиве D первый столбец поменять местами со вторым, третий поменять местами с...


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

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