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

Структура Human (хранение, сортировка) - C++

Восстановить пароль Регистрация
 
BonaBerry
 Аватар для BonaBerry
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
30.06.2014, 23:40     Структура Human (хранение, сортировка) #1
Привет!
Сам текст задания звучит так:
Реализовать структуру Human, которая должна содержать следующие данные о человеке: возраст, пол, имя, …
Пользователь должен иметь возможность:
А) формировать любое количество “людей” в программе
Б) подсчитывать количество людей, возраст которых лежит в заданном диапазоне
В) сохранять данные в файле
Г) считывать данные из файла
Д) сортировать записи согласно заданному критерию


Не получается реализовать переменную enum и соответственно плывет ввод, вывод, не реализовать сортировки.
Прошу помощи и тыкнуть где не верно.

Это Хедер
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
enum SEX {MALE,FEMALE};
struct HUMAN
{
    SEX sex;
    //char sex [8];
    char name [15];
    int age;
};
 
void PrintHuman (const HUMAN * men);
 
enum sortType {sex,name,age};
/*******************************************************/
 
struct CARTA
{
HUMAN **men;
 
int Used;
int Free;
};
 
void printhuman(const CARTA * men_carta);  // на вввод
void PrintHumamChoice(const CARTA * men_carta, int Option, int Low, int Hight);
void AddMen(CARTA * men_cart, int intAddMen);  
void DelMen(CARTA *men_carta, int number);
 
void SaveCart (CARTA *men_carta,const char FILENAME[]);
void ReadCart (CARTA *men_carta, const char FILENAME[]);
void DeleteCart(CARTA *men_carta);
void SortCart (CARTA *men_carta, int);
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
#include "human.h"
#include <cmath>
#include <string.h>
#include <cstdio>
 
 
void PrintHuman (const HUMAN * men)
 
{
printf("\n Пол человека : %s", ((men->sex==MALE)?"male":"female"));
printf("\n Имя : %s", men->name);
printf("\n Возраст %d", men->age);
}
 
/****************************************/
 
 
void printhuman(const CARTA * men_carta)
    {
        for (int i=0;  i< men_carta -> Used + men_carta->Free; i++)
            
            if (men_carta->men[i] !=0)
            {
               printf("\n--------%d--------", i);
               PrintHuman(men_carta->men[i]);
              
            }
        printf("\n");
    }
 
 
 
void PrintHumamChoice(const CARTA * men_carta, int Option, int Low, int Hight)
{ 
    for (int i=0; i < men_carta->Used + men_carta->Free; i++)
        {  
        if (men_carta->men[i] != 0)
         
        {
             if (Option = 1)                                                                  // если выводим результат с выборкой по полу
                {
                    //if (men_carta->men[i]->sex==male || men_carta->men[i]->sex==female) 
                    {
                     printf("\n-------------------%d------------------", i);
                     PrintHuman (men_carta->men[i]);
                    }
                }
             if (Option = 2)  
                  // если выводим результат с выборкой по возрасту человека
               {       
                      
                   if (men_carta->men[i]->age >= Low && men_carta->men[i]->age <= Hight)     // выводим то что уклыдывается в заданный диапазон возраста
                    {
                     printf("\n-------------------%d------------------", i);
                     int acount=acount+i;
                    
                    }  
                 }              
            
        } 
printf("\n");
    }
}
 
/*****************************************************/
void AddMen(CARTA *men_carta, int intAddMen)
{
        men_carta->men[intAddMen] = new HUMAN; 
        men_carta->Used = men_carta->Used+1;
        if (men_carta->Free != 0) men_carta->Free = men_carta->Free-1; // "if" - чтобы не получить отрицательного значения
 
}
/*****************************************************/
 
void DelMen(CARTA *men_carta, int number)
{ 
     int intDelMen =-1;
     int i=0;
     do
        {
            if (men_carta->men[i] != 0)
            {intDelMen++;}
            i++;
        }
     while (intDelMen < number);
     delete men_carta->men[intDelMen];
     men_carta->men[intDelMen] = 0;
     men_carta->Used = men_carta->Used - 1;
     men_carta->Free = men_carta->Free + 1;
}
/*************************************************/
void FPrintMen (HUMAN * men, FILE * pFile)
{
    fprintf(pFile,"%s\n", ((men->sex==MALE) ? "male":"female"));               //((men->sex==MALE) ? "male":"female"));
    fprintf(pFile,"%s\n", men->name);
    fprintf(pFile,"%d\n", men->age); 
}
/**************************************************/
 
