Консультация № 180470
27.10.2010, 19:04
0.00 руб.
0 1 1
Нужно сделать простенькую базу данных:
1) C помошью массива
2) C помощью списков
которая содержит информацию:фамилию,имя,отчество, год рождения и функции :удаление любой записи, добавление записи в любое место, поиск , сохранение.
Поиск по дате рождения. Пример: 1500 по 1600 - программа должна выводить всех из этого промежутка.
Среда: RAD Studio C++ Builder 2009;

Обсуждение

Неизвестный
02.11.2010, 14:19
общий
это ответ
Здравствуйте, SunnyPlanet!
Вот пример решения с использованием stl-списков. Builder под рукой нет, проверялось под Visual Studio 2005, компиляцией не должно, по идее, возникнуть особых проблем.
Если Вам не подходит решение с stl, Вы можете по аналогии, заменив list<Person>, например, на массив или список, написанный вручную - принцип работы с самой базой данных останется таким же.
Всё должно быть ясно из комментариев, будут вопросы - задавайте.
Удачи!

Приложение:

#include <conio.h>
#include <string>
#include <list>
#include <iostream>
using namespace std;

struct Person { //структура записи бд
string name; //имя
string surname; //фамилия
int year; //год
int key; //ключ
void Print () { cout << key << ": " << name << " " << surname << " - " << year << endl; }
};

void ReadBD (char* bdfilename, list<Person> &bd, int &maxkey)
{ //читать бд из файла
FILE* bdfile = fopen (bdfilename, "rb");
maxkey = -1; //текущий максимальный ключ
if (bdfile==NULL) return;
Person buf;
while (fread (&buf, sizeof(Person), 1, bdfile)!=0) { //пока читается
if (buf.key>maxkey) maxkey = buf.key;
bd.push_back (buf); //добавляем в список
}
fclose (bdfile);
}

void SaveBD (char* bdfilename, list<Person> bd)
{ //сохранение бд в файл
FILE* bdfile = fopen (bdfilename, "wb");
if (bdfile==NULL) return;
while (bd.size()!=0) { //пока не кончится список
fwrite (&bd.front(), sizeof(Person), 1, bdfile);
bd.pop_front();
}
fclose (bdfile);
}

void SearchByInterval (int year1, int year2, list<Person> bd)
{ ///поиск по интервалу лет
for (list<Person>::iterator it = bd.begin(); it!=bd.end(); it++) { //по итератору от начала списка до конца
if ((*it).year>=year1 && (*it).year<=year2) (*it).Print(); //печать подходящих
}
}

void AddRecord (list<Person> &bd, int &maxkey)
{//добавление новой записи
Person buf; //новая запись
cout << "Enter name:";
cin >> buf.name;
cout << "Enter surname:";
cin >> buf.surname;
cout << "Enter birth year:";
cin >> buf.year;
buf.key = ++maxkey; //ключ - следующий от текущего максимального
bd.push_back(buf); //добавляем в список
}

void DeleteByKey (list<Person> &bd)
{ //удаление по ключу
cout << "Enter key: ";
int key;
cin >> key;
for (list<Person>::iterator it = bd.begin(); it!=bd.end(); it++) {
if ((*it).key == key) {
(*it).Print(); //выводим удаляемый
cout << "Deleted" << endl;
bd.erase(it); //удаляем
break;
}
}

}

void PrintBD (list<Person> &bd) //печать всего списка
{
for (list<Person>::iterator it = bd.begin(); it!=bd.end(); it++)
(*it).Print();
}

int ShowMenu () //вывод меню
{
system ("cls"); //очистка экрана
cout << "Menu:\n1. Add record.\n2. Delete record by key.\n";
cout << "3. Print all records.\n4.Print by year interval.\n5. Exit.\n";
cout << "Enter item number: ";
int ch; //выбор пункта
cin >> ch;
return ch;
}

int _tmain(int argc, _TCHAR* argv[])
{
list<Person> bd; //список
char bdfilename [] = "C:\\bd.bdf"; //файл бд
int maxkey, ch;
ReadBD (bdfilename, bd, maxkey); //читаем существующую
while (true) {
ch = ShowMenu (); //вывод меню
system ("cls");
switch (ch) { //действия соответственно пунктам меню
case 1:
AddRecord (bd, maxkey);
cout << "\nOk, press any key";
_getch();
break;
case 2:
DeleteByKey (bd);
cout << "\nOk, press any key";
_getch();
break;
case 3:
PrintBD (bd);
cout << "\nOk, press any key";
_getch();
break;
case 4:
int year1, year2;
cout << "Enter interval: ";
cin >> year1;
cin >> year2;
SearchByInterval (year1, year2, bd);
cout << "\nOk, press any key";
_getch();
break;
case 5: //перед выходом сохраняем
SaveBD (bdfilename, bd);
return 0;
}
}
return 0;
}

Форма ответа