Чувашский государственный университет им. И.Н.Ульянова
Факультет информатики и вычислительной техники
Кафедра вычислительной техники
Пояснительная записка к курсовой работе
по дисциплине
«Объектно-ориентированное программирование»
Выполнил:
студент группы ИВТ- 42-08
Кузнецов Алексей Петрович
Руководитель:
кандидат технических наук, доцент Обломов Игорь Александрович
Чебоксары 2011
Оглавление
Оглавление. 2
Задание на курсовую работу. 3
Введение. 4
1. Постановка задачи. 5
2. Анализ задания. 6
2.1. Методы решения
. 6
2.2. Подробный анализ выбранного метода решения
. 7
3. Описание классов и структур. 8
4. Основные алгоритмы методов класса LIST.. 9
4.1. Чтение данных
. 9
4.2. Добавление записи
. 10
4.3. Удаление записи
. 10
4.4. Сохранение изменений
. 11
5. Результат работы программы.. 12
Список использованной литературы.. 15
Приложение. 16
faculty.h: 16
abiturient.h. 16
list.h. 17
proc.cpp. 17
menu.cpp. 21
main.cpp. 22
Задание на курсовую работу
Разработать информационно-поисковую систему «Абитуриент»
Курсовой работу необходимо реализовать в виде системы взаимодействующих модулей, а само проектирование выполнить в несколько последовательных этапов.
Введение
Традиционная технология программирования складывалась в условиях, когда основными потребителями программ были научные учреждения, вычислительные ресурсы были ограничены, а проблемы сопровождения по существу неизвестны. Основными критериями качества программы считалось ее узко понимаемая эффективность и компактность. Со временем сложность программ возросла настолько, что на их разработку уходили годы труда большого коллектива, а в результате системы появлялись с опозданием и содержали тысячи ошибок.
Кризис программного обеспечения привел к необходимости создания нового способа создания программ, который снижал бы общие затраты на протяжении всего цикла программы, – от замысла до завершения эксплуатации. Такая технология появилась в начале 70-х годов и была названа структурным программированием. В его основе лежит сочетание теории программирования и личного опыта высококвалифицированных программистов, а также учет современных требований к программам и промышленного характера их производства.
Структурное программирование – это технология создания программ, позволяющая путем соблюдения определенных правил уменьшить время разработки и количество ошибок, а также облегчить возможность модификации программы. Структурный подход охватывает все стадии разработки проекта: спецификацию, проектирование, собственно программирование и тестирование.
Структурный подход к программированию позволил успешно создавать достаточно крупные проекты, но сложность программного обеспечения продолжала возрастать, и требовались все более развитые средства ее преодоления. Идеи структурного программирования получили свое дальнейшее развитие в объектно-ориентированном программировании (ООП) – технологии, позволяющей достичь простоты структуры и управляемости очень крупных программных систем.
Целью курсовой работы является углубление и закрепление теоретических знаний, навыков практического применения основных принципов объектно-ориентированных систем: наследования, инкапсуляции, полиморфизма, а также формирование новых взглядов на процессы программирования с учетом абстракции данных.
1. Постановка задачи
Требуется разработать программу, обеспечивающую хранение и обработку данных указанного типа. Должны быть реализованы типовые действия, включающие в себя:
- включение нового элемента;
- удаление элемента;
- корректировка элемента;
- сохранение изменений в базу данных.
Одним из требований к разрабатываемой программной системе является хранение таблицы с исходными данными в файле. Все изменения, вносимые в базу данных, не должны теряться при завершении работы с программой, то есть необходимо обновление содержимого файла при изменении базы данных.
Взаимодействие пользователя с программой осуществляется через меню.
2. Анализ задания
2.1. Методы решения
В системе «Абитуриент» существуют две сущности – «Абитуриент» и «ВУЗ». Главная проблема разработки системы – определение связи между этими сущностями[1]
.
Объект А содержит данные об абитуриенте:
- ФИО
- Дата рождения
- Серия и номер паспорта
- Баллы за экзамен
Объект ВУЗ содержит данные о ВУЗе, в которую желает поступить абитуриент:
- Название ВУЗа
- Название факультета
- Название специальности
- Проходной балл(сумма)
Идея 1 метода
решения поставленной задачи состоит в том, чтобы отдельно организовать объекты А и В. В этом случае необходимо программно организовать взаимодействие между объектами, на что потратится кучу времени, но не будет никаких конфликтов между ними.
В основе 2 метода
лежит объединение объектов А и В в один – АВ. В этом случае база данных будет в ненормальной форме, но, по сравнению с первым методом решения, необходимость во взаимодействии объектов А и В отпадает, что достаточно облегчит задачу.
В силу очевидных превосходств[2]
между методами в курсовой работе будет рассматриваться 2 метод
решения поставленной задачи.
2.2. Подробный анализ выбранного метода решения
Объединив два объекта – Абитуриент и ВУЗ – в один.
Рассмотрим объект ВУЗ. В общем случае иерархия объекта будет иметь следующий вид:
Из рисунка видно, что необходимо создать базовый класс ВУЗ, наследник класса ВУЗ – Факультет и наследник класса Факультет – Специальность.
Поля класса решения поставленной задачи LIST и Абитуриент:
Все методы класса LIST – возможности системы Абитуриент: добавление, изменение, удаление записи, сохранение и т.д. Такой метод решения позволяет значительно уменьшить время разработки и количество ошибок, а также облегчить модификацию программы.
3.
Описание классов и структур
Класс Факультет:
class Faculty
{
public:
char nameFaculty[15];
public:
void SetParam(char *name);
void Print();
};
Класс Специальность:
class Speciality: public Faculty
{
public:
char nameSpeciality[15];
int sumBalls;
public:
void SetParam(char *nameF, char *nameS, int sumBalls);
void Print();
void PrintBalls()
};
Структура ФИО:
struct sfio
{
char surname[15];
char name[15];
char father[15];
};
Структура ДатаРождения:
struct sdr
{
int day;
int month;
int year;
};
Структура Абитуриент:
struct Abiturient
{
public:
bool deleted;
Speciality speciality;
sfio fio;
sdr dr;
int balls[5];
char pasport_s[4];
char pasport_n[6];
public:
const Abiturient& operator = (const Abiturient &abit);
void Print();
};
Класс LIST:
class List
{
private:
int count;
Abiturient list[10];
public:
List()
{
count=0;
for(int i=0;i<10; i++) list[i].deleted=false;
};
void ReadData(char *name);
void SaveData(char *name);
void PrintList(void);
void AddRecord();
void DelRecord();
void ChangeRecord();
void RestoreRecord();
};
4. Основные алгоритмы методов класса
LIST
4.1. Чтение данных
4.2. Добавление записи
4.3.
Удаление записи
4.4. Сохранение изменений
5.
Результат работы программы
При запуске программы появляется меню со следующим списком действий:
I N F O R M A T I O N S E A R C H S Y S T E M
A B I T U R I E N T
- MENU --------------------------------------------
F1 - About
L - Print list
A - Add record to list
C - Change record
D - Delete record of list
R - Restore deleted record
S - Save list
ESC - Exit
---------------------------------------------------
Вывод списка абитуриентов(L):
- LIST --------------------------------------------
- 1 --------------------------------------------
FIO: Kuznetsov Alexey Petrovich
DR: 2.6.1991
Passport: 9704 352216
Balls: 81 77 75 0 0
Faculty: IVT
Speciality: Speciality
- 2 --------------------------------------------
FIO: Averkiev Aleksandr Vitalievich
DR: 17.7.1991
Passport: 9704 332211
Balls: 80 80 80 0 0
Faculty: IVT
Speciality: PO
---------------------------------------------------
Добавление нового абитуриента(A):
- NEW RECORD --------------------------------------
- SOURNAME : Petrov
- NAME : Aleksandr
- FATHERNAME : Alekseevich
- BIRTH DAY : 12
- BIRTH MONTH : 2
- BIRTH YEAR : 1989
- PASPORT S : 1212
- PASPORT N : 121212
- BALLS :
Ball[1]: 67
Ball[2]: 83
Ball[3]: 88
Ball[4]: 0
Ball[5]: 0
- FACULTY : IVT
- SPECIALITY : PO
- SUM BALLS : 217
The record 6 added...
---------------------------------------------------
Изменение записи:
- CHANGE RECORD -----------------------------------
- ENTER NUMBER: 6
- CHANGE RECORD 6 --------------------------------
- SOURNAME (Petrov): Petrov
- NAME (Aleksandr): Aleksey
- FATHERNAME (Alekseevich): Petrovich
- BIRTH DAY (12): 12
- BIRTH MONTH(2): 2
- BIRTH YEAR (1989): 198
- PASPORT S (1212121212): 1212
- PASPORT N (): 121212
- BALLS :
Ball[1] (67): 12
Ball[2] (83): 12
Ball[3] (88): 12
Ball[4] (0): 12
Ball[5] (0): 12
- FACULTY (IVT): 12
- SPECIALITY (PO): 12
- SUM BALLS (217): 12
The record 6 changed...
--------------------------------------------------- Вывод
Мною решена задача проектирования и написания программы система «Абитуриент» с применением основных принципов объектно-ориентированного программирования.
В этой задаче очень много данных и деталей, которые сложно удержать в голове, поэтому возникла необходимость обратиться к методам повышения абстракции с целью упростить структуру данных, что позволило управлять большим объемом информации.
Благодаря тому, что программа системы представляется в терминах поведения объектов, при программировании использовались понятия, более близкие к предметной области, следовательно, программа легче читается и понимается. Это является большим преимуществом ООП.
Плохо спроектированная иерархия классов приводит к созданию сложных и запутанных программ. Важно до начала проектирования правильно определить, требуется ли вообще применить объектно-ориентированный подход. Применение к этой задаче объектно-ориентированного подхода, по моему мнению, добавила к положительным качествам программы такие пункты, как эффективность, компактность и надежность. Также программа стала хорошо читаемой и легко модифицируемой.
Список использованной литературы
1. Т.А.Павловская. С/С++ Программирование на языке высокого уровня. 2009.
2. Шилдт, Герберт. Полный справочник по С, 4-е издание.: Пер. с анг.- М.:
Вильямс, 2005.
Приложение
faculty.h:
class Faculty
{
public:
char nameFaculty[15];
public:
void SetParam(char *name);
void Print()
{
printf("tFaculty: %sn",this->nameFaculty);
};
};
class Speciality: public Faculty
{
public:
char nameSpeciality[15];
int sumBalls;
public:
void SetParam(char *nameF, char *nameS, int sumBalls);
void Print()
{
Faculty::Print();
printf("tSpeciality: %sn",nameSpeciality);
};
void PrintBalls()
{
printf("t%d",sumBalls);
}
};
abiturient.h
#include "faculty.h"
struct sfio
{
char surname[15];
char name[15];
char father[15];
};
struct sdr
{
int day;
int month;
int year;
};
struct Abiturient
{
public:
bool deleted;
Speciality speciality;
sfio fio;
sdr dr;
int balls[5];
char pasport_s[4];
char pasport_n[6];
public:
const Abiturient& operator = (const Abiturient &abit)
{
if (&abit == this) return *this;
for(int i=0; i<5; i++) this->balls[i]=abit.balls[i];
this->speciality.SetParam((char *)abit.speciality.nameFaculty,
(char *)abit.speciality.nameSpeciality,
abit.speciality.sumBalls);
strcpy(this->fio.father,abit.fio.father);
strcpy(this->fio.name,abit.fio.name);
strcpy(this->fio.surname,abit.fio.surname);
this->dr.day=abit.dr.day;
this->dr.month=abit.dr.month;
this->dr.year=abit.dr.year;
strcpy(this->pasport_n,abit.pasport_n);
strcpy(this->pasport_s,abit.pasport_s);
return *this;
};
void Print()
{
printf("tFIO: %s %s %sn",fio.surname,fio.name,fio.father);
printf("tDR: %d.%d.%dn",dr.day,dr.month,dr.year);
printf("tPassport: ");
for(int i=0;i<4; i++) printf("%c",pasport_s[i]);
printf(" %sn",pasport_n);
printf("tBalls: ");
for(int i=0; i<5; i++)
printf("%d ",balls[i]);
printf("n");
speciality.Print();
};
};
list.h
#include "abiturient.h"
class List
{
private:
int count;
Abiturient list[10];
public:
List()
{
count=0;
for(int i=0;i<10; i++) list[i].deleted=false;
};
void ReadData(char *name);
void SaveData(char *name);
void PrintList(void);
void AddRecord();
void DelRecord();
void ChangeRecord();
void RestoreRecord();
};
proc.cpp
#include <iostream>
#include <string>
#include <stdlib.h>
#include <conio.h>
#include "list.h"
void Faculty::SetParam(char *name)
{
strcpy(nameFaculty,name);
};
void Speciality::SetParam(char *nameF,char *nameS,int sumBalls)
{
Faculty::SetParam(nameF);
strcpy(nameSpeciality,nameS);
this->sumBalls=sumBalls;
}
void List::ReadData(char *name)
{
const int dl=125;
char s[dl];
int i=0,sumBalls;
char faculty[15];
char speciality[15];
FILE *_f;
_f = fopen(name,"r");
while (fgets(s,dl,_f))
{
int pos=0;
int j=0;
while(s[pos+j]!=' ')
{list[count].fio.surname[j]=s[pos+j];j++;}
list[count].fio.surname[j]='0';
pos+=sizeof(list[count].fio.surname)+1;j=0;
while(s[pos+j]!=' ')
{list[count].fio.name[j]=s[pos+j];j++;}
list[count].fio.name[j]='0';
pos+=sizeof(list[count].fio.name);j=0;
while(s[pos+j]!=' ')
{list[count].fio.father[j]=s[pos+j];j++;}
list[count].fio.father[j]='0';
pos+=sizeof(list[count].fio.father);
list[count].dr.day = atoi(&s[pos]);
pos+=3;
list[count].dr.month=atoi(&s[pos]);
pos+=3;
list[count].dr.year=atoi(&s[pos]);
pos+=5;
for(j=0;j<4;j++)
list[count].pasport_s[j]=s[pos+j];
list[count].pasport_s[j]='0';
pos+=5;
for(j=0;j<6;j++) list[count].pasport_n[j]=s[pos+j];
list[count].pasport_n[j]=0;
pos+=7;
for(int k=0; k<sizeof(list[count].balls)/4; k++)
list[count].balls[k]=atoi(&s[pos+3*k]);
pos+=15;
for(j=0;j<sizeof(faculty);j++)
faculty[j]=s[pos+j];
j--;
while (faculty[j]==' ')
j--;
j++;
faculty[j]='0';
pos+=sizeof(faculty)+1;
for(j=0;j<sizeof(speciality);j++)
speciality[j]=s[pos+j];
j--;
while (speciality[j]==' ')
j--;
j++;
speciality[j]='0';
pos+=sizeof(speciality)+1;
sumBalls=atoi(&s[pos]);
pos+=1;
this->list[count].speciality.SetParam(faculty,speciality,sumBalls);
count++;
}
count--;
fclose(_f);
}
void List::AddRecord()
{
Abiturient abit;
printf("- NEW RECORD --------------------------------------");
printf("n - SOURNAME : ");scanf("%s",abit.fio.surname);
printf(" - NAME : ");scanf("%s",abit.fio.name);
printf(" - FATHERNAME : ");scanf("%s",abit.fio.father);
printf(" - BIRTH DAY : ");std::cin>>abit.dr.day;
printf(" - BIRTH MONTH: ");std::cin>>abit.dr.month;
printf(" - BIRTH YEAR : ");std::cin>>abit.dr.year;
printf(" - PASPORT S : ");scanf("%s",abit.pasport_s);
printf(" - PASPORT N : ");scanf("%s",abit.pasport_n);
printf(" - BALLS : n");
for(int i=0; i<5; i++)
{
printf("tBall[%d]: ",i+1);
std::cin>>abit.balls[i];
};
printf(" - FACULTY : ");scanf("%s",abit.speciality.nameFaculty);
printf(" - SPECIALITY : ");scanf("%s",abit.speciality.nameSpeciality);
printf(" - SUM BALLS : ");std::cin>>abit.speciality.sumBalls;
count++;
this->list[count]=abit;
printf("tThe record %d added...n",count+1);
printf("---------------------------------------------------n");
};
void List::PrintList()
{
printf("- LIST --------------------------------------------n");
int i=0;
while(i<count+1)
{
if (!list[i].deleted)
{
printf(" - %d --------------------------------------------n",i+1);
list[i].Print();
i++;
}
else
i++;
};
printf("---------------------------------------------------nn");
};
void List::DelRecord()
{
this->PrintList();
int number;
printf("n- DELETE RECORD -----------------------------------n");
printf(" - ENTER NUMBER: ");std::cin>>number;
list[number-1].deleted = true;
printf("tThe record %d deleted...n",count+1);
printf("tPress L for print the new list...n");
printf("---------------------------------------------------n");
};
void List::ChangeRecord()
{
this->PrintList();
int number;
printf("n- CHANGE RECORD -----------------------------------n");
printf(" - ENTER NUMBER: ");std::cin>>number;
printf("n- CHANGE RECORD %d --------------------------------n",number);
printf("n - SOURNAME (%s): ",list[number-1].fio.surname);scanf("%s",list[number-1].fio.surname);
printf(" - NAME (%s): ",list[number-1].fio.name);scanf("%s",list[number-1].fio.name);
printf(" - FATHERNAME (%s): ",list[number-1].fio.father);scanf("%s",list[number-1].fio.father);
printf(" - BIRTH DAY (%d): ",list[number-1].dr.day);std::cin>>list[number-1].dr.day;
printf(" - BIRTH MONTH(%d): ",list[number-1].dr.month);std::cin>>list[number-1].dr.month;
printf(" - BIRTH YEAR (%d): ",list[number-1].dr.year);std::cin>>list[number-1].dr.year;
printf(" - PASPORT S (%s): ",list[number-1].pasport_s);scanf("%s",list[number-1].pasport_s);
printf(" - PASPORT N (%s): ",list[number-1].pasport_n);scanf("%s",list[number-1].pasport_n);
printf(" - BALLS : n");
for(int i=0; i<5; i++)
{
printf("tBall[%d] (%d): ",i+1,list[number-1].balls[i]);
std::cin>>list[number-1].balls[i];
};
printf(" - FACULTY (%s): ",list[number-1].speciality.nameFaculty);scanf("%s",list[number-1].speciality.nameFaculty);
printf(" - SPECIALITY (%s): ",list[number-1].speciality.nameSpeciality);scanf("%s",list[number-1].speciality.nameSpeciality);
printf(" - SUM BALLS (%d): ",list[number-1].speciality.sumBalls);std::cin>>list[number-1].speciality.sumBalls;
printf("tThe record %d changed...n",number);
printf("---------------------------------------------------n");
};
void List::RestoreRecord()
{
this->PrintList();
int number;
printf("n- RESTORE RECORD ---------------------------------n");
printf(" - ENTER NUMBER: ");std::cin>>number;
list[number-1].deleted = false;
printf("tThe record %d restored...n",count+1);
printf("tPress L for print the new list...n");
printf("---------------------------------------------------n");
};
void List::SaveData(char *name)
{
FILE *_f;
_f = fopen(name,"w+");
if(_f == 0)
printf("tNot open the file %s!n",name);
else
{
printf("n- SAVING DATA -----------------------------------n");
for(int i=0; i<=this->count; i++)
{
if(!list[i].deleted)
{
int pos=sizeof(list[i].fio.surname);
fprintf(_f,"%- 16s%- 15s%- 15s%0.2d %0.2d %0.4d ",
list[i].fio.surname,
list[i].fio.name,
list[i].fio.father,
list[i].dr.day,
list[i].dr.month,
list[i].dr.year);
for(int j=0; j<4; j++)
fprintf(_f,"%c",list[i].pasport_s[j]);
fprintf(_f," %- 7s",list[i].pasport_n);
for(int j=0; j<5; j++)
fprintf(_f,"%0.2d ",list[i].balls[j]);
fprintf(_f,"%- 16s%- 16s%d",
list[i].speciality.nameFaculty,
list[i].speciality.nameSpeciality,
list[i].speciality.sumBalls
);
int count=0;
for(int j=i+1; j<=this->count; j++)
if(!list[j].deleted) count++;
if (count>0) fprintf(_f,"n");
}
}
}
fclose(_f);
printf("tThe data are saved...n");
printf("---------------------------------------------------n");
}
menu.cpp
#include <iostream>
void PrintMenu()
{
printf(" I N F O R M A T I O N S E A R C H S Y S T E Mn");
printf(" A B I T U R I E N Tnn");
printf("- MENU --------------------------------------------n");
printf("tF1 - Aboutn");
printf("tL - Print listn");
printf("tA - Add record to listn");
printf("tC - Change recordn");
printf("tD - Delete record of listn");
printf("tR - Restore deleted recordn");
printf("tS - Save listn");
printf("tESC - Exitn");
printf("---------------------------------------------------nn");
};
void PrintHelp()
{
printf("- ABOUT -------------------------------------------n");
printf("t............n");
printf("t............n");
printf("t............n");
printf("t............n");
printf("t............n");
printf("---------------------------------------------------nn");
};
main.cpp
#include <iostream>
#include <string>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include "list.h"
void PrintHelp();
void PrintMenu();
using namespace std;
void main()
{
List list;
list.ReadData("abit2.txt");
//list.PrintList();
char ch=0;
while((int)ch!=27)//ESC
{
system("cls");
PrintMenu();
switch((int)ch)
{
case 59://F1
PrintHelp();
break;
case -92://L
case 108:
list.PrintList();
break;
case -28://A
case 97:
list.AddRecord();
break;
case 100://D
case -94:
list.DelRecord();
break;
case 114:
case -86:
list.RestoreRecord();
break;
case 99://C
case -31:
list.ChangeRecord();
break;
case 115:
case -21:
list.SaveData("abit2.txt");
break;
default:
printf("Key - %dn", (int)ch);
}
ch = getch();
}
}
[1]
Далее каждую сущность будем называть объектом
[2]
Т.к. нормализация базы данных не является целью курсовой работы, то этот недостаток не будем учитывать при выборе оптимального метода решения