- •Уводзіны Ключавыя палажэнні
- •Развіццё моў камп’ютарнага праграміравання
- •Эвалюцыя мовы Pascal
- •Структурная метадалогія распрацоўкі праграм Алгарытм
- •Асноўныя этапы рашэння задач на эвм
- •Блок-схемы
- •Структураграмы
- •Тэсціраванне праграм
- •Адладка праграм
- •Структурнае праграміраванне і дакладнасць праграм
- •Асноўныя канструкцыі структур кіравання
- •Метады распрацоўкі праграм
- •Праграміраванне зверху ўніз (ад агульнага да асобнага)
- •Модульнае праграміраванне
- •Праграміраванне знізу ўверх
- •Структурнае кадзіраванне
- •Арыфметыка эвм Сістэмы злічэння
- •Пераклады лікаў з адной сістэмы злічэння ў другую
- •Пераклад цэлых дадатных лікаў з сістэмы злічэння з асновай «p» у сістэму злічэння з асновай «q»
- •Пераклад правільных дробаў з сістэмы злічэння з асновай «p» у сістэму злічэння з асновай «q»
- •Пераклад змешаных дробаў
- •Формы прадстаўлення даных
- •Формы прадстаўлення лікаў у персанальным камп’ютары
- •Захаванне лікаў з фіксаванай кропкай
- •Захаванне цэлых лікаў
- •Алгарытм прадстаўлення адмоўнага ліку ў адваротным кодзе
- •Прынцыпы захавання лікаў з плаваючай кропкай
- •Фарматы лікаў з плаваючай кропкай арыфметычнага супрацэсара ibm pc/aт 8087
- •Сродкі алгарытмічнай мовы Pascal Агульная характарыстыка алгарытмічных моў
- •Базавыя элементы мовы Pascal
- •Алфавіт
- •Лексічная структура мовы
- •Агульная структура Pascal-праграмы
- •Простыя даныя мовы Pascal і работа з імі Тыпы звестак
- •Канстанты і пераменныя
- •Абсалютныя пераменныя
- •Цэлалікавыя даныя
- •Бітавая арыфметыка
- •Дзеянні бітавай арыфметыкі
- •Сапраўдныя даныя
- •Аперацыі над сапраўднымі данымі
- •Выразы мовы
- •Літарныя даныя
- •Функцыі
- •Булеўскія даныя
- •Даныя адраснага тыпу
- •Даныя карыстальніцкага тыпу
- •Даныя пералічальнага тыпу
- •Даныя інтэрвальнага тыпу
- •Элементарныя сродкі па рабоце з данымі Наданне значэння даным
- •Найпрасцейшае вызначэнне працэдур і функцый
- •Параметры
- •Знаёмства з файлавай сістэмай
- •Файлавы тып
- •Тэкставыя стандартныя файлы
- •Увод даных розных тыпаў
- •Вывад даных розных тыпаў
- •Вывад сімвалаў
- •Вывад радковых даных
- •Вывад лагічных значэнняў
- •Вывад цэлалікавых значэнняў
- •Вывад даных сапраўднага тыпу
- •Базавыя аператары мовы і метады праграміравання Аператары
- •Простыя аператары
- •Аператар безумоўнага пераходу goto
- •Аператар выкліку працэдуры
- •Пусты аператар
- •Састаўны аператар
- •Аператары выбару
- •Умоўны аператар
- •Метады і прыёмы праграміравання
- •Аператар варыянта
- •Прыклады праграм
- •Аператары паўтарэння
- •Аператар паўтарэння for
- •Аператар паўтарэння repeat
- •Аператар паўтарэння while
- •Хуткая ступень
- •Ітэрацыйныя алгарытмы вышэйшай матэматыкі
- •Структуры даных і праца з імі сродкамі мовы Pascal Парадкавыя тыпы
- •Мноствы
- •Тыпізаваныя канстанты тыпу «мноства»
- •Дзеянні над масівамі
- •Дзеянні над элементамі масіву
- •Пераменныя тыпу «масіў» са стартавым значэннем, ці тыпізаваныя канстанты-масівы
- •Канстанты з тыпам «масіў»
- •Камбінаваны тып «запісы»
- •Змяненне (прывядзенне) тыпаў і значэнняў
- •Радкі сімвалаў
- •Наданне значэння радкам
- •Радковыя выразы
- •Рэдагаванне радкоў
- •Пераўтварэнне радкоў
- •Механізмы структуравання праграм Працэдуры і функцыі
- •Функцыі карыстальніка
- •Параметры
- •Параметры-значэнні
- •Параметры-пераменныя
- •Прынцып лакалізацыі
- •Пабочны эфект
- •Рэкурсія і ітэрацыі
- •Параметры без тыпу
- •Працэдуры і функцыі як параметры. Працэдурныя тыпы
- •Пераменныя – працэдуры і функцыі
- •Падпраграмы ў модулях
- •Выкарыстанне модуля
- •Стандартныя бібліятэчныя модулі
- •Працэдуры кіравання праграмай
- •Эфектыўнасць праграм
- •Аптымізацыя ў час кампілявання
- •Індэксацыя
- •Выкарыстанне цыклаў
- •Арганізацыя цыклаў
- •Аптымізацыя цыклаў
- •Літаратура
Аператар паўтарэння repeat
А ператар паўтарэння REPEAT складаецца з загалоўка цыкла (REPEAT), цела цыкла і ўмовы заканчэння (UNTIL).
Работа аператара: спачатку выконваецца цела цыкла, потым правяраецца ўмова выхаду з цыкла. Пасля атрымання FALSE цела актывізуецца яшчэ раз; пасля атрымання TRUE адбываецца выхад з цыкла. Гэты аператар выконваецца не менш як 1 раз! Аператарныя дужкі тут адсутнічаюць. Па меншай меры адзін з аператараў цела цыкла павінен уплываць на значэнне ўмовы, інакш цыкл будзе выконвацца бясконца ці толькі 1 раз.
Задача. Падлічыць у некаторым тэксце на рускай мове, які складаецца з малых літар і заканчваецца «.» (кропкай), колькасць зычных літар.
PROGRAM Letters;
VAR ch : Char;
s : Integer;
BEGIN
s:=0;
REPEAT
Read (ch); {пасімвальна ўводзіцца тэкст}
IF ch IN ([′б′..′щ′]–[′е′,′и′,′о′,′у′]) THEN s=s+1;
UNTIL ch=′.′;
Writeln (′колькасць зычных =′, s:3);
END.
Тут мы скарысталі канстанты – элементарныя мноствы. Гэтую задачу можна запраграміраваць пры дапамозе аператара CASE.
Аператар паўтарэння while
А ператар WHILE падобны аператару REPEAT, але ўмова выканання цела цыкла правяраецца ў самым пачатку работы аператара.
Калі ўмова праўдзівая, выконваецца цела цыкла, і так працягваецца да той пары, пакуль умова стане лжывай. У гэтым выпадку выкананне аператара цыкла завяршаецца.
WHILE true DO Write(′бясконцы цыкл′);
WHILE true = false DO Write(′пусты цыкл′);
Цыклы REPEAT і WHILE працуюць з рознымі ўмовамі. У цыкла REPEAT – умова заканчэння цыкла, а ў цыкла WHILE – умова працягу цыкла.
Умова – гэта булеўскі выраз, які падлічваецца пры кожным выкананні цела цыкла, таму дзеля эканоміі часу падлік яго трэба рабіць максімальна простым. Каб выйсці з цыкла WHILE заўчасна, трэба ўмову зрабіць ілжывай.
Задача. Зададзены сапраўднае А і натуральнае k. Падлічыць не выкарыстоўваючы аперацыю ўзвядзення ў ступень.
Разгледзім звычайныя алгарытмы (іх як мінімум два):
а) CONST k=...; а=...;
...
b:=1; FOR i:=1 TO k DO b:=b*a;
б) CONST k:Byte=...; а=...;
...
b:=1;
WHILE k>0 DO
BEGIN b:=b*a; dec(k) END;
Аднак існуе больш танны алгарытм, які называецца хуткая ступень.
Хуткая ступень
Вышэй мы разглядалі просты алгарытм
(1)
У канцы атрымаецца
Аднак калі k – цотнае, тады мае месца тоеснасць Значыць, можна зрабіць замену і зноў прымяніць алгарытм (1).
Атрымаем наступную праграму:
PROGRAM Quikstep;
VAR x, a, b : Real;
k, n : Integer;
BEGIN
Writeln(′a, k -′); Readln(x, n);
Write(x, ′^′, n, ′=′);
k := n;
b := 1;
a := х;
WHILE k>0 DO
BEGIN
IF Odd(k) THEN b := b * a;
k := k DIV 2;
a := a * a;
END;
Writeln (b);
END.
Тут скарысталі скарочаную форму аператара іf, таму што пасля няцотнага k := k-1 будзе ісці цотнае k, і выйдзем на k := k DIV 2, а гэта можна рабіць і не памяншаючы .
Праверым правільнасць работы праграмы пры
Вынік атрымаем за тры праходы:
Ітэрацыйныя алгарытмы вышэйшай матэматыкі
Як ужо адзначалася, пры дапамозе аператара FOR праграміруюцца цыклы з зададзеным лікам паўтарэнняў, а аператары REPEAT … UNTIL ці WHILE … DO выкарыстоўваюцца тады, калі колькасць паўтарэнняў наперад невядома, а зададзена некаторая ўмова яго заканчэння (ці працягвання).
У матэматыцы існуюць задачы, якія можна рашаць пры дапамозе такіх цыклаў.
Прыклад 1. У час паўтарэнняў цела цыкла ўтвараецца паслядоўнасць значэнняў якая імкнецца да ліміту а:
Кожнае новае у такой паслядоўнасці вызначаецца з улікам папярэдняга (або папярэдніх k членаў: і з’яўляецца ў параўнанні з імі больш дакладным набліжэннем да шукаемага выніку (ліміту) а.
Цыклы, якія рэалізуюць такую паслядоўнасць набліжэнняў (ітэрацый), называюць ітэрацыйнымі.
У ітэрацыйных цыклах умова працягвання (заканчэння) цыкла высноўваецца на ўласцівасцях бязмежнага прыбліжэння значэнняў да ліміту а пры павелічэнні n. Ітэрацыйны цыкл заканчваюць, калі для некаторага значэння n выконваецца ўмова
дзе – дапушчальная хібнасць падліку выніку.
Тады вынік атаясамліваюць са значэннем г. зн. лічаць, што
Заўвага. Паслядоўнасць не трэба блытаць з масівам. У масіве колькасць элементаў вядома загадзя, а ў паслядоўнасці колькасць элементаў фактычна неабмежаваная, ды і элементы паслядоўнасці атрымліваюцца рэкурэнтна, таму папярэднія элементы паслядоўнасці можна «доўга» не захоўваць.
Прыклад 2. З вышэйшай матэматыкі вядома, што для знаходжання квадратнага кораня можна прымяніць наступны алгарытм: знайсці з дакладнасцю да ліміт паслядоўнасці дзе
Напішам праграму знаходжання з дакладнасцю
Рашэнне. Зыходнымі данымі з’яўляецца лік , з якога трэба здабыць корань, і значэнне , якое з’яўляецца некаторым грубым набліжэннем кораня (яго можна падлічыць, напрыклад, графічна).
В ынікам будзем лічыць той , калі (гэта вынікае з ліміту паслядоўнасці). Для захавання элементаў паслядоўнасці будзем выкарыстоўваць адну пераменную u.
Праграма, якая рэалізуе алгарытм на мове Pascal:
PROGRAM Newton;
VAR
a, y0, u, v : Real;
n : Integer;
BEGIN
Writeln('a, y0 =');
Readln(a, y0);
u := y0;
n := 0;
REPEAT
v := 0.5 * (a / u - u);
Inc(n);
u := u + v;
UNTIL (Abs(v) < 1E-3) ОR (n > 100);
Writeln('корань з', а : 8 : 3, '=', u);
END.
Заўвага. У такіх задачах, калі дрэнна падабрана пачатковае прыбліжэнне , можа адбыцца «зацыкліванне», таму трэба прадугледзець падлік крокаў, і калі іх стала многа (напрыклад, тады працэс перарываем, друкуем v, u, n, а потым ацэньваем, ці правільна быў здзейснены выбар пачатковага прыбліжэння.
Тыповым прыкладам ітэрацыйнага цыклічнага працэсу можа служыць задача вылічэння сумы бясконцага рада. Паняцце сумы рада звязана з паняццем збежнасці бясконцага рада.
Рад – гэта бясконцая сума віду
(1)
Складаемыя называюцца членамі рада, а сумы канечнага ліку членаў рада – частковымі сумамі рада парадку n.
Адрозніваюць лікавыя і функцыянальныя рады.
Прыклад лікавага рада: або сума геаметрычнай прагрэсіі калі
Членамі функцыянальнага рада з’яўляюцца функцыі.
Прыклад функцыянальнага рада:
Рад (1) называецца збежным, калі збягаецца паслядоўнасць яго частковых сум . У гэтым выпадку ліміт называецца сумай рада. Калі ліміт не існуе, тады рад разбежны.
Існуюць адзнакі збежнасці радоў. Адну з іх выкарыстоўваюць пры лікавых падліках сумы рада.
Адзнака Лейбніца: калі , , тады знакачаргавальны рад збягаецца. У гэтай сувязі рад замяняецца яго канечнай сумай , дзе – гэта нумар таго складаемага, для якога
Нагадаем, што ўсе трыганаметрычныя функцыі, а таксама лагарыфмічная і экспаненцыяльная функцыі ў мовах праграміравання падлічваюцца пры дапамозе раскладання іх у рад.
Разгледзім падрабязнасці падліку частковых сум віду
Звычайна формула агульнага члена сумы належыць да аднаго з наступных трох тыпаў:
а) – атрыманне здабытку;
б) – здабытак адсутнічае зусім;
в) – здабытак прысутнічае часткова.
У выпадку а) для падліку складаемага сумы мэтазгодна выкарыстоўваць рэкурэнтныя суадносіны, г. зн. выражаецца праз як вызначаецца з канкрэтнай задачы. Гэта дазваляе пазбегнуць перападліку велічынь, напрыклад (бо было вядома). Акрамя таго, падлік члена сумы па агульнай формуле ў шэрагу выпадкаў зусім немагчымы. Напрыклад, калі прысутнічае , то трэба памятаць, што падлік па вызначэнні хутка прыводзіць да перапаўнення.
У выпадку б) кожны член сумы мэтазгодна падлічваць па агульнай формуле. У выпадку в) член сумы трэба ўявіць як здабытак двух сумножнікаў: адзін віду a), другі – б), а потым паасобна іх падлічваць.
Напрыклад:
Тут мае від б), а – від а).
Задача. Для зафіксаванага x падлічыць з хібнасцю значэнне функцыі выкарыстоўваючы вядомае (з даведнікаў) раскладанне функцыі у наступны рад:
дзе
Рашэнне. Будзем падлічваць да таго часу, пакуль або
Папярэдняя класіфікацыя падказвае, што агульны член нашага рада належыць да тыпу а). Значыць, будзем шукаць залежнасць паміж суседнімі складаемымі.
Няхай зафіксавана нейкае Тады ,
дзе
І можам атрымаць
Фрагмент праграмы, якая рэалізуе алгарытм на мове Pascal:
{Тут аб'яўленне пераменных і пачатак праграмы}
S := 0;
a := 1;
k := 1; {n := 0;}
y := -x * x;
REPEAT
S := S +a;
a := a * y / k / ( k+ 1);
{a := -a * Sqr(x) / ((2 * n + 1) * (2 * n + 2));}
k := k + 2; {n := n + 1;}
UNTIL abs(a) < eps;
{надрукаваць вынік}
Для аптымізацыі цыкла пры запісе праграмы адразу палепшылі вылічальную схему алгарытму. Перад цыклам уводзім дапаможныя пераменныя і пры Цыкл з крокам 1 па пераменнай замяняем на цыкл з крокам 2 па пераменнай
–x * x y
2 * n + 1 k
n = 0, 1, 2, … k = 1, 3, … (крок 2)
Астатнія аператары дапішыце самастойна.