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

Поиск вхождения строки во множество, игнорируя знак * - C++

Восстановить пароль Регистрация
 
Avokado
Сообщений: n/a
15.05.2011, 22:21     Поиск вхождения строки во множество, игнорируя знак * #1
Здравствуйте=) Помогите немного с задачкой
Даны текстовые файлы F и G, компоненты которых являются строками, содержащими до 10 символов. С помощью контейнера stl::set переписать в файл H все компоненты файла F, не входящие в файл G, причем в строках файла G могут встречаться символы *, которые следует интерпретировать как совпадающие со всеми символами. Реализовать свои функции сравнения, игнорирующие несовпадение по символу *.
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
class ex
{
public: char *st;
        ex(char *s) {st=new char(*s);
        }
        ex(ex &p) {st=new char(*p.st);}
        ~ex(void) {delete [] st;}
    bool operator== (const ex & s1)    {
        char *i,*j,*k,*sub1,*sub2; int o;
        if (strlen(sg1.st)!=strlen(this->st)) return false; // если длины строк не равны, то строки не могут быть равными
        i=strchr(sg1.st,'*');
        j=sg1.st;
        k=this->st;
        if (i==NULL) return (strcmp(this->st,sg1.st)==0);//если символов * нет, то просто сравнить строки
        sub1=new char(*this->st);
        sub2=new char(*sg1.st);
        strncpy(sub1,k,i-j); //вспомогательные строки (подстроки между символами *)
        strncpy(sub2,j,i-j);
        while (strcmp(sub1,sub2)==0 && i!=NULL) //пока подстроки равны и есть символы *
        {
            j=i+1;
            o=i-j;
            k=k+o;
            i=strchr(j,'*');
            if (i!=NULL)
            {
                strncpy(sub1,k,i-j);
                strncpy(sub2,j,i-j);
            }
        }
        if (i!=NULL) return false; //если выход из цикла по 1 условию, то строки не равны, иначе сравнить последние кусочки:
        strncpy(sub1,k,strlen(this->st)-strlen(k));
        strncpy(sub2,j,strlen(sg1.st)-strlen(j));
        return (strcmp(sub1,sub2)==0);
    }
};
 
void fillSet(set<ex> &words, const char *fname)
{
    FILE *f;
    char inp[11];
 
    if (!(f=fopen(fname, "r"))) return;
    words.clear();
    while (fgets(inp, 10, f))
    {
        inp[strlen(inp)-1] = 0;
        words.insert(inp);
            
    }
    fclose(f);
}
 
void printSet(const set<ex> &source)
{
    FILE *h;
    h = fopen("H.txt", "w");
    if (source.size()==0) cout<<"Элементы множеств совпадают"<<endl;
    else
    {
        set<ex>::const_iterator i;
        for (i=source.begin(); i != source.end(); i++) fputs((*i).st,h);
    }
    fclose(h);
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "russian");
 
    set<ex> words1, words2, inter;
 
    fillSet(words1, "F.txt");
    fillSet(words2, "G.txt");
 
    diffSet(words1, words2, inter);
    printSet(inter);
 
    _getch();
    return 0;
}
Помогите, пожалуйста, написать функцию diffSet. Мной перепробованы варианты с find и с просто вложенными циклами, последний нерабочий вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void diffSet(const set<ex> &source1, const set<ex> &source2, set<ex> &dest)
{
    set<ex>::const_iterator i,j;
    dest.clear();
for (i = source1.begin(); i != source1.end(); i++)
    {   
        for (j=source2.begin(); j != source2.end(); j++)
        {
            if (*i==*j) dest.insert(*i);
        }
    }
}
P.S. я знаю, что местами я пишу чуть некрасиво, но уж простите нуба в с++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2011, 22:21     Поиск вхождения строки во множество, игнорируя знак *
Посмотрите здесь:

C++ Функция сравнивает две строки, игнорируя различия в регистрах
Разработать функцию, которая сравнивает две строки, игнорируя количество пробелов между словами C++
C++ Разработать функцию, которая сравнивает две строки, игнорируя количество пробелов между словами.
C++ C++ поиск слова в строке, игнорируя остальные
C++ функция getline считывает несколько строк из файла, игнорируя символ новой строки
Сравнить строки, игнорируя регистр C++
C++ Определить функцию, которая, игнорируя исходное деление файла на строки, переформатирует его
Поиск вхождения подстроки C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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