Имеется файл, в нём написаны слова. С клавиатуры вводится слово с неповторяющимися буквами. Найти и вывести слово из файла, в котором встретится больше всего букв из слова, введённого с клавиатуры. Никак не могу понять, как можно это реализовать в программе... Кто-нибудь, подскажите, пожалуйста, возможный алгоритм, желательно без использования изощрённых процедур и малоизвестных библиотек. Что лучше использовать: стринги или чары?
Пример функции, которая возвращает количество совпадающих символов в строке s
из строки sub
:
size_t overlap(const string& s, const string& sub)
{
size_t k = 0, sz = sub.size();
for (size_t n = 0; n < sz; ++n){
k += std::count(s.begin(), s.end(), sub[n]);
}
return k;
}
Попытайтесь самим написать программу.
Ввести слово, внести символы из слова в std::set
Для каждого слова из файла посчитать, сколько символов из него есть в set
Вводите слово-образец. В цикле, пока не получите отказ, читаете файл пословно, используя fscanf() Потом для каждой буквы слова проверяете, содержится ли она в образце? используя strchr(). Если содержится добавляете в счетчик. Если слово содержит больше символов из образца, чем предыдущее, сохраняете его. Когда все слова из файла прочитаны, у вас будет сохранено то самое, которое вам нужно. Примерный код, работающий как в C, так и в C++. Вводить слово-образец было лень и я его забил в массив -- для отладки и демонстрации примера достаточно и так.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
int main(int argc, char *argv[]) {
FILE *ifile;
if (NULL == (ifile = fopen(argv[1], "r"))) {
perror(argv[1]);
exit(errno);
}
int n = 0;
int nmax = 0;
char *ss;
char smpl_word[] = "sample_word";
char next_word[1024];
char most_word[1024];
// читаем файл словами
while (1 == fscanf(ifile, "%1023s", next_word)) {
// сканируем для каждой буквы полученного слова факт
// вхождения в smpl_word
ss = next_word;
n = 0;
do { // scanf никогда не возвращает пустых строк
if (strchr(smpl_word, *ss++)) {
n++; // и отмечаем если входит
}
} while (*ss);
// проверка на превышение количеств вхождений
if (n > nmax) {
nmax = n;
strcpy(most_word, next_word);
}
}
// собственно, и все на этом
fprintf(stdout, "%s\n", most_word);
return 0;
argc++;
}
#include <iostream>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;
int getRateWordByPattern(const string& word, const string& pattern)
{
int rate = 0;
for (int i = 0; i < pattern.size(); ++i)
rate += std::count(word.begin(), word.end(), pattern[i]);
return rate;
}
void main()
{
string pattern = "ght";
ifstream f;
f.open("D://1.txt");
if (!f.is_open())
return;
int max_rate = 0;
string res_word = "not found";
string word;
while (f >> word)
{
int rate = getRateWordByPattern(word, pattern);
if (rate > max_rate)
{
max_rate = rate;
res_word = word;
}
}
cout << max_rate << endl;
cout << res_word << endl;
char ch;
cin >> ch;
}
Накидал тут на коленке. Нет обработки ошибок, данные все забил хардкорно. Слово с буквами для поиска в переменной pattern.
В файле у меня строка вида: one two three four five six seven eight nine ten.
Ввод данных, валидацию и обработку ошибок встроишь сам и все.
P.S. По поводу оптимизации два пути вижу, либо заранее файл анализировать и строить по нему метаданные, либо более умно считать рейтинг. Насчет последнего надо еще подумать.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть файл, в нём написаны числаНужно найти и вывести на экран самое маленькое число, которое делится на все числа из файла, тобишь наименьшее...
Если открываю готовый проект - не работают стандартные библиотеки
Есть абстрактный класс "Organism"Его наследуют 2 классa: "Animals" и "Plants"