Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОБЩИЙ_файл_ПОСОБИЕ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
22.69 Mб
Скачать

До середньої ціни

На рис. 5.62 зображено алгоритм сортування масивів за алфавітом найменувань товарів.

Рис. 5.62. Алгоритм сортування даних у масивах

В алгоритмі для сортування використовується метод порівняння суміжних (сусідніх) пар елементів масиву, у якому зберігаються найменування товарів (NT). Якщо в результаті порівняння код найменування поточного i-го товару виявиться більше наступного, то їх варто поміняти місцями. Це можна зробити, використовуючи буферну (робочу) комірку пам'яті. Крім того, необхідно поміняти місцями елементи з відповідними індексами в масивах цін (Z), кількості товарів (K) і в масиві їх вартостей (Vartist).

Для забезпечення сортування використовується вкладений цикл із параметром (зовнішній – з параметром j і внутрішній – з параметром i).

Структура даних

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

При сортуванні даних для організації перестановок необхідно передбачити робочі комірки (РобКом), тип даних у яких повинен відповідати типам даних масивів.

Імена змінних, їхнє призначення й типи представлені в табл. 5.13.

Таблиця 5.13

Структура даних проекту

Реквізит

Ім'я змінної

Тип змінної

Примітки

1

2

3

4

Найменування товару

StrName()

String

Масив

Ціна

CurZina()

Currency

Масив

Кількість

IntKilk()

Integer

Масив

Вартість

CurVartist()

Currency

Масив

РобКом для НТ

R_NT

String

РобКом для Ціни

R_Z

Currency

РобКом для Кіл

R_Kilk

Integer

Закінчення таблиці 5.13

1

2

3

4

РобКом для Ст.

R_Vartist

Currency

Сума цін

Sum_Zina

Currency

Середня ціна

Sr _Zina

Currency

Відхилення ціни від середнього значення

Delta_Min

Currency

Мінімальна ціна

CurMin

Currency

Параметри циклу

i, j

Integer

Номер мінімального елемента

k

Integer

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

Інтерфейс проекту

Для відображення вихідних даних і результатів розрахунків на формі доцільно мати відповідні масиви елементів управління.

У розглянутому прикладі найменування товарів відображаються із застосуванням елемента управління ListBox (список), у якому кожний елемент списку нумерується системою від 0 до n-1.

Для відображення ціни товару, його кількості й вартості кожного товару використовуються масиви елемента управління TextBox (текстове поле), нумерація елементів яких також від 0 до n-1. Для виводу сумарної вартості всіх товарів також доцільно використовувати елемент управління TextBox.

Для виконання процедур вирішення задач (розрахувати вартості товарів, знайти товар з мінімальним відхиленням від середньої ціни, відсортувати товари за алфавітом, записати результати обробки у файл) доцільно на формі розмістити елементи управління CommandButtоn (кнопки управління).

Реалізований у програмному середовищі Visual Basic ескіз екранної форми для роботи з масивами даних і масивами елементів управління представлено на рис. 5.63.

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

Рис. 5.63. Форма з масивами елементів управління

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

Код проекту

Введення вхідних даних

Вхідні дані, що необхідні для обробки, доцільно зберігати в текстовому файлі на будь-якому носії. При цьому структура розміщення даних у цьому файлі обумовлена порядком роботи з файлами в цьому програмному середовищі.

Зокрема, відомості про кожний товар (запис) повинні являти собою абзац, а елементи запису розділятися символами "," або ";". Приклад даних такого файлу, що має ім'я "Товар.txt", представлений на рис. 5.64.

Принтер лазерний,876.44,15

Монітор SyncMaster,1366.55,5

Маніпулятор "Миша",54.00,13

Сканер,761.80,7

Флеш-модуль,75.77,8

Привід DVD/RW,170.33,14

Рис. 5.64. Зміст файлу "Товар.txt"

Для роботи з файлом у режимі довільного доступу його потрібно відкрити оператором Open, що має такий вигляд:

Open <Ім'я файлу> For Input As #N,

де <Ім'я файлу> – вираження строкового типу (у розглянутому прикладі це "Товар.txt");

Input – введення;

N – номер каналу обміну (дескриптор), якому може бути присвоєне значення від 0 до 255.

Ім'я файлу та шлях доступу до нього можут бути уведені через діалогове вікно InputBox, у результаті чого змінної строкового типу присвоюється ім'я файлу й шлях до нього. Якщо це значення заздалегідь відомє, то воно може бути зазначене у вигляді третього параметра функції InputBox() (рис. 5.65).

Рис. 5.65. Діалогове вікно введення імені файлу

Після виконання потрібних операцій з файлом його необхідно закрити оператором Close.

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

Розрахунок вартості кожного товару

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

Option Explicit

Option Base 1

' Оголошення глобальних змінних

Public StrNaim(6) As String * 20, CurZina(6) As Currency, _

IntKilkist(6) As Integer, CurVartist(6) As Currency

Public StrSoob As String

' Запис даних у масиви елементів з текстового файлу

Private Sub Form_Load()

Dim i As Integer

StrSoob = InputBox("Уведіть ім'я текстового файлу даних" _

& " із вказівкою шляху до нього", "Масив", "D:\Масиви\Товар.txt")

Open StrSoob For Input As #1

For i = 1 To 6

Input #1, StrNaim(i), CurZina(i), IntKilkist(i)

LstТовари.List(i - 1) = StrNaim(i)

TxtЦіна.Item(i - 1) = Format(CurZіna(i), "# ##0.00")

TxtКількість.Item(i - 1) = Format(IntKilkist(i), "# ##0")

Next i

Close #1

End Sub

Рис. 5.66. Процедура читання даних з текстового файлу

У заголовку замість ключового слова Sub, що використовується в процедурах, необхідно застосувувати слово Function, після якого перераховується список формальних параметрів із вказівкою типу даних кожного з них, а також тип одержуваного результату. У тілі функції обов'язково повинен бути хоча б один оператор,котрий присвоює імені функції значення, що обчислюється. Завершується опис функції ключовими словами End Function. Функція розрахунку вартості товару, ім'я якої CurVart, представлена на рис. 5.67.

Function CurVart(Int As Integer, Cur As Currency) As Currency

CurVart = Int * Cur

End Function

Рис. 5.67. Функція розрахунку вартості товару

Процедура розрахунку вартості кожного виду товару та вводу цих значень у масив текстових полів представлена на рис. 5.68. У цій процедурі проводиться також розрахунок вартості всіх товарів і вивід отриманого значення у відповідне текстове поле на формі.

'Розрахунок вартості кожного товару

Private Sub CmdВартисть_Click()

Dim i As Integer

Dim CurSum As Currency

CurSum = 0

For i = 1 To 6

'Використання функції CurVart для розрахунку вартості

CurVartist(i) = CurVart(IntKilkist(i), CurZina(i))

TxtВартість.Item(i - 1) = Format(CurVartist(i), "# ##0.00")

CurSum = CurSum + CurVartist(i)

Next i

TxtЗагВарт.Text = Format(CurSum, "# ##0.00")

End Sub

Рис. 5.68. Процедура розрахунку вартості товарів

Пошук найбільш типового товару

У прикладі під найбільш типовим товаром розуміється товар, ціна якого має мінімальне відхилення по модулю від середньої ціни всіх товарів. Для вирішення цього завдання потрібно спочатку визначити сумарну ціну всіх товарів у циклі з параметром, а після завершення циклу розділити отриману суму на кількість видів товарів. Ці операції в алгоритмі (див. рис. 5.56), представлені у якості певного процесу.

На рис. 5.69 представлений програмний код процедури пошуку найбільш типового товару, що реалізується при настанні події – клацання по кнопці Пошук типового товару (CmdПошук)на формі.

Відповідно до алгоритму сортування (див. рис. 5.57) необхідно в програмному коді організувати вкладений цикл із параметром. При цьому як у зовнішньому, так і у внутрішньому циклі кількість повторень циклу обов'язково повинна бути на одиницю менше розмірності масиву.

' Пошук найбільш типового товару

Private Sub CmdПошук_Click()

Dim Sum_Zina As Currency, Delta_Min As Currency, _

S_sr As Currency, Delta_S As Currency, k As Integer, i As Integer

Sum_Zina = 0

' Цикл визначення сумарної вартості всіх товарів

For i = 1 To 6

Sum_Zina = Sum_Zina + CurZina(i)

Next i

' Визначення середньої ціни товарів

S_sr = Sum_Zina / 6

MsgBox "Середня ціна товарів дорівнює " & _

Format(S_sr, "# ##0.00") & " грн."

Delta_Min = Abs(CurZina(1) - S_sr)

k = 1

For i = 2 To 6

If Delta_Min > Abs(CurZina(i) - S_sr) Then

Delta_Min = Abs(CurZina(i) - S_sr)

k = i

End If

Next i

MsgBox "Товар " & StrNaim(k) & " коштує " & _

Format(CurZina(k),"# ##0.00")

MsgBox "Відхилення від середньої ціни становить " & _

Format(Abs(CurZina(k) - S_sr), "# ##0.00") & " грн."

End Sub

Рис. 5.69. Процедура пошуку найбільш типового товару

Результати сортування в розглянутому прикладі виводяться на окрему форму, що попередньо відображається оператором FrmДрук.Show, а потім на неї в циклі з параметром можна виводити відсортовані дані оператором FrmДрук.Print. Процедура сортування представлена на рис. 5.70. Вона запускається на виконання клацанням на кнопці Сортування (CmdСортування).

' Сортування за алфавітом найменувань товарів

Private Sub CmdСортування _Click()

Dim R_NT As String, _

R_Z As Currency, _

R_Kilk As Integer

Dim i As Integer, j As Integer

For j = 1 To 5

For i = 1 To 5

If StrNaim(i) > StrNaim(i + 1) Then

R_NT = StrNaim(i)

StrNaim(i) = StrNaim(i + 1)

StrNaim(i + 1) = R_NT

R_Z = CurZina(i)

CurZina(i) = CurZina(i + 1)

CurZina(i + 1) = R_Z

R_Kilk = IntKilkist(i)

IntKilkist (i) = IntKilkist (i + 1)

IntKilkist (i + 1) = R_Kilk

R_Z = CurVartist(i)

CurVartist(i) = CurVartist(i + 1)

CurVartist(i + 1) = R_Z

End If

Next i

Next j

FrmДрук.Show

For i = 1 To 6

FrmДрук.Print StrNaim(i), Format(CurZina(i), " # ##0.00"), _

Format(IntKilkist(i), "##0"), Format(CurVartist(i), " # ##0.00")

Next i

End Sub

Рис. 5.70. Процедура сортування масивів і виводу її результатів