Уровни доступа к членам класса
Отчет по курсовой работе
по дисциплине «Объектно-ориентированное программирование»
на тему «Моделирование информационной системы с помощью иерархии классов в С++»
Выполнил:
студент группы Б03-781-1 Е.В. Новоселова
Проверил:
к.т.н., доцент кафедры «ВТ» А.В. Самохвалов
Ижевск, 2014
Введение
Цель работы:состоит в разработке модели информационной системы с помощью иерархии классов в С++.
Моделируемый объект – животные.
Требования к модели:
- наличие текстового меню для работы с программой;
- использование вложенных классов (классы, включающие другие классы как данные-члены);
- использование наследования (иерархия классов);
- минимальное число объектов – 20;
- минимальное число свойств (данных-членов) базового класса – 2;
- минимальное число специфических свойств (данных-членов) производного класса – 3;
- объекты производных классов хранятся в массивах, размерность массива определяется исходя из количества записей в файле + запас 50% (используем указатели);
- реализация конструкторов по умолчанию;
- реализация конструкторов инициализации пользователем с разным числом параметров (перегрузка конструктора);
- реализация метода (методов) загрузки исходных данных из файла;
- реализация методов изменения данных-членов объектов;
- реализация метода (методов) сохранения данных моделируемой системы в файл;
- реализация вывода данных об объектах по сортировке на экран и в файл (по всем возможным полям данных);
- реализация вывода данных об объектах по фильтру (поиск по запросу) на экран и в файл (по всем возможным полям данных);
- реализация возможности добавления и удаления объектов в моделируемой системе;
- при сохранении данных в файл у пользователя есть возможность при желании указать имя файла.
Задачи:
1. Проанализировать моделируемый объект.
2. Разработать иерархию классов для моделирования объекта.
3. Предложить структуру базового(-ых) и производных классов.
4. Создать программную реализацию системы классов моделируемого объекта на языке С++.
5. Разработать программную реализацию меню для работы с базой данных моделируемого объекта на языке С++.
Краткая теория
C++ — компилируемый статически типизированный язык программирования общего назначения.
Объектно-ориентированное программирование– это методология программирования, основанная на представлении программы в виде совокупности взаимодействующих друг с другом объектов, каждый из которых является экземпляром определенного класса, а классы могут образовывать иерархию наследования. Программа будет объектно-ориентированной только при соблюдении трех требований: 1) в качестве базовых элементов используются объекты, а не алгоритмы; 2) каждый объект является экземпляром какого-либо определенного класса; 3) классы организованы иерархически.
Объектно-ориентированное проектирование. Программирование прежде всего подразумевает правильное и эффективное использование механизмов конкретных языков программирования, а проектирование основное внимание уделяет правильному и эффективному структурированию сложных систем. Объектно-ориентированное проектирование – это методология проектирования, соединяющая в себе процесс объектной декомпозиции и приемы представления логической (классы и объекты) и физической (модули и процессы) структуры системы, а также статической и динамической моделей проектируемой системы. Именно объектно-ориентированная декомпозиция отличает объектно-ориентированное проектирование от структурного; в первом случае логическая структура системы отражается абстракциями в виде классов и объектов, во втором – алгоритмами.[4]
Объектно-ориентированный анализ. На объектную модель повлияла более ранняя модель жизненного цикла программного обеспечения. Объектноориентированный анализ направлен на создание моделей реальной действительности на основе объектно-ориентированного мировоззрения. Объектноориентированный анализ – это методология, при которой требования к системе воспринимаются с точки зрения классов и объектов, выявленных в предметной области. На результатах анализа формируются модели, на которых основывается проектирование, которое в свою очередь создает фундамент для окончательной реализации системы с использованием методологии программирования.
Концепция абстрактных типов и абстрактных типов данных является ключевой в программировании. Абстракция подразумевает разделение и независимое рассмотрение интерфейса и реализации. Интерфейс и внутренняя реализация являются определяющими свойствами объектов окружающего нас мира. Интерфейс – это средство взаимодействия с некоторым объектом. Реализация – это внутреннее свойство объекта.
Наибольший интерес представляет эффективность реализации. Модульность и абстракция дополняют друг друга. Модульностьпредполагает скрытие деталей реализации, а абстракция позволяет специфицировать каждый модуль перед тем, как будет написана соответствующая программа.
Базовые принципы объектно-ориентированного программирования: Объектно-ориентированное программирование основывается на трех основных концепциях: инкапсуляции, полиморфизме и наследовании. Инкапсуляция (пакетирование) представляет собой механизм, связывающий вместе данные и код, обрабатывающий эти данные, и сохраняющий их от внешнего воздействия и ошибочного использования.
Инкапсуляцияпозволяет создавать объект, являющийся логическим целым, включающим данные и код для работы с этими данными. Объект обеспечивает защиту против случайной или несанкционированной модификации частных (private) составляющих его членов. Закрытые данные или коды (методы) доступны только для других частей этого объекта и недоступны вне его. Открытая часть объекта предназначена для обеспечения контролируемого интерфейса его закрытой части.
Полиморфизм обеспечивает возможность реагировать различным образом на одно и то же сообщение (вызов функции-члена). Полиморфизм позволяет уменьшить сложность программы посредством использования одного и того же интерфейса для задания целого класса действий. Поддержка полиморфизма в ООП осуществляется через виртуальные функции и механизм перегрузки и переопределения. Ключевым в понимании полиморфизма является то, что он позволяет манипулировать объектами различной степени сложности путем создания общего для них стандартного интерфейса для реализации похожих действий.
Наследование представляет собой механизм, благодаря которому новый (производный) класс может создаваться, наследуя (приобретая) свойства от уже существующего (базового) класса. Новый класс, используя наследование, нуждается только в определении специфичных только для этого класса компонент. Наследование позволяет поддерживать концепцию иерархии классов. [4]
Класс — это тип, описывающий устройство объектов, их поведение и способ представления.
Объект — сущность обладающая определённым поведением и способом представления, т. е. относящееся к классу (говорят, что объект — это экземпляр класса, если он к нему относится). Описание класса начинается со служебного слова class, вслед за которым указывается имя класса. Затем в блоке следует описание класса и после закрывающей скобки блока ставится точка с запятой.[3]
Описание класса состоит из полей и методов.
Поля (или свойства, в рамках C++ это можно считать синонимом) описывают то, какие данные смогут хранить экземпляры класса (т.е. объекты). Конкретные значения сохраняются уже внутри объектов. Поля объявляются в теле класса.
К полям внутри класса можно обращаться непосредственно по именам полей.
Методы класса — это функции, которые смогут применяться к экземплярам класса. Грубо говоря, метод — это функция объявленная внутри класса и предназначенная для работы с его объектами.
Методы объявляются в теле класса. Описываться могут там же, но могут и за пределами класса (внутри класса в таком случае достаточно представить прототип метода, а за пределами класса определять метод поставив перед его именем — имя класса и оператор ::).
Методы и поля входящие в состав класса называются членами класса. При этом методы часто называют функциями-членами класса.
Уровни доступа к членам класса
По уровню доступа все члены класса делятся на открытые (public), закрытые (private) и защищённые (protected).
Члены объявленные как private доступны только внутри класса.
Члены объявленные как protected доступны внутри класса и внутри всех его потомков.
Члены объявленные как public доступны как внутри, так вне класса (в том числе в потомках).
Когда объявляется класс-наследник, то сразу после его имени ставится двоеточие и указывается уровень (или способ) наследования (public, private, protected), а затем имя класса родителя. Уже потом открывается блок с описанием класс-наследника.
Private-наследование
Те члены, что в родителе были protected и public, становятся private в потомке.
Protected-наследование
Те члены, что в родители были protected и public становятся protected в потомке. Такой вариант используется редко.
Public-наследование
Те члены, что в родители были protected и public, остаются, соответственно, protected и public в наследнике, сохраняя свой уровень доступа.[2]
Описание модели
Объект моделирования – база животных. Состоит из 2-х массивов классов: звери и птицы. При считывании из файлов данных задается кол-во зверей и птиц, и их максимальное кол-во (кол-во + 50%). Класс база животных имеет методы для вывода информации о всех животных, редактировании данных, сортировки по всем полям, фильтрации, добавление новых записей и удаление их.
Иерархия классов
baza |
Attributes: + zver* zv + ptic* pt + int kolzv + int kolpt + int maxdzv + int maxpt |
Operatoins: +baza() +vivodzv() +vivodpt() +Filtr1() +Edit() +Edit2() +Edit3() +WriteToFile() +Sortzv() +Sortpt() +Add() +Delet() |
zhivotnoe |
Attributes: + char name[15]; + char razmer[15]; + char pol[3]; + char semeistvo[20]; |
Operatoins: zhivotnoe() + verh() + GetName(char buf[]); + GetRazmer(char buf[]); + GetPol(char buf[]); + GetSemeistvo(char buf[]); + SetName(char buf[]); + SetRazmer(char buf[]); + SetPol(char buf[]); + SetSemeistvo(char buf[]); |
zver |
Attributes: + char poroda[20]; + char okras[10]; + int vozrast; |
Operatoins: + zver(); + zver(int s); + zver(FILE *file); + vivod(); + ZapisF(FILE *file); + Setvozrast(); + GetPoroda(char buf[]); + GetOkras(char buf[]); + GetVozrast(int &buf); + SetPoroda(char buf[]); + SetOkras(char buf[]); + SetVozrast(int &buf); |
ptic |
Attributes: + char arealobitania[20] + int chislennostSemeistvoa + int ves |
Operatoins: + ptic(); + ptic(int s); + ptic(FILE *file); + vivod(); + ZapisF(FILE *file); + GetAreal(char buf[]); + GetChisl(int &buf); + GetVes(int &buf); + SetAreal(char buf[]); + SetChisl(int buf); + SetVes(int buf); |
Листинг программы
main.cpp
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <conio.h>
#include <string.h>
#include "func.h"
int main()
{
setlocale(LC_CTYPE, "Russian");
baza bk;
bool p = true;
char sw;
Menu();
while (p)
{
sw = _getch();
switch (sw)
{
case '1':
system("cls");
Menu();
bk.vivodpt();
cout << endl;
bk.vivodzv();
break;
case '2':
system("cls");
Menu();
bk.Filtr1();
system("cls");
Menu();
break;
case '3':
system("cls");
bk.Edit();
system("cls");
Menu();
break;
case '4':
bk.WriteToFile();
system("cls");
Menu();
break;
case '5':
bk.Sortpt();
system("cls");
Menu();
break;
case '6':
bk.Sortzv();
system("cls");
Menu();
break;
case '7':
bk.Add();
system("cls");
Menu();
break;
case '8':
bk.Delet();
system("cls");
Menu();
break;
case 'c':
system("cls");
Menu();
break;
case 'x':
exit(0);
default:
break;
}
}
return 0;
}
Func.cpp
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <conio.h>
#include "func.h"
using namespace std;
void Menu()//общее меню
{
cout << "1)Вывести базу животных" << endl
<< "2)Фильтр" << endl
<< "3)Изменение данных животного" << endl
<< "4)Запись в файл новых данных"<< endl
<< "5)Сортировка зверей" << endl
<< "6)Сортировка птиц"<< endl
<< "7)Добавление новой записи животного" << endl
<< "8)Удаление поля животного" << endl
<< "Z)Очистка экрана" << endl
<< "Х)Выход" << endl;
}
void Menu2()//меню для фильтра
{
cout << "1)Название" << endl
<< "2)Пол" << endl
<< "3)Размер" << endl
<< "4)Семейство" << endl
<< "5)Место обитания" << endl
<< "9)Назад";
}
void MenuObshee()//меню для выбора зверя или птицы
{
cout << "1)Звери" << endl << "2)Птицы" << endl << "9)Назад";
}
void Menuzv()//меню для Зверей
{
cout << "1)Название" << endl << "2)Пол" << endl << "3)Размер" << endl
<< "4)Семейство" << endl << "5)Порода" << endl << "6)Окрас" << endl << "7)Возраст" << endl << "9)Назад";
}
void Menupt()//меню для птиц
{
cout << "1)Название " << endl << "2)Пол" << endl << "3)Размер" << endl << "4)Семейство" << endl
<< "5)Ареал обитания" << endl << "6)Численность вида" << endl << "7)Вес" << endl << "9)Назад";
}
zhivotnoe::zhivotnoe(){}
void zhivotnoe::GetName(char buf[])
{
strcpy(buf, name);
}
void zhivotnoe::GetRazmer(char buf[])
{
strcpy(buf, razmer);
}
void zhivotnoe::GetPol(char buf[])
{
strcpy(buf, pol);
}
void zhivotnoe::GetSemeistvo(char buf[])
{
strcpy(buf, semeistvo);
};
void ptic::GetAreal(char buf[])
{
strcpy(buf, arealobitania);
};
void ptic::GetChisl(int &buf)
{
buf = chislennostSemeistvoa;
};
void ptic::GetVes(int &buf)
{
buf = ves;
};
void zver::GetPoroda(char buf[])
{
strcpy(buf, poroda);
};
void zver::GetOkras(char buf[])
{
strcpy(buf, okras);
};
void zver::GetVozrast(int &buf)
{
buf = vozrast;
};
void zver::SetPoroda(char buf[])
{
strcpy(poroda, buf);
};
void zver::SetOkras(char buf[])
{
strcpy(okras, buf);
};
void zver::SetVozrast(int &buf)
{
vozrast = buf;
};
void zhivotnoe::SetName(char buf[])
{
strcpy(name, buf);
}
void zhivotnoe::SetRazmer(char buf[])
{
strcpy(razmer, buf);
}
void zhivotnoe::SetPol(char buf[])
{
strcpy(pol, buf);
}
void zhivotnoe::SetSemeistvo(char buf[])
{
strcpy(semeistvo, buf);
}
void ptic::SetAreal(char buf[])
{
strcpy(arealobitania, buf);
}
void ptic::SetChisl(int buf)
{
chislennostSemeistvoa = buf;
}
void ptic::SetVes(int buf)
{
ves = buf;
}
zver::zver()
{}
zver::zver(FILE *file)
{
fscanf(file, "%s %s %s %s %s %s %d", name, pol, razmer, semeistvo, poroda, okras, &vozrast);
}
void zver::ZapisF(FILE *file)
{
fprintf(file, "%s %s %s %s %s %s %d", name, pol, razmer, semeistvo, poroda, okras, vozrast);
fprintf(file, "%c", '\n');
}
void zver::vivod()
{
cout << "* " << setw(10) << left << name << "* " << setw(3) << pol << "* " << setw(7)
<< razmer << "* " << setw(10) << semeistvo << "* " << setw(10) << poroda
<< "* " << setw(10) << okras << "* " << setw(7) << vozrast << "*" << endl;
}
ptic::ptic()
{}
ptic::ptic(FILE *file)
{
fscanf(file, "%s %s %s %s %s %d %d", name, pol, razmer, semeistvo, arealobitania, &chislennostSemeistvoa, &ves);
}
void ptic::vivod()
{
cout << "* " << setw(10) << left << name << "* " << setw(3) << pol << "* " << setw(10) << razmer
<< "* " << setw(12) << semeistvo << "* " << setw(11) << arealobitania << "* " << setw(10)
<< chislennostSemeistvoa << "* " << setw(3) << ves << "*" << endl;
}
void ptic::ZapisF(FILE *file)
{
fprintf(file, "%s %s %s %s %s %d %d", name, pol, razmer, semeistvo, arealobitania, chislennostSemeistvoa, ves);
fprintf(file,"%c", '\n');
};
zver::zver(int s)
{
cout << endl << "Vvedite novie dannie (name, pol, sem-vo, razmer, poroda, okras, vozrast):" << endl;
cin >> name >> pol >> razmer >> semeistvo >> poroda >> okras >> vozrast;
}
baza::baza()
{
FILE *f1 = fopen("1.txt", "r");
FILE *f2 = fopen("2.txt", "r");
fscanf(f1, "%d", &kolzv);
fscanf(f2, "%d", &kolpt);
maxzv = kolzv + (kolzv / 2);
maxpt = kolpt + (kolpt / 2);
pt = new ptic[maxpt];
zv = new zver[maxzv];
int kol = 0;
while (!feof(f1))
{
zver bufzv(f1);
zv[kol] = bufzv;
kol++;
}
int kol1 = 0;
while (!feof(f2))
{
ptic bufpt(f2);
pt[kol1] = bufpt;
kol1++;
}
fclose(f1);
fclose(f2);
}
void baza::vivodzv()
{
cout << "* " << setw(10) << left << "Название" << "* " << setw(3) << "пол" << "* " << setw(7) << "Размер" << "* "
<< setw(10) << "Семейство" << "* " << setw(10) << "порода" << "* " << setw(10) << "окрас" << "* " << setw(7)
<< "возраст" << "*" << endl;
for (int i = 0; i<kolzv; i++)
{
zv[i].vivod();
}
}
void baza::vivodpt()
{
cout << "* " << setw(10) << left << "Название" << "* " << setw(3) << "пол" << "* " << setw(10)
<< "размер" << "* " << setw(12) << "семейство" << "* " << setw(10) << "ар-л обит-я" << "* " << setw(10)
<< "числ вида" << "* " << setw(2) << "вес" << "*" << endl;
for (int i = 0; i<kolpt; i++)
{
pt[i].vivod();
}
}
void baza::Filtr1()//фильтр
{
bool p = true;
char fil;
char str1[15], str2[15];
system("cls");
Menu2();
cout << endl << "Введите название файла";
char namefile[20];
cin >> namefile;
FILE *fout = fopen(namefile, "w");
while (p)
{
fil = _getch();
switch (fil)
{
case '1':
system("cls");
Menu2();
cout << "Введите данные";
cin >> str1;
cout << "*" << setw(10) << left << "название" << "* " << setw(3) << "пол" << "* " << setw(10)
<< "размер" << "* " << setw(10) << "семейство" << "* " << setw(10) << "ар-л обит-я" << "* " << setw(10)
<< "числ-сть вида" << "* " << setw(2) << "вес" << "*" << endl;
for (int i = 0; i < kolpt; i++)
{
pt[i].GetName(str2);
if (strcmp(str1, str2) == 0){ pt[i].vivod(); pt[i].ZapisF(fout); }
}
cout << "* " << setw(7) << left << "Название" << "* " << setw(3) << "пол" << "* " << setw(10) << "Размер" << "* "
<< setw(10) << "Семейство" << "* " << setw(10) << "порода" << "* " << setw(10) << "окрас" << "* " << setw(7)
<< "возраст" << "*" << endl;
for (int i = 0; i < kolzv; i++)
{
zv[i].GetName(str2);
if (strcmp(str1, str2) == 0){ zv[i].vivod(); zv[i].ZapisF(fout); }
}
break;
case '2':
system("cls");
Menu2();
cout << "Введите данные";
cin >> str1;
cout << "*" << setw(10) << left << "название" << "* " << setw(3) << "пол" << "* " << setw(10)
<< "размер" << "* " << setw(10) << "семейство" << "* " << setw(10) << "ар-л обит-я" << "* " << setw(10)
<< "числ-сть вида" << "* " << setw(2) << "вес" << "*" << endl;
for (int i = 0; i < kolpt; i++)
{
pt[i].GetPol(str2);
if (strcmp(str1, str2) == 0){ pt[i].vivod(); pt[i].ZapisF(fout); }
}
cout << "* " << setw(7) << left << "Название" << "* " << setw(3) << "пол" << "* " << setw(10) << "Размер" << "* "
<< setw(10) << "Семейство" << "* " << setw(10) << "порода" << "* " << setw(10) << "окрас" << "* " << setw(7)
<< "возраст" << "*" << endl;
for (int i = 0; i < kolzv; i++)
{
zv[i].GetPol(str2);
if (strcmp(str1, str2) == 0){ zv[i].vivod(); zv[i].ZapisF(fout); }
}
break;
case '3':
system("cls");
Menu2();
cout << "Введите данные";
cin >> str1;
cout << "*" << setw(10) << left << "название" << "* " << setw(3) << "пол" << "* " << setw(10)
<< "размер" << "* " << setw(10) << "семейство" << "* " << setw(10) << "ар-л обит-я" << "* " << setw(10)
<< "числ-сть вида" << "* " << setw(2) << "вес" << "*" << endl;
for (int i = 0; i < kolpt; i++)
{
pt[i].GetRazmer(str2);
if (strcmp(str1, str2) == 0){ pt[i].vivod(); pt[i].ZapisF(fout); }
}
cout << "* " << setw(7) << left << "Название" << "* " << setw(3) << "пол" << "* " << setw(10) << "Размер" << "* "
<< setw(10) << "Семейство" << "* " << setw(10) << "порода" << "* " << setw(10) << "окрас" << "* " << setw(7)
<< "возраст" << "*" << endl;
for (int i = 0; i < kolzv; i++)
{
zv[i].GetRazmer(str2);
if (strcmp(str1, str2) == 0){ zv[i].vivod(); zv[i].ZapisF(fout); }
}
break;
case '4':
system("cls");
Menu2();
cout << "Введите данные";
cin >> str1;
cout << "*" << setw(10) << left << "название" << "* " << setw(3) << "пол" << "* " << setw(10)
<< "размер" << "* " << setw(10) << "семейство" << "* " << setw(10) << "ар-л обит-я" << "* " << setw(10)
<< "числ-сть вида" << "* " << setw(2) << "вес" << "*" << endl;
for (int i = 0; i < kolpt; i++)
{
pt[i].GetSemeistvo(str2);
if (strcmp(str1, str2) == 0){ pt[i].vivod(); pt[i].ZapisF(fout); }
}
cout << "* " << setw(7) << left << "Название" << "* " << setw(3) << "пол" << "* " << setw(10) << "Размер" << "* "
<< setw(10) << "Семейство" << "* " << setw(10) << "порода" << "* " << setw(10) << "окрас" << "* " << setw(7)
<< "возраст" << "*" << endl;
for (int i = 0; i < kolzv; i++)
{
zv[i].GetSemeistvo(str2);
if (strcmp(str1, str2) == 0){ zv[i].vivod(); zv[i].ZapisF(fout); }
}
case '5':
system("cls");
Menu2();
cout << "Введите данные";
cin >> str1;
cout << "*" << setw(10) << left << "название" << "* " << setw(3) << "пол" << "* " << setw(10)
<< "размер" << "* " << setw(10) << "семейство" << "* " << setw(10) << "ар-л обит-я" << "* " << setw(10)
<< "числ-сть вида" << "* " << setw(2) << "вес" << "*" << endl;
for (int i = 0; i < kolpt; i++)
{
pt[i].GetAreal(str2);
if (strcmp(str1, str2) == 0){ pt[i].vivod(); pt[i].ZapisF(fout); }
}
cout << "* " << setw(7) << left << "Название" << "* " << setw(3) << "пол" << "* " << setw(10) << "Размер" << "* "
<< setw(10) << "Семейство" << "* " << setw(10) << "порода" << "* " << setw(10) << "окрас" << "* " << setw(7)
<< "возраст" << "*" << endl;
for (int i = 0; i < kolzv; i++)
{
zv[i].GetPoroda(str2);
if (strcmp(str1, str2) == 0){ zv[i].vivod(); zv[i].ZapisF(fout); }
}
break;
case '9':
p = false;
break;
default:
break;
}
}
fclose(fout);
}
void baza::Edit()
{
// 1-изменение полей данных у зверей 2-у птиц 9-выход в главное меню
bool p = true;
char ed;
MenuObshee();
while (p)
{
ed = _getch();
switch (ed)
{
case '1':
Edit2();
system("cls");
MenuObshee();
break;
case '2':
Edit3();
system("cls");
MenuObshee();
break;
case '9':
p = false;
break;
default:
break;
}
}
}
void baza::Edit2()//изменение полей зверей
{
system("cls");
cout << "Vvedite nomer: ";
int nomt; //ввод номера домашней кошки данные которого будем изменять
cin >> nomt;
if ((nomt <= kolzv) && (nomt > 0)) //проверка на выход за пределы
{
bool p = true;
char ed;
system("cls");
Menuzv();
while (p)
{
//1-изменение имени , 2-пол, 3-размера, 4-семейство, 9-выход в предыдущее меню
ed = _getch();
switch (ed)
{
case '1':
cout << endl << "Vvedite novoe name" << endl;
char bufname[11];
cin >> bufname;
zv[nomt - 1].SetName(bufname);
system("cls");
Menuzv();
break;
case '2':
cout << endl << "Vvedite pol " << endl;
char bufpol[11];
cin >> bufpol;
zv[nomt - 1].SetPol(bufpol);
system("cls");
Menuzv();
break;
case '3':
cout << endl << "Vvedite razmer" << endl;
char bufpodsem[11];
cin >> bufpodsem;
zv[nomt - 1].SetRazmer(bufpodsem);
system("cls");
Menuzv();
break;
case '4':
cout << endl << "Vvedite sem-vo" << endl;
char bufsemeistvo[11];
cin >> bufsemeistvo;
zv[nomt - 1].SetSemeistvo(bufsemeistvo);
system("cls");
Menuzv();
break;
case '5':
cout << endl << "Vvedite porodu" << endl;
char bufpor[11];
cin >> bufpor;
zv[nomt - 1].SetPoroda(bufpor);
system("cls");
Menuzv();
case '6':
cout << endl << "Vvedite okras" << endl;
char bufokr[11];
cin >> bufokr;
zv[nomt - 1].SetOkras(bufokr);
system("cls");
Menuzv();
case '7':
cout << endl << "Vvedite vozrast" << endl;
int bufvoz;
cin >> bufvoz;
zv[nomt - 1].SetVozrast(bufvoz);
system("cls");
Menuzv();
break;
case '9':
p = false;
break;
default:
break;
}
}
}
else
{
cout << "Oshibka! Vvedite drugoy nomer\n";
system("pause");
}
}
void baza::Edit3()//изменение полей птицы
{
cout << endl << "Vvedite nomer ptic";
int nomc; //ввод номера птицы которую будем изменять
cin >> nomc;
if ((nomc <= kolpt) && (nomc > 0))
{
bool p = true;
char ed;
system("cls");
Menupt();
while (p)
{
//1-изменение имени, 2-пола, 3-размер, 4-семейства, 9-выход в предыдущее меню
ed = _getch();
switch (ed)
{
case '1':
cout << endl << "Vvedite novoe name" << endl;
char bufname[11];
cin >> bufname;
pt[nomc - 1].SetName(bufname);
system("cls");
Menupt();
break;
case '2':
cout << endl << "Vvedite pol" << endl;
char bufpol[11];
cin >> bufpol;
pt[nomc - 1].SetPol(bufpol);
system("cls");
Menupt();
break;
case '3':
cout << endl << "Vvedite noviy razmer" << endl;
char bufpodsem[11];
cin >> bufpodsem;
pt[nomc - 1].SetRazmer(bufpodsem);
system("cls");
Menupt();
break;
case '4':
cout << endl << "Vvedite sem-vo" << endl;
char bufsemeistvo[11];
cin >> bufsemeistvo;
pt[nomc - 1].SetSemeistvo(bufsemeistvo);
system("cls");
Menupt();
case '5':
cout << endl << "Vvedite Areal obitania" << endl;
char bufareal[11];
cin >> bufareal;
pt[nomc - 1].SetAreal(bufareal);
system("cls");
Menupt();
case '6':
cout << endl << "Vvedite Chislennost semeistvoa" << endl;
int bufchisl;
cin >> bufchisl;
pt[nomc - 1].SetChisl(bufchisl);
system("cls");
Menupt();
case '7':
cout << endl << "Vvedite ves" << endl;
int bufves;
cin >> bufves;
pt[nomc - 1].SetVes(bufves);
system("cls");
Menupt();
case '9':
p = false;
break;
default:
break;
}
}
}
else
{
cout << "Oshibka! Vvedite drugoy nomer\n";
system("pause");
}
};
ptic::ptic(int s)
{
//считывание данных с клавиатуры
cout << endl << "Vvedite novie dannie ( name, semeistvo, pol, arealobitania, chislennostSemeistvoa,ves ):" << endl;
cin >> name >> razmer >> pol >> semeistvo >> arealobitania >> chislennostSemeistvoa >> ves;
};
void baza::WriteToFile()
{
//запись всех данных в файл
cout << endl << "Vvedite nazvanie file (fout.txt)";
char namefile[20]; //название файла
cin >> namefile;
FILE *fout = fopen(namefile, "w");
for (int i = 0; i < kolpt; i++) //запись в файл записей птиц
{
pt[i].ZapisF(fout);
}
for (int i = 0; i < kolzv; i++) //запись в файл записей зверей
{
zv[i].ZapisF(fout);
}
fclose(fout);
}
void baza::Sortpt() //сортировка массива птиц
{
char sort;
bool p = true, ex = true;
ptic buf;
system("cls");
while (ex)
{
//1-сортирует по имени, 2-пол,3-размер, 4-семейство, 5-ареал обитания, 6-численность вида, 7-вес
//в 2 буферные переменные записываются значения полей 2-х обьектов (i-го и i+1-го) и сравниваются если значение i-го больше то они меняются местами
system("cls");
Menupt();
cout << endl;
vivodpt();
sort = _getch();
switch (sort)
{
case '1':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolpt - 1; i++){
pt[i].GetName(str1); pt[i + 1].GetName(str2);
if (strcmp(str1, str2) == 1){ buf = pt[i]; pt[i] = pt[i + 1]; pt[i + 1] = buf; p = true; }
}
}
break;
case '2':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolpt - 1; i++){
pt[i].GetPol(str1); pt[i + 1].GetPol(str2);
if (strcmp(str1, str2) == 1){ buf = pt[i]; pt[i] = pt[i + 1]; pt[i + 1] = buf; p = true; }
}
}
break;
case '3':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolpt - 1; i++){
pt[i].GetRazmer(str1); pt[i + 1].GetRazmer(str2);
if (strcmp(str1, str2) == 1){ buf = pt[i]; pt[i] = pt[i + 1]; pt[i + 1] = buf; p = true; }
}
}
break;
case '4':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolpt - 1; i++){
pt[i].GetSemeistvo(str1); pt[i + 1].GetSemeistvo(str2);
if (strcmp(str1, str2) == 1){ buf = pt[i]; pt[i] = pt[i + 1]; pt[i + 1] = buf; p = true; }
}
}
break;
case '5':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolpt - 1; i++){
pt[i].GetAreal(str1); pt[i + 1].GetAreal(str2);
if (strcmp(str1, str2) == 1){ buf = pt[i]; pt[i] = pt[i + 1]; pt[i + 1] = buf; p = true; }
}
}
break;
case '6':
p = true;
while (p){
p = false;
int ch1, ch2;
for (int i = 0; i < kolpt - 1; i++){
pt[i].GetChisl(ch1); pt[i + 1].GetChisl(ch2);
if (ch1 > ch2){ buf = pt[i]; pt[i] = pt[i + 1]; pt[i + 1] = buf; p = true; }
}
}
break;
case '7':
p = true;
while (p){
p = false;
int ch1, ch2;
for (int i = 0; i < kolpt - 1; i++){
pt[i].GetVes(ch1); pt[i + 1].GetVes(ch2);
if (ch1 > ch2){ buf = pt[i]; pt[i] = pt[i + 1]; pt[i + 1] = buf; p = true; }
}
}
break;
case '9':
ex = false;
break;
default:
break;
}
}
}
void baza::Sortzv() //сортировка массива зверей
{
char sort;
bool p = true, ex = true;
zver buf;
system("cls");
while (ex)
{
//1-сортирует по имени, 2-пол,3-размер, 4-семейство, 5-порода, 6-окрас, 7-возраст
//в 2 буферные переменные записываются значения полей 2-х обьектов (i-го и i+1-го) и сравниваются если значение i-го больше то они меняются местами
system("cls");
Menuzv();
cout << endl;
vivodzv();
sort = _getch();
switch (sort)
{
case '1':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolzv - 1; i++){
zv[i].GetName(str1); zv[i + 1].GetName(str2);
if (strcmp(str1, str2) == 1){ buf = zv[i]; zv[i] = zv[i + 1]; zv[i + 1] = buf; p = true; }
}
}
break;
case '2':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolzv - 1; i++){
zv[i].GetPol(str1); zv[i + 1].GetPol(str2);
if (strcmp(str1, str2) == 1){ buf = zv[i]; zv[i] = zv[i + 1]; zv[i + 1] = buf; p = true; }
}
}
break;
case '3':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolzv - 1; i++){
zv[i].GetRazmer(str1); zv[i + 1].GetRazmer(str2);
if (strcmp(str1, str2) == 1){ buf = zv[i]; zv[i] = zv[i + 1]; zv[i + 1] = buf; p = true; }
}
}
break;
case '4':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolzv - 1; i++){
zv[i].GetSemeistvo(str1); zv[i + 1].GetSemeistvo(str2);
if (strcmp(str1, str2) == 1){ buf = zv[i]; zv[i] = zv[i + 1]; zv[i + 1] = buf; p = true; }
}
}
break;
case '5':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolzv - 1; i++){
zv[i].GetPoroda(str1); zv[i + 1].GetPoroda(str2);
if (strcmp(str1, str2) == 1){ buf = zv[i]; zv[i] = zv[i + 1]; zv[i + 1] = buf; p = true; }
}
}
break;
case '6':
p = true;
while (p){
p = false;
char str1[11], str2[11];
for (int i = 0; i < kolzv - 1; i++){
zv[i].GetOkras(str1); zv[i + 1].GetOkras(str2);
if (strcmp(str1, str2) == 1){ buf = zv[i]; zv[i] = zv[i + 1]; zv[i + 1] = buf; p = true; }
}
}
break;
case '7':
p = true;
while (p){
p = false;
int ch1, ch2;
for (int i = 0; i < kolzv - 1; i++){
zv[i].GetVozrast(ch1); zv[i + 1].GetVozrast(ch2);
if (ch1 > ch2){ buf = zv[i]; zv[i] = zv[i + 1]; zv[i + 1] = buf; p = true; }
}
}
break;
case '9':
ex = false;
break;
default:
break;
}
}
}
void baza::Add()
{
//добавление нового элемента
//1-добавление зверя, 2-добавление птицы
bool p = true;
char add;
system("cls");
MenuObshee();
while (p)
{
add = _getch();
switch (add)
{
case '1':
{
if (kolzv < maxzv) //проверка на переполнение массива
{
zver bufzv(0); //создается новая переменная с помощью конструктора, который считывает данные с клавиатуры
zv[kolzv] = bufzv;
kolzv++;
system("cls");
MenuObshee();
}
else
{
cout << "Dostignuto maximalnoe kol-vo zvashnih koshek";
}
break;
}
case '2':
{
if (kolpt < maxpt) //проверка на переполнение массива
{
ptic bufpt(0);//создается новая переменная с помощью конструктора, который считывает данные с клавиатуры
pt[kolpt] = bufpt;
kolpt++;
system("cls");
MenuObshee();
}
else
{
cout << "Dostignuto maximalnoe kol-vo ptih koshek";
}
break;
}
case '9':
p = false;
break;
default:
break;
}
}
}
void baza::Delet()
{
//удаление элемента массива
//1-удаление из массива зверей 2-птиц
bool p = true;
char del;
system("cls");
MenuObshee();
while (p)
{
del = _getch();
switch (del)
{
case '1':
cout << endl << "Vvedite nomer zver";
int nomt; //номер в массиве элемента который надо удалить
cin >> nomt;
if ((nomt > 0) && (nomt <= kolzv))//проверка, существует ли такой элемент
{
for (int i = nomt; i < kolzv; i++)
zv[i - 1] = zv[i];
kolzv--;//уменньшаем колличество записей
system("cls");
MenuObshee();
}
else
cout << "Takogo nomera netu";
break;
case '2':
cout << endl << "Vvedite nomer ptic";
int nomk;
cin >> nomk;
if ((nomk > 0) && (nomk <= kolpt))
{
for (int i = nomk; i < kolpt; i++)
pt[i - 1] = pt[i];
kolpt--;
system("cls");
MenuObshee();
}
else
cout << "Takogo nomera netu";
break;
case '9':
p = false;
break;
default:
break;
}
}
}
func.h
#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <process.h>
#include <conio.h>
#include <string.h>
using namespace std;
class zhivotnoe
{
protected:
char name[15];
char razmer[15];
char pol[3];
char semeistvo[20];
public:
zhivotnoe();
void verh();
void GetName(char buf[]);
void GetRazmer(char buf[]);
void GetPol(char buf[]);
void GetSemeistvo(char buf[]);
void SetName(char buf[]);
void SetRazmer(char buf[]);
void SetPol(char buf[]);
void SetSemeistvo(char buf[]);
};
class zver : public zhivotnoe
{
private:
char poroda[20];
char okras[10];
int vozrast;
public:
zver();
zver(int s);
zver(FILE *file);
void vivod();
void ZapisF(FILE *file);
void Setvozrast();
void GetPoroda(char buf[]);
void GetOkras(char buf[]);
void GetVozrast(int &buf);
void SetPoroda(char buf[]);
void SetOkras(char buf[]);
void SetVozrast(int &buf);
};
class ptic : public zhivotnoe
{
protected:
char arealobitania[20];
int chislennostSemeistvoa;
int ves;
public:
ptic();
ptic(int s);
ptic(FILE *file);
void vivod();
void ZapisF(FILE *file);
void GetAreal(char buf[]);
void GetChisl(int &buf);
void GetVes(int &buf);
void SetAreal(char buf[]);
void SetChisl(int buf);
void SetVes(int buf);
};
class baza
{
protected:
zver* zv;
ptic* pt;
int kolzv;
int kolpt;
int maxzv;
int maxpt;
public:
baza();
void vivodzv();
void vivodpt();
void Filtr1();
void Edit();
void Edit2();
void Edit3();
void WriteToFile();
void Sortzv();
void Sortpt();
void Add();
void Delet();
};
void Menu();
void Menu2();
void MenuObshee();
void Menuzv();
void Menupt();