Отчёт по курсовой работе по дисциплине программирование на языке высокого уровня Выполнил (подпись) Студент группы повт-23

Вид материалаКурсовая

Содержание


1 Постановка задачи
1.2 Способы решения
2 Решение задачи
2.2 Структура данных
3 Описание ПО
3.2 Входные и выходные данные
3.4 Модульная структура ПО
3.5 Состав ПО
Список использованных источников Егорова Е.В, «Информатика. Часть 2», - Барнаул: АлтГТУ, 1999 Приложение A: текст программы .
Приложение Б: План тестирования
Приложение В: Руководство системного программиста
Приложение Г: Руководство пользователя
Подобный материал:




Министерство Образования Российской Федерации

Алтайский Государственный Политехнический университет


“Автоматизированная система ведения списка студентов и списка курсов”

Отчёт по курсовой работе по дисциплине программирование на языке высокого уровня


Выполнил (подпись) ________________ Студент группы ПОВТ-23

Зверев Владимир Александрович

Руководитель (подпись) _____________ Преподаватель кафедры

Прикладной Математики Е. В. Егорова


Работа защищена

с оценкой: __________

подпись: ___________

число: _____________


Г. Барнаул 2003 г.

Аннотация



Курсовая работа состоит в создании баз данных по студентам и курсам обучения и их связи с целью получения опыта создания программного продукта на языке высокого уровня.

В результате курсовой работы была разработана программа, помощью которой можно создавать и редактировать файлы, содержащие записи по студентам и курсам обучения. Программа разработана на языке C++. Она имеет низкие системные требования и удобный интерфейс.


При изучении предмета разработки была использована литература по языку программирования C++ и другая литература по программированию на языках высокого уровня.

Содержание


Аннотация 2

Содержание 3

Введение 4

1 Постановка задачи 5

1.1Словесная постановка 5

1.2 Способы решения 5

2 Решение задачи 6

2.1 Алгоритм решения 6

2.2 Структура данных 7

3 Описание ПО 8

3.1 Общий подход к реализации программы 8

3.2 Входные и выходные данные 8

3.3 Алгоритм 9

3.4 Модульная структура ПО 9

3.5 Состав ПО 9

11

Список использованных источников 11

Приложение A: текст программы . 12

Приложение В: Руководство системного программиста 25

Приложение Г: Руководство пользователя 26

Введение


Программа является упрощенным примером реальных программных продуктов, связанных с ведением база данных. Разработанная программа для удобства использования обладает согласно заданию следующими возможностями: добавление, удаление и корректировка записей в базах данных.

Так же 2 базы данных связаны между собой.

Реализация такой программы значительно увеличивает опыт в создании программных продуктов, углубляет знания курса программирования, дает практику их применения, позволяет наработать концепцию подхода к созданию программных продуктов удобного пользовательского интерфейса.

1 Постановка задачи

    1. Словесная постановка


Программа должна выполнять следующие действия с базами данных:
  • Добавление записей
  • Удаление записей
  • Корректировка записей
  • Поиск записи по ФИО студента(база данных "студенты") или по названию курса(база данных "курсы")

Кроме того программа должна давать возможность просмотра и связи 2-х баз данных.

1.2 Способы решения


Способ решения – написание программы с использованием пакета программирования C++ и операционной системы MS-DOS.

Возможны решения данной задачи и на других пакетах разработки программных продуктов, также и для иных операционных систем. Однако, данная операционная система MS-DOS поддерживается в том или ином виде практически всеми современными операционными системы. Выбор пакета разработки обусловлен заданием и проходимыми в течении курса языками программирования высокого уровня, а также накопленными знаниями.

2 Решение задачи

2.1 Алгоритм решения

2.2 Структура данных


Программа использует 2 файла.

Первый содержит записи по студентам:
  • ФИО студента
  • Факультет и специальность
  • Курс, на котором учится студент
  • Количество курсов, которые прошел студент
  • Код курса и оценка на этом курсе

Второй содержит записи по курсам:
  • Название курса
  • ФИО преподавателя
  • Код этого курса
  • Номер семестра, на котором происходит обучение


Файлы stud.dat и kurs.dat находятся в том же каталоге, что и программа.


3 Описание ПО

3.1 Общий подход к реализации программы


Данный программный продукт имеет модульную структуру. Программа разбита на отдельные подпрограммы, каждая из которых имеет свою задачу. Программа написана на языке программирования C++. Программа протестирована и работает с большинством DOS-совместимыми системами. Не было замечено недостатков в работе программы под Windows.

3.2 Входные и выходные данные


Программа имеет несколько видов входных данных.
  • Режим работы, для выбора которого используется клавиши: Enter, ,.
  • Данные по студентам и курсам обучения, хранящиеся в файлах stud.dat и kurs.dat.

Выходными данными являются таблицы данных на экране .

3.3 Алгоритм


Программа предоставляет пользователю удобный интерфейс. Пользователь выбирает действие:
  • Добавление записи
  • Удаление записи
  • Корректировка записи
  • Поиск записи
  • Сменить базу данных
  • Выход

3.4 Модульная структура ПО


В программе реализованы подпрограммы (процедуры и функции), облегчающие понимание кода программы, ее отладку, уменьшающие размер исходного кода, существенно снижающие сложность программы.

3.5 Состав ПО


Программа написана с использованием ряда нестандартных процедур. Все не стандартные подпрограммы подписаны в самом тексте программы.

Основные процедуры и функции:

long findbyname(char *str, long offset)

str-строка для поиска

offset-положение в файле, с которого нужно производить поиск

Функция ищет в файле запись (в зависимости от текущего режима работы – по ФИО студента или названию курса) начиная с положения offset.

Возвращаемое значение – положение найденной записи или –1, если запись не найдена.

void view()

Подпрограмма выводит на экран записи из файла начиная с записи k(глобальная переменная). Количество выводимых записей определяется глобальным параметром rec_on_screen

void add()

Подпрограмма считывает с клавиатуры данные по одной записи и добавляет ее в конец файла.


void del()

Подпрограмма запрашивает ФИО студента или название курса, записи которого надо удалить(в зависимости от режима работы) затем с помощью подпрограмма findbyname находятся все записи и пользователь должен дать подтверждение на удаление.

void correct()

Подпрограмма запрашивает ФИО студента или название курса, поля записи которого надо корректировать(в зависимости от режима работы) затем с помощью подпрограмма findbyname находится запись и пользователю предлагается выбрать поле для редактирования с помощью клавиш Enter, ,

Затем необходимо ввести новое значение поля.

Возврат в главное меню – клавиша ESC

void check()

Подпрограмма проверяет наличие файлов “stud.dat” и “kurs.dat” в катоалоге с программой. Если какой-либо файл не найден то он создается.

void main()

Подпрограмма, в которой выбирается нужное действие(в виде меню) и вызываются подпрограммы, необходимые для выполнения этого действия.


Заключение
В процессе написания курсовой были изучены средства разработки программного обеспечения Borland C++. В рамках этого проекта были изучены методы разбиения программы на процедуры и функции, работа в текстовом режиме, работа с файлами.

Разработанная программа протестирована. Тестирование показало, что программа надежно выполняет все предложенные в задании функции.



























Список использованных источников

  • Егорова Е.В, «Информатика. Часть 2», - Барнаул: АлтГТУ, 1999

Приложение A: текст программы .


#include

#include

#include

#include

#include

#include

#include


#define MaxPr 10 //максимальное количество курсов

#define stud_on_screen 3 //максимальное количество записей студентов на экране

#define kurs_on_screen 5 //максимальное количество записей курсов на экране

int rec_on_screen=stud_on_screen;//максимальное количество текущих записей на экране

enum {students=0,kursy=1} workwith=students;//с какой базой данных работаем?

struct

{

char fio[20];//ФИО студента

char fak[20];//Факультет

int kurs;//курс, на котором учится студент

int nkursov;//количество курсов, которые он прошел

struct {

int kurscode,//код курса

mark;//оценка на этом курсе

} predm[MaxPr];//данные по курсам

} stud;

struct

{

char nazv[20];//название курса

char fioprep[20];//ФИО преподавателя

int code;//код курса

int nsem;//номер семестра, на котором происходит обучение

} kurs;

int k=0;//начальная запись для вывода на экран

int nstr=0;//выбранный пункт меню


//подпрограмма поиска записи по ФИО или названию курса

long findbyname(char *str,//строка для поиска

long offset/*положение в файле, с которого нужно производить поиск*/)

{

long foffset=-1;

if (workwith==students)//для студентов

{

int f=open("stud.dat",O_RDONLY | O_BINARY);

lseek(f,offset,SEEK_SET);

if (!eof(f))

{

do

{

read(f,&stud,sizeof(stud));

} while (!eof(f) && strcmp(str,stud.fio)!=0);

if (strcmp(str,stud.fio)==0)

{

clrscr();

printf("Найден студент:\n");

printf("ФИО: %s\n",stud.fio);

printf("Факультет и специальность: %s\n",stud.fak);

printf("Курс на котором учится студент: %i\n",stud.kurs);

printf("Количество пройденных курсов: %i\n",stud.nkursov);

int fk=open("kurs.dat",O_RDONLY | O_BINARY);

for (int i=0;i
{

lseek(fk,0,SEEK_SET);

do

{

read(fk,&kurs,sizeof(kurs));

} while (!eof(fk) && kurs.code!=stud.predm[i].kurscode);

if (kurs.code==stud.predm[i].kurscode) printf("Курс и оценка: %s-%i\n",kurs.nazv,stud.predm[i].mark);

else printf("%i-Неверный код курса\n",stud.predm[i].kurscode);

}

close(fk);

foffset=tell(f)-sizeof(stud);

}

}

close(f);

}

if (workwith==kursy)//для курсов

{

int f=open("kurs.dat",O_RDONLY | O_BINARY);

lseek(f,offset,SEEK_SET);

if (!eof(f))

{

do

{

read(f,&kurs,sizeof(kurs));

} while (!eof(f) && strcmp(kurs.nazv,str)!=0);

if (strcmp(kurs.nazv,str)==0)

{

printf("Найден курс:\n\n");

printf("Название: %s\n",kurs.nazv);

printf("Код: %i\n",kurs.code);

printf("№ семестра: %i\n",kurs.nsem);

printf("ФИО препода: %s\n",kurs.fioprep);

foffset=tell(f)-sizeof(kurs);

}

}

close(f);

}

//возвратить положение найденной записи в файле или -1 если запись не найдена

return foffset;

}


//подпрограмма вывода на экран записей

void view()

{

clrscr();

gotoxy(1,49);

printf("Стрелки вверх/вниз-выбор пункта меню Enter-выбор,PgUp\PgDown-просмотр записей\n");

if (workwith==students)//для студентов

{

gotoxy(1,8);

printf("Список студентов\n");

int f=open("stud.dat",O_RDONLY | O_BINARY);

int rn=0;

if (f!=-1 && filelength(f)>0)

{

if (k>=filelength(f)/sizeof(stud)) k=rec_on_screen*((filelength(f)/sizeof(stud)-1)/rec_on_screen);

if (k<0) k=0;

lseek(f,k*sizeof(stud),SEEK_SET);

printf("------------------------------------------------------------------------\n");

printf("|%20s|%20s|%4s|%23s|\n","ФИО","Факультет","Курс","Кол-во изученных курсов");

printf("------------------------------------------------------------------------\n");

while (!eof(f) && read(f,&stud,sizeof(stud))>0 && rn
{

rn++;

printf("|%20s|%20s|%4i|%23i|\n",stud.fio,stud.fak,stud.kurs,stud.nkursov);

printf("|Курсы: ");

int fk=open("kurs.dat",O_RDONLY | O_BINARY);

for (int i=0;i
{

lseek(fk,0,SEEK_SET);

do

{

read(fk,&kurs,sizeof(kurs));

} while (!eof(fk) && kurs.code!=stud.predm[i].kurscode);

if (kurs.code==stud.predm[i].kurscode) printf("%s-%i;",kurs.nazv,stud.predm[i].mark);

else printf("%i-Неверный код;",stud.predm[i].kurscode);

}

close(fk);

gotoxy(72,wherey());

printf("|\n------------------------------------------------------------------------\n");

}

}

close(f);

}

if (workwith==kursy)//для курсов

{

gotoxy(1,8);

printf("Список курсов\n");

int f=open("kurs.dat",O_RDONLY | O_BINARY);

int rn=0;

if (f!=-1 && filelength(f)>0)

{

if (k>=filelength(f)/sizeof(kurs)) k=rec_on_screen*((filelength(f)/sizeof(kurs)-1)/rec_on_screen);

if (k<0) k=0;

lseek(f,k*sizeof(kurs),SEEK_SET);

printf("---------------------------------------------------------\n");

printf("|%20s|%3s|%9s|%20s|\n","Название","Код","№Семестра","Фио препода");

printf("---------------------------------------------------------\n");

while (!eof(f) && read(f,&kurs,sizeof(kurs))>0 && rn
{

rn++;

printf("|%20s|%3i|%9i|%20s|\n",kurs.nazv,kurs.code,kurs.nsem,kurs.fioprep);

printf("---------------------------------------------------------\n");

}

}

close(f);

}

}


//подпрограмма добавления записи в конец файла

void add()

{

clrscr();

fflush(stdin);

if (workwith==students)//для студентов

{

printf("Ввод записи студента.\n\nВведите ФИО: ");

gets(stud.fio);

printf("Введите факультет и специальность: ");

gets(stud.fak);

printf("Введите на каком курсе учится студент: ");

scanf("%i",&stud.kurs);

printf("Введите количество пройденных курсов: ");

scanf("%i",&stud.nkursov);

printf("Введите код курса и оценку через пробел(%i раз): ",stud.nkursov);

for (int i=0;i
scanf("%i %i",&stud.predm[i].kurscode,&stud.predm[i].mark);

int f=open("stud.dat",O_WRONLY | O_BINARY | O_CREAT | O_APPEND,S_IWRITE | S_IREAD);

write(f,&stud,sizeof(stud));

close(f);

}

if (workwith==kursy)//для курсов

{

printf("Ввод записи курса.\n\nНазвание курса: ");

gets(kurs.nazv);

printf("Введите код курса: ");

scanf("%i",&kurs.code);

printf("Введите номер семестра: ");

scanf("%i",&kurs.nsem);

fflush(stdin);

printf("Введите ФИО препода: ");

gets(kurs.fioprep);

int f=open("kurs.dat",O_WRONLY | O_BINARY | O_CREAT | O_APPEND,S_IWRITE | S_IREAD);

write(f,&kurs,sizeof(kurs));

close(f);

}

clrscr();

}


//подпрограмма удаления записей из файла

void del()

{

clrscr();

if (workwith==students)//для студентов

{

int f=open("stud.dat",O_RDWR | O_BINARY,S_IWRITE | S_IREAD);

if (f!=-1)

{

printf("Удаление записи.\n\nВведите ФИО: ");

char fio[30];

gets(fio);

int finded=0,deleted=0;

char yesno='n';

long off=0;

while ((off=findbyname(fio,off))!=-1)

{

printf("\nУдалить?(y,n)\n");

finded++;

while ((yesno=getch())!='y' && yesno!='n');

if (yesno=='y')

{

if (filelength(f)-off-sizeof(stud)>0)

{

lseek(f,off+sizeof(stud),SEEK_SET);

void *buf=malloc(filelength(f)-off-sizeof(stud));

read(f,buf,filelength(f)-off-sizeof(stud));

lseek(f,off,SEEK_SET);

write(f,buf,filelength(f)-off-sizeof(stud));

free(buf);

}

chsize(f,filelength(f)-sizeof(stud));

deleted++;

}

else off+=sizeof(stud);

}

if (finded) printf("\nНайдено %i записей удалено %i записей\n",finded,deleted);

else printf("Студет %s не найден\n",fio);

close(f);

}

else printf("Файл данных не найден\n");

getch();

}

if (workwith==kursy)//для курсов

{

int f=open("kurs.dat",O_RDWR | O_BINARY,S_IWRITE | S_IREAD);

if (f!=-1)

{

printf("Удаление записи.\n\nВведите название курса: ");

char nazv[30];

gets(nazv);

int finded=0,deleted=0;

char yesno='n';

long off=0;

while ((off=findbyname(nazv,off))!=-1)

{

printf("\nУдалить?(y,n)\n");

finded++;

while ((yesno=getch())!='y' && yesno!='n');

if (yesno=='y')

{

if (filelength(f)-off-sizeof(stud)>0)

{

lseek(f,off+sizeof(kurs),SEEK_SET);

void *buf=malloc(filelength(f)-off-sizeof(kurs));

read(f,buf,filelength(f)-off-sizeof(kurs));

lseek(f,off,SEEK_SET);

write(f,buf,filelength(f)-off-sizeof(kurs));

free(buf);

}

chsize(f,filelength(f)-sizeof(kurs));

deleted++;

}

else off+=sizeof(kurs);

}

if (finded) printf("\nНайдено %i записей удалено %i записей\n",finded,deleted);

else printf("Курс %s не найден\n",nazv);

close(f);

}

else printf("Файл данных не найден\n");

getch();

}

}


//подпрограмма корректировки записи

void correct()

{

int otstup[2][4+MaxPr+1]={{8,30,35,33},{13,8,15,16}};//отступы для каждого поля записи

for (int i=5;i<4+MaxPr+1;i++)

otstup[0][i]=3;

clrscr();

printf("Кооректировка записи.\n");

char s[20];

if (workwith==students) printf("Введите ФИО: ");

if (workwith==kursy) printf("Введите Название: ");

fflush(stdin);

gets(s);

long off=findbyname(s,0);

char key=0;

int nstr=0,strmax;

if (off!=-1)

while (key!=27)

{

clrscr();

printf("Выберете поле для редактирования:\n\n");

if (workwith==students)//для студентов

{

printf(" ФИО: %s\n",stud.fio);

printf(" Факультет и специальность: %s\n",stud.fak);

printf(" Курс на котором учится студент: %i\n",stud.kurs);

printf(" Количество пройденных курсов: %i\n",stud.nkursov);

printf("Код курса и оценка: \n",stud.nkursov);

for (int i=0;i
printf(" %3i %3i\n",stud.predm[i].kurscode,stud.predm[i].mark);

strmax=4+stud.nkursov;

}

if (workwith==kursy)//для курсов

{

printf(" Название: %s\n",kurs.nazv);

printf(" Код: %i\n",kurs.code);

printf(" № семестра: %i\n",kurs.nsem);

printf(" ФИО препода: %s\n",kurs.fioprep);

strmax=3;

}

gotoxy(1,nstr+1+2);

printf(">");

key=getch();

if (key=='8' || key==72)

{

nstr--;

if (workwith==students && nstr==4) nstr--;

}

if (key=='5' || key==80)

{

nstr++;

if (workwith==students && nstr==4) nstr++;

}

if (key==13)//ввести выбранное поле

{

//установить курсор и стереть прошлое значение

gotoxy(otstup[workwith][nstr],1+nstr+2);

printf("%20s","\0");

gotoxy(otstup[workwith][nstr],1+nstr+2);

if (workwith==students)

{

fflush(stdin);

if (nstr==0) gets(stud.fio);

if (nstr==1) gets(stud.fak);

if (nstr==2) scanf("%i",&stud.kurs);

if (nstr==3) scanf("%i",&stud.nkursov);

if (nstr>=5) scanf("%i %i",&stud.predm[nstr-5].kurscode,&stud.predm[nstr-5].mark);

int f=open("stud.dat",O_WRONLY | O_BINARY | O_CREAT,S_IWRITE | S_IREAD);

lseek(f,off,SEEK_SET);

write(f,&stud,sizeof(stud));

close(f);

}

if (workwith==kursy)

{

fflush(stdin);

if (nstr==0) gets(kurs.nazv);

if (nstr==1) scanf("%i",&kurs.code);

if (nstr==2) scanf("%i",&kurs.nsem);

if (nstr==3) gets(kurs.fioprep);

int f=open("kurs.dat",O_WRONLY | O_BINARY | O_CREAT,S_IWRITE | S_IREAD);

lseek(f,off,SEEK_SET);

write(f,&kurs,sizeof(kurs));

close(f);

}

};

if (nstr<0) nstr=strmax;

if (nstr>strmax) nstr=0;

}

else printf("Запись не найдена\n");

}


//проверка файлов данных на существование

void check()

{

int err=0;

if (access("stud.dat",0)==-1)

{

printf("Файл студентов не найден.\n");

int f=creatnew("stud.dat",0);

close(f);

if (f!=-1) printf("создан новый файл\n");

else printf("Ошибка создания нового файла\n");

err=1;

}

if (access("kurs.dat",0)==-1)

{

printf("Файл курсов не найден.\n");

int f=creatnew("kurs.dat",0);

close(f);

if (f!=-1) printf("создан новый файл\n");

else printf("Ошибка создания нового файла\n");

err=1;

}

if (err) getch();

}


void main()

{

clrscr();

int nstr=0;

check();

while (nstr!=5)

{

view();

char key=0;

while (key!=13)

{

gotoxy(1,1);

printf(" Добавить запись\n");

printf(" Удалить запись\n");

printf(" Корректировка записи\n");

if (workwith==students)

{

printf(" Поиск по фамилии\n");

printf(" Работать со списком курсов\n");

}

if (workwith==kursy)

{

printf(" Поиск по названию\n");

printf(" Работать со списком студентов\n");

}

printf(" Выход\n");

gotoxy(1,nstr+1);

printf(">");

key=getch();

gotoxy(1,nstr+1);

if (key=='8' || key==72) nstr--;

if (key=='5' || key==80) nstr++;

if (key=='+' || key==81) {k+=rec_on_screen;view();}

if (key=='-' || key==73) {k-=rec_on_screen;view();}

if (nstr<0) nstr=5;

if (nstr>5) nstr=0;

}

if (nstr==0) add();

if (nstr==1) del();

if (nstr==2) correct();

if (nstr==3)

{

clrscr();

char s[20];

if (workwith==students) printf("Введите ФИО: ");

if (workwith==kursy) printf("Введите название курса: ");

gets(s);

if (findbyname(s,0)==-1) printf("Запись не найдена");

getch();

}

if (nstr==4)

if(workwith==students)

{

workwith=kursy;

rec_on_screen=kurs_on_screen;

}

else

{

workwith=students;

rec_on_screen=stud_on_screen;

}

}

}

Приложение Б: План тестирования

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

Проверить работу всех режимов (выбор – клавиши Enter, ,.), выполняя требуемые действия. Выход из режима происходит автоматически после выполнения всех действий.

Приложение В: Руководство системного программиста


Исполняемый файл – spisok.exe. Эта программа работает в среде DOS. Программа совместима с ОС Windows 9X (3.11, 95, 98, ME), а также с некоторыми ОС Windows NT (2000, XP).

Файлы данных должны находится в том же каталоге(если их нет то будут созданы пустые файлы). Не рекомендуется изменять их вручную.

Программа работает в текстовом режиме VGA на всех IBM PC – совместимых компьютерах, видеоадаптер должен поддерживать текстовый режим 80х25. Минимальные системные требования:
  • Процессор: Intell 386
  • Оперативная память: 1 MB
  • Видеопамять: 64 KB
  • Свободное место на жестком диске: около 60 KB
  • ОС DOS (или совместимая – см. выше)
  • Клавиатура



Приложение Г: Руководство пользователя


Пользователю доступны все режимы. Исполняемый файл spisok.exe Перемещение по главному меню –, Enter - выбор. Пользователь может выбирать любой пункт меню. В зависимости от выбранного пункта, появиться новое меню или программа попросит Вас ввести необходимые для работы сведения.

Выход при нажатии на раздел «Выход», только из главного меню.

Программа работает в текстовом режиме VGA на всех IBM PC – совместимых компьютерах, видеоадаптер должен поддерживать текстовый режим 80х25. Минимальные системные требования:
  • Процессор: Intell 386
  • Оперативная память: 1 MB
  • Видеопамять: 64 KB
  • Свободное место на жестком диске: около 60 KB
  • ОС DOS (или совместимая – см. выше)
  • Клавиатура