Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
1

Простое шифрование текста

24.02.2018, 18:15. Показов 1953. Ответов 19
Метки нет (Все метки)

Здравствуйте! Решаю несложную задачу, но почему-то ошибка во втором тесте. Вот ссылка на задачу: http://acm.timus.ru/problem.aspx?space=1&num=1226 Не прошу решать задачу с нуля, а просто поправить мой код:

Вот решение:

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
#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    string str, s, res = "";
    getline(cin, str);
    str += " ";
    for (int i = 0; i < str.size(); i++)
    {
        s += str[i];
        if (!(isalpha(str[i])))
        {
            s.pop_back();
            reverse(s.begin(), s.end());
            res += s;
            res += str[i];
            s = "";
        }
    }
    cout << res << "\n";
    system("pause");
    return 0;
}
Добавлено через 20 минут
Исправлял код так:

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 <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    string str, s, res = "";
    while (getline(cin, str))
    {
        str += " ";
        for (int i = 0; i < str.size(); i++)
        {
            s += str[i];
            if (!(isalpha(str[i])))
            {
                s.pop_back();
                reverse(s.begin(), s.end());
                res += s;
                res += str[i];
                s = "";
            }
        }
        cout << res << "\n";
        res = "";
    }
    system("pause");
    return 0;
}
Ошибка во втором тесте остается.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2018, 18:15
Ответы с готовыми решениями:

Простое шифрование
Нужно написать программу, которая шифрует сообщение и расшифровывает его, даны примеры: крот -&gt;...

Простое шифрование и дешифрование - объяснить принцип работы кода
Программа шифрует и дешифрует знакомое всем &quot;Hello world&quot;. Люди с добрыми сердцами, подскажите...

Шифрование текста, табличная замена текста
Один из простейших способов шифровки текста состоит в табличной замене каждого символа другим...

Простое шифрование текста
Необходимо создать текстовый редактор с возможностью шифрование текста. Сами кнопки шифрование и...

19
What a waste!
1603 / 1297 / 178
Регистрация: 21.04.2012
Сообщений: 2,720
24.02.2018, 18:44 2
Fixer_84, не проще ли читать посимвольно, и если isalpha(ch) то добавлять в стек пока !isalpha(ch), потом писать этот стек в обратном порядке?
0
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
24.02.2018, 18:47  [ТС] 3
gray_fox, здравствуйте! Спасибо за ваш ответ. Я так символы в стек никогда не помещал. Исправит ли это проблему? Мне бы в своем коде ошибку найти
0
What a waste!
1603 / 1297 / 178
Регистрация: 21.04.2012
Сообщений: 2,720
24.02.2018, 18:53 4
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Я так символы в стек никогда не помещал. Исправит ли это проблему?
Я вам предлагаю другой способ решения. В частности потому что не понимаю как вы пытаетесь решить задачу)
0
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
24.02.2018, 19:15  [ТС] 5
gray_fox, так задача уже решена. Просто небольшой недочет где-то в коде. Я файлы подключал и проверял на разных тестах. Просто тут файлы использовать нельзя, поэтому код отправляется в таком виде. Да и код, вроде, проверенный.

Добавлено через 15 минут
gray_fox, я могу прокомментировать свой код, если это поможет вам найти ошибку.
0
What a waste!
1603 / 1297 / 178
Регистрация: 21.04.2012
Сообщений: 2,720
24.02.2018, 19:21 6
Fixer_84, у вас в конце каждой строки будет лишний пробел (из-за str += " " в 10-й строке).
0
539 / 265 / 89
Регистрация: 09.02.2018
Сообщений: 617
24.02.2018, 19:21 7
Fixer_84, гляньте, насколько проще можно решить вашу задачу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int main()
{
    const int n=256;
    char *pT, *pS, *pC, *pR, c, text[n], stack[n];
    cout<<"Vvedite stroku:\r\n";
    cin.getline(text,n);
    pT=pR=text;
    pS=pC=stack;
    while((c=*pT++)!='\0'){
        if(isalpha(c)) *pC++=c;
        else{
            while(pC>pS) *pR++=*--pC;
            pR++;
        }
    }
    while(pC>pS) *pR++=*--pC;
    cout<<text<<"\r\n";
    system("pause");
    return 0;
}
1
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
24.02.2018, 19:34  [ТС] 8
Цитата Сообщение от gray_fox Посмотреть сообщение
у вас в конце каждой строки будет лишний пробел (из-за str += " " в 10-й строке).
Да, но на вывод это не повлияет. Этот пробел добавляется, чтобы учитывать последнее слово каждой строки (он в 16 строке удаляется). Это, также, может быть любой символ не являющийся латинской буквой.

Добавлено через 1 минуту
КулХацкеръ, спасибо, но мне нужно исправить свой код
0
What a waste!
1603 / 1297 / 178
Регистрация: 21.04.2012
Сообщений: 2,720
24.02.2018, 19:36 9
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Да, но на вывод это не повлияет.
То, что вы не видите этот символ, ещё не значит, что его там нет)
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Этот пробел добавляется, чтобы учитывать последнее слово каждой строки.
Я вам уже писал, что вы как то странно подошли к решению.
1
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
24.02.2018, 19:44  [ТС] 10
Цитата Сообщение от gray_fox Посмотреть сообщение
То, что вы не видите этот символ, ещё не значит, что его там нет)
Он удаляется в 16 строчке с конца каждого скопированного слова. Я попробую решить задачу по-другому
0
What a waste!
1603 / 1297 / 178
Регистрация: 21.04.2012
Сообщений: 2,720
24.02.2018, 19:49 11
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Он удаляется в 16 строчке с конца каждого скопированного слова.
Ваш код, я только обрамил вывод каждой строки в кавычки: https://ideone.com/VBPk2x
1
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
24.02.2018, 19:53  [ТС] 12
gray_fox, что эта за ссылка? Я по ней пытаюсь пройти, пишет - Forbidden.
0
What a waste!
1603 / 1297 / 178
Регистрация: 21.04.2012
Сообщений: 2,720
24.02.2018, 19:55 13
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Я по ней пытаюсь пройти, пишет - Forbidden.
Поправил.
Цитата Сообщение от Fixer_84 Посмотреть сообщение
что эта за ссылка?
Онлайн-компилятор.
1
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
24.02.2018, 20:02  [ТС] 14
Цитата Сообщение от gray_fox Посмотреть сообщение
Онлайн-компилятор.
Спасибо! Буду исправлять. А чтобы этим компилятором пользоваться, нужно зарегистрироваться? Уж больно это удобно выходит
0
What a waste!
1603 / 1297 / 178
Регистрация: 21.04.2012
Сообщений: 2,720
24.02.2018, 20:04 15
Цитата Сообщение от Fixer_84 Посмотреть сообщение
А чтобы этим компилятором пользоваться, нужно зарегистрироваться?
Нет.
1
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
27.02.2018, 20:52  [ТС] 16
gray_fox, спасибо за подсказки! Исправил ошибку так (теперь принимают):

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
#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    string str, s, res;
    s = res = "";
    while (getline(cin, str))
    {
        str += " ";
        for (int i = 0; i < str.size(); i++)
        {
            s += str[i];
            if (!(isalpha(str[i])))
            {
                s.pop_back();
                reverse(s.begin(), s.end());
                res += s;
                if (i != str.size() - 1)
                    res += str[i];
                s = "";
            }
        }
        cout << res << "\n";
        res = "";
    }
    system("pause");
    return 0;
}
0
What a waste!
1603 / 1297 / 178
Регистрация: 21.04.2012
Сообщений: 2,720
28.02.2018, 02:01 17
Цитата Сообщение от Fixer_84 Посмотреть сообщение
теперь принимают
Это конечно хорошо, но я всё же думаю вам стоит попробовать другой подход к решению задачи, о нём вам уже писали пару раз в этой теме:
Простое шифрование текста
Простое шифрование текста
0
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
09.03.2018, 21:24  [ТС] 18
Цитата Сообщение от gray_fox Посмотреть сообщение
Fixer_84, не проще ли читать посимвольно, и если isalpha(ch) то добавлять в стек пока !isalpha(ch), потом писать этот стек в обратном порядке?
Здравствуйте! Наконец-то решил попробовать предложенный вариант решения данной задачи с помощью стека. Вы не могли бы более подробно описать алгоритм? Почему нужно использовать именно стек?
0
What a waste!
1603 / 1297 / 178
Регистрация: 21.04.2012
Сообщений: 2,720
09.03.2018, 21:36 19
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Вы не могли бы более подробно описать алгоритм?
Копируете ввод, пока isalpha. Как только попался символ !isalpha начинаете, вместо того, что бы выводить символы, сохранять их в стек. Как только попадётся символ isalpha (либо больше нечего читать) выводите содержимое стека (т.е. в обратном порядке). Повторяете сначала.
См. Простое шифрование текста в этой теме.
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Почему нужно использовать именно стек?
Просто это подходящая структура данных для задачи "ввести в прямом порядке / вывести в обратном".
1
1480 / 944 / 811
Регистрация: 30.04.2016
Сообщений: 3,298
24.03.2018, 15:50  [ТС] 20
Цитата Сообщение от gray_fox Посмотреть сообщение
Это конечно хорошо, но я всё же думаю вам стоит попробовать другой подход к решению задачи, о нём вам уже писали пару раз в этой теме:
Здравствуйте! С помощью стека тоже принимают. Это, правда, кажется проще. Вот код:

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 <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    string str;
    stack<char> s;
    while (getline(cin, str)) {
        str += " ";
        for (int i = 0; i < str.size(); i++) {
            if (isalpha(str[i])) {
                s.push(str[i]);
            }
            else {
                while (!s.empty()) {
                    cout << s.top();
                    s.pop();
                }
                if (i != str.size() - 1)
                cout << str[i];
            }
        }
        cout << "\n";
    }
    system("pause");
    return 0;
}
Добавлено через 2 минуты
gray_fox, Кстати, удалось имитировать стек для данной задачи. Мой другой код выглядит вот так (он тоже проходит):

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 <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    string str, s, res;
    s = res = "";
    while (getline(cin, str))
    {
        str += " ";
        for (int i = 0; i < str.size(); i++)
        {
            s = str[i] + s;
            if (!(isalpha(str[i])))
            {
                s.erase(0, 1);
                res += s;
                if (i != str.size() - 1) res += str[i];
                s = "";
            }
        }
        cout << res << "\n";
        res = "";
    }
    system("pause");
    return 0;
}
P.S. Но стек, конечно, понятней
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2018, 15:50

Простое шифрование теста
Доброго дня или вечера. Требуется помощь в написании программы на bilder 6. Надо вводить текст в...

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

Простое шифрование текста, программа зацикливается
Задача состоит в следующем: 1)Считать текстовую информацию из файла 2) Зашифровать информацию 3)...

Простое шифрование текста методом перестановки букв
Программа шифрует текст, введенный в МЕМО, методом перестановки букв, должен быть ключ (из 5 букв...

простое шифрование информации с превращение текста в промежуточный код
помогите пожалуйста с алгоритмом . допустим имеем список c энным количеством фраз, необходимо...

Простое шифрование
зашифровать строку по принципу сдвига букв в алфавите, сдвиг каждый раз на другое число, прошу...


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

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

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