Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
plaob
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 22
1

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

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

Задан текст. Между словами - пробел, за последним символом точка. Вывести текст, предварительно преобразовав каждое слово: если слово нечётной длины, то удалить его среднюю букву. Задача должна быть решена без использования 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2015, 14:00
Ответы с готовыми решениями:

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

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

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

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

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

8
anmartex
...
1711 / 1204 / 909
Регистрация: 12.02.2013
Сообщений: 1,978
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
plaob
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 22
18.12.2015, 19:29  [ТС] 3
Спасибо. Тут столько указателей и даже есть новые для меня функции, что я в них уже запутался. Можно ли как-то свести к минимуму указатели и сделать всё цельно в рамках int(void) main?
0
anmartex
...
1711 / 1204 / 909
Регистрация: 12.02.2013
Сообщений: 1,978
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
plaob
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 22
18.12.2015, 23:20  [ТС] 5
Большое спасибо, а что делает этот участок кода?
C++
1
2
3
    if (!fgets(text, MAXLEN, stdin)) {
        return EXIT_FAILURE;
    }
Проверка на ошибки?
0
anmartex
...
1711 / 1204 / 909
Регистрация: 12.02.2013
Сообщений: 1,978
19.12.2015, 10:13 6
plaob, угу, проверка на то, что строка была введена. Можете убрать этот участок кода если смущает, и просто написать:
C
1
fgets(text, MAXLEN, stdin);
0
plaob
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 22
19.12.2015, 14:08  [ТС] 7
Да не, не смущает, но всё равно спасибо)
Я думаю теперь как сделать так, чтобы программа не закрывала окно с результатами после завершения работы.
0
anmartex
...
1711 / 1204 / 909
Регистрация: 12.02.2013
Сообщений: 1,978
19.12.2015, 14:32 8
В 30-ой строчке, перед return, поставьте:
C
1
system("pause");
Примечание: для ОС Windows
1
plaob
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 22
22.12.2015, 21:57  [ТС] 9
Программа не понимает русский язык никак, isalpha работает только с латиницей?

Добавлено через 9 минут
А, всё, я разобрался)
0
22.12.2015, 21:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2015, 21:57

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru