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

Реализовать парсер текста, заменяющий заданный набор символов на пробелы

27.09.2016, 20:15. Показов 2174. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый вечер! Ребят, очень нуждаюсь в вашей помощи)
Задача следующая: Создать программу, фильтрующую текст, введенный с клавиатуры. Задача программы заключается в считывании текста и отображении его на экране, используя замену заданного набора символов на пробелы. Программа должна предлагать следующие варианты наборов символов для фильтрации:
■ Символы латинского алфавита
■ Символы кириллицы
■ Символы пунктуации
■ Цифры
Фильтры могут накладываться последовательно. При повторной установке существующего фильтра данный фильтр должен сниматься.

Сначала пытаюсь сделать без считывания введенного текста, т.е. чтобы использовалась просто заготовка. Программа работает, но! Отрабатывается только первый по очереди фильтр (в моём коде - кириллица) и на включение, и на выключение. А после отработки этого фильтра всё.. Ошибка... Я не могу понять где ошибка и что конкретно нужно исправить. Заранее спасибо за любые советы.

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
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
using namespace std;
 
struct filtr
{
unsigned int kiril:1;
unsigned int latin:1;
unsigned int simv:1;
unsigned int chisl:1;
} simv;
 
void SostoyanieFil (filtr simv)
{
    cout<<"\nСостояние фильтров на данный момент:\n";
    cout<<"Кириллица: ";
    if(simv.kiril==0) cout<<"выкл.";
    else cout<<"вкл.";
    cout<<"\nЛатиница: ";
    if(simv.latin==0) cout<<"выкл.";
    else cout<<"вкл.";
    cout<<"\nСимволы пунктуации: ";
    if(simv.simv==0) cout<<"выкл.";
    else cout<<"вкл.";
    cout<<"\nЦифры: ";
    if(simv.chisl==0) cout<<"выкл.\n\n";
    else cout<<"вкл.\n\n";
}
 
void main()
{
setlocale (LC_ALL, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
 
int n, ch;
char choice;
do {
cout<<"\nОтобразить и изменить фильтры?\n";
cout<<"1 - да, 2 - нет\n";
cin>>choice;
    while((choice!='1')&&(choice!='2'))
    {
    cout<<"Неверный выбор! Повторите\n";
    cin>>choice;
    }
if(choice=='1')
{
    SostoyanieFil(simv);
    cout << "Выберите действие:\n";
    cout<<"\n1 - Вкл./выкл. фильтр кирилицы";
    cout<<"\n2 - Вкл./выкл. фильтр латиницы";
    cout<<"\n3 - Вкл./выкл. фильтр для знаков пунктуации";
    cout<<"\n4 - Вкл./выкл. фильтр для цифр";
    cout<<"\n5 - Оставить без изменений\n";
    cin>>ch;
    switch(ch)
    {
    case 1:
    {
        n=simv.kiril^1;
        simv.kiril=n;
    } 
    break;
    case 2:
    {
        n=simv.latin^1;
        simv.latin=n;
    }
    break;
    case 3:
    {
        n=simv.simv^1;
        simv.simv=n;
    }
    break;
    case 4:
    {
        n=simv.chisl^1;
        simv.chisl=n;
    }
    break;
    case 5: continue;
    }
    SostoyanieFil(simv);
    }
 
    char *kir = "аоуеёиэюяыАОУЕЁИЭЮЯЫйцкнгшщзхъфвпрлджчсмтьбЙЦКНГШЩЗХЪФВПРЛДЖЧСМТЬБ";
    char *lat = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM";
    char *sim = "|\\/<>?,.;':"{}[]~`!@#$%^&*()_+-=";
    char *chis = "1234567890";
 
    cout << "Текст для фильтрации:\n";
    char text[] = "qpawjevby АБВГДорд :"{}[]~ 123456";
    char *p = text; 
    cout << text << endl;
    
    for (int i=0; i<=*p; i++)
    {
// кириллица
    if(simv.kiril==1)//проверяем значение
        {
            while ((p = strpbrk(p,kir))!=NULL)
            {
            *p = ' ';
            p++;
            }
        }
        else break;
// латиница
    if(simv.latin==1)
        {
            while ((p = strpbrk(p,lat))!=NULL)
            {
            *p = ' ';
            p++;
            }
        }
        else break;
// символы
    if(simv.simv==1)
        {
            while ((p = strpbrk(p,sim))!=NULL)
            {
            *p = ' ';
            p++;
            }
        } 
        else break;
// числа
    if(simv.chisl==1)
        {
            while ((p = strpbrk(p,chis))!=NULL)
            {
            *p = ' ';
            p++;
            }
        } 
        else break;     
    }
    cout << "\nОтфильтрованный текст:\n";
    cout<<text<<endl;
 
    cout<<"\nПродолжить?\n";
    cout<<"1 - да, 2 - нет\n";
    cin>>choice;
        while((choice!='1')&&(choice!='2'))
        {
        cout<<"Неверный выбор! Повторите\n";
        cin>>choice;
        }
} while (choice!='2');
system("pause");
}
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.09.2016, 20:15
Ответы с готовыми решениями:

While.do repeat.until: вывести на экран заданный набор символов
Написать две программы, которые выводят на экран заданный набор символов. Одна программа должна использовать только цикл while…do, а...

Циклы while.do и repeat.until: выводят на экран заданный набор символов
Написать две программы, которые выводят на экран заданный набор символов. Одна программа должна использовать только цикл while…do, а...

Написать две программы, которые выводят на экран заданный набор символов
Написать две программы, которые выводят на экран заданный набор символов. Одна программа должна использовать только цикл while…do, а...

10
Helper C/C++
 Аватар для Invader0x7F
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
27.09.2016, 20:26
А ЗАЧЕМ ? так сложно. Просто в цикле считывайте очередной символ через _getch() и проверяйте если данный символ 'A' - 'Z' || 'a' - 'z', то выполняйте одно действие, если же 0 - 9, то другое, если от 'А' - 'Я' || 'а' - 'я', то третье и т.д.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char c = '\0';
while ((c = _getch()) != '\0')
{
       if (c >= 'A' && c <= 'Z')
       {
       }
 
       else if (c >= '0' && c <= '9')
       {
       }
 
       // **********************
}
Также можете использовать функции #include <ctype.h> или #include <cctype>

Вот и все.
1
1 / 1 / 0
Регистрация: 02.07.2016
Сообщений: 11
27.09.2016, 20:30  [ТС]
Извините, но я уже сделала так, как сделала) Мне бы в этом варианте ошибку найти.. Но если уж никак не получится, то сделаю по вашему совету, спасибо!
0
Helper C/C++
 Аватар для Invader0x7F
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
27.09.2016, 20:33
Просто, так как я показал проще и надежнее. Не понимаю зачем все эти сложности с фильтрами.
0
1 / 1 / 0
Регистрация: 02.07.2016
Сообщений: 11
27.09.2016, 20:44  [ТС]
Дак в этом и интерес, чтобы отображало какой включен, а какой нет)
0
Helper C/C++
 Аватар для Invader0x7F
286 / 163 / 122
Регистрация: 22.09.2016
Сообщений: 518
27.09.2016, 20:46
Я обязательно разберусь в вашей "идее" но уже завтра.

Добавлено через 1 минуту
В принципе, для решения такой задачи стандартный ввод бы не использовал, а считывал текст и файла и парсил.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.09.2016, 00:11
Цитата Сообщение от _Nemesis_ Посмотреть сообщение
следующие варианты наборов символов
Ну, так и сделайте 4 фильтра и накладывайте их как угодно.
0
1 / 1 / 0
Регистрация: 02.07.2016
Сообщений: 11
28.09.2016, 09:19  [ТС]
Ну я же сделала 4 фильтра, но работает из них только первый по счету. А другие нет. Это и хочу исправить
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.09.2016, 11:43
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int f1(int iChr)
{
   return F1_ON   ?  filter1(iChr)  :  iChr;
}
 
int f2(int iChr)
{
// ...
}
 
int f3(int iChr)
{
// ...
}
 
int f4(int iChr)
{
// ...
}
 
putchar(f4(f3(f2(f1(getchar())))));
1
1 / 1 / 0
Регистрация: 02.07.2016
Сообщений: 11
28.09.2016, 15:32  [ТС]
Всем спасибо, ошибка исправлена! Тему можно удалять)
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
28.09.2016, 16:17
_Nemesis_, На будущее.
Цитата Сообщение от Правила форума
2.3. Сообщения и темы, а также другой контент, размещаемый на форуме, по просьбам пользователей не удаляется и не закрывается.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2016, 16:17
Помогаю со студенческими работами здесь

Удалить во всех строках текста слова предшествующие словам, содержащим заданный набор букв.
Удалить во всех строках текста слова предшествующие словам, содержащим заданный набор букв. Можно сделать одним из 3-х вариантов: 1...

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

Удалить из текста пробелы и подсчитать число удаленных символов
1) Написать программу, вычисляющую значение выражения: 1! + 2! + … + N! (содержащую процедуру вычисления факториала). (Процедуры) ...

Удалить из заданного текста символы “пробелы” и подсчитать количество удаленных символов
Удалить из заданного текста символы “пробелы” и подсчитать количество удаленных символов и длину сформированного текста

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
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, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru