Отчет по учебной практике ОАиП база данных студентов (создание, поиск, удаление, сортировка, все, что надо написанная на С++)

Отчет по учебной практике ОАиП база данных студентов (создание, поиск, удаление, сортировка, все, что надо написанная на С++)

| |

| |

|Министерство Образования Республики Беларусь |

| |

|Белорусский Государственный Университет |

|Информатики и Радиоэлектроники |

| |

| |

| |

| |

| |

|Кафедра ЭВМ |

| |

| |

| |

| |

| |

| |

| |

| |

| |

| |

|Отчёт по учебной практике |

| |

| |

| |

| |

| |

|Выполнил : |

|Проверил : |

|студент гр.050505 |

|Калабухов Е.В. |

|Свентицкий С. М. |

| |

| |

| |

| |

| |

| |

| |

| |

| |

|Минск |

|2001 г. |

СОДЕРЖАНИЕ

1. Название программы.

2. Поставленная задача.

3. Функциональное предназначение программы.

4. Описание управления, интерфейса, основных переменных и функций.

5. Блок-схема по ЕСПД 19.003-80.

6. Исходный код программы.

7. Список используемой литературы

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 < 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>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<<"Ошибка...Файл не может быть открыт\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("File could 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;

}

СПИСОК ЛИТЕРАТУРЫ

1. Харви Дейтел, Пол Дейтел “Как программировать на Си”

2. Е. М. Демидович “Основы алгоритмизации и программирования”, Минск 1999

г.

3. Керниган Б., Ритчи Д. “Язык программирования Си”, Финансы и

статистика, 1992 г.

-----------------------

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;