Реферат: Отчет по учебной практике ОАиП база данных студентов (создание, поиск, удаление, сортировка, все, что надо написанная на С++)
Министерство Образования Республики БеларусьБелорусский Государственный Университет
Информатики и Радиоэлектроники
Кафедра ЭВМ
Отчёт по учебной практике
Выполнил : Проверил :
студент гр.050505 Калабухов Е.В.
Свентицкий С. М.
Минск
2001 г.
СОДЕРЖАНИЕ
Название программы. Поставленная задача. Функциональное предназначение программы. Описание управления, интерфейса, основных переменных и функций. Блок-схема по ЕСПД 19.003-80. Исходный код программы. Список используемой литературы
Electronic Base (Электронная база данных) v 1.666 />1. Названиепрограммы
2.Поставленная задача
Написать базу данных (БД) на языке С++ позволяющуюхранить информацию о студентах (Ф.И.О., номер группы, средний балл, уникальныйкод записи (порядковый №)). База данных должна содержать основные функции:добавление записи, удаление записи, редактирование записи, поиск и сортировкупо заданным параметрам.
3.Функциональноепредназначение программы
Данная программа представляет собойбазу данных позволяющую хранить информацию о студентах (Фамилию, Имя, Отчество,№ группы, средний балл). Программа позволяет использовать следующие возможности: создание новой БД, либо открытий уже созданной, добавление новых данных вфайл БД, удаление записей, редактирование имеющихся записей, поиск существующихзаписей по их уникальному коду, по фамилии, по имени, также предусмотренасортировка записей в файле по Ф.И.О, по уникальному коду, по номеру группы, посреднему баллу (причем в этом случае записи располагаются от максимальногосреднего балла вниз, то есть по убыванию). Каждой новой записи присваиваетсясвой индивидуальный номер (код), для упрощения ввода этот код присваиваетсяавтоматически: функций find_max_num(char *) находит максимальный номерзаписи в файле и последующий код присваивается введенной записи.Такжепредусмотрена проверка вводимых данных на идентичность, при вводе идентичныхданных пользователю будет выдано предупреждение и дана возможность ввести новыеданные. Программа eBase v1.666 использует очень удобный и понятныйинтерфейс, организована система меню и подменю, внизу окна специально созданагорячая подсказка. Так же предусмотрен так называемый скроллинг (прокрутка)выводимой информации клавишами вверх-вниз,
4. Описание управления, интерфейса, основныхпеременных и функций.
Все данные вводятся склавиатуры.
Используемые клавиши:
Enter (для выбора илиподтверждения), Esc (для отмены, выхода в предыдущее меню), стрелкивправо, влево (для перемещения по меню), вверх, вниз (для скроллингаданных).
Основные переменные:
структура записей :
typedefstruct {
int num; - уникальный № (код) записи
charlastName[16]; - фамилия студента
charfirstName[11]; - имя студента
char midName[16]; - отчество студента
chargroupNumber[6]; — № группы студента
floatmark; - средний балл учащегося
} data;
fn — имя рабочего файла;
Вызываемые функции:
voidinterface(char *) — функция основного интерфейса программы. В качестве входногопараметра принимает имя рабочего файла fn которое передается функциями voidcreate() или void open(). В этой функции реализовано весьма удобноеменю, через которое и происходит вызов последующий функция добавления,сортировки, удаления, поиска и редактирования;
voidadd(char *) — функция добавление записи в БД. Входной параметр fn имяфайла. Использует функцию int find_max_num(char *) для присваиваниявводимой записи свой уникальный номер.
voiddel(char *) — функция удаление записи из БД. Входной параметр fn имяфайла. Использует временный файл temp.$$$, в конце выполнения функциивременный файл переименовывается в файл под именем переменной fn;
voidedit(char *) — функция редактирования существующей записи. Входной параметр fnимя файла. Позволяет изменять № (код) записи, а также любую информацию записи;
voidview(char *, int ) — функция вывода данных на экран. Входной параметр fn имяфайла;
voidfind(char *) — функция поиска записи по (ее уникальному №, по Фамилии, поИмени). Входной параметр fn имя файла;
voidsort(char *) — функция сортировки записей БД по (№ записей, Ф.И.О, среднемубаллу учащихся, № группы студента). Входной параметр fn имя файла.Использует “пузырьковый” метод сортировки данных в файле.
intfind_max_num(char *) — функция поиска максимального № записи в файле БД. Входнойпараметр fn имя файла. Возвращает значение № максимальной записи в файле… для функции void add(char *);
intget_number(char *) — возвращает количество записей в файле. Входной параметр fnимя файла;
voidcreate() — создание файла БД. Идет запрос на имя файла, после этого к имени файлаавтоматически добавляется расширение “.dat” имя этого файласчитается рабочим для всей программы. При удачном создании файла его имяпередается в функцию void interface(char *) и т.д.;
voidopen() — открытие файла БД. Идет запрос на имя файла, после этого к имени файлаавтоматически добавляется расширение “.dat” имя этого файласчитается рабочим для всей программы. При удачном открытии файла его имяпередается в функцию void interface(char *) и т.д.;
intcheck(char*, data) – функция проверки при вводе информации на ее идентичность.Вызывается функциями добавления записи void add(char *) и редактированиязаписи void edit(char *). В качестве первого входного значенияиспользуется имя рабочего файла fn, в качестве второгоструктура данных типа data(описанная в разделе основные переменные). В качествевозвращаемого параметра используется переменная pr, которая можетпринимать значения 0 или 1, для определения идентичности данных;
Нестандартныеи системные средства, вроде бы, не используютсяВсе, кроме двух,аварийные ситуации, вроде бы, ликвидированы:
1) Еслидиск заполнен или защищён от записи невозможно записать информацию в файл;
2) Еслиневозможно открыть файл программа выдает сообщениеоб этом и закроется
5.Блок-схема поЕСПД 19.003-80.
voidmain()
Лист 01/> /> /> /> /> <td/> /> /> /> />/>/>/>/>/>/>/>
strcat(fn,”dat”)
нет
/>да
/>/>voidopen()void interface(char *)/> /> /> /> /> /> /> <td/> /> />
алгоритмсортировки (по № записи)
fp – указатель на файл; s1,s2 – структуры данных типа data;
oldfs,newfs – флаги (признаки),
/>6.Исходный код программы
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
#include <iostream.h>
#include <string.h>
#include <bios.h>
#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(" eBasev1.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 (counter<2) {
color[counter]=4;
color[++counter]=0;
}
break;
}
textbackground(4); cprintf(" ");
textcolor(WHITE);
textbackground(color[0]); cprintf(" Создать ");
textbackground(color[1]); cprintf(" Открыть ");
textbackground(color[2]); cprintf(" Выход ");
textbackground(4); cprintf(" ");
textbackground(1);
key=bioskey(0);
if (key == ENTER) {
switch(counter){
case0:
create();break;
case1:
open();break;
case2:
exit(10);
}
}
}
}
void interface(char *fn)
{
FILE *fp;
data st;
intnum=1,key=0,counter=0,color[]={0,4,4,4,4,4};
clrscr();
while(1) {
window(1,1,80,3);
textbackground(1); textcolor(WHITE);
_setcursortype(_NOCURSOR); textcolor(10);
cprintf("::::::::::::::::::");
textcolor(15);
cprintf(" eBasev1.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 (counter<5) {
color[counter]=4;
color[++counter]=0;
}
break;
}
textbackground(4);cprintf(" ");
textcolor(WHITE);
textbackground(color[0]);cprintf(" Добавить ");
textbackground(color[1]);cprintf(" Удалить ");
textbackground(color[2]);cprintf(" Редактировать ");
textbackground(color[3]);cprintf(" Поиск ");
textbackground(color[4]);cprintf(" Сортировка ");
textbackground(color[5]);cprintf(" Назад ");
textbackground(4);cprintf(" ");
textbackground(1);
view(fn,num);
key=bioskey(0);
switch(key)
{
case UP: num--;if(num==0)
num++;
view(fn,num);
break;
case DOWN:num++;if (num+16>=get_number(fn))
num--;
view(fn,num);
break;
}
if (key==283)
return;
if (key == ENTER)
{
switch(counter) {
case0: add(fn); clrscr(); break;
case1: del(fn); break;
case2: edit(fn); clrscr(); break;
case3: find(fn); break;
case4: sort(fn); break;
case5: 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<<«Фамилия: »; cin>>st.lastName;
gotoxy(20,8); cout<<«Имя: »; cin>>st.firstName;
gotoxy(20,10); cout<<«Отчество: »; cin>>st.midName;
gotoxy(20,12); cout<<"№ группы: "; cin>>st.groupNumber;
gotoxy(20,14); cout<<«Средний балл студента: »;
fflush(stdin);scanf("%f",&st.mark);
if (!check(fn, st)){
if ((fp =fopen(fn,«ab+»)) == NULL) {
printf(«Filecould not be opened.\n»);
return;
}
fwrite(&st,sizeof(data),1,fp);
fclose(fp);
return;
}
else {
gotoxy(20,18);
cout<<«Такая запись ужесуществует»;
getch();
}
}
}
void del(char *fn)
{
FILE *fp,*temp;
data st;
int pr=1;
int number;
gotoxy(4,25);
textcolor(11);
cprintf(«Введите № записи для удаления: „);
textcolor(YELLOW);
gotoxy(36,25);
int key = 0;
cscanf(“%d»,&number);
textcolor(WHITE);
while(kbhit())
if (!(key=getch()))
key << 8;
if( key == '\r' ) {
if((fp=fopen(fn,«rb»)) == NULL) {
cout<<«error.filedoes not exist.»;
return;
}
if((temp=fopen(«temp.$$$»,«wb»)) == NULL) {
cout<<«error.temp file couldn't be create»;
return;
}
while(fread(&st,sizeof(data),1,fp)) {
if(feof(fp))
break;
if (st.num!= number)
fwrite(&st,sizeof(data),1,temp);
else
pr=0;
}
fclose(fp);
fclose(temp);
if (remove(fn) ==-1) {
perror(«remove»);
return;
}
if(rename(«temp.$$$»,fn) == -1) {
perror(«rename»);
return;
}
if (pr) {
textcolor(11);
gotoxy(4,25);
cprintf("\r Ошибка. Нет записи стаким номером ");
getch();
textcolor(WHITE);
}
}
clrscr();
}
void edit(char *fn)
{
FILE *fp;
data st;
int pr=1;
intnumber,size=sizeof(data);
fpos_t filepos;
gotoxy(4,25);
textcolor(11);
cprintf(«Введите № записи дляредактирования : „);
textcolor(YELLOW);
gotoxy(44,25);
int key = 0;
cscanf(“%d»,&number);
textcolor(WHITE);
while( kbhit())
if( !(key =getch()))
key <<8;
if( key == '\r' )
{
if ((fp =fopen(fn,«rb+»)) == NULL)
{
printf(«Filecould not be opened.\n»);
return;
}
while(fread(&st,size,1,fp))
{
if(feof(fp))
break;
if(st.num == number)
{
fseek(fp,-1*size,1);
fgetpos(fp,&filepos);
pr=1;
break;
}
else
pr=0;
}
if (pr)
{
while(1)
{
clrscr();
_setcursortype(_SOLIDCURSOR);
gotoxy(20,6);cout<<«Фамилия: »;
cin>>st.lastName;
gotoxy(20,8);cout<<«Имя: »;
cin>>st.firstName;
gotoxy(20,10);cout<<«Отчество : »;
cin>>st.midName;
gotoxy(20,12);cout<<"№группы : ";
cin>>st.groupNumber;
gotoxy(20,14);cout<<«Средний балл студента : »;
scanf("%f",&st.mark);
if(!check(fn, st))
{
fsetpos(fp,&filepos);
fwrite(&st,sizeof(data),1,fp);
break;
}
else{
gotoxy(20,18);
cout<<«Такая запись ужесуществует»;
getch();
}
}
}
else {
textcolor(11);
gotoxy(4,25);
cprintf("\r Ошибка… Нет записи с таким номером ");
getch();
textcolor(WHITE);
}
fclose(fp);
}
}
void view(char *fn,int n)
{
void ramka();
FILE *fp;
data st;
char c;
int counter=0;
if ((fp =fopen(fn,«rb»)) == NULL) {
printf(«Filecould not be opened.\n»);
return;
}
ramka();
window(1,6,80,23);
fseek(fp,(n-1)*sizeof(data),SEEK_SET);
while (counter != 18)
{
fread(&st,sizeof(data),1,fp);
if (feof(fp))
break;
else
{
printf("%4d %-16s %-12s %-17s %8s "
"%7.2f\n",st.num,st.lastName,st.firstName,
st.midName,st.groupNumber,st.mark);
counter++;
}
}
window(1,24,80,25);
cprintf("-----------------------------------"
"---------------------------------------------");
cprintf(" %c — вверх, %c- вниз, %c — влево,"
"%c — вправо, ESC — отмена ",0x018,0x019,0x01B,0x01A);
textcolor(10); textbackground(1);cprintf("%14s",fn);
window(1,1,80,25); textcolor(15);
fclose(fp);
}
void sort(char *fn)
{
FILE *fp;
data s1,s2;
intnum=1,size=sizeof(data),counter=0,key=0;
intoldfs,newfs,color[]={0,4,4,4,4};
while(1)
{
_setcursortype(_NOCURSOR); textcolor(10);
cprintf("::::::::::::::::::::::::: М ен ю с о р т и р о в к и "
":::::::::::::::::::::::::");
switch(key)
{
case LEFT:if (counter>0) {
color[counter]=4;
color[--counter]=0;
}
break;
case RIGHT:if (counter<4) {
color[counter]=4;
color[++counter]=0;
}
break;
}
textbackground(4);cprintf(" "); textcolor(WHITE);
textbackground(color[0]);cprintf(" по № записи ");
textbackground(color[1]);cprintf(" по Ф.И.О ");
textbackground(color[2]);cprintf(" по № группы ");
textbackground(color[3]);cprintf(" по ср.балу ");
textbackground(color[4]);cprintf(" Назад ");
textbackground(4);cprintf(" "); textbackground(1);
view(fn,num);
key=bioskey(0);
switch(key)
{
case UP: num--;if(num==0)
num=1;
view(fn,num);break;
case DOWN:num++;if (num+16>=get_number(fn))
num--;
view(fn,num);break;
}
if (key==283)
return;
if (key == ENTER)
{
if((fp=fopen(fn,«rb+»)) == NULL)
{
cout<<«error.filedoes not exist.»;
return;
}
switch(counter) {
case 1: /*-----------поФ.И.О--------------------*/
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.lastName,s2.lastName) > 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 < s2.mark) {
fseek(fp,-2*size,1);
fwrite(&s2,size,1,fp);
fwrite(&s1,size,1,fp);
newfs=1;
}
else
s1=s2;
}break;
case 4:
fclose(fp);
return;
}
fclose(fp);
}
}
}
void find(char *fn)
{
void ramka();
FILE* fp;
data st;
char string[15];
int pr,prs;
int key=0,counter=0;
int color[]={0,4,4,4};
while (1) {
clrscr();textcolor(10);
cprintf("::::::::::::::::::::::::::::: М е н ю П о и с к а "
":::::::::::::::::::::::::::::");
textcolor(WHITE);
textbackground(4);
cprintf(" ");
switch(key)
{
case LEFT:if (counter>0) {
color[counter]=4;
color[--counter]=0;
}break;
case RIGHT:if (counter<3) {
color[counter]=4;
color[++counter]=0;
}break;
}
textbackground(color[0]); cprintf(" по № записи ");
textbackground(color[1]); cprintf(" по Фамилии ");
textbackground(color[2]); cprintf(" по Имени ");
textbackground(color[3]); cprintf(" Отмена ");
textbackground(4);
cprintf(" ");
textbackground(1);
key=bioskey(0);
if (key==283)
return;
if (key == ENTER)
{
if((fp=fopen(fn,«rb»))==NULL){
puts(«Filecouldn't be open»);
return;
}
switch(counter)
{
case 0:
intnumber;
pr=0;
prs=1;
cout<<«ВВЕДИТЕ НОМЕР ЗАПИСИ:»;
fflush(stdin);
scanf("%d",&number);
rewind(fp);
while(fread(&st,sizeof(data),1,fp)){
if(feof(fp)) {
break;
}
if(st.num== number) {
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<<"\nЗАПИСИ С ТАКИМ НОМЕРОМ НЕСУЩЕСТВУЕТ";
}
getch();
break;
case 1:
prs=1;
pr=0;
cout<<«ВВЕДИТЕ ФАМИЛИЮ:»;
fflush(stdin);
cin>>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<<"\nНЕТ ДАННЫХ";
}
getch();
break;
case 2:
prs=1;
pr=0;
cout<<«ВВЕДИТЕ ИМЯ: »;
fflush(stdin);
cin>>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){
cout<<"\nНЕТ ДАННЫХ";
}
getch();
break;
case 3:
fclose(fp);
return;
}
fclose(fp);
}
}
}
void ramka()
{
window(1,3,80,6);
cprintf("------------------------------------"
"--------------------------------------------");
textcolor(14);
cprintf("%5s %-16s %-12s %-17s %-8s %12s ",
"№",«Фамилия»,«Имя»,«Отчество»,"№группы",«Ср.балл»);
textcolor(WHITE);
cprintf("------------------------------------"
"--------------------------------------------");
window(1,1,80,25);
}
int find_max_num(char *fn)
{
FILE *fp;
data st;
int max;
if ((fp =fopen(fn,«rb»)) == NULL) {
printf(«Filecould not be opened.\n»);
return -1;
}
max=0;
while(fread(&st,sizeof(data),1,fp)) {
if (feof(fp))
break;
if (st.num>max)
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(«Filecould 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<<«Введите имя новой БД:»;
fflush(stdin);
cin>>fn;
strcat(fn,".dat");
if((fp=fopen(fn,«wb»)) == NULL) {
cout<<«Ошибка… Файл не можетбыть создан\n»;
getch();
exit(10);
}
fclose(fp);
interface(fn);
}
void open()
{
FILE *fp;
char *fn;
cout<<«Введите имя БД:»;
fflush(stdin);
cin>>fn;
strcat(fn,".dat");
if(!(fp=fopen(fn,«rb»))) {
cout<<«Ошибка… Файл не можетбыть открыт\n»;
getch();
exit(10);
}
fclose(fp);
interface(fn);
}
int check(char *fn, data st)
{
FILE *fp;
data temp;
int pr=0;
if ((fp =fopen(fn,«rb»)) == NULL) {
printf(«Filecould not be opened.\n»);
return 0;
}
while ( fread( &temp,sizeof( data ), 1, fp)) {
if (feof(fp))
break;
if(!strcmp(st.lastName,temp.lastName)
&&!strcmp(st.firstName,temp.firstName)
&&!strcmp(st.midName,temp.midName)
&&!strcmp(st.groupNumber,temp.groupNumber)
&& (st.mark== temp.mark)) {
pr=1;
break;
}
} fclose(fp);
return pr;
}
СПИСОКЛИТЕРАТУРЫХарви Дейтел, Пол Дейтел “Как программировать на Си” Е. М. Демидович “Основы алгоритмизации и программирования”, Минск 1999 г. Керниган Б., Ритчи Д. “Язык программирования Си”, Финансы и статистика, 1992 г.