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

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

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

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

17.07.2014, 19:03. Просмотров 495. Ответов 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; &quot;ВОЗРАСТ&quot; &quot;УСПЕВАЕМОСТЬ&quot; выполнить сортировку по успеваемости по возрастанию. Использовать...

Запросить у пользователя имя, фамилию, а затем вывести строку вида "фамилия, имя" - C++
С. Прата, &quot;Язык программирования С++&quot;, 4 глава, задача 3. Напишите программу, которая запрашивает у пользователя имя, фамилию, а затем...

Написать функцию поиска человека по полю "фамилия" в массиве структур "Note" ("Персональная информация") - C++
Вывести из структуры информацию о человеке, чья фамилия введена с клавиатуры #include &lt;iostream&gt; #include &lt;locale&gt; #include...

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

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 1
17.07.2014, 19:14 #2
Так вроде по русски написано:
В 202 строке забыли объявить переменную k_min
В 211 строке в функции add_node забыли параметры.
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 34
17.07.2014, 19:27  [ТС] #3
Вот мне это и непонятно. Может быть, я вывод младшего ребенка у Иванова И.И. неправильно сделал, и переменная k_min вовсе не нужна. Насчет второго замечания тоже непонятка. Вроде не забыл параметры.
Код
78 void add_node(int i)
211 d.add_node(int i)
Параметры совпали вроде. Мне не понятно, в чем конкретно ошибка?
zss
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 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
Сообщений: 34
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
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 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
Сообщений: 34
17.07.2014, 19:43  [ТС] #7
Того ребенка, который родился позже всех. Как я говорил, k_min может быть и не нужна. Чем заменить эту переменную, если есть чем?
zss
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 1
17.07.2014, 22:12 #8
Цитата Сообщение от TLandertinger Посмотреть сообщение
Чем заменить эту переменную
Номером того ребенка, который родился позже всех
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 34
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
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 1
18.07.2014, 13:37 #10
k_min нельзя убрать. Надо ее объявить и присвоить значение равное номеру самого молодого ребенка
(т.е. того, у которого самое большое значение d_birth_child).
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 34
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
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 1
18.07.2014, 13:59 #12
node->k
надо писать node-> слитно с k
TLandertinger
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 34
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
Модератор
Эксперт С++
6357 / 5921 / 1919
Регистрация: 18.12.2011
Сообщений: 15,217
Завершенные тесты: 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
Сообщений: 34
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
18.07.2014, 14:23
Привет! Вот еще темы с ответами:

Создание структуры "префиксное дерево". Ошибка "Access violation writing location". - C++
Есть структура данных - бор или префиксное дерево. class trie { char value; // символ узла trie** pointers; // ссылки на...

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

Вывести текст файла, заменив цифры от 0 до 9 на слова "ноль", "один"."девять", начиная каждое предложение с новой строки - C++
Написать программу, которая считывает текст из файла и выводит его на экран, заменив цифры от 0 до 9 на слова &quot;ноль&quot;, &quot;один&quot;...&quot;девять&quot;,...

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


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

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

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