Єдина Країна!

Головне меню

Наша кнопка

Українські уроки про ІТ

Друзі

Підтримка української армії


Головна Програмування - C++ Базовий курс програмування на С++. Урок 9. Двовимірний масив (матриця) в C++. Функція rand.

Базовий курс програмування на С++. Урок 9. Двовимірний масив (матриця) в C++. Функція rand.
Написав Joker   
Понеділок, 09 березня 2015 16:25
Переглядів: 57603

Хороший програміст – це той, хто дивиться в обидва боки,

переходячи дорогу з одностороннім рухом

Даг Ліндер

 

Сьогодні ми розглянемо:

1. Розв’язок д/з минулого уроку

2. Функція rand

3. Двовимірні масиви в C++

4. Домашнє завдання

 

Розв’язок д/з минулого уроку про масиви

1. Заповнити масив з  10 елементів з клавіатури. І знайти суму всіх елементів більших 2,7. Масив типу double.

Я написав два способи розв’язку цього завдання.

1 спосіб:

#include <iostream>
#include <conio.h>
using namespace std;
 
int main()
{
	double arr[10];
	double sum = 0;
 
	for (int i = 0; i < 10; ++i)  // від 0 до 9
		cin >> arr[i];
 
	for (int i = 0; i < 10; ++i)
	{
		if (arr[i] > 2.7)
			sum += arr[i];
	}
 
	cout << sum << endl;
 
	_getch();
	return 0;
}

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

Тепер 2 спосіб:

#include <iostream>
#include <conio.h>
using namespace std;
 
int main()
{
	double arr[10];
	double sum = 0;
 
	for (int i = 0; i < 10; ++i)    // від 0 до 9
	{
		cin >> arr[i];
		if (arr[i] > 2.7)
			sum += arr[i];
	}
 
	cout << sum << endl;
 
	_getch();
	return 0;
}

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

 

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

У нас знову ж декілька варіантів. Ми можемо спершу відсортувати масив і вивести останній його елемент. Або ж просто знайти максимум.

#include <iostream>
using namespace std;
 
int main()
{
	int arr[5];
 
	for (int i = 0; i < 5; ++i)
		cin >> arr[i];
 
	// Припустимо, що перший елемент масиву є нашим максимумом
	int MAX = arr[0];
	for (int i = 1; i < 5; ++i) // Починаємо з 1
	{
		if (MAX < arr[i])
			MAX = arr[i];
	}
 
	// Виведемо максимум
	cout << MAX << endl;
 
	system("pause");
	return 0;
}

 

3. Масив заповнений таким чином: 5,112,4,3. Вивести його елементи навпаки (3,4,112,5). При цьому використання циклу є обов’язковим.

#include <iostream>
using namespace std;
 
int main()
{
	int arr[4] = { 5, 112, 4, 3 };
 
	for (int i = 4 - 1; i >= 0; --i)
		cout << arr[i] << "\t";
	cout << endl;
 
	system("pause");
	return 0;
}

 

4. Знайти суму всіх парних і непарних елементів. Масив заповнюється з клавіатури, 5 елементів, тип int.

#include <iostream>
using namespace std;
 
int main()
{
	setlocale(LC_CTYPE, "ukr");
 
	const int size = 5;
	int arr[size];
 
	for (int i = 0; i < size; ++i)
		cin >> arr[i];
 
	int sum_a = 0,  // Сума парних елементів масиву
		sum_b = 0;  // Сума непарних елементiв масиву
 
	for (int i(0); i < size; ++i)
	{
		if (arr[i] % 2 == 0)
			sum_a += arr[i];
		else
			sum_b += arr[i];
	}
 
	cout << "Сума непарних елементiв масиву (sum_b) = " << sum_b << endl;
	cout << "Сума парних елементiв масиву (sum_a) = " << sum_a << endl;;
 
	system("pause");
	return 0;
}

 

Функція rand

У домашніх вправах вам часто доводилося вводити значення масивів з клавіатури, що з часом стає нудним. І наші масиви були маленьких розмірів. А коли їх розміри будуть перевищувати сотню? Давайте надамо таке завдання комп’ютеру, він зробить це набагато швидше. Частково це завдання можна виконати за допомогою циклу, але тоді у них буде певна залежність. А як зробити випадкові числа у певному діапазоні? Для цього є особлива функція яка міститься у бібліотеці cstdlib. Ця функція – rand. Але тут не все так просто як здається. Давайте спробуєм написати програму.

Ось таку:

#include <iostream>
#include <cstdlib>
#include <conio.h>
using namespace std;
 
int main()
{
	cout << rand() << endl;
 
	_getch();
	return 0;
}

Результат буде таким, чи не так? Smile

Спробуйте запустити програму знову, результат не зміниться.

Що не так? Де ж пропала наша магія, у якій комп’ютер мав сам вибирати число? Вся справа в тому, що rand не видумує число, а працює за відповідним алгоритмом. Цей алгоритм використовує «зерно» - початкова точка відносно якої визначається rand. Все, що нам потрібно це задати якась число яке постійно змінюється. Таким постійним зерном буде час. Час змінюється щосекунди і це те, що нам потрібне. Щоб працювати з часом нам потрібно підключити спеціальну бібліотеку time.h. Але ще потрібно знати як задавати це «зерно». Для цього потрібна ще одна функція srand(). Саме вона задає початкову точку для функції rand. Тепер як ми казали раніше, треба задати час. Будемо використовувати бібліотеку time.h і функцію time(). Але варто додати параметр NULL. Ось так: time(NULL).  Ця функція повертає кількість мілісекунд з 1 січня 1970 року.

Тепер поєднаємо всі наші знання у два рядки коду.

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <conio.h>
using namespace std;
 
int main()
{
	srand(time(NULL));
 
	cout << rand() << endl;
 
	_getch();
	return 0;
}

 

Ура, працює! І що нам це дало? Нічого. А от якби ми могли встановити певні межі для чисел, от тоді це було б круто. Ну тоді давайте вчитися. Загальний діапазон чисел, які можна отримати викликаючи функцію rand: 0 – 32767. Якщо дуже добре подумати, то ваші знання дозволяють керувати діапазонами. Тут нам знадобиться ділення по модулю. Візьмемо будь-яке число, для прикладу 57. І число x. Якщо  x%52 = 0 (тобто x = 52), це мінімальне значення, яке ми можемо досягти. Всі інші будуть мати певний залишок і при цьому цей залишок не може бути більшим 51. Ось і все.

rand()%52;  // Діапазон від 0 до 51

Добре, ми навчилися встановлювати діапазони з 0 до . Але радіти ще рано, нам може знадобитися діапазон від x до (x+15) (для прикладу, де x>0).

Допустимо нам потрібен діапазон від 15 до 24. Для цього потрібно зробити декілька кроків:

1. 24 – 15 = 9
2. Згенерувати числа від 0 до 9. Тобто, rand() % 10;
3. Тепер посунути це все на 15 одиниць. rand() % 10+15;

Тепер все!

 

Двовимірні масиви

Давайте згадаємо як виглядають прості масиви:

int a[15]; char arr[153]; bool q[1]; char str[];

У всіх масивах вказується к-сть елементів. Виглядає він як стрічка поділена на клітинки.

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

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

Ось так виглядає матриця :

Але у пам’яті комп’ютера вона буде виглядати так:

Я думаю, ви вже самі зрозуміли як створювати такі масиви, але все ж напишу декілька прикладів:

int a[5][5]; char s[15][34]; bool q [3][2];

До речі, у С++ дозволено 64-х вимірні масиви. Це максимум.

Тепер давайте навчимося заповнювати такий масив.

int arr[2][2] = {{5,8},{6,4}};

Думаю, це не потребує пояснень. Майже все аналогічне з простими масивами.

Тепер  спробуєм заповнювати його з клавіатури.

#include <iostream>
#include <coni.h>
using namespace std;
 
int main ()
{
	const int size = 5;
 
	int arr[size][size];
 
	for (int i=0; i<size; ++i)
	{
		for (int j=0; j<size; ++j)
			cin >> arr[i][j];
	}
 
	_getch();
	return 0;
}

Ми проходимося по кожному елементу окремо і заповнюємо його, все просто і ясно. Я думаю, що ви зрозуміли, що означає цей запис arr[i][j];

Ми звертаємося до елемента який знаходиться у і-ому рядку j-ому стовпці.

Працювати з такими масивами важче ніж із звичайними, але реально і потрібно.

 

Домашнє завдання

Всі масиви в цьому уроці повинні заповнюватися за допомогою функції rand. Діапазон від 0 до 10;

1.  Знайти суму всіх елементів, розмір двовимірного масиву 5х5

2.  Знайти максимальне і середнє значення двовимірного масиву, розміром 3х3

3. Знайти суму всіх елементів двовимірного масиву (3х7), якщо будь-який з індексів кратний 3.

4. Знайти максимальне значення двовимірного масиву (6х6) у темній області малюнку (нижче діагоналі матриці).


( 22 Проголосувало )

Схожі статті:
Новіші матеріали:
Старіші матеріали:

Коментарі
Добавити новий
Олексій  - *   |2015-10-23 22:13:16
"Візьмемо будь-яке число, для прикладу 57. І
число . Якщо (тобто x = 52), це мінімальне
значення, яке ми можемо досягти."
Тут
хтозна що написано)
Адміністратор   |2015-10-26 01:40:16
avatar Дякую, виправив
Богдан  - Д/З   |2016-04-15 00:02:23
А де можна знайти розв`язок домашнього
завдання?
Роман   |2016-04-28 02:39:36
avatar в наступній темі
http://programming.in.ua/programming/c-plus-plus/3 05-functions-c-plus-plus.html
іуп  - іп   |2017-06-22 18:23:46
Vladek  - chlen   |2017-11-22 16:55:32
Залишити коментар
Ім`я:
e-mail:
 
Тема:
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Введіть цей настирливий код
Русская редакция: www.freedom-ru.net & www.joobb.ru

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 

Підписка

Хто онлайн?

Немає
На даний момент 19 гостей на сайті

Український рейтинг
TOP.TOPUA.NET