Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуровані типи даних у C Масиви.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
1.31 Mб
Скачать

Структуровані типи даних у C/C++

ПЛАН

1 Масиви

2 Рядки і символи

3 Структури та об'єднання

1 Масиви

Масив – це кінцева іменована послідовність однотипних величин. Всі елементи масиву мають одне ім'я, але різні порядкові номери (індекси) і розташовуються один за іншим у сусідніх комірках пам'яті. Для звертання до елемента масиву потрібно вказати ім'я масиву і порядковий номер елемента. Порядковий номер при цьому може бути тільки цілим числом.

Формат об’явлення одномірного масиву в C/C++

тип ім'я [число_елементів];

Приклади

int x[10];

float z[25];

const int M=10;

double a[10];

int b[M];

Привласнення значення:

a[0]=2;

a[4]=8;

Нумерація елементів починається з нуля. Тому індекс може мінятися в діапазоні від 0 до n-1, де n – число елементів у масиві. Ім'я масиву одночасно є вказівником на його початковий (нульовий) елемент.

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

Треба пам’ятати, що нумерація у масивів починається з 0, тому масив із 10 елементів, a[10], буде адресуватися від a[0] до a[9], при зверненні до a[10], вирогіднише всього відбудеться помилка або будуть отримані невірні дані.

При описі масив можна ініціалізувати (присвоїти його елементам початкові значення). Існують дві форми ініціалізації: з явною вказівкою числа елементів масиву і без явної вказівки числа елементів.

Ініціалізація з явною вказівкою числа елементів масиву

Приклад

int a[5]={3,6,8,1,9};

У цьому випадку елементи масиву одержать такі значення:

a[0]=3; a[1]=6;

a[2]=8; a[3]=1; a[4]=9.

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

Приклад

int w[5]={4,7,9};

У цьому випадку перші три елементи масиву одержать значення w[0]=4; w[1]=7, w[2]=9, елементи w[3] і w[4] будуть дорівнюють нулю.

Ініціалізація без явної вказівки числа елементів масиву

Приклад

int h[]={4,5,2,7,9,1};

У цьому випадку компілятор автоматично створить масив h із шести елементів і присвоїть їм відповідні значення.

У мові C/C++ визначені тільки одномірні масиви. Але тому що елементом одномірного масиву може бути масив, то можливо визначити і багатомірні масиви. Наприклад, двомірний масив можна представити як масив одномірних масивів. При описі багатомірних масивів задається вказівка кожної розмірності в квадратних дужках.

Приклади

int x[5][7]; – двомірний масив розміром 5x7;

int z[3][7][4] – тривимірний масив;

У загальному виді ініціалізація багатомірного масиву має вигляд:

тип ім'я [розмірність 1][розмірність 2]…[розмірність n];

При ініціалізації багатовимірного масиву кожен масив береться у свої фігурні дужки (при цьому саму ліву розмірність можна не вказувати) або задається загальний список елементів у тому порядку, як вони розташовані в пам'яті.

Приклад: ініціалізувати двовимірний масив (матрицю)

– 1-й спосіб - int h[2][3]={{2,5,1}, {9,4,8}}

– 2-й спосіб (сама ліва розмірність не зазначена) -

int h[][3]={{2,5,1}, {9,4,8}}

– 3-й спосіб - int h[2][3]={2,5,1,9,4,8}

Для зручності рекомендується задавати розмірність масиву за допомогою іменованої константи. У цьому випадку, при зміні числа елементів у масиві, необхідно тільки змінити значення константи (параметри циклів для обробки масиву змінювати не буде потрібно).

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

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

Завдання 1

Давайте введемо вручну 5 значень у масив, а потім виведемо їх на екран, використовуючи цикли.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int arr [5];

for (int k=0; k<5; k++)

{

printf_s("Введiть елемент № %d ",k);

scanf_s("%d", &arr[k]);

}

for (int k=0; k<5; k++)

{

printf_s("\nЕлемент № %d = %d; ", k, arr[k]);

}

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

Завдання 2

Дано масив із N цілих чисел. Необхідно підрахувати a1-a2+a3-a4+..-an

Текст програми:

#include <stdio.h>

#include <clocale>

#include <ctime> // містить типи і функції для роботи з датою і часом

#include <cstdlib>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int a[50], n;

int sum=0;

/*Функція rand() повертає псевдовипадкове число в інтервалі

від 0 до Rand_max (Rand_max - символьна константа, оголошена

у файлі stdlib.h, яка визначає найбільше випадкове число).

Але при запуску програми ми завжди отримуємо одну і ту ж

послідовність чисел. Щоб цього не відбувалося, то за

допомогою функції srand() ініціалізується генератор

випадкових чисел за допомогою деякого початкового

випадкового значення. Наприклад: srand(time(NULL))*/

srand(time(NULL)); // ініціалізує генератор випадкових чисел

printf_s("Введiть кiл-ть елементiв: ");

scanf_s("%d", &n);

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

{

/*Функція rand() повертає псевдовипадкове число

в інтервалі від 0 до Rand_max.*/

a[k]=rand()%9+1;

}

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

{

printf_s("\n%d", a[k]);

}

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

{

if (k%2==0) sum+=a[k];

else sum-=a[k];

}

printf_s("\nСума = %d\n",sum);

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

Завдання 3

Дано масив цілих чисел. Переписати його так, щоб елементи із значеннями, які менше a (вводить користувач) знаходилися на початку масиву, а більшими – в кінці.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <ctime>

#include <cstdlib>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

const int n=8;

int A[n];

int B[n];

int k=0, min;

srand(time(NULL));

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

{

A[i]=rand()%9+1;

}

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

{

printf_s("\n %d", A[i]);

}

printf_s("\nМеньше якого значення перемiщувати елементи в початок массиву? ");

scanf_s("%d", &min);

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

{

if(A[i]<min)

{

B[k]=A[i];

k++;

}

}

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

{

if(A[i]==min)

{

B[k]=A[i];

k++;

}

}

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

{

if(A[i]>min)

{

B[k]=A[i];

k++;

}

}

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

{

A[i]=B[i];

}

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

{

printf_s("\n %d", A[i]);

}

printf_s("\n");

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

Завдання 4

Дано масив цілих чисел. З'ясувати чи впорядковані числа за збільшенням чи ні.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <ctime>

#include <cstdlib>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int num[9], f=0;

srand(time(NULL));

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

{

num[i]=rand()%9+1;

}

printf_s("\nСформований масив:");

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

{

printf_s("\n %d", num[i]);

}

for(int i=1; i<9; i++)

{

if(num[i-1]>num[i])

{

f=1;

break;

}

}

if(f==0) printf_s("\nМасив впорядкований\n");

else printf_s("\nМасив не впорядкований\n");

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

Завдання 5

Дано масив цілих чисел. Поміняти місцями парні та непарні елементи.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <ctime>

#include <cstdlib>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int num[9], p;

srand(time(NULL));

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

{

num[i]=rand()%9+1;

}

printf_s("\nСформований масив:");

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

{

printf_s("\n %d", num[i]);

}

for(int i=1; i<9; i+=2)

{

p=num[i-1];

num[i-1]=num[i];

num[i]=p;

}

printf_s("\nОтриманий масив:");

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

{

printf_s("\n %d", num[i]);

}

printf_s("\n");

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

Завдання 6

Дано масив цілих чисел. Знайти перший номер елемента, який дорівнює заданому користувачем значенню.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <ctime>

#include <cstdlib>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int num[9], a, k;

srand(time(NULL));

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

{

num[i]=rand()%9+1;

}

printf_s("\nСформований масив:");

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

{

printf_s("\n %d", num[i]);

}

printf_s("\nЯке число шукати? ");

scanf_s("%d", &a);

for(int i=1; i<9; i++)

{

if(num[i]==a)

{

k=i;

break;

}

}

printf_s("\nПерший номер елемента зi значенням %d в масивi є %d \n", a, k);

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

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

Багатовимірні масиви - це масиви в яких використовується 2 або більше ідентифікаторів для нумерації елементів, оголошуються вони так само:

const int m=10, n=15;

const int x=100, y=100, z=100;

double a[10][2];

int b[m][n]; 

int koordinat[x][y][z]; 

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

Завдання 7

Дано двовимірний масив 10х10. Необхідно замінити на 0 значення всіх елементів, які знаходяться на головній діагоналі.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <ctime>

#include <cstdlib>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int num[10][10];

srand(time(NULL));

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

{

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

num[k][j]=rand()%9+1;

}

printf_s("Сформований масив\n");

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

{

printf_s("\n");

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

{

printf_s(" %d", num[k][j]);

}

}

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

{

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

{

if (k==j) num[k][j]=0;

}

}

printf_s("\nОтриманий масив\n");

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

{

printf_s("\n");

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

{

printf_s(" %d", num[k][j]);

}

}

printf_s("\n");

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

Завдання 8

Дано двовимірний масив 10х10. Необхідно визначити номери рядків, які містять максимальний елемент масиву.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <ctime>

#include <cstdlib>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int num[10][10], max, f=0;

srand(time(NULL));

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

{

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

num[k][j]=rand()%9+1;

}

printf_s("Сформований масив\n");

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

{

printf_s("\n");

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

{

printf_s(" %d", num[k][j]);

}

}

max=num[0][0];

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

{

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

{

if (num[k][j]>max) max=num[k][j];

}

}

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

{

f=0;

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

{

if (num[k][j]==max) {f=1; break;}

}

if (f==1) printf_s("\nМаксимальний елемент масиву %d знаходиться у %d рядку", max, k);

}

printf_s("\n");

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

Завдання 9

Дано двовимірний масив 10х10. Необхідно визначити максимальні елементи рядків масиву.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <ctime>

#include <cstdlib>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int num[10][10], max;

srand(time(NULL));

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

{

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

num[k][j]=rand()*9%1000;

}

printf_s("Сформований масив\n");

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

{

printf_s("\n");

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

{

printf_s("%5d", num[k][j]);

}

}

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

{

max=num[k][0];

for(int j=1; j<10; j++)

{

if (num[k][j]>max) max=num[k][j];

}

printf_s("\nМаксимальним елементом %d-го рядка є %d ", k, max);

}

printf_s("\n");

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

Завдання 10

Дано двовимірний масив розміром 10х10 елементів. Необхідно підрахувати суму елементів, що знаходяться вище за головну діагональ і суму елементів, що знаходяться нижче за головну діагональ масиву.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <ctime>

#include <cstdlib>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int num[10][10];

int sum=0, bsum=0;

srand(time(NULL));

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

{

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

num[k][j]=rand()%9+1;

}

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

{

printf_s("\n");

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

{

if (k==j) printf_s(" _%d", num[k][j]);

else printf_s(" %d", num[k][j]);

}

}

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

{

for(int j=k+1; j<10; j++)

{

sum+=num[k][j];

}

}

printf_s("\nСума над дiагоналлю = %d", sum);

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

{

for(int j=0; j<k; j++)

{

bsum+=num[k][j];

}

}

printf_s("\nСума пiд дiагоналлю = %d\n", bsum);

system("pause");

}

Компілюємо програму і бачимо результат.

Результат

Завдання 11

В двовимірному масиві розміром N * N елементів знайти і вивести на екран стовпчики, значення елементів в яких впорядковані за зростанням.

Текст програми:

#include <stdio.h>

#include <clocale>

#include <windows.h>

void main()

{

setlocale (LC_CTYPE,"rus");

int num[5][5], f;

for(int k=0; k<5; k++)

{

for(int j=0; j<5; j++)

{

printf_s("Введiть елемент %d-го рядка та %d-го стовпчика ", k, j);

scanf_s("%d", &num[k][j]);

}

}

printf_s("Сформований масив\n");

for(int k=0; k<5; k++)

{

printf_s("\n");

for(int j=0; j<5; j++)

{

printf_s("%3d", num[k][j]);

}

}

for(int j=0; j<5; j++)

{

f=0;

for(int k=1; k<5; k++)

{

if (num[k-1][j]>num[k][j]) {f=1; break;}

}

if (f==0) printf_s("\nСтовпчик %d впорядкований", j);

}

printf_s("\n");

system("pause");

}

Компілюємо програму і бачимо результат.

Результат