Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2013, 12:11   #1
vadim93
Пользователь
 
Регистрация: 22.12.2013
Сообщений: 10
Восклицание выводит то,что надо и то,чего нет c++

Собственно вот код (не мой). Задание: В имеющемся словаре найти группы слов, записанных одними и теми же буквами и отличающиеся только их порядком, то есть перестановкой, например, (КОМАР, КОРМА).
Выводит лишние слова,которых в файле нет!
Например у меня слова
торба
аборт
топор
ропот
торт
А он выводит
аборт торба аборт
опрт топор ропот
орт торт
Код c++
Код:
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<algorithm>
#include<set>
#include<map>
#include<string>
 
using namespace std;
typedef map<set<char>, string>m_map;
int main() {
        setlocale(LC_ALL, "Russian");
        ifstream inf("words.txt");
        string str;
        m_map grmap;
        while (true) {
            if (inf.eof())break;
            getline(inf, str);
            set<char>ch_s(str.begin(), str.end()); //ch_s содержит каждую букву
            //1 раз
            if (!(grmap.insert(make_pair(ch_s, str))).second) {//если такой
                grmap[ch_s] += " " + str;//ключ уже есть добавить в группу
                //новое слово
            }
        }
        inf.close();
        m_map::iterator it;
        it = grmap.begin();
        for (; it != grmap.end(); it++) {
            string s((*it).first.begin(), (*it).first.end());
            cout << s << " " << (*it).second << endl;
        }
        cin.get();
        return 0;
 
}
vadim93 вне форума Ответить с цитированием
Старый 22.12.2013, 12:40   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от vadim93 Посмотреть сообщение
А он выводит
аборт торба аборт
опрт топор ропот
орт торт
Код:
        for (; it != grmap.end(); it++) {
            string s((*it).first.begin(), (*it).first.end());
            cout << s << " " << (*it).second << endl;
        }
}
что и логично. Должна быть проверка на существование в set'e, а не прямой вывод отсортированного набора уникальных символов
Smogg вне форума Ответить с цитированием
Старый 22.12.2013, 12:46   #3
vadim93
Пользователь
 
Регистрация: 22.12.2013
Сообщений: 10
По умолчанию

А как проверка должна выглядеть?)
vadim93 вне форума Ответить с цитированием
Старый 22.12.2013, 14:00   #4
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Ай, нет)) Программка вполне рабочая)

Просто вывод оформлен в стиле минимал.
Там первым идет набор уник.символов, которому соответствуют все последующие слова. Автору это казалось самоочевидным.
надо всего лишь добавить двоеточие:
Код:
 cout << s << ": " << (*it).second << endl;
Smogg вне форума Ответить с цитированием
Старый 22.12.2013, 14:57   #5
vadim93
Пользователь
 
Регистрация: 22.12.2013
Сообщений: 10
По умолчанию

понял,большое спасибо!)
vadim93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедура должна выводить сумму при вводе номера, но кроме суммы выводит еще что такого номера нет yohurt Помощь студентам 1 09.01.2012 07:35
класс компилируется но не чего не выводит на экран MsWindows Общие вопросы C/C++ 9 16.07.2011 21:11
Удаление того, чего нет! БД! NuR1k БД в Delphi 3 23.08.2010 15:02
скрипт выводит в столбик а надо в строчку zander PHP 2 04.01.2010 21:53