Реферат: Робота з величинами. Введення-виведення виразів. Лінійні алгоритми


236739.doc



РОБОТА З ВЕЛИЧИНАМИ. ВВЕДЕННЯ-ВИВЕДЕННЯ
ВИРАЗІВ. ЛІНІЙНІ АЛГОРИТМИ

Величини

Для програмної обробки в ЕОМ дані представляються у вигляді величин і їхніх сукупностей. Величина — це елемент даних з погляду їх семантичного (значеннєвого) змісту або обробки. Значеннєва (семантична) розбивка даних виробляється під час постановки завдання й розробки алгоритму її рішення (вхідні, вихідні й проміжні). Вхідні дані — це дані, відомі перед виконанням завдання, з умови. Вихідні дані — результат рішення завдання. Змінні, які не є ні аргументом, ні результатом алгоритму, а використаються тільки для позначення проміжного значення, що обчислює, називаються проміжними. Разом з тим, архітектура ЕОМ, використовуване програмне забезпечення вимагають указати імена й типи даних - цілий, речовинний, логічний і символьний.

Отже, з поняттям величини зв'язані наступні характеристики (атрибути):

ім'я (ідентифікатор) — це її позначення й місце в пам'яті;

тип — безліч припустимих значень і безліч застосовних операцій до неї;

значення — динамічна характеристика, може мінятися багаторазово в ході виконання алгоритму. Під час виконання алгоритму в кожен конкретний момент величина має якесь значення або не визначена.

Постійної називається величина, значення якої не змінюється в процесі виконання алгоритму, а залишається тим самим, зазначеним у тексті алгоритму. Змінної називається величина, значення якої міняється в процесі виконання алгоритму.

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

Розрізняють змінні наступних простих типів: цілі (Integer, Byte, ShortInt, Word, LongInt), дійсні (Real, Comp, Double, Single, Extended), логічний (Boolean), символьний (Char), що перераховує, діапазонний.

Взагалі, ієрархія типів у мові Pascal наступна:


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

Опис змінної: ім'я змінної (ідентифікатор) : тип;

Приклад опису:

Var D, C, N : Integer;

LogPer : Boolean;

A, B : Real;

K : Char;

Тип змінної визначає діапазон припустимих значень, прийнятих величинами цього типу; набір операцій, припустимих над даною величиною й обсяг пам'яті, що відводить під цю змінну.

^ Типи величин

Цілі типи

integer

2

–32768..32767

+, –, /, *, Div, Mod, >=, <=, =, <>, <, >

byte

1

0..255

+, –, /, *, Div, Mod, >=, <=, =, <>, <, >

word

2

0..65535

+, –, /, *, Div, Mod, >=, <=, =, <>, <, >

shortint

1

–128..127

+, –, /, *, Div, Mod, >=, <=, =, <>, <, >

longint

4

–2147483648..2147483647

+, –, /, *, Div, Mod, >=, <=, =, <>, <, >

^ Дійсні типи

real

6

2,910–39 — 1,71038

+, –, /, *, >=, <=, =, <>, <, >

single

4

1,510–45 — 3,41038

+, –, /, *, >=, <=, =, <>, <, >

double

8

510–324 — 1,710308

+, –, /, *, >=, <=, =, <>, <, >

extended

10

3,410–4932 — 1,1104932

+, –, /, *, >=, <=, =, <>, <, >

^ Логічний тип

Boolean 1 true, false Not, And, Or, Xor, >=, <=, =, <>, <, >

Символьний тип

char 1 всі символи коду ASCII +, >=, <=, =, <>, <, >

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

Обмін інформацією з ЕОМ припускає використання певних засобів вводу-висновку. В ЕОМ основним засобом уведення є клавіатура, висновку - дисплея. Процедура, що у режимі діалогу із клавіатури привласнює значення для змінної величини, називається процедурою уведення.

У мові Pascal ця команда виглядає в такий спосіб:

Read(список змінних);

Наприклад,

Var

A : Real; B : Integer; C : Char;

Begin

Read(A, B, C)

End.

Читається: “Ввести дійсну А, цілу В и символьну С”.

Як тільки в програмі зустрічається виклик процедури Read, ЕОМ припиняє виконання цієї програми й чекає, поки користувач уведе із клавіатури відповідні значення, які по черзі будуть привласнюватися змінним, перерахованим у списку уведення. Значення даних, що вводять, одночасно відображаються на екрані дисплея. Після натискання клавіші enter, коли всі змінні приймуть свої значення із вхідного набору даних, певного користувачем, виконання програми триває з оператора, що випливає за Read.

В списку введення значення розділяються між собою пробілом. Присвоювання значень із вхідного потоку виконується ліворуч праворуч відповідно до порядку проходження змінних у процедурі Read. Процедура ReadLn схожа на Read. Різниця лише в тім, що ReadLn реагує на кінець рядка, і у випадку його виявлення відбувається відразу перехід до наступного рядка.

Приклади уведення даних за допомогою процедури ReadLn:

ReadLn(A, B, C);

ReadLn(X);

ReadLn(LogPer);

Процедура, що виводить уміст змінних на екран, називається процедурою висновку на екран.

В Pascal ця команда виглядає в такий спосіб

^ Write (список констант й/або змінній, розділеній комі)

Наприклад Write ('Вихідне значення: ', C).

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

Процедура Write здійснює висновок значень виражень, наведених у його списку, на поточний рядок до її заповнення. За допомогою процедури WriteLn реалізується висновок значень виражень, наведених у його списку, на один рядок дисплея й перехід до початку наступного рядка.

Приклади висновку даних:

Write(A, B, C);

WriteLn('Коренем рівняння є ', X);

WriteLn(LogPer);

Для керування розміщенням виведених значень процедури Write й WriteLn використаються з форматами. Під форматом даних розуміється розташування й порядок кодування окремих полів елементів даних.

Процедура висновку з форматом для цілого типу має вигляд:

WriteLn(A : N, B : M, C : L);

Тут N, M, L — вираження цілого типу, що задають ширину поля висновку значень.

При висновку речовинних значень оператор Write(R) без вказівки формату виводить речовинне R у поле шириною 18 символів у формі із плаваючої коми в нормалізованому виді. Для десяткового подання значення R застосовується оператор з форматами виду WriteLn(R : N : M). У десятковому записі числа R виводиться M (0  M  24) знаків після коми, усього виводиться N знаків.

Приклади:

WriteLn(N : 4);

WriteLn(K : 10:5, S : 7:3);

Загальна структура програми на Pascal така:

Program ім'я програми; {заголовок}

Const Константа1 = значення; {оголошення констант} {розділ описів}

Константа2 = значення;

...

Константа = значення;

Type ...; {оголошення типів}

Var Список змінних1 : Тип; {опис змінних}

Список змінних2 : Тип;

...

Список змінних : Тип;

Label Список міток;

Function ...

Procedure ...

Begin

{розділ операторів}

End.

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

змінна := вираз;

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

Приклади присвоювання:

X := (Y + Z) / (2 + Z * 10) - 1/3;

LogPer := (A > B) And (C <= D);

В Pascal є операції цілочисленого ділення й знаходження залишку від ділення. При виконанні цілочисленого ділення (операція DIV) залишок від ділення відкидається.

Наприклад, 15 div 3 = 5; 18 div 5 = 3; 123 div 10 = 12, 7 div 10 = 0.

За допомогою операції MOD можна знайти залишок від ділення одного цілого числа на інше.

Наприклад, 15 mod 3 = 0; 18 mod 5 = 3; 123 mod 10 = 3, 7 mod 10 = 7.

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

Порядок дій при обчисленні значення вираження:
1)обчислюються значення в дужках;
2)обчислюються значення функцій;
3) виконується унарні операції (унарний мінус — зміна знака);
4) виконуються операції множення й ділення (у тому числі цілочисленого ділення й знаходження залишку від ділення);
5) виконуються операції додавання й віднімання.


^ Вбудовані математичні функції мови Pascal

Математичний запис Запис на Pascal Призначення

cos x cos(x) Косинус x радіан

sin x sin(x) Синус x радіан

ex exp(x) Значення e у ступені x

[x] trunc(x) Ціла частина числа x

|x| abs(x) Модуль числа x

x2 sqr(x) Квадрат числа x

sqrt(x) Квадратний корінь із x

{x} frac(x) Дробова частина x

arctg x arctan(x) Арктангенс числа x

ln x ln(x) Натуральний логарифм x

Pi Число π

Піднесення в ступінь (крім піднесення у квадрат і піднесення в ступінь числа e) відсутній. Для піднесення в довільний ступінь можна скористатися очевидною рівністю: xy=ey ln x. Для піднесення числа в натуральний ступінь можна написати власну функцію. Наприклад,

{Функція піднесення числа X у натуральний ступінь N}

Function Stepen(X : Real; N : Integer) : Real;

Var I : Integer; St : Real;

Begin

St := 1;

For I := 1 To N Do St := St * X;

Stepen := St;

End;

Інший спосіб одержати натуральне значення z=xy, де x, y — натуральні, це зробити так: Z := Round(Exp(Y * Ln(X))).

Примітка. Цікавим є завдання одержання ступеня будь-якого цілого числа (за винятком нуля), якщо підстава ступеня — ненегативне ціле, без використання розвилки. Одне з можливих рішень : (–1)*Ord(Odd(Y)) * Exp(Y * Ln(X)) + Ord(Odd(Y+1)) * Exp(Y * Ln(X)). Тут Ord(K) — функція, що повертає порядковий номер величини K у тім або іншому порядковому типі (у прикладі використане властивість, що порядковий номер False дорівнює 0, а порядковий номер True — 1).

Приклади запису математичних виразів:

Математичний запис Запис на Pascal

1. x2 – 7x + 6 Sqr(x) - 7 * x + 6

2. (Abs(x) - Abs(y)) / (1 + Abs(x * y))

3. Ln(Abs((y - Sqrt(Abs(x))) * (x - y / (z + Sqr(x) / 4))))

Логічні операції

Логічний операнд — це конструкція відповідної мови програмування, що задає правило для обчислення одного із двох можливих значень: True або False.

Найчастіше логічні вирази використовують в операторах присвоювання або для запису тієї або іншої умови. Складовими частинами логічних виразів можуть бути: логічні значення (True, False); логічні змінні; відносини.

Наприклад, 1) Y:=True; 2) Z:=False; 3) LogPer:=A > B; 4) Log1:=(A = B) And (C <= D).

Як видно із прикладів, відношення — це два вирази, розділених між собою знаком операції відношення (>, <, =, <>, <=, >=). Відношення є найпростішою конструкцією логічного вираження. Воно обчислює результат True, якщо виконується задане співвідношення, і False - у противному випадку.

Примітка. Незважаючи на те, що операції відношення =, <>, >=, <= визначені для дійсних типів, реально вони в більшості випадків коректно не працюють у силу того, що безліч дійсних величин, що представляються у пам'яті ЕОМ, дискретно. Тому їх треба, якщо це можливо, уникати. У тому випадку, коли все-таки для дійсних виникає необхідність обчислення зазначених відношень, розумно перевіряти дійсні величини не на рівність, а на близькість розташування друг до друга, тобто заміняти відношення виду A=B відношеннями виду |A-B|, де E — досить мале по абсолютній величині число (у загальному випадку — так називане машинне іпсилон).

У мові Pascal операції відношення визначені для величин будь-якого порядкового типу (цілі, символьний, логічний, перелічувальний, діапазон). Операції відношення можуть бути виконані також над строковими виразами. Порівняння двох рядків виконується посимвольно ліворуч праворуч відповідно до їхньої лексикографічної впорядкованості в таблиці кодів ASCII. Ця впорядкованість припускає, що "1"<"2", "a"<"b", "B"<"C" і т.д. Як тільки в процесі попарних порівнянь символів з однаковою порядковою позицією виявляється більший по коду ASCII символ, даний процес припиняється, і вважається, що рядок із цим символом відповідно більше іншого рядка. Якщо рядки мають різну довжину і їхні символи збігаються до останнього знака, то вважається, що більше короткий рядок менше.

^ Логічний вираз — це логічний операнд або послідовність логічних операндів, розділених між собою знаками логічних операцій (NOT, AND, OR, XOR).

Порядок дій при обчисленні значення логічного виразу:
1) обчислюються значення в дужках;
2) обчислюються значення функцій;
3) виконується унарні операції (операція NOT);
4) виконується операція AND;
5) виконуються операції OR, XOR;
6) виконуються операції відношень.

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

При реалізації деяких програм зручно використати функції, які мають логічне значення. Звичайно вони використаються для того, щоб на деяке питання одержати відповідь “ТАК” або “НІ”.

Наприклад, що випливає функція повертає True, якщо її аргумент - просте число, і False - у противному випадку:

Function Simple (Pr : Integer) : Boolean;

Var I : Integer; LogPer : Boolean;

Begin I := 2; {лічильник}

Repeat

LogPer := (Pr Mod I = 0); {логічна змінна, приймаюча значення TRUE, якщо число Pr складене}

I := I + 1

Until (I > Pr Div 2 + 1) Or (LogPer);

{цикл завершуємо в тому випадку, коли лічильник стає більше половини даного числа або виявляємо, що число складене}

Simple := Not LogPer

{значення функції дорівнює TRUE, якщо число просте, і FALSE - у противному випадку}

End;

Розглянемо приклади завдань, де алгоритм рішення є лінійним.

Завдання 1. Швидкість першого автомобіля v1 км/ч, другого — v2 км/ч, відстань між ними s км. Яка відстань буде між ними через t ч, якщо автомобілі рухаються в різні сторони?

Відповідно до умови завдання шукана відстань s1=s+(v1+v2)t (якщо автомобілі споконвічно рухалися в протилежні сторони) або s2=|(v1+v2)t-s| (якщо автомобілі спочатку рухалися назустріч один одному).

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

Program Car;

Var V1, V2, T, S, S1, S2 : Real;

Begin

Write ('Введіть швидкості автомобілів, відстань між ними й час руху:');

ReadLn(V1, V2, S, T);

S1 := S + (V1 + V2) * T;

S2 := Abs((V1 + V2) * T - S);

WriteLn('Відстань буде дорівнює ', S1:7:4, ' км або ', S2:7:4, ' км')

End.

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

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

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

Завдання 2. Записати логічний вираз, що приймає значення TRUE, якщо крапка лежить усередині заштрихованої області, інакше - FALSE.



Насамперед звертаємо увагу на те, що цю складну фігуру доцільно розбити на трохи більше прості: трикутник, що лежить в I й IV координатних чвертях і трикутник, що лежить в II й III чвертях. Таким чином, крапка може потрапити усередину однієї із цих фігур, або на лінію, їх обмежуючу. Кількість відношень, що описують деяку область, звичайно збігається з кількістю ліній, цю область обмежуючих. Щоб крапка потрапила усередину області, необхідна істинність кожного з відношень, тому над ними виконується операція AND. Так вся область була розбита на частини, тому між відношеннями, що описують кожну з них, використається операція OR.

З огляду на наведені тут міркування й записавши рівняння всіх обмежуючу фігуру ліній, одержуємо шуканий логічний вираз:

(X >= 0) And (Y >= 1.5 * X - 1) And (Y <= X) OR (X <= 0) And (Y >= -1.5 * X - 1) And (Y <= -X)

Завдання 3. Обчислити значення виразу



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

Program Expression;

Var X, Z : Real;

Begin

Write('Уведіть значення змінної X: '); ReadLn(X);

Z := 6 * ln(sqrt(exp(x+1)+2*exp(x)*cos(x))) /

ln(x - exp(x+3) * sin(x)) + abs(cos(x) / xp(sin(x)));

WriteLn('Значення вираження: ', Z : 12:6)

End.

^ УМОВНИЙ ОПЕРАТОР
ПОВНА Й НЕПОВНА РОЗВИЛКА
ОПЕРАТОР ВИБОРУ

Оператор IF

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

IF <логічний вираз> THEN серія1 ELSE серія2;

Якщо логічний вираз, що виступає як умова, приймає значення False, то виконуються оператори, розташовані після else (серія2), якщо True, — оператори, що йдуть за then. При запису логічного виразу варто уникати знака = (дорівнює) для дійсних змінних, тому що вони представляються неточно, а тому може не відбутися збігів значень виразів, що стоять ліворуч і праворуч від знака дорівнює. Для усунення зазначеного недоліку варто вимагати виконання умови із заданою точністю, тобто замість відношення X = Y рекомендується, наприклад,

Abs(X - Y) < 1E-8.

Оскільки розвилка може бути неповною, то можлива й неповна форма запису умовного оператора:

IF <логічне вираження> THEN серія;

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

Завдання 1. Дано дійсні числа x, y. Якщо x й y від’ємні, то кожне значення замінити модулем; якщо від’ємне тільки одне з них, те обоє значення збільшити на 0,5; якщо обоє значення додатні й жодне з них не належить відрізку [0,5; 2,0], те обоє значення зменшити в 10 разів; в інших випадках x й y залишити без зміни.

Розробимо алгоритм рішення завдання, після чого напишемо програму.

Алгоритм запишемо словесно:

1) ввести значення x, y;

2) якщо x<0 й y<0, знайти їхні модулі й перейти до п. 5, інакше перейти до наступного пункту;

3) якщо x<0 або y<0, збільшити кожну величину на 0,5 і перейти до п. 5,

інакше перейти до наступного пункту;

4) якщо ні x, ні y не належать відрізку [0,5; 2,0], зменшити їх в 10 разів;

5) вивести значення x й y;

6) кінець.

 

Program Usl;

Var X, Y : Real;

Begin

Write('Введіть два дійсних числа '); ReadLn(X, Y);

If (X < 0) AND (Y < 0) THEN

Begin

X = ABS(X);

Y = ABS(Y)

End

ELSE

IF (X < 0) OR (Y < 0) THEN

Begin

X = X + 0.5;

Y = Y + 0.5

End

ELSE

IF NOT (((X >= 0.5) AND (X <= 2))

OR ((Y >= 0.5) AND (Y <= 2)))

THEN

Begin

X = X / 10;

Y = Y / 10

End;

WriteLn('Результат:'); WriteLn('X= ', X:10:6); WriteLn('Y= ', Y:10:6)

END.

Завдання 2. Дано дійсне число a. Обчислити f(a), якщо

Program Usl1;

Var A, F : Real;

Begin

WriteLn('Введіть дійсне число: '); ReadLn(A);

IF A <= 0 THEN

F = 0

ELSE

IF A <= 1 THEN

F = Sqr(A) - A

ELSE

F = Sqr(A) - SIN(Pi * Sqr(A));

WriteLn('Значення функції F(x) при x = ', A:10:6, ' дорівнює ', F:10:6);

END.

^ Оператор CASE

Крім умовного оператора як керуюча структура досить часто використається оператор вибору CASE. Ця структура дозволяє переходити на одну з галузей залежно від значення заданого виразу (селектора вибору). Її особливість полягає в тому, що вибір рішення тут здійснюється не залежно від істинності або хибності умови, а є обчислювальним. Оператор вибору дозволяє замінити оператори розвилки (у силу цього його ще називають оператором множинного розгалуження).

У конструкції CASE обчислюється вираження ^ K і вибирається галузь, значення мітки якої збігається зі значенням K. Після виконання обраної галузі відбувається вихід з конструкції CASE. Якщо в послідовності немає мітки зі значенням, рівним K, то керування передається зовнішньому операторові, що випливає за конструкцією CASE (у випадку відсутності альтернативи ELSE; якщо вона є, то виконується наступний за нею оператор, а вже потім керування передається зовнішньому оператору).

Запис оператора вибору

CASE K OF

A1 : серія 1;

A2 : серія 2;

...

AN : серія N

ELSE серія N + 1

END;

Кожна із зазначених серій операторів може складатися як з єдиного оператора, так і декількох (у цьому випадку, як звичайно, оператори, що ставляться до однієї мітки, повинні бути укладені в операторні дужки begin..end).

Вираз K тут може бути будь-якого порядкового типу (нагадаємо, що до таких типів ставляться всі цілі типи, Boolean, Char, перелічувальний тип, діапазонний тип, що базується на кожному із зазначених вище типів).

Завдання 1. У давньояпонському календарі був прийнятий дванадцятирічний цикл. Роки усередині циклу носили назви тварин: пацюка, корови, тигра, зайця, дракона, змії, коня, вівці, мавпи, півня, собаки й свині. Написати програму, що дозволяє ввести номер року й друкує його назва по давньояпонському календарю. Довідка: 1996 р. — рік пацюка — початок чергового циклу.

Оскільки цикл є дванадцятирічним, поставимо назву року у відповідність залишку від розподілу номера цього року на 12.

Program Goroskop;

Var Year : Integer;

Begin

Write('Уведіть рік '); ReadLn(Year);

CASE Year MOD 12 OF

0 : WriteLn('Рік Мавпи');

1 : WriteLn('Рік Півня');

2 : WriteLn('Рік Собаки');

3 : WriteLn('Рік Свині');

4 : WriteLn('Рік Пацюка');

5 : WriteLn('Рік Корови');

6 : WriteLn('Рік Тигру');

7 : WriteLn('Рік Зайця');

8 : WriteLn('Рік Дракона');

9 : WriteLn('Рік Змії');

10 : WriteLn('Рік Коня');

11 : WriteLn('Рік Вівці')

END;

END.

Завдання 2. Знайти найбільше із двох дійсних чисел, використовуючи оператор вибору.

Program Maximum;

Var Max, X, Y : Real;

Begin

Write('Уведіть два нерівних числа:');

ReadLn(X, Y);

Case X > Y Of

TRUE : Max := X;

FALSE : Max := Y

End;

WriteLn('Максимальне із двох є ', Max : 12:6)

End.

Завдання 3. Перетворити символ, якщо він є рядковою російською буквою, у заголовну букву.

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

Program UpCase;

Var C : Char;

Begin

Write('Уведіть символ:');

ReadLn(C);

Case C Of

'а'..'п' : C := Chr(Ord(C) - 32);

'р'..'я' : C := Chr(Ord(C) - 80)

End;

WriteLn(C);

End.

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

0>0>
^ ОПЕРАТОРИ ЦИКЛУ
ЗАВДАННЯ ЦІЛОЧИСЛЕНОЇ АРИФМЕТИКИ

Командою повторення або циклом називається така форма організації дій, при якій та сама послідовність дій повторюється доти, поки зберігається значення деякого логічного виразу. При зміні значення логічного виразу на протилежне повторення припиняються (цикл завершується).

Для організації циклу необхідно виконати наступні дії:

перед початком циклу задати початкове значення параметра;

усередині циклу змінювати параметр циклу за допомогою оператора присвоювання;

перевіряти умову повторення або закінчення циклу;

управляти циклом, тобто переходити до його початку, якщо він не закінчений, або виходити із циклу в противному випадку.

Розрізняють цикли з відомим числом повторень (цикл із параметром) і ітераційні (з перед- і постумовою).

^ Цикл із параметром (FOR)

У циклі з відомим числом повторень параметр змінюється в заданому діапазоні.

Якщо в циклі змінюється проста змінна, то вона є параметром циклу; якщо в циклі змінюється змінна з індексом, то індекс цієї змінної є параметром циклу.

Для організації циклу з відомим числом повторень в Pascal використається оператор for.

Структура циклу, організованого за допомогою цього оператора, має вигляд:

For I := A To B Do Begin <оператори> End;

або

For I := A DownTo B Do Begin <оператори> End;

Тут ^ I — параметр, що змінюється в циклі; A, B — вираження порядкового типу, що позначають початкове, кінцеве значення параметра циклу. Крок зміни номера параметра циклу дорівнює 1, якщо в заголовку циклу стоїть To (тобто реально наступне значення параметра циклу обчислюється за допомогою функції succ); і -1 - при DownTo (обчислення виробляється за допомогою функції pred).

Порядок виконання циклу із кроком 1 наступний: обчислюються значення початкового й кінцевого значень параметра циклу; параметр якщо I приймає початкове значення; якщо I менше або дорівнює кінцевому значенню, виконується тіло циклу; значення параметра циклу збільшується, тобто I := succ(I); перевіряється умова I<=B (для негативного кроку умова I>=B) і при його виконанні цикл повторюється. Вихід із циклу здійснюється, якщо I>B (I для H=-1), і виконується оператор, що випливає за оператором циклу. Якщо A>B (або A для H=-1), то цикл не виконується жодного разу.

Якщо в операторі циклу з параметром початкове або кінцеве значення параметра задані змінними або виразами, то значення цих змінних повинні бути визначені в програмі до оператора циклу. Не треба усередині циклу змінювати параметр циклу, його початкове й кінцеве значення за допомогою операторів присвоювання або уведення.

Завдання 1. Дано натуральне n, дійсне x. Обчислити

Розробимо алгоритм рішення завдання:

1) ввести дані - кількість що складають n і число x;

2) привласнити змінної, у якій будемо зберігати ступеня sin x, значення 1; S := 0;

3) привласнити параметру циклу значення 1;

4) якщо значення параметра циклу менше n, перейти до наступного пункту, інакше до п. 9;

5) обчислити черговий ступінь sin x;

6) додати обчислене значення до суми;

7) збільшити параметр циклу на 1;

8) перейти до п.4;

9) вивести на печатку суму S;

10) кінець.

{Програма обчислення суми ступенів sin x}

Program Summa;

Var S, X, Pr : Real; N, I : Integer;

Begin

Write('Введіть число що складають й x: '); ReadLn(N, X);

Pr := 1; {у цій змінній зберігаються послідовні ступені sin x}

S := 0;

For I := 1 To N Do

Begin

Pr := Pr * Sin(X); {Черговий ступінь Sin(x)}

S := S + Pr

End;

WriteLn('Сума дорівнює ', S : 7:4)

End.

Досить часто цикл із параметром використається при розробці програм обробки масивів.

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

У порівнянні із циклом з параметром ітераційні цикли є універсальними. Для організації ітераційних циклів використаються оператори циклу із передумовою while і циклу з постумовою repeat..until.

^ Цикли WHILE, REPEAT

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

Відповідні структури циклів:

while B Do Begin <оператори> End;


Repeat <оператори> Until C;

Тут B, C — логічні вираження.

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

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

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

Завдання 2. Знайти найменший номер члена послідовності, для якого виконується умова |an-an-1|<e, де an=arctg an-1+1, a1=0. Вивести на екран цей номер і всі елементи ai (i = 1, 2, ..., n).

Оскільки по ходу рішення завдання необхідно знати an й an-1, будемо запам'ятовувати їх відповідно в змінних ANew й AOld.

Program Posled;

Var Eps, AOld, ANew : Real; N : Integer;

Begin

Write('Уведіть число Epsilon '); ReadLn(Eps);

AOld := 0; ANew := ArcTan(AOld) + 1;

N := 2;

WriteLn(AOld : 8:5); WriteLn(ANew : 8:5);

While Abs(ANew - AOld) >= Eps Do

Begin

AOld := ANew;

ANew := ArcTan(AOld) + 1;

WriteLn(ANew : 8:5);

N := N + 1

End;

WriteLn('Шуканий номер ', N)

End.

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

Завдання 3. На інтервалі [2; n] знайти натуральне число з максимальною сумою дільників.

Пропоноване завдання може бути віднесена до класу «завдання цілочисленої арифметики», де аргументи, результати й проміжні величини ставляться до цілого типу. Варто помітити, що в такого роду завданнях досить часто використаються операції DIV й MOD; найбільш типової підзадачею є визначення кількості цифр у записі числа.

Алгоритм рішення завдання:

1) ввести число n;

2) змінної для зберігання максимальної суми дільників привласнити

значення 1 (це сума дільників числа 1);

3) запам'ятати число з максимальною сумою дільників;

4) параметру циклу I привласнити значення 2;

5) якщо I більше n, перейти до п. 13, інакше - до наступного пункту;

6) змінної для зберігання чергової суми дільників привласнити значення 0;

7) параметру циклу K привласнити значення 1;

8) якщо K більше I/2, перейти до п. 11, інакше - до наступного пункту;

9) якщо I ділиться на K без залишку, додати K до поточної суми дільників;

10) збільшити K на 1 і перейти до п. 8;

11) зрівняти поточну суму дільників з максимальної, якщо максимальна менше,

запам'ятати нове значення й число, що відповідає цій сумі;

12) збільшити I на 1 і перейти до п. 5;

13) вивести число з максимальною сумою дільників і цю суму;

14) кінець.

Program Sum_Del;

Var N, I, Sum_Max, Sum, K, Ch : Integer;

Begin

Write('Уведіть число N: '); ReadLn(N);

Sum_Max := 1; {Максимальна сума дільників}

Ch := 1; {Число з максимальною сумою дільників}

For I := 2 To N Do {Це цикл по кількості чисел}

Begin

Sum := 0;

For K := 1 To I Div 2 + 1 Do {У цьому циклі знаходимо суму дільників}

If I Mod K = 0 Then {Якщо I нацело ділиться на K, те K - дільник I}

Sum := Sum + K;

Sum := Sum + I;

If Sum > Sum_Max Then Begin Sum_Max := Sum; Ch := I End;

End;

WriteLn('Максимальну суму дільників ', Sum_Max, ' має число ',Ch)

End.

Завдання 4. Дано натуральне число n. Одержати всі прості дільники цього числа.

{Програма відшукання простих дільників даного числа}

Program Pr_Del;

Var N, I, Vsp : Integer;

Log_Per, Priznak : Boolean;

Begin

Write('Уведіть натуральне число: ');

ReadLn(N);

Priznak := True; {Ознака того, чи не є уведене число простим}

{Поки параметр циклу не перевищив квадратного кореня з даного числа,

продовжуємо пошук простих дільників}

For I := 2 To Round(Sqrt(N)) Do

If N Mod I = 0 Then

Begin

Priznak := False; {Уведене число не є простим}

Log_Per := False; {Логічне змінне, приймаюче значення True,

якщо найшлися дільники I, відмінні від 1 й I}

Vsp := 2;

Repeat

If (I Mod Vsp = 0) And (I <> Vsp) Then Log_Per := True;

Vsp := Vsp + 1

Until (Vsp > I Div 2 + 1) Or Log_Per;

If Not(Log_Per) Then WriteLn(I) {Якщо число I простої, друкуємо його}

End;

If Priznak Then WriteLn(N)

End.

^ ОДНОМІРНІ Й ДВОВИМІРНІ МАСИВИ (ТАБЛИЦІ)

Масив — це пронумерована послідовність величин однакового типу, позначена одним ім'ям. Елементи масиву розташовуються в послідовних комірках пам'яті, позначаються ім'ям масиву й індексом. Кожне зі значень, що становлять масив, називається його компонентом (або елементом масиву).

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

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

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

Приклад: числова послідовність парних натуральних чисел 2, 4, 6, ..., ^ N являє собою лінійний масив, елементи якого можна позначити А[1]=2, А[2]=4, А[3]=6, ..., А[ДО]=2*(ДО+1), де ДО — номер елемента, а 2, 4, 6, ..., N — значення. Індекс (порядковий номер елемента) записується у квадратних дужках після імені масиву.

Наприклад, A[7] - сьомий елемент масиву А; D[6] - шостий елемент масиву D.

Для розміщення масиву в пам'яті ЕОМ приділяється поле пам'яті, розмір якого визначається типом, довжиною й кількістю компонент масиву. У мові Pascal ця інформація задається в розділі описів. Масив описується так:

ім'я масиву : Array [початкове значення індексу..кінцеве значення індексу] Of базовий тип;

Наприклад,

Var B : Array [1..5] Of Real, R : Array [1..34] Of Char;

— описується масив ^ В, що складається з 5 елементів і символьний масив R, що складається з 34 елементів. Для масиву В буде виділений 5*6=30 байт пам'яті, для масиву R — 1*34=34 байта пам'яті.

Базовий тип елементів масиву може бути кожним, за винятком файлового.

Заповнити масив можна в такий спосіб:

1) за допомогою оператора присвоювання. Цей спосіб заповнення елементів масиву особливо зручний, коли між елементами існує яка-небудь залежність, наприклад, арифметична або геометрична прогресії, або елементи зв'язані між собою рекурентним співвідношенням.

Завдання 1. Заповнити одномірний масив елементами, що відповідають наступному співвідношенню:

a1=1; a2=1; ai=ai-2+ai-1 (i = 3, 4, ..., n).

Read(N); {Уведення кількості елементів}

A[1]:= 1;

A[2]:= 1;

FOR I := 3 TO N DO

A[I] := A[I - 1] + A[I - 2];

Інший варіант присвоювання значень елементам масиву - заповнення значеннями, отриманими за допомогою генератору випадкових чисел.

Завдання 2. Заповнити одномірний масив за допомогою генератору випадкових чисел таким чином, щоб всі його елементи були різні.

Program Create;

Type Mas = Array[1..100] Of Integer;

Var A : Mas; I, J, N : Byte; Log : Boolean;

Begin

Write(''); ReadLn(N);

randomize; A[1] := -32768 + random(65535);

For I := 2 To N Do

Begin

Log := True;

Repeat

A[i] := -32768 + random(65535); J := 1;

While Log and (j <= i - 1) Do

begin Log := a[i] <> a[j]; j := j + 1 End

Until Log

End;

For i := 1 to N Do Write(a[i]:7); writeln

End.

2) уведення значень елементів масиву із клавіатури використається звичайно тоді, коли між елементами не спостерігається ніякої залежності. Наприклад, послідовність чисел 1, 2, -5, 6, -111, 0 може бути уведена на згадку в такий спосіб:

Program Vvod;

Var N, I : Integer;

A : Array [1..20] Of Integer;

Begin

Write('Уведіть кількість елементів масиву '); ReadLn(N);

FOR I := 1 TO N DO

Begin

Write('Уведіть A[', I, '] '); ReadLn(A[I])

End.

Над елементами масивами найчастіше виконуються такі дії, як

а) пошук значень;

б) сортування елементів у порядку зростання або спадання;

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

Cуму елементів масиву можна підраху
еще рефераты
Еще работы по разное