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

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

Войти
Регистрация
Восстановить пароль
 
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 33
#1

Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И - C++

17.07.2014, 19:03. Просмотров 478. Ответов 15
Метки нет (Все метки)

Здравствуйте. Помогите, пожалуйста. У меня возникли проблемы. Вот задание:
Описать массив записей "семья".
--------------------------------------------------------------
Отец ! Мать ! Ребенок ! ! Ребенок!
--------------------------------------- -----------
Ф.И.О.!дата !Ф.И.О.!дата ! Имя !дата ! ...... ! Имя !дата !
!рожд.! !рожд.! !рожд.! ! !рожд.!
---------------------------------------------------------------
!__________________ ________________!
не более 5 детей

Найти и вывести имя младшего ребенка у Иванова И.И. по форме
_______________________________
имя ребенка ! дата рождения !
-------------------------------
Программа должна вывести массив записей в виде дерева структур.
Я практически сделал, но у меня выходят ошибки (описание ошибок в скриншоте). Может, я что-то не так сделал? Заранее спасибо. Среда c++ visual studio 2010. Компилятор консольный CLR.
 Комментарий модератора 
Тексты должны быть вставлены в сообщение!!!

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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
// laba 12-1.cpp: главный файл проекта.
#include "stdafx.h"
#include "iostream"
#include "conio.h"
 
using namespace std;
 
struct Date         
{
    unsigned day;       
    unsigned month;     
    unsigned year;
};
 
struct Children
{
    char name_of_child[30];
    Date d_birth_child;
};
 
struct T_family 
{
    char fio_father[30];
    Date d_birth_father;
    char fio_mother[30];
    Date d_birth_mother;
    Children ch[5];
    int k;
 
}; 
 
struct TreeNode
{
    int k;
    T_family family;
    Children ch[5];
    TreeNode *next;
    TreeNode *child;
};
 
class date_of_birth
{
private:
    TreeNode *head;
public:
date_of_birth()
    {
        head = new TreeNode;
        TreeNode *node1 = new TreeNode;
        node1->k = 1;
        node1->child = NULL;
        node1->next = NULL;
        head->child = node1;
        TreeNode *node2 = new TreeNode;
        node2->k = 2;
        node2->child = NULL;
        node2->next = NULL;
        node1->next = node2;
        TreeNode *node3 = new TreeNode;
        node3->k = 3;
        node3->child = NULL;
        node3->next = NULL;
        node2->next = node3;
        T_family a = {"Ivanov I. I.", 21,5,1965,"Ivanova E.G.",13,2,1967,"Oleg",19,7,1994,"Olga",13,8,1996};
        TreeNode *nodeA = new TreeNode;
        nodeA->family = a;
        nodeA->child = NULL;
        nodeA->next = NULL;
        node1->child = nodeA;
        T_family b = {"Petrov P. P.", 12,4,1962,"Petrova E.O.",8,12,1965,"Pavel",12,4,1988,"Ekaterina",24,8,1992};
        TreeNode *nodeB = new TreeNode;
        nodeB->family = b;
        nodeB->child = NULL;
        nodeB->next = NULL;
        node2->child = nodeB;
}
 
void add_node(int i)
    {
    int count;      
    T_family a; 
    char c;
    cout << endl << " Enter data of" << i+1 << "person\n ";
    cout << " fio of father ";
    cin.getline (a.fio_father, 30);
    cout << "Enter date of father's birthday: \n";
    cout << " day (1-31) ";
    cin >> a.d_birth_father.day;
    cin.get(c);
    cout << " month (1-12)";
    cin >> a.d_birth_father.month;
    cin.get(c);
    cout << " year ";
    cin >> a.d_birth_father.year;
    cin.get(c);
    cout << " fio of mother ";
    cin.getline (a.fio_mother, 30);
    cout << endl <<"Enter date of mother's birthday: \n";
    cout <<" day (1-31) ";
    cin >> a.d_birth_mother.day;
    cin.get(c);
    cout << " month (1-12)";
    cin >> a.d_birth_mother.month;
    cin.get(c);
    cout << " year ";
    cin >> a.d_birth_mother.year;
    cin.get(c);
    //запросить кол-во детей и запомнить в count
    cout << "Enter count of children" << endl;
    cin >> count;
    cin.get(c);
    if ((count > 5) && (count < 0)) cout << " Fatal error " << endl;
    a.k = count;
    for (int k=0; k < count; k++) {
        cout << endl << " Name of " " " << k+1 << " " " child ";
        cin.getline (a.ch[k].name_of_child, 30);
        cout << endl << "Enter date of" " "<< k+1 << " " "child's birthday: \n";
        cout <<" day (1-31) ";
        cin >> a.ch[k].d_birth_child.day;
        cin.get(c);
        cout << " month (1-12)";
        cin >> a.ch[k].d_birth_child.month;
        cin.get(c);
        cout << " year ";
        cin >> a.ch[k].d_birth_child.year;
        cin.get(c); 
    }
 
        TreeNode *node = head->child;
        while(true)
        {
            if(node->k == a.k)
            {
                TreeNode *newNode = new TreeNode;
                newNode->family = a;
                newNode->child = NULL;
                newNode->next = NULL;
                if(node->child == NULL)
                    node->child = newNode;
                else    
                {
                    TreeNode *elem = node->child;
                    while(elem->next != NULL)
                        elem = elem->next;
                    elem->next = newNode;
                }
                return;
            }
            if(node->next == NULL)
                break;
            node = node->next;
        }
 
        TreeNode *newNode = new TreeNode;
        newNode->k = a.k;
        newNode->child = NULL;
        newNode->next = NULL;
        node->next = newNode;
        TreeNode *nodeA = new TreeNode;
        nodeA->family = a;
        nodeA->child = NULL;
        nodeA->next = NULL;
        newNode->child = nodeA;
    }
 
void print_tree()
    {
        printf("[ \n");
        TreeNode *node = head->child;
        while(node != NULL)
        {
            cout << " --> " << node->k << endl;
            if(node->child != NULL)
            {
                TreeNode *child = node->child;
                while(child != NULL)
                {
                printf("! %10s ! %2d.%2d.%4d !",child->family.fio_father, child->family.d_birth_father.day, child->family.d_birth_father.month, child->family.d_birth_father.year);
                printf("! %10s ! %2d.%2d.%4d !",child->family.fio_mother, child->family.d_birth_mother.day, child->family.d_birth_father.month, child->family.d_birth_father.year);
                for (int k = 0; k < child->family.k ; k++) {
                printf("! %10s ! %2d.%2d.%4d!", child->family.ch[k].name_of_child, child->family.ch[k].d_birth_child.day, child->family.ch[k].d_birth_child.month, child->family.ch[k].d_birth_child.year);
                printf("\n");
    }
                    child = child->next;
                }
            }
            node = node->next;
        }
        printf("]\n");
    }
 
void find_min()
    {
        TreeNode *node = head->child;
        TreeNode *young = node->child;
        while(node != NULL)
        {
            if(node->k < young->k && node->child != NULL)
                young = node->child;
            node = node->next;
        }
printf("!  %10s  ! %2d.%2d.%4d !\n", young->family.ch[k_min].name_of_child, young->family.ch[k_min].d_birth_child.day, young->family.ch[k_min].d_birth_child.month, young->family.ch[k_min].d_birth_child.year);
    }
};
 
int main()
{
    date_of_birth d;
    for(int i = 2; i < 4; i++)
    {   
        d.add_node(int i);
    };
    cout << "\nlist of structs\n!       father        !       mother        !        child        !\n";
    d.print_tree();
    d.find_min();
    _getch();
    return 0;
}
Миниатюры
Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 19:03     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И
Посмотрите здесь:

C++ Массив структур "Музыкальная школа": вывести информацию по ученикам, играющим на заданном инструменте
Создать массив, элементами которого являются структуры – список учеников музыкальной школы (фамилия, инструмент, год обучения). Вывести...

Стек с записями "Семья" C++
Здравствуйте. У меня проблема. Вот задание Описать массив записей &quot;семья&quot;. ...

C++ Нужно вывести всех людей, имя которых начинаеться на букву "Л"
Нужно вывести всех людей, имя которых начинаеться на букву &quot;Л&quot;. Также если кто-то знает как изменить, что бы работамо с struct employee...

C++ Определить длину данной строки и количество букв "а" в ней. Вывести имя в обратном порядке
Ввести фамилию, имя и отчество как одно текстовое дано. Определить длину данной строки и количество букв &quot;а&quot; в нем. Решить задачу двумя...

C++ Классы "Бинарное дерево" и "Узел" в одном приложении
Компилятор разбушевался((( Пробовала сделать вместо одного класса два класса(Дерево и узел). Сделала один класс дружественный другому. Но...

Класс "Сотрудник фирмы". Определить фамилию самого младшего по возрасту среди военнообязанных C++
Не имею представления, как это сделать. Помогите! Через два дня сдавать( Известны данные о 16 сотрудниках фирмы: имя, фамилия, возраст...

C++ Ввести фамилию, имя и отчество как одну строку, найти количество букв "a" в ней, а также длину фамилии и имени
Помогите решить Ввести фамилию, имя и отчество как одно данное типа строка. 1. Определить количество букв «а» в нем. Выполнить задание...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6289 / 5892 / 1910
Регистрация: 18.12.2011
Сообщений: 15,129
Завершенные тесты: 1
17.07.2014, 19:14     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #2
Так вроде по русски написано:
В 202 строке забыли объявить переменную k_min
В 211 строке в функции add_node забыли параметры.
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 33
17.07.2014, 19:27  [ТС]     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #3
Вот мне это и непонятно. Может быть, я вывод младшего ребенка у Иванова И.И. неправильно сделал, и переменная k_min вовсе не нужна. Насчет второго замечания тоже непонятка. Вроде не забыл параметры.
Код
78 void add_node(int i)
211 d.add_node(int i)
Параметры совпали вроде. Мне не понятно, в чем конкретно ошибка?
zss
Модератор
Эксперт С++
6289 / 5892 / 1910
Регистрация: 18.12.2011
Сообщений: 15,129
Завершенные тесты: 1
17.07.2014, 19:32     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #4
2. Здесь вызов, а не объявление!
C++
1
2
3
4
for(int i = 2; i < 4; i++)
    {   
        d.add_node(i);
    }
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 33
17.07.2014, 19:36  [ТС]     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #5
Спасибо. Осталось ликвидировать ошибки в 202 строке. Я не знаю, чем заменить эту строку, ведь k_min, как оказалось, не нужна. Может быть, неправильно выполнен поиск младшего ребенка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 void find_min()
    {
        TreeNode *node = head->child;
        TreeNode *young = node->child;
        while(node != NULL)
        {
            if(node->k < young->k && node->child != NULL)
                young = node->child;
            node = node->next;
        }
printf("!  %10s  ! %2d.%2d.%4d !\n", young->family.ch[k_min].name_of_child, young->family.ch[k_min].d_birth_child.day, young->family.ch[k_min].d_birth_child.month, young->family.ch[k_min].d_birth_child.year);
    }
};
Заранее благодарю.
zss
Модератор
Эксперт С++
6289 / 5892 / 1910
Регистрация: 18.12.2011
Сообщений: 15,129
Завершенные тесты: 1
17.07.2014, 19:39     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #6
printf("! %10s ! %2d.%2d.%4d !\n", young->family.ch[k_min].name_of_child, young->family.ch[k_min].d_birth_child.day, young->family.ch[k_min].d_birth_child.month, young->family.ch[k_min].d_birth_child.year);
ch - у Вас массив детей - до 5 шт. Определитесь, какого именно ребенка (k-min) хотели вывести.
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 33
17.07.2014, 19:43  [ТС]     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #7
Того ребенка, который родился позже всех. Как я говорил, k_min может быть и не нужна. Чем заменить эту переменную, если есть чем?
zss
Модератор
Эксперт С++
6289 / 5892 / 1910
Регистрация: 18.12.2011
Сообщений: 15,129
Завершенные тесты: 1
17.07.2014, 22:12     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #8
Цитата Сообщение от TLandertinger Посмотреть сообщение
Чем заменить эту переменную
Номером того ребенка, который родился позже всех
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 33
18.07.2014, 13:12  [ТС]     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #9
Если убрать k_min, то появляются такие ошибки:
Код
 1>------ Построение начато: проект: laba 12-1, Конфигурация: Debug Win32 ------
1>  laba 12-1.cpp
1>laba 12-1.cpp(202): error C2228: выражение слева от ".name_of_child" должно представлять класс, структуру или объединение
1>          тип: Children [5]
1>laba 12-1.cpp(202): error C2228: выражение слева от ".d_birth_child" должно представлять класс, структуру или объединение
1>          тип: Children [5]
1>laba 12-1.cpp(202): error C2228: выражение слева от ".day" должно представлять класс, структуру или объединение
1>laba 12-1.cpp(202): error C2228: выражение слева от ".d_birth_child" должно представлять класс, структуру или объединение
1>          тип: Children [5]
1>laba 12-1.cpp(202): error C2228: выражение слева от ".month" должно представлять класс, структуру или объединение
1>laba 12-1.cpp(202): error C2228: выражение слева от ".d_birth_child" должно представлять класс, структуру или объединение
1>          тип: Children [5]
1>laba 12-1.cpp(202): error C2228: выражение слева от ".year" должно представлять класс, структуру или объединение
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
, а если оставить переменную, то выходят те ошибки, которые описаны в скриншоте (за исключением последних 3, т.к. я исправил их с вашей помощью). Чем заменить строку?
zss
Модератор
Эксперт С++
6289 / 5892 / 1910
Регистрация: 18.12.2011
Сообщений: 15,129
Завершенные тесты: 1
18.07.2014, 13:37     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #10
k_min нельзя убрать. Надо ее объявить и присвоить значение равное номеру самого молодого ребенка
(т.е. того, у которого самое большое значение d_birth_child).
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 33
18.07.2014, 13:46  [ТС]     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #11
Теперь пишет:
Код
 1>------ Построение начато: проект: laba 12-1, Конфигурация: Debug Win32 ------
1>  laba 12-1.cpp
1>laba 12-1.cpp(202): error C2065: k: необъявленный идентификатор
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Вот фрагмент кода:
Код
 void find_min()
	{
		int k_min = 0;
		TreeNode *node = head->child;
		TreeNode *young = node->child;
		while(node != NULL)
		{
			if(node-> k < young-> k && node->child != NULL)
				young = node->child;
			node = node->next;
			k_min = k;
		}
Может, где-нибудь я накосячил?
zss
Модератор
Эксперт С++
6289 / 5892 / 1910
Регистрация: 18.12.2011
Сообщений: 15,129
Завершенные тесты: 1
18.07.2014, 13:59     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #12
node->k
надо писать node-> слитно с k
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 33
18.07.2014, 14:04  [ТС]     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #13
Это сути не меняет: тот же необъявленный идентификатор k, хотя я объявлял его в структуре T_family
C++
1
2
3
4
5
6
7
8
9
struct T_family 
{
    char fio_father[30];
    Date d_birth_father;
    char fio_mother[30];
    Date d_birth_mother;
    Children ch[5];
    int k;
};
и в структуре TreeNode
C++
1
2
3
4
5
6
7
8
struct TreeNode
{
    int k;
    T_family family;
    Children ch[5];
    TreeNode *next;
    TreeNode *child;
};
zss
Модератор
Эксперт С++
6289 / 5892 / 1910
Регистрация: 18.12.2011
Сообщений: 15,129
Завершенные тесты: 1
18.07.2014, 14:05     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #14
В обоих случаях исправили?
Кстати
C++
1
2
3
4
if(node->k < young->k && node->child != NULL)
                young = node->child;
            node = node->next;
            k_min = young->k;// здесь было потеряно young->
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 33
18.07.2014, 14:23  [ТС]     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #15
У меня не вывелось имя младшего ребенка и дерево не очень правильно составлено (-->1 -- 1 семья, -->2 -- 2 семья, и т.д., хотя структура правильная), вдобавок необработанное исключение появилось. Может быть, я неправильно конструктор составил?
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
date_of_birth()
    {
        head = new TreeNode;
        TreeNode *node1 = new TreeNode;
        node1->k = 1;
        node1->child = NULL;
        node1->next = NULL;
        head->child = node1;
        TreeNode *node2 = new TreeNode;
        node2->k = 2;
        node2->child = NULL;
        node2->next = NULL;
        node1->next = node2;
        TreeNode *node3 = new TreeNode;
        node3->k = 3;
        node3->child = NULL;
        node3->next = NULL;
        node2->next = node3;
        T_family a = {"Ivanov I. I.", 21,5,1965,"Ivanova E.G.",13,2,1967,{"Oleg",19,7,1994,"Olga",13,8,1996},2};
        TreeNode *nodeA = new TreeNode;
        nodeA->family = a;
        nodeA->child = NULL;
        nodeA->next = NULL;
        node1->child = nodeA;
        T_family b = {"Petrov P. P.", 12,4,1962,"Petrova E.O.",8,12,1965,{"Pavel",12,4,1988,"Ekaterina",24,8,1992},2};
        TreeNode *nodeB = new TreeNode;
        nodeB->family = b;
        nodeB->child = NULL;
        nodeB->next = NULL;
        node2->child = nodeB;
}
Миниатюры
Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И   Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2016, 17:23     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И
Еще ссылки по теме:

C++ Ввести строку. Вывести её, заменив цифры на слова ( 0 - "one", 1 - "two", ...)
Ввести строку. Вывести её, заменив цифры на слова: ( 0 - &quot;one&quot;, 1 - &quot;two&quot;, ...)???

C++ Дан массив из 9 целых чисел. Найти сумму элементов массива и, если она четная, вывести сообщение "Сумма четная", в противном случае напечатать "Сумма
Дан массив из 9 целых чисел. Найти сумму элементов массива и, если она четная, вывести сообщение &quot;Сумма четная&quot;, в противном случае...

C++ Найти угол одной точки "A" в соотношении к точке "B" в градусах
Этот метод возвращает значение в радианах, как получить градусы? #define DEG 57.2957795f atan2f(p1.y - p2.y, p1.x - p2.x) * DEG;

Вывести "Leap Year", если заданный год високосный и "Normal Year" в противном случае C++
2.На вход программы подается год. Надо вывести слова Leap Year, если этот год високосный и Normal Year в противном случае. Здесь вы сможете...

C++ Отсортировать массив структур типа "Znak" по заданному полю
Вот что есть, помогите дальше... Я Ввожу знак зодиака и у меня должно сортировать в том порядке в котором есть в коде #include...


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

Или воспользуйтесь поиском по форуму:
aron73
0 / 0 / 0
Регистрация: 31.10.2015
Сообщений: 1
08.06.2016, 17:23     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И #16
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
// lab10_1.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
 
using namespace std;
 
struct Data //структура даты рождения
{
    unsigned day; //день рождения
    unsigned month;//месяц рождения
    unsigned year;//год рождения
};
struct anketa
{
    char lastname[20];
    char firstname[20];
    char otchestvo[20];
};
 
struct chel //структура данных человека
{
    anketa fio;//ФИО человека
    Data b_date;//дата рождения человека
 
};
 
struct T_family //структура данных семьи
{
    chel otetc; //данные отца
    chel mat; //данные матери
    int k;//количество детей
    chel deti[5];//массив данных из детей(5 максимум)
};
 
T_family in_family(short);//прототип функции добавления семьи
void show_family(T_family);//прототип функции добавления семьи
 
int main()
{
    SetConsoleOutputCP(1251);//корректные ввод-вывод 
    SetConsoleCP(1251);//кириллицы в консоль
    
    cout << "Программа описывает массив записей 'семья'." << endl;
 
    unsigned min_birth = 3000; //год рождения ребенка для поиска минимального
    int k_min = 0;
    T_family *p;
    T_family list[300] = {
        "Аронов", "Иван", "Германович", 07, 03, 1987,
        "Аронова", "Юлия", "Александровна", 05, 12, 1987,
        2,
        "", "Сергей", "", 01, 01, 2019, "", "Андрей", "", 02, 02, 2018
    };//массив семья с одной уже введенной вручную
    p = list + 1;
    short size = 1;//счетчик (количество введенных семей)
 
    //Добавим семью Иванова И.И. с тремя детьми
    strncpy_s(p->otetc.fio.lastname, "Иванов", 20);//_s потому что так безопасней сказал VS
    strncpy_s(p->otetc.fio.firstname, "И.", 20);
    strncpy_s(p->otetc.fio.otchestvo, "И.", 20);
    p->otetc.b_date.day = 02;           // через переменную-указатель
    p->otetc.b_date.month = 02;
    p->otetc.b_date.year = 1980;
    strncpy_s(p->mat.fio.lastname, "Иванова", 20);//
    strncpy_s(p->mat.fio.firstname, "А.", 20);//
    strncpy_s(p->mat.fio.otchestvo, "А.", 20);
    p->mat.b_date.day = 03;             
    p->mat.b_date.month = 03;
    p->mat.b_date.year = 1982;
    p->k = 3;
    strncpy_s(p->deti[0].fio.firstname, "Алексей", 20);
    p->deti[0].b_date.day = 01;
    p->deti[0].b_date.month = 02;
    p->deti[0].b_date.year = 2005;
    strncpy_s(p->deti[1].fio.firstname, "Борис", 20);
    p->deti[1].b_date.day = 01;
    p->deti[1].b_date.month = 02;
    p->deti[1].b_date.year = 2002;
    strncpy_s(p->deti[2].fio.firstname, "Владимир", 20);
    p->deti[2].b_date.day = 01;
    p->deti[2].b_date.month = 02;
    p->deti[2].b_date.year = 2004;
 
    size++;
    short sem = 5;//количество семей которые будут введены
    for (short i = size; i < sem; i++) // до 5
    {
        list[i] = in_family(i);//вводим данные семьи
        size++;//увеличиваем счетчик
    }
    for (int i = 0; i < size; i++)//цикл по всем введенным семьям
    {
        show_family(list[i]);//вызываем функцию вывода на экран всех семей
        printf_s("\n");
        char s2[20] = "Иванов";//интересующий нас человек
        int k;//переменная для перебора детей
        if (strcmp(list[i].otetc.fio.lastname, s2) == 0)//если совпали строки с фамилиями
        {
            
            for (k = 0; k < list[i].k; k++) //перебираем детей
            {
                if (list[i].deti[k].b_date.year < min_birth)//если год рождения ребенка меньше
                {
                    //по идеи еще проверить бы месяц и день рождения
                    min_birth = list[i].deti[k].b_date.year;//запоминаем его
                    k_min = k;//и присваевыем его индекс k_min
                }
            }
            printf_s("У отца %s %s %s %d детей, а младший ребенок:\n", list[i].otetc.fio.lastname, list[i].otetc.fio.firstname, list[i].otetc.fio.otchestvo, list[i].k);
            printf_s("Имя ребенка !Дата рождения\n");
            printf_s("%11s ! %d.%d.%d\n", list[i].deti[k_min].fio.firstname, list[i].deti[k_min].b_date.day, list[i].deti[k_min].b_date.month, list[i].deti[k_min].b_date.year);
        }
    }
    _getch();
    return 0;
}
 
T_family in_family(short i)//функция добавления семьи
{
    T_family f;//инициализируем новый экземпляр f структуры семья
    int count;//счетчик (количество детей)
    char c;//служебная переменная
    cout << endl << "Введите данные " << i + 1 << " семьи\n ";
    cout << "Введите фамилию отца: ";
    cin.getline(f.otetc.fio.lastname, 20);
    cout << "Введите имя отца: ";
    cin.getline(f.otetc.fio.firstname, 20);
    cout << "Введите отчество отца: ";
    cin.getline(f.otetc.fio.otchestvo, 20);
    cout << "Введите день рождения отца (1-31): ";
    cin >> f.otetc.b_date.day;
    //нужна проверка что ввели именно число и запрашивать от пользователя ввести его, пока не введет
    cin.get(c);//очищаем буфер от символа ввода, который добавился в буфер при нажатии клавиши ENTER
    cout << "Введите месяц рождения отца (1-12): ";
    cin >> f.otetc.b_date.month;
    cin.get(c);
    cout << "Введите год рождения отца: ";
    cin >> f.otetc.b_date.year;
    cin.get(c);
    cout << "Введите фамилию матери: ";
    cin.getline(f.mat.fio.lastname, 20);
    cout << "Введите имя матери: ";
    cin.getline(f.mat.fio.firstname, 20);
    cout << "Введите отчество матери: ";
    cin.getline(f.mat.fio.otchestvo, 20);
    cout << "Введите день рождения матери (1-31): ";
    cin >> f.mat.b_date.day;
    cin.get(c);
    cout << "Введите месяц рождения матери(1-12): ";
    cin >> f.mat.b_date.month;
    cin.get(c);
    cout << "Введите год рождения матери: ";
    cin >> f.mat.b_date.year;
    cin.get(c);
    //запросить кол-во детей и запомнить в count
    cout << "Введите количество детей" << endl;
    cin >> count;
    cin.get(c);
    if ((count > 5) && (count < 0))
    {
        cout << "Не верно введено количество детей " << endl;
    }
    f.k = count;
    for (int k = 0; k < count; k++)
    {
        cout << endl << "Введите имя " << k + 1 << " ребенка: ";
        cin.getline(f.deti[k].fio.firstname, 20);
        cout << endl << "Введите дату рождения " << k + 1 << " ребенка: \n";
        cout << "день (1-31): ";
        cin >> f.deti[k].b_date.day;
        cin.get(c);
        cout << "месяц (1-12): ";
        cin >> f.deti[k].b_date.month;
        cin.get(c);
        cout << "год: ";
        cin >> f.deti[k].b_date.year;
        cin.get(c);
    }
 
    return f;
 
};
void show_family(T_family f)
{
    //printf_s("                  Семья с %d детьми\n", f.k);
    printf_s("           Отец            !            Мать              !");
    for (int k = 0; k < f.k; k++)
    {
        printf_s("        Ребенок       !");
    }
    printf_s("\n");
    printf_s("         Ф.И.О.! дата рожд.!            Ф.И.О.! дата рожд.!");
    for (int k = 0; k < f.k; k++)
    {
        printf_s("        Имя!дата рожд.!");
    }
    printf_s("\n");
    printf_s("%14s !%2d.%2d.%4d !%15s   !%2d.%2d.%4d !\n", f.otetc.fio.lastname, f.otetc.b_date.day, f.otetc.b_date.month, f.otetc.b_date.year, f.mat.fio.lastname, f.mat.b_date.day, f.mat.b_date.month, f.mat.b_date.year);
    printf_s("%14s !           !%15s   !           !\n", f.otetc.fio.firstname, f.mat.fio.firstname);
    printf_s("%14s !           !%15s   !           !", f.otetc.fio.otchestvo, f.mat.fio.otchestvo);
    for (int k = 0; k < f.k; k++)
    {
        printf_s("%10s !%2d.%2d.%4d!", f.deti[k].fio.firstname, f.deti[k].b_date.day, f.deti[k].b_date.month, f.deti[k].b_date.year);
    }
    printf_s("\n");
};
Yandex
Объявления
08.06.2016, 17:23     Дерево структур "семья" - Найти и вывести имя младшего ребенка у Иванова И. И
Ответ Создать тему
Опции темы

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