- •Основи програмування мовою Паскаль
- •Часть 1. Основы языка Паскаль 2
- •Часть 2. Элементы профессионального программирования на Паскалі 62
- •Частина 1. Основи мови Паскаль
- •1. Алгоритм і програма
- •1.1. Алгоритм
- •1.2. Властивості алгоритму
- •1.3. Форми запису алгоритму
- •1.4. Програма й програмне забезпечення
- •1.5. Етапи розробки програми
- •2. Дані в мові Паскаль
- •2.1 Константи
- •2.2 Змінні й типи змінних
- •3. Арифметичні вирази
- •4. Лінійний обчислювальний процес
- •4.1 Оператор присвоювання
- •4.2 Оператор уведення
- •4.3 Оператор виведення
- •4.4 Керування виводом даних
- •4.5 Вивід на друк
- •5. Структура простої програми на Паскалі
- •6. Компілятор і оболонка Turbo Pascal
- •7. Обчислювальний процес, що розгалужується, і умовний оператор
- •7.4. Короткий умовний оператор
- •If логічний_вираз then оператор1;
- •7.5. Повний умовний оператор
- •If логічний_вираз then оператор1
- •7.7. Вкладені умовні оператори
- •7.9. Приклади програм з умовним оператором
- •8. Директиви компілятора й обробка помилок уведення
- •9. Оператор циклу. Цикли із передумовою і після-умовою
- •10. Цикл із лічильником і дострокове завершення циклів
- •11. Типові алгоритми табулювання функцій, обчислення кількості, суми й добутку
- •11.1 Алгоритм табулювання
- •11.2 Алгоритм організації лічильника
- •11.3 Алгоритми нагромадження суми й добутку
- •12. Типові алгоритми пошуку максимуму й мінімуму
- •13. Розв'язок навчальних завдань на цикли
- •14. Одномірні масиви. Опис, уведення, вивід і обробка масивів на Паскалі
- •15. Розв'язок типових завдань на масиви
- •Частина 2. Елементи професійного програмування на Паскалі
- •16. Кратні цикли
- •16.1 Подвійний цикл і типові завдання на подвійний цикл
- •16.2 Оператор безумовного переходу
- •17. Матриці й типові алгоритми обробки матриць
- •18. Підпрограми
- •18.1 Процедури
- •18.2 Функції
- •18.3 Масиви як параметри підпрограми
- •18.4 Відкриті масиви
- •19. Безлічі й перечислимые типи
- •20. Обробка символьних і строкових даних
- •20.1. Робота із символами
- •20.2 Робота з рядками
- •21. Текстові файли
- •21.1 Загальні операції
- •21.2 Приклади роботи з файлами
- •21.3 Робота з параметрами командного рядка
- •22. Записи. Бінарні файли
- •23. Модулі. Створення модулів
- •23.1. Призначення й структура модулів
- •Implementation
- •23.2. Стандартні модулі Паскаля
- •24. Модуль crt і створення простих інтерфейсів
- •25. Модуль Graph і створення графіки на Паскалі
- •Додаток 1. Таблиці Ascii-Кодів символів для операційних систем dos і Windows
- •Додаток 2. Основні директиви компілятора Паскаля
- •Додаток 3. Основні повідомлення про помилки Паскаля
- •Додаток 4. Додаткові лістинги програм
- •Додаток 5. Розширені коди клавіатури
- •Ascii‑ коди
- •Розширені коди
- •Додаток 6. Правила гарного коду
- •Додаток 7. Рекомендована література
18.4 Відкриті масиви
Недоліки вивченого раніше способу передачі масивів-параметрів очевидні: по-перше, необхідність опису типу даних масиву оператором typeпорушує правило переносимости підпрограм (дія підпрограми стає залежним від зовнішнього оператора), по-друге, для вказівки реальної розмірності переданих у підпрограму масивів доводиться використовувати додаткові параметри-значення, по-третє, при обробці масивів меншої, чим зазначене в операторіtypeрозмірності, неефективно губиться оперативна пам'ять. У який те мері виправити ці недоліки дозволяє використаннявідкритих масивів.
Спосіб підходить тільки для одномірних масивів. Використовувати його з матрицями можливо, якщо інтерпретувати матрицю як вектор (див. главу 17).
Наявні в програмі вектори описуються в розділі varзвичайним способом, без визначення типуtype. У списку формальних параметрів підпрограми параметр-вектор вказуєтьсябездіапазону розмірності:
Function Sum(Var X : Array Of Real) : Real;
При виклику підпрограми фактичний параметр-масив підставляється на місце формального:
Var a:array [1..5] of real;
S:real;
. . .
S:=Sum(a);
Відкритим залишається питання – як відслідковувати з підпрограми розмірність переданого масиву? Для цього в Паскалі існують стандартні функції LowіHigh. Їхнім єдиним параметром передається ідентифікатор масиву,Lowповертає найнижче значення припустиме значення індексу, аHigh– найвище. ЯкщоA– одномірний масив, величиниLow(A)іHigh(A)можна безпосередньо застосовувати як границі циклуfor:
Function Sum(Var X : Array Of Real) : Real;
Var I : Word;
S : Real;
Begin
S:=0;
For I:=Low(X) To High(X) Do S:=S+X[I];
Sum:=S;
End;
Щоб завершити приклад, викличемо написану функцію Sum:
Const a:array [1..5] of real=(1,2,3,4,5.5);
Var s:real;
begin
writeln (Sum(a):6:1);
end.
Як правило, номер першого елемента відкритого масиву дорівнює нулю, однак, надійніше все-таки вказувати Low. Приведемо ще один приклад програми, що включає підпрограму з відкритими масивами в якості параметрів.
Пр.Знайти кількість елементів вектора X[7], що попадають в інтервал [0,3] і кількість елементів вектора Y[5], що попадають в інтервал [-1,1].
Для введення елементів масиву із клавіатури напишемо процедуру Input, якої все-таки прийде передавати розмірність масиву-параметра (адже вводяться два вектори різної розмірності). Тому вInputвикористаний той факт, що нумерація елементів відкритого масиву за замовчуванням виконується в нуля. Функціїkol, що обчислює кількість елементів відкритого масиву, що попадають в інтервал[x1,x2], досить стандартної вказівкиLowіHigh:
var x:array [1..7] of real;
y:array [1..5] of real;
k1,k2,i:integer;
procedure Input (n:integer; var a:array of real);
var i:integer;
begin
writeln ('Enter ',n,' items of array:');
for i:=0 to n-1 do read (a[i]);
end;
function Kol (var a:array of real; x1,x2:real):integer;
var i,k:integer;
begin
k:=0;
for i:=Low(a) to High(a) do
if (a[i]>=x1) and (a[i]<=x2) then k:=k+1;
Kol:=k;
end;
begin
Input (7,x);
Input (5,y);
k1:=Kol(x,0,3);
k2:=Kol(y,-1,1);
writeln ('k1=',k1,' k2=',k2);
end.