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

Использование множества set - C++

Восстановить пароль Регистрация
 
Дев4енка
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 85
31.03.2014, 18:24     Использование множества set #1
Задача состоит в следующем: необходимо заполнить массив числами от 1 до 49 случайным образом так, чтобы числа не повторялись. Идея состояла в следующем: при каждой новой генерации числа проверяю, нету ли его в массиве с помощью метода count. Если нету, то добавляю число в массив. Если же во множестве такой элемент уже содержится, то перехожу к новой итерации, не увеличивая при этом индекс i. Вот и собственно проблема: построение решения без ошибок, а вот запуск приостанавливается, при этом ничего не выдавая. Не доходит до system("pause"). Если убирать проверку на наличие в массиве, то все работает( но соответственно заполняя массив числами, которые повторяются).
Данная функция называется generate_path(int *hr)
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
// kommiv.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <set>
#include <time.h>
 
using namespace std;
 
const int numb_cities=50; // number of cities
int matr_coord[numb_cities][2]; // coordinates of cities
int mutr_dist[numb_cities][numb_cities]; // distance between cities
int path[numb_cities]; // path
 
set<int> visited_cities; // contain cities, which we've visited
 
FILE* f1=fopen("coord.txt","w");
FILE* f2=fopen("f_path.txt","w");
 
// generating a random path
void generate_path(int *hr){
    int tmp;
    int i=0;
    //srand(time(NULL));
    while(i<numb_cities) {
        tmp=1+rand()%49;
        if (visited_cities.count(tmp)==0){
            hr[i]=tmp;
            i++;            
        }
        visited_cities.insert(tmp);
    }
}
 
// generating coordinates of cities
void generate_coord(){
    for(int i=0;i<numb_cities;i++)
        for(int j=0;j<numb_cities;j++)
            matr_coord[i][j]=0+rand()%100;
}
 
void print_koord(){
    for(int i=0;i<numb_cities;i++){
        for(int j=0;j<2;j++){
            cout << matr_coord[i][j] << " ";
            fprintf(f1,"%d;",matr_coord[i][j]);
        }
        cout << "\n";
        fprintf(f1,"\n");
    }
    fclose(f1);
}
 
//void print_path(int *hr){
//  for(int i=0;i<numb_cities;i++)
//      fprintf(f2,"%d\n",hr[i]);
//  fprintf(f2,"==================\n");
//}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int first_path[numb_cities];
    
    visited_cities.insert(0); // all pathes begin in city 0
 
    generate_coord();
    print_koord();
    
    generate_path(first_path);
    
    for(int i=0;i<numb_cities;i++)
        fprintf(f2,"%d\n",first_path[i]);
    fprintf(f2,"==================\n");
    
    //print_path(first_path);
    system("pause");
    //fclose(f1);
    fclose(f2);
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2014, 18:24     Использование множества set
Посмотрите здесь:

C++ поменять в настройке Character Set на Use Multy-Byte Character Set
Множества set, проверка принадлежности множеству C++
C++ Как получить доступ к объектам set-множества? (STL)
Использование set C++
C++ Позиция элемента в контейнере STL кон. SET, поиск контейнер set словарь позиция
C++ Число изъять из множества А, если оно является элементом множества А, но не является элементом множества В
C++ Как очистить содержимое множества set?
C++ Использование контейнера set для создания словаря

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
31.03.2014, 18:42     Использование множества set #2
У тебя бесконечный цикл образуется.
В [1, 49] ровно на 1 элемент меньше, чем в [0, numb_cities).
Т.е. он пытается найти один неиспользованный элемент (последний) , а его нет -> бесконечный цикл.
Либо сделай rand()%50, либо цикл до numb_cities-1 - да и вообще, вариантов масса.
Дев4енка
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 85
31.03.2014, 18:56  [ТС]     Использование множества set #3
Спасибо. Совсем забыла, что потом забила первый элемент 0. Т.е. кол-во элементов теперь для заполнения на один меньше.
Yandex
Объявления
31.03.2014, 18:56     Использование множества set
Ответ Создать тему
Опции темы

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