void SaveCart(CARTA *men_carta,const char FILENAME[])
{
FILE * pFile;
pFile = fopen (FILENAME,"w");
fprintf(pFile, "Total: %d\n", men_carta->Used);
    int intSaveCART = 0;
    for (int i=0; i < men_carta->Used + men_carta->Free; i++)
    {  
        if (men_carta->men[i] != 0)
            {
             fprintf(pFile, "---------------------------------------%d\n", intSaveCART);
             FPrintMen (men_carta->men[i], pFile);
             intSaveCART++;
        }
    }
 fclose (pFile);
}
/****************************************************/
void DeleteCart(CARTA *men_carta)
{
for (int i=0; i < men_carta->Used+men_carta->Free; i++)                // удаляем в памяти все существующие заполненные и свободные записи..
    {
     delete[] men_carta->men[i];
    }
delete[] men_carta->men;                                                  // ..и массив
men_carta->men = 0;
}
/****************************************************/
void ReadCart (CARTA *men_carta, const char FILENAME[])
{
FILE * pFile;
pFile = fopen ("men_carta.txt","r");                     // открываем каталог для чтения
int n;
if(pFile)
    {
    fscanf (pFile, "Total: %d", &n);           // считываем из файла количество записей в нём
    printf ("\nПрочитано %d записей.\n", n);                                        
    if (n > 0)
       {
        DeleteCart;   // удаляем старый каталог..
        HUMAN ** tmp = new HUMAN*[n];          // и создаём новый.
        men_carta->Used = 0;
        men_carta->Free = 0; 
        men_carta->men = tmp;
        do
            {   
            men_carta->men[men_carta->Used] = new HUMAN;                        // создаём экземпляры .
            fscanf (pFile, "%s");                                                   // и заполняем их.
            fscanf (pFile, "%d", &men_carta->men[men_carta->Used]->sex);
            fscanf (pFile, "%s", &men_carta->men[men_carta->Used]->name);
            fscanf (pFile, "%d", &men_carta->men[men_carta->Used]->age);
            men_carta->Used = men_carta->Used +1;
            }
        while (men_carta->Used < n);
        }
    }
}
/****************************************************/
void SortCart(CARTA *men_carta, int sortType)
{
    for(int i=1; i<men_carta->Used+men_carta->Free; i++)
        for(int j=men_carta->Used+men_carta->Free-1; j>=i; j--)
        {   double res;
            HUMAN * pCurrent = men_carta->men[j];
            HUMAN * pPrevious = men_carta->men[j-1];
            if (pPrevious != 0 && pCurrent != 0) 
            {
            switch (sortType)
               {
                  case 0: res = pPrevious->sex- pCurrent->sex; break;
                  case 1: res = strcmp (pPrevious->name,pCurrent->name); break;
                  case 2: res = pPrevious->age- pCurrent->age; break;
               }
            }
            else 
                if (pPrevious == 0)  { res = 1; }
                else res = 0;
 
            if (res > 0)
            {
                HUMAN * tmp =men_carta->men[j-1];
                men_carta->men[j-1] = men_carta->men[j];
                men_carta->men[j] = tmp;
            }
        }
}
Out.cpp
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
#include "human.h"
#include <cstdio>
#include <tchar.h>
#include <iostream>
#include <clocale>              
 
#define   stop __asm nop    
 
