0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 29
1

Преобразовать каждое слово в тексте: если слово нечётной длины, то удалить его среднюю букву

18.12.2015, 14:00. Показов 2401. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задан текст. Между словами - пробел, за последним символом точка. Вывести текст, предварительно преобразовав каждое слово: если слово нечётной длины, то удалить его среднюю букву. Задача должна быть решена без использования string.

Вот я сделал для одного слова во всём тексте
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void main () 
{
    system("chcp 1251");
    system("cls");
    cout << "Введите текст:\n\n";
    char text[500];
    gets_s(text);
    int z = strlen(text);
    int s = z/2;
    if (z % 2 == 1)
        {   
        for (int i = s; i < z; i++)
            text[i] = text[i + 1];        
        }
    cout << "\n\nВведённый текст:\n\n";
    cout << endl << text << endl;
_getch();
}


Но я не понимаю, как мне разделить текст на слова:
Кликните здесь для просмотра всего текста
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 <iostream>
#include <conio.h>
 
using namespace std;
 
void main () 
{
    system("chcp 1251");
    system("cls");
    cout << "Введите текст:\n\n";
    char text[500];
    gets_s(text);
    int z = strlen(text);
    int s = z/2;
    for (int i=s; i<z; i++)
    {
        if ((text != " ") && (text != ".") && (z % 2 != 1))
        {
            text[i] = text[i + 1];
        }
    }
    cout << "\n\nВведённый текст:\n\n";
    cout << endl << text << endl;
    _getch();
}

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

В тексте удалить каждое четное слово, продублировать каждое нечетное слово
Не могу решить данную задачу, много чего перечитал, за помощь буду благодарен&quot; &quot;В тексте удалить...

В тексте удалить каждое четное слово, продублировать каждое нечетное слово
Не могу решить данную задачу, много чего перечитал, за помощь буду благодарен В тексте удалить...

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

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

8
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
18.12.2015, 17:29 2
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
#include <stdio.h>
#include <stdlib.h>
 
//-----------------------------------------------------------------------------
int isAlpha(int ch) {
    return (('a' <= ch) && (ch <= 'z'))
           || (('A' <= ch) && (ch <= 'Z'));
}
//-----------------------------------------------------------------------------
int getWord(char* text, char** begin, char** end) {
    for (; *text && !isAlpha(*text); ++text) { ; }
    *begin = text;
 
    for (; isAlpha(*text); ++text) { ; }
    *end = text;
 
    return *end - *begin;
}
//-----------------------------------------------------------------------------
void doLeftShift(char* text) {
    for (; *text; ++text) {
        *text = *(text + 1);
    }
}
//-----------------------------------------------------------------------------
char* doChange(char* text) {
    char* begin, * end, * str = text;
    int len;
 
    while ((len = getWord(str, &begin, &end))) {
        if (len % 2) {
            doLeftShift(begin + (len / 2));
        }
        str = end;
    }
 
    return text;
}
//-----------------------------------------------------------------------------
 
#define MAXLEN 64
 
int main() {
    char text[MAXLEN];
 
    if (!fgets(text, MAXLEN, stdin)) {
        return EXIT_FAILURE;
    }
 
    printf("%s\n", doChange(text));
 
    return EXIT_SUCCESS;
}
Результат выполнения
1
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 29
18.12.2015, 19:29  [ТС] 3
Спасибо. Тут столько указателей и даже есть новые для меня функции, что я в них уже запутался. Можно ли как-то свести к минимуму указатели и сделать всё цельно в рамках int(void) main?
0
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
18.12.2015, 20:56 4
Лучший ответ Сообщение было отмечено plaob как решение

Решение

Цитата Сообщение от plaob Посмотреть сообщение
Можно ли как-то свести к минимуму указатели и сделать всё цельно в рамках int(void) main?
Можно:
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
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
 
#define MAXLEN 64
 
int main() {
    char text[MAXLEN];
    int i, j, begin, end, len;
 
    if (!fgets(text, MAXLEN, stdin)) {
        return EXIT_FAILURE;
    }
 
    for (i = 0; text[i] != '\0';) {
        for (begin = i; (text[begin] != '\0') && !isalpha(text[begin]); ++begin) { ; }
 
        for (end = begin; isalpha(text[end]); ++end) { ; }
 
        if ((len = end - begin) && (len % 2)) {
            for (j = begin + (len / 2); text[j] != '\0'; ++j) {
                text[j] = text[j + 1];
            }
        }
 
        i = end;
    }
 
    printf("%s\n", text);
 
    return EXIT_SUCCESS;
}
1
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 29
18.12.2015, 23:20  [ТС] 5
Большое спасибо, а что делает этот участок кода?
C++
1
2
3
    if (!fgets(text, MAXLEN, stdin)) {
        return EXIT_FAILURE;
    }
Проверка на ошибки?
0
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
19.12.2015, 10:13 6
plaob, угу, проверка на то, что строка была введена. Можете убрать этот участок кода если смущает, и просто написать:
C
1
fgets(text, MAXLEN, stdin);
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 29
19.12.2015, 14:08  [ТС] 7
Да не, не смущает, но всё равно спасибо)
Я думаю теперь как сделать так, чтобы программа не закрывала окно с результатами после завершения работы.
0
...
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
19.12.2015, 14:32 8
В 30-ой строчке, перед return, поставьте:
C
1
system("pause");
Примечание: для ОС Windows
1
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 29
22.12.2015, 21:57  [ТС] 9
Программа не понимает русский язык никак, isalpha работает только с латиницей?

Добавлено через 9 минут
А, всё, я разобрался)
0
22.12.2015, 21:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2015, 21:57
Помогаю со студенческими работами здесь

Преобразовать каждое слово в строк, заменив в нем все предыдущие вхождения его последней буквы на символ «.»
Дана строка, состоящая из слов, набранных заглавными бук-вами и разделенных пробелами (одним или...

Преобразовать каждое слово в строке, заменив в нем все последующие вхождения его первой буквы на символ «.»
помогите пожалуйста решить 3)Дана строка, состоящая из русских слов, набранных заглавными бук-...

Дана строка, в котором есть слово "да" или слово "нет". Если в нем есть слово "нет", то удалить его
Дана строка, в котором есть слово &quot;да&quot; или слово &quot;нет&quot;. Если в нем есть слово &quot;нет&quot;, то удалить его...

Удалить среднюю букву в словах нечетной длины
Помогите пожалуйста решить проблему в моем коде - Если строка начинается с непарного слова то...


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

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

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