Текст программы по 3 ей теме
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

#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);

}

 

 

 Литература

 

  1. Березин Б.И., Березин С.Б. Начальный курс С и С++ - Москва.: Диалог-МИФИ, 2001
  2. Лафоре Р. Объектно-ориентированное программирование в Си++ - Спб.:Питер, 2004
  3. Павловская Т.А. С./С++ Программирование на языке высокого уровня – Спб.:Питер, 2004
  4. Подбельский В.В. Язык Си++ - Москва.: Финансы и статистика”, 1996

 


Дата: 2019-03-05, просмотров: 222.