Лабораторна робота 11
Тема : «Робота з багатовимірними масивами в мові С»
Мета: ознайомлення з поняттям складеного типу даних – масивом та набуття навичок практичної роботи з багатовимірними масивами.
Теоретичні відомості
В мові С/С++ можливо працювати зі складеними структурами даних – масивами. Розрізняють одновимірні та багатовимірні масиви. Частковим випадком багатовимірних масивів є двовимірні масиви.
Обмежень на розмірність масивів, тобто на число індексів, в мові С теоретично немає. Стандарт мови С вимагає, щоб транслятор міг обробляти визначення масивів з розмірністю до 31. Проте частіше всього використовуються одновимірні і двовимірні масиви.
Суттєво, що всі елементи матриць або дійсні, або цілі і т.д. Така "однорідність" елементів властива масиву, визначення якого описує тип елементів, ім'я масиву і його розмірність, тобто число індексів, необхідне для визначення конкретного елемента. Крім того, у визначенні вказується кількість значень, яка приймаються кожним індексом. Наприклад,
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]
Двовимірний масив – це масив, що складається з окремих одновимірних масивів у вигляді рядків, розмірність яких рівна кількості стовпців матриці. Для цього при визначенні двовимірного масиву у квадратних дужках вказується дві розмірності.
Оператор опису двовимірного масиву має вигляд:
<тип> <ім’я> [<розмір1>][<розмір2>];
Наприклад:
int a[3][5]; // Цілочисельна матриця з 3 рядків і 5 стовпців
Масив зберігається у неперервній області пам’яті по рядках, які зберігаються послідовно один за одним, а не у вигляді звичайної двовимірної матриці:
a00 a01 a02 a03 a04 a10 a11 a12 a13 a14 a20 a21 a22 a23 a24
| -0-ий рядок- - |-- 1-ий рядок - |- - 2-ий рядок- - |
Для доступу до окремого елемента двовимірного масиву використовується конструкція, яка має вигляд a[i][j], де i – номер рядка, j – номер стовпчика. Кожен індекс може змінюватися від 0 до значення, яке на одиницю менше за значення відповідної розмірності.
Як і для одновимірного масиву, при описі двовимірного масиву можна задавати початкові значення його елементів. Їх записують у фігурних дужках. Елементи масиву ініціалізуються в порядку їх розміщення у пам’яті.
Наприклад: оператор
int с[3][4] = {1,2,34,2,3,4,1,3,4,1,2};
визначає матрицю з наступними значеннями елементів:
1 2 3 4
2 3 4 1
3 4 1 2
Можна задавати початкові значення не для всіх елементів масиву. Для цього список значень для кожного рядка береться додатково у фігурні дужки. Наприклад:
int d[3][4] = {{0,1,2},{9,-2},{-7,1,6,8}};
В даному випадку розмірність, що позначає кількість рядків, можна не вказувати.
Приклад введення та виведення масиву:
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#define n 2
#define m 3
#include <stdlib.h>
#pragma argsused
int main(int argc, char* argv[])
{
int i,j,x[n][m];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
x[i][j]=-10+rand()%20;
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<m;j++) printf(" %5d",x[i][j]);
}
getch();
return 0;
}
Приклад виконання роботи:
Завдання. Для кожного рядка матрицi знайти i надрукувати суму значень елементiв, що перевищують число Z.
Блок-схема алгоритму:
Програмна реалізація:
#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include<conio.h>
#include<values.h>
#define n 3
#define m 4
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
clrscr();
int i,j;
float x[n][m], z,s;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
printf("\n x[%d,%d]", i, j);
scanf("%f", &x[i][j]);
}
printf("\n z:");
scanf("%f",&z);
clrscr();
printf("\n Zadano matrica:");
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<m;j++)
printf(" %f",x[i][j]);
}
printf("\n Rezultat");
for(i=0;i<n;i++){
s=0;
for(j=0;j<m;j++)
if(x[i][j]>z) s+=x[i][j];
printf("\n\nSuma chisel greater than z=%f v %d-omu ryadru :", z,i,s);
}
getch();
return 0;
}
Результати роботи програми:
Zadano matrica:
2 4 7 1
3 6 4 7
8 9 4 3
Rezultat
Suma chisel greater than 5 v 0-omu ryadru :7
Suma chisel greater than 5 v 1-omu ryadru :13
Suma chisel greater than 5 v 2-omu ryadru :17
Варіанти індивідуальних завдань:
5.
В двовимірному масиві підрахувати кількість додатніх елементів.
Програмна реалізація:
#include <stdio.h>
#include <conio.h>
#define n 3
#define m 3
int main()
{ float k, x[n][m];
int i,j;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
printf("\n x[%d][%d]", i,j);
scanf("%f",&x[i][j]);
}
k=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(x[i][j]>0) k++;
printf("\n k=%f",k);
getch();
return 0;
}
Хід виконання роботи:
Блок-схема:
Результат роботи програми:
Висновок: в результаті роботи ознайомлено з поняттям складеного типу даних – масивом та набуто навички практичної роботи з багатовимірними масивами.