
- •12. Класи пам'яті даних 100
- •13. Робота з файлами 106
- •14. Посилання 111
- •Склад мови
- •Алфавіт мови
- •Лексеми
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Символьні рядки
- •Знаки операцій, роздільники, коментарі
- •Типи даних
- •Класифікація типів даних
- •Цілочислові типи
- •Дійсні типи
- •Оголошення змінних і констант
- •Переліки
- •Структура програми
- •Функція main
- •Область дії змінної
- •Введення і виведення даних
- •Функції стандартної математичної бібліотеки
- •Вирази і операції
- •Поняття виразу, операнда, операції
- •Порядок виконання операцій
- •Арифметичні операції
- •Порозрядні операції
- •Операції порівняння
- •Логічні операції
- •Операції присвоєння
- •Умовна операція
- •Операція визначення розміру sizeof
- •Узгодження типів у виразах
- •Умовні оператори
- •Оператори
- •Умовний оператор if
- •Оператор вибору switch
- •Оператори циклу
- •Цикл з параметром. Оператор for
- •Цикл з передумовою. Оператор while
- •Цикл з постумовою. Оператор do while
- •Оператори переходу
- •Використання псевдовипадкових чисел
- •Одновимірні масиви
- •Багатовимірні масиви
- •Символьні рядки
- •Вказівники
- •Оголошення вказівника, операції, пов’язані з вказівниками
- •Адресна арифметика
- •Void – вказівники, типізація вказівників
- •Звертання до елементів масивів через вказівники
- •Масиви символьних рядків і масиви вказівників
- •Динамічне виділення пам’яті
- •Структури і об’єднання
- •Оголошення і ініціалізація структур
- •Звертання до елементів структур
- •Перейменування типів
- •Об’єднання
- •Поля бітів
- •Директиви препроцесора
- •Призначення директив препроцесора
- •Директива включення #include
- •Директиви макропідстановок #define I #undef
- •Директиви умовної компіляції
- •Директиви #ifdef, #ifndef
- •Функції
- •Структура функції
- •Виклик функцій. Прототипи функцій
- •Взаємодія фактичних і формальних параметрів функцій
- •Inline – функції
- •Масиви і символьні рядки як параметри функцій
- •Використання кваліфікатора const в оголошеннях параметрів
- •Багатовимірні масиви як параметри функцій
- •Опрацювання структур у функціях
- •Вказівники на функції
- •Рекурсивні функції
- •Класи пам'яті даних
- •Клас пам'яті, час існування і видимість об’єкта
- •Область дії глобальних і локальних змінних
- •Специфікатори класів пам'яті
- •Специфікатори глобальних змінних
- •Багатофайлові програми
- •Робота з файлами
- •Звертання до файлів
- •Послідовний запис до файлу і послідовне читання з файлу
- •Файли з довільним доступом
- •Посилання
- •Призначення посилань
- •Передача аргументів функцій як посилань
Багатовимірні масиви
Мова С++ інтерпретує багатовимірний масив як масив масивів, тобто масив, елементами якого є масиви меншої вимірності. Матриця цілих чисел, яку оголошено таким чином:
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;
}