§ 6. Выкарыстанне асноўных алгарытмічных канструкцый для рашэння задач
Сайт: | Профильное обучение |
Курс: | Інфарматыка. 10 клас (Павышаны ўзровень) |
Книга: | § 6. Выкарыстанне асноўных алгарытмічных канструкцый для рашэння задач |
Напечатано:: | Гость |
Дата: | Пятница, 6 Июнь 2025, 06:37 |
6.1. Наладка праграм у асяроддзі Code::Blocks
У дапамогу карыстальніку амаль любога асяроддзя праграміравання даюцца сродкі, неабходныя для наладкі праграмы. Яны дазваляюць старанна пратэсціраваць праграму і выправіць усе памылкі ў ёй (прыклад 6.1). Асяроддзе Code::Blocks змяшчае наладчык, які дазваляе выканаць праграму па радках, праглядаць і мадыфікаваць пераменныя і выразы. Адладчык убудаваны ў інтэграванае асяроддзе, і таму карыстальнік можа рэдагаваць, кампіляваць і адладжваць праграму, не выходзячы з асяроддзя. Памылкі кампіляцыі Памылкі кампіляцыі, або сінтаксічныя памылкі, узнікаюць у тым выпадку, калі не апісана некаторая пераменная, перадаецца няправільная колькасць параметраў функцыі, прапушчана кропка з коскай ці дужка і г. д. З выпраўленнем памылак, выяўленых у час кампіляцыі, складанасцей практычна не ўзнікае. Кампілятар, выявіўшы ў праграме памылкі, завяршае працу і выдае інфармацыю пра памылкі ў акне рэдактара кода, на ўкладцы Build log (прыклад 6.2). Исправив ошибки, обнаруженные таким образом, можно повторить компиляцию программы. Памылкі выканання Памылкі выканання, або семантычныя памылкі, узнікаюць на этапе выканання пры спробе адкрыць файл, якога не існуе, дзяліць на нуль і г. д. (прыклад 6.3). Пры гэтым выкананне праграмы перарываецца. Узнікненне фатальных памылак прыводзіць да неадкладнага спынення выканання праграмы. Лагічныя памылкі Праграма можа змяшчаць і лагічныя памылкі. Лагічныя памылкі дазваляюць кампілятару выканаць праграму, аднак вынік выканання будзе адрознівацца ад чаканага. Наяўнасць такіх памылак вызначаецца з дапамогай тэсціравання. Выявіць памылку гэтай групы, не маючы ніякіх наладачных сродкаў, бывае дастаткова складана. Наяўнасць у праграме такіх памылак з’яўляецца адной з асноўных прычын узнікнення неабходнасці выкарыстання наладчыка, які ўваходзіць у склад інтэграванага асяроддзя. Наладчык дазваляе выканаць праграму ў дыялогавым рэжыме, назіраючы за змяненнем значэнняў асобных пераменных ці выразаў. Маецца магчымасць спыніцца ў зададзеным пункце праграмы і змяніць значэнні некаторых пераменных і выразаў. Каманды наладчыка сабраны ў меню Debug (прыклад 6.4). Гэтыя ж каманды прадубляваны на панэлі хуткага доступу (прыклад 6.5). Апісанне каманд наладкі, сабраных у меню Debug, прыведзены ў Дадатку да главы 1. Трасіроўка — выкананне зыходнай праграмы па радках, пры якім пасля выканання кожнага радка можна спыніцца і паглядзець вынікі. Наяўнасць магчымасці выканання зыходнай праграмы да радка, на які паказвае курсор, дазваляе прапусціць трасіроўку малацікавых частак праграмы і адразу перайсці ў пункт пачатку наладкі. Для гэтых мэт можна націснуць F4 у радку з курсорам. Калі гэты радок знаходзіцца пасля ўводу даных, то ўвод даных адбудзецца як звычайна, выкананне праграмы перапыніцца, калі прыйдзе чарга выканання гэтага радка. Неабходна пераключыцца з кансольнага акна ў акно кода. Той радок, які павінен выканацца, пазначаецца жоўтым трохвугольнікам Некаторыя радкі праграмы могуць быць пазначаны як пункты перарывання. Для гэтага дастаткова клікнуць мышшу злева ад радка праграмы. У гэтым месцы з’явіцца чырвоны круг Калі ў працэсе выканання аладкі праграмы (запуск з дапамогай клавішы F8 ці Наладчык інтэграванага асяроддзя Code::Blocks дае магчымасць назірання за змяненнем пераменных ці выразаў. Аб’екты, за якімі назіраюць, адлюстроўваюцца ў акне назірання Watches, паказваючы змяненні ў праграме пры пакрокавым выкананні. Для адкрыцця акна Watches можна выканаць каманду Debug → ebugging Windows → Watches ці выбраць яго са спісу наладачных вокнаў на панэлі хуткага доступу (прыклад 6.8). Для дабаўлення пераменнай у акно прагляду трэба дабавіць яе імя ў першы слупок акна Watches. |
Прыклад 6.1. Тыпы памылак:
Пыклад 6.2. Прыклад памылкі кампіляцыі. Усе памылкі вылучаюцца чырвоным колерам. Для кожнай памылкі паказваецца нумар радка, у якім выяўлена памылка, і апісанне гэтай памылкі. Шэрым фонам падсвечваецца тая з памылак, якая вылучана ў праграме знакам Двайная пстрычка па памылцы ў акне Build log пакажа яе месцазнаходжанне ў праграме. Пераходзіць да прагляду наступнай памылкі можна з выкарыстаннем спалучэння клавіш Alt + F2, а вярнуцца да папярэдняй — Alt + F1. Прыклад 6.3. Прыклад памылкі выканання. Тэкст праграмы:
Тэсціраванне: Пры x = 5 узнікае памылка дзялення на нуль, і асяроддзе выдае паведамленне з кодам памылкі: «Process returned –1073741676». Калі праграма выканалася паспяхова, то код памылкі 0: «Process returned 0». Пры аналізе праграмы кампілятар выдае не толькі памылкі, але і папярэджанні (warning) пра тое, што некаторыя запісы могуць прывесці да памылкі. Папярэджанні вылучаюцца сінім колерам. Калі ў праграме вышэй запісаць int y = x / (x - x); то пры кампіляцыі праграмы можна ўбачыць папярэджанне: Прыклад 6.4. Меню Debug: Прыклад 6.5. Панэль хуткага доступу з камандамі наладкі: Прыклад 6.6. Рэжым наладкі: Прыклад 6.7. Пункты перарывання: Калі пункт перарывання ўстаноўлены ўнутры цыкла, то можна вызначыць, колькі ітэрацый цыкла будзе прапушчана, перад тым як праграма перапыніцца. Зрабіць гэта можна з кантэкставага меню пункта перарывання. Таксама можна паказаць лагічны выраз, пры якім спрацуе пункт перарывання. Прыклад 6.8. Акно назірання за значэннямі пераменных Watches: Акно Watches з’яўляецца «вісячым», пры жаданні яго можна прычапіць да акна рэдактара кода. Для гэтага трэба перамясціць акно Watches да акна рэдактара кода і выбраць месца яго змяшчэння. У працэсе перамяшчэння акна месца, куды яго можна «прычапіць», будзе адлюстроўвацца прамавугольнікам шэрага колеру. У акне Watches адлюстроўваюцца бягучыя значэнні пераменных. Пераменная, якая змянілася апошняй, адлюстроўваецца чырвоным колерам. |
6.2. Выкарыстанне лікавых паслядоўнасцей
Лікавыя паслядоўнасці дазваляюць апісваць шмат якія працэсы, што адбываюцца ў прыродзе і грамадстве. Для задання элементаў лікавай паслядоўнасці звычайна выкарыстоўваюць адзін з двух спосабаў: 1. Запісваецца залежнасць значэння элемента паслядоўнасці ад значэння нумара (прыклад 6.9). Ёсць паслядоўнасці, якія можна задаваць як першым спосабам, так і другім (прыклад 6.11). Паслядоўнасці могуць будавацца з выпадковых лікаў. Прыклад 6.12. Вывесці на экран першыя k элементаў паслядоўнасці, зададзенай формулой Этапы выканання задання I. Зыходныя даныя: k (колькасць лікаў). II. Вынік: k лікаў паслядоўнасці. III. Алгарытм рашэння задачы. 1. Увод ліку k. IV. Апісанне пераменных: k – int, n – double. Прыклад 6.13. Знайсці першы элемент паслядоўнасці, зададзенай рэкурэнтна Этапы выканання задання I.Зыходныя даныя: лік b. II. Вынік: элемент паслядоўнасці, меншы за 0.001, і яго нумар. III. Алгарытм рашэння задачы. 1.Увод ліку b. |
Пацверджаннем важнасці лікавых паслядоўнасцей з’яўляецца той факт, што створана цэлая энцыклапедыя лікавых паслядоўнасцей OEIS [1]. Прыклад 6.9. Формула Прыклад 6.10. Адной з найбольш вядомых паслядоўнасцей, якую можна апісаць рэкурэнтна, з’яўляецца паслядоўнасць Фібаначы: 1, 1, 2, 3, 5, 8, 13… . Нескладана заўважыць, што кожны яе элемент, пачынаючы з трэцяга, роўны суме двух папярэдніх. Гэта можна запісаць так: an = an − 1 + an − 2, a1 = 1, a2 =1. Прыклад 6.11. У паслядоўнасці 2, 4, 8, 16,… кожны лік з’яўляецца ступенню 2, таму яе можна задаць формулай an = 2n. З іншага боку, кожны элемент паслядоўнасці, пачынаючы з другога, у два разы большы за папярэдні. Атрымаем формулу an = 2an − 1 (для n > 1, a1 = 2). Прыклад 6.12. V. Праграма:
VI. Тэсціраванне. Пры вылічэнні значэння a важна памятаць, што вынікам дзялення двух цэлых лікаў (у дадзеным выпадку гэта лікі n і n2 + 1) будзе цэлы лік, таму неабходна пераўтварэнне тыпу ў рэчыўны да выканання аперацыі дзялення. Радок, у якім вылічваецца значэнне a, можна запісаць і так: double a = static_cast<double> n) / (n * n + 1); Прыклад 6.13. V. Праграма:
VI. Тэсціраванне. |
6.3. Вылічэнне значэння фактарыяла ліку
Фактарыялам ліку n называюць паслядоўны здабытак натуральных лікаў, не большых за n: n! = 1 · 2 · 3 · ... · n. Роўнасць 0! = 1 звычайна прымаюць у якасці пагаднення. Прымер 6.14. Напісаць праграму, якая па ўведзеным натуральным значэнні n атрымлівае n!. Этапы выканання задання. I. Для вылічэння : число n. II. Вынік: f (значэнне n!). III. Алгарытм рашэння задачы. 1. Ввод числа n. n! =(n – 1)! · n. 3. Для вылічэння здабытку можна выкарыстаць цыкл for. Пачатковае значэнне пераменнай f роўна 1. |
Назва фактарыял паходзіць ад лацінскага factorialis — які дзейнічае, выконвае, памнажае. У 1808 г. французскі матэматык Крысціян Крамп прапанаваў кампактнае абазначэнне (вымаўляецца «эн фактарыя'л»). Фактарыялы ўсіх лікаў складаюць паслядоўнасць A000142 у OEIS. |
6.4. Знаходжанне сумы элементаў лікавай паслядоўнасці
Прыклад 6.15. У сакрэтнай лабараторыі выводзяць карысныя бактэрыі. Эксперыментальна было вызначана, што колькасць бактэрый (у млн) залежыць ад нумара дня, у які праводзіцца эксперымент, наступным чынамм: Этапы выканання задання. I. Зыходныя даныяе: m (колькасць дзён). II. Вынік: s (агульная колькасць бактэрый). III. Алгарытм рашэння задачы. 1. Увод ліку m. IV. Апісанне пераменных: m – int, s, a – double. Прыклад 6.16. Напісаць праграму для вылічэння сумы, якая мае сваімі складаемымі элементы паслядоўнасц Этапы выканання задання I. Зыходныя даныя: eps (дакладнасць вылічэнняў). II. Вынік: пераменная s (сума). III. Алгарытм рашэння задачы. 1. Увод ліку eps. 2.1. Паколькі колькасць складаемых загадзя не вядомая, то для вылічэння сумы выкарыстаем цыкл do…while. 3. Вывад вынік s. IV. Апісанне пераменных: n – int, eps, a, s, d, f – double. |
Прыклад 6.15. V. Праграма:
VI. Тэсціраванне VII. Аналіз выніку. Для праверкі правільнасці выніку можна палічыць значэнне сумы на калькулятары: Прыклад 6.16. V. Праграма:
VI. Тэсціраванне VII. Аналіз выніку. Паколькі фактарыял з’яўляецца функцыяй, якая надзвычай хутка расце, то элементы паслядоўнасці спадаюць. Выпішам элементы: Шосты элемент меншы за 0.1. Гэта апошняе складаемае ў суме. Сума першых шасці элементаў — ≈9.07. Калі eps = 0.01, да сумы, атрыманай для eps = 0.1, будуць дабаўляцца складаемыя, меншыя за 0.1, якія нязначна зменяць значэнне сумы. Розніца ў значэннях сумы — ≈0.03. Чым меншая дакладнасць, тым менш будуць адрознівацца сумы. |
6.5. Пабудова табліцы значэнняў функцыі
Прыклад 6.17. Вывесці на экран табліцу значэнняў функцыі y = x2sinx. Колькасць значэнняў уводзіцца. Пачатковае значэнне x = –3, значэнні аргумента выводзяцца з крокам h = 0.5. Этапы выканання задання I. Зыходныя данныя: k (колькасць пунктаў). II. Вынік: k значэнняў аргумента і адпаведных ім значэнняў функцыі. III. Алгарытм рашэння задачы. 1. Увод ліку k. 2.1. Пачатковае значэнне аргумента x = –3. Для атрымання чарговага значэння аргумента трэба да бягучага значэння прыбавіць крок h. 3. Паколькі колькасць пунктаў вядомая, выкарыстаем цыкл for. IV. Апісанне пераменных: k – int, x, y, h – double. |
Прыклад 6.17. V. Праграма:
VI. Тэсціраванне. |
6.6. Вылучэнне лічбаў з ліку
Прыклад 6.18. Дадзены натуральны лік n. Сфарміраваць новы лік, які складаецца з няцотных лічбаў ліку n. Этапы выканання задання I. Зыходныя даныя: n (лік). II. Вынік: s (новы лік) III. Алгарытм рашэння задачы. 1. Увод зыходных даных — лік n. 4.1. Знайсці астачу от дзялення бягучага ліку на 10 (z — бягучая лічба ліку). 5. Вывад значэння пераменнай s. Каліs = 0, то ў ліку няма няцотных лічбаў. IV. Апісанне пераменных: n, s, r, z – int. |
Прыклад 6.18. V. Праграма:
VI. Тэсціраванне. |
6.7. Прасцейшае мадэліраванне
Прыклад 6.19. Рэзервуар напоўнены m літрамі воднага раствору, які змяшчае s кг цукру. Кожную мінуту забіраюць x літраў раствору і дабаўляюць y літраў вады. Канцэнтрацыя падтрымліваецца раўнамернай пры дапамозе памешвання. Колькі цукру будзе ў растворы праз k мінут? Этапы выканання задання I. Зыходныя даныя: числа m, s, x, k. II. Вынік: s (новае значэнне) III. Алгарытм рашэння задачы. 1. Увод зыходных даных. 3.1. Памяншаем колькасць раствору на x. 4. Вывад значэння пераменнай s. Калі колькасць раствору меншая або роўная нулю, то выводзім паведамленне «цукру не засталося», інакш выводзім колькасць цукру, якая засталася. IV. Апісанне пераменных: n, s, r, z — int. |
Прыклад 6.19. V. Праграма:
VI. Тэсціраванне. |
Практыкаванні
1. Напішыце праграму для вылічэння першых n элементаў паслядоўнасці Фібаначы.
1. Для якога максімальнага значэння n праграма выдае карэктны адказ?
2. Змяніце праграму так, каб яна выводзіла значэнне ліку Фібаначы па ўведзеным нумары.
3. Замяніце ў праграме тып int на тып long long. Якое максімальнае значэнне n можна ўвесці зараз?
2. Напішыце праграму, якая будзе выводзіць на экран элементы паслядоўнасці трыбаначы — першыя элементы паслядоўнасці: 0, 0, 1, 1, 2, 4, 7, 13, 24, 44, 81, 149… . Кожны элемент, пачынаючы з чацвёртага, роўны суме трох папярэдніх: an = an – 1 + an – 2 + an – 3.
1. Па зададзеным n вывесці элемент паслядоўнасці.
2. Для зададзенага x вывесці элементы паслядоўнасці, меншыя x.
3. Напішыце праграму, якая знойдзе першы адмоўны элемент паслядоўнасці sin(tgn)n = 1, 2, ... і яго нумар.
4. Выканайце заданні для прыкладу 6.15.
1. Замяніце ў рашэнні задачы цыкл for на цыкл while або do…while.
2. Ваня вырашыў скараціць колькасць радкоў у праграме і запісаў цыкл наступным чынам:
for (int n = 1; n <= m; n++){
double a = n * n * n / (sqrt(n * n * n)- n + 1);
s += a;
}
Чаму для m = 2000 Ваня атрымаў у адказе s = nan?
5. Напішыце праграму, якая знойдзе суму першых m элементаў паслядоўнасці. Лік m уводзіцца. Элементы паслядоўнасці задаюцца формулай.
6. Напісаць праграму для вылічэння сумы, якая мае сваімі складаемымі элементы паслядоўнасці . Вылічэнні выконваць да таго часу, пакуль не знойдзецца складаемае, для якога правільная няроўнасць
. Значэнне eps уводзіцца (0 < eps < 1 ).
7. Напішыце праграму, якая знойдзе здабытак з n сумножнікаў наступнага выгляду. Значэнне n уводзіцца.
8. Выканайце заданне для прыкладу 6.17.
- Замяніце ў рашэнні задачы цыкл for на цыкл while або do…while.
- Атрымайце табліцу значэнняў функцыі на адрэзку [–3; 3]. У якасці ўмовы ў цыкле можна выкарыстоўваць наступнае: x < = 3;
- Дабаўце ў праграму вывад меж вакол табліцы:
9. Напішыце праграму, якая пабудуе табліцы значэнняў для наступных функцый.
10. Праграму з прыкладу 6.18 змянілі. Сфармулюйце задачу, якая рашаецца з дапамогай дадзенай праграмы.
#include<iostream>
using namespace std;
int main()
{
int i, n;
cout << "n = ";
cin >> n;
cout << "i = ";
cin >> i;
int k = 0;
while (n > 0)
{
int z = n % 10; //бягучая лічба
k++;
if (k == i){
cout << "v razrjade " << i;
cout << " stoit zifra "<< z << endl;
}
n /= 10; //памяншэнне ліку ў 10 разоў
}
if (i > k){
cout << "v chisle "<<k<<" cifr, ";
cout << "v razrjade " << i << " net cifr " << endl;
}
else
cout<<"v chisle "<<k<<" cifr";
return 0;
}
11. Дадзены натуральны лік n. Напішыце праграму, якая вызначыць, якіх лічбаў у ліку больш, цотных ці няцотных.
12. Дадзены натуральны лік n. Напішыце праграму, якая выведзе нумары разрадаў, у якіх стаяць лічбы, кратныя 3, ці паведамленне, што такіх лічбаў няма.
13. Напішыце праграму, якая выведзе на экран лічбу, што стаіць на сярэдняй пазіцыі ліку, калі лік мае няцотную колькасць лічбаў, ці 2 сярэднія для ліку з цотнай колькасцю лічбаў.
14. Напішыце праграму, якая пасля кожнай лічбы 1 у ліку ўставіць яшчэ адну адзінку. Напрыклад, из 51214 → 5112114.
15. Выканайце заданне для прыкладу 6.19.
1. Для сітуацыі, калі цукар заканчваецца, выведзіце значэнне часу, калі гэта адбылося.
2. Змяніце праграму так, каб задавалася пачатковая і канчатковая колькасць цукру, а разлічваўся час, неабходны для такога змянення канцэнтрацыі.
3. Змяніце праграму так, каб па ўведзеным часе і колькасці цукру ў пачатку і ў канцы працэсу разлічваўся пачатковы аб’ём раствору.