- •Уводзіны Ключавыя палажэнні
- •Развіццё моў камп’ютарнага праграміравання
- •Эвалюцыя мовы Pascal
- •Структурная метадалогія распрацоўкі праграм Алгарытм
- •Асноўныя этапы рашэння задач на эвм
- •Блок-схемы
- •Структураграмы
- •Тэсціраванне праграм
- •Адладка праграм
- •Структурнае праграміраванне і дакладнасць праграм
- •Асноўныя канструкцыі структур кіравання
- •Метады распрацоўкі праграм
- •Праграміраванне зверху ўніз (ад агульнага да асобнага)
- •Модульнае праграміраванне
- •Праграміраванне знізу ўверх
- •Структурнае кадзіраванне
- •Арыфметыка эвм Сістэмы злічэння
- •Пераклады лікаў з адной сістэмы злічэння ў другую
- •Пераклад цэлых дадатных лікаў з сістэмы злічэння з асновай «p» у сістэму злічэння з асновай «q»
- •Пераклад правільных дробаў з сістэмы злічэння з асновай «p» у сістэму злічэння з асновай «q»
- •Пераклад змешаных дробаў
- •Формы прадстаўлення даных
- •Формы прадстаўлення лікаў у персанальным камп’ютары
- •Захаванне лікаў з фіксаванай кропкай
- •Захаванне цэлых лікаў
- •Алгарытм прадстаўлення адмоўнага ліку ў адваротным кодзе
- •Прынцыпы захавання лікаў з плаваючай кропкай
- •Фарматы лікаў з плаваючай кропкай арыфметычнага супрацэсара ibm pc/aт 8087
- •Сродкі алгарытмічнай мовы Pascal Агульная характарыстыка алгарытмічных моў
- •Базавыя элементы мовы Pascal
- •Алфавіт
- •Лексічная структура мовы
- •Агульная структура Pascal-праграмы
- •Простыя даныя мовы Pascal і работа з імі Тыпы звестак
- •Канстанты і пераменныя
- •Абсалютныя пераменныя
- •Цэлалікавыя даныя
- •Бітавая арыфметыка
- •Дзеянні бітавай арыфметыкі
- •Сапраўдныя даныя
- •Аперацыі над сапраўднымі данымі
- •Выразы мовы
- •Літарныя даныя
- •Функцыі
- •Булеўскія даныя
- •Даныя адраснага тыпу
- •Даныя карыстальніцкага тыпу
- •Даныя пералічальнага тыпу
- •Даныя інтэрвальнага тыпу
- •Элементарныя сродкі па рабоце з данымі Наданне значэння даным
- •Найпрасцейшае вызначэнне працэдур і функцый
- •Параметры
- •Знаёмства з файлавай сістэмай
- •Файлавы тып
- •Тэкставыя стандартныя файлы
- •Увод даных розных тыпаў
- •Вывад даных розных тыпаў
- •Вывад сімвалаў
- •Вывад радковых даных
- •Вывад лагічных значэнняў
- •Вывад цэлалікавых значэнняў
- •Вывад даных сапраўднага тыпу
- •Базавыя аператары мовы і метады праграміравання Аператары
- •Простыя аператары
- •Аператар безумоўнага пераходу goto
- •Аператар выкліку працэдуры
- •Пусты аператар
- •Састаўны аператар
- •Аператары выбару
- •Умоўны аператар
- •Метады і прыёмы праграміравання
- •Аператар варыянта
- •Прыклады праграм
- •Аператары паўтарэння
- •Аператар паўтарэння for
- •Аператар паўтарэння repeat
- •Аператар паўтарэння while
- •Хуткая ступень
- •Ітэрацыйныя алгарытмы вышэйшай матэматыкі
- •Структуры даных і праца з імі сродкамі мовы Pascal Парадкавыя тыпы
- •Мноствы
- •Тыпізаваныя канстанты тыпу «мноства»
- •Дзеянні над масівамі
- •Дзеянні над элементамі масіву
- •Пераменныя тыпу «масіў» са стартавым значэннем, ці тыпізаваныя канстанты-масівы
- •Канстанты з тыпам «масіў»
- •Камбінаваны тып «запісы»
- •Змяненне (прывядзенне) тыпаў і значэнняў
- •Радкі сімвалаў
- •Наданне значэння радкам
- •Радковыя выразы
- •Рэдагаванне радкоў
- •Пераўтварэнне радкоў
- •Механізмы структуравання праграм Працэдуры і функцыі
- •Функцыі карыстальніка
- •Параметры
- •Параметры-значэнні
- •Параметры-пераменныя
- •Прынцып лакалізацыі
- •Пабочны эфект
- •Рэкурсія і ітэрацыі
- •Параметры без тыпу
- •Працэдуры і функцыі як параметры. Працэдурныя тыпы
- •Пераменныя – працэдуры і функцыі
- •Падпраграмы ў модулях
- •Выкарыстанне модуля
- •Стандартныя бібліятэчныя модулі
- •Працэдуры кіравання праграмай
- •Эфектыўнасць праграм
- •Аптымізацыя ў час кампілявання
- •Індэксацыя
- •Выкарыстанне цыклаў
- •Арганізацыя цыклаў
- •Аптымізацыя цыклаў
- •Літаратура
Структурнае праграміраванне і дакладнасць праграм
Першае, што патрабуецца ад алгарытму рашэння задачы, – гэта правільна яе рэалізаваць.
Другое – патрэбна такая рэалізацыя, якая з’яўляецца лёгкай для разумення, простай для доказу правільнасці алгарытму і зручнай для мадыфікацыі. Гэтыя патрабаванні важныя галоўным чынам таму, што, калі алгарытмы становяцца ўсё больш складанымі, адпаведна расце і цяжкасць іх распрацоўкі, складанасць разумення, як яны працуюць, г. зн. цяжка выпраўляць знойдзеныя ў алгарытмах памылкі, даказваць карэктнасць алгарытму і пры неабходнасці правільна ўносіць у праграмы карэктывы.
Праграміраванне раней лічылася мастацтвам, якому цяжка навучыць, а потым стала зразумела, што праграмістаў патрабуецца многа, і, спрабуючы ім дапамагчы, індустрыя праграмнага забеспячэння пачала прапаноўваць больш сістэматычныя падыходы: ад простых методык распрацоўкі праграм да візуальнага праграміравання.
На сённяшні дзень самай папулярнай методыкай распрацоўкі алгарытму рашэння задачы з’яўляецца структурнае праграміраванне зверху ўніз, калі задача асэнсоўваецца ў цэлым, потым яна разбіваецца на падзадачы, якія ўжо вядома, як алгарытмізаваць сродкамі структурнага праграміравання.
Разгледзім гэтую методыку на прыкладзе ўяўлення алгарытму ў выглядзе блок-схем. Даволі проста даказаць, што любая праграма для ЭВМ можа быць прадстаўлена блок-схемай (напрыклад, у суадносінах 1:1, калі кожнай аперацыі ставіцца ў адпаведнасць адзін блок, ці ў суадносінах N : M, дзе N – колькасць аператараў праграмы, M – колькасць блокаў).
Значыць, і любую блок-схему можна пераўтварыць у праграму для ЭВМ. Каб спрасціць працэс праграміравання, блок-схемы павінны быць больш набліжаны да мовы праграміравання, г. зн. падпарадкоўвацца нейкім жорсткім прынцыпам.
Аператары кіравання, якія маюць сучасныя мовы праграміравання, добра адлюстроўваюцца, як мы бачылі раней, дыяграмамі Насі – Шнейдэрмана, ці структураграмамі. Блок-схемы, якія падпарадкаваны такім жа ўмовам, таксама называюцца структурнымі блок-схемамі.
Структурная блок-схема – гэта блок-схема, якая можа быць выражана як кампазіцыя шасці элементарных блок-схем структур кіравання.
Асноўныя канструкцыі структур кіравання
Разгледзім шэсць элементарных блок-схем структур кіравання падрабязней.
Кампазіцыя ці чаргаванне:
Выбар ці альтэрнатыва (рашэнне):
а) б)
(аператар if_then_else) (аператар if_then)
Варыянт:
В –
варыянт выбару,
S1
– працэс
1,
. . .
Sm
– працэс
m.
(аператар case_of_end)
Паўтарэнне (цыкл) з пасляўмовай:
(аператар repeat_until)
Паўтарэнне (цыкл) з перадумовай:
(аператар while_do)
Цыкл з пералікам (параметрам):
(аператар for_to(downto)_do)
Важнай асаблівасцю ўсіх структур кіравання з’яўляецца тое, што кожная з іх мае адзін уваход і адзін выхад. Значыць, і ўся блок-схема будзе мець гэтую ўласцівасць, таму мы з пачатку алгарытму выйдзем на канец яго.
Для кожнай з прапанаваных канструкцый у структурнай алгарытмічнай мове існуюць пэўныя аператары: if_then_else, case_of_end, whilе_do, repeat_until, for_to(downtо)_do.
Адзначым, што існуе многа моў структурнага напрамку: Algol, Pascal, C, Ada, Modula і інш. Fortran-падобныя мовы праграміравання (напрыклад, Basic) неструктурнага напрамку, хаця Fortran‑77 ужо мае элементы структурнага праграміравання.
Аксіёма. Любая блок-схема можа быць прадстаўлена структурнай блок-схемай.
Доказ правільнасці алгарытму – гэта адзін з самых цяжкіх і cтомных этапаў стварэння праграм. Таму дзякуючы «празрыстасці» асобных дзеянняў лягчэй прасачыць за правільнасцю ўсіх дзеянняў па рашэнні пастаўленай задачы.
Карыстаючыся кіруючымі канструкцыямі ўжо пры распрацоўцы алгарытму, лёгка сачыць за правільнасцю яго частак і гэтым даказваць правільнасць усяго алгарытму.
Найбольш агульная тактыка распрацоўкі праграм складаецца з дэкампазіцыі ўсёй задачы на асобныя больш простыя падзадачы, якія прыводзяць да рашэння ўсёй задачы. Затым працэс дэкампазіцыі распаўсюджваецца на падзадачы, і так да той пары, пакуль не атрымаюцца падзадачы, якія лёгка рэалізуюцца на мове праграміравання.
Дэкампазіцыя задачы – ітэрацыйны працэс, які не выключае зварот назад. Пры распрацоўцы праграмы можа аказацца, што на некаторым кроку прыняты нездавальняючыя рашэнні ці асобныя падзадачы, якія амаль не рэалізуюцца на мове праграміравання. У гэтым выпадку неабходна будзе вярнуцца на некалькі крокаў назад і пераглядзець дэкампазіцыі нанава.
Апісаны метад прапанаваны Н. Віртам (1971) і называецца пакрокавай дэталізацыяй.
Выкарыстоўваючы прапанаваную методыку структурнага праграміравання, разгледзім некалькі задач, якія можна назваць базавымі, і саставім структурныя блок-схемы для іх. Спачатку дадзім азначэнне масіву.
Масівам называецца сукупнасць элементаў аднаго тыпу, якія маюць адно імя і адрозніваюцца адзін ад аднаго нумарамі – індэксамі. Існуюць аднамерныя масівы (вектары), двухмерныя (матрыцы), трохмерныя масівы і г. д.
Задача 1. Знайсці адну з наступных сум.
1.1. N першых няцотных лікаў.
1.2. N першых выпадковых лікаў.
1.3. N першых простых лікаў.
1.4. N лікаў , дзе ,
Рашэнне. Ва ўсіх выпадках трэба падлічыць
Блок-схема атрымання сумы лікаў наступная.
Аднак пры рашэнні задачы 1.1 праграма павінна адразу даць адказ: (таму што сума паслядоўнасці лікаў ёсць ) і не арганізоўваць цыклічны працэс.
Для рашэння задач 1.2–1.4 атрымаем адзіную блок-схему, у якой не канкрэтызавана, як атрымліваецца складаемае.
У задачы 1.2 складаемыя атрымліваюцца выклікам функцыі, якая вяртае чарговы выпадковы лік, а ў задачы 1.3 – выклікам функцыі, якая вяртае чарговы просты лік. Такую функцыю трэба яшчэ напісаць. У задачы 1.4 трэба падумаць, як больш эфектыўна атрымаць наступнае складаемае.
Задача 2. Знайсці індэкс найменшага элемента ў аднамерным масіве.
Алгарытм. Запамінаецца індэкс першага элемента і потым утвараецца цыкл на колькасць элементаў, якія засталіся. У цыкле параўноўваюцца ўсе чарговыя элементы з элементам пад індэксам Пры знаходжанні меншага элемента яго нумар запамінаецца ў пераменнай
Блок-схема:
Задача 3. Упарадкаваць элементы масіву па нарастанні.
Алгарытм. Пры распрацоўцы блок-схемы будзем абапірацца на задачу 2. Выклічам дапаможны алгарытм пошуку індэкса найменшага элемента сярод . Затым першы найменшы абмяняем з , другі найменшы – з і г. д. Такі алгарытм упарадкавання называецца сартаваннем метадам прамога выбару.
Блок-схема:
Дапаможны
алгарытм пошуку індэкса ind
найменшага элемента сярод
ai, …, an
Г этую ж задачу ўпарадкавання можна рашыць і другім метадам. Пачынаючы з першага элемента масіву параўноўваюцца два суседнія элементы. Калі яны не адпавядаюць умове нарастання, тады абменьваюцца іх значэнні і далей параўноўваецца наступная пара элементаў. За першым праходам масіву да канца самы цяжкі элемент зрушыцца ў канец. Зноў cпачатку адбываецца параўнанне суседніх элементаў. За другім праходам масіў праглядаецца не да канца, а да перадапошняга элемента. За ( )-м праглядам адбудзецца поўнае ўпарадкаванне. Такі алгарытм упарадкавання называецца сартаваннем метадам пузырка. Блок-схему такога алгарытму напішыце самастойна.
Задача 4. Упарадкаваць элементы кожнага радка матрыцы па нарастанні.
Алгарытм. Выкарыстаем метад пакрокавай дэталізацыі. Паколькі кожны зафіксаваны і-ы радок матрыцы ўяўляе сабой аднамерны масіў то скарыстаем папярэдні алгарытм упарадкавання аднамернага масіву, блок-схему якога напішыце самастойна на месцы каментарыя.
Задача 5. Знайсці суму працэс накаплення складаемых закончыць, калі атрымаецца складаемае па модулі менш за
Рашэнне. Разгледзім суму дзе Спачатку ўспомнім задачу падліку сумы бясконцай геаметрычнай прагрэсіі. Мы змаглі падлічыць суму толькі пры ўмове, што кожнае наступнае складаемае па модулі было менш за папярэдняе. Гэты момант прысутнічае і тут.
Алгарытм. першае складаемае, калі яно па модулі больш за 10–7, дададзім да сумы, наступнае, калі яно па модулі яшчэ больш за 10–7, – у суму і гэтак далей, пакуль складаемае па модулі не стане менш за 10–7.
Атрымаць даволі проста. Паколькі то дзе
Заўвага. – элемент з нумарам Калі так пакінуць, то пад кожны трэба месца, а ў такой пастаноўцы задачы невядома, колькі будзе і не трэба гэтага ведаць, бо, дабавіўшы ў складаемае, можна яго замяніць наступным. Перапрацуйце блок-схему з улікам гэтай заўвагі самастойна.
Заданне. Няхай вядомы функцыі
Пабудаваць матрыцу дзе – нейкія канстанты, па наступным правіле: Праверыць яе сіметрычнасць адносна галоўнай і пабочнай дыяганалей.