Чому дорівнює 1 Мікропаскаль

0 Comments

Pascal/Змінні

Ми навчилися виводити результати обчислень; але значно частіше ці результати треба зберігати в програмі для подальшого використання. Зберігаються такі результати у змінних – ділянках пам’яті, які мають власні імена в програмі. Розглянемо код

program LinearEquation; var a,b,x:real; begin writeln('Ця програма розв''язує лінійне рівняння ax=b'); a:=3; b:=9; writeln('a=',a); writeln('b=',b); x:=b/a; writeln('x=',x) end. 

Розділ var(від англ. variable – змінна) проголошує 3 змінні – a, b та x – дійсного типу (real, англ. дійсний). Змінні дійсного типу призначений для роботи з числами, схожих на звичайні дійсні числа, з певними обмеженнями реалізації (вони не можуть бути більше і менше певних значень, і також є мінімальна відстань між числами; втім, ці обмеження є достатньо широкими, щоб в навчанні не звертати на них уваги). Альтернативним типом чисел є цілий тип(integer, англ. цілий), числа якого, вочевидь, можуть набувати тільки цілих значень. З іншими стандартними простими типами можна ознайомитися у відповідному розділі.

В загальному вигляді розділ var виглядає так:

var ідентифікатор, ідентифікатор, . : тип; ідентифікатор, ідентифікатор, . : тип; . ідентифікатор, ідентифікатор, . : тип; 

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

Рядок a:=3; містить оператор присвоювання :=; цей оператор записує свій правий операнд (в цьому випадку, 3) в лівий (a). Таким чином, після виконання цього рядку a стає рівним 3. Важливо зрозуміти, що оператор присвоювання – не математичне твердження “a дорівнює 3”, як його часто сприймають новачки, а команда “записати в a значення 3”; будь-яка інша команда може змінити це значення. Досить часто в Паскалі вживаються команди на кшталт x:=x+1; ця команда не містить суперечність, як може видатися, а бере поточне значення x, додає до нього 1 і записує знову в змінну x – тобто її слід сприймати як “збільшити x на 1”.

Команда writeln(‘a=’,a); виводить значення змінної a; одразу зауважимо, що формат числа трохи незвичний: замість очікуваного 3 ми бачимо 3.000000000E+00. Літера e є в цьому випадку синонімом виразу “10 в степені”, тобто це можна записати як 3.0 * 10 0 – що, власне, дорівнює просто 3. Більшість компіляторів Паскалю типово використовують такий формат виводу дійсних чисел; пізніше ми навчимося змінювати формат виводу.

Рядок x:=b/a;, як ви вже здогадалися, обчислює значення b/a і записує його в змінну x. Тут потрібне пояснення: компілятор Паскаля не вміє розв’язувати рівняння, він тільки виконує програму. Тому для розв’язання задачі в Паскалі треба спершу розв’язати її математично (отримавши з рівняння a*x=b вираз x=b/a), і тільки потім запрограмувати цей розв’язок.

Останній рядок виводить обчислене значення x. Тут треба зазначити, що останні два рядки можна було б сумістити в

і викинути змінну x з розділу var; але в “довгій” формі програма виглядає більш очевидною – обчислення x (власне, те, для чого програма була написана) винесене в окрему команду, що робить зручнішим пошук цієї команди і сприйняття програми в цілому.

Звернемо також увагу на те, що всі рядки між begin та end, крім останнього, закінчуються крапкою з комою. Крапка з комою служить для відокремлення команд одна від одної, а оскільки end не є командою, відокремлюватися від нього непотрібно. Тим не менш, часто ставлять крапку з комою і перед end. Це не є помилкою – крапка з комою, якщо не розділює команди, розглядається як пустий оператор – тобто відсутність дії, цей оператор не впливає на виконання програми.

Базовий ввід [ ред. ]

Ми навчилися, хоча б в загальних рисах, перетворювати числа всередині програми і виводити їх. Але програмі, крім цього, ще треба отримувати числа ззовні – тобто вводити їх. Для вводу чисел служить команда readln (парну до неї команду read ми розглянемо пізніше). Порівняйте наведений код з тим, що вище:

program LinearEquation; var a,b,x:real; begin writeln('Ця програма розв''язує лінійне рівняння ax=b'); write('a='); readln(a); write('b='); readln(b); x:=b/a; writeln('x=',x) end. 

Як бачимо, замість присвоювання змінні a та b подані параметрами команди readln. Що ж відбудеться, якщо запустити програму? Ми побачимо тільки a=. і все. Що це означає? Що програма виконує команду readln(a) – а саме, чекає, доки ми введемо з клавіатури певне значення. Введемо на клавіатурі 10 і натиснемо ↵ Enter . Рядком нижче з’явиться напис b=. Це означає, що команда readln(a) закінчила роботу і в a тепер збережено значення, введене з клавіатури – а саме 10, і тепер програма очікує на ввід змінної b. Введемо 20 (і знову натиснемо ↵ Enter ). Програма обчислить значення x і виведе його – як і в попередній версії, але тепер це буде вже не фіксоване значення, а таке, що залежить від того, що ми ввели.

Константи [ ред. ]

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

const a = 10; b:real = 20.0; chyslo_pi = 3.1415926; 

Тип константи можна не вказувати, але необхідно вказати її значення. Якщо тип не вказано, компілятор бере тип значення (константа a в цьому прикладі ціла, а chyslo_pi – дійсна константа).

Використання констант дозволяє значно легше читати і змінювати програму в майбутньому. Ось програма для обчислення частки і остачі від ділення на 5:

Program Ostacha; var x:integer; begin writeln('Ця програма обчислює частки і остачі від ділення на 5.'); writeln('Введіть ділене:'); readln(x); writeln(x, ' / 5 = ', x div 5, ' (ост. ', x mod 5, ')'); end. 

Для того, щоб змінити її на програму обчислення частки і остачі від ділення на 13, треба внести 4 правки. А в цій програмі

Program Ostacha; var x:integer; const dilnyk=5; begin writeln('Ця програма обчислює частки і остачі від ділення на ', dilnyk, '.'); writeln('Введіть ділене:'); readln(x); writeln(x, ' / ', dilnyk, ' = ', x div dilnyk, ' (ост. ', x mod dilnyk, ')'); end. 

Знадобиться всього одна правка – без зміни поведінки програми.

Pascal/Базові масиви

Досить часто виникає потреба обробляти зберігати ряд однотипних змінних разом. Наприклад, якщо програма має зберігати (наприклад, для знаходження середнього) оцінки з інформатики 10 учнів, можна писати так:

program Otsinky; var o1,o2,o3,o4,o5,o6,o7,o8,o9,o10:integer; s:real; begin writeln('Введіть оцінки:'); readln(o1,o2,o3,o4,o5,o6,o7,o8,o9,o10); s:=(o1+o2+o3+o4+o5+o6+o7+o8+o9+o10)/10; writeln(s); end. 

Але такий спосіб запису:

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

Щоб розв’язати ці проблеми, в мові Паскаль існує спеціальний тип даних – масив. Запис

var o:array[1..10] of integer; 

визначає 10 змінних типу integer, об’єднаних під єдиним ім’ям. Окремі змінні називаються за індексом у квадратних дужках: o[1], o[5], o[10]. Індекс може бути змінною (o[i] – i-ий елемент масиву) чи навіть виразом: o[max(i,j)]. Зверніть увагу на те, що тип елементів масиву, а також найменший і найбільший можливі індекси масиву вказуються при його визначенні; спроба звернутися до елементу, що виходить за ці межі, на кшталт o[11] чи o[30] викличе помилку. Перепишемо програму, наведену вище:

program Otsinky; var o:array[1..10] of integer; i:integer; s:real; begin for i:=1 to 10 do begin write('Введіть оцінку ',i,'-го учня:'); readln(o[i]); end; s:=0; for i:=1 to 10 do s:=s+o[i]; writeln(s); end. 

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

Введення, виведення і сортування масивів [ ред. ]

Це три найтиповіші задачі, з якими доводиться стикатися при роботі з масивами, і які викликають в початківців питання. Масив — не одна змінна, тому стандартні команди write і readln з ним не працюють (перевірте це!). Оскільки масив — це набір змінних, до яких звертаються за допомогою індексу, то більшість операцій з масивами потребують циклів по цьому індексу. Отже, ввід масиву виглядає приблизно так:

writeln('Введіть елементи масиву'); for i:=1 to n do readln(A[i]); 

а вивід, відповідно,

writeln('Масив A:'); for i:=1 to n do write(A[i],', '); 

де йдеться про те, що масив A має індекси від 1 до n, а i – змінна типу integer. Звісно, вводити та виводити можна й іншими способами, експериментуйте!

Що ж стосується сортування, тобто впорядковування елементів, то існує багато [:w:Алгоритм сортування|різних алгоритмів] для цього. Найпростішим є так званий “бульбашковий алгоритм”, який полягає в тому, що перший елемент порівнюється з другим; якщо перший більший, елементи обмінюються місцями. Після цього другий порівнюється з третім, за потреби обмінюються, третій — з четвертим і т.д. Виходить, ніби легка “бульбашка” спливає у важкій рідині. Після досягнення кінця циклу можна бути впевненим, що останній елемент — найбільший; після цього спливає нова “бульбашка” і т.д., доки весь масив не буде впорядкованим. Ось повний код програми:

Program Bulbashka; var arr:array[1..10] of integer; i,j,t:integer; begin writeln('Введіть елементи масиву'); for i:=1 to 10 do readln(arr[i]); for i:=1 to 9 do begin for j:=1 to 10-i do begin if arr[j] > arr[j + 1] then begin t := arr[j]; arr[j] := arr[j + 1]; arr[j + 1] := t; end; end; end; writeln('Відсортований масив:'); for i:=1 to 10 do write(arr[i],', '); end. 
  • для вводу і виводу ми скористалися наведеними вище фрагментами коду;
  • t – тимчасова змінна, потрібна для обміну значень;
  • на організацію вкладених циклів;
  • на розставляння операторних дужок begin-end у вкладених циклах. Чи всі вони потрібні? Без яких можна обійтися? Яка програма легше сприймається — з ними чи без них?

Завдання [ ред. ]

1. Введіть масив на 5 елементів, запитуючи кожен елемент окремим запрошенням, на кшталт

Введіть A[1] = 3 Введіть A[2] = 765 Введіть A[3] = _ 

і виведіть його, нумеруючи елементи:

A[1] = 3 A[2] = 765 A[3]= 32 .