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

 

#include <stdio.h>

#include <string.h>

#include <iostream.h>

#include <conio.h>

#define KOLBIB 10

#define KOLKNIG 10

#define DLINA 10

class biblio

 

{/* kniga -символьный массив по книгам одной библиотеки; одна строка соответствует одной книге

 KOLKNIG- максимальное количество книг в одной библиотеке

 n- действительное количество книг в одной библиотеке, задаваемое при исполнении

 DLINA -максимальная длина книги */

 char kniga[KOLKNIG][DLINA];

 int n;

 public:

//объявление функции ввода, определенной вне класса

 void vvod(char rab[KOLKNIG][DLINA],int kol1);

//объявление функции вывода, определенной вне класса

void vivod();

/* объявление функции для нахождения номера книги с максимальной длиной или значения максимальной длины*/

int maxdlina(int k=0);

/*объявление функции change вставки заголовка в начало книги с заданным номером*/

void change(char[],int);

 }; // конец описания класса библиотеки

/* объявление функции ввода строки с контролем на превышение максимально допустимой длины, заданной константой DLINA*/

void vcontrol(char x[]);

// начало главной функции

int main()

{ clrscr();

/* определение набора объектов - библиотек bib; набор содержит максимум KOLBIB библиотек*/

biblio bib[KOLBIB];

/*m - действительное количество библиотек, используемых при выполнении программы*/

int m;

cout<<"\n введите действительное количество библиотек (меньше "<<KOLBIB+1<< ")= ";

cin>>m;

for (int i=0;i<m;i++)

{

/* raboch - рабочая область ввода книг текущей библиотеки

ввод действительного количества книг n в текущей библиотеке

ввод одной библиотеки в рабочую область raboch и передача через открытую функцию ввода в текущий объект - библиотеку

*/

char raboch[KOLKNIG][DLINA];

int n;

cout<<"\n введите действительное количество книг в "<<i+1<<"-ой библиотеке (меньше "<<KOLKNIG+1<<" )=";

                   cin >>n;

                   for (int j=0;j<n;j++)

                   vcontrol(raboch[j]);

// конец цикла ввода текущей библиотеки

// передача рабочего массива в текущую библиотеку-объект

bib[i].vvod(raboch,n);

}

// вывод для проверки через открытую функцию текстов текущей библиотеки

clrscr();

cout<<"\n ИСХОДНЫЕ ДАННЫЕ БИБЛИОТЕКИ \n";

for ( i=0;i<m;i++)

{

cout<<"\n номер библиотеки равен "<<i+1;

bib[i].vivod();

}

cout<<"\n Нажмите любую клавишу \n";

getch();

/* вычисление для каждого объекта максимальной длины книги и нахождение номера nomer объекта с максимальной длиной c помощью открытой функции maxdlina;

 функция maxdlin в случае от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 - номера книги максимального размера в указанной библиотеке

*/

int nomerkn=bib[nomer-1].maxdlina(1);

clrscr();

/* выдача содержимого библиотеки с номером nomer, которая содержит книгу с номером nomerkn с максимальной длиной*/

cout<<"\n содержимое библиотеки с номером "<<nomer<<" ,которая содержит книгу с номером "<<nomerkn<<" с максимальной длиной";

bib[nomer-1].vivod();

cout<<"\n Нажмите любую клавишу";

getch();

/*ввод заголовка, который должен быть записан в библиотеку с номер nomer, в которой записана книга с номер nomerkn, с максимальной длиной*/

char zagolovok[100];

cout<<"\n введите заголовок для записи в книгу с максимальной длиной\n";

vcontrol(zagolovok);

/* выполнение открытой функции change ввода заголовка в книгу с максимальной длиной соответствующей библиотеки

 фактический параметр nomer - номер библиотеки с книгой максимальной длины

 фактический параметр nomerkn - номер книги с максимальной длиной в этой библиотеке

 рабочая переменая zagolovok для вставляемого заголовка

*/

/* выполнение функции change записи введенного заголовка в книгу с максимальной длиной*/

bib[nomer-1].change(zagolovok,nomerkn);

/* выдача после изменения содержимого библиотеки с номером nomer, которая содержит книгу с номером nomerkn с максимальной длиной после изменения*/

cout<<"\n после записи заголовка содержимое библиотеки с номером "<<nomer<< ",которая содержит книгу с номером "<<nomerkn<<" с максимальной длиной";

bib[nomer-1].vivod();

return 0;

} // конец основной программы

// определение членов-функций класса biblio

/*определение член-функции ввода исходных данных - перепись внешнего символьного массива в закрытый массив KNIGA*/

void biblio::vvod(char rab[KOLKNIG][DLINA],int kol1)

{ for (int i=0;i<kol1;i++)

       strcpy(kniga[i],rab[i]);

       n=kol1;

} //конец функции ввода

/*описание член-функции класса вывода содержимого объекта класса-библиотеки*/

void biblio::vivod()

 {cout<<"\n количество книг в библиотеке = "<<n<<"\n";

for(int i=0;i<n;i++)

{ cout<<"\n"<<i+1<<" -ая книга "<<kniga[i]<<"\n";}

}// конец функции вывода

//описание функции класса нахождения книги максимального размера

int biblio::maxdlina(int k)

{ /* к =1 - признак того, что ответ будет представлять номер предложения с махсимальной длиной*/

/* к=0 - признак того, что ответ будет представлять максимальную длину*/

int max=strlen(kniga[0]); int j=1;

for (int i=1;i<n;i++) if (max<strlen(kniga[i])) {max=strlen(kniga[i]);j=i+1;}

return (k==0) ? max:j;

 }

/* описание функции записи в начало книги с максимальной длиной в библиотеке, где находится эта книга заданного заголовка

 формальный параметр 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<<" cодержимое книги будет усечено";

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

  }

/*функция ввода строки с контролем на превышение максимально допустимой длины, заданной константой 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);

}

3.2. Пример алгоритма и текста программы типового задания по второй теме

 

Условие задачи 2 соответствует 2 -ой теме пакета заданий из второй части методических указаний 

.При этом отличие от первой задачи состоит в следующем:

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

а/ конструктор, который переписывает символьный массив, определенный в виде фактического параметра в объект-библиотеку. Этот массив обязательно должен быть введен до определения объекта.

б/ конструктор без параметров, который вызывается для инициализации объектов, для которых параметры не задаются или указывается конструктор без параметров.

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

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

4. Для получения информации о номере обрабатываемого объекта используется глобальная переменная ibib – номер библиотеки.

 


                            Блок-схема программы

 



Текст программы по 2-ой теме


#include <stdio.h>

#include <string.h>

#include <iostream.h>

#include <conio.h>

#define KOLBIB 4     /*отличие от 1-го примера, где это количество может меняться в пределах этой величины;

в этой задаче это число будет постоянным*/

#define KOLKNIG 10

#define DLINA 10

// ibib - глобальная переменная, представляющая номер библиотеки

int ibib=0;

// описание класса библиотеки class biblio

{/*kniga -символьный массив по книгам одной библиотеки; одна строка соответствует одной книге*/

// n- действительное количество книг в одной библиотеке

// KOLKNIG- максимальное количество книг в одной библиотеке

// DLINA -максимальная длина книги

 char kniga[KOLKNIG][DLINA];

 int n;

 public:

/*объявление 1-го конструктора без параметров для ввода всех данных по библиотеке, определенный вне описания класса*/

biblio();

/*объявление 2-ого конструктора для ввода данных с параметрами: количеству книг и символьный массив, содержащий текст этих книг*/

biblio(int,char[][DLINA]);

/*объявление функции вывода без параметров содержимого книг объекта-библиотеки*/

void vivod();

// объявление функции для нахождения книги с максимальной длиной

int maxdlina(int k=0);

/*объявление функции change вставки заголовка в начало книги с заданным номером*/

void change(char[],int);

 }; // конец описания класса библиотеки

// функция ввода строки с контролем по максимальной длине

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

}

// главная функция

int main()

{ clrscr();

/* ввод информации по одинаковым библиотекам, содержание которых абсолютно одинаково; эта информация вводится в один рабочий массив, а далее с помощью 1-го конструктора переписывается в соответствующие объекты-библиотеки

 rab -рабочий массив для текста книг, которые содержатся в одинаковых библиотеках

 n- действительное количество книг в одинаковых библиотеках*/

char rab[KOLKNIG][DLINA];

int n;

/* ввод рабочего массива текста книг, который переписывается во все одинаковые библиотеки с помощью 2-го конструктора с 2-мя параметрами*/

cout<<"\nСколько книг имеется в одинаковых библиотеках ? ";

cin >>n;

// ввод n строк: каждая вводимая строка соответствует одной книге

for (int j=0;j<n;j++)

vcontrol(rab[j]);

// определение набора объектов - библиотек bib

/*исходные данные по первой и третьей библиотекам, которые содержат одинаковые данные передаются через конструктор из рабочего массива; данные по остальным библиотекам вводятся по конструкторам без параметров*/

biblio bib[KOLBIB]={biblio(n,rab),biblio(),biblio(n,rab)};

// вывод для проверки через открытую функцию текстов книг библиотек

clrscr();

cout<<"\n ИСХОДНЫЕ ДАННЫЕ БИБЛИОТЕКИ \n";

cout<<"\n количество библиотек равно "<<ibib;

for ( int i=0;i<ibib;i++)

{ cout<<"\nномер библиотеки "<<i+1;

bib[i].vivod();

cout<<"\n Нажмите любую клавишу \n";

getch();

}

getch();

/* вычисление для каждого объекта максимальной длины книги и нахождение

 номера nomer объекта с максимальной длиной c помощью открытой функции maxdlina;*/

/*функция maxdlin в случае отcутвия параметров (по умолчанию k=0) вычисляет максимальную длину книги заданной библиотеки*/

int max=bib[0].maxdlina(); int nomer=1;

for (i=1;i<ibib;i++)

if (max<bib[i].maxdlina()) { max=bib[i].maxdlina(); nomer=i+1;}

/* далее выполняется вызов той же функции maxdlina, но с параметром k=1 для

 библиотеки с вычисленным номером nomer , но для определения переменной

nomerkn - номера книги максимального размера*/

int nomerkn=bib[nomer-1].maxdlina(1);

/* ввод заголовка, который должен быть записан в книгу с максимальной длиной

 рабочая переменая zagolovok для вставляемого заголовка*/

char zagolovok[DLINA];

cout<<"\n введите имя вставляемого заголовка для книги с номером "<<nomerkn<<"\n из библиотеки с номером "<<nomer<<"\n";

vcontrol(zagolovok);

/*выполнение открытой функции change записи заголовка в книгу с максимальной длиной соответствующей библиотеки

 фактический параметр nomer - номер библиотеки с книгой максимальной длины

 фактический параметр nomerkn - номер книги с максимальной длиной в этой библиотеке*/

cout<<"\n содержание книг библиотеки с номером "<<nomer<< " до изменения";

bib[nomer-1].vivod();

bib[nomer-1].change(zagolovok,nomerkn);

cout<<"\n содержание книг библиотеки с номером "<<nomer<< " после вставки заголовка";

bib[nomer-1].vivod();

cout<<"\n Нажмите любую клавишу выход\n";

getch();

return 0;

 } // конец главной функции

/*определение 1-го конструктора без параметров для ввода всех данных по библиотеке*/

biblio::biblio()

{ ibib=ibib+1;

cout<<"\n введите действительное количество книг в "<<ibib<<"-ой библиотеке ";

cin >>n;

for (int j=0;j<n;j++)

  vcontrol(kniga[j]);

// конец цикла ввода текущей библиотеки

}// конец 1-го конструктора

/*определение 2-го конструктора с параметром по количеству книг и тексту книг в текущей библиотеке

 k - количество строк в переписываемом массиве строк x

 массив строк х переписывается в массив строк kniga */

biblio::biblio(int k,char x[][DLINA])

{ ibib=ibib+1;

cout<<"выполнено автоматическое заполнение библиотеки с номером "<<ibib;

n=k;

                   for (int j=0;j<n;j++)

                               strcpy(kniga[j],x[j]);

                   }

// конец цикла ввода текущей библиотеки

// конец 2-го конструктора

// определение член-функции вывода

void biblio::vivod()

 {cout<<"\n количество книг в библиотеке = "<<n;

for(int i=0;i<n;i++)

{ cout<<"\n"<<i+1<<" -ая книга "<<kniga[i];}

}// конец функции вывода

//описание член-функции класса нахождения книги максимального размера

int biblio::maxdlina(int k)

{ /* к =1 - признак того, ответ будет представлять номер предложения с махсимальной длиной

к=0 - признак того, что ответ будет представлять максимальную длину*/

    int max=strlen(kniga[0]); int j=1;

for (int i=1;i<n;i++) if (max<strlen(kniga[i])) {max=strlen(kniga[i]);j=i+1;}

return (k==0) ? max:j;

 }

/*описание функции записи в начало книги с максимальной длиной в библиотеке, где находится эта книга, заданного заголовка

формальный параметр 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);

  }

 

3.3. Пример алгоритма и текста программы типового задания по третьей теме

 

Условие задачи 3 соответствует 3 –ой теме пакета заданий из первой части методических указаний.

В данном задании требуется использовать статические величины и функции при создании и обработке объектов библиотек.

В соответствии с содержанием задачи были введены предположение, что в состав библиотеки входят книги следующего типа:

- разные книги, которые должны быть введены отдельно по каждому объекту-библиотеке;

- одинаковые книги, которые находятся в разных библиотеках; для ввода содержания этих книг можно ввести один раз эти книги, а далее автоматически переписать эти данные в те объекты, где они повторяются:

- книги, которые расположены в одной библиотеке, но к которым можно обращаться из других библиотек.

Для реализации такой структуры данных были введены следующие переменные.

1. Одинаковые данные по книгам разных библиотек вводятся в массив rabkn, который далее передается через конструктор в конкретные библиотеки;

2. Общая библиотека описывается как статический массив common. Действительный размер этой библиотеки является переменным и определяется значением статической величины numcommon.

3.  В состав объекта введен новый член-данных numbib, в котором записывается текущий номер  инициализированного объекта. Для этого используется значение статической переменной num, . Значение этой статической переменной увеличивается при выполнении каждого конструктора и фиксирует общее количество инициализированных объектов. Эта величина играет роль глобальной переменной ibib предыдущего примера.

4. Для решения указанной задачи использованы следующие статистические функции для работы со статистическими переменными.

А. функция dopolnenie, которая выдает информацию о содержании общей библиотеки common , инициализированной в начале программы, и дополняет содержимое этой общей библиотеки .

В. функция vivod com, которая выдает содержимое общей библиотеки.

С. функция maxdlob, которая определяют максимальный размер и номер книги максимального размера в общей библиотеке common; “ Эта функция аналогична функции maxdlina для обычных членов-данных объектов.

D/ функция changeob , которая вставляет заголовок в книгу общей библиотеки common.

E/ функция howmanybib для вывода количества инициализированных объектов-библиотек

G/ закрытая функция fmax , которая используется открытой функцией maxdlina и статической функцией maxdlob для статического массива common/

 




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