
- •1 Масиви
- •2 Рядки і символи
- •Реализация в языках программирования
- •[Править] в языке Си
- •Урок 6. Класс string
- •Класс string
- •Упражнение 3.12
- •Упражнение 3.13
- •Упражнение 3.14
- •Упражнение 3.15
- •Клас string: конструктори і присвоєння рядків, операції, відкладене копіювання Клас string: конструктори і присвоєння рядків, операції, відкладене копіювання
- •2 Рядки і символи
Структуровані типи даних у 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");
}
Компілюємо програму і бачимо результат.
Результат