#include<string.h>
#include<stdio.h>
#include <iostream.h>
#include <conio.h>
#define KOLBIB 4
#define KOLKNIG 15
#define DLINA 10
// объявление функции ввода строки символов с контролем длины
void vcontrol(char []);
// описание класса библиотеки
class biblio
{
/* kniga -символьный массив по книгам одной библиотеки; одна строка соответствует одной книге
n- действительное количество книг в одной библиотеке
KOLKNIG- максимальное количество книг в одной библиотеке
DLINA -максимальная длина книги
numbib - личный номер библиотеки, формируемый при инициализации
*/
char kniga[KOLKNIG][DLINA];
int n;
int numbib;
/*статическая величина num - определяющая число инициализированных объектов*/
static int num;
/*статический символьный массив common,который содержит книги, общие для всех библиотек (общая библиотека)
numcommon - действительное количество книг в массиве сommоn*/
static char common[KOLKNIG][DLINA];
/* fmax закрытая член-функция вычисления максимальной длины и номера книги, к ней обращаются открытые член-функции maxdlina и maxdlob
она должна быть статической, так как к ней обращается и функция-член класса и статическая функция член-класса
k - формальный параметр -результат - номер строки с максимальной длинной
m- количество строк в исходном символьном массиве*/
static int fmax(char x[][DLINA],int *k,int m)
{ int max=strlen(x[0]); *k=1;
for (int i=1;i<m;i++) if (max<strlen(x[i])) {max=strlen(x[i]);*k=i+1;}
return max;
}
public:
/*количество символьных строк в общей библиотеке (в статическом массиве common)*/
static int numcommon;
/*объявление 1-го конструктора без параметров для ввода всех данных по библиотеке, определенный вне описания класса*/
biblio();
/*объявление 2-го конструктора для переписи данных из внешнего массива символьных строк, введенного в главном модуле*/
biblio(int,char[][DLINA]);
/*объявление функция вывода библиотеки без параметров*/
void vivod();
/*объявление статической функции вывода общей библиотеки*/
static void vivodcom();
/*объявление функции для нахождения книги с максимальной длиной и максимальной длины*/
int maxdlina(int k=0);
/*объявление аналогичной функции для нахождения книги с максимальной длиной и максимальной длины, но в статическом массиве общей библиотеки*/
static int maxdlob(int k=0);
/*объявление функции change вставки заголовка в начало книги с заданным номером*/
void change(char[],int);
/*объявление аналогичной функции changeob вставки заголовка в начало книги с заданным номером в общей библиотеке common, но эта функция должна быть статическая*/
static void changeob(char [],int n);
/*объявление статической функции, которая выдает информацию о книгах общей библиотеки, заданную при инициализации массива commom и переменной numcommon; эта же функция вводит информацию о новых книгах в эту общую библиотеку*/
static void dopolnenie();
/* объявление функции выдачи количества инициализированных и созданных объектов*/
static int howmanybib()
{return num;}
}; // конец описания класса библиотеки
// объявление функции ввода строки символов с контролем длины
void vcontrol(char []);
//блок 1
// инициализация статических переменных класса biblio
int biblio:: num=0;
// инициализация количества книг в общей библиотеке
int biblio:: numcommon=2;
// запись первых двух книг в общую библиотеку
char biblio:: common[][DLINA]={"первая","вторая"};
int main()
{ clrscr();
/*общее число обрабатываемых объектов определяется KOLLIB
rabkng - рабочий массив для текста книг,которые содержатся в одинаковых библиотеках и текст которых вводится в начале главного модуля
n- действительное количество книг в одинаковых библиотеках*/
char rabkng[KOLKNIG][DLINA];
int n;
/*блок2
выдача количества объектов-библиотек, которые обрабатываются в программе*/
cout<< " НАЧАЛО РАБОТЫ ПРОГРАММЫ\n";
cout<< " в программе обрабатываются "<<KOLBIB<<" библиотеки - объектов и одна общая библиотека - статический массив \n";
/* ввод рабочего массива rabkng, в который заносится текст книг одинаковых библиотек и который с помощью 2-го конструктора при определении объектов в дальнейшем автоматически переписывается в библиотеки
ввод книги-строки с контролем по максимально допустимой длине производится с помощью функции vcontrol*/
cout<<"\n введите количество книг в одинаковых библиотеках ";
cin >>n;
if (n!=0)
for (int j=0;j<n;j++)
vcontrol(rabkng[j]);
// блок3
/*выдача информации о количестве созданных и инициализированных объектов-библиотек(хотя объекты и неопределены)*/
cout<<"\n созданное и инициализированное количество библиотек равно "<<biblio::howmanybib();
//блок4
/* выдача информации о начальном содержании общей библиотеки и ввод новых книг в общую библиотеку
внимание! объекты еще не созданы, но статические переменные уже созданы и инициализированы*/
biblio::dopolnenie();
//блок5
/* определение набора объектов - библиотек bib
исходные данные по первой и третьей библиотекам, которые содержат одинаковые данные передаются через 2-ой конструктор из созданного рабочего массива rabkng; данные по остальным библиотекам вводятся с помощью 1-го конструктора в диалоге
*/
biblio bib[KOLBIB]={biblio(n,rabkng),biblio(),biblio(n,rabkng)};
//блок6
/* вывод для проверки содержания библиотек через открытую член-функции вывода текстов книг библиотек*/
clrscr();
cout<<"\n ИСХОДНЫЕ ДАННЫЕ ПО "<<KOLBIB<<"-М БИБЛИОТЕКАМ \n";
for ( int i=0;i<KOLBIB;i++)
{
bib[i].vivod();
cout<<"\n Нажмите любую клавишу";
getch();
}
//блок7
cout<<"\n ИСХОДНЫЕ ДАННЫЕ ОБЩЕЙ БИБЛИОТЕКИ \n ";
biblio::vivodcom();
cout<<"\n Нажмите любую клавишу";
getch();
clrscr();
//блок8
/*m - число созданных объектов определяется по статической функции howmanybib*/
int m=biblio::howmanybib();
/* вычисление для каждого объекта максимальной длины книги и нахождение номера nomer объекта с максимальной длиной c помощью открытой функции maxdlina;
функция maxdlina в случае отcутствия параметров (по умолчанию k=0) вычисляет максимальную длину книги заданной библиотеки
*/
int max=bib[0].maxdlina(); int nomer=1;
for (i=1;i<m;i++)
if (max<bib[i].maxdlina()) { max=bib[i].maxdlina(); nomer=i+1;}
/* далее выполняется вызов той же функции maxdlina, но с параметром k=1 для библиотеки с вычисленным номером nomer , но для определения переменной
nomerkn - номера книги максимального размера в библиотеке c заданным номером nomer
*/
int nomerkn=bib[nomer-1].maxdlina(1);
//блок9
/* аналогичный поиск максимальной длины и номера книги, но в статическом массиве - общей библиотеке
c помощью функции maxdlob; цикл по объектам не выполняется ,так как массив единый на все объекты и не тебуется указывать номер объекта
*/
int max1=biblio::maxdlob();
/* далее выполняется вызов той же функции maxdlob, но с параметром k=1 для вычисления nomerkn1 - номера книги максимального размера в общей библиотеке common
*/
int nomerkn1=biblio::maxdlob(1);
clrscr();
//блок10
/* определение в какой библиотеке находится книга с максимальной длиной: в общей билиотеке или в одной из других библиотек-объектах*/
if (max>max1)
{
//блок11
/* выдача содержимого библиотеки с номером nomer, которая содержит книгу с номером nomerkn с максимальной длиной*/
cout<<"\n содержимое библиотеки с номером "<<nomer<<" ,которая содержит книгу с номером "<<nomerkn<<" с максимальной длиной \n";
bib[nomer-1].vivod();
cout<<"\n Нажмите любую клавишу";
getch();
}
else
{
//блок12
/*выдача содержимого общей библиотеки , которая содержит книгу с номером nomerkn1 с максимальной длиной*/
cout<<"\n содержимое общей библиотеки, которая содержит книгу с номером "<<nomerkn1<<" с максимальной длиной \n";
biblio::vivodcom();
cout<<"\n Нажмите любую клавишу";
getch();
};
//блок13
//ввод заголовка для записи в книгу с максимальной длиной
char zagolovok[DLINA];
cout<<"\n введите заголовок для записи в книгу с максимальной длиной\n";
vcontrol(zagolovok);
/* выполнение функций change или changob записи заголовка в книгу с максимальной длиной в одну из вычисленных библиотек, где находятся книга с максимальной длиной, или в общую библиотеку (статический массив соmmon)*/
//блок14
if (max>max1)
{
// блок15
/* выполнение открытой функции change записи заголовка в книгу с максимальной длиной соответствующей библиотеки
фактический параметр nomer - номер библиотеки с книгой максимальной длины
фактический параметр nomerkn - номер книги с максимальной длиной в этой библиотеке
рабочая переменая zagolovok для переписываемого заголовка
*/
bib[nomer-1].change(zagolovok,nomerkn);
/*выдача после изменения содержимого библиотеки с номером nomer, которая содержит книгу с номером nomerkn с максимальной длиной после изменения*/
cout<<"\n после записи заголовка содержимое библиотеки с номером "<<nomer<< ",которая содержит книгу с номером "<<nomerkn<<" с максимальной длиной \n";
bib[nomer-1].vivod();
}
else
//блок16
/* выполнение статической функции changeob записи введенного заголовка в книгу с максимальной длиной в общую библиотеку common*/
{biblio::changeob(zagolovok,nomerkn1);
/*выдача после изменения содержимого общей библиотеки, которая содержит книгу с номером nomerkn1 с максимальной длиной*/
cout<<"\n после записи заголовка содержимое общей библиотеки,которая содержит книгу с номером "<<nomerkn1<<" с максимальной длиной\n";
biblio::vivodcom();
};
cout<<"\n Нажмите любую клавишу -выход ";
getch();
return 0;
} // конец основной программы
/*1-ый конструктор без параметров для ввода всех данных по объекту-библиотеке*/
biblio::biblio()
{ numbib=++num;
cout<<"\n введите действительное количество книг в "<<numbib<<"-ой библиотеке ";
cin >>n;
for (int j=0;j<n;j++)
{char rab[100];
do
{ cout<<" введите текст, не более "<<DLINA-1<<" символов \n";
gets(rab);
// проверка длины текста; она должна быть меньше величины DLINA-1
if (strlen(rab)>=DLINA) cout<<"длина текста превышает максимальную "<<DLINA-1<<"\n";
}while (strlen(rab)>=DLINA);
strcpy(kniga[j],rab);
}
// конец цикла ввода текущей библиотеки
}// конец 1-го конструктора
/*2-ой конструктор с параметром по количеству книг и тексту книг в текущей библиотеке*/
biblio::biblio(int k,char x[][DLINA])
{numbib=++num;
cout<<"\n выполнено автоматическое заполнение библиотеки с номером "<<numbib;
n=k;
for (int j=0;j<n;j++)
strcpy(kniga[j],x[j]);
}
// определение функции-члена вывода исходных данных библиотеки
void biblio::vivod()
{ cout<<"\n номер библиотеки = "<<numbib;
cout<<"\n количество книг в библиотеке = "<<n<<"\n";
for(int i=0;i<n;i++)
{ cout<<i+1<<" -ая книга "<<kniga[i]<<"\n";}
}// конец функции вывода
/*определение статической функции-члена вывода исходных данных общей библиотеки*/
void biblio::vivodcom()
{ cout<<"\n содержимое общей библиотеки ";
cout<<"\n количество книг в библиотеке = "<<numcommon<<"n";
for(int i=0;i<numcommon;i++)
{ cout<<i+1<<" -ая книга "<<common[i]<<"\n";}
}// конец функции вывода
/*статическая член-функция вывода общих книг библиотек и дополнения новых общих книг*/
void biblio::dopolnenie()
{ //nd-число дополняемых книг при вводе
// numcommon - число общих книг в статическом массиве common
int nd;
cout<< "\n начальные исходные данные по общей библиотеке (заданные в программе):\n";
for (int i=0;i<numcommon;i++)
{ cout<<common[i]<<"\n";}
cout<<"\введите число дополняемых книг для общей библиотеки \n";
cin>>nd;
if (nd!=0) for(i=0;i<nd;i++) vcontrol(common[numcommon+i]);
numcommon=numcommon+nd;
cout<<"\n число книг в общей библиотеке после дополнения равно "<<numcommon<<"\n";
for (i=0;i<numcommon;i++)
cout<<i+1<<"-ая книга "<<common[i]<<"\n";
} //конец функции dopolnenie
/* определение член-функции класса нахождения книги максимального размера*/
int biblio::maxdlina(int k)
{
/*к =1 - признак того, ответ будет представлять номер предложения с максимальной длиной
к=0 - признак того, что ответ будет представлять максимальную длину
j - вычисляемое значение через fmax номера максимальной длины*/
int j;
/* обращение к закрытой функции вычисления максимальной длины книги*/
int max=fmax(kniga,&j,n);
return (k==0) ? max:j;
}
/*определение статической член-функции класса нахождения книги максимальной длины в общем статическом массиве common- общей библиотеке*/
int biblio::maxdlob(int k)
{
/*к =1 - признак того, ответ будет представлять номер предложения с максимальной длиной
к=0 - признак того, что ответ будет представлять максимальную длину
j - вычисляемое значение через fmax номера максимальной длины*/
int j;
/* обращение к закрытой функции вычисления максимальной длины книги*/
int max=fmax(common,&j,numcommon);
return (k==0) ? max:j;
}
/*определение член-функции change записи в начало книги с максимальной длиной в библиотеке, где находится эта книга, заданного заголовка
формальный параметр zagolovok задает имя встраиваемого заголовка
формальный параметр n задает номер книги в библиотеке*/
void biblio::change(char zagolovok[],int n)
{ char rab[DLINA];
int dlina=DLINA-1; // максимальная длина без учета окончания строки
/* проверка суммарной длины заголовка и текста книги на превышение максимальной длины текста*/
if ((strlen(zagolovok)+strlen(kniga[n-1]))>dlina)
{ cout<<"\n длина текста с заголовком превышает максимально заданную длину книги "<<DLINA-1<<" \n cодержимое книги будет усечено \n";
strcpy(rab,zagolovok); strncat(rab,kniga[n-1],dlina-strlen(zagolovok));
}
else
{ strcpy(rab,zagolovok);strcat(rab,kniga[n-1]);}
strcpy(kniga[n-1],rab);
}
/* определение член-функции записи changeob в начало книги с максимальной длиной в общей библиотеке, где находится эта книга, заданного заголовка
формальный параметр zagolovok задает имя встраиваемого заголовка
формальный параметр n задает номер книги в общей библиотеке common*/
void biblio::changeob(char zagolovok[],int n)
{ char rab[DLINA];
int dlina=DLINA-1; // максимальная длина без учета окончания строки
/*проверка суммарной длины заголовка и текста книги на превышение максимальной длины текста*/
if ((strlen(zagolovok)+strlen(common[n-1]))>dlina)
{ cout<<"\n длина текста с заголовком превышает максимально заданную длину книги "<<DLINA-1<<" cодержимое книги будет усечено \n";
strcpy(rab,zagolovok); strncat(rab,common[n-1],dlina-strlen(zagolovok));
}
else
{ strcpy(rab,zagolovok);strcat(rab,common[n-1]);}
strcpy(common[n-1],rab);
}
/* функция ввода строки с контролем на превышение максимально допустимой длины, заданной константой DLINA*/
void vcontrol(char x[])
{
char rab[100];
do
{ cout<<" введите текст, не более "<<DLINA-1<<" символов \n";
gets(rab);
/*проверка длины текста; она должна быть меньше величины DLINA-1*/
if (strlen(rab)>=DLINA) cout<<"\n длина текста превышает максимальную "<<DLINA-1<<"\n";
}while (strlen(rab)>=DLINA);
strcpy(x,rab);
}
Литература
Дата: 2019-03-05, просмотров: 222.