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

Структуры - C++

Восстановить пароль Регистрация
 
TioS
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 4
28.09.2012, 22:56     Структуры #1
Не могу придумать как в цикле создать структуры rabit1, rabit2...5 и присваивать значения из структуры rabit, или чтоб сразу без rabit. Надеюсь кто-нибудь сможет прояснить мне как это сделать.

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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using std::cout;
using std::cin;
using std::endl;
 
char* nameFunc(char* name);
char nameM[7][15] = {"Sergey", "Misha", "Vlad", "Andrey", "Yra", "Sasha", "Dima"};
char nameF[6][15] = {"Oksana", "Ira", "Natasha", "Nadya", "Lena", "Anya"};
 
 
struct Bunnies
{
    int age;
    char* color;
    char* sex;
    char* name;
};
 
int main(void)
{
    srand(time(NULL));
    char color[4][15] = {"white", "brown", "black", "spotted"};
    char sex[2][15] = {"Male", "Female"};
 
for(int i = 1; i <= 5; i++)
    Bunnies rabit = {0, color[rand()%4], sex[rand()%2], nameFunc(rabit.sex)};
 
 
char* nameFunc(char* a)
{
    int b = strlen(a);
    if(b == 4)
        return nameM[rand()%7];
    else
        return nameF[rand()%6];
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
28.09.2012, 23:29     Структуры #2
Сделайте массив структур. И заносите данные туда
TioS
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 4
29.09.2012, 13:37  [ТС]     Структуры #3
Спасибо за совет, получилось.

Добавлено через 12 часов 0 минут
Возник еще один вопрос, я в массиве структур создал 5 элементов rabit, и мне надо при увелечении age к 2 сделать чтобы появился в массиве структур еще 1 новый элемент rabit, но уже с age 0. Я поставил коментарий в коде, где не могу понять как сделать.

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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using std::cout;
using std::cin;
using std::endl;
 
char* nameFunc(char* name);
void nextYear(char a);
char nameM[7][15] = {"Sergey", "Misha", "Vlad", "Andrey", "Yra", "Sasha", "Dima"};
char nameF[6][15] = {"Oksana", "Ira", "Natasha", "Nadya", "Lena", "Anya"};
char color[4][15] = {"white", "brown", "black", "spotted"};
char sex[2][15] = {"Male", "Female"};
 
 
struct Bunnies              //Структура кроликы
{
    int age;
    char* color;
    char* sex;
    char* name;
}rabits[100];               //Массив структур 
 
int main(void)
{
    srand(time(NULL));
    char year = 'y';
 
for(int i = 1; i <= 5; i++)     //Вывод кроликов возрастом "0"
{
    Bunnies rabit = {0, color[rand()%4], sex[rand()%2], nameFunc(rabit.sex)};       //Рандомно создает стандартный кролик
    rabits[i] = rabit;
    cout << "Rabit" << i << endl;
    cout << "age = " << rabits[i].age << endl;
    cout << "color = " << rabits[i].color << endl;
    cout << "sex = " << rabits[i].sex << endl;
    cout << "name = " << rabits[i].name << endl;
    cout << endl;
}
for(int i = 1; i <= 10; i++)        //Переход на новый год
{
    cout << "Will go to next year?(y/n): ";
    cin >> year;
    cout << endl;
    nextYear(year);
}
}
 
char* nameFunc(char* a)    //Функция для соответствия пола и имени
{
    int b = strlen(a);
    if(b == 4)
        return nameM[rand()%7];
    else
        return nameF[rand()%6];
}
 
void nextYear(char a)       //Функция для перехода на новый год
{
    if(a == 'y' || a == 'Y')
        for (int i = 1; i < 100; i++)
        {
            rabits[i].age += 1;
            if(rabits[i].age == 2)
            {
                                    //Что нужно сделать?
            }
        }
    for(int i = 1; i <= 5; i++)
    {
        cout << "Rabit" << i << endl;
        cout << "age = " << rabits[i].age << endl;
        cout << "color = " << rabits[i].color << endl;
        cout << "sex = " << rabits[i].sex << endl;
        cout << "name = " << rabits[i].name << endl;
        cout << endl;
    }
    return;
}
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
29.09.2012, 13:47     Структуры #4
Надо вместо статического массива rabits[100]; использовать динамический
например
std::vector<Bunnies> rabits;
Когда хотите добавить элемент в этот массив, пишете так:
rabits.push_back(добавляемый элемент);
TioS
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 4
29.09.2012, 15:26  [ТС]     Структуры #5
Использовал динамический массив, но теперь при запуске вылетает ошибка, и именно при выводе значений, я наверно здесь неправильно делаю (cout << "color = " << rabits[i].color << endl) .

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
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
 
using std::cout;
using std::cin;
using std::endl;
using std::vector;
 
char* nameFunc(char* name);
void nextYear(char a);
char nameM[7][15] = {"Sergey", "Misha", "Vlad", "Andrey", "Yra", "Sasha", "Dima"};
char nameF[6][15] = {"Oksana", "Ira", "Natasha", "Nadya", "Lena", "Anya"};
char color[4][15] = {"white", "brown", "black", "spotted"};
char sex[2][15] = {"Male", "Female"};
 
 
struct Bunnies              //Структура кроликы
{
    int age;
    char* color;
    char* sex;
    char* name;
};              //Массив структур 
 
    vector<Bunnies> rabits(100);
 
int main(void)
{
    srand(time(NULL));
    char year = 'y';
 
for(int i = 1; i <= 5; i++)     //Вывод 5 кроликов возрастом "0"
{
    Bunnies rabit = {0, color[rand()%4], sex[rand()%2], nameFunc(rabit.sex)};       //Рандомно создает стандартный кролик
    rabits.push_back(rabit);
    cout << "Rabit" << i << endl;
    cout << "age = " << rabits[i].age << endl;
    cout << "color = " << rabits[i].color << endl;
    cout << "sex = " << rabits[i].sex << endl;
    cout << "name = " << rabits[i].name << endl;
    cout << endl;
}
for(int i = 1; i <= 10; i++)        //Переход на новый год
{
    cout << "Will go to next year?(y/n): ";
    cin >> year;
    cout << endl;
    nextYear(year);
}
}
 
char* nameFunc(char* a)    //Функция для соответствия пола и имени
{
    int b = strlen(a);
    if(b == 4)
        return nameM[rand()%7];
    else
        return nameF[rand()%6];
}
 
void nextYear(char a)       //Функция для перехода на новый год
{
    if(a == 'y' || a == 'Y')
        for (int i = 1; i < 100; i++)
        {
            rabits[i].age += 1;
            if(rabits[i].age == 2)
            {
                                    //Что нужно сделать?
            }
        }
    for(int i = 1; i <= 5; i++)
    {
        cout << "Rabit" << i << endl;
        cout << "age = " << rabits[i].age << endl;
        cout << "color = " << rabits[i].color << endl;
        cout << "sex = " << rabits[i].sex << endl;
        cout << "name = " << rabits[i].name << endl;
        cout << endl;
    }
    return;
}
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
29.09.2012, 15:30     Структуры #6
C++
1
2
3
4
vector<Bunnies> rabits(100);
//изменить на
vector<Bunnies> rabits;
//массив на то и динамический, что не обязательно задавать размеры сразу же.
Здесь
C++
1
for(int i = 1; i <= 5; i++)     //Вывод 5 кроликов возрастом "0"
и далее в других циклах вы берете нумерацию с 1. Хотя в с/с++ первый элемент массива имеет индекс 0. Соответственно, надо так:
C++
1
for(int i = 0; i < 5; i++)     //Вывод 5 кроликов возрастом "0"
Другие циклы сможете поправить?

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void nextYear(char a)       //Функция для перехода на новый год
{
    if(a == 'y' || a == 'Y')
        for (int i = 0, end = rabits.size(); i < end; i++)
        {
            rabits[i].age += 1;
            if(rabits[i].age == 2)
            {
                Bunnies rabit = {0, color[rand()%4], sex[rand()%2], nameFunc(rabit.sex)};       //Рандомно создает стандартный кролик
                rabits.push_back(rabit);
            }
        }
        for(int i = 0; i < rabits.size(); i++)
        {
            cout << "Rabit" << i << endl;
            cout << "age = " << rabits[i].age << endl;
            cout << "color = " << rabits[i].color << endl;
            cout << "sex = " << rabits[i].sex << endl;
            cout << "name = " << rabits[i].name << endl;
            cout << endl;
        }
        return;
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
29.09.2012, 15:32     Структуры #7
почему ты индексируешь с единицы? если твой вектор содержит один элемент, то rabit[1] указывает за границы массива.
всегда лучше использовать итераторы при работе с контейнерами, а не индексировать самому. чревато ошибками.
TioS
0 / 0 / 0
Регистрация: 19.02.2012
Сообщений: 4
29.09.2012, 22:29  [ТС]     Структуры #8
Спасибо, все исправил, все работает.

Добавлено через 6 часов 37 минут
I.M., не хочу надоедать, но все же, как сделать визуально, то-есть не в консоли, а на Windows форме, на которой будет кнопочка, которая будет выполнять функцию:
C++
1
void nextYear(char a)
и текстовый редактор, который будет выполнять действия консоли. Заранее говорю, я пока что изучал C++ в консоли.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2012, 01:58     Структуры
Еще ссылки по теме:

Отличаи класса С++ от структуры на С и структуры на С++ C++
C++ Структуры и указатели на структуры
Структуры, нумерация полей структуры C++

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

Или воспользуйтесь поиском по форуму:
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
30.09.2012, 01:58     Структуры #9
Уф.. я не очень силен в winform. Помню, что в VS интуитивно понятный интерфейс их создания. Фактически IDE генерирует весь код за тебя. В том числе и методы, которые срабатывают при определенных событиях. Клик по кнопке - это тоже событие. Соответственно, добавляете кнопку на форму. Делаете для нее нужный метод через настройки. И уже в этот метод вставляете свой код.
Туда же надо будет добавить изменение текста в текстовом поле
Yandex
Объявления
30.09.2012, 01:58     Структуры
Ответ Создать тему
Опции темы

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