Философия науки 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 метода решения поставленной задачи состоит в том, чтобы отдельно организовать объекты А и В. В этом случае необходимо программно организовать взаимодействие между объектами, на что потратится кучу времени, но не будет никаких конфликтов между ними.

В основе 2 метода лежит объединение объектов А и В в один – АВ. В этом случае база данных будет в ненормальной форме, но, по сравнению с первым методом решения, необходимость во взаимодействии объектов А и В отпадает, что достаточно облегчит задачу.

В силу очевидных превосходств между методами в курсовой работе будет рассматриваться 2 метод решения поставленной задачи.




2.2. Подробный анализ выбранного метода решения



Объединив два объекта – Абитуриент и ВУЗ – в один. 

Рассмотрим объект ВУЗ. В общем случае иерархия объекта будет иметь следующий вид:



ВУЗ 1

Факультет 1

Факультет 2

Факультет n

…

Специальность 1

Специальность n

…

Из рисунка видно, что необходимо создать базовый класс ВУЗ, наследник класса ВУЗ – Факультет и наследник класса Факультет – Специальность.

Поля класса решения поставленной задачи LIST и Абитуриент:



LIST

Абитуриент 1

Абитуриент 1



Абитуриент n

…

ФИО, …

ВУЗ

Все методы класса 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. Чтение данных



ReadData

Открыть файл

Прочитать строку

Конвертировать данные

Присвоить полученные данные текущему полю Абитуриент[i]

Увеличиваем i на единицу

Строка пустая?

ReadData

0

1

Здесь i – счетчик количества заполненных элементов

4.2. Добавление записи





AddData

Ввести все необходимые данные

Присвоить полученные данные текущему полю Абитуриент[i]

Увеличиваем i на единицу

AddData



4.3. Удаление записи





DelData

Абитуриент[Номер] отметить как удаленный

DelData

Номер


4.4. Сохранение изменений





SaveData

Записать данные

Абитуриент[I] отмечен как удаленный

SaveData

0

1



I от 1 до count

Открыть файл для записи




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...

---------------------------------------------------
Вывод



Мною решена задача проектирования и написания программы система «Абитуриент» с применением основных принципов объектно-ориентированного программирования.

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

Благодаря тому, что программа системы представляется в терминах поведения объектов, при программировании использовались понятия, более близкие к предметной области, следовательно, программа легче читается и понимается. Это является большим преимуществом ООП. 

Плохо спроектированная иерархия классов приводит к созданию сложных и запутанных программ. Важно до начала проектирования правильно определить, требуется ли вообще применить объектно-ориентированный подход. Применение к этой задаче объектно-ориентированного подхода, по моему мнению, добавила к положительным качествам программы такие пункты, как эффективность, компактность и надежность. Также программа стала хорошо читаемой и легко модифицируемой.


Список использованной литературы



Т.А.Павловская. С/С++ Программирование на языке высокого уровня. 2009.

Шилдт, Герберт. Полный справочник по С, 4-е издание.: Пер. с анг.- М.:

	Вильямс, 2005.

	




Приложение

faculty.h:

class Faculty

{

	public:

	char nameFaculty[15];

public:

	void SetParam(char *name);

	void Print()

	{

		printf("\tFaculty:    %s\n",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: %s\n",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 %s\n",fio.surname,fio.name,fio.father);

			printf("\tDR:         %d.%d.%d\n",dr.day,dr.month,dr.year);

			printf("\tPassport:   ");

			for(int i=0;i<4; i++) printf("%c",pasport_s[i]);

			printf(" %s\n",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("---------------------------------------------------\n\n");

};

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 M\n");

	printf("              A B I T U R I E N T\n\n");

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

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

	printf("\tL   -  Print list\n");

	printf("\tA   -  Add record to list\n");

	printf("\tC   -  Change record\n");

	printf("\tD   -  Delete record of list\n");

	printf("\tR   -  Restore deleted record\n");

	printf("\tS   -  Save list\n");

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

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

};

void PrintHelp()

{

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

	printf("\t............\n");

	printf("\t............\n");

	printf("\t............\n");

	printf("\t............\n");

	printf("\t............\n");

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

};




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 - %d\n", (int)ch);

		}

		ch = getch();

	}

}







2