Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 03.11.2019
Сообщений: 4

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

03.11.2019, 14:18. Показов 1405. Ответов 4

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

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

Первоочередной задачей будет избавление от буквы c, которая в сочетаниях сi и сe будет изменяться на s, в сочетании ck — опускаться, а в остальных случаях заменяться на k. При этом все замены будут производиться в строгом порядке слева направо. То есть, например, в слове «success» сначала первая из двух букв c заменится на k, а затем вторая — на s, то есть получится «suksess». А слово «cck» превратится в «kk».

На второй год из английских слов изымут все удвоенные буквы: ee изменят на i, oo — на u, a в остальных комбинациях будут просто писать одну букву вместо двух одинаковых. Такие замены также будут делать строго в порядке слева направо. Так, слово «ooo» превратится в «uo», а «oou» — просто в «u» (в нем сначала oo заменится на u, а затем uu — на u), слово «iee» превратится в «i» (в нем сначала ee заменится на i, а затем ii — на i).

На третий год на конце слова станут опускать букву е, если она не единственная буква в слове.

Наконец, завершением реформы станет отмена артиклей (в английском языке три артикля: а, an и the). При этом удаляться эти артикли будут только тогда, когда они в исходном тексте были словами a, an, the. То есть, например, текст «the table» после реформ первых трех лет превратиться в «th tabl», а после реформы четвертого года — просто в «tabl». А слово «aaaaa» после реформы первых лет станет словом «a», но поскольку изначально оно не было словом «a» (артиклем), то оно в итоге так и останется словом «a».

Напишите программу, которая будет переводить классический английский текст на Eвроинглиш.

Формат входных данных
На вход подается одна строка текста, состоящая не более чем из 200 символов: латинских строчных и заглавных букв, пробелов и знаков препинания (в тексте могут встречаться: точка, запятая, вопросительный и восклицательный знаки, двоеточие, тире, точка с запятой, открывающаяся и закрывающаяся скобки, апострофы, кавычки). Заглавные буквы могут встречаться только в начале слова. Нигде подряд не могут стоять два пробела. В начале и в конце строки не может стоять пробел. Слова отделяются друг от друга пробелами и/или знаками препинания.
Формат выходных данных
На экран выдать преобразованную строку при ограничениях:
1.начинаться с заглавной буквы должны те и только те слова, которые начинались с заглавной буквы в исходном тексте;
2.не должно встречаться двух пробелов подряд;
3.пробелы между словами и знаками препинания должны остаться там и только там, где они были в исходной строке, в начале и в конце строки пробелов быть не должно.

входные данные
выходные данные

cacao and coffee
kakao and kofi
Cinderella! Where Is The Dress???
Sinderela! Wher Is Dres???
'A' is a letter
'' is leter
!!!Hello!!!A-the-"word"
!!!Helo!!!--"word"

Код:
C++ (Qt)
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
#include <iostream>
#include <cstring>
 
using namespace std;
 
int split(char *s, char words[][201], const char *dividers = " _;/") {
    if (!s) return -1;
    int count = 0;
    char *nextword_ptr = nullptr;
    do {
        nextword_ptr = strtok(!count ? s : nullptr, dividers);
        if (nextword_ptr)
            strncpy(words[count++], nextword_ptr, strlen(nextword_ptr));
    } while (nextword_ptr);
    return count;
}
 
void anti_ci_ce(char word[], int word_count){
    for (int i=0; i<word_count-1; i++){
        if (word[i+1] == 'i' || word[i+1] == 'e'){
            if      (word[i] == 'C') word[i] = 'S';
            else if (word[i] == 'c') word[i] = 's';
        }
    }
}
 
void anti_ck(char word[], int word_count){
    for (int i=0; i<word_count-1; i++){
        if (word[i+1] == 'k'){
            if (word[i] == 'C'){
                word[i] = 'K';
                if (i+2 != word_count){
                    for (int j=i+1; j<word_count-1; j++){
                        word[j] = word[j+1];
                    }
                    word[word_count-1] = {};
                }else word[i+1] = {};
            }else if (word[i] == 'c'){
                word[i] = 'k';
                if (i+2 != word_count){
                    for (int j=i+1; j<word_count-1; j++){
                        word[j] = word[j+1];
                    }
                    word[word_count-1] = {};
                }else word[i+1] = {};
            }
        }
    }
}
 
