Умовний і складний оператори

Алгоритми з розгалуженням

Зміст заняття: Використання операторів умови IF, вибору CASE для програмування алгоритмів з розгалуженням; оператор безумовного переходу.

Умовний і складний оператори

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

If <умова> then <оператор1> else <оператор2>; де умова - це вираз логічного типу (наприклад: а > 0; (d<0) and (c=5) - складна умова; та інше). Якщо ця умова виконується, то програма виконує гілку then, тобто оператор1, якщо умова не виконується - то оператор2.

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

begin

<оператори> end

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

Знайти значення функції можна, якщо підставити значення х у формулу для f(x), якщо вона визначена. Розрахунок значення функції можливий, якщо A = х2 - 3x - 15 > 0, при A ≤ 0 функція не визначена. План програми:

а) опис змінних x, f, A

б) ввід x

в) розрахунок A= x2 - 3x – 15

Програма

program rozgalugennia;

var x, f, A: real; begin write(‘Vvedit x ’); read(x);

A:=sqr(x) – 3*x – 15; if A>0 then

begin

f:=1/sqrt(A);

writeln(‘f(‘,x:2:1,’)=’,f:5:3);

end

else

writeln(‘pry x=’,x:3:1,’ f-cija ne vyznachena’); end.

Тут складний оператор стоїть у гілці then оператора умови, і після нього

оператор умови не закінчується – адже є ще гілка else, саме тому після end не

ставиться крапка з комою (знак кінця оператора).

Визначення і опис масивів

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

До кожного компонента масиву можна звертатися, вказуючи його індекс (порядковий номер). Індекс нумерує елементи масиву. До даного елемента масиву звертаються, вказуючи ім’я масиву і значення індексу. Наприклад, A[5].

Характеристики масиву:

1. Тип – загальний тип елементів масиву;

2. Розмірність (ранг) – кількість індексів масиву;

3. Діапазон – кількість допустимих значень кожного індексу; Опис масивів проводиться в блоці Var так: Ім’я масиву: array[is..ie, js..je,…] of тип елементів; де аrray - означає “масив”;

[is..ie, js..je,…] - початкове і кінцеве значення першого, другого і т.д. індексів масиву (індекс може бути і один); тип елементів – будь-який тип Турбо-Паскалю. Наприклад, представлені вище масиви можуть бути описані так:

Var a: array [1..6] of integer;

b: array [1..4,1..3] of real;

Однак так описувати змінні у заголовку процедури чи функції не можна

Наприклад, оголошення процедури

Procedure P (y: array [0..15] of real);

є невірним і викличе помилку, оскільки у списку формальних параметрів

процедури чи функції можуть бути лише параметри, що мають стандартний чи

заздалегідь оголошений тип.

У такому випадку описувати масив слід по-іншому, користуючись оператором

опису типу:

Type ім’я типу= array[is..ie, js..je,…] of тип елементів; Var ім’я масиву: ім’я типу;

Наприклад:

Type vect = array [0...9] of real;

matr = array [0..9, 0..4] of integer; Var a,b:vect;

m1,m2: matr;

А у вищезгаданій ситуації з процедурою правильним буде такий запис:

Procedure P (y: vector);

причому тип vector слід описати перед описом процедури P.

2.10.3. Приклад роботи з одномірним масивом

Задача. Знайти максимальний елемент цілочисельного одномірного масиву,

заповненого випадковими числами.

План:

1. Сформувати масив;

2. Присвоїти допоміжній змінній Emax значення першого елемента масиву;

3. Порівняти всі елементи масиву з Emax, якщо знайдеться більший елемент, замінити значення Emax.

Program Mass; Const M=100; Var

Mas:array[1..M] of integer;

Emax, i: integer; Begin

Randomize; {Процедура встановлює новий ряд випадкових чисел} For i:=1 to M do Mas[i]:=random(500);{Функція генерує цілі числа від 0 до 500}

Emax:=Mas[1];

For i:=1 to M do

If Emax< Mas[i] then begin

Emax:=Mas[i];

Imax:=i;

end;

Writeln(‘Maksymalnyj element masyvu Mas[‘,Imax:2,’]=’, Emax:3);

End.

Побудова графіка функції

Для побудови графіка функції f(x) на проміжку [a,b] слід здійснити таку послідовність кроків:

1. Визначення максимумів абсциси та ординати xmax i ymax для функції f(x) на проміжку [a,b].

2. Здійснення перетворення від координат від реальних до екранних.

3. Ініціалізація графічного режиму.

4. Рисування осей графіка.

5. Рисування графіка функції

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

максимуми та мінімуми абсциси та ординати для функції f(x) на проміжку [a,b]. Зрозуміло, що значення a та b є відповідно найменшим та найбільшим значенням абсциси, а максимум та мінімум ординати визначимо у такий спосіб:

N:=640;

h:=(b-a)/N;

x:=a;

ymax:=f(x);

ymin:=f(x);

while x<b do begin

x:=x+h;

if ymax<f(x) then ymax:=f(x);

if ymin>f(x) then ymin:=f(x); end;

Як бачимо, для знаходження максимального та мінімального значення по

осі у ми протабулювали функцію f(x) та шляхом порівняння знайшли

максимальне значення аналогічно як ми це робили для одномірного масиву.

Далі задамо функції перетворення координат від координат функції x,y (називатимемо їх реальними координатами) до екранних координат (пікселі екрану). В графічному режимі VGA розділення екрану становить 640*480. Будемо рисувати графік не на весь екран, а у рамці, відступивши певну кількість пікселів від країв екрану (див. рис. 2.13.1). Позначимо цю віддаль змінною mar. Тоді крайні точки нашої рамки матимуть такі координати (у пікселях) як показано на рисунку. Для того щоби графік функції f(x) на проміжку [a,b] помістився всередині рамки, у реальних координатах, лівий край рамки повинен відповідати значенню x= a, правий – x= b, верхній – y= ymax, нижній y= ymin. Виходячи із цього, для переходу від реальних координат до пікселів екрана ми повинні здійснити такі перетворення координат:

640-2⋅mar

x=

ekr

y

b-a 480-2⋅mar

ekr

(x-a)+mar

(y-ymin)+480-mar

y -y

min max

Тут потрібно ще не забути зробити округлення оскільки екранні координати – цілі числа. Для перетворення координат зручно визначити відповідні функції.

(0,0)

(640,0)

(mar,mar) mar |(640-mar,mar)
mar   mar
4 w
(mar, 480-mar) mar l k(640-mar,4 80-mar)
       

(0,480)

(640,480)

Рис. 2.13.1 Параметри екрану монітора

function xekr(x:real):integer; begin

xekr:=round((640-2*mar)*(x-a)/(b-a))+mar; end;

function yekr(y:real):integer; begin

yekr:=round((480-2*mar)*(y-ymin)/(ymin-ymax))+480-mar end;

Також визначимо функцію для якої ми рисуємо графік:

function f(x:real):real; begin

f:=x*x; end;

Після початку програми задамо проміжок на якому будуємо графік:

a:=-5; b:=5;

Далі – переключаємось в графічний режим:

grDriver:= Detect;

InitGraph(grDriver, grMode,'d:\bp\bgi');

Попередньо потрібно не забути підключити модуль graph і визначи необхідні нам змінні.

Тепер рисуємо графік функції розмістивши спочатку графічний курсор першу точку графіка і в циклі провівши ряд ліній між іншими точками.

x:=a;

moveto(xekr(x),yekr(f(x)));

setcolor(red);

while x<b do begin

x:=x+h;

lineto(xekr(x),yekr(f(x))); end;

Після цього рисуємо сітку граціка, та підписуємо координатні мітк

Зробимо затримку до на жаття клавіші щоби побачити графік, та закриваєм

графічний режим.

Readkey; CloseGraph;

Повний текст програми приведено нижче:

program graf1;

uses graph; // підключаємо модуль роботи із графікою

var grdrv,grres,N,mar,np:integer; ymax,ymin,x:real; a,b,h:real; s:string; i:integer;

// визначаємо функцію для якої будуватимемо графік

function f(x:real):real; begin

f:=x*x; end;

// визначаємо функції перетворення координат

function xekr(x:real):integer; begin

xekr:=round((640-2*mar)*(x-a)/(b-a))+mar; end;

function yekr(y:real):integer; begin

yekr:=round((480-2*mar)*(y-ymin)/(ymin-ymax))+480-mar end;

Begin

// Задаємо початкові знчення змінних

a:=-5; b:=5;

N:=640; // кількість точок табуляції

h:=(b-a)/N; // крок табуляції

mar:=50; // відступ

np:=8; // кількість ліній сітки

// знаходимо найбільше та найменше значення функції на проміжку

x:=a;

ymax:=f(x); ymin:=f(x); while x<b do begin

x:=x+h;

if ymax<f(x) then ymax:=f(x); if ymin>f(x) then ymin:=f(x); end;

// вмикаємо графічний режим

GrDrv:=detect; initgraph(grdrv,grres,'c:\progra~1\turbop~1.1\bgi');

// рисуємо криву графіка функції x:=a;

moveto(xekr(x),yekr(f(x))); setcolor(red);

while x<b do begin

x:=x+h;

lineto(xekr(x),yekr(f(x))); end;

setlinestyle(dottedln,0,normwidth); setcolor(white);

// рисуємо сітку та координатні мітки

for i:=0 to np do begin

// вертикальні лінії сітки line(round(mar+(640-2*mar)/np*i),mar,round(mar+(640-2*mar)/np*i),480-mar);

// горизонтальні лінії сітки line(mar,round(mar+(480-2*mar)*i/np),640-mar,round(mar+(480-2*mar)*i/np));

// виводимо чисельні підписи координатних міток по горизонталі

settextjustify(centertext,centertext); // вирівнювання

тексту

str(i*(b-a)/np+a:2:2,s); // перетворення числа в стрічку outtextxy(round(mar+(640-2*mar)/np*i),480-mar+10,s);

// вивід тексту на екран

// виводимо чисельні підписи координатних міток по горизонталі

settextjustify(righttext,centertext); str((ymax-ymin)/np*i+ymin:2:2,s);

outtextxy(mar-1,round(480-mar-(480-2*mar)*i/np),s); end;

readln;

closegraph; // вимикаємо графічний режим End.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: