Конструктор програм на опрацювання масивів

Про матеріал
Набір окремих блоків кодів мовою Object Pascal (середовище програмування Lazarus), які допоможуть скомпонувати код деяких типових програм з використанням статичних та динамічних одновимірних масивів. Для використання, потрібно знайти ситуацію, яку необхідно реалізувати в програмі, і переписати собі відповідний фрагмент коду з урахуванням специфіки конкретної програми.
Перегляд файлу

Конструктор програм на опрацювання масивів

Цей конструктор являє собою набір окремих блоків кодів мовою Object Pascal, які допомагатимуть вам скомпонувати код деяких типових програм з використанням статичних та динамічних одновимірних масивів.

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

Зміст

Створення масиву

Задати статичний масив

Зчитати дані з поля Memo й розмістити їх у масиві

Задати динамічний масив

Заповнити динамічний масив даними з поля Memo

Заповнити динамічний масив елементами арифметичної прогресії

Обробка елементів масиву

Обчислити суму елементів масиву

Підрахувати кількість елементів, що відповідають певній умові

Знайти перший елемент, який відповідає певній умові

Визначити чи є шуканий елемент в масиві

І спосіб

ІІ спосіб

Знайти найбільший/найменший елемент масиву

Знайти два елементи, що відповідають певним умовам і поміняти їх місцями

Сортування елементів масиву

Метод вибору

Виведення елементів масиву

Вивести елементи масиву в поле Memo

Візуалізація елементів масиву

Побудувати стовпчасту діаграму

 


Створення масиву

Задати статичний масив

var a:array [1..10] of real; i:integer;

a  ім’я масиву;

1..10  кількість елементів у статичному масиві. Цей запис означає, що перший елемент масиву має номер 1, а останній - номер 10. Нумерація може починатися з нуля [0..15] або й взагалі з будь-якого натурального числа [2005..2010].

real  в цьому місці розміщується вказівка на тип даних, які містяться в масиві - дійсні числа (real), цілі числа (integer) тощо.

Зчитати дані з поля Memo й розмістити їх у масиві

for i:=1 to 10 do
 a[i]:=StrToFloat(Memo1.Lines[i-1]);

Float якщо в полі Memo і в масиві повинні міститися дробові числа (тип real), тоді StrToFloat;
якщо в полі Memo і в масиві повинні міститися цілі числа (тип integer), тоді StrToInt;
для зчитування з поля Memo рядкових величин (тип string) ця функція не використовується (a[i]:=Memo1.Lines[i-1])

i-1 якщо нумерація елементів масиву починається НЕ з нуля, тоді Memo1.Lines[i-1], якщо з нуля, тоді Memo1.Lines[i].

Задати динамічний масив

var a:array of real; i,k:integer;
...
procedure ...
 k:=Memo1.Lines.Count;
 SetLength(a,k);
 ...


Заповнити динамічний масив даними з поля Memo

for i:=0 to k-1 do
 a[i]:=StrToFloat(Memo1.Lines[i]);

Нумерація елементів динамічного масиву починається з 0.

Заповнити динамічний масив елементами арифметичної прогресії

З форми вводяться перший член прогресії a1, її разниця d і кількість елементів прогресії n:

var a:array of real; i,n:integer; a1,d:real;
...
procedure ...
 a1:=StrToFloat(Edit1.Text);
 d:=StrToFloat(Edit2.Text);
 n:=StrToInt(Edit3.Text);
 SetLength(a,n);
 a[0]:=a1;
 for i:=1 to n-1 do
  a[i]:=a[i-1]+d;
...

Для геометричної прогресії - усе те саме, тільки в тілі циклу a[i]:=a[i-1]*d;

Обробка елементів масиву

Обчислити суму елементів масиву

var a:array [1..10] of real; i:integer; s:real;
...
procedure ...
    ...

    s:=0;
    for i:=1 to 10 do
        s:=s+a[i];
...

Якщо потрібно обчислити добуток, тоді s:=1 і в тілі циклу s:=s*a[i]

Підрахувати кількість елементів, що відповідають певній умові

procedure ...
...
    s:=0;
    for i:=1 to 10 do
        if a[i]<умова> then s:=s+1;
...

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

Якщо треба порахувати додатні чи від’ємні числа, тоді

if a[i]>0 then s:=s+1; або if a[i]<0 then s:=s+1;.

Якщо підраховується, наприклад, кількість парних чисел, тоді

if a[i] mod 2 = 0 then s:=s+1;

Знайти перший елемент, який відповідає певній умові

procedure ...
...
    m:=0;
    for i:=1 to 10 do
        if a[i]<умова> then
                       begin
                           m:=a[i];
                           break//переривання роботи циклу
                       end;
...

Визначити чи є шуканий елемент в масиві

Потрібно не порахувати кількість таких елементів, не знайти на якому цей елемент стоїть місці, а просто відповісти на питання “Там є таке, чи ні?”.

Розв’язувати таке завдання можна двома способами.

І спосіб

Використати код підрахунку кількості елементів, які відповідають заданій умові. Зрозуміло, якщо такий елемент в масиві є, то змінна s отримає значення більше нуля. Якщо s=0, тоді такого елемента немає:

 

procedure ...
...
    s:=0;
    for i:=1 to 10 do
        if a[i]<умова> then s:=s+1;
    if s>0 then ShowMessage('В масиві такий елемент є')
           else ShowMessage('В масиві такого елемента немає')
...

ІІ спосіб

Ввести додаткову змінну логічного типу і як тільки буде знайдене потрібне число, надавати йому значення true і переривати цикл, а потім перевіряти, з яким значенням true чи false він завершився.

var a:array [1..10] of real; i:integer; f:boolean;
...
procedure ...
...
 f:=false;
 for i:=1 to 10 do
  if a[i]<умова> then
    begin
     f:=true;
     break
    end;
 if f=true then ShowMessage('Шукане число є')
       else ShowMessage('Такого числа немає')
...

Замість f=true можна написати просто if f then...

Знайти найбільший/найменший елемент масиву

var a:array [1..10] of real; i:integer; max:real;
...
    max:=a[1];
    for i:=2 to 10 do
        if a[i]>max then max:=a[i]
...

Для знаходження найменшого елемента масиву, усе так само тільки не max, а min і в тілі циклу if a[i]<min then min:=a[i]

Знайти два елементи, що відповідають певним умовам і поміняти їх місцями

Задача може бути зведена до випадку пошуку елемента за певною умовою. Спочатку перебираємо в циклі усі елементи масиву і знаходимо елемент, який відповідає першій умові, а потім так само шукаємо елемент, який відповідає другій умові. Для того, щоб можна було поміняти ці елементи місцями запам’ятовуємо не тільки самі елементи масиву, а й їх номери.

Приклад: Знайти найбільший і найменший елементи й поміняти їх місцями

var a:array [1..10] of real; i,num_max,num_min:integer; max,min:real; //num_max і num_min - номери найбільшого й найменшого елементів масиву
...
 //шукаємо максимальний елемент:
 max:=a[1];
 num_max:=1;
 for i:=2 to 10 do
  if a[i]>max then
   begin
    max:=a[i];
    num_max:=i
   end;
 //шукаємо мінімальний елемент:
 min:=a[1];
 num_min:=1;
 for i:=2 to 10 do
  if a[i]<min then
   begin
    min:=a[i];
    num_min:=i
   end;
 //міняємо місцями найбільший і найменший елементи:
 a[num_max]:=min;
 a[num_min]:=max;
...

Сортування елементів масиву

Метод вибору

Приклад: відсортувати елементи масиву в порядку зростання (метод вибору)

var a:array [1..10] of real; i,j,num_min:integer; min:real;
procedure ...
...
 for i:=1 to 9 do
 begin
  min:=a[i];
  num_min:=i;
  for j:=i+1 to 10 do
   if a[j]<min then
    begin
     min:=a[j];
     num_min:=j;
    end;
  a[num_min]:=a[i];
  a[i]:=min;
 end;
...

Виведення елементів масиву

Вивести елементи масиву в поле Memo

Memo2.Clear;//очищення поля, куди будуть виводитися дані
for i:=1 to 10 do
 Memo2.Lines.Append(FloatToStr(a[i]));

Якщо масив був динамічний, тоді for i:=1 to k do і далі за текстом.

Візуалізація елементів масиву

Побудувати стовпчасту діаграму

Якщо кількість елементів масиву заздалегідь відома

Якщо кількість елементів масиву, який буде зображуватися стовпчастою діаграмою, відома, тоді на форму треба виставити таку ж кількість елементів Shape і в ході роботи програми у кожного з них змінити його висоту (Shape1.Height...) .

Використання елементів Shape

procedure ...
var a:array [1..5] of integer; b:array [1..5] of TShape; i:integer;
begin
  b[1]:=Shape1;
  b[2]:=Shape2;
  b[3]:=Shape3;
  b[4]:=Shape4;
  b[5]:=Shape5;
  for i:=1 to 5 do
   a[i]:=StrToInt(Memo1.Lines[i-1]);
  for i:=1 to 5 do
   b[i].Height:=a[i];
end;

Властивість Height об’єкта Shape може набувати тільки цілочислених значень, тому слід використовувати масиви з даними типу integer або перед побудовою діаграми округлювати дробові числа в масиві з даними типу real до цілих.

Побудова діаграми таким способом призведе до того, що стовпчики буде розміщено зверху вниз (їх буде вирівняно по верхньому краю).

Масштабування діаграми на формі

Доцільно застосовувати тоді, коли деякі стовпчики через їх велику висоту не поміщаються на формі і виходять за її межі. У цьому випадку у масиві шукають максимальний елемент і перераховують висоти усіх стовпчиків пропорційно до висоти цього максимального стовпчика:

var ... max:integer;
...
 max:=a[1];
 for i:=2 to 5 do
  if a[i]>max then max:=a[i];
 for i:=1 to 5 do
  b[i].Height:=Round(a[i]/max*100);

100 - це просто деякий коефіцієнт, який задається відповідно до того, якої висоти буде найвищий стовпчик на формі. В даному випадку, найбільше число в масиві буде зображено стовпчиком висотою в 100px. За бажання це число можна поставити інше.

Таким же способом можна візуалізувати й занадто малі величини, встановивши вручну висоту найменшого стовпчика.

Вирівнювання діаграми по нижньому краю

Ідея вирівнювання стовпчиків діаграми по нижньому краю полягає у зміні їх властивості Top відповідно до висоти стовпчика. Спочатку прочитується поточний Top стовпчика, потім він збільшується на його Height (Shape зсувається вниз так, що його верхній край опиняється на його нижній межі), а потім Top зменшується на величину a[i] (стовпчик піднімається вгору на a[i]) і уже звідти, згори вниз будується новий стовпчик з висотою, що задана елементом масива:

for i:=1 to 5 do
        begin
             b[i].Top:=b[i].Top+b[i].Height-a[i];
             b[i].Height:=a[i];
        end;

Для того, щоб можна було будувати і стовпчики, що позначатимуть від’ємні елементи масива теж, потрібно задавати властивість Height по модулю і після виконання побудови ще раз підкоригувати Top у стовпчиків, що позначають від’ємні значення:

for i:=1 to 5 do
        begin
             b[i].Top:=b[i].Top+b[i].Height-a[i];
             b[i].Height:=abs(a[i]);
             if a[i]<0 then b[i].Top:=b[i].Top-abs(a[i])
        end;

Якщо кількість елементів масиву заздалегідь не відома

Якщо кількість елементів масиву задається в ході виконання програми, тоді передбачити, скільки елементів Shape знадобится для відображення чисел зарані прорахувати досить складно. У такому випадку найоптимальнішим буде застосування динамічного масиву і

Використання методу Canvas

procedure ...
var a:array of integer; i,k,m,h,t:integer;
begin
    //створення й заповнення динамічного масиву:
    k:=Memo1.Lines.Count;
    SetLength(a,k);
    for i:=1 to k do
        a[i]:=StrToInt(Memo1.Lines[i-1]);
    //малювання діаграми:
    m:=5;  //відступ від лівого краю форми
    h:=20; //відступ від нижнього краю форми до нижнього краю стовпчика
    t:=25; //ширина стовпчика
    Canvas.Brush.Color:=Form1.Color;  //колір тла
    Canvas.FillRect(Canvas.ClipRect); //очищення Canvas
    for i:=1 to k do
        begin
            Canvas.Brush.Color:=clWhite; //колір стовпців

//побудова стовпчика за координатами (x1,y1,x2,y2):
            Canvas.Rectangle(m, Form1.Height-h, m+t, Form1.Height-h-a[i]);

            m:=m+t //перехід до наступної позиції
        end;
end;

 

 

 

1

docx
Додано
18 листопада 2021
Переглядів
702
Оцінка розробки
Відгуки відсутні
Безкоштовний сертифікат
про публікацію авторської розробки
Щоб отримати, додайте розробку

Додати розробку