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

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

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

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 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