Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
13
Добавлен:
30.05.2020
Размер:
68.61 Кб
Скачать

Лабораторна робота № 5

Тема: Обробка одновимірних масивів.

Мета: вивчити складений тип даних - масив, основні властивості компоненти StringGrid. Написати і відлагодити програму з використанням одновимірних масивів

5.1 Теоретична частина.

Масив - кінцева послідовність даних одного типу.

Масив - об'єкт складного типу, кожен елемент якого визначається ім'ям (ID) і цілочисельним значенням індексу (номери), по якому до елементу масиву проводиться доступ. Розглянемо одновимірні масиви.

Увага! Індекси масивів в мові С/С++ починаються з 0.

У програмі одновимірний масив декларується таким чином:

тип ID масиву [розмір];

де розмір - вказує кількість елементів в масиві. Розмір масиву може задаватися константою або константним вираженням. Для використання масивів змінного розміру існує окремий механізм - динамічне виділення пам'яті.

Приклади декларації масивів :

int a[5];

double b[4] = 1.5, 2.5, 3.75;

у цілочисельному масиві а перший елемент а[0], другий - а[1], ., п'ятий - а[4]. Для масиву b, що складається з дійсних чисел, виконана ініціалізація, причому елементи масиву отримають наступні значення: b[0]=1.5, b[1]=2.5, b[2]=3.75, b[3]=0.

У мові З/З++ не перевіряється вихід індексу за межі масиву. Коректність використання індексів елементів масиву повинен контролювати програміст.

Приклади опису масивів :

const Nmax=10; - завдання максимального значення;

typedef double mas1[Nmax*2]; - опис типу одновимірного масиву;

mas1 a; - декларація масиву а типу mas1;

int ss[10]; - масив з десяти цілих чисел.

Елементи масивів можуть використовуватися у виразах так само, як і звичайні змінні, наприклад:

f = 2*a[3] + a[Ss[i] + 1]*3;

a[n] = 1 + sqrt(fabs(a[n - 1]));

5.2. Створення віконного застосування

Компонент StringGrid

При роботі з масивами введення і виведення значень зазвичай організовується з використанням компоненти StringGrid, призначеної для відображення інформації у вигляді двомірної таблиці, кожен осередок якої є вікном однорядкового редактора (аналогічно вікну Edit). Доступ до інформації здійснюється за допомогою елементу Cells[ACol][ARow] типу AnsiString, де цілочисельні значення ACol, ARow вказують позицію елементу.

Увага! Перший індекс ACol визначає номер стовпця, а другий ARow - номер рядка на відміну від індексів масиву.

У інспекторові об'єктів значення ColCount і RowCount встановлюють початкові значення кількості стовпців і рядків в таблиці, а FixedCols і FixedRows задають кількість стовпців і рядків фіксованої зони. Фіксована зона виділена іншим кольором і зазвичай використовується для написів.

5.3. Приклад виконання завдання

Видалити з масиву А розміром N, що складається з цілих чисел (позитивних і негативних), усі негативні числа. Новий масив не створювати. Для заповнення масиву використовувати фунцию random(kod) - генератор випадкових рівномірно розподілених цілих чисел від 0 до (int) kod.

6.3.1. Приклад створення віконного застосування

Значення N вводити з Edit, значення масиву А - з компоненти StringGrid. Результат вивести в компоненту StringGrid.

Панель діалогу і результати виконання програми приведена на мал. 1.

Мал. 1

Налаштування компоненту StringGrid

На закладці Additional виберіть відповідну піктограму, встановите компоненти StringGrid1 і StringGrid2 і відрегулюйте їх розміри. У інспекторові об'єктів для обох компонент встановите значення ColCount рівними 2, RowCount рівними 1, тобто по два стовпці і одному рядку, а значення FixedCols і FixedRows рівними 0. Значення ширини клітини стовпця DefaultColWidth рівним 40.

За умовчанням в компоненту StringGrid введення даних дозволене тільки програмно. Для дозволу введення даних з клавіатури необхідно у властивості Options рядок goEditing для компоненти StringGrid1 встановити в положення true.

Текст функцій-обробників може мати наступний вигляд:

. . .

int n = 4;

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

randomize(); // Зміна початкової адреси для random()

Edit1 ->Text=IntToStr(n);

StringGrid1 ->ColCount=n;

for(int i=0; i<n;i++) // Заповнення масиву А випадковими числами

StringGrid1 ->Cells[i][0] = IntToStr(random(21) - 10);

Label3 ->Hide(); // Приховати компоненту

StringGrid2 ->Hide();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

n=StrToInt(Edit1 ->Text);

if(n>10){

ShowMessage("Максимальна кількість 10"!);

n=10;

Edit1 ->Text = "10";

}

StringGrid1 ->ColCount=n;

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

StringGrid1 ->Cells[i][0]=IntToStr(random(21) - 10);

Label3 ->Hide();

StringGrid2 ->Hide();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

int i, kol = 0, a[10]; // Декларація одновимірного масиву

//Заповнення масиву А елементами з таблиці StringGrid1

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

a[i]=StrToInt(StringGrid1 ->Cells[i][0]);

//Видалення негативних елементів з масиву А

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

if(a[i]>=0) a[kol++] = a[i];

StringGrid2 ->ColCount = kol;

StringGrid2 ->Show(); // Показати компоненту

Label3 ->Show();

//Виведення результату в таблицю StringGrid2

for(i=0; i<kol;i++) StringGrid2 ->Cells[i][0]=IntToStr(a[i]);

}

5.3.2. Приклад створення консольного застосування

Текст програми може мати наступний вигляд (зверніть увагу на те, що функція main використовується в простій формі - без параметрів і не повертає результатів) :

. . .

#include <stdio.h>

#include <conio.h>

void main()

{

int a[10],n, i, kol=0;

randomize(); // Зміна початкової адреси для random()

printf("Input N (<=10) ");

scanf("%d", &n);

puts("\n Massiv A");

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

a[i] = random(21) - 10; // Заповнення масиву А випадковими числами

printf("%4d", a[i]);

}

//Видалення негативних елементів з масиву А

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

if(a[i]>=0) a[kol++] = a[i];

puts("\n Rezult massiv A");

for(i=0; i<kol;i++) printf("%4d", a[i]);

puts("\n Press any key ... ");

getch();

}

Із заповненим випадковими числами масивом А результат програми може бути наступним:

5.4. Індивідуальні завдання

Написати програму по обробці одновимірних масивів. Розміри масивів вводити з клавіатури. У консольному застосуванні передбачити можливість введення даних як з клавіатури, так і з використанням функції random().

При створенні віконного застосування скалярний (простий) результат виводити у вигляді компоненти Label, а масиви вводити і виводити за допомогою компонент StringGrid.

У одновимірному масиві, що складається з n цілих елементів, що вводяться з клавіатури, обчислити:

  1. Добуток елементів масиву, розташованих між максимальним і мінімальним елементами.

  2. Суму елементів масиву, розташованих між першим і останнім нульовими елементами.

  3. Суму елементів масиву, розташованих до останнього позитивного елементу.

  4. Суму елементів масиву, розташованих між першим і останнім позитивними елементами.

  5. Добуток елементів масиву, розташованих між першим і другим нульовими елементами.

  6. Суму елементів масиву, розташованих між першим і другим негативними елементами.

  7. Суму елементів масиву, розташованих до мінімального елементу.

  8. Суму модулів елементів масиву, розташованих після останнього негативного елементу.

  9. Суму елементів масиву, розташованих після останнього елементу, рівного нулю.

  10. Суму модулів елементів масиву, розташованих після мінімального по модулю елементу.

  11. Суму елементів масиву, розташованих після мінімального елементу.

  12. Суму елементів масиву, розташованих після першого позитивного елементу.

  13. Суму модулів елементів масиву, розташованих після першого негативного елементу.

  14. Суму модулів елементів масиву, розташованих після першого елементу, рав-ного нулю.

  15. Суму позитивних елементів масиву, розташованих до максимального елементу.

  16. Добуток елементів масиву, розташованих між першим і останнім негативними елементами.

Контрольні питання

  1. Дайте визначення масиву.

  2. Які типи даних можна використовувати для оголошення масивів?

  3. Який індекс має перший елемент масиву, що містить десять елементів?

  4. Що трапиться, якщо в програмі виникне звертання до елементу масиву з індексом, який виходить за оголошені межі?

  5. Як оголошується багатовимірний масив?

  6. Нехай масив оголошений наступним оператором. Скільки в ньому всього елементів?

int mass [2] [3] [5] [8];

  1. Яким буде індекс десятого елементу масиву з питання 6?

  2. Як визначити загальну кількість елементів в масиві xyz, якщо його елементи мають тип long?