Обробка одновимірних масивів

Ознайомимося з особливостями обробки масивів та метода­ми введення-виведення цих даних у середовищі С++ Builder. Значення елементів масивів у цій системі треба вводити за до­помогою вікон введення [2, 4-8,12-14,19, 20].

Розглянемо введення елементів масиву шляхом багатора­зового використання вікна компонента Edit.

Приклад 13.1. Обчислити функцію y=axі2-sinx1, якщо її елементи розташовані в масиві та мають значення:

Х0 = -0,81; Х1 = -0,58;  X2= -0,11; Х3 = 0,2; Х4 = 0,91; Х5 = 1,83.

Програмну реалізацію прикладу наведено у прикладі 6.1 (частина І).

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

З метою ознайомлення з використанням різних компонен­тів середовища наведений приклад можна розв’язати двома способами:

  • у першому варіанті для виведення масиву, а потім і ре­зультату обчислення функції використати компонента Label3, якому надано ім’я LbVivod;
  • y другому варіанті для виведення масиву і результату обчислень застосувати компонент Ме— багаторядковий ре­дактор.

 

Розмістимо на формі такі компоненти: Edit1 — для введен­ня елементів масиву, Label1— для підказки, Label2 — для виведення слова «Результат», Label3 — для виведення самого результату, а також кнопки Button1 — для організації обчис­лень, BitBtn — для подачі команди про кінець роботи.

Форма, що розробляється, схожа на форму прикладу 12.1 (частина II). Однак у даному випадку для створення оброблю­вача події «Конец работы» тут використовується не кнопка Button, a BitBtn. Компонент BitBtn розташований на сторінці компонентівAdditional. На цьому компоненті, крім напису, можна розташовувати позначки, вигляд яких задається власти­вістю Kind, що пропонує кілька варіантів зображень. Місце розташування відносно до напису і розмір позначок визнача­ються властивостями Margin,Layout і Spacing. У даному ви­падку властивість Margin = (напис із зображенням розташо­вується по центру кнопки), властивість Layout = blGlyphLeft (зображення ліворуч від напису), a Spacing = 4 (кількість піксе­лів між написом і позначкою). Ці значення властивостей прий­няті за замовчуванням і користувач може їх змінити за допо­могою редактора Object Inspector.

За необхідності будь-якому компоненту можна присвоїти ін­ше ім’я, використовуючи властивість Name. Так, наприклад, за­мість абстрактних імен Label1, Label2 і Label3можна написати LbVvod, LbRezult, LbVivod. Тоді в операторах програми треба записувати: LbVvod->Caption, LbRezult->Caption тощо. Рекомендується, щоб призначені імена були змістовними, і, крім того, зберігали інформацію про назву компонента.

Розглянемо перший варіант розв’язання задачі, тобто засто­сування компонента Labelдля виведення масиву та одержаного результату.

Вигляд форми, програмний код і результат розв’язання на­ведено нижче:

#include <vcl.h>

#pragma hdrstop

#include <math.h>

#include "UnLB_2.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1  *Form1;

// глобальные переменные

int i=0;

float y, x[6];

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

__ fastcall TForm1: :TForm1 (TComponent * Owner): TForm(Owner)

{

}

void_ fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)

