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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Работа со строками. Проблема с решением задачи "Быстрый поезд" http://www.cyberforum.ru/cpp-beginners/thread911218.html
Здравствуйте. Проблема с решением задачи "Быстрый поезд" (компилятор в системе - VS2010). Между двумя крупнейшими городами нашей страны Санкт-Петербургом и Москвой ежедневно совершают рейсы n поездов. Для каждого поезда известно его время отправления из Санкт-Петербурга и время прибытия в Москву. Найдите самый быстрый поезд и его скорость в предположении, что длина железной дороги между...
C++ чтение из файла, где ошибка вроде все правильно... #include <iostream> #include <fstream> #include <string> #include <conio.h> using namespace std; void main() http://www.cyberforum.ru/cpp-beginners/thread911216.html
C++ Вывод содержимого при работе с файлом
Есть программа для работы с файлом. #include "stdafx.h" #include <iostream> using namespace std; struct infa { char fio; int nomer, vozrast, rost,ves;
C++ Помогите найти ошибку в приведенном листинге
#include "stdafx.h" #include <iostream> #include <fstream> #include <string> #include <conio.h> using namespace std; void main() { setlocale(0,"russian")
C++ СЛОВА (не все предложение) отобразить зеркально и записать строкой во второй файл http://www.cyberforum.ru/cpp-beginners/thread911181.html
Задача следующая: Имеется файл со строкой. Нужно СЛОВА (не все предложение) отобразить зеркально и записать строкой во второй файл. Как развернуть всю строку char (не используя файл я знаю), а как описано выше не могу придумать.
C++ В массив, упорядоченный по убыванию значений элементов, добавить новое число так, чтобы не нарушить упорядоченность Имеется задача. В массив Х(N), N≤20, упорядоченный по убыванию значений элементов, добавить новое число так, чтобы не нарушить упорядоченность. Пожалуйста помогите решить! подробнее

Показать сообщение отдельно
California7
Сообщений: n/a
24.06.2013, 23:50     Иерархические структуры. Есть программа, которая добавляет, удаляет, показывает людей, которых мы вводим. Нужно изменить ее так, чтобы она высвечивала
Иерархические структуры. Есть программа, которая добавляет, удаляет, показывает людей, которых мы вводим. Нужно изменить ее так, чтобы она высвечивала только студентов и профессоров.





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");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 17:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru