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

Заключить слова в скобки

24.02.2024, 09:07. Показов 2376. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна программа, ставящая скобки вокруг слов (всё что буквы - слова), используя данную функцию Enter_Text, позволяющую работать с текстом как с массивом указателей. Проблемы у меня с одной функцией - vskobki, не понимаю как добавить к слову скобки
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
#include <Windows.h>
#define N 100 
#define L 15
 
/*Функция ввода текста создает массив указателей на строки*/
char** Enter_Text()
{
    char temp[N];
    char** p = (char**) new char*;
    int n = 0; // счетчик количества строк
    while (1)
    {
        gets_s(temp);
        if (temp[0] == '\0') break;   // строка не введена
        p[n] = (char*)malloc(strlen(temp) + 1); // выделили память
        strcpy(p[n], temp);
        n++;
        p = (char**)realloc(p, sizeof(char*) * (n + 1));
    }
    p[n] = NULL;
    return p;
}
 
/* Функция проверяет, является ли символ элементом слова */
int Letter(unsigned char ch)
{
    if (isalnum(ch) == 1 || isalnum(ch) == 2) return 1;
    if (ch >= 192 && ch <= 255) return 1;
    return 0;
}
 
/*Функция разбивает строку на слова*/
int Words(char* String, char w[][L])
{
    int i = 0, j, k = 0, key = 0, n = strlen(String);
    for (j = 0; j <= n; j++)
        if (Letter(String[j]))
        {
            w[k][i] = String[j];
            i++;
            key = 1;
        }
        else
            if (key)
            {
                w[k][i] = '\0';
                i = 0;
                k++;
                key = 0;
            }
    return k;
}
/*Функция заключения слов в скобки */
void* vskobki(char** text)
{
    int i, * count;
    char _words[L][L];
    char x[N] = { '(' }, y[N] = { ')' };
    for (i = 0; text[i] != NULL; i++);
    count = new int[i + 1];
    // Окружаем слова скобками
    for (i = 0; text[i] != NULL; i++)
    {
        count[i] = Words(text[i], _words);
        for (int j = 0; j < count[i]; j++) {
            strcat(x, _words[j]);
            strcat(x, _words[j]);
            *_words[j] = *x;
        }
    }
    return text;
}
 
/*Вывод текста*/
void Output_Text(char** text)
{
    for (int i = 0; text[i] != NULL; i++)
    {
        printf("%s \t", text[i]);
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "rus");
    char** text;
    int a;
    puts(".\nВведите текст:");
    text = Enter_Text();
    vskobki(text);
    puts("\nРезультат: ");
    Output_Text(text);
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2024, 09:07
Ответы с готовыми решениями:

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

Определить, есть ли в данном многострочном тексте указанное слово, и заключить его в квадратные скобки
Помогите, пожалуйста решить задачу. Заранее благодарен. Дан многострочный текст char text. Определить, есть ли в данном тексте...

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

48
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 10:44  [ТС]
Студворк — интернет-сервис помощи студентам
о теперь здорово

Добавлено через 13 секунд
но скобки я так и не смогла поставить(

Добавлено через 37 секунд
а где место взять для скобок:0
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
24.02.2024, 10:58
Ладно, допустим, так:

C
1
2
3
4
5
6
7
8
*x = '(';
x++;
strcat(x, _words[j]);
x--;
int len = strlen(x);
x[len] = ')';
x[len + 1] = '\0';
*_words[j] = *x;
Добавлено через 1 минуту
Надо-таки документацию читать strcat не копирует строки…

Добавлено через 1 минуту
C
1
2
3
4
x = "(";  // строка!
strcat(x, _words[j]);
strcat(x, ")");  // строка!
*_words[j] = *x;
0
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 10:59  [ТС]
х++ не работает(
подчеркивается красным и пишет "выражение должно быть допустимым для изменения левосторонним значением"
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
24.02.2024, 11:04
Попробуй второй вариант, он проще, и скорее всего преподаватель именно это хочет увидеть.
0
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 11:08  [ТС]
вот это?
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
x = "(";  // строка!
strcat(x, _words[j]);
strcat(x, ")");  // строка!
*_words[j] = *x;
оно все равно х подчеркивает((
Миниатюры
Заключить слова в скобки  
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
24.02.2024, 11:11
error: incompatible types in assignment of ‘const char [2]’ to ‘char [100]’
0
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 11:12  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
error: incompatible types in assignment of ‘const char [2]’ to ‘char [100]’
чегось?...
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
24.02.2024, 11:12
C
1
2
3
4
5
            //x = "(";          // строка!
            strcpy(x, "(");
            strcat(x, _words[j]);
            strcat(x, ")");   // строка!
            *_words[j] = *x;
0
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 11: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
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
#include <Windows.h>
#define N 100 
#define L 15
 
// Функция ввода текста создает массив указателей на строки
char** Enter_Text()
{
    char temp[N];
    char** p = (char**) new char*;
    int n = 0; // счетчик количества строк
    while (1)
    {
        gets_s(temp);
        if (temp[0] == '\0') break;   // строка не введена
        p[n] = (char*)malloc(strlen(temp) + 1); // выделили память
        strcpy(p[n], temp);
        n++;
        p = (char**)realloc(p, sizeof(char*) * (n + 1));
    }
    p[n] = NULL;
    return p;
}
 
/* Функция проверяет, является ли символ элементом слова */
int Letter(unsigned char ch)
{
    if (isalpha(ch) != 0) return 1;  // было isalnum
    return ch >= 192;
}
 
// Функция разбивает строку на слова
int Words(char* String, char w[][L])
{
    int i = 0, j, k = 0, key = 0, n = strlen(String);
    for (j = 0; j <= n; j++)
        if (Letter(String[j]))
        {
            w[k][i] = String[j];
            i++;
            key = 1;
        }
        else
            if (key)
            {
                w[k][i] = '\0';
                i = 0;
                k++;
                key = 0;
            }
    return k;
}
/*Функция заключения слов в скобки */
void* vskobki(char** text)
{
    int i, * count;
    char x[N];
    char _words[L][L];
    for (i = 0; text[i] != NULL; i++);
    count = new int[i + 1];
    // Окружаем слова скобками
    for (i = 0; text[i] != NULL; i++)
    {
        count[i] = Words(text[i], _words);
        for (int j = 0; j < count[i]; j++) {
            //x = "(";          // строка!
            strcpy(x, "(");
            strcat(x, _words[j]);
            strcat(x, ")");   // строка!
            *_words[j] = *x;
            puts(_words[j]);
        }
    }
    return text;
}
 
// Вывод текста
void Output_Text(char** text)
{
    for (int i = 0; text[i] != NULL; i++)
    {
        printf("%s \n", text[i]);
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "rus");
    char** text;
    int a;
    puts(".\nВведите текст:");
    text = Enter_Text();
    vskobki(text);
    puts("\nРезультат: ");
    Output_Text(text);
    return 0;
}
Изображения
 
0
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 11:34  [ТС]
оно ставит только одну скобку, убирает первую букву, а еще в результате ничего не меняется....
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,197
24.02.2024, 11:35
Цитата Сообщение от kom tancen Посмотреть сообщение
*_words[j] = *x;
Я уже два или три раза указал вам на это.
0
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 12:14  [ТС]
но я же отсюда скопировала
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
x = "(";  // строка!
strcat(x, _words[j]);
strcat(x, ")");  // строка!
*_words[j] = *x;
это же и есть второй вариант?
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Попробуй второй вариант
Добавлено через 35 минут

белые розы белые розы беззащитны шипы
что с ними сделал снег и морозы
0
Заблокирован
24.02.2024, 12:24
Цитата Сообщение от kom tancen Посмотреть сообщение
умоляю, подскажите как поставить скобки вокруг слов
Есть достойный способ для вашего уровня.
Шаг 1. Проанализировать строку, подсчитать количество слов и всех символов. Так мы сможем получить точную длину выходной строки.
Шаг 2. Непосредственно копирование символов с занесением скобок в необходимых местах.
1
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 12:35  [ТС]
к сожалению, задание нельзя выполнить работая со строками, обязательным условием является использование массивов указателей
0
Заблокирован
24.02.2024, 12:53
Цитата Сообщение от kom tancen Посмотреть сообщение
обязательным условием является использование массивов указателей
Массивы отдельно, Си строки отдельно.
char** массив строк ?
char* строка ?
Один код работает с массивом строк, вызывает код для каждой отльной строки, и следит за удалением предыдущих строк.
Но сама функция добавления скобок будет примерно такого вида :
C++
1
char* add_brackets(const char* text)
0
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 13:08  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
char* add_brackets(const char* text)
я не понимаю что с этим делать
это же просто название функции?
0
Заблокирован
24.02.2024, 13:21
Цитата Сообщение от kom tancen Посмотреть сообщение
я не понимаю что с этим делать
это же просто название функции?
Да, сигнатура/загловок/хидер.

Код ниже делает то что вам нужно с одной строкой.
Вам нужно вызвать функцию add_brackets для каждой вашей строки, проверить вернулся ли ненулевой указатель, если вернулся, то удалить предыдущую строку и вписать этот новый указатель на её место.
Максимально топорно :
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
#include <iostream>
#include <cstring>
#include <cctype>
int analyze(const char* text){
    int sz = 0;
    while(*text){
        ++sz;
        if (isalpha(static_cast<unsigned char>(*text++))){
            sz+=2;
            while(*text && isalpha(static_cast<unsigned char>(*text))){
                ++sz;
                ++text;
            }
        }
    }
    return sz;
}
char* add_brackets(const char* text, const char* rep = "()"){
    int new_text_size = analyze(text);
    int text_size = strlen(text);
    if(new_text_size == text_size)
        return nullptr;
    char* new_text = new char[new_text_size+1];
    char* curr = new_text;
    for(; *text; ++text){
        if (isalpha(static_cast<unsigned char>(*text))){
            *new_text++ = '(';
            while(isalpha(static_cast<unsigned char>(*text)))
                *new_text++ = *text++;
            *new_text++ = ')';
            continue;
        }
        *new_text++ = *text++;
    }
    *new_text = '\0';
    return curr;
}
int main()
{
    const char text[] = "Hello World";
    std::cout << text << std::endl;
    char* res = add_brackets(text);
    std::cout << (res ? res : text) << std::endl;
    delete [] res;
}
Добавлено через 1 минуту
Тестирую, есть баг(и), сейчас исправлю...

Добавлено через 2 минуты
C++
33
        *new_text++ = *text++;
Заменить на
C++
33
        *new_text++ = *text;
Добавлено через 1 минуту
И что бы наверняка :
C++
28
            while(isalpha(static_cast<unsigned char>(*text)))
C++
28
while(*text && isalpha(static_cast<unsigned char>(*text)))
Хотя может эти проверки и излишние ...
Слишком сложно ? )
1
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 13:31  [ТС]
SmallEvil, я попробовала сделать вот это
Цитата Сообщение от SmallEvil Посмотреть сообщение
Вам нужно вызвать функцию add_brackets для каждой вашей строки, проверить вернулся ли ненулевой указатель, если вернулся, то удалить предыдущую строку и вписать этот новый указатель на её место
но похоже как-то не так? если что enter_text мне так и так оставить надо
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <locale.h>
#include <Windows.h>
#define N 100 
#define L 15
#include <iostream>
#include <cstring>
#include <cctype>
 
char** Enter_Text()
{
    char temp[N];
    char** p = (char**) new char*;
    int n = 0; // счетчик количества строк
    while (1)
    {
        gets_s(temp);
        if (temp[0] == '\0') break;   // строка не введена
        p[n] = (char*)malloc(strlen(temp) + 1); // выделили память
        strcpy(p[n], temp);
        n++;
        p = (char**)realloc(p, sizeof(char*) * (n + 1));
    }
    p[n] = NULL;
    return p;
}
int Letter(unsigned char ch)
{
    if (isalpha(ch) != 0) return 1;
    return ch >= 192;
}
 
int analyze(const char* text) {
    int sz = 0;
    while (*text) {
        ++sz;
        if (isalpha(static_cast<unsigned char>(*text++))) {
            sz += 2;
            while (*text && isalpha(static_cast<unsigned char>(*text))) {
                ++sz;
                ++text;
            }
        }
    }
    return sz;
}
 
char* add_brackets(const char* text, const char* rep = "()") {
    int new_text_size = analyze(text);
    int text_size = strlen(text);
    if (new_text_size == text_size)
        return nullptr;
    char* new_text = new char[new_text_size + 1];
    char* curr = new_text;
    for (; *text; ++text) {
        if (isalpha(static_cast<unsigned char>(*text))) {
            *new_text++ = '(';
            while (isalpha(static_cast<unsigned char>(*text)))
                *new_text++ = *text++;
            *new_text++ = ')';
            continue;
        }
        *new_text++ = *text++;
    }
    *new_text = '\0';
    return curr;
}
void* vskobki(char** text)
{
    int i, * count;
    char x[N];
    char _words[L][L];
    for (i = 0; text[i] != NULL; i++) {
        if (add_brackets(*text) != '\0') {
            text[i - 1] = '\0';
            text[i - 1] = *text;
        }
        
    }
    return text;
}
void Output_Text(char** text)
{
    for (int i = 0; text[i] != NULL; i++)
    {
        printf("%s \n", text[i]);
    }
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "rus");
    char** text;
    int a;
    puts(".\nВведите текст:");
    text = Enter_Text();
    vskobki(text);
    puts("\nРезультат: ");
    Output_Text(text);
    return 0;
}
0
Заблокирован
24.02.2024, 13:33
Что то у меня с for и указателями не клеится

C++
25
26
27
28
29
30
31
32
33
34
    while(*text){
        if (isalpha(static_cast<unsigned char>(*text))){
            *new_text++ = '(';
            while(*text && isalpha(static_cast<unsigned char>(*text)))
                *new_text++ = *text++;
            *new_text++ = ')';
            continue;
        }
        *new_text++ = *text++;
    }

Не по теме:

Кажется фсе, мозги "разжижил", можно идти занятся чем то полезным.

1
1 / 1 / 0
Регистрация: 09.12.2023
Сообщений: 46
24.02.2024, 13:38  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Слишком сложно ? )
я вообще уже всё поперепутала у себя, там ошибка на ошибке.......

Добавлено через 4 минуты
SmallEvil, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.02.2024, 13:38
Помогаю со студенческими работами здесь

Распечатать слова через запятую, заключив печатную строку в скобки
В двумерном массиве записаны слова, представляющие собой последовательность цифр, завершающихся 0. Необходимо распечатать слова через...

Заключить слова в кавычки и вывести в TMemo
Есть задание: вывести в Memo список загружаемых файлов(их несколько). С выводом нет проблем: ...

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

Указанное слово заключить в скобки
Вот прога (может пригодится кому...);) Условие (В тексте не более 255 знаков указанное слово заключить в скобки) uses crt; {Label...

Третье слово в предложении заключить в скобки
Нужно создать форму которая Третье слово в предложении заключает в скобки. Ввод предложения с клавиатуры. Уже 2 день сижу над этим...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru