Форум программистов, компьютерный форум CyberForum.ru

Фильтрация введённого текста - C++

Восстановить пароль Регистрация
 
l7tu4ka
0 / 0 / 0
Регистрация: 18.04.2012
Сообщений: 6
01.12.2013, 23:02     Фильтрация введённого текста #1
Собственно задача:
Создать программу, фильтрующую текст, введенный с клавиатуры. Задача программы заключается
в считывании текста и отображении его на экране , используя замену заданного набора символов на пробелы.
Программа должна предлагать следующие варианты наборов символов для фильтрации:

Символы латинского алфавита (нажал, к примеру, "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
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
#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
int update(char a)
{
    if((int(a)>=-128)&&(int(a)<=-81))return((int)a+64);
    else if((int)a==-15)return -26;
    else if((int)a==-16)return -88;
    else if((int(a)>=-32)&&(int(a)<=-17))return ((int)a+16);
    else return 0;
 
}
void print(char s[],int n,int f)
{
    for(int i=0;i<n;i++)
    {
        if(f==1)
            if((((int)s[i]>=65)&&((int)s[i]<=90))||(((int)s[i]>=97)&&((int)s[i]<=122)))cout << ' ';
            else if((int)s[i]<0)cout << char(update(s[i]));
            else cout << s[i];
        if(f==2)
            if((int)s[i]<0)cout << ' ';
            else cout << s[i];
        if(f==3)
            if((s[i]=='.')||(s[i]==',')||(s[i]=='!')||(s[i]=='?'))cout << ' ';
            else if((int)s[i]<0)cout << char(update(s[i]));
            else cout << s[i];
        if(f==4)
            if(((int)s[i]>=48)&&((int)s[i]<=57))cout << ' ';
            else if((int)s[i]<0)cout << char(update(s[i]));
            else cout << s[i];
        if(f==0)
            if((int)s[i]<0)cout << char(update(s[i]));
            else cout << s[i];
    }
    cout << endl << "Фильтр применен\n";
}
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char s[1000];
    cout << "Bведите строку >>\n";
    cin.getline(s,1000);
    int v=0;
    do
    {
        cout<<s;
        cout << "\nМеню фильтров: \n1.Символы латинского алфавита\n2.Символы кириллицы\n";
        cout << "3.Символы пунктуации\n4.Цифры\n5.Вся строка\n0.Bыход\nВаш выбор >> ";
        v=_getch();
        if(v=='1')print(s,strlen(s),1);
        if(v=='2')print(s,strlen(s),2);
        if(v=='3')print(s,strlen(s),3);
        if(v=='4')print(s,strlen(s),4);
        if(v=='5')print(s,strlen(s),0);
 
        _getch();
        system("cls");
    }
    while(v!='0');
}

2я индийская версия
Здесь фильтры могут накладываться, но так же не отменяются(если отфильтровал всё, то строка считай потерялась T_T)
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
#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
 
void Filter(char *S)
{
    static const char *arkir = "аоуеёиэюяыАОУЕЁИЭЮЯЫйцкнгшщзхъфвпрлджчсмтьбЙЦКНГШЩЗХЪФВПРЛДЖЧСМТЬБ";
    static const char *arlat = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM";
    static const char *arsym = "|\\/<>?,.;':\"{}[]~`!@#$%^&*()_+-=";
    static const char *arnum = "1234567890";
    static const char *space = " ";
    int key=_getch();
    while(*S)
    {
        switch(key)
        {
        case '1':
        if(strchr(arkir,*S))    
            *S=*space;
        break;
        case '2':
        if(strchr(arlat,*S))    
            *S=*space;
        break;
        case '3':
        if(strchr(arsym,*S))    
            *S=*space;
        break;
        case '4':
        if(strchr(arnum,*S))
            *S=*space;
        break;
        S++;
    }
}
 
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    
    const int size = 100;
    char S[size];
    cout<<"Введите строку: ";
    cin.getline(S,size);
    while(true)
    {
    cout<<1<<" - kir\n";
    cout<<2<<" - lat\n";
    cout<<3<<" - sym\n";
    cout<<4<<" - num\n";
 
    Filter(S);
    cout<<S<<endl;
    }
    _getch();
}


Помощь очень нужна, братцы!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
l7tu4ka
0 / 0 / 0
Регистрация: 18.04.2012
Сообщений: 6
08.12.2013, 04:06  [ТС]     Фильтрация введённого текста #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
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
#include <iostream>
#include <conio.h>
#include <Windows.h>
using namespace std;
void main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    
    const int size = 100;
    char S[size];
    cout<<"Введите строку: ";
    cin.getline(S,size);
 
    char arkir[] = "аоуеёиэюяыАОУЕЁИЭЮЯЫйцкнгшщзхъфвпрлджчсмтьбЙЦКНГШЩЗХЪФВПРЛДЖЧСМТЬБ";
    char arlat[] = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM";
    char arsym[] = "|\\/<>?,.;':\"{}[]~`!@#$%^&*()_+-=";
    char arnum[] = "1234567890";
    char space = ' ';
    
    int len = strlen(S);
    char kirbuf[size];
    char latbuf[size];
    char symbuf[size];
    char numbuf[size];
 
    while(true)
    {
    cout<<1<<" - kir\n";
    cout<<2<<" - lat\n";
    cout<<3<<" - sym\n";
    cout<<4<<" - num\n";
    int key=_getch();
    for(int i=0;i<len;i++)
    {
        switch(key)
        {
        case '1':
            if(strchr(arkir,S[i]))
            {
                if(S[i]!=' ')
                    kirbuf[i]=S[i];
                S[i]=space;
            }
            else if(strchr(" ",S[i]))
                S[i]=kirbuf[i];
            break;
        case '2':
            if(strchr(arlat,S[i]))  
            {
                if(S[i]!=' ')
                    latbuf[i]=S[i];
                S[i]=space;
            }
            else if(strchr(" ",S[i]))
                S[i]=latbuf[i];
            break;
        case '3':
            if(strchr(arsym,S[i]))  
            {
                if(S[i]!=' ')
                    symbuf[i]=S[i];
                S[i]=space;
            }
            else if(strchr(" ",S[i]))
                S[i]=symbuf[i];
            break;
        case '4':
            if(strchr(arnum,S[i]))
            {
                if(S[i]!=' ')
                    numbuf[i]=S[i];
                S[i]=space;
            }
            else if(strchr(" ",S[i]))
                S[i]=numbuf[i];
            break;
        }
    }
    cout<<S<<endl;
    }
    _getch();
}
madfax
0 / 0 / 0
Регистрация: 05.06.2016
Сообщений: 15
13.07.2016, 18:52     Фильтрация введённого текста #3
вселенная им свои тайны приоткрыла: изучай, познавай тайны

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
#include <iostream>
 
using std::cin;
using std::cout;
using std::endl;
 
void f(char*, char*, unsigned, bool&);
 
void main(){
 
    setlocale(LC_ALL, "Russian");
    const unsigned L = 81;
    char str[L] = "StackOverf1ow опубликовала! Developer/Survey/2ol6.";
    char e[L];
    strcpy_s(e, str);
 
    //expression flags
    bool A = true;
    bool B = true;
    bool C = true;
    bool D = true;
    unsigned tsk;
 
    cout << str;
    cout << "\n\nremove \t1| english char\t2| cyrillic char\n";
    cout << "\t3| punctuation \t4| digits \t5| QUIT";
 
    do{
 
        do{
            cout << "\ntype here# ";
            cin >> tsk;
        } while (tsk<1 || tsk>5);
 
        switch (tsk) {
        case 1: f(str, e, 1, A); break;
        case 2: f(str, e, 2, B); break;
        case 3: f(str, e, 3, C); break;
        case 4: f(str, e, 4, D); break;
        case 5: cout << "bye!\n"; break;
        }
    } while (tsk != 5);
 
 
}
 
void f(char *str, char* buff, unsigned t, bool &Flag){
 
    unsigned len = strlen(str);
 
    for (unsigned i = 0; i < len; i++)
    if (((t == 1) && (str[i] > 64 && str[i] < 123))
        ||
        ((t == 2) && (str[i] >= 'А' && str[i] <= 'я'))
        ||
        ((t == 3) && (str[i] > 32 && str[i] < 48) || (str[i] > 57 && str[i] < 65))
        ||
        ((t == 4) && (str[i] > 47 && str[i] < 58)))
        buff[i] = Flag ? ' ' : str[i];
    
    Flag = !Flag;
    cout << endl << buff << endl;
}
все работает
HenryDukart
 Аватар для HenryDukart
100 / 100 / 28
Регистрация: 05.10.2013
Сообщений: 400
Завершенные тесты: 2
13.07.2016, 18:55     Фильтрация введённого текста #4
madfax,

Не по теме:

01.12.2013, 23:02 Фильтрация введённого текста

Думаю, что вы немного опоздали.

Yandex
Объявления
13.07.2016, 18:55     Фильтрация введённого текста
Ответ Создать тему
Опции темы

Текущее время: 00:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru