Лекція № 4
Тема: Одновимірні та багатовимірні масиви
План
Масиви і змінні з індексами
Впорядкування одновимірних масивів
Символьні масиви
Масиви і змінні з індексами.
Математичним поняттям, яке привело до появи в мовах програмування поняття "масив", є матриця і її окремі випадки: вектор-стовбець або вектор-рядок. Елементи матриць в математиці прийнято позначати з використанням індексів. Суттєво, що всі елементи матриць або дійсні, або цілі і т.д. Така "однорідність" елементів властива і масиву, визначення якого описує тип елементів, ім'я масиву і його розмірність, тобто число індексів, необхідне для визначення конкретного елемента. Крім того, у визначенні вказується кількість значень, яка приймаються кожним індексом. Наприклад, int а[10]; визначає масив з 10 елементів а[0], а[1] ..., а[9]. float Z[13][[6]; визначає двовимірний масив, перший індекс якого приймає 13 значень від 0 до 12, другий індекс приймає 6 значень від 0 до 5. Таким чином, елементи двовимірного масиву Z можна перерахувати так:
Z[0][0], Z[0][l], Z[0][2],...,Z[12][5]
Відповідно до синтаксису Сі в мові існують тільки одновимірні масиви, проте елементами одновимірного масиву, у свою чергу,
можуть бути масиви. Тому двовимірний масив визначається як масив масивів. Таким чином, в прикладі визначений масив Z з 13 елементів-масивів, кожний з яких, у свою чергу, складається з 6 елементів типу float. Нумерація елементів будь-якого масиву завжди починається з 0, тобто індекс змінюється від 0 до N-1, де N - кількість значень індексу.
Обмежень на розмірність масивів, тобто на число індексів, в мові Сі теоретично немає. Стандарт мови Сі вимагає, щоб транслятор міг обробляти визначення масивів з розмірністю до 31. Проте частіше всього використовуються одновимірні і двовимірні масиви.
Впорядкування в одновимірних масивів
Необхідно, ввівши значення змінної 1 <n<=100 і значення n перших елементів масиву а[0],а[1],...,а[n-1], впорядкувати ці перші елементи масиву за збільшенням їх значень. Текст першого варіанту програми:
/* Впорядкування елементів масиву */
#include <stdio.h>
main( )
{
int n,і,j;
double а[100],b;
while(1)
{
printf("\n Введіть кількість елементів n=");
scanf("%d",&n);
if (n > 1 && n <= 100) break;
printf{"Помилка! Необхідно 1<n<=100!");
}
printf("\n Введіть значення елементів " масиву:\n");
for(j=0; j<n; j++)
{
printf("а[%d]=", j+1);
scanf("%lf",&a[j]);
}
for(i=0; i<n-l; i++)
for(j=i+l; j<n; j++)
if(а[i]>a[j])
{
b=a[i];
а[i]=a[j];
а[j]=b;
}
printf("\n Впорядкований масив: \n");
for(j=0; j<n; j++)
printf("а[%d]=%f\n",j +1,a[j]);
}
При заповненні масиву і при друку результатів його впорядкування індексація елементів виконана від 1 до n, як це звичайно прийнято в математиці. В програмі на Сі це відповідає зміні індексу від 0 до (n-1). В програмі реалізований алгоритм прямого впорядкування кожний елемент а[i], починаючи з а[0] і кінчаючи а[n-2], порівнюється зі всіма подальшими, і на місце а[i] вибирається мінімальний. Таким чином, а[0] приймає мінімальне значення, а[1] - мінімальне з тих, що залишилися і т.д. Недолік цього алгоритму полягає в тому, що в ньому фіксоване число порівнянь, не залежне від початкового розташування значень елементів. Навіть для вже впорядкованого масиву доведеться виконати ту ж саму кількість ітерацій (n-1)*n/2, оскільки умови закінчення циклів не пов'язані з властивостями, тобто з розміщенням елементів масиву.