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

Вывод множества - C++

Восстановить пароль Регистрация
 
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
15.06.2011, 09:40     Вывод множества #1
Есть программа, помогите добавить вывод в программу. Вывод какой гость, к кому сходил в гости.
Я так понимаю в эту программу нужно добавить циклический вывод - но недогоню(
Сама задача:
Дано следующее описание:
type
nаmе=(Вася, Володя, Ира, Марина, Миша, Наташа, Оля, Света, Юля);
gosti=set of name;
group=array[name] of gosti;
Написать программу, определяющую, есть в группе g:group хотя бы один человек, побывавший в гостях у всех остальных из группы (g[x]-множество людей, бывших в гостях у человека с именем х; х не входит в g[x]).

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
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <map>
#include <set>
#include <string>
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////
enum  T_name // объявляет тип перечисление 
{
    Vasya,
    Volodya,
    Ira,
 
    Marina,
    Misha,
    Natasha,
 
    Olya,
    Sveta,
    Julya,
 
    names_total
};
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                   T_str;
typedef std::set<T_name>              T_visitors; 
typedef std::map<T_name, T_visitors>  T_group;
typedef std::map<T_name, size_t>      T_name_visits_total;
typedef std::map<T_name, T_str>       T_rus_name; // для русских имен
/////////////////////////////////////////////////////////////////////////////////////////
void  random_fill_group(T_group&  group) //процедура - рендомно заполняем группы
{
    for(int  i = 0; i < names_total; ++i)
    {        
        T_visitors  visitors;  // разбрасываем по гостям
        for(int  j = 0; j < names_total; ++j)
        {
            if(j == i) continue;
            if(rand() % 23) // (изменяем на что делить, получаем разных гостей)
            {
                visitors.insert(T_name(j)); // в j добавляем новую запись при тру
                              
            }
        }
        group[T_name(i)] = visitors; 
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
T_visitors  get_persons_who_has_visited_all(const T_group&  group) // выбераем гостя..
{   //объявляем
    T_visitors           visitors_res; 
    T_name_visits_total  name_visits_total;
    ///////////
    if(!group.empty())
    {//.empty возращает истину если в стеке нет элементов
     // если есть то цикл
     
        for(T_group::const_iterator  host_visitors_it = group.begin();
      // бегин возратит итератор на первый элемент множества
      // когда 
      // функция end возратит на последнее место, после последнего элемента 
            host_visitors_it != group.end(); ++host_visitors_it)
        {        // где нейм ит счетчик людей удовлетворяющих условию
            for(T_visitors::const_iterator  name_it = host_visitors_it->second.begin();
                name_it != host_visitors_it->second.end(); ++name_it)
            { //накапливаем имена гостей указывая в массиве(множестве) на эти имена
                ++name_visits_total[*name_it];
            }
        }
        //заупускаем цикл для имен гостей присваивая первый элемент множества,
        for(T_name_visits_total::const_iterator  name_visits_total_it = name_visits_total.begin();
            // пока не станет равно последнему элементу - инкремент
            name_visits_total_it != name_visits_total.end(); ++name_visits_total_it)
        { //если у нас обращение к данным разименованного общего количества гостей
        // равно предыдущему члену
            if(name_visits_total_it->second == names_total - 1)
            { // присваиваем имени разъименованный участок общего колва гостей
            // 
                visitors_res.insert(name_visits_total_it->first);
            }
        }    
    }
 // возращаем кого мы получили..
    return visitors_res;    
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
        setlocale (LC_CTYPE, "rus");
    srand(static_cast<unsigned>(time(0))); // динамически рендомим по времени
    T_rus_name  rus_name;
    rus_name[Vasya   ]  = "Вася";
    rus_name[Volodya ]  = "Володя";
    rus_name[Ira     ]  = "Ира";
 
    rus_name[Marina  ]  = "Марина";
    rus_name[Misha   ]  = "Миша";
    rus_name[Natasha ]  = "Наташа";
 
    rus_name[Olya    ]  = "Оля";
    rus_name[Sveta   ]  = "Света";
    rus_name[Julya   ]  = "Юля";
 
    T_group  group;
    random_fill_group(group);    
    T_visitors  visitors_best = get_persons_who_has_visited_all(group);
    cout << get_persons_who_has_visited_all << endl;    
    if(visitors_best.empty()) // если есть..
    {
        std::cout << "В группе не существует человека, побывавшего в гостях у всех остальных."
                  << std::endl;    
    }
    else
    {
        std::cout << "Побывали в гостях у всех остальных:" << std::endl;
        for(T_visitors::iterator  visitor_it = visitors_best.begin();
            visitor_it != visitors_best.end(); ++visitor_it)
        {
            std::cout << rus_name[*visitor_it] << std::endl; 
        }
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 3 часа 39 минут
upd...

Добавлено через 2 часа 44 минуты
upd...

Добавлено через 1 час 44 минуты
upd...(((

Добавлено через 11 часов 2 минуты
ребят подскажите...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2011, 09:40     Вывод множества
Посмотрите здесь:

Вывод элементов множества на экран C++
Множества. Проверка множества на наличие элемента в нем C++
Множества. Вычислить количество элементов множества Q, связанного c исходными множествами C++
C++ Удалить из множества А минимальный элемент множества В
C++ Число изъять из множества А, если оно является элементом множества А, но не является элементом множества В
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
28.06.2011, 21:29  [ТС]     Вывод множества #2
::upd::

Добавлено через 2 часа 2 минуты
жаль не одного ответа не увидеть...
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
28.06.2011, 21:53     Вывод множества #3
Я там подправил кое-что. Проверяй; знаешь, как проверять?

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
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <map>
#include <set>
#include <string>
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////
enum  T_name // объявляет тип перечисление 
{
    Vasya,
    Volodya,
    Ira,
 
    Marina,
    Misha,
    Natasha,
 
    Olya,
    Sveta,
    Julya,
 
    names_total
};
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                   T_str;
typedef std::set<T_name>              T_visitors; 
typedef std::map<T_name, T_visitors>  T_group;
typedef std::map<T_name, size_t>      T_name_visits_total;
typedef std::map<T_name, T_str>       T_rus_name; // для русских имен
/////////////////////////////////////////////////////////////////////////////////////////
void  random_fill_group(T_group&  group) //процедура - рендомно заполняем группы
{
 
    for(int  i = 0; i < names_total; ++i)
    {        
        T_visitors  visitors;  // разбрасываем по гостям
        for(int  j = 0; j < names_total; ++j)
        {
            if(j == i) continue;
            if(rand() % 23) // (изменяем на что делить, получаем разных гостей)
            {
                visitors.insert(T_name(j)); // в j добавляем новую запись при тру
                                              
            }
        }
        group[T_name(i)] = visitors; 
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
T_visitors  get_persons_who_has_visited_all(const T_group&  group) // выбераем гостя..
{   //объявляем
    T_visitors           visitors_res; 
    T_name_visits_total  name_visits_total;
    ///////////
    if(!group.empty())
    {//.empty возращает истину если в стеке нет элементов
     // если есть то цикл
     
        for(T_group::const_iterator  host_visitors_it = group.begin();
      // бегин возратит итератор на первый элемент множества
      // когда 
      // функция end возратит на последнее место, после последнего элемента 
                host_visitors_it != group.end(); ++host_visitors_it)
        {        // где нейм ит счетчик людей удовлетворяющих условию
            for(T_visitors::const_iterator  name_it = host_visitors_it->second.begin();
                name_it != host_visitors_it->second.end(); ++name_it)
            { //накапливаем имена гостей указывая в массиве(множестве) на эти имена
                ++name_visits_total[*name_it];
            }
        }
        //заупускаем цикл для имен гостей присваивая первый элемент множества,
        for(T_name_visits_total::const_iterator  name_visits_total_it = name_visits_total.begin();
            // пока не станет равно последнему элементу - инкремент
                        name_visits_total_it != name_visits_total.end(); ++name_visits_total_it)
        { //если у нас обращение к данным разименованного общего количества гостей
        // равно предыдущему члену
            if(name_visits_total_it->second == names_total - 1)
            { // присваиваем имени разъименованный участок общего колва гостей
                        // 
                visitors_res.insert(name_visits_total_it->first);
            }
        }    
    }
 // возращаем кого мы получили..
    return visitors_res;    
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 
        setlocale (LC_CTYPE, "rus");
    srand(static_cast<unsigned>(time(0))); // динамически рендомим по времени
    T_rus_name  rus_name;
    rus_name[Vasya   ]  = "Вася";
    rus_name[Volodya ]  = "Володя";
    rus_name[Ira     ]  = "Ира";
 
    rus_name[Marina  ]  = "Марина";
    rus_name[Misha   ]  = "Миша";
    rus_name[Natasha ]  = "Наташа";
 
    rus_name[Olya    ]  = "Оля";
    rus_name[Sveta   ]  = "Света";
    rus_name[Julya   ]  = "Юля";
 
    T_group  group;
    random_fill_group(group);    
 
    
    //Вот эта переменная используется в двух циклах, незачем её два раза объявлять
    T_visitors::iterator  visitor_it; 
   
    //Вот вывод, который тебе нуден 
    for(T_group::iterator  group_it = group.begin();group_it != group.end(); ++group_it) {  
     std::cout <<"В гостях у " << rus_name[group_it->first] << " были "<< std::endl; 
        for(visitor_it= group_it->second.begin();
         visitor_it!= group_it->second.end(); ++visitor_it) {
          std::cout << rus_name[*visitor_it] << std::endl; 
         }
    }
 
    printf ("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
 
    T_visitors  visitors_best = get_persons_who_has_visited_all(group);
 
//А вот это место я закомментил потому, что это чушь собачья.
//    cout << get_persons_who_has_visited_all << endl;    
        if(visitors_best.empty()) // если есть..
    {
        std::cout << "В группе не существует человека, побывавшего в гостях у всех остальных."
                  << std::endl;    
    }
    else
    {
        std::cout << "Побывали в гостях у всех остальных:" << std::endl;
        for(visitor_it = visitors_best.begin();
            visitor_it != visitors_best.end(); ++visitor_it)
        {
            std::cout << rus_name[*visitor_it] << std::endl; 
                }
    }
 
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
IIIa66uMEM6eP
заставил Бендера
 Аватар для IIIa66uMEM6eP
432 / 288 / 10
Регистрация: 05.12.2010
Сообщений: 1,642
Записей в блоге: 6
28.06.2011, 22:02  [ТС]     Вывод множества #4
Цитата Сообщение от kravam Посмотреть сообщение
как проверять
лучше помогите)

Добавлено через 3 минуты
kravam, вообще все супер, как надо)
Yandex
Объявления
28.06.2011, 22:02     Вывод множества
Ответ Создать тему
Опции темы

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