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

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

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

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

24.06.2013, 23:50. Просмотров 391. Ответов 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");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2013, 23:50     Иерархические структуры. Есть программа, которая добавляет, удаляет, показывает людей, которых мы вводим. Нужно изменить ее так, чтобы она высвечивала
Посмотрите здесь:

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

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

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

Визуализация структуры: изменить вывод так, чтобы дерево выглядело более понятно/наглядно - C++
Здравствуйте. Подскажите пожалуйста, как можно изменить вывод, что бы это дерево выглядело более понятно/наглядно? Например так, что бы...

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

Готовая программа, нужно переделать ее чтобы она работала с УКАЗАТЕЛЯМИ - C++
Вычислить значение выражения тут Вычислить значение выражения (3a+4)/(a-в квадрате-5a-9) для а= 1,2,…100. Результат выполнения занести в...

Структуры: изменить таблицу так, чтобы в ней была фамилия и оценки за 9-й класс нового ученика - C++
Годовые оценки по десяти предметам за 9-й класс каждого из 10 учеников класса напечатаны в виде таблицы (в первой строке — оценки ...

Программа не воспринимает вводимый текст. Что нужно добавить чтобы она заработала? - C++
#include &lt;iostream&gt; using namespace std; int main () { int gallons, liters; cout &lt;&lt; &quot;Vvedite chislo gallonov: &quot;; ...

Есть сумма, нужно подобрать так купюры, чтобы разменять эту сумму без остатка - C++
Я не умею решать задачи подобного типа: есть сумма нужно подобрать так купюры чтобы разменять эту сумму без остатка. Киньте ссылку на...

Нужно сделать так, чтобы программа запускалась только если ей передать заданный аргумент. - C++
сразу приношу извинения, но я не нащёл подходящего раздела. суть такова. есть программа(исходников нет) нужно сделать так, чтобы она...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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