Ознайомимося з особливостями обробки масивів та методами введення-виведення цих даних у середовищі С++ 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 другому варіанті для виведення масиву і результату обчислень застосувати компонент Меmо — багаторядковий редактор.
Розмістимо на формі такі компоненти: 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; }