void main()
{
setlocale(LC_CTYPE, "Russian"); 
 
 
 
CARTA men_carta;                                // Ноая запись в карте 
 
    men_carta.men = new HUMAN*[1];              // В карте есть место на запись 
    men_carta.men[0]=0;                         
    men_carta.Used=0;                           // Всё занято
    men_carta.Free=0;                           // Есть свободное место 
 
    char FILENAME[] ="men_carta.txt"; 
 
 
int choice;                                    // Меню 
 
do
    {
         printf("\n-------------------- МЕНЮ HUMAN--------------------\n");
         printf("(1) Распечатать содержимое карты полностью\n");
         printf("(2) Распечатать содержимое карты по полу, по возрасту и подчитать количество людей \n");
         printf("(3) Ввести новые данные \n");
         printf("(4) Удалить данные \n");
         printf("(5) Записать текущее содержимое карты в файл\n");
         printf("(6) Считать из файла содержимое в карту\n");
         printf("(7) Сортировка карты - по полу, имени и возрасту\n");
         printf("(8) Выход \n");
         printf("\nВыберите желаемое действие : ");
         scanf ("%d", &choice);
         fflush(stdin);
    
if (choice > 0 && choice < 8)     // выбор пользователя
            {
            switch (choice)
               {
            case 1: printhuman(&men_carta); break; // печать содержимого каталога полностью
            case 2: // печать содержимого каталога выборочно
                         {
                             printf("\n");
                             int Option=-1;                      
                             while (Option < 1 || Option > 2)    
                             {
                              printf("Выберите параметр выборочной печати : \n");
                              printf("(1) По полу\n");
                              printf("(2) По возрасту\n");
                              scanf ("%d", &Option);
                              fflush(stdin);
                              switch (Option)
                                     {
                                      case 1:
                                             {
 
                                                    // if ((men->sex==male) ? "male":"female");
                                                 
                                                 /* enum sex {male, female};*/
                                                       break; 
                                             }
                                    
                                      case 2:
                                            {                             
                                               {
                                              int Low=-1., High=-1.;
                                              printf("Укажите диапазон возраста\n");
                                              while (Low< 0)    
                                                    {
                                                        printf("От : ");
                                                        scanf ("%lf", &Low);
                                                        fflush(stdin);
                                                    }
                                              while (High < Low)    
                                                    {
                                                        printf("До : ");
                                                        scanf ("%lf", &High);
                                                        fflush(stdin);
                                                     }
                                              PrintHumamChoice(&men_carta, Option, Low, High); 
                                              
                                              break; 
                                             }
                                         }
                                    }
                         
                              break;
                             }
 
                         }
                         case 3: // добавляем новую запись
                         {
                          int intAddMen = men_carta.Used;                                    // Пока считаем что все места заняты и инициализируем последним значением очереди,
                          
                          if (men_carta.Free != 0)                                           // .. но если есть свободные места..
                             {                                                                  
                              for (int i = 0; i < men_carta.Used +men_carta.Free; i++)    // .. то ищем где свободно..
                                  {
                                   if (men_carta.men[i] == 0)                                // .. и когда нашли..
                                      { 
                                       intAddMen = i;                                           // .. то запоминаем где свободное место.
                                       break;
                                      }
                                  }
                             }
                          AddMen(&men_carta, intAddMen);                                     // добавляем новый экземпляр  
 
                          printf("\n Пол человека 0-male, 1-female : ");        // заполняем новый экземпляр
                         
                         // ((men->sex==male) ? "male":"female")); 
                          scanf ("%d", men_carta.men[intAddMen]->sex);
                          fflush(stdin);
                          printf("Имя : ");
                          scanf ("%14s", men_carta.men[intAddMen]->name);
                          fflush(stdin);
 
                          int vozrast = 0;
                          do
                            {
                             printf("Vozrast: ");
                             scanf ("%3d", &vozrast);
                            }
                          while (vozrast > 150 || vozrast < 0);
                          fflush(stdin);
                          men_carta.men[intAddMen]->age = vozrast;
                          break; 
                         }
            case 4: // удаляем существующую запись
                         {
                          int number;
                          printf("\nВведите номер записи, которую хотите удалить: \n");
                          scanf ("%d", &number);
                          if (number > men_carta.Used || number < 0)
                             {
                              printf("Такой записи не существует в каталоге\n");
                              break;
                             }
                          DelMen(&men_carta, number); break; 
                         } 
             case 5: SaveCart(&men_carta, FILENAME); break; // запись каталога в файл
             case 6: ReadCart(&men_carta, FILENAME); break; // чтение из файла
             case 7: // сортировка
                         {
                          int sortType;
                          do {
                              printf("\nВведите параметр сортировки:");
                              printf("\n 0- По полу; 1- Имени; 2- Возрасту;");
                              scanf ("%d", &sortType);
                             }
                          while (sortType < 0 || sortType >2);
                          SortCart(&men_carta, sortType); 
                          break; 
                             }
               }
            }
         else break;
        }
     while (choice > 0 && choice < 8);
stop
DeleteCart(&men_carta); // удаляем каталог, освобождаем память, обнуляем указатели.
return;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2014, 23:40     Структура Human (хранение, сортировка)
Посмотрите здесь:

C++ Запись и чтение из файла. Структура. Сортировка
C++ Прокомментируйте мне каждую строчку программы. Структура, сортировка, массив, вывод
Структура о веществе и сортировка C++
C++ Помощь по задаче(структура, двойная сортировка)
Написать программу, работающую с массивом струтур human C++
C++ Класс human. Ссылка на неразрешенный внешний символ
Найти ошибку в Class Human C++
Написать код программы для реализации класса human C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
01.07.2014, 07:26     Структура Human (хранение, сортировка) #2
Цитата Сообщение от BonaBerry Посмотреть сообщение
enum sortType {sex,name,age};
вот здесь, имена специально совпадают со структурой HUMAN ?
BonaBerry
 Аватар для BonaBerry
3 / 3 / 0
Регистрация: 21.09.2013
Сообщений: 73
01.07.2014, 09:26  [ТС]     Структура Human (хранение, сортировка) #3
Цитата Сообщение от ValeryS Посмотреть сообщение
вот здесь, имена специально совпадают со структурой HUMAN ?
блин!
Yandex
Объявления
01.07.2014, 09:26     Структура Human (хранение, сортировка)
Ответ Создать тему
Опции темы

Текущее время: 10:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru