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

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

17.03.2019, 17:20. Показов 3221. Ответов 3

Author24 — интернет-сервис помощи студентам
Вот такое задание:
Дано предложение, состоящее из слов, разделенных запятой или
пробелами, среди которых есть группы цифр, определяющих целые числа из
диапазона [0..19]. Отредактировать введенную строку, заменив каждое число,
на последовательность, заключенную в круглые скобки, символа +, (если
число четное) или на – (если число нечетное), длина которой равна
найденному числу.

Не понимаю как его сделать, помогите плз.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2019, 17:20
Ответы с готовыми решениями:

Каждую цифру заменить на заключенную в круглые скобки последовательность знаков
Многострочный текст, введенный с клавиатуры, преобразовать следующим образом: каждая цифра...

Каждую цифру заменить на заключенную в круглые скобки последовательность знаков ‘+’
Многострочный текст, введенный с клавиатуры, преобразовать следующим образом: каждая цифра...

В заданном тексте удалить часть текста заключенную в круглые скобки
В заданном тексте удалить часть текста заключенную в круглые скобки ( скобки не удалять).

Заменить в строке все круглые скобки на пробелы
Друзья, помогите пожалуйста решить: "Вводится строка текста, заменить в ней все круглые скобки на...

3
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
17.03.2019, 18:53 2
Лучший ответ Сообщение было отмечено NomNo как решение

Решение

NomNo, здравствуйте! Вот решение. Предполагается, что во введенной строке есть только числа из заданного диапазона [0-19], не содержащие лидирующих нулей:

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
43
44
45
46
47
/*
Дано предложение, состоящее из слов, разделенных запятой или пробелами, среди которых есть группы цифр, определяющих целые числа из диапазона [0..19]. 
Отредактировать введенную строку, заменив каждое число, на последовательность, заключенную в круглые скобки, символа '+', (если число четное) или 
на '-' (если число нечетное), длина которой равна найденному числу.
*/
 
#include <iostream> 
#include <string>
#include <cctype>
 
    using namespace std;
 
int main() {
    int n;
    string s;
    cout << "Enter a sentence:\n";
    getline(cin, s);
    s += " ";
    n = 0;
    for (int i = 0; i < s.length(); i++) {
        if (isdigit(s[i])) {
            n = n * 10 + s[i] - '0';
            if (n == 0) {
                cout << "(+)";
            }
        } else {
            if (n >= 1 && n <= 19) { //Определяем диапазон чисел
                cout << "(";
                if (n % 2 == 0) {
                    for (int i = 1; i <= n; i++) {
                        cout << '+';
                    }
                } else {
                    for (int i = 1; i <= n; i++) {
                        cout << '-';
                    }
                }
                cout << ")";
            }
            cout << s[i];
            n = 0;
        }
    }
    s.pop_back(); //Требуется стандарт C++11 или выше
    system("pause");
    return 0;
}
1
842 / 645 / 323
Регистрация: 24.02.2017
Сообщений: 2,276
17.03.2019, 22:31 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
using namespace std;
 
int main()
{
   string s,t;
    cout << "Enter a sentence:\n";
    getline(cin, s);
    size_t i=0;
    int n;
 
    while(s[i]!='\0'){
      if(!isdigit(s[i]))t+=s[i];
      if(isdigit(s[i])){
         n=0;
         while(isdigit(s[i])){
            n = n * 10 + (s[i] - '0');
            ++i;
          }
         if(n%2==0){
             t+='(';
             for(int j=0;j<n;j++)
                t+='+';
             t+=')';
             }
         if(n%2!=0){
             t+='(';
             for(int j=0;j<n;j++)
                t+='-';
             t+=')';
             }
           i--;
         }
      i++;
      }
   s=t;
   cout<<s;
   system("pause");
   return 0;
}
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
18.03.2019, 16:21 4
NomNo, здравствуйте! Нашел маленький недочет в своей первой программе. Если число было 0, то я заменял его на символ '+', хотя этого делать было не надо (вы не сказали что делать с 0, ведь + или - нулевой длины быть не может). Вообщем, пишите, если эту ситуацию нужно обработать по-другому. А пока вот еще вариант. Я решил использовать для решения регулярные выражения и встроенные функции. Может быть, такой вариант также нужен. Вот код (кстати, если символ 0, эту ситуацию я обработал и просто его вывожу, при этом, если число содержит лидирующие нули оно тоже учитывается):

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
43
44
45
46
47
48
49
50
51
52
53
/*
Дано предложение, состоящее из слов, разделенных запятой или пробелами, среди которых есть группы цифр, определяющих целые числа из диапазона [0-19]. 
Отредактировать введенную строку, заменив каждое число, на последовательность, заключенную в круглые скобки, символа '+', (если число четное) или 
на '-' (если число нечетное), длина которой равна найденному числу. 
Предполагается, что во введенной строке есть только числа из заданного диапазона [0-19], лидирующие нули допускаются.
*/
 
#include <iostream> 
#include <string> 
#include <vector> 
#include <regex>
 
    using namespace std;
 
int main() {
    bool flag = true;
    vector<string> v;
    string s, tmp, ans;
    getline(cin, s);
    tmp = s;
    regex nums("[^0-9]|^([0-9]+)[^0-9]");
    smatch m;
    s += " ";
    while (regex_search(s, m, nums)) {
        if (m[1] != "") {
            if (stoi(m[1]) > 19) {
                flag = false;
            }
            v.push_back(m[1].str());
        }
        s = m.suffix();
    }
    if (flag) {
        cout << "Output of the program:\n";
        for (int i = 0; i < v.size(); i++) {
            string r = "";
            int len = stoi(v[i]);
            if (len % 2 == 0) {
                r.insert(0, len, '+');
            } else {
                r.insert(0, len, '-');
            }
            if (len) {
                ans = tmp.replace(tmp.find(v[i]), v[i].length(), "(" + r + ")");
            }
        }
        cout << ans << "\n";
    } else {
        cout << "Error! Each number in a string should be >= 0 and <= 19!\n";
    }
    system("pause");
    return 0;
}
Добавлено через 35 минут
NomNo, удалось сократить код до такого (без использования дополнительного массива):

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
43
44
45
46
47
48
49
/*
Дано предложение, состоящее из слов, разделенных запятой или пробелами, среди которых есть группы цифр, определяющих целые числа из диапазона [0-19]. 
Отредактировать введенную строку, заменив каждое число, на последовательность, заключенную в круглые скобки, символа '+', (если число четное) или 
на '-' (если число нечетное), длина которой равна найденному числу. 
Предполагается, что во введенной строке есть только числа из заданного диапазона [0-19], допускаются лидирующие нули:
*/
 
#include <iostream> 
#include <string>  
#include <regex>
 
    using namespace std;
 
int main() {
    bool flag = true;
    string s, tmp, ans;
    getline(cin, s);
    tmp = s;
    regex nums("[^0-9]|^([0-9]+)[^0-9]");
    smatch m;
    s += " ";
    while (regex_search(s, m, nums)) {
        if (m[1] != "") {
            if (stoi(m[1]) > 19) {
                flag = false;
            }
            string r = "";
            int len = stoi(m[1]);
            if (len % 2 == 0) {
                r.insert(0, len, '+');
            } else {
                r.insert(0, len, '-');
            }
            if (len) {
                ans = tmp.replace(tmp.find(m[1]), m[1].length(), "(" + r + ")");
            } else {
                ans = tmp.replace(tmp.find(m[1]), m[1].length(), "0");
            }
        }
        s = m.suffix();
    }
    if (flag) {
        cout << ans << "\n";
    } else {
        cout << "Error! Each number in a string should be >= 0 and <= 19!\n";
    }
    system("pause");
    return 0;
}
0
18.03.2019, 16:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2019, 16:21
Помогаю со студенческими работами здесь

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

Дана строка, содержащая латинские буквы и круглые скобки. Если скобки расставлены правильно, то вывести число
Дана строка, содержащая латинские буквы и круглые скобки. Если скобки расставлены правильно, то...

Исклучение группы символов заключённых в круглые скобки
Привет))) Пожалуйста помогите написать программнй код по такой задаче: Исключить из заданной...

Дана строка. Отформатировать круглые скобки в строке
Дана строка. Отформатировать круглые скобки в строке.


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

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