{

if (Key==13) // если нажата клавиша Enter (второй вариант кода)

{

x[i] = StrToFloat(Edit1->Text); //ввод элементов массива

Edit1->Text="";

i++;

if (і < 6) LbVvod->Caption="Bведитe"+IntToStr(i+1)+" елемент";

else

{ LbRezult->Caption="IIpoверка массива";

LbVivod->Caption="";

for (і = 0; і < 6; i++)

LbVivod->Caption = LbVivod->Caption+"x["+IntToStr(i)+"]="+FloatToStrF(x[i],ffFixed,4,2)+'\n';

}

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

void__fastcall TForml::Button1Click(TObject *Sender)

{

float a=10.5;

LbRezult->Caption="Результат";

LbVivod->Caption=" ";

for (і = 0; і < 6; i++)

{ у = a*pow(x[i],2) - sin(x[i]);

LbVivod->Caption = LbVivod->Caption +"x[" + IntToStr(i) + "]=" + FloatToStrF(x[i] ,ffFixed,4,2) + " y=" + FloatToStrF(y,ffGeneral,5,3) + '\n; }

}

Другий варіант — виведення масиву і результатів обчис­лень здійснюється з використанням компонента Меmо — ба­гаторядкового редактора.

Програмний код у цьому випадку має вигляд:

#include <vcl.h>

#pragma hdrstop

#include <math.h>

#include "ULb_2_mem.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int i=0;

float y, x[6];

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

__ fastcall TForm1: :TForm1 (TComponent* Owner): TForm( Owner)

{

}

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

void_ fastcall TForml::Edit1KeyPress(TObject *Sender, char &Key)

{

if (Key ==13)

{ x[i] = StrToFloat(Edit1->Text);

Edit1->Text=""; i++;

if (i < 6)

LbVvod->Caption= "Введите "+IntToStr(i+1)+" элемент";

else

{ LbRezult->Caption="IIpовepкa массива";

Memo1 ->Lines->Clear ( );

for (і = 0; і < 6; i++)

Memol->Lines->Add("x["+IntToStr(i) + "]=" + FloatToStrF(x[i],ffFixed,4,2));

}

}

}

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

void_ fastcall TForm1::Button1Click(TObject *Sender)

{

float a=10.5;

Memo1->Lines->Clear( );

LbRezult->Caption="Pезультат";

for (і = 0; і < 6; i++)

{ у = a*pow(x[i],2) - sin(x[i]);

Memo1->Lines->Add("x["+IntToStr(i)+"]="+ FloatToStrF(x[i],ffFixed,4,2) + "y="+ FloatToStrF(y,ffGeneral,7,3));

}

}

Наведемо вигляд форми у випадку, якщо введені елементи масиву:

Окрім способу введення, розлянутого у попередньому при­кладі, існує інший, досить зручний метод з використанням спеціальних функцій введення. Одна з них, наприклад функ­ція InputBox(), має таку форму запису:

st = InputBox (заголовок, підказка, значення);

де st — рядок типу AntiString;

заголовок — заголовок вікна, що призначає користувач;

підказка — підказка, яку організує користувач;

значення — інформація, що передається змінній st, тобто значення, що вводиться.

Під час виконання цієї функції на екрані має з’явитися вік­но такого вигляду:

Для цього в програмному коді слід написати:

st = InputBox (“Моя программа”, “Введите х”,” “);

Тут замість параметра «значення» зазначено порожній ря­док, у який вводиться необхідне значення, що являє собою да­не рядкового типу. Для перетворення цього значення в число слід скористатись однією з раніше розглянутих функцій, на­приклад,

х = StrToFloat(st).

Для виведення інформації застосовують функції виведен­ня. Найбільш простою з них є функція ShowMessage(st), де st — змінна чи константа рядкового типу. Наприклад, якщо треба вивести числові значення, то можна скористатись записом:

ShowMessage(“x=”+IntToStr(x)+” y=”+FloatToStrF(y,ffFixed,10,2));.

Під час виконання цієї функції на екрані з’являється вік­но, в якому і виводиться інформація. Місце розташування цьо­го вікна визначає сама система. Після клацання на кнопці ОК, що знаходиться в цьому вікні, воно зникає. Якщо треба розта­шувати вікно виведення в заданому місці, то краще використо­вувати функцію, що має вигляд:

ShowMessagePos(st,x,y);,

де st — виведене повідомлення;

х, у — координати лівого верхнього кута вікна робочої поверхні екрана.

Наприклад, якщо написати ShowMessagePos( “Деление на нуль”,0,0);, то вікно розташується в лівому верхньому куті ек­рана і на ньому буде зазначено відповідний напис. Для роботи з цими функціями в заголовний файл додатка треба підключи­ти файлDialogs.hpp.

Крім введення-виведення, часто виникає необхідність у ке­руванні обчислювальним процесом. Для цього можна використовувати спеціальні компоненти-перемикачі. До них належать: незалежний перемикач CheckBox, група залежних перемикачів RadioButton, а також RadioGroup.

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

Приклад 13.2. У деякому масиві х дійсних чисел розміром n знай­ти мінімальний елемент та його індекс або максимальний елемент та його індекс, або за завданням користувача і мінімальний, і максималь­ний елементи та їхні індекси.

Алгоритм знаходження максимального і мінімального еле­ментів та їх індексів наведено у прикладі 1.3 (частина І).

Розташуємо на формі такі компоненти: Label1 — з текстом у полі Caption «Проверка ввода», Label2 — з ім’ям LbVivod для виведення масиву у вікно форми, кнопку Buttonl з текстом «Вычислить» і кнопку BitBtn із зображенням та текстом «Cancel».

Крім того, вертикально розташуємо три незалежних одна від одної кнопки CheckBox, за допомогою яких можна задавати режими роботи програми в будь-якій комбінації їхнього актив­ного стану. У полі Name цих кнопок введені імена: Min, Мах і Міn_Мах, а властивості Caption очищені. Для визначення ста­ну компонента CheckBox можна використовувати властивість Clicked, яка має значення: «true» — якщо кнопка включена і«false» — якщо кнопка виключена, або властивість State, яка може мати три значення:cbCheaked — якщо кнопка включена, cbUucheaked — якщо виключена і cbGrayed —якщо знаходить­ся в неактивному стані. Для ознайомлення з методикою робот- кнопокCheckBox у програмі використано обидві властивості (Chcked і State), що можуть визначити їх стан.

Після всіх підготовчих робіт програма запускається на викoнання. З появою робочого вікна форми на екрані треба установи­ти спочатку режими роботи програми шляхом включення відпoвідних кнопок. Для активації кожної з кнопок досить клацнут на ній мишкою. Повторне клацання скасовує виділення. Поті треба натиснути кнопку«Вычислить», тобто включити виконан­ня програми в роботу. Введення елементів масиву здійснюєтьс за допомогою функції InputBox(), що виводить віповідне вікно.

У поле введення вікна InputBox треба набрати необхідне число і натиснути або кнопкуОК, або клавішу Enter. Якщо відбулася помилка введення, необхідно її скасувати, натиснув­ши кнопку Cancel, і повторити введення. Відразу в поле мітки LbVivod під заголовком «Проверка ввода» буде виводитися вве­дене значення. По закінченні цього процесу на екрані з’явить­ся вікно ShowMessage() з результатом розв’язання задачі. Як­що була обрана не одна кнопка CheckBox, то після виведення чергового результату треба у вікні виведення натиснути ОК, після чого з’явиться результат обробки наступного заданого ре­жиму тощо. Вікно виведення може з’явиться в будь-якому міс­ці форми, тому що функція ShowMessage() не містить його координат. Якщо це вікно закриває які-небудь потрібні елемен­ти форми, його можна перетягнути в інше’зручне місце, захо­пивши мишкою заголовок вікна.

Розглянутий додаток було тричі запущено на виконання при різних активних кнопкахCheckBox, що видно з трьох ви­ведених вікон і результатів роботи з програмним кодом.




У С++ Builder є кнопки, що завжди поєднуються в групи, але активною в групі може бути лише одна кнопка, при вми­канні якої інші автоматично вимикаються. До таких компонен­тів відноситься кнопка RadioButton, що одна ніколи не вико­ристовується, і група кнопок RadioGroup. Методику викорис­тання цих компонентів розглянемо в такому прикладі.

Приклад 13.3. Необхідно ввести в пам’ять комп’ютера масив за­даного розміру і відсортувати його за завданням користувача за зрос­танням або за спаданням значень елементів. Для введення масиву використати функцію InputBox, а для виведення результату — компо­нента Label.

При сортуванні масиву буде використано метод «пухирця», розглянутий у прикладі 1.4та прикладі 6.11 (частина І).

Розташуємо на формі такі компоненти:

  • Label1 — для розміщення заголовка «Отсортированный массив»;
  • Label2 — для виведення масиву;
  • RadioGroup — кнопки для вибору виду сортування;
  • Button — кнопку для створення події «Вычислить»;
  • BitBtn — кнопку для закінчення роботи з додатком.

Для розміщення компонента RadioGroup і надання їй необ­хідних властивостей треба виконати такі операції:

  • розмістити цей компонент на формі, використовуючи зви­чайну методику, при цьому з’явиться порожня рамка із заголов­ком RadioGroup;
  • у властивість Caption записати варіант заголовка, наприклад, «Видсортировки»;
  • вибрати властивість Items і у вікні, що з’явилося, напи­сати з нового рядка назви кнопок. Кожній назві буде призначена своя кнопка. У цьому прикладі такими назвами є: «По возрастанию» і «По убыванию». Вигляд цього компонента наведено на формі додатка.

У програмному коді показано, як можна виводити масив чисел у кілька рядків.Форми і програмний код мають вигляд:


Приклад 13.4. Ввести в пам’ять комп’ютера масив заданого роз­міру і відсортувати його за завданням користувача методом вставки чи вибору за зростанням або за спаданням значень елементів. Для вве­дення масиву використати функцію InputBox, а для виведення —компоненти ListBox, вибір методу та виду сортування здійснити за допомогою компонентаRadioGroup.

Алгоритми та програмні реалізації вказаних методів сорту­вання розглянуто уприкладах 6.13-6.14 (частина І).

Розташуємо на формі такі компоненти:

  • Label1 — для розміщення заголовка «Исходный массив»;
  • Label2 — для розміщення заголовка «Отсортированный массив»;
  • RadioGroup1 — кнопки для вибору методу сортування;
  • RadioGroup2 — кнопки для вибору виду сортування;
  • ListBox1 — для виведення заданого масиву;
  • ListBox2 — для виведення відсортованого масиву;
  • Button1 — кнопку для створення події «Ввод массива»;
  • Button2 — кнопку для створення події «Сортировать»;
  • BitBtn1 — кнопку для закінчення роботи з додатком.

Розміщення компонента RadioGroup та роботу з ним роз­глянуті в попередньому прикладі (приклад 13.3).

Для введення елементів масиву застосовується функція InputBox. Виведення масивів здійснюється з використанням компонентів ListBox1 та ListBox2. Компонент ListBoxзнахо­диться на сторінці компонентів Standart і надає можливість пе­регляду елементів шляхом їх «прокрутки».

Вихідна форма має вигляд:


Введення елементів масиву здійснюється одночасно з їх відображенням в компонентіListBox1:

Введення результатів сортування відображається в компоненті ListBox2, при цьому візуальне представлення форми має вигляд:


Наведемо програмний код додатку:

//--- объявление переменных

int nmin, і, j, p, rab;

AnsiString st;

const n=15;

float mas[n];

__ fastcall TForm1::TForm1 (TComponent* Owner): TForm(Owner)

{

}

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

void_ fastcall TFormi::ButtoniClick(TObject *Sender)

{

ListBox1->Clear( ); ListBox2->Clear( );

//--- ввод массива

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

{ st=InputBox("Bвод массива mas","Введите "+IntToStr(i+1)+" элемент","");

mas[i]=StrToFIoat(st); ListBoxl->Items->Add(FloatToStr(mas [i] ) );

}

}

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

void_ fastcall TForml::Button2Click(TObject *Sender)

{

switch (RadioGroup1->ItemIndex)

{ case 0: //-------------------------------- сортировка выбором

{

ListBox2->Items->Text="сортировка выбором"; // цикл шагов сортировки

for (і = 0; і < n-1; i++)

{ nmin = i; // цикл определения номера минимального элемента

for (j = i+1; j<n; j++)

if (mas[j] < mas[nmin])

nmin = j;

// перестановка минимального элемента с рассматриваемым

p = mas[i]; //р — для перестановки элементов

mas[i] = mas[nmin];

mas [nmin] = p;

}

} break;

case 1:                //----------------- сортировка вставками

{ ListBox2->Items->Text="сортировка вставками";

// цикл шагов сортировки (і — номер шага)

for (і = 1; і < n; і++)

{ rab = mas [і]; // цикл поиска места элемента-вставки в массиве

for (j = і; j > 0 && rab < mas[j-l]; j-)

mas[j] mas[j-1]; //сдвиг элементов на одну позицию вправо

mas[j] = rab; // вставка элемента

}

} break;

}

//--- вывод отсортированного массива

switch (RadioGroup2->ItemIndex) {

// вывод отсортированного маета по возрастанию 

case 0:

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

{ ListBox2->Items->Add(FloatToStr(mas[i])); }

} break;

//вывод отсортированного масива по убыванию 

case 1:

{ for (і = n-i; i>= 0; і--)

{ ListBox2->Items->Add(FIoatToStr(mas[i])); }

} break;

}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *