Використання псевдовипадкових чисел 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Використання псевдовипадкових чисел



Для генерації псевдовипадкових чисел можна використовувати функцію rand, яка повертає значення цілого типу в діапазоні від 0 до максимального значення типу int. Кожне звертання до функції у процесі виконання програми викликає генерування нового псевдовипадкового числа з рівномірним законом розподілу. Приклад використання функції rand:

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

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

     cout << rand() << endl;

}

 

Функція rand починає генерування значень з єдиного встановленого початкового значення. Тому при виконання програми кожного разу будемо отримувати одну і ту саму послідовність псевдовипадкових чисел. Для того, щоб послідовності чисел були різними, необхідно встановлювати їх початкове значення. Для цього можна використовувати функцію time, яка повертає поточний час.

Для генерації випадкових чисел в довільному діапазоні значень використовуються операцію %. Наприклад, необхідно отримати 10 чисел в діапазоні від 5 до 15:

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

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

     cout << 5 + rand() % 10 << endl;

}

 

Масиви

7.1. Властивості масивів в мові програмування С++

Масиви належать до складених (агрегованих) типів даних. За визначенням масив – це організована певним чином сукупність даних одного типу (елементів масиву). Основні властивості масивів в мові програмування С++:

1) масив займає неперервну ділянку оперативної пам'яті;

2) всі елементи масиву мають однаковий тип і спільне ім’я;

3) тип елементів масиву може бути довільним простим або складеним;

4) елементи масиву розташовані в пам'яті послідовно за порядком зростання індексів;

5) індекс першого елементу масиву завжди дорівнює нулю;

6) до елементів масиву можна звертатись за допомогою індексів і вказівників;

7) ім’я масиву є константним вказівником на його перший елемент;

8) масив може бути одновимірним і багатовимірним.

Одновимірні масиви

Одновимірний масив – це лінійна послідовність однотипних елементів. Такі масиви часто називають математичним терміном вектор. Кожен елемент масиву має свій порядковий номер (індекс), який визначає розташування цього елемента в масиві.

Як і звичайні змінні, масиви перед використанням необхідно явно оголошувати. Це виконується за допомогою такої синтаксичної конструкції:

 

тип_елементів ім’я_масиву [ кількість_елементів ];

 

тут тип елементів – довільний допустимий простий або складений тип, ім’я масиву – ідентифікатор, що відповідає правилам запису імен, квадратні дужки – обов’язкова ознака масиву, кількість елементів – константа чи константний вираз, що визначає розмірність даного масиву. Для кожного масиву компілятор виділяє неперервну ділянку пам'яті, обсяг якої дорівнює добутку

 

кількість_елементів × sizeof(тип_елементів)

 

При оголошенні масивів можна відразу виконувати ініціалізацію їх елементів. Застосовують дві форми ініціалізації: з зазначенням кількості елементів масиву і без зазначення кількості елементів масиву.

У першому випадку масив оголошується звичайним чином, після чого в фігурних дужках записують константні значення елементів масиву, починаючи від першого (тобто елемента з індексом нуль). При цьому кількість заданих значень не повинна перевищувати вказану розмірність масиву, але може бути меншою за неї – тоді для перших елементів масиву, для яких вказані значення, присвоюються ці значення, решті присвоюється нуль. Цю властивість мови програмування С++ зручно використовувати для присвоєння нульових значень елементам масиву.

 

int a[5] = { 1, 2, 3, 4, 5 }; // 1 2 3 4 5

int b[5] = { 1, 2, 3 };  // 1 2 3 0 0

int c[5] = { };          // 0 0 0 0 0

 

Якщо в оголошенні масиву виконується його повна ініціалізація, тобто вказані початкові значення для всіх елементів масиву, то кількість елементів масиву можна не опустити. Розмірність масиву визначається кількістю елементів – ініціалізаторів. Розмірність масиву, оголошеного без зазначення кількості елементів, можна визначити за допомогою операції sizeof:

 

кількість_елементів = sizeof(ім’я_масиву) / sizeof(тип_елементів)

 

Операція sizeof(ім’я_масиву) повертає розмір (обсяг в байтах) усієї ділянки пам'яті, яку займає масив, незалежно від того, наскільки він заповнений. Визначимо кількість елементів в масиві, оголошеному без зазначення його розмірності:

 

int a[] = { 1, 2, 3, 4, 5 };

int n = sizeof(a) / sizeof(int);

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

cout << a[i] << endl;

 

Елемент масиву є змінною, яка має тип, заданий в оголошенні масиву, і синтаксично може використовуватися у будь якому місці програми, де може бути записане дане такого типу. Звертання до елементу масиву виконується по його номеру (індексу) таким чином:

 

ім’я_масиву [ індекс_елемента ]

 

де індекс елемента може бути довільним виразом, який має значення цілого типу і задає порядковий номер елемента в масиві (нумерація починається з нуля). Компілятор не контролює відповідність значень індексів до розміру масиву. Некоректні звертання до елементів масиву можуть призвести до аварійного завершення роботи програми або краху системи.

Заповнити масив з 100 елементів цілими випадковими числами в діапазоні від 0 до 1000. Знайти найбільший елемент масиву і середнє значення елементів масиву.

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

const int NUM = 100; // кількість елементів масиву

const int MIN = 0; // мінімальне значення елементів масиву

const int MAX = 1000;// максимальне значення елементів масиву

int a[NUM], i, m;

double avg;

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

     a[i] = MIN + rand() % MAX;

for (i = 0, m = 0, avg = 0; i < NUM; ++i) {

     avg += a[i];

     if (a[i] > m)

           m = a[i];

}

avg /= NUM;

cout << "avg = " << avg << endl;

cout << "max = " << m << endl;

}

 

Заповнити масив з 10 елементів цілими випадковими числами від -10 до 10. Вивести на екран спочатку додатні елементи масиву, потім – від’ємні. Замінити від’ємні елементи масиву на їх модулі.

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

const int NUM = 10;

const int MIN = -10;

const int MAX = 10;

int a[NUM], i;

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

     a[i] = MIN + rand() % (MAX - MIN);

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

     if (a[i] >= 0)

           cout << a[i] << " ";

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

     if (a[i] < 0) {

           cout << a[i] << " ";

           a[i] = -a[i];

     }

cout << endl;

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

     cout << a[i] << " ";

}

 

Знайти кількість елементів масиву (у відсотках), більших середнього арифметичного. Масив заповнимо дійсними випадковими числами від 0 до 1.

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time (NULL)));

const int NUM = 1000;

double a[ NUM ], avg;

int i, n;

for (i = 0, avg = 0; i < NUM; ++i) {

     a[ i ] = (rand() % 1000) / 1000.;

     avg += a[ i ];

}

avg /= NUM;

cout << avg << endl;

for (i = 0, n = 0; i < NUM; ++i)

     if (a[ i ] > avg)

           n++;

cout << (double) n / NUM * 100 << endl;

}

 

Поміняти місцями максимальний і мінімальний елементи масиву.

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

const int N = 10;

int a[ N ], min, max, i, t;

for (i = 0, min = 0, max = 0; i < N; ++i) {

     a[ i ] = rand() % 10;

     if (a[ i ] > max) max = i;

     if (a[ i ] < min) min = i;

     cout << a[i] << " ";

}

cout << endl;

t = a[ min ];

a[ min ] = a[ max ];

a[ max ] = t;

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

     cout << a[i] << " ";

cout << endl;

}

 

Є послідовність цілих випадкових чисел в діапазоні від 0 до 9. Знайти кількість кожного з чисел, тобто кількість нулів, одиниць, двійок і так далі, в цьому масиві.

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

const int N = 1000; // кількість чисел

int a[ 10 ] = { }, i;

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

     a[ rand() % 10 ] ++;

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

     cout << i << " " << a[i] << endl;

}

 

В математиці, многочленом чи поліномом однієї змінної називається вираз вигляду

 

 

де сі є сталими коефіцієнтами (константами), а х – змінна.

Сума многочленів є многочленом. Степінь суми многочленів дорівнює максимуму степенів доданків:

 

Знайти значення полінома для довільного х і суму двох поліномів.

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

const int NMAX = 100;

double p1[ NMAX ] = { 1, 2, 3 };

double p2[ NMAX ] = { 2, 3, 4, 5, 6 };

double p3[ NMAX ] = { };

int np1 = 3;

int np2 = 5;

int np3, i;

double x, s;

x = 1.1;

for (i = 0, s = 0; i < np1; i++)

     s += p1[ i ] * pow(x, (double) i);

cout << s << endl;

for (i = 0, s = 0; i < np2; i++)

     s += p2[ i ] * pow(x, (double) i);

cout << s << endl;

np3 = np1 > np2? np1: np2;

for (i = 0; i < np3; i++) {

     p3[ i ] = p1[ i ] + p2[ i ];

     cout << p3[ i ] << " ";

}

for (i = 0, s = 0; i < np3; i++)

     s += p3[ i ] * pow(x, (double) i);

cout << endl << s << endl;

}

 

Вивести на екран таку послідовність чисел:

1

1 2

1 2 3

1 2 3 4

 

#include <iostream>

using namespace std;

int main() {

int i, j, n;

cin >> n; // кількість рядків

for (i = 1; i <= n; i++) {

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

           cout << j << " ";

     cout << endl;

}

}

Багатовимірні масиви

Мова С++ інтерпретує багатовимірний масив як масив масивів, тобто масив, елементами якого є масиви меншої вимірності. Матриця цілих чисел, яку оголошено таким чином:

 

int matr[ 10 ][ 5 ];

 

є масивом з десяти елементів, кожен з яких, в свою чергу, є одновимірним масивом з п’яти елементів, що мають цілий тип. Тобто, матриця складається з десяти рядків, в кожному з яких п’ять цілочислових елементів.

Для збереження цієї матриці в оперативній пам'яті буде виділено неперервну ділянку пам'яті обсягом 10 * 5 * sizeof(int) байтів. При цьому спочатку в пам'яті розташований перший рядок, після нього – другий, і так далі.

В оголошеннях багатовимірних масивів в окремих квадратних дужках вказується кількість елементів для кожного з вимірів. Багатовимірні масиви можна ініціалізувати в оголошеннях. Наприклад

 

#include <iostream>

using namespace std;

int main() {

int i, j, a[ 2 ][ 3 ] = { 1, 2, 3, 4, 5, 6 };

for (i = 0; i < 2; i++) {

     for (j = 0; j < 3; j++)

           cout << a[ i ][ j ] << " ";

     cout << endl;

}

}

 

В оголошеннях з ініціалізацією для багатовимірних масивів дозволено опускати розмірність найстаршого виміру. Оголошення масиву з попереднього прикладу можна записати так:

 

int a[ ][ 3 ] = { 1, 2, 3, 4, 5, 6 };

 

Кількість рядків матриці обчислюється як частка від ділення кількості даних у списку ініціалізації на відому кількість елементів в одному рядку матриці.

Ще один варіант виконання ініціалізації – використання такої додаткових фігурних дужок для виділення рядків даних. Як і для одновимірних масивів, ініціалізація може бути не повною. Елементам масиву без ініціалі заторів будуть присвоєні нульові значення.

 

int a[ 2 ][ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } };

int b[ 2 ][ 3 ] = { { 1, 2 }, { 4 } };

 

Для доступу до елементів багатовимірного масиву за допомогою індексної форми звертання в окремих квадратних дужках вказують значення індексів для кожного з вимірів.

Знайдемо суму елементів в кожному з рядків матриці і кожному стовпчику матриці, заповненої випадковими числами.

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

const int NROWS = 3; // кількість рядків

const int NCOLS = 4; // кількість стовпчиків

int a[ NROWS ][ NCOLS ];

int i, j, s;

for (i = 0; i < NROWS; i++) {

     for (j = 0; j < NCOLS; j++) {

           a[ i ][ j ] = rand() % 10;

     cout << a[ i ][ j ] << " ";

     }

     cout << endl;

}

// Сума елементів в кожному рядку

for (i = 0; i < NROWS; i++) {

     for (j = 0, s = 0; j < NCOLS; j++)

           s += a[ i ][ j ];

     cout << "Row # " << i << ": " << s << endl;

}

// Сума елементів в кожному стовпчику

for (i = 0; i < NCOLS; i++) {

     for (j = 0, s = 0; j < NROWS; j++)

           s += a[ j ][ i ];

     cout << "Col # " << i << ": " << s << endl;

}

}

 

В кінотеатрі 15 рядів по 12 крісел. Ряди поділені на 3 сектора: місця у 1 – 5 рядах коштують 10 гривень, 6 – 14 рядах – 20 гривень, 15 ряді – 100 гривень. Імовірність продати білет на місце в 1 – 5 ряді складає 0,8, на 6 – 14 ряді – 0,4, на 15 ряді – 0,2. Виконати імітаційне моделювання процесу продажу квитків. Знайти загальну вартість проданих квитків і вартість проданих квитків для кожного з секторів.

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

const int NROWS = 15; // кількість рядків

const int NCOLS = 12; // кількість стовпчиків

int a[ NROWS ][ NCOLS ];

int b[ NROWS ] = {

     10, 10, 10, 10, 10,

     20, 20, 20, 20, 20, 20, 20, 20, 20,

     100

};

double c[ NROWS ] = {

     0.8, 0.8, 0.8, 0.8, 0.8,

     0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4,

     0.2

};

int i, j, s;

// Заповнимо кінотеатр глядачами

for (i = 0; i < NROWS; i++) {

     for (j = 0; j < NCOLS; j++) {

           if (rand() % 10 < c[ i ] * 10)

                a[ i ][ j ] = 1;

           else

                a[ i ][ j ] = 0;

           cout << a[ i ][ j ] << " ";

     }

     cout << endl;

}

// Знайдемо вартість проданих квитків

for (i = 0, s = 0; i < NROWS; i++)

     for (j = 0; j < NCOLS; j++)

           s += a[ i ][ j ] * b[ i ];

cout << s << endl;

// Вартість проданих квитків по кожному з секторів

int sum[ 3 ] = { };

for (i = 0, s = 0; i < NROWS; i++)

     for (j = 0; j < NCOLS; j++)

           switch (i) {

                case 0: case 1: case 2: case 3: case 4:

                     sum[ 0 ] += a[ i ][ j ] * b[ i ]; break;

                case 5: case 6: case 7: case 8: case 9:

                case 10: case 11: case 12: case 13:

                     sum[ 1 ] += a[ i ][ j ] * b[ i ]; break;

           case 14:

                     sum[ 2 ] += a[ i ][ j ] * b[ i ]; break;

           }

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

     cout << i << ": " << sum[ i ] << endl;

}

Символьні рядки

Мова С++ не спеціального типу для оголошення символьних рядків, символьний рядок розглядається як особливий вид масиву символів. Елементи масиву мають тип char, значеннями є коди символів. Останнім символом рядка має бути нуль-символ (‘\0’), код якого дорівнює нулю. При оголошенні рядки можна ініціалізувати рядковими константами (записуються в подвійних лапках), при цьому останній нуль-символ додається автоматично. Якщо розмір масиву не заданий, для нього виділяється на один елемент більше кількості символів в рядку. Додатковий (останній) елемент зберігає нульовий символ – ознаку кінця рядка.

Створимо два рядка символів, виведемо їх на екран, знайдемо кількість символів в них.

 

#include <iostream>

#include <ctime>

using namespace std;

int main() {

srand(unsigned(time(NULL)));

char s1[ 20 ] = "Hello s1";

char s2[ ] = "Hello s2";

int i;

for (i = 0; s1[ i ]; i++)

     cout << s1[ i ];

cout << endl;

i = 0;

while (s2[ i ])

     cout << s2[ i++ ];

cout << endl;

// Кількість символів в рядку 1 i 2

i = 0;

while (s1[ ++i ]);

cout << i << endl;

i = 0;

while (s2[ ++i ]);

cout << i << endl;

}

 

Вказівники



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 165; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.187.103 (0.113 с.)