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

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

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

Иерархические структуры. Есть программа, которая добавляет, удаляет, показывает людей, которых мы вводим. Нужно изменить ее так, чтобы она высвечивала - C++

24.06.2013, 23:50. Просмотров 404. Ответов 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
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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
# include "stdafx.h"
# include <stdlib.h>
# include <string.h>
# include <stdio.h>
# include <malloc.h>
# include <conio.h>
#include <iostream>
using namespace std;
 
# define STAFF struct sStaffType
STAFF   // Учебно-вспомогательный персонал
{
   int iYearsOfService;   // Время работы (лет)
   float fHourlyWage;     // Почасовая оплата
};
# define STUDENT struct sStudentType
STUDENT
{
   float fGradePtAverage;   // Средний рейтинг
   int iLevel;              // Год обучения
};
# define PROFESSOR struct sProfType
PROFESSOR
{
   int iDepartmentNumber;      // Номер кафедры
   float fAnnualSalary;        // Годовая зарплата
};
# define COLLEGE struct sColType
COLLEGE
{
   int period;     
   float klass;     
};
# define NODE_TYPE enum eNodeType
typedef NODE_TYPE {student, professor, staff, college};
# define TREE struct sTree
TREE
{
   char sLastName[15];   // Фамилия
   char sFirstName[15];  // Имя
   int iAge;             // Возраст
   TREE *Left, *Right;   // Указатели на левый и правый листья (ветви)
   NODE_TYPE tag;        // описатель типа узла - студент или профессор или УВП
   union
   {
        STUDENT student;
        PROFESSOR professor;
        STAFF staff;
        COLLEGE college;
   } uNodeTag;                 // Обьединение, содержащее информацию по
};                             // студенту или сотруднику университета
extern void Insert(TREE **root, TREE *item);  // Вставить в дерево новый элемент item
extern void Display(TREE *root);  // Показать содержимое дерева
extern TREE* iIsPresent(TREE *root, TREE *item); // Содержится ли информация item в дереве?
extern int iTakeOut(TREE **root, TREE *item);  // Удалить элемент item из дерева
extern void Destroy(TREE *root); // Уничтожить дерево
static TREE* CreateNode(TREE* item) // Создать элемент item
{
   TREE* node;
   node = (TREE*) malloc(sizeof(TREE));
   *node = *item;
   return node;
}
void Destroy(TREE* root)  // Уничтожить дерево
{
   if (root)    // Обратите особое внимание на рекурсивную работу этой функции
    {
        Destroy(root->Left);
        Destroy(root->Right);
        free(root); // Освободить память, которая была выделена для узла дерева
    }
   root = 0;
}
int iTakeOut(TREE** root, TREE* item) // Удалить элемент item из дерева
{
   TREE *previous = 0,    // Предыдущий узел дерева
          *present = *root,  // Текущий узел дерева
          *replace,  // Вспомогательные узлы,
          *s,        // используемые для перемещения элементов
          *parent;   // дерева после удаления найденного узла
          int iFound = 0;
   while (present && !iFound) // Пока не будет найден элемент item
   {
         if(strcmp(item->sLastName, present->sLastName) == 0)
            iFound = 1;  // Информация по человеку с таким именем и фамилией есть в дереве
         else
          {
            previous = present;
            // Если ASCII представление фамилии из item меньше ASCII кода фамилии
            // из текущего узла дерева (present), то перейти к просмотру левого
            // узла (листа) относительно present, иначе - правого
            if(strcmp(item->sLastName, present->sLastName) < 0)
                 present = present->Left;
            else
                 present = present->Right;
          }
   }
   if (iFound) // если item присутствует в дереве
   {
         if (present->Left == 0)  // Если найденный элемент не имеет ветви слева
            replace = present->Right;
         else
         {
            if (present->Right == 0) // Если найденный элемент не имеет ветви справа
                 replace = present->Left;
            else  // Если удаляемый элемент имеет и левую и правую ветвь (листья)
            {
                  parent = present;
                  replace = present->Right;
                  s = replace->Left;
                  // Теперь необходимо подвинуть все элементы ветви, чтобы избежать разрыва
                  // дерева при удалении найденного элемента (present)
                  while (s != 0) // Пока не будет достигнут крайний левый лист в рассматриваемой ветви
                  {  // Спускаемся вниз дерева по левой ветви
                        parent = replace;
                        replace = s;
                        s = replace->Left;
                  }
                  if (parent != present) // Есть левая ветвь от правой ветви от найденного элемента
                  {
                        parent->Left = replace->Right;   // Правую подветвь переносимого элемента сделать левой подветвью предыдущего
                        replace->Right = present->Right; // Переместить элемент на место удаляемого
                  }
                  replace->Left = present->Left; // Переместить левую ветвь
            }
         }
         if (previous == 0) // Элемент лежит сразу же за корнем дерева
            *root = replace;
         else
            if(present == previous->Left) // Предыдущий спуск был по левой ветви
                 previous->Left = replace;
            else                          // Предыдущий спуск был по правой ветви
                 previous->Right = replace;
         free (present);  // Удалить найденный элемент
   }
   return iFound; // 1 - если элемент был удален, 0 - если такого элемента в дереве не было
}
void Insert(TREE **root, TREE *item ) // Вставить элемент item в дерево
{
   TREE *parent = 0,
   // current (текущий) указатель на дерево указывает на его вершину (корень)
   *current = *root;
   TREE *new_node;   // Новый узел
   int iFound = 0;
   while (current && !iFound) // Пока элемент item не найден
   {
        if ((strcmp(item->sLastName, current->sLastName) == 0)&&(strcmp(item->sFirstName, current->sFirstName) == 0)) iFound = 1;
        else
        {
           parent = current;
           if ((strcmp(item->sLastName, current->sLastName) < 0)&&(strcmp(item->sFirstName, current->sFirstName) < 0))
                current = current->Left; // перемещаться по левой ветви
           else
                current = current->Right; // перемещаться по правой ветви
        }
   }
   if (iFound == 0)
    {
        if (parent == 0) // в дереве нет еще элементов - создаем его
        {
           *root = CreateNode(item); // создать узел
           (*root)->Left = (*root)->Right = 0;
        }
        else // Вставить узел в дерево
        {
           new_node = CreateNode(item);
           new_node->Left = new_node->Right = 0;
           if (strcmp(item->sLastName, parent->sLastName) < 0)
                parent->Left = new_node;
           else
                parent->Right = new_node;
        }
    }
}
void Display(TREE *root)  // Показать дерево
{
   if(root)  // Обратите внимание также на рекурсивный обход дерева
   {
        Display(root->Left);// показать вначале левую ветвь (лист) дерева
        printf("\n%s, %s", root->sLastName, root->sFirstName);
        printf("\n Old - %d", root->iAge);
        switch(root->tag)  // Обратите внимание на использование в
        {                  // конструкции switch элементов перечислимого
           case student:   // (enum) типа
             printf("\nReyting: %.2f",
                             root->uNodeTag.student.fGradePtAverage);
             printf("\nKurs: %d\n", root->uNodeTag.student.iLevel);
           break;
           case professor:
             printf("\nNumber of kafedra: %d",
                            root->uNodeTag.professor.iDepartmentNumber);
             printf("\nYear selary: %.2f\n",
                           root->uNodeTag.professor.fAnnualSalary);
           break;
           case staff:
             printf("\n Time of work(year): %d",
                           root->uNodeTag.staff.iYearsOfService);
             printf("\nSelary of oure: %.2f\n",
                            root->uNodeTag.staff.fHourlyWage);
                         break;
                        case college:
             printf("\n Period: %d",
                                 root->uNodeTag.college.period);
             printf("\nKlass: %.2f\n",
                                 root->uNodeTag.college.klass);
                                                        break;
         }
        Display(root->Right); // Вывести информацию о содержимом правого узла
    }
}
TREE *iIsPresent(TREE *root, TREE *item)        
{
   TREE *current = root;  // Устанавливаем указатель на вершину (корень) дерева
   int iFound = 0;
   while (current && !iFound) // пока элемент item не найден
    {
        if ((strcmp(item->sLastName, current->sLastName) == 0)&&(strcmp(item->sFirstName, current->sFirstName) == 0)) return current;
        else
        {  // Если ASCII код фамилии из item меньше ASCII кода из текущего узла (current)
           if ((strcmp(item->sLastName, current->sLastName) < 0)&&(strcmp(item->sFirstName, current->sFirstName) < 0))
                current = current->Left;   // то перейти к рассмотрению левого узла
           else
                current = current->Right; // иначе перейти к рассмотрению правого узла
        }
    }
   return current = NULL;  // Если не найден - 0, если найден - 1
}
TREE* sMyTree;
void main()
{
        int x =0;
        while (x!=4)
        {
                cout<<"1. Make\n2. Delete\n3. Display\n4. Exit\n\nMake your choose: ";
                cin>>x;
                cout<<endl;
                switch(x)
                {
                case 1: 
                        {
                                int tag;
                                TREE* item = new TREE;
                                cout<<"Enter last name: ";
                                cin>>item->sLastName;
                                cout<<"Enter first name: ";
                                cin>>item->sFirstName;
                                cout<<"Enter age: ";
                                cin>>item->iAge;
                                cout<<"1. College, 2. Student, 3. Staff, 4. Professor: ";
                                cin>>tag;
                                if(tag==1) 
                                {
                                        item->tag = college;
                                        cout<<"Period: ";
                                        cin>>item->uNodeTag.college.period;
                                        cout<<"Klass: ";
                                        cin>>item->uNodeTag.college.klass;
                                }
                                if(tag==2) 
                                {
                                        item->tag = student;
                                        cout<<"Marks: ";
                                        cin>>item->uNodeTag.student.fGradePtAverage;
                                        cout<<"Level: ";
                                        cin>>item->uNodeTag.student.iLevel;
                                }
                                if(tag==3) 
                                {
                                        item->tag = staff;
                                        cout<<"Hourly wage: ";
                                        cin>>item->uNodeTag.staff.fHourlyWage;
                                        cout<<"Years of service: ";
                                        cin>>item->uNodeTag.staff.iYearsOfService;
                                }
                                if(tag==4) 
                                {
                                        item->tag = professor;
                                        cout<<"Annual salary: ";
                                        cin>>item->uNodeTag.professor.fAnnualSalary;
                                        cout<<"Department number: ";
                                        cin>>item->uNodeTag.professor.iDepartmentNumber;
                                }
                                Insert(&sMyTree, item);
                        }
                        break;
                case 2:
                        {
                                int x=10;
                                TREE* item1 = new TREE;
                                cout<<"Enter last name: ";
                                cin>>item1->sLastName;
                                cout<<"Enter first name: ";
                                cin>>item1->sFirstName;
                                TREE* current = iIsPresent(sMyTree, item1);
                                if (current != NULL) iTakeOut(&sMyTree, current);  
                        
                        }
                        break;
                case 3: {Display(sMyTree);}
                                break;
                }
        }
   getchar();
   getchar();
   printf("\n");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2013, 23:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Иерархические структуры. Есть программа, которая добавляет, удаляет, показывает людей, которых мы вводим. Нужно изменить ее так, чтобы она высвечивала (C++):

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

Изменить for на while, но так, чтобы программа оставалась прежней, то есть выполняла ту же работу - C++
Нужна помощь в решении проблемы. Правда язык обучения у меня английский, поэтому некоторые задания на английском. Задание #1: Код...

Есть проект, нужно изменить его так чтобы выводило, панель с 2умя вкладками - Java
Есть проект, нужно изменить его так чтобы выводило, панель с 2умя вкладками: 1 вкладка- Фамилия имя 2 вкладка- возраст и год рождения...

Изменить программу так чтобы данные о первых 4 людей инициировались в программе - C (СИ)
Помогите пожалуйста изменить программу так чтобы данные о первых 4 людей инициировались в программе и чтобы она решалась для 7 людей....

Изменить программу так, чтобы она изменилась у всех пользователей - C#
Подробно: создал программу кинул другу её , потом в этой программе я захотел её доработать или под исправить что-то , всё сделал всё...

Изменить программу так, чтобы она выполняла действия через файл - C++
Помогите в строках 65 и 70 изменить программу так, чтобы она выполняла действия через файл ( в программе указан файл TextLSP.txt ), а не...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2013, 23:50
Привет! Вот еще темы с ответами:

Изменить программу так, чтобы она вводила числа в массив с клавиатуры - C (СИ)
Как изменить программу так, чтобы она вводила числа в массив с клавиатуры? #include&lt;stdio.h&gt; #include&lt;conio.h&gt; #define m 10 ...

Есть ли программа, которая полностью удаляет содержимое жёсткого диска? - Системный софт
Полностью! Чтобы осталась по умолчанию одна операционная система?

Есть ли умельцы, подредактировавшие Windows 7 так, чтобы она поддерживала DX12? - Windows 7
Есть ли такие умельцы, подредактировавшие win7 так, что бы он поддерживал DX12? Или лучше (но менее вероятно) DX12, работающий на win7? ...

Изменить программу так, чтобы она выводила не только сумму балов, но и их среднее арифметическое - C#
namespace ConsoleApplication1 { class Program { static void Main(string args) { string name;//Объявляем строковую переменную ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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