Demochar::demochar(int dl, int min, int max) — КиберПедия 

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Demochar::demochar(int dl, int min, int max)

2022-10-10 27
Demochar::demochar(int dl, int min, int max) 0.00 из 5.00 0 оценок
Заказать работу

{ srand((unsigned) time(NULL));

//!!! Цикл для формирования символьной строки с помощью ГСЗ

// Здесь используется автоматическое преобразование значения

// типа int в значение типа char

for(int i=0; i<dl; i++) st[i]=rand()%(max-min+1)+min;

st[dl]='\0';

cout <<"GSZ stroka:"<< st << endl;

}

// Определение функции-члена класса, которая вычисляет длину

// переменной-члена st

Int demochar::length()

{ int kl=0;

while (st[kl]!='\0') kl++;

return kl; 

}

Int main()

{ int m;

cout <<"Vvedite 0 - GSZ ili drugoe chislo "

<< "dlya vvoda s klaviaturi:"; cin >> m;

   

if (m==0)

  { cout <<"Regim GSZ:"<< endl;

      int dls,min,max;

      bool fl=false;

      do { cout <<"Vvedite dlinu stroki:"; cin >> dls;

      if (dls>=dlina)

      { cout <<"Dlina vvedena nepravilno!"<< endl;

 fl=true;}

      else fl=false; }

      while (fl);

          

cout <<"VVEDITE min,max (ot 65 do 90):";

cin >> min >> max;

      if (max<min) {int prom=min; min=max; max=prom;}

      demochar ch(dls,min,max);}

else

  {cout <<"Regim vvoda s klaviaturi:"<< endl;

 demochar ch;

   cout <<"Dlina vvedennoj stroki = "<< ch.length()

<<endl;}

return 0;

}

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

В случае выбора режима формирования строки с использованием ГСЗ необходимо будет ввести значение длины строки и диапазон кодов символов.

!!! Отметим, что любой член класса может напрямую обращаться к другому члену класса, а потому функция length () “видит” строку st, а в 1-ом конструкторе идет обращение к функции length ().

Был получен следующий результат при выполнении программы с использованием генератора случайных чисел:

 

 

Пример реализации класса для организации обработки одномерного массива целочисленных значений.

В программе определяется класс int_array, в котором предусмотрены два явных конструктора, соответственно для обеспечения ввода целочисленных значений с клавиатуры (1-ый конструктор) и для формирования одномерного целочисленного массива с использованием генератора случайных значений (2-й конструктор).

В классе int_array в качестве закрытых членов определяются поле kl_el для размещения фактического количества элементов в массиве и одномерный целочисленный массив a[max_kl]. Метод Input_kl_el() предназначен для обеспечения ввода значения поля kl_el. Метод Output() обеспечивает вывод значений элементов массива на экран. Для вычисления суммы элементов массива реализован метод Summa_el(), а для вычисления среднего арифметического среди всех элементов – SArifm_el(). Метод Sort() предназначен для формирования на основе исходного массива отсортированного по возрастанию массива. Метод Get_kl_el() обеспечивает доступ к закрытому (возвращает его значение) полю kl_el.

#include <iostream>

#include <stdlib.h>

#include <time.h>

using namespace std;

constintmax_kl=18;

 

classint_array {

public: 

int_array();             // Прототип 1-го конструктора

    int_array(int); // Прототип 2-го конструктора

voidInput_kl_el(); // Прототип функции для ввода 

                         // количества элементов массива

    voidOutput();         // Прототип функции для вывода массива

    intSumma_el(); // Прототип функции для вычисления

                                          // значения суммы элементов массива

    doubleSArifm_el(); // Прототип функции для вычисления

                         // знпчения среднего арифметического

    voidSort(int b[max_kl]); // Прототип функции сортировки

                          // массива

                  

    intGet_kl_el() {returnkl_el;} // Метод возвращает

// кол-воэлементов

 

private: intkl_el;

              int a[max_kl]; 

};

 

// Определение 1-го конструктора, обеспечивающего ввод

// с клавиатуры целочисленного массива (до 18 элементов)

int_array::int_array()

{  Input_kl_el();

    for(inti=0; i<kl_el; i++)

    { cout<< "Vvvedite " <<i<< " element: ";

    cin>> a[i]; }

}

 

// Определение 2-го конструктора, обеспечивающего генерацию

// c помощью ГСЗ целочисленного массива (до 18 элементов)

int_array::int_array(int prom)

{  Input_kl_el();

    intmin,max;

    cout<< "VVEDITE min,max: ";

    cin>> min >> max;

    if (max<min) {prom=min; min=max; max=prom;}

        

    srand((unsigned) time(NULL));

    for(inti=0; i<kl_el; i++) a[i]=rand()%(max-min+1)+min;

}

 

voidint_array::Input_kl_el()

{  boolfl=false;

    do { cout<< "Vveditekolichestvoelementovmassiva: ";

cin>>kl_el;

    if ((kl_el< 1) || (kl_el>max_kl))

                       { cout<< "Oshibka v kolichestve"

<<" elementovmassiva!!!" <<endl;

              fl=true;}

              elsefl=false; }

    while (fl);

}

 

voidint_array::Output()  // Метод класса выводит массив на экран

{      

    for(inti=0; i<kl_el; i++) cout<< a[i] << "; ";

    cout<<endl;

}

 

intint_array::Summa_el()

{

    int sum=0;

    for(inti=0; i<kl_el; i++) sum+=a[i];

    return sum;

}

 

doubleint_array::SArifm_el()

{

    return (double)Summa_el()/kl_el;

}

 

voidint_array::Sort(int b[max_kl])

{ for (inti=0; i<kl_el; i++) b[i]=a[i];

 

// Сортировка с помощью прямого выбора

    for (int i=0; i < kl_el-1; i++)

              for (int j=i+1; j <kl_el; j++)

                       if (b[i]>b[j])

{int prom=b[i]; b[i]=b[j]; b[j]=prom;}

}

 

int main()

{  int x[max_kl];

 

intregim;

    cout<< "Vvedite 0 - GSZ ilidrugoechislodlyavvoda"

<< "s klaviaturi: ";

    cin>>regim;

        

if (regim==0)

              {      

cout<< "Regim GSZ ->" <<endl;

                       int_arraymassiv(0);

                       cout<< "Massiv -> "; massiv.Output();

                       cout<< "Summa elementov = " <<massiv.Summa_el()

<<endl;

                       cout<< "Sredneearifm = " <<massiv.SArifm_el()

<<endl;

                           

                       massiv.Sort(x);

                       for (inti=0; i<massiv.Get_kl_el(); i++)

cout<< x[i] << "; ";

                       cout<<endl;

              }

              else

              {      

cout<< "Regimvvoda s klaviaturi:" <<endl;

                       int_arraymassiv;

                       cout<< "Massiv -> "; massiv.Output();

                       cout<< "Summa elementov = " <<massiv.Summa_el()

<<endl;

                       cout<< "Sredneearifm = " <<massiv.SArifm_el()

<<endl;

                           

                       massiv.Sort(x);

                       for (inti=0; i<massiv.Get_kl_el(); i++)

cout<< x[i] << "; ";

                       cout<<endl;

              }

return 0;

}

 

В программе внутри функции main() в самом ее начале определяется массив int x[max_kl];, в котором в дальнейшем будут размещены отсортированные значения массива из объекта с именем massiv. Затем определяется целочисленная переменная intregim; и вводится ее значение. Если для переменной regim введено целочисленное значение 0, то выполняется та часть программы, в которой с помощью 2-го конструктора формируется объект massiv класса int_array, а иначе объект massiv класса int_array формируется с помощью 1-го конструктора.

 

Отметим, что в обоих случаях после формирования объекта massiv предусматривается выполнение следующих операций:

1) вывод сформированного целочисленного массива на экран с помощью метода Output();

2) вывод суммы элементов массива на экран методом Summa_el();

3) вывод среднего арифметического методом SArifm_el();

4) сортировка сформированного массива с помощью метода Sort();

5) вывод отсортированного массива на экран с использованием цикла for.

Инициализация объектов.

Ранее было показано, что в языке С++ значения переменных-членов класса можно непосредственно определять в теле явного конструктора. На самом же деле механизм вызова конструктора реализован в два этапа:

1) инициализация; 2) вызов тела конструктора.

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

#include<iostream>

usingnamespace std;

 

class avto {

public:

avto(): cena(18500),

        rashod(7.2) { name="FORD";} // 1-йконструктор

   

avto(int p): cena(p),

            rashod(8.5) {name="OPEL";} // 2-йконструктор

avto(int p, int c): cena(p+p*c/100),

       rashod(6.5) {name="SKODA";} // 3-йконструктор

~avto(){cout <<"Object destroy!!!"<< endl;} // деструктор

void Output() { cout << name << endl << cena << endl

  << rashod << endl; }

private: char* name;

      int cena;

      double rashod;

};

 

Int main()

{ avto A; A.Output();

cout << " ***** " << endl;

avto B(19500); B.Output();

cout << " ***** " << endl;

A=avto(15000,10); A.Output();

return 0;

}

Во всех 3 явных конструкторах значения полей cena и rashod определяются в инициализирующей части, а значение поля name – в теле конструктора.

 

 

 

12Указатель this.

Каждый объект класса содержит свой индивидуальный экземпляр полей класса. Методы же одного класса размещаются в памяти в единственном экземпляре и используются всеми соответствующими объектами совместно.

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

1. #include<iostream>

2. usingnamespace std;

3. class avto {

4. public: avto(): cena(19700),

5. rashod(5.7) { name="Honda"; }; //конструктор

6. ~avto() { cout <<"Object AVTO destroy!!! "<<this

7.<<" "<<sizeof(avto) << endl;} //деструктор

8. void SetRashod(double rashod) { this->rashod = rashod; }

9. void Output() { cout << "CENA -> "<< cena << endl <<

10."MARKA -> "<< name << endl <<

11."RASHOD ->"<< rashod << endl;}

12. private: char* name;

13.   int cena;

14.   double rashod;  };

16. int main()

17. { avto A;

18. A.SetRashod(7.1);

19. A.Output();

20. avto C;

21. C.Output();

22.return 0; }

В строках 3-15 включительно определяется класс avto. В строках 6-7 приводится определение явного деструктора, внутри которого с помощью указателя this на экран выводится адрес соответствующего объекта (в одном случае объекта A, а в другом случае – объекта C). В 8 строке определяется нестатический метод SetRashod (), в котором продемонстрировано как с помощью указателя this удается одновременно использовать одноименное поле класса и параметр метода.

 


Поделиться с друзьями:

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

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

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.049 с.