Использование датчика случайных чисел для формирования массива
В С++ есть функция int rand() возвращающая псевдослучайное число из диапазона 0..RAND_MAX=32767, описание функции находится в файле <stdlib.h>.
В общем случае псевдослучайное n определяется по формуле:
n = a + rand ( ) % b
, где a – величина сдвига (равна первому числу из требуемого диапазона последовательности целых чисел), b – масштабирующий коэффициент (равен ширине требуемого диапазона).
Пример.
#include<iostream.h>
#include<stdlib.h>
void main()
{
int array[100];
int n;
cout<<"\nEnter the size of array:";
cin>>n;
for(int i=0;i<n;i++)
{
array[ i ]=rand()%100-50;// диапазон значений от -50 до 50
cout<<array[ i ]<<"\n";
}
}
В этой программе используется перебор массива по одному элементу слева направо с шагом 1.
Приведенная программа генерирует появление одной и той же случайной последовательности. Рандомизация достигается путем использования инструкции
srand(time(NULL));
, где функция srand(), содержащаяся в файле stdlib.h, принимает в качестве аргумента текущее календарное время в секундах, это значение преобразуется в беззнаковое целое и используется как начальное значение в генераторе случайных чисел. Прототип функции находится в файле time.h.
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
void main()
{
int array[100];
int n;
cout<<"\nEnter the size of array:";
cin>>n;
srand(time(NULL));
for(int i=0;i<n;i++)
{
array[ i ]=-5+rand()%10; // диапазон значений от -5 до 5
cout<<array[ i ]<<"\n";
}
}
Многомерные массивы
Многомерные массивы описываются как массивы массивов. Например:
int d2[10] [20]; //массив из десяти массивов по 20 целых
Многомерные массивы могут быть инициализированы:
int ia [2][3] = {
{0,1,2},
(3,4,5}
};
int ib[2][3] = {0,1,2,3,4,5};
int ic[2] [3]= { {1}, {3} }; //инициализирует только первые элементы каждой //строки, остальные – 0
int id[2][3] = {1,2,3,4}; //два последних элемента второй строки – 0
При обращении к элементам многомерных массивов необходимо использовать индексацию для каждого измерения.
В программных кодах высокого уровня использования многомерных массивов надо избегать. Лучше пользоваться типом vector из стандартной библиотеки С++.
Структуры С+
В реальных задачах информация, которую требуется обрабатывать, может иметь достаточно сложную структуру. Для ее адекватного представления используются типы данных, построенные на основе простых типов данных, массивов и указателей. Язык С++ позволяет программисту определять свои типы данных и правила работы с ними.
Структура – это определяемый пользователем тип данных; объявление структуры служит для того, чтобы определить свойства создаваемого типа данных. После того как тип определен, можно создавать переменные этого типа.
В отличие от массива, все элементы которого однотипны, структура может содержать элементы различных типов, т.о., структура – набор элементов произвольных типов. Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры.
В языке С++ структура является видом класса и обладает всеми его свойствами
Структуры определяются:
struct [имя типа]
{
тип_1 элемент_1;
тип_2 элемент_2;
…
} [список описателей];
Т.о. возможно следующее объявление структуры:
#include <iostream.h>
Void main()
{
Struct address
{
char name[10];
char street[30];
char town[10];
long number;
} my={"Petrov", "Green Street","Moscow",33};
}
Такая запись определяет новый тип address, НО вместе с тем и инициализирует ее поля (значения ее элементов перечисляются в фигурных скобках в порядке их описания).
Рассмотрим пример.
#include <iostream.h>
#include <string.h>// используется функция strcpy()
// объявление структуры
Struct MYSTRUCTURE
{
char sName[100];
int iAge;
};
/*Это означает, что MYSTRUCTURE состоит из строки с именем sName и целого с именем iAge. sName и iAge называются элементами данных структуры.*/
/* Код в main() объявляет переменную с именем MyStructure типа MYSTRUCTURE: */
Void main()
{
MYSTRUCTURE MyStructure;
/*Обратите внимание, что по традиции имя переменной составлено из символов нижнего регистра или в нем смешаны символы нижнего и верхнего регистров, MyStructure, но в имени типа структуры используются только символы верхнего регистра, как, например, в MYSTRUCTURE. */
strcpy (MyStructure.sName, "Andy" ); /*функция strcpy() копирует строку 'Andy' в элемент данных MyStructure.sName */
/*Следующий оператор присваивает значение 13 элементу данных iAge cтруктуры*/
MyStructure.iAge = 13;
cout << "My name is ";
cout << MyStructure.sName;
cout << " and I am ";
cout << MyStructure.iAge;
cout << " years old." << endl;
}
Результат работы программы:
My name is Andy and I am 13 years old.
Тема: Классы в С++
Конструкторы и деструкторы
Переменные-члены класса не могут получить начальные значения в определении класса, но, как и обычные переменные должны быть инициализированы. Для этой цели и служит конструктор.
Для конструктора всегда выполняются следующие правила:
· конструктор никогда не вызывается явно, а по своему назначению используется в основном для инициализации полей данных при создании объекта;
· конструктор автоматически вызывается при создании объекта класса;
· имя конструктора совпадает с именем класса;
· от других собственных функций класса конструктор отличается тем, что не имеет возвращаемого значения (даже типа void) – результатом выполнения конструктора является объект;
· конструктор может иметь параметры, а, следовательно, в классе можно определить несколько конструкторов;
· конструктор объекта можно не объявлять, компилятор сам снабдит такой объект стандартными конструктором (и деструктором), стандартный конструктор не принимает аргументов и (вместе со стандартным деструктором) ничего не делает.
· важно помнить, что при наличии конструктора, созданного программистом, компилятор не будет создавать свой, но если созданный конструктор получает в виде параметра какое-либо значение, а при инициализации объекта оно не передается, то произойдет ошибка компиляции.
Объявив конструктор необходимо объявить и деструктор. Деструкторы удаляют из памяти отработавшие объекты и освобождают выделенную для них память. Правила деструктора:
· деструктору присваивается имя класса с символом тильды «~» впереди;
· деструкторы не имеет параметров (не принимают аргументов) и не возвращают значений;
· должен быть открытым (public) методом;
· никогда не вызывается явно, вызывается автоматически для каждого объекта при выходе из области видимости объекта;
· если деструктор не определен в классе явно, то он создается компилятором автоматически, по умолчанию освобождая память, занимаемую объектом.
#include <iostream>
class Car
{
public:
Car(unsigned int initialYear);
~Car();
unsigned int GetYear( );
void SetYear (unsigned int Year);
void Start( );
private:
unsigned int itsYear;
};
using namespace std;
Car::Car(unsigned int initialYear)
{
itsYear=initialYear;
}
Car::~Car ( ) { }
int unsigned Car::GetYear ( )
{
return itsYear;
}
void Car::SetYear (unsigned int Year)
{
itsYear=Year;
}
void Car::Start ()
{
cout<<"Forward!!!\n";
}
int main( )
{
unsigned int Old;
Car myZaparozec(19);
Old=myZaparozec.GetYear ( );
cout<<"The year back to my machine was "<<Old<<" years"<<endl;
myZaparozec.SetYear (20);
Old=myZaparozec.GetYear ( );
cout<<"Now to my machine "<<Old<<" years"<<endl;
myZaparozec.Start ();
return 0;
}
[1] С++ не имеет встроенных средств ввода/вывода подобно другим языкам. Даже простейший исходный текст программы располагается в нескольких файлах: например, файл iostream является заголовочным файлом, в котором на языке С++ содержится описание стандартных средств ввода/вывода, в частности консольных потоков cin и cout. Эти потоки в терминах С++ являются объектами классов.
[2] Символ << называют так же операцией помещения в поток.
[4] В прототипе функции имена параметров не обязательны и имеет право существовать следующий вариант объявления: long myFunc (int = 21);
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|