C/C++ - найти в строке слова с одинаковым составом букв

Ответить
Аватара пользователя
Frozen_Sky

C/C++ - найти в строке слова с одинаковым составом букв

Сообщение Frozen_Sky »

Ребят, помогите пожалуйста, есть код, в строку вбивается слово. Нужно в строке найти группы слов, имеющие одинаковый состав букв (количество одинаковых букв не имеет значения), слова выводить в порядке их вхождения в строку. Ну например в строке идут слова: abba abaa abca ab abc, затем идет разделение по строкам, в первую строку идут abba abaa и ab, так как состав букв одинаковый, затем новая строчка: abca abc. Ну... как-то так, мне бы хотя бы узнать как поиск реализуется. Очень нужно, буду благодарен.



Код:

Код: Выделить всё

#include "stdafx.h"
#include 
#include 
void main()
{
char str[81]; // Исходная строка
gets(str);
char copy_str[81]; // копия строки, чтобы не портить исходную
strcpy(copy_str,str); // делаем копию
char *razdel=" \n\t\r\".,!?"; // Разделители слов (для разбивки) 
char *word; // очередное слово строки
word=strtok(copy_str,razdel); // получаем первое слово
while(word)
{
printf("%s\n", word); // печатаем очередное слово
word=strtok(NULL,razdel); // далее (с текущего места в строке) - получаем следующее слово
}
getch();
}
Аватара пользователя
pva

Re: C/C++ - найти в строке слова с одинаковым составом букв

Сообщение pva »

я всегда считал, что конкретная реализация на языке - дело вторичное. Главное - понимание того, что хочешь сделать и владение примитивами программирования (строки, стеки, вектора, словари...)

Скажи на пальцах как хочешь сделать - мы закодируем
Аватара пользователя
User001

Re: C/C++ - найти в строке слова с одинаковым составом букв

Сообщение User001 »

Цитата Frozen_Sky:



Ну... как-то так, мне бы хотя бы узнать как поиск реализуется.
C/C++ - найти в строке слова с одинаковым составом букв




На C писать долго будете. Самое простое делаете список, элементы которого списки слов. Далее разбираете ваши строки, ищете из каких букв состоят. Если в списке есть такая запись, то добавляете строку туда, если нет, то создаете элемент списка.

А вообще, если на C++, то с помощью того же map это вполне быстро пишется.
Аватара пользователя
Frozen_Sky

Re: C/C++ - найти в строке слова с одинаковым составом букв

Сообщение Frozen_Sky »

pva, если бы я знал, как хочу сделать, а так увы. Все что знаю, что нам нельзя использовать stl функции, все писать самостоятельно руками, а я понятие не имею как. Возможно ли как то поиск сделать через массив?



User001,
Цитата User001:



Далее разбираете ваши строки, ищете из каких букв состоят. Если в списке есть такая запись, то добавляете строку туда, если нет, то создаете элемент списка.
C/C++ - найти в строке слова с одинаковым составом букв




кстати, вроде неплохой вариант, а можно хотя бы примерно глянуть как это выглядеть должно? P.S. пишу на С++
Аватара пользователя
pva

Re: C/C++ - найти в строке слова с одинаковым составом букв

Сообщение pva »

Цитата Frozen_Sky:



Возможно ли как то поиск сделать через массив?
C/C++ - найти в строке слова с одинаковым составом букв




И ещё как можно! Но наша цель не в том, чтобы обязательно использовать массив, а в том, чтобы научиться "придумывать" программы

Frozen_Sky, как бы вы это написали на C++?
Аватара пользователя
User001

Re: C/C++ - найти в строке слова с одинаковым составом букв

Сообщение User001 »

Цитата Frozen_Sky:



кстати, вроде неплохой вариант, а можно хотя бы примерно глянуть как это выглядеть должно?
C/C++ - найти в строке слова с одинаковым составом букв




Не знаю, зачем оно вам, не должно, а один из вариантов. Например, так:


читать дальше »

Код: Выделить всё

#include <iostream>
#include <string>
#include <list>
#include <sstream>
#include <map>
#include <algorithm>
std::string get_letters(std::string word)
{
    std::string letters;
    for (size_t i = 0; i < word.length(); ++i)
        if (letters.find(word[i], 0) == std::string::npos)
            letters.push_back(word[i]);
    std::sort(letters.begin(), letters.end());
    return letters;
}
int main()
{
    std::list<std::string> words;
    std::string text = "abba abaa abca ab abc abd ddbba abcccba";
    std::istringstream ist(text);
    std::string buffer;
    while (ist >> buffer)
        words.push_back(buffer);
    std::cout << "Number of words: " << words.size() << std::endl;
    std::map<std::string, std::list<std::string> > table;
    for (std::list<std::string>::iterator it = words.begin(); it != words.end(); ++it)
        table[get_letters(*it)].push_back(*it);
    for (std::map<std::string, std::list<std::string> >::iterator it = table.begin(); it != table.end(); ++it)
    {
        std::cout << it->first << ": ";
        for (std::list<std::string>::iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2)
            std::cout << *it2 << ' ';
        std::cout << std::endl;
    }
    return 0;
}

На академичности и чистоту кода не претендую, про auto слышал.

А вообще, pva прав, сейчас задача
Цитата pva:



научиться "придумывать" программы
C/C++ - найти в строке слова с одинаковым составом букв




.
Ответить

Вернуться в «Программирование и базы данных»