Консультация № 177656
03.04.2010, 23:18
43.65 руб.
0 1 1

Напишите, пожалуйста, программу на C++
Используя структурный тип данных, создать базу данных для обработки информации о студентах: фамилия, год рождения, факультет, группа, статус поступления.
и организовать с ней работу, включая поиск нужной информации, ее корректировку (изменение значений полей структур, дозапись информации в файл или ее удаление), вывод информации на экран.
Программа должна содержать меню, позволяющее работать с базой данных.
Если можно, то без динамических переменных.

Обсуждение

Неизвестный
06.04.2010, 23:16
общий
это ответ
Здравствуйте, sveta11115.
Тут всё довольно стандартно. Создаём структуру, отвечающую полям записи, структуры пишем в бинарный файл. С помощью fread/fwrite можно считать и записать из/в файла любой тип данных, это удобно. Перемещаться к нужной записи всегда можно через fseek. Поиск записей я сделала только по фамилии. Что такое статус поступления было не совсем ясно, я сделала это поле булевым. Пути задаются константами. Остальное должно быть ясно из комментариев, там ничего сложного.
Скомпилировано и проверено в Visual Studio 2005. Явного выделения памяти не использовала, но есть элементы stl (vector) и, разумеется, FILE* - указатель на файловую структуру.
Удачи!

Приложение:
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <iostream>
#include <vector>
#include <sys/stat.h>
using namespace std;

/*Используя структурный тип данных, создать базу данных для обработки информации о студентах:
фамилия, год рождения, факультет, группа, статус поступления.
и организовать с ней работу, включая поиск нужной информации, ее корректировку
(изменение значений полей структур, дозапись информации в файл или ее удаление), вывод информации на экран.
Программа должна содержать меню, позволяющее работать с базой данных.*/

struct Student { //структура студент
char surname [15]; //фамилия
int year; //год рождения
char faculty [4]; //факультет
int gr; //группа
bool state; //состояние
};

const char fname[] = "c:\\base.bd"; //файл бд
const char tmpname[] = "c:\\base.tmp"; //временный файл

Student InputRecord () //ввод записи
{
Student tmp;
cout << "Ввод новой записи.\n";
cout << "Введите фамилию: ";
cin >> tmp.surname;
cout << "\nВведите год рождения: ";
cin >> tmp.year;
cout << "\nВведите факультет (3 символа): ";
cin >> tmp.faculty;
cout << "\nВведите номер группы: ";
cin >> tmp.gr;
cout << "\nВведите статус поступления (1 - учится, 0 - не учится): ";
cin >> tmp.state;
return tmp;
}

void Print (Student buf) //печать записи
{
printf ("%15s %5i %4s %3i %2i\n", buf.surname, buf.year, buf.faculty, buf.gr, buf.state);
}

void InsertNewRecord (Student rec) //добавление новой записи в конец
{
FILE* bd; //файл бд
fopen_s (&bd, fname, "a+b"); //открываем для дозаписи или создания
fwrite (&rec, sizeof(Student), 1, bd); //пишем запись
fclose (bd); //закрываем файл
}

vector<int> SearchRecordIds (const char* surname) //поиск номеров записей по фамилии
{
vector<int> res; //результат
if (_access (fname, 2)==-1) return res; //проверяем существование файла
FILE* bd;
fopen_s (&bd, fname, "rb"); //открываем для чтения
Student buf;
int ind = 0; //номер записи
while (!feof (bd)) { //пока не конец файла
int size = fread (&buf, sizeof(Student), 1, bd); //считываем запись
if (size>0 && strcmp (buf.surname, surname)==0) res.push_back (ind); //если считалось и фамилии совпали, сохраняем номер
ind++; //наращиваем номер
}
fclose (bd); //закрываем файл
return res; //возвращаем массив номеров
}

bool DeleteById (int id) //удаление по номеру
{
if (_access (fname, 2)==-1) return false; //проверяем существование файла
struct _stat st;
_stat( fname, &st );
int max = st.st_size/sizeof(Student)-1;
if (id>max) return false;
FILE* bd, *tmp; //файл с бд и временный
fopen_s (&bd, fname, "rb"); //открываем для чтения
fopen_s (&tmp, tmpname, "wb"); //открываем для записи
bool del = true; //флаг удаления
vector<Student> buf (id); //буфер чтения
while (!feof (bd)) { //пока не конец файла
int size = fread (&buf[0], sizeof(Student), id, bd); //считываем записи до удаляемой
fwrite (&buf[0], sizeof(Student), size, tmp); //пишем считанное количество во временный
if (del) { fread (&buf[0], sizeof(Student), 1, bd); del = false; } //если ещё не пропустили, пропускаем удаляемый
}
fclose (bd); //закрываем файлы
fclose (tmp);
remove (fname); //удаляем исходный
rename (tmpname, fname); //переименовываем временный в исходный
return true;
}

bool ReplaceRecord (int id) //корректировка записи по номеру
{
if (_access (fname, 6)==-1) return false; //проверяем наличие доступа к файлу
struct _stat st;
_stat( fname, &st );
int max = st.st_size/sizeof(Student)-1;
if (id>max) return false;
FILE* bd;
fopen_s (&bd, fname, "r+b"); //открываем для записи и чтения
Student buf;
if (fseek (bd, id*sizeof(Student), SEEK_SET)!=0) return false; //если нет такого места в файле - выходим
fread (&buf, sizeof(Student), 1, bd); //считываем нужную запись
Print (buf); //печатаем её
fseek (bd, id*sizeof(Student), SEEK_SET); //возвращаемся к записи
buf = InputRecord (); //вводим данные
fwrite (&buf, sizeof(Student), 1, bd); //вписываем на прежнее место
fclose (bd); //закрываем файл
return true;
}

void PrintBD () //печать всего
{
if (_access (fname, 2)==-1 ) return; //проверка доступа на чтение
FILE* bd;
fopen_s (&bd, fname, "rb"); //открываем для чтения
Student buf;
cout << "\nФамилия Год Факультет Группа Состояние\n";
while (!feof(bd)) { //пока не конец файла
int size = fread (&buf, sizeof(Student), 1, bd); //считываем
if (size>0) Print (buf); //если считалось - выводим
}
fclose (bd); //закрываем файл
}

void main()
{
setlocale (LC_ALL, "russian"); //для отображения русского в консоли
int ch;
char tmp [15];
vector<int> ids;
while (true) { //бесконечный цикл
system ("cls"); //вывод меню
cout << "1. Добавление записей\n";
cout << "2. Поиск записей по фамилии\n";
cout << "3. Удаление записи по номеру\n";
cout << "4. Корректировка записи по номеру\n";
cout << "5. Вывод всех записей\n";
cout << "6. Выход\n";
cin >> ch;
if (ch==6) break; //выход
switch (ch) { //выбор пункта
case 1:
system ("cls");
InsertNewRecord (InputRecord());
cout << "\nУспешно добавлено\n";
_getch();
break;
case 2:
system ("cls");
cout << "Введите фамилию: ";
cin >> tmp;
ids = SearchRecordIds (tmp);
cout << "\nНомера записей: ";
for (size_t i=0; i<ids.size(); i++) cout << ids[i] << ", ";
_getch();
break;
case 3:
system ("cls");
cout << "Введите номер записи: ";
cin >> ch;
if (DeleteById (ch)) cout << "\nУспешно удалено";
else cout << "\nНичего не удалено";
_getch();
break;
case 4:
system ("cls");
cout << "Введите номер записи: ";
cin >> ch;
if (ReplaceRecord (ch)) cout << "\nУспешно";
else cout << "\nНеудача";
_getch();
break;
case 5:
system ("cls");
PrintBD ();
_getch();
break;
}
}
}
5
Форма ответа