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

Найти наибольшее общее слово - C++

Восстановить пароль Регистрация
 
antiwar007
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 24
29.03.2013, 15:49     Найти наибольшее общее слово #1
Из двух файлов file1.dat и file2.dat читают два текста. Найти наибольшее общее слово.
Я читаю текст но как именно определить слова?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 15:49     Найти наибольшее общее слово
Посмотрите здесь:

в заданном тексте определить слово, в котором заданный символ встретится наибольшее число раз C++
C++ Yайти в тексте слово, содержащее наибольшее количество гласных
C++ Ввести строку, вывести слово, содержащее наибольшее количество гласных букв
Наибольшее общее кратное C++
C++ нужно удалить из строки наибольшее и наименьшее слово
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexandrgx
Заблокирован
29.03.2013, 16:11     Найти наибольшее общее слово #2
Цитата Сообщение от antiwar007 Посмотреть сообщение
Я читаю текст но как именно определить слова?
Разбить текст на отдельные подстроки (слова (разделение - пробельные символы)), исключая знаки... Далее, эти подстроки поместить в массив. И определить длину (кол-во символов) каждого массива и найти идентичные массивы. Вот небольшой алгоритм... Без STL не обойтись: необходимо будет использовать векторы (динамические массивы).
IrineK
Заблокирован
30.03.2013, 14:55     Найти наибольшее общее слово #3
fscanf - считывает что-угодно до пробела. Если это слово - в формате указываем "%s"

Добавлено через 25 минут
Алгоритм такой:
1. Создаем файл word1.dat из уникальных слов текста file1.dat, для чего:
1) достаем слово из файла;
2) чистим его от "налипших" точек-запятых;
3) приводим к прописным буквам (tolower);
4) проверяем ,есть ли оно уже в word1.dat, если нет - записываем.
2. Аналогично создаем word2.dat
3. Находим общие слова в word1.dat и word2.dat. Записываем их в common.dat
4. Проходим по common.dat, находим самое длинное слово, любуемся на него на консоли )

Добавлено через 21 час 54 минуты
Если в плюсах, тогда так:

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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
//Two files of texts are given. Find the longest common word which both of them contain.
 
#include <iostream>
#include <fstream>
using namespace std;
 
//--------------------------------------------------------------------------------------
//function checks if the given character is a delimiter
//returns 1 if it is, 0 - if not
//--------------------------------------------------------------------------------------
int isDelimiter(char c)
{   int i=0;
    char delimiters [] = {' ','.',',','-',':',';','!','?',
                        '(',')','{','}','[',']','<','>','\'','"'};
    while(delimiters[i])
        if(c == delimiters[i++])
            return 1;
    return 0;
}
 
//--------------------------------------------------------------------------------------
//procedure creates list of unique words found in the given file
//the list is kept in another file
//--------------------------------------------------------------------------------------
void listOfWords(fstream &fText, const char *fWordsName)
{   char word[50], compare[50];
    int i, cur, onlyDelims, isIn;
    fstream fWords;
    
    fWords.open (fWordsName, fstream::in|fstream::out|fstream::trunc);
    if(!fWords)
    {   cout<<"Error creating file for words\n";
        cin.get();
        exit(1);
    }
 
    while(fText)
    {   fText>>word;
 
        cur = 0;    i=0;    onlyDelims = 0;
        while(word[cur] && isDelimiter(word[cur]))
            cur++;
        if (cur == strlen(word))
            onlyDelims = 1; //the whole word of delimiters, to be ignored
    
    if(!onlyDelims)
      { //peel from left
         while (word[i+cur])
            word[i++] = word[i+cur];
        word[i] = '\0';
        
        //peel from right
        i = strlen(word)-1;
        while(i>-1 && isDelimiter(word[i]) )
            word[i--] = '\0';
        
        //tolower
        i = 0;
        while (word[i])
            word[i++] = tolower(word[i]);
 
        //word processed -> is unique?
        isIn = 0;
        fWords.seekg(0,fWords.beg);
        while(fWords)
        {   fWords>>compare;
            if(strcmp(compare,word)==0)
            {   isIn = 1;
                break;
            }
        }
        fWords.clear(); //cleaning eof()
        
        //word processed and unique-> out
        if(!isIn)
        {   fWords.seekp(0,fWords.end);
            fWords<<word<<"\n";
        }
      }//if
    }//while
    fWords.close();
}
 
//--------------------------------------------------------------------------------------
//procedure finds common words in the two given files with lists of words
//the list of common words is kept in another file
//--------------------------------------------------------------------------------------
void findCommons(const char *fW1Name, const char *fW2Name, const char *fCommonName)
{   fstream fCommon, fW1, fW2;
    
    fCommon.open (fCommonName, fstream::out|fstream::trunc);
    fW1.open (fW1Name, fstream::in);
    fW2.open (fW2Name, fstream::in);
 
    if(!(fCommon && fW1 && fW2))
    {   cout<<"Error processing files for common words\n";
        cin.get();
        exit(1);
    }
 
    char word1[50], word2[50];
 
    while(fW1)
    {   fW1>>word1;
        fW2.seekg(0,fW2.beg);
        while(fW2)
        {   fW2>>word2;
            if(strcmp(word1,word2)==0)
                fCommon<<word1<<"\n";
        }
        fW2.clear();
    }
 
    fCommon.close();
    fW1.close();
    fW2.close();
}
 
//--------------------------------------------------------------------------------------
//function returns the longest word in the given file with 
//list of words
//--------------------------------------------------------------------------------------
char *findTheLongestWord(const char *fName)
{   fstream f;
    f.open(fName, fstream::in);
 
    if(!f)
    {   cout<<"Error opening file\n";
        cin.get();
        exit(1);
    }
 
    char word[50], res[50];
    unsigned int max = 0;
    while(f)
    {   f>>word;
        if(strlen(word)>max)
        {   max = strlen(word);
            strcpy(res,word);
        }
    }
    f.close();
 
    char *back = new char[strlen(res)];
    strcpy(back,res);
    return back;
}
 
//--------------------------------------------------------------------------------------
//MAIN
//--------------------------------------------------------------------------------------
int main()
{   fstream f1,f2;
    f1.open ("file1.dat", fstream::in);
    f2.open ("file2.dat", fstream::in);
    
    if( !(f1 && f2))
    {   cout<<"Error opening files with texts\n";
        cin.get();
        exit(1);
    }
 
    listOfWords(f1,"word1.dat");
    listOfWords(f2,"word2.dat");
    f1.close();
    f2.close();
 
    findCommons("word1.dat", "word2.dat", "common.dat");
    cout<< "The longest word found in the both files: "<<findTheLongestWord("common.dat");
    
    cin.get();
    return 0;
}
Здесь решены многие стандартные подзадачи, часто встречающиеся при обработке строк/слов, а также при работе с файловыми потоками.

P.S. Файлы file1.dat и file2.dat создайте заранее )
antiwar007
0 / 0 / 0
Регистрация: 05.11.2012
Сообщений: 24
31.03.2013, 15:56  [ТС]     Найти наибольшее общее слово #4
Спасибо. Буду пробовать
Yandex
Объявления
31.03.2013, 15:56     Найти наибольшее общее слово
Ответ Создать тему
Опции темы

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