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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
TheMachinist
243 / 175 / 15
Регистрация: 14.06.2010
Сообщений: 422
#1

Случайные значения для разных объектов - C++

12.09.2010, 17:00. Просмотров 701. Ответов 10
Метки нет (Все метки)

Здравствуйте. Я тут взялся за консольный морской бой, нарыл на форуме пару способов генерации
случайных чисел, только есть проблема..... Допустим есть 3 корабля ship1, ship2 и ship3. Я бы хотел
чтобы функция SetCoords() генерировала для каждого разные случайные координаты, а она для
всех одинаковые генерирует.
Подскажите пожалуйста как с этим разобраться?
Спасибо.

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
#include <iostream>
#include <time.h>
using namespace std;
 
class Battleship
{
    int X; int Y;
 
public:
    void SetCoords();
    int GetCoordX();
};
 
void Battleship::SetCoords()
{
srand(time(NULL));
int min = 3; int max = 13;
X = min + rand() % (max - min);
Y = min + rand() % (max - min);
}
 
int Battleship::GetCoordX()
{
    return X;
}
 
int main()
{
    Battleship ship1;
    Battleship ship2;
    Battleship ship3;
 
    ship1.SetCoords();
    ship2.SetCoords();
    ship3.SetCoords();
 
    cout << ship1.GetCoordX() << endl;
    cout << ship2.GetCoordX() << endl;
    cout << ship3.GetCoordX() << endl;
 
 
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2010, 17:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Случайные значения для разных объектов (C++):

случайные значения в с++ - C++
Подскажите, пожалуйста. Есть 3 заданные числа. Как сделать так, чтобы генерировалися толко заданые??? Я написал свой пример, но там...

Случайные значения в массиве int - C++
Здравствуйте, возникла такая проблема - присваиваются случайные значения массиву. Все значения с помощью цикла изначально обнулял - ноль...

Почему случайные значения всегда одни и те же? - C++
Дано условие: С помощью генератора случайных чисел смоделировать выбрасывание игральной кости (1 ... 6). Вывести на экран количество...

Массив разных объектов - C++
Здравствуйте, в институте задали написать шахматы на C++ с использованием классов, т.е все фигуры(например TPawn) должны быть основаны...

Взаимодействие объектов разных классов - C++
Я или туплю или чего-то не понимаю\не до понимаю. Вопрос в самом коде. class Player { int health; int damage; public: ...

В двумерный массив занести случайные значения и посчитать сумму столбцов - C++
Написать программу, которая вводит по строкам с клавиатуры ^мерный массив и вычисляет сумму его элементов по столбцам. #include...

10
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
12.09.2010, 17:07 #2
NikolaWhite, srand(time(NULL)) лучше в main я думаю поставить.
1
TheMachinist
243 / 175 / 15
Регистрация: 14.06.2010
Сообщений: 422
12.09.2010, 17:53  [ТС] #3
Может тогда подскажете как сделать чтоб они н повторялись?
Я просмотрел пост "Случайные числа" , только там пример громоздкий и многое мне в нем
еще не понятно.
Буду оч признателен.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
12.09.2010, 18:07 #4
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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
void gen_random_uniq2( int arr_size, int *parr, int range_min, int range_max );
 
/* ================================================================ */
int main() 
{ 
int arr_size;
int*arr;
int range_min, range_max;
 
 
srand( time( NULL ) );
 
std::cout<<"Enter arr_size: ";
std::cin>>arr_size;
arr=new int[arr_size];
std::cout<<"Enter range_min: ";
std::cin>>range_min;
std::cout<<"Enter range_max: ";
std::cin>>range_max;
 
if(arr_size<=0)
{
    std::cerr<<"Can`t be 0 or less then 0!\n";
    return 1;
}
 
gen_random_uniq2(arr_size, arr, range_min, range_max );
 
std::cout<<"random unique array: array size is "<< arr_size <<" range is ["<<range_min<<';'<< range_max <<']'<<std::endl;
 
for (int i= 0; i<arr_size; i++ ) {
        std::cout<<arr[i]<<' ';
}
std::cout<<std::endl;
delete[] arr;
return 0;
 
} 
 
/* ================================================================ */
void gen_random_uniq2( int arr_size, int *parr, int range_min, int range_max ) {
 
int i, arr2_size, index, range_width;
int *parr2= NULL;
 
range_width= range_max-range_min+1;
 
parr2= new int[range_width];
 
for ( i= 0; i<range_width; i++ ) {
        parr2[i]= range_min+i;
}
 
arr2_size= range_width;
for ( i= 0; i<arr_size; i++ ) {
        index= rand()%arr2_size;
        parr[i]= parr2[index];
        arr2_size--;
        parr2[index]= parr2[arr2_size];
}
 
delete[]parr2;
 
}
1
TheMachinist
243 / 175 / 15
Регистрация: 14.06.2010
Сообщений: 422
13.09.2010, 20:38  [ТС] #5
Привет всем. Я тут помучался и написал таки функцию которая генерирует неповторяющиеся
координаты для поля 10х10 морского боя. Я совсем недавно начал изучать С++ , так что это было
нелегко для меня .
Кому не лень можете раскритиковать в пух и прах.

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
#include <iostream>
#include <ctime>
using namespace std;
 
class Battleship
{
int X; int Y;
public:
    void SetCoords(int *Arr, int *XYarr);
    int GetCoordX();
    int GetCoordY();
};
 
int Battleship::GetCoordX() {return X;}
int Battleship::GetCoordY() {return Y;}
 
void Battleship::SetCoords(int *Arr, int *XYarr)
{ 
    int cols = 10; // кол-во колонок в Arr[100]
int Index = rand() % 10;
X = XYarr[Index];
Index = rand() % 10;
Y = XYarr[Index];
 
int plus = 1;
    while(*(Arr + X*cols + Y + plus) == 0)
    {
    if(X == 10 && Y == 10) // если последний элемент массива и равен 0 ,двигай назад.
        plus -= 1;
    else
        plus += 1;         // если равен 0 значит координаты использовались,
    }                        // перейди к следующему элементу.
 
      *(Arr + X*cols + Y + plus) = 0; // адрес в массиве ,совпадающий с этими координатами
                                   // содержит 0 - значит больше не использовать.
 
}
 
int main()
{
    srand(time(NULL));
Battleship ship1;
Battleship ship2;
Battleship ship3;
Battleship ship4;
//*********************************************************
    int* Arr;
    Arr = new int[100]; // вместо двумерного массива 10x10
    for(int i = 0;i < 100;i++)
        Arr[i] = i + 1;
    int* XYarr;
    XYarr = new int[10]; // 10 неповторяющихся чисел от  до 10.
    for(int i = 0;i < 10;i++) 
        XYarr[i] = i + 1;
    //*******************************************************
    ship1.SetCoords(Arr, XYarr);
    ship2.SetCoords(Arr, XYarr);
    ship3.SetCoords(Arr, XYarr);
    ship4.SetCoords(Arr, XYarr);
          cout << "X =  " << ship1.GetCoordX() << "  Y =  " << ship1.GetCoordY() << endl;
          cout << "X =  " << ship2.GetCoordX() << "  Y =  " << ship2.GetCoordY() << endl;
          cout << "X =  " << ship3.GetCoordX() << "  Y =  " << ship3.GetCoordY() << endl;
          cout << "X =  " << ship4.GetCoordX() << "  Y =  " << ship4.GetCoordY() << endl;
 
        system("pause");
}
0
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
13.09.2010, 22:27 #6
Сразу бросилось в глаза
1) int main() ничего не возвращает (делай тогда void main()).
2) динамические объекты не уничтожаются.
1
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.09.2010, 22:41 #7
Цитата Сообщение от bobromet Посмотреть сообщение
1) int main() ничего не возвращает (делай тогда void main()).
По стандарту main должна возвращать целочисленное значение.
Если код возврата не возвращается явно, его принимают за 0.
2
TheMachinist
243 / 175 / 15
Регистрация: 14.06.2010
Сообщений: 422
13.09.2010, 22:59  [ТС] #8
динамические объекты не уничтожаются.
Я нарочно не стал ничего уничтожать. Еще хотел спросить а обязательно ли это в данном случае.

int main() ничего не возвращает (делай тогда void main()).
Это избитая тема. Я предпочитаю не заморачиваться насчет return 0, т.к.
Если код возврата не возвращается явно, его принимают за 0.
1
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
13.09.2010, 23:06 #9
CyBOSSeR, то есть, если не возвращать открыто ноль это не будет считатся за ошибку? Тысячу раз читал на этом форуме что компилер покарает меня за это, может не сейчас но позже .)

NikolaWhite, а я void пишу и не жужу , знаю что не хорошо, и что не все компилеры это любят . А объекты уничтожать точно надо, ты ведь мусор выносишь когда корзина полная. Почитай про memory leak - утечка памяти, меня одно название уже пугает .)
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
13.09.2010, 23:12 #10

Не по теме:

Цитата Сообщение от bobromet Посмотреть сообщение
CyBOSSeR, то есть, если не возвращать открыто ноль это не будет считатся за ошибку?
Не волнуйся, если компилятор сочтет это за ошибку, то ты об этом узнаешь.


bobromet, вот выжимки из стандарта C++03:
<...> It shall have a return type of type int <...>
<...> If control reaches the end
of main without encountering a return statement, the effect is that of executing
C++
1
return 0;
1
TheMachinist
243 / 175 / 15
Регистрация: 14.06.2010
Сообщений: 422
13.09.2010, 23:24  [ТС] #11
<...> If control reaches the end
of main without encountering a return statement, the effect is that of executing
Если кто не силен в английском:
"Если программа доходит до конца функции main() и не встречает return - это означает что
программа выполнена успешно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2010, 23:24
Привет! Вот еще темы с ответами:

Создание коллекции объектов разных классов - C++
Здравствуйте. Помогите, пожалуйста, с задачкой создания коллекции объектов разных типов. Я сначала реализовал программку, использовав...

Массив объектов разных производных классов - C++
Задача такая: базовый класс - фигура, производные классы - круг, треугольник и т.п. Пользователь выбирает, какие фигуры будут на экране и...

Массив разных объектов внутри класса - C++
Хочу сделать что-то типа системы событий и их обработчиков. Есть класс Window и класс Control, от класса Control наследуются Button,...

Сложение массивов из разных объектов класса - C++
Я объявил в классе массив a и ввёл два объекта класса. Как сложить массив a разных объектов класса?


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
13.09.2010, 23:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru