Философия науки 5

Чувашский государственный университет им. И.Н.Ульянова

Факультет информатики и вычислительной техники

Кафедра вычислительной техники

Пояснительная записка к курсовой работе

по дисциплине

«Объектно-ориентированное программирование»

Выполнил:

студент группы ИВТ- 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]='';

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]='';

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]='';

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]='';

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]='';

pos+=sizeof(faculty)+1;

for(j=0;j<sizeof(speciality);j++)

speciality[j]=s[pos+j];

j--;

while (speciality[j]==' ')

j--;

j++;

speciality[j]='';

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


11-09-2015, 00:11


Страницы: 1 2
Разделы сайта