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

База данных - C++

Восстановить пароль Регистрация
 
pusser
 Аватар для pusser
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 77
24.12.2010, 23:11     База данных #1
Здравствуйте уважаемы товарищи программисты! не могли бы помочь найти ошибку! задание такое надо как бы создать базу данных! Записи о знаках зодиака людей. Каждая запись характеризуется фамилией, именем отчества человека, его знаком зодиака, датой его рождения.
Каждая запись представляется собой экземпляр структуры.
Все записи хранятся в массиве. Функциональность программы должна включать:
• Добавление записи, введенной с клавиатуры
• Удаление указанной записи
• Поиск записей по некоторому критерию
• Сортировку записей
• Печать всех записей
вот код
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
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
//Подключаем заголовочный файл для работы со стандартными потоками cin и cout
#include <iostream>
//Подключаем заголовочный файл для работы с потоковыми манипуляторами 
#include <iomanip>
//Подключаем заголовчный файл для работы с потоковыми файловыми классами
#include <fstream>
//Подключаем заголовочный файл для работы со строками
#include <string.h>
using namespace std;
 
// Константы
const int MAX_NAME_LENGTH = 100; //Максимальная длина фамилии, имени, отчества
const int MAX_HUMAN_COUNT = 1000; //Максимальное количество людей в массиве
const char* FILE_NAME = "human.txt"; //Имя файла для хранения записей о людях
//Заголовочная константная строка, используемая при выводе записей
const char* HEADER = "Index       Surname          Name    Znak zodiaka  Birth date  ";
//Разделительная линия
const char* SEPARATING_LINE = "-------------------------------------------------------------------------------";
 
//Перечисление, описывающее знаки зодиака
// eNone - знак зодиака не указан;
// Aries - Овен,
// Taurus - телец,
// Gemini - близнецы,
// еCancer - рак,
// Lion - лев,
// Virgo - дева,
// Libra - весы,
// Scorpio - скорпион,
// Archer - стрелец,
// Capricorn - козерог,
// Aquarius - водолей,
// Pisces - рыбы.
enum eZodiac {zoNone, Aries, Taurus, Gemini, Cancer, Lion, Virgo, Libra, Scorpio, Archer, Capricorn, Aquarius, Pisces};
 
//Стуктура, описывающая дату
struct Date
{
    unsigned short int Day;   //День
    unsigned short int Month; //Месяц
    unsigned short int Year;  //Год
};
 
//Структура, описывающая запись о человеке
struct People
{
    char Surname[MAX_NAME_LENGTH + 1];    //Фамилия
    char Name[MAX_NAME_LENGTH + 1];       //Имя
    char Patronymic[MAX_NAME_LENGTH + 1]; //Отчество
    Date DateOfBirth;      //Дата рождения
    eZodiac ZnakZodiaka; //Знак зодиака
    
};
 
//Вспомогательная функция, осуществляющая преобразование 
//знака зодиака, содержашегося в параметре Type в строку Str,
//т.е. в название знака зодиака, представленное в виде строки
void eZodiacToStr(eZodiac Type, char Str[])
{
    setlocale (LC_ALL, "Rus");
    //В зависимости от значения Type
    switch (Type)   
    {
        case Aries:
            strcpy(Str, "Овен"); //Копируем в Str название знака зодиака "Овен"
            break;
        case Taurus:
            strcpy(Str, "Телец");  //Копируем в Str название знака зодиака "Телец"
            break;
        case Gemini:
            strcpy(Str, "Близнецы"); //Копируем в Str название знака зодиака "Близнецы"
            break;
        case Cancer:
            strcpy(Str, "Рак");
            break;
        case Lion:
            strcpy(Str, "Лев");
            break;
        case Virgo:
            strcpy(Str, "Дева");
            break;
        case Libra:
            strcpy(Str, "Весы");
            break;
        case Scorpio:
            strcpy(Str, "Скорпион");
            break;
        case Archer:
            strcpy(Str, "Стрелец");
            break;
        case Capricorn:
            strcpy(Str, "Козерог");
            break;
        case Aquarius:
            strcpy(Str, "Водолей");
            break;
        case Pisces:
            strcpy(Str, "Рыбы");
            break;
        default:
            strcpy(Str, "Неизвестно"); //Случай, когда задан тип zoNone
    }
}
 
