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

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

13.05.2023, 05:58. Показов 3799. Ответов 33
Метки c++, си (Все метки)

Студворк — интернет-сервис помощи студентам
Создать функцию для поиска слов в строке, начинающихся с заглавной буквы (возвращается массив указателей на начало слов).
Тестовая программа:
Ввести текст (несколько строк) с клавиатуры, признак окончания – слово «end». Данные размещать в динамической области.
Изменить текст: слова, начинающиеся с заглавной буквы переместить в начало строки. Вывести текст на экран и отформатировать: После точки начинать с «красной строки»


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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <locale.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
 
 
#define MAX_SIZE 300
#define MAX_STR_AMOUNT 15
 
//-------------------------------функции для упражнения 1
 
/*
 
    Hello, world! This is a test.
    Move capital Words to the beginning.
    Tired of this Already to be honest. But i must be Strong!
    end
*/
 
//инициализация текста
char** readText(int* size)
{
    char** text = (char**)malloc(MAX_STR_AMOUNT * sizeof(char*));
    char buff[MAX_SIZE];
    char ending[] = "end";
 
    if (text)
    {
        printf("Введите текст (для окончания введите 'end'):\n");
        while (1)
        {
            fgets(buff, MAX_SIZE, stdin);
            fflush(stdin);
            if (strstr(buff, ending))
                break;
            text[*size] = (char*)malloc(strlen(buff) + 1);
            if (text[*size])
            {
                strcpy_s(text[*size], strlen(buff) + 1, buff);
                (*size)++;
            }
        }
    }
    return text;
}
 
//вывод текста
void printText(char** text, int lines_count)
{
    printf("\n");
    for (int i = 0; i < lines_count; ++i)
        printf("%s", text[i]);
    printf("\n");
}
 
 
//функция, возвращающая массив указателей на слова в тексте, которые начинаются с заглавной буквы. P.S:в массиве хранятся указатели на начало слов
char** find_capital_words(char** text, int count, int* cap_count)
{
    char* word;
    char* next_word = NULL;
    char temp[MAX_SIZE];
    char** cap_words = (char**)malloc(sizeof(char*));
    if (cap_words)
    {
        for (int i = 0; i < count; i++)
        {
            next_word = NULL;
            strcpy_s(temp, strlen(text[i]) + 1, text[i]);
            word = strtok_s(temp, " ", &next_word); //разбиваем строку на отдельные слова
            while (word != NULL)
            {
                if (isupper(word[0]))
                {
                    if (cap_words)
                    {
                        cap_words[*cap_count] = word;
                        (*cap_count)++;
                        cap_words = (char**)realloc(cap_words, (*cap_count + 1) * sizeof(char*));
                    }
                }
                word = strtok_s(NULL, " ", &next_word);
            }
        }
 
    }
    return cap_words;
}
 
 
//функция перемещения слова, которое начинается с заглавной буквы, в начало строки
void move_capital_words(char* str)
{
    char* words[MAX_SIZE];
    int num_words = 0;
    char* next_token = NULL;
    // Разделяем строку на слова
    char* token = strtok_s(str, " ", &next_token);
    while (token != NULL && num_words < MAX_SIZE)
    {
        words[num_words++] = token;
        token = strtok_s(NULL, " ", &next_token);
    }
 
    // Создаем новую строку
    char new_str[MAX_SIZE] = { 0 };
    int new_index = 0;
    for (int i = 0, j = 0; j < num_words; j++)
    {
        printf("j = %d", j);
        printf("%c", words[j][0]);
        if (strlen(words[j]) > 0 && isupper((unsigned char)words[j][0]))
        {
            // Если это слово, которое нужно переместить,
            // добавляем его в начало новой строки
            strcat_s(new_str, MAX_SIZE - 1, words[j]);
            strcat_s(new_str, MAX_SIZE - 1, " ");
        }
        else if (strlen(words[j]) > 0)
        {
            // Если это не заглавное слово,
            // добавляем его в конец новой строки
            strcat_s(new_str, MAX_SIZE - 1, words[j]);
            strcat_s(new_str, MAX_SIZE - 1, " ");
        }
        new_index = strlen(new_str);
    }
    strncpy_s(str, MAX_SIZE, new_str, new_index);
}
 
 
//функция, которая создает красную строку после точки
void print_formatted_text(char** text, int count)
{
    for (int i = 0; i < count; i++) {
        printf("%c", toupper(text[i][0]));
        for (int j = 1; j < strlen(text[i]); j++) {
            if (text[i][j] == '.') {
                printf(".\n\t");
                j++;
            }
            printf("%c", text[i][j]);
        }
        printf("\n");
    }
}
 
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    //-------------------------------Упражнение 1
    printf("Упражнение №1:\n");
    int count = 0; //кол-во введенных строк
    char** text = readText(&count);
    printf("%d\n", count);
 
    int cap_count = 0; //кол-во слов, начинающихся с заглавной буквы и находящихся в начале строки
    char** cap_words = find_capital_words(text, count, &cap_count);
 
    for (int i = 0; i < count; i++)
    {
        printf("Строка до изменения:\n");
        puts(text[i]);
        move_capital_words(text[i]);
        printf("Строка после изменения:\n");
        puts(text[i]);
    }
    printText(text, count);
    print_formatted_text(text, count);
    free(text);
    free(cap_words);
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.05.2023, 05:58
Ответы с готовыми решениями:

Написать с заглавной буквы слово которое начинается с h
Здравствуйте. Есть переменная: text = 'Some text in here', нужно написать с заглавной буквы слово в этой переменной которое начинается с h...

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

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

33
1 / 1 / 0
Регистрация: 25.10.2022
Сообщений: 34
15.05.2023, 20:04  [ТС]
Студворк — интернет-сервис помощи студентам
как это работает тогда
Миниатюры
Нужно создать функцию перемещения слова, которое начинается с заглавной буквы, в начало строки  
0
1 / 1 / 0
Регистрация: 25.10.2022
Сообщений: 34
15.05.2023, 20:05  [ТС]
случайно отправил
Миниатюры
Нужно создать функцию перемещения слова, которое начинается с заглавной буквы, в начало строки  
0
Модератор
Эксперт С++
 Аватар для zss
13789 / 10981 / 6492
Регистрация: 18.12.2011
Сообщений: 29,281
15.05.2023, 20:07
getline символ \n удаляет. Так что, я этого не понимаю.
0
1 / 1 / 0
Регистрация: 25.10.2022
Сообщений: 34
15.05.2023, 20:13  [ТС]
zss, я сейчас запустил без слова тест и все сработало хорошо
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
16.05.2023, 01:45
Цитата Сообщение от lukianchik Посмотреть сообщение
//функция перемещения слова, которое начинается с заглавной буквы, в начало строки
Перемещение слова в начало строки - это ни что иное, как заезженная здесь уже вдоль и поперек функция циклического сдвига массива, которая уже есть в стандартной библиотеке С++ под именем std::rotate.

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

Например: "mamasha Myla ramky romashka Namylivala Mamochku"

Последовательность циклических сдвигов:
Code
1
2
3
4
5
6
7
8
9
10
mamasha Myla ramky romashka Namylivala Mamochku
|----->-----| ROR на 5 символов
 
Myla mamasha ramky romashka Namylivala Mamochku
     |---------------->---------------| ROR на 11 символов
 
Myla Namylivala mamasha ramky romashka Mamochku
                |--------------->--------------| ROR на 9 символов
 
Myla Namylivala Mamochku mamasha ramky romashka
Готово. Надо лишь предусмотреть аккуратную обработку разделителей.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.05.2023, 13:56
Цитата Сообщение от lukianchik Посмотреть сообщение
Создать функцию для поиска слов в строке, начинающихся с заглавной буквы (возвращается массив указателей на начало слов).
А зачем тогда возвращать массив указателей?
Я делал как то, что бы это пригодилось...

Добавлено через 3 минуты
Ну виноват. В институтах не учился.

Добавлено через 11 минут
И ещё, на циклический сдвиг, букоф писать, явно больше надо...
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.05.2023, 14:14
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.05.2023, 15:20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
memset(str_nxt, 0, ln + 4);
for (int i = 1; i <= count; ++i){
    int n{}; char word[25]{};// В строчку ниже, можно наставить ещё условий
while (*(*(ptr_n + i - 1) + n) != ' '&& *(*(ptr_n + i - 1) + n) != '\0'){
        char *e;
        strncat(word, e=((*(ptr_n + i - 1)) + n++), 1);
        *e = ' ';
    }
//strncat(str_nxt, word, strlen(word));
    //strcat(str_nxt, " ");
//-----------------------------
static char *shift_l = str_n;
    static char *shift_r = (*(ptr_n + i - 1) + n);
 
    for (int i = shift_r - shift_l; i >= 0; i--){
        *(str_n + i) = *(str_n + i - strlen(word));
    std::printf("---%s\n", str_n);
    }
std::cin.get();
}
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.05.2023, 15:26
Некоторых вещей не понимаю. Почему с начала звёздочки пишет.

0
1 / 1 / 0
Регистрация: 25.10.2022
Сообщений: 34
16.05.2023, 15:28  [ТС]
Наталья8, у меня с этим кодом буфер переполняется

Добавлено через 1 минуту
Наталья8, может чтобы непустое место было?
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.05.2023, 15:42
Да оно с ошибками. В процессе.
Не доделано..

Добавлено через 1 минуту
Мне интересно я пишу...

Добавлено через 1 минуту
На указателях сложно.
Должен был быть другой способ..
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.05.2023, 17:40
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
//=======================
//=======================
int _tmain(int argc, _TCHAR* argv[])
{
int ln = strlen("hello world. This is a test. Move capital Words to the. Beginning Lenght end");
char *str_n = new char[ln + 1];
strcpy(str_n, "hello world. This is a test. Move capital Words to the. Beginning Lenght end");
    *(str_n + strlen(str_n))='\0';
int count{}, i{};
    while (str_n[i++])if (isupper(str_n[i-1]))count++;// Размер массива указателей
    
char** ptr_n = new char*[count];// Массив указателей
//-----------------------
find_n(str_n, ptr_n);// Вызов функции указатели на слова с заглавной буквы
 
for (int i = 1; i <= count; ++i){
    int n{}; char word[25]{};// В строчку ниже, можно наставить ещё условий
while (*(*(ptr_n + i - 1) + n) != ' '&& *(*(ptr_n + i - 1) + n) != '\0'){
        char *e;
        strncat(word, e=((*(ptr_n + i - 1)) + n++), 1);
        *e = ' ';
    }
//-----------------------------
static char *shift_l = str_n;
    char *shift_r = (*(ptr_n + i - 1) + n);
 
    for (int i = (shift_r - shift_l)-1; i > 0; i--){
        *(shift_l + i) = *(shift_l + i - (strlen(word)) - 1);
    }
    
    //-----------   
    char *j = &word[0];
    while (*j)  *(shift_l++) = *j++;
*(shift_l++) = ' ';
     }
 
for (int i = 0; i < strlen(str_n)+4; i++){// Посимвольно
    std::printf("%c", str_n[i]);// Если встретит точку, с новой строки
    if (str_n[i] == '.')std::printf("\n");
}
 
delete[] ptr_n;// надо бы память освободить
delete[]str_n;
 
std::cin.get();
    return 0;
}


