Отчёт по курсовой работе по дисциплине программирование на языке высокого уровня Выполнил (подпись) Студент группы повт-23
Вид материала | Курсовая |
- Отчёт по курсовой работе по дисциплине программирование на языке высокого уровня Выполнил, 129.75kb.
- Р. Е. Алексеева кафедра ису программирование на языке высокого уровня методические, 57.65kb.
- Рабочая программа по дисциплине Программирование на языке высокого уровня для специальности, 182.97kb.
- Рабочая учебная программа по дисциплине «Программирование на языке высокого уровня», 119.59kb.
- Программа курса «Программирование на языке высокого уровня», 126.66kb.
- Методические рекомендации по выполнению курсовой работы по дисциплине "Программирование, 551.87kb.
- Гречкина П. В. «Программирование на языке высокого уровня», 168.82kb.
- Программирование на языке высокого уровня, 59.92kb.
- Задания на курсовую работу по дисциплине программирование на языке высокого уровня, 165.55kb.
- Домашнее задание 3 по дисциплине "Программирование на языке высокого уровня, 25.78kb.
Министерство Образования Российской Федерации
Алтайский Государственный Политехнический университет
“Автоматизированная система ведения списка студентов и списка курсов”
Отчёт по курсовой работе по дисциплине программирование на языке высокого уровня
Выполнил (подпись) ________________ Студент группы ПОВТ-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 Постановка задачи
Словесная постановка
Программа должна выполнять следующие действия с базами данных:
- Добавление записей
- Удаление записей
- Корректировка записей
- Поиск записи по ФИО студента(база данных "студенты") или по названию курса(база данных "курсы")
Кроме того программа должна давать возможность просмотра и связи 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 (или совместимая – см. выше)
- Клавиатура