//Вспомогательная функция, которая по названию знака зодиака, содержащемся в строке Str,
//возвращает его тип
eZodiac StrToeZodiac(char Str[])
{
    setlocale (LC_ALL, "Rus");
    //Переводим строку Str к нижнему регистру
    strlwr(Str);
    //Если строка Str равна "Овен", то возвращаем Aries
    if (!strcmp(Str, "Овен")) 
        return Aries;
    //Если строка Str равна "Телец", то возвращаем Taurus
    if (!strcmp(Str, "Телец"))
        return Taurus;
    //Если строка Str равна "Близнецы", то возвращаем Gemini
    if (!strcmp(Str, "Близнецы"))
        return Gemini;
    //
    if (!strcmp(Str, "Рак"))
        return Cancer;
    //
    if (!strcmp(Str, "Лев"))
        return Lion;
    //
    if (!strcmp(Str, "Дева"))
        return Virgo;
    //
    if (!strcmp(Str, "Весы"))
        return Libra;
    //
    if (!strcmp(Str, "Скорпион"))
        return Scorpio;
    //
    if (!strcmp(Str, "Стрелец"))
        return Archer;
    //
    if (!strcmp(Str, "Козерог"))
        return Capricorn;
    //
    if (!strcmp(Str, "Водолей"))
        return Aquarius;
    //
    if (!strcmp(Str, "Рыбы"))
        return Pisces;
    //Если в строке недопустимое название вида спорта, то возвращаем zoNone
    return zoNone;
}
 
//Функция, осуществляющая ввод записи о человеке с консоли.
//Введенная запись возвращается в параметре Hum, передаваемом по ссылке
void InputPeople(People& Hum)
{
    setlocale (LC_ALL, "Rus");
    
 
    char Buf[MAX_NAME_LENGTH]; //Вспомогательная строка для ввода данных
    bool IsValidZnakZodiaka; //Логическая переменная, определяющая правильно ли введен вид спорта
 
    //Читаем символ перевода строки
    cin.get();
 
    cout << endl;
    cout << "Введите информацию о человеке:" << endl;
    //Вводим фамилию
    cout << "Фамилия    : ";        
    cin.getline(Hum.Surname, sizeof Hum.Surname);
    //Вводим имя
    cout << "Имя       : "; 
    cin.getline(Hum.Name, sizeof Hum.Name);
    //Вводим отчество
    cout << "Отчество : ";
    cin.getline(Hum.Patronymic, sizeof Hum.Patronymic);
    //Вводим год рождения
    cout << "Дата рождения : ";
    cin >> Hum.DateOfBirth.Year;
    //Вводим месяц рождения. 
    
    cout << "Месяц рождения (1-12) : ";
    cin >> Hum.DateOfBirth.Month;
    //Вводим день рождения
    
    cout << "День рождения (1-31) : ";
    cin >> Hum.DateOfBirth.Day;
 
    
 
    //Читаем символ перевода строки
    cin.get();
    //Цикл с постусловием для повторного ввода строки знака зодиака,
    //если она отличная от  Овен, телец, близнецы, рак, лев, дева, весы, скорпион, стрелец, козерог, водолей, рыбы.
    do
    {
        //Полагаем, что знак зодиака правильный
        IsValidZnakZodiaka = true;      
        cout << "Введите знак зодиака (Овен, телец, близнецы, рак, лев, дева, весы, скорпион, стрелец, козерог, водолей, рыбы): ";
        //Читаем в Buf строку знака зодиака
        cin.getline(Buf, sizeof Buf);   
        //Преобразовывем введенную строку в переменную типа eZodiac
        Hum.ZnakZodiaka = StrToeZodiac(Buf);
        //Если была введена недопустимая строка
        if (Hum.ZnakZodiaka == zoNone)
        {
            //Выдаем сообщение, что строка неправильная
            cout << endl << "Ошибка!Введите (Овен, телец, близнецы, рак, лев, дева, весы, скорпион, стрелец, козерог, водолей, рыбы)" << endl << endl;
            //Устанавливаем значение лжи для флага правильности строки знака зодиака
            IsValidZnakZodiaka = false;
        }
        //Цикл повторяется до тех пор, пока введенная строка знака зодиака не будет правильной
    } while (!IsValidZnakZodiaka);
    
}
 
//Функция вывода на консоль полей записи (структуры) Hum, имеющей индекс Index
void PrintPeople(People Hum, int Index)
{
    
 
    char Buf[MAX_NAME_LENGTH]; //Строковая переменная для строкового представления знака зодиака
 
    //Выводим индекс в поле максимальной ширины 5
    cout << setw(5) << Index << " ";
    //Выводим фамилию, имя, отчество. Каждое в своем поле максимальной ширины 13
    cout << setw(13) <<  Hum.Surname << " " << setw(13) << Hum.Name << " "<< setw(13) << Hum.Patronymic << " ";
    //Меняем символ-заполнитель с пробела на 0. Использование заполнителя 0 позволит выдавать даты в формате ДД.ММ.ГГГГ
    cout << setfill('0');
    //Выдаем день, месяц и год даты рождение. Каждая компонента даты выводися в своем поле
    cout << setw(2) << Hum.DateOfBirth.Day << "." << setw(2) << Hum.DateOfBirth.Month << "." << setw(4) << Hum.DateOfBirth.Year << " ";
    //Возвращаем пробел в качестве символа-заполнителя
    cout << setfill(' ');
    //Осуществляем перевод знака зодиака в строку Buf
    eZodiacToStr(Hum.ZnakZodiaka, Buf);
    //Выводим строку знака зодиака
    cout << setw(6) << Buf << endl;
}
 
//Функция, добавляющая запись о человеке Hum в конец массива людей PeopleArray, 
//PeopleCount - количество записей-элементов в массиве PeopleArray
void AddPeople(People PeopleArray[], int& PeopleCount, People Hum)
{
    PeopleArray[PeopleCount++] = Hum;
}
 
//Функция, удаляющая в массиве PeopleArray запись-элемент с индексом RemovingIndex,
//PeopleCount - количество записей-элементов в массиве PeopleArray.
//Функция возвращает истину, если RemovingIndex лежит в допустимом диапазоне от 0 до PeopleCount-1,
//иначе функция возвращает ложь
bool RemovePeople(People PeopleArray[], int& PeopleCount, int RemovingIndex)
{
    //Если индекс удаляемого элемента задан неправильно, то возвращаем ложь
    if (RemovingIndex < 0 || RemovingIndex >= PeopleCount)
    {
        return false;
    }
    //Данный цикл осуществляет сдвиг элементов 
    // PeopleArray[RemovingIndex], PeopleArray[RemovingIndex], ..., PeopleArray[PeopleCount - 1]
    //на один элемент влево и тем самым затирает удаляемый элемент
    for (int i = RemovingIndex; i < PeopleCount - 1; i++)
    {
        PeopleArray[i] = PeopleArray[i + 1];
    }
    //Уменьшаем количество элементов-записей на 1
    PeopleCount--;
    //Возвращаем истину
    return true;
}
 
//Функция, осуществляющая поиск и вывод на консоль элементов-записей о людях массива PeopleArray,
//фамилия которых совпадает со строкой KeySurname (ключом для поиска).
//PeopleCount - количество записей-элементов в массиве PeopleArray.
void SearchAndPrintPeople(People PeopleArray[], int PeopleCount, char KeySurname[])
{
    setlocale (LC_ALL, "Rus");
    //Переменная для подсчета количества найденных записей, вначале равна 0
    int FoundRecordsCount = 0;
    cout << endl;   
    //Выводим заголовок
    cout << SEPARATING_LINE << endl;
    cout << HEADER << endl;
    cout << SEPARATING_LINE << endl;
    //Пробегаемся по все элементам массива PeopleArray
    for (int i = 0; i < PeopleCount; i++)
    {
        //Если фамилия очередного элемента-записи совпадает с KeySurname, то
        if (!strcmp(PeopleArray[i].Surname, KeySurname))
        {   
            //выводим сам элемент
            PrintPeople(PeopleArray[i], i);     
            //выводим разделительную линию
            cout << SEPARATING_LINE << endl;
            //Увеличиваем на 1 количество найденных записей
            FoundRecordsCount++;
        }
    }
    //Выводим количество найденных записей
    cout<< "Найдено " << FoundRecordsCount << " записей." << endl;
}
 
//Функция, осуществляющая сортировку массива людей по не возрастанию фамилий.
//PeopleArray - массив элементов-записей о людях;
//PeopleCount - количество человек-записей в массиве.
void Sort(People PeopleArray[], int PeopleCount)
{
    int MaxIndex;
    People Tmp;
 
    for (int i = 0; i < PeopleCount - 1; i++)
    {
        MaxIndex = i;       
        for (int j = i + 1; j < PeopleCount; j++)
        {
            if (PeopleArray[j].Surname > PeopleArray[MaxIndex].Surname)
            {
                MaxIndex = j;
            }
        }
        Tmp = PeopleArray[i];
        PeopleArray[i] = PeopleArray[MaxIndex];
        PeopleArray[MaxIndex] = Tmp;
    }
}
 
//Функция, осуществляющая вывод на консоль всех элеменов-записей о людях,
//содержащихся в массиве PeopleArray размера PeopleCount
void PrintAllPeople(People PeopleArray[], int PeopleCount)
{   
    cout << endl;
    //Выводим заголовок
    cout << SEPARATING_LINE << endl;
    cout << HEADER << endl;
    cout << SEPARATING_LINE << endl;
    //Пробегаемя по всем элементам
    for (int i = 0; i < PeopleCount; i++)
    {       
        //Выводим очердной элемент-запись
        PrintPeople(PeopleArray[i], i);     
        //Выводим разделительную линию
        cout << SEPARATING_LINE << endl;
    }
}
 
//Функция, осуществляющая чтение массива PeopleArray и его размера PeopleCount
//из бинарного файла с именем PeopleCount
void LoadFromFile(People PeopleArray[], int& PeopleCount, const char* FileName)
{
    //Объявлем файловый поток ввода inp, передаем ему имя открываемого файла FileName
    ifstream inp(FileName);
    //Читаем из файла количество элементов в массиве
    inp >> PeopleCount;
    //Читаем из файла целиком весь массив
    inp.read((char *)PeopleArray, PeopleCount * sizeof(PeopleArray[0]));    
}
 
//Фуникция, осуществляющая сохранение массива PeopleArray и его размера PeopleCount
//в бинарный файл FileName
void SaveToFile(People PeopleArray[], int PeopleCount, const char* FileName)
{
    //Объявляем файловый поток вывода out, передаем ему имя открываемого файла FileName
    ofstream out(FileName);
    //Записываем в файл количество людей
    out << PeopleCount;
    //Записываем в файл весь массив целиком
    out.write((char *)PeopleArray, PeopleCount * sizeof(PeopleArray[0]));
}
 
//Функция, реализующая главное меню программы. В зависимости от выбора пользователя, 
//осуществляет вызов соответствующих функций.
//Параметры:
//PeopleArray - массив элементов-записей о людях;
//PeopleCount - количество элементов в массиве.
void MainMenu(People PeopleArray[], int& PeopleCount)
{
    setlocale (LC_ALL, "Rus");
    //Переменная, которая будет хранить номер выбранного пользователем пункта меню
    int UserChoise; 
    //Переменная-запись о людях
    People Hum;
    //Переменная для хранения индекса удаляемого элемента
    int RemovingIndex;
    //Массив символов для хранения строки фамилии для поиска
    char KeySurname[MAX_NAME_LENGTH];
    //Цикл с постусловием, осуществляющий вывод меню, ввод выбора пользователя и
    //выполнение соответстующих этому выбору действий до тех пор, пока пользователь
    //не выберет выход из программы
    do 
    {
        //Отображаем меню
        cout << endl;
        cout << "          Меню" << endl;
        cout << "=========================" << endl;
        cout << " [1] Добавить человека" << endl;
        cout << " [2] Удалить человека" << endl;
        cout << " [3] Найти человека" << endl;
        cout << " [4] Сортировка людей" << endl;
        cout << " [5] Показать всех людей" << endl;
        cout << " [6] Выход" << endl;
        cout << "=========================" << endl;
        cout << "Ваш выбор : ";
        //Вводим выбранный пользователем пункт меню
        cin >> UserChoise;
 
        //С помощью конструкции выбора анализируем этот выбор
        //и осуществляем соответствующие действия
        switch (UserChoise)
        {
            //Добавление новой записи о человеке в массив
            case 1: 
                InputPeople(Hum);
                AddPeople(PeopleArray, PeopleCount, Hum);
                break;
            //Удаление записи о человеке с указанным индексом из массива
            case 2:
                cout << endl << "Введите индекс удаляемого человека : ";
                //Вводим индекс удаляемого элемента-записи
                cin >> RemovingIndex;
                //Удаляем элемент. Если результат удаления ложь, то
                if (!RemovePeople(PeopleArray, PeopleCount, RemovingIndex))
                {
                    //Выдаем ошибку
                    cout << endl << "Ошибочный индекс! Попробуйте снова." << endl;
                }
                break;
            //Поиск всех записей о людях, имеющих указанную фамилию
            case 3:
                cout << endl << "Введите фамилию : ";
                //Вводим символ перевода строки
                cin.get();
                //Вводим фамилию для поиска 
                cin.getline(KeySurname, sizeof KeySurname);             
                //Вызываем функцию поиска и вывода найденных элементов
                SearchAndPrintPeople(PeopleArray, PeopleCount, KeySurname);
                break;
            //Сортировка всех записей о людях в порядке не возрастания 
            //фамилий
            case 4:
                Sort(PeopleArray, PeopleCount);
                break;
            //Печать всех записей 
            case 5:
                PrintAllPeople(PeopleArray, PeopleCount);
                break;
            //Выход
            case 6:
                cout << "Пока..." << endl;
                break;
            //Ошибка, пользователь выбрал несуществующий пункт меню
            default:
                cout << endl << "Неправильный выбор! Попробуйте снова." << endl;
        }
        //цикл выполняется до тех пор, пока пользователь не выберет выход
    } while (UserChoise != 6);
}
 
int main()
{
    //Описание массива записей (структур) о людях
    People PeopleArray[MAX_HUMAN_COUNT];
    //Переменная для хранения количества записей в массиве
    int PeopleCount = 0;
 
    //Загружаем все записи из файла
    LoadFromFile(PeopleArray, PeopleCount, FILE_NAME);
    //Выдаем меню и осуществляем операции
    MainMenu(PeopleArray, PeopleCount); 
    //Перед выходом из программы сохраняем все записи в файл
    SaveToFile(PeopleArray, PeopleCount, FILE_NAME);
    return 0;
}
не получается записать человека в базу! не хочет записывать знак зодиака

Добавлено через 59 минут
Ну гляньте кто нить плиз!! Пытаешься записать знак зодиака пишет ошибка! мозг уже не варит не пойму что не так!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2010, 23:11     База данных
Посмотрите здесь:

база данных C++
C++ База данных
C++ Использование псевдопеременных: bd (3,5) = s, где bd - база данных, s - элемент базы данных, тогда с 3 по 5 элементы базы данных заменить на элемент s.
база данных С++ C++
C++ Удалённая база данных - запрос и вывод данных
C++ База данных
база данных C++
База данных C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
besstiaa
 Аватар для besstiaa
93 / 93 / 7
Регистрация: 04.06.2010
Сообщений: 223
24.12.2010, 23:56     База данных #2
Дело в кодировке. В отладчике сами посмотрите, что у вас хранится в Str.
Yandex
Объявления
24.12.2010, 23:56     База данных
Ответ Создать тему
Опции темы

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