На троечку. Что то тащит за собою на хвосте...
0
1 / 1 / 0
Регистрация: 25.10.2022
Сообщений: 34
16.05.2023, 17:49  [ТС]
Наталья8, у меня опять переполняется куча
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
/*
Hello world. This is a test.
Move capital Words to the beginning.
Tired of this Already to be honest. But i must be Strong   
end
*/
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "RUSSIAN");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Упражнение 1\nВведите несколько строк, признак окончания – слово «end»\n";
    string s, t;
    while (getline(cin, t) && t != "end") {
        s += t;
        
    }
    int ln = s.length();
    char* str_n = new char[ln + 1];
    strcpy(str_n, s.c_str());
    str_n[ln] = '\0';
    *(str_n + strlen(str_n)) = '\0';
 
    int count{}, i{};
 
    while (str_n[i++])if (isupper(str_n[i - 1]))count++;// Размер массива указателей
    char** ptr_n = new char* [count];// Массив указателей
    //-----------------------
    find_n(str_n, ptr_n);// Вызов функции указатели на слова с заглавной буквы
 
    for (int i = 1; i <= count; ++i) 
    {
        int n{}; char word[25]{};// В строчку ниже, можно наставить ещё условий
        while (*(*(ptr_n + i - 1) + n) != ' ' && *(*(ptr_n + i - 1) + n) != '\0') {
            char* e;
            strncat(word, e = ((*(ptr_n + i - 1)) + n++), 1);
            *e = ' ';
        }
        //-----------------------------
        static char* shift_l = str_n;
        char* shift_r = (*(ptr_n + i - 1) + n);
 
        for (int i = (shift_r - shift_l) - 1; i > 0; i--) {
            *(shift_l + i) = *(shift_l + i - (strlen(word)) - 1);
        }
 
        //-----------   
        char* j = &word[0];
        while (*j)  *(shift_l++) = *j++;
        *(shift_l++) = ' ';
    }
 
    for (int i = 0; i < strlen(str_n) + 4; i++) {// Посимвольно
        std::printf("%c", str_n[i]);// Если встретит точку, с новой строки
        if (str_n[i] == '.')std::printf("\n");
    }
 
    delete[] ptr_n;// надо бы память освободить
    delete[]str_n;
 
    std::cin.get();
    return 0;
}
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,220
16.05.2023, 23:45
Лучший ответ Сообщение было отмечено lukianchik как решение

Решение

Добавлено через 5 часов 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
//=======================
int _tmain(int argc, _TCHAR* argv[])
{
int ln = strlen("hello world. This is a test. Move capital Words to the. Beginning Lenght end");
char *str_n = new char[ln + 1];
strcpy(str_n, "hello world. This is a test. Move capital Words to the. Beginning Lenght end");
    *(str_n + strlen(str_n))='\0';
int count{}, i{};
    while (str_n[i++])if (isupper(str_n[i-1]))count++;// Размер массива указателей
    
char** ptr_n = new char*[count];// Массив указателей
//-----------------------
           find_n(str_n, ptr_n);// Вызов функции указатели на слова с заглавной буквы
//-----------------------
for (int i = 1; i <= count; ++i){// =========== Основной цикл
    int n{}; char word[25]{};// В строчку ниже, можно наставить ещё условий
while (*(*(ptr_n + i - 1) + n) != ' '&& *(*(ptr_n + i - 1) + n) != '\0'){// Копировать слово с больш. бкв.
        strncat(word, ((*(ptr_n + i - 1)) + n++), 1);
        }
static char *shift_l = str_n;//Циклический сдвиг вправо
       char *shift_r = (*(ptr_n + i - 1) + n);
   for (int i = (shift_r - shift_l) - 1; i > strlen(word); i--){
        *(shift_l + i) = *(shift_l + i - (strlen(word)) - 1);
        }
char *j = &word[0];// Вставить слово с большой буквы
    while (*j)*(shift_l++) = *j++;
*(shift_l++) = ' ';
     }
for (int i = 0; i < strlen(str_n); i++){//Вывод  посимвольно
    std::printf("%c", str_n[i]);// Если встретит точку, с новой строки
    if (str_n[i] == '.')std::printf("\n");
     }
delete[] ptr_n;// надо бы память освободить
delete[]str_n;
 
std::cin.get();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2023, 23:45

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

Вывод слова из строки, которое начинается и заканчивается на одну и ту же букву
для заданной строки вывести на экран слова, которые начинаются и заканчиваются на одну и ту же букву сделайте без printf, а с cout и...

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

Подсчитать сколько слов начинается с заглавной буквы
Подсчитать сколько слов начинается с заглавной буквы.

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


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru