Министерство Образования Республики Беларусь
Белорусский Государственный Университет
Информатики и Радиоэлектроники
Кафедра ЭВМ
Отчёт по учебной практике
Выполнил :
Проверил :
студент гр.050505
Калабухов Е.В.
Свентицкий С. М.
Минск
2001 г.
СОДЕРЖАНИЕ
Название программы.
Поставленная задача.
Функциональное предназначение программы.
Описание управления, интерфейса, основных переменных и функций.
Блок-схема по ЕСПД 19.003-80.
Исходный код программы.
Список используемой литературы
1. Название программы2. Поставленная задача
Написать базу данных (БД) на языке С++ позволяющую хранить информацию о
студентах (Ф.И.О., номер группы, средний балл, уникальный код записи
(порядковый №)). База данных должна содержать основные функции :
добавление записи, удаление записи, редактирование записи, поиск и
сортировку по заданным параметрам.
3. Функциональное предназначение программы
Данная программа представляет собой базу данных позволяющую хранить
информацию о студентах (Фамилию, Имя, Отчество, № группы, средний балл).
Программа позволяет использовать следующие возможности : создание новой
БД, либо открытий уже созданной, добавление новых данных в файл БД,
удаление записей, редактирование имеющихся записей, поиск существующих
записей по их уникальному коду, по фамилии, по имени, также
предусмотрена сортировка записей в файле по Ф.И.О, по уникальному коду,
по номеру группы, по среднему баллу (причем в этом случае записи
располагаются от максимального среднего балла вниз, то есть по
убыванию). Каждой новой записи присваивается свой индивидуальный номер
(код), для упрощения ввода этот код присваивается автоматически :
функций find_max_num(char *) находит максимальный номер записи в файле и
последующий код присваивается введенной записи .Также предусмотрена
проверка вводимых данных на идентичность , при вводе идентичных данных
пользователю будет выдано предупреждение и дана возможность ввести новые
данные . Программа eBase v1.666 использует очень удобный и понятный
интерфейс, организована система меню и подменю, внизу окна специально
создана горячая подсказка. Так же предусмотрен так называемый скроллинг
(прокрутка) выводимой информации клавишами вверх-вниз,
4. Описание управления, интерфейса, основных переменных и функций.
Все данные вводятся с клавиатуры.
Используемые клавиши:
Enter (для выбора или подтверждения), Esc (для отмены, выхода в
предыдущее меню), стрелки вправо, влево (для перемещения по меню),
вверх, вниз (для скроллинга данных).
Основные переменные:
структура записей :
typedef struct {
int num; – уникальный № (код) записи
char lastName[16]; – фамилия студента
char firstName[11]; – имя студента
char midName[16]; – отчество студента
char groupNumber[6]; – № группы студента
float mark; – средний балл учащегося
} data;
fn – имя рабочего файла;
Вызываемые функции:
void interface(char *) – функция основного интерфейса программы. В
качестве входного параметра принимает имя рабочего файла fn которое
передается функциями void create() или void open(). В этой функции
реализовано весьма удобное меню, через которое и происходит вызов
последующий функция добавления, сортировки, удаления, поиска и
редактирования;
void add(char *) – функция добавление записи в БД. Входной параметр fn
имя файла. Использует функцию int find_max_num(char *) для присваивания
вводимой записи свой уникальный номер.
void del(char *) – функция удаление записи из БД. Входной параметр fn
имя файла. Использует временный файл temp.$$$, в конце выполнения
функции временный файл переименовывается в файл под именем переменной
fn;
void edit(char *) – функция редактирования существующей записи. Входной
параметр fn имя файла. Позволяет изменять № (код) записи, а также любую
информацию записи;
void view(char *, int ) – функция вывода данных на экран. Входной
параметр fn имя файла;
void find(char *) – функция поиска записи по (ее уникальному №,по
Фамилии, по Имени). Входной параметр fn имя файла;
void sort(char *) – функция сортировки записей БД по (№ записей, Ф.И.О,
среднему баллу учащихся, № группы студента). Входной параметр fn имя
файла. Использует “пузырьковый” метод сортировки данных в файле.
int find_max_num(char *) – функция поиска максимального № записи в
файле БД. Входной параметр fn имя файла. Возвращает значение №
максимальной записи в файле … для функции void add(char *);
int get_number(char *) – возвращает количество записей в файле. Входной
параметр fn имя файла;
void create() – создание файла БД. Идет запрос на имя файла , после
этого к имени файла автоматически добавляется расширение “.dat” имя
этого файла считается рабочим для всей программы. При удачном создании
файла его имя передается в функцию void interface(char *) и т.д.;
void open() – открытие файла БД. Идет запрос на имя файла , после этого
к имени файла автоматически добавляется расширение “.dat” имя этого
файла считается рабочим для всей программы. При удачном открытии файла
его имя передается в функцию void interface(char *) и т.д.;
int check(char *, data) – функция проверки при вводе информации на ее
идентичность. Вызывается функциями добавления записи void add(char *) и
редактирования записи void edit(char *). В качестве первого входного
значения используется имя рабочего файла fn , в качестве второго
структура данных типа data (описанная в разделе основные переменные). В
качестве возвращаемого параметра используется переменная pr, которая
может принимать значения 0 или 1, для определения идентичности данных;
Нестандартные и системные средства, вроде бы, не используются
Все, кроме двух, аварийные ситуации, вроде бы, ликвидированы:
1) Если диск заполнен или защищён от записи невозможно записать
информацию в файл;
2) Если невозможно открыть файл программа выдает сообщение об этом и
закроется
5.Блок-схема по ЕСПД 19.003-80.
void main()
Лист 01
void open() void interface(char *)
алгоритм сортировки (по № записи)
fp – указатель на файл; s1,s2 – структуры данных типа data;
oldfs,newfs – флаги (признаки),
6. Исходный код программы
#include
#include
#include
#include
#include
#include
#include
#define ENTER 7181
#define ESC 283
#define LEFT 19200
#define RIGHT 19712
#define UP 18432
#define DOWN 20480
typedef struct {
int num;
char lastName[16];
char firstName[11];
char midName[16];
char groupNumber[6];
float mark;
} data;
void interface(char *);
void add(char *);
void del(char *);
void edit(char *);
void view(char *, int );
void find(char *);
void sort(char *);
int find_max_num(char *);
int get_number(char *);
void create();
void open();
int check(char *, data);
void main()
{
int key=0,counter=0;
int color[]={0,4,4};
while (1) {
textbackground(1); textcolor(WHITE);
clrscr(); _setcursortype(_NOCURSOR); textcolor(10);
cprintf(“::::::::::::::::::”);
textcolor(15);
cprintf(” eBase v1.666 Copyright (C) Serj Sventitski “);
textcolor(10);
cprintf(“::::::::::::::::::”);
switch(key) {
case LEFT: if (counter>0) {
color[counter]=4;
color[–counter]=0;
}
break;
case RIGHT: if (counter0) {
color[counter]=4;
color[–counter]=0;
}
break;
case RIGHT: if (counter=get_number(fn))
num–;
view(fn,num);
break;
}
if (key==283)
return;
if (key == ENTER)
{
switch(counter) {
case 0: add(fn); clrscr(); break;
case 1: del(fn); break;
case 2: edit(fn); clrscr(); break;
case 3: find(fn); break;
case 4: sort(fn); break;
case 5: return;
}
}
}
}
void add(char *fn)
{
FILE *fp;
data st;
int pr;
while (1) {
st.num=find_max_num(fn)+1;
clrscr();
_setcursortype(_SOLIDCURSOR);
gotoxy(20,6); cout>st.lastName;
gotoxy(20,8); cout>st.firstName;
gotoxy(20,10); cout>st.midName;
gotoxy(20,12); cout>st.groupNumber;
gotoxy(20,14); cout>st.lastName;
gotoxy(20,8);cout>st.firstName;
gotoxy(20,10);cout>st.midName;
gotoxy(20,12);cout>st.groupNumber;
gotoxy(20,14);cout0) {
color[counter]=4;
color[–counter]=0;
}
break;
case RIGHT: if (counter=get_number(fn))
num–;
view(fn,num); break;
}
if (key==283)
return;
if (key == ENTER)
{
if ((fp=fopen(fn,”rb+”)) == NULL)
{
cout 0) {
fseek(fp,-2*size,1);
fwrite(&s2,size,1,fp);
fwrite(&s1,size,1,fp);
newfs=1;
}
if (strcmp(s1.lastName,s2.lastName) == 0)
if (strcmp(s1.firstName,s2.firstName) > 0) {
fseek(fp,-2*size,1);
fwrite(&s2,size,1,fp);
fwrite(&s1,size,1,fp);
newfs=1;
}
if (strcmp(s1.firstName,s2.firstName) == 0)
if (strcmp(s1.midName,s2.midName) > 0) {
fseek(fp,-2*size,1);
fwrite(&s2,size,1,fp);
fwrite(&s1,size,1,fp);
newfs=1;
}
else
s1=s2;
else
s1=s2;
}
break;
case 0: /*————ПО НОМЕРУ ЗАПИСИ———–*/
oldfs=1; newfs=0;
fread(&s1,size,1,fp);
while(oldfs) {
fread(&s2,size,1,fp);
if(feof(fp)) {
if(!newfs)
break;
oldfs=1; newfs=0;
rewind(fp);
fread(&s1,size,1,fp);
continue;
}
if (s1.num > s2.num) {
fseek(fp,-2*size,1);
fwrite(&s2,size,1,fp);
fwrite(&s1,size,1,fp);
newfs=1;
}
else
s1=s2;
}
break;
case 2: /*———-ПО НОМЕРУ ГРУППЫ—————*/
oldfs=1; newfs=0;
fread(&s1,size,1,fp);
while(oldfs) {
fread(&s2,size,1,fp);
if(feof(fp)) {
if(!newfs)
break;
oldfs=1; newfs=0;
rewind(fp);
fread(&s1,size,1,fp);
continue;
}
if (strcmp(s1.groupNumber,s2.groupNumber) > 0) {
fseek(fp,-2*size,1);
fwrite(&s2,size,1,fp);
fwrite(&s1,size,1,fp);
newfs=1;
}
else
s1=s2;
}
break;
case 3: /*———ПО СР.БАЛУ—————-*/
oldfs=1; newfs=0;
fread(&s1,size,1,fp);
while(oldfs) {
fread(&s2,size,1,fp);
if(feof(fp)) {
if(!newfs)
break;
oldfs=1; newfs=0;
rewind(fp);
fread(&s1,size,1,fp);
continue;
}
if (s1.mark 0) {
color[counter]=4;
color[–counter]=0;
} break;
case RIGHT: if (counter>string;
rewind(fp);
while(fread(&st,sizeof(data),1,fp)) {
if (feof(fp))
break;
if(!strcmp(st.lastName,string)) {
if (prs) {
ramka();
gotoxy(1,6);
prs=0;
}
printf(” %4d %-16s %-12s %-17s %8s ”
“%7.2f\n”,st.num,st.lastName,st.firstName,
st.midName,st.groupNumber,st.mark);
pr=1;
}
}
if(!pr) {
cout>string;
rewind(fp);
while(fread(&st,sizeof(data),1,fp)) {
if (feof(fp))
break;
if(!strcmp(st.firstName,string)) {
if (prs) {
ramka();
gotoxy(1,6);
prs=0;
}
printf(” %4d %-16s %-12s %-17s %8s ”
“%7.2f\n”,st.num,st.lastName,st.firstName,
st.midName,st.groupNumber,st.mark);
pr=1;
}
}
if(!pr) {
coutmax)
max=st.num;
}
fclose(fp);
return max;
}
int get_number(char *fn)
{
FILE *fp;
int fd,n=0;
if ((fp = fopen(fn,”rb”)) == NULL)
{
printf(“File could not be opened.\n”);
return -1;
}
fd=fileno(fp);
n=filelength(fd)/sizeof(data);
fclose(fp);
return n;
}
void create()
{
FILE *fp;
char *fn;
cout>fn;
strcat(fn,”.dat”);
if ((fp=fopen(fn,”wb”)) == NULL) {
cout>fn;
strcat(fn,”.dat”);
if (!(fp=fopen(fn,”rb”))) {
coutСПИСОК ЛИТЕРАТУРЫ Харви Дейтел, Пол Дейтел “Как программировать на Си” Е. М. Демидович “Основы алгоритмизации и программирования”, Минск 1999 г. Керниган Б., Ритчи Д. “Язык программирования Си”, Финансы и статистика, 1992 г. PAGE PAGE 2 open() Меню выбора create() Начало Конец Конец Начало Electronic Base (Электронная база данных) v 1.666 fn strcat(fn,”dat”) interface(fn) fopen да нет Меню выбора Начало edit(fn) add(fn) del(fn) view(fn,num) find(fn) sort(fn) 01 Начало Конец oldfs=1; newfs=0; да да нет нет да s1=s2 oldfs=1; newfs=0; newfs=1;
Нашли опечатку? Выделите и нажмите CTRL+Enter