void anti_c(char word[], int word_count){
    for (int i=0; i<word_count-1; i++){
        if ((word[i] == 'C' || word[i] == 'c') && word[i+1] != 'e' && word[i+1] != 'i' && word[i+1] != 'k'){
            if (word[i] == 'C'){
                word[i] = 'K';
            }else if (word[i] == 'c'){
                word[i] = 'k';
            }
        }
    }
}
 
void anti_ee(char word[], int word_count){
    for (int i=0; i<word_count-1; i++){
        if (word[i+1] == 'e'){
            if (word[i] == 'E'){
                word[i] = 'I';
                if (i+2 != word_count){
                    for (int j=i+1; j<word_count-1; j++){
                        word[j] = word[j+1];
                    }
                    word[word_count-1] = {};
                }else word[i+1] = {};
            }else if (word[i] == 'e'){
                word[i] = 'i';
                if (i+2 != word_count){
                    for (int j=i+1; j<word_count-1; j++){
                        word[j] = word[j+1];
                    }
                    word[word_count-1] = {};
                }else word[i+1] = {};
            }
        }
    }
}
 
void anti_oo(char word[], int word_count){
    for (int i=0; i<word_count-1; i++){
        if (word[i+1] == 'o'){
            if (word[i] == 'O'){
                word[i] = 'U';
                if (i+2 != word_count){
                    for (int j=i+1; j<word_count-1; j++){
                        word[j] = word[j+1];
                    }
                    word[word_count-1] = {};
                }else word[i+1] = {};
            }else if (word[i] == 'o'){
                word[i] = 'u';
                if (i+2 != word_count){
                    for (int j=i+1; j<word_count-1; j++){
                        word[j] = word[j+1];
                    }
                    word[word_count-1] = {};
                }else word[i+1] = {};
            }
        }
    }
}
 
void anti_double(char word[], int word_count){
    for (int i=0; i<word_count-1; i++){
        if (word[i] == word[i+1] && !(word[i] == 'e' && word[i] == 'o')){
            if (i+2 != word_count){
                for (int j=i+1; j<word_count-1; j++){
                    word[j] = word[j+1];
                }
                word[word_count-1] = {};
            }else word[i+1] = {};
        }
    }
}
 
void anti_last_e(char word[], int word_count){
    if (word[0] != 'E' || word[0] != 'e') word[word_count-1] = {};
}
 
void anti_article(char word[], int word_count){
    for (int i=0; i<word_count; i++){
        if ((word[i] == 'A' || word[i] == 'a') && !(isalpha(word[i+1] && isalpha(i-1)))){
            for (int j=i; j<word_count-1; j++){
                word[j] = word[j+1];
            }
            word[word_count-1] = {};
        }
    }
 
    for (int i=0; i<word_count-1; i++){
        if ((word[i] == 'A' || word[i] == 'a') && word[i+1] == 'n' && !(isalpha(word[i+2]) && isalpha(i-1))){
            for (int j=i; j<word_count-1; j++){
                word[j] = word[j+2];
            }
            word[word_count-1] = {};
        }
    }
 
    for (int i=0; i<word_count-2; i++){
        if ((word[i] == 'T' || word[i] == 't') && word[i+1] == 'h' && word[i+2] == 'e' && !(isalpha(word[i+3]) && isalpha(i-1))){
            for (int j=i; j<word_count-1; j++){
                word[j] = word[j+3];
            }
            word[word_count-1] = {};
        }
    }
}
 
//void distribution(char words[201][201], int all_words_count){
//    int word_count;
//    bool flag = true;
 
//    for (int i=0; i<all_words_count; i++){
//        word_count = strlen(words[i]);
//        anti_article(words[i], word_count);
//    }
 
