Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
Топ:
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Комплексной системы оценки состояния охраны труда на производственном объекте (КСОТ-П): Цели и задачи Комплексной системы оценки состояния охраны труда и определению факторов рисков по охране труда...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Интересное:
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Дисциплины:
2022-10-10 | 27 |
5.00
из
|
Заказать работу |
|
|
{ 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!