//    for (int i=0; i<all_words_count; i++){
//        word_count = strlen(words[i]);
//        for (int j=0; j<word_count; j++){
//            if ((words[i][j] == 'C' || words[i][j] == 'c') && (words[i][j+1] == 'j' || words[i][j+1] == 'e')){
//                anti_ci_ce(words[i], word_count);
//                j = 0;
//            }
//            else if ((words[i][j] == 'C' || words[i][j] == 'c') && words[i][j+1] == 'k'){
//                anti_ck(words[i], word_count);
//                j = 0;
//            }
//            else if ((words[i][j] == 'C' || words[i][j] == 'c') && !(words[i][j+1] == 'e' && words[i][j+1] == 'j' && words[i][j+1] == 'k')){
//                anti_c(words[i], word_count);
//                j = 0;
//            }
//            else if ((words[i][j] == 'E' || words[i][j] == 'e') && words[i][j+1] == 'e'){
//                anti_ee(words[i], word_count);
//                j = 0;
//            }
//            else if ((words[i][j+1] == 'O' || words[i][j+1] == 'o') && words[i][j+1] == 'o'){
//                anti_oo(words[i], word_count);
//                j = 0;
//            }
//            else if ((words[i][j] == words[i][j+1]) && !(words[i][j] == 'e' && words[i][j] == 'o')){
//                anti_double(words[i], word_count);
//                j = 0;
//            }
//            else if ((words[i][0] != 'E' || words[i][0] != 'e') && words[i][word_count-1] == 'e'){
//                anti_last_e(words[i], word_count);
//                j = 0;
//            }
//        }
//    }
 
//}
 
int main()
{
    char string[200], words[201][201];
    int all_words_count;
    int word_count;
 
    cin.getline(string, 201);
    all_words_count = split(string, words);
 
//    distribution(words, all_words_count);
    for (int i=0; i<all_words_count; i++){
        word_count = strlen(words[i]);
//        anti_ci_ce(words[i], word_count);
//        anti_c(words[i], word_count);
//        anti_ck(words[i], word_count);
//        anti_ee(words[i], word_count);
//        anti_oo(words[i], word_count);
//        anti_double(words[i], word_count);
//        anti_article(words[i], word_count);
//        anti_last_e(words[i], word_count);
    }
 
    for (int i=0; i<all_words_count; i++) cout << words[i] << " ";
    return 0;
}
Все функции "anti_" написаны правильно и работают исправно, проблемы две большая и не очень. Первая - после удаления артиклей остаётся пробел, его надо бы убрать, и вторая - не могу написать основную функцию, которая будет активировать нужные функции при необходимости. Вся закоментированная функция - это моя неудачная попытка попытка, а коменты в main() это вызов той функции и все основные функции (anti()). Помогите дорешать задачу.
P.S. Это моя первая +-сложная задача, за оформление сильно не ругайте пожалуйста.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2019, 14:18
Ответы с готовыми решениями:

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

Разработать таблицу имен, обеспечивающую динамическое выделение памяти под имена по мере надобности
Разработать таблицу имен, обеспечивающую динамическое выделение памяти под имена по мере надобности. Таблица должна быть построена на...

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

4
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,362
03.11.2019, 21:01
Убрать пробел не должно быть проблемой, с таким вопросом даже не следует обращаться.
А ваша distribution() - слишком сложная и нерационально потребляет ресурсы. Как я понял,
слова в строке преобразуются одно за другим, так перебирайте их, двигаясь по входной строке,
пока он не кончится. Она ведь у вас так или иначе есть, т.е. есть указатель на её начало. Не требуется
хранить сразу все слова, достаточно два соседних на случай артикля. Сделайте distribution() для одного
слова, дальше будет проще.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,274
03.11.2019, 23:51
А откуда эта задача?
0
0 / 0 / 0
Регистрация: 03.11.2019
Сообщений: 4
20.11.2019, 21:47  [ТС]
МШП - онлайн Школа Программистов, на кр к курсу C++ была задача. практически успел решить.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,274
24.11.2019, 08:53
Спасибо. Я тоже решил, из интереса:
Миниатюры
Не получается создать функцию, которая должна подставлять другие функции по мере надобности  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2019, 08:53
Помогаю со студенческими работами здесь

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

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

Процедуры и функции: Создать функцию которая из двух чисел выбирает максимальное
Задание 1.Сгенерировать массив из N элементов числами от A до B(A&lt;В), используя процедуру. (N,A, и B вводятся с клавиатуры). Задание 2....

Создать функцию для вычисления величин. Создать программу которая использует данную функцию
Создать функцию для вычисления величин. Создать программу которая использует данную функцию. f(X, Y,...

Написать функцию, которая должна выводить число в текстовом варианте
Написать функцию, какая принимает число от 1 до 99. Функция должна выводить число в текстовом варианте. Например f(58), выводить...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru