Практическа работа "Изпълнител чертожник. Помощни алгоритми". Помощни алгоритми с аргументи

Практическа работа„Изпълнител чертожник. Използване на помощни алгоритми с аргументи"

Задача А. Помощният алгоритъм, от който се нуждаем (който чертае квадрат с определена дължина), може да бъде записан по следния начин:

алгквадрат( arg нещоа)
рано
. спуснете писалката
. изместване по вектор(0,а)
. изместване по вектор(a,0)
. изместване по вектор(0,-a)
. изместване по вектор(-a,0)
. вдигнете писалката
кон

Запис " алгквадрат( arg нещо a)" означава, че алгоритъмът "квадрат" има един аргумент (arg) "a", който може да бъде произволно реално (реално) число. За да извикате този алгоритъм, трябва да напишете, например, "квадрат (2)" - получаваме квадрат със страна 2 или "квадрат (3)" - получаваме квадрат със страна 3 и т.н. Някаква специфична стойност "a" ще получи само докато програмата работи по време на съответния допълнителен алгоритъм. И навсякъде вместо "а" това число ще бъде заменено от компютъра.

Програмата за рисуване на тази картина може да бъде така:

използвайте чекмедже
алгквадратчета
рано
. преминете към точка(1,1)
. квадрат (2)
. преминете към точка(4,1)
. квадрат (3)
. преминете към точка(8,1)
. квадрат (4)
. преминете към точка(13,1)
. квадрат (5)
. преминете към точка(0,0)
кон
алгквадрат( arg нещоа)
рано
. спуснете писалката
. изместване по вектор(0,а)
. изместване по вектор(a,0)
. изместване по вектор(0,-a)
. изместване по вектор(-a,0)
. вдигнете писалката
кон

Задача Б. Нека научим чертожника на нови команди. Нека една от командите се нарича " ред(arg th x1,y1,x2,y2)» – за начертаване на линия от точка (x1,y1) до точка (x2,y2).

алглиния ( arg нещо x1, y1, x2, y2)
рано
. преминете към точка(x1,y1)
. спуснете писалката
. преминете към точка(x2,y2)
. вдигнете писалката
кон

Задача V. Нека втората команда се нарича " правоъгълник (arg th x1,y1,x2,y2)', за да нарисувате правоъгълник. Точката (x1,y1) е една точка от AC диагонала на правоъгълника, точката (x2,y2) е противоположната. Преди да напишете алгоритъма, трябва да разберете какви са координатите на другите две точки.

Помощният алгоритъм може да изглежда така:

алгправоъгълник( arg нещо x1, y1, x2, y2)
рано
. преминете към точка(x1,y1)
. спуснете писалката
. преминете към точка(x2,y1)
. преминете към точка(x2,y2)
. преминете към точка(x1,y2)
. преминете към точка(x1,y1)
. вдигнете писалката
кон

Задача G. Сега с помощта на тези команди ще нарисуваме къща:


използвайте чекмедже
алгкъща
рано
. правоъгълник (2,1,8,5)
. правоъгълник (3,2,5,4)
. правоъгълник (6,1,7,4)
. ред (1,4,5,8)
. ред (5,8,9,4)
кон
алглиния ( arg нещо x1, y1, x2, y2)
рано
. преминете към точка(x1,y1)
. спуснете писалката
. преминете към точка(x2,y2)
. вдигнете писалката
кон
алгправоъгълник( arg нещо x1, y1, x2, y2)
рано
. преминете към точка(x1,y1)
. спуснете писалката
. преминете към точка(x2,y1)
. преминете към точка(x2,y2)
. преминете към точка(x1,y2)
. преминете към точка(x1,y1)
. вдигнете писалката
кон

Забележка: разбира се, заедно с тези команди, можем да използваме стандартните команди на чертожника (преместване в точка, преместване на вектор ...).

Задача D. Начертайте сами какво ще нарисува чекмеджето, като изпълните алгоритъма:

използвайте чекмедже
алгспирала
рано
. преминете към точка(3,3)
. спуснете писалката
. намотка(1); намотка(3); намотка(5); намотка(7); намотка (9)
. вдигнете писалката
кон
алгнамотка( arg нещоа)
рано
. изместване по вектор(а, 0)
. изместване по вектор(0, -a)
. изместване по вектор(-a-1.0)
. изместване по вектор(0, а+1)
кон.

Количества на алгоритмичен език. Команди за въвеждане/извеждане на информация. команда за присвояване. Помощни алгоритми. Алгоритми с резултати и алгоритми-функции

Срок величина, който се използва в алгоритмичния език, е въведен от Андрей Петрович Ершов, заимствайки го от математиката и физиката, вярвайки, че ще бъде по-лесно за разбиране от учениците. В производствените езици за програмиране терминът е често използван променлива, който все повече се заменя с термина предмет. В същото време в обектно-ориентираното програмиране говорят предмети състояниеобект. Вместо това използваме термините величинаи смисълколичества.

Тук е уместно да се отбележи, че много понятия от различни езици за програмиране са синоними и използването на една или друга терминология често се дължи на навика на учител или разработчик на език за програмиране, а не на нуждите от именуване нови концепции. В хода на училищната информатика умишлено „не изпреварваме локомотива”, опитвайки се да избегнем въвеждането на нови понятия и същности до момента, в който вече не може да се прави без него.

Отклонение относно уместността на формализирането. Не са необходими математизиране и формализиране, ако същността на въпроса може да се обясни „на пръсти“, използвайки ежедневния речник. Ето откъс от учебник по теория на езика за програмиране, който обяснява разликата между „поддуми“ и „подпоследователности“ на дума:

Определение 1.2.19. Позволявам . След това чрез Suf( Л) обозначава множеството, състоящо се от всички суфикси на думите на езика Л:

Комплектът Suf( Л) е наречен много наставкиезик Л.

номер на вестник

Лекция 1. Основни цели на курса. Методология за изграждане на курс. Проблемен подход. Теорията се учи чрез практика. Системата KuMir е ефективна подкрепа за традиционните концепции на процедурните езици за програмиране и традиционните методи за отстраняване на грешки. Примери за използване на „КуМир“ в предпрофесионални курсове.

Лекция 2. Практическо запознаване със системата „КуМир”: Робот изпълнител. Концепцията за алгоритъм. Управление на робот-изпълнител с помощта на дистанционното управление. Линейни алгоритми. Записване на алгоритъма. Отклонение: Карел-Робот в началния курс по програмиране в Станфордския университет.

Лекция 3. Методи за “визуално” записване на алгоритъма. Софтуерно управление на робота. цикъл " нведнъж". Използване на помощни алгоритми. Писане на алгоритми на алгоритмичен език.

Контролна работа номер 1.

Лекция 4. Аритметични изрази и правила за тяхното записване. Алгоритми с „обратна връзка“. команда "чао". Условия на алгоритмичен език. Команди "ако" и "избор". Контролни команди. „Визуално“ представяне на командите. Отклонение: правила и форма на писане на аритметични изрази във Fortran на 21-ви век.

Лекция 5. Величини в алгоритмичния език. Команди за въвеждане/извеждане на информация. команда за присвояване. Помощни алгоритми. Алгоритми с резултати и алгоритми-функции. Цикълът "за". Стойности в таблицата. Логически, символични и буквални стойности.

Лекция 6. Методи на алгоритмизация. Повтарящи се отношения. метод на итерация. инвариант на цикъла. Рекурсия.

Контролна работа номер 2.

Лекция 7. Физически основи на съвременните компютри. Микропроцесорът е сърцето на съвременния компютър. Как да изградим компютър.

Лекция 8. Виртуални и реални изпълнители в системата КуМир. Изпълнител чертожник. Lego-Robot е програмно управляван изпълнител на "КуМир". Хипертекстове в системата КуМир. Изготвяне на задачи за студенти и тяхната автоматична проверка.

Финална работа.

Определение 1.2.20. Те казват думата х - поддума(подниз) думи г, ако г = uxvза някои, може би празни думи uи v.

Определение 1.2.21. Позволявам . След това през Subw( Л) обозначава множеството, състоящо се от всички поддуми на думите на езика Л. Наборът Subw( Л) е наречен много поддумиезик Л.

Определение 1.2.22. дума а 1 а 2 …a n(дължина н i 0) се нарича подпоследователност(подпоследователност) думи г, ако има такива, евентуално празни думи u 0 , u 1 , …, u n, Какво u 0 а 1 u 1 а 2 …монахиня = г.

Определение 1.2.23. Всички поддуми на думата гсъщо са подпоследователности на думата г.

Определение 1.2.24. Позволявам . След това чрез Subseq( Л) обозначава множеството, състоящо се от всички подпоследователности от думи на езика Л. Задайте подпоследствие( Л) е наречен набор от подпоследователностиезик Л.

Такова представяне е необходимо за бъдещи автори на компилатори на езици за програмиране, които трябва да овладеят стотици понятия от математическата теория на формалните езици. Ако трябва да обясните само няколко понятия, тогава е по-полезно да правите без никаква математическа нотация, като анализирате същността на въпроса с примери:

се наричат ​​думите "пара", "канавка" и "количка". поддумидумите „двигател” се състоят от последователни букви на думата „двигател”;

думата "пик" поддумадумата „двигател“ не е, тя не може да бъде получена от последователни букви на думата „двигател“, но можете да я получите, последователно, отляво надясно, като избирате букви от думата „двигател“: вземаме първата буква „ p”, пропускаме следващите 6 букви и последните две вземаме буквите „ik”;

кажете, че думата "пик" е подпоследователностдумите "влак";

в думата „обозначение“ има една поддума на руския език и няколко подпоследователности;

всичко поддумина дадена дума също са подпоследователности на тази дума, така че думите "пара", "канавка" и "воз" са не само поддуми, но също подпоследователностидумата "влак".

Така че, следвайки академик Ершов, ние не използваме приетите термини в програмирането променливаили предмет, и ние въвеждаме термина стойност.

Както винаги в нашия курс, се използва проблематичен подход за въвеждане на нова концепция. Тоест всичко започва с формулирането на проблема, за чието решение са ни необходими количества. Да я донесем.

Роботът е разположен близо до хоризонтална стена с неизвестни размери, разстоянието от робота до ръбовете на стената е неизвестно, необходимо е да преместите робота „през стената“ една клетка надолу. Тъй като Роботът не може да минава през стени, т.е. не можете просто да командвате „надолу“, тогава трябва да принудите робота да заобиколи тази стена по някакъв начин.

Както винаги, основната методологична техника в началото е противопоставянето на схемата за програмно управление на схемата за директно управление на робота „ръчно“. Ако предложите да решите проблема с помощта на дистанционното управление и без да виждате полето Робот, учениците бързо ще разберат, че трябва да отидат до един от ръбовете на стената, например вдясно, като питат през цялото време „ стената отдолу ли е?" и преброяване на броя направени стъпки. И когато стената свърши, командвайте „надолу“ и направете толкова крачки „вляво“, колкото стъпките „надясно“ са били направени преди.

С директен контрол учениците запомнят броя на стъпките, направени „вдясно“ „в ума си“ или го записват на хартия. Ако сега преминем от директно управление на робота към писане на алгоритъм, ще е необходимо по някакъв начин да запишем в алгоритъма, че когато управлява робота, компютърът (като ученик) трябва да запомни броя на командите, изпълнявани от робота „до дясно“ и използвайте тази информация, когато се връщате обратно наляво.

Ако задачата за директен контрол се решава в диалог между учителя и класа, тогава е удобно учителят да начертае малък правоъгълник на черната дъска с тебешир и като се получават командите „вдясно“ заедно с учениците, въведете броя на стъпките, направени от робота в този правоъгълник: преди да започнат, те въведоха „0“. Те направиха първата стъпка вдясно – изтриха „0“ и въведоха „1“ в правоъгълника на дъската, направиха още една стъпка – изтриха „1“ и написаха „2“ и т.н. Над правоъгълника учителят може без обяснение да напише името на правоъгълника във формуляра цялаХ .

Какво направихме с правоъгълника в процеса на ръчно управление:

· начертайте правоъгълник и неговото име на дъската;

· записва информацията в правоъгълник, изтривайки старата информация;

четене на информация от правоъгълник.

Същите операции ще трябва да се извършват при управлението на робота и компютъра, като в програмата трябва по някакъв начин да запишем тези операции.

Вместо "правоъгълник" ще кажем "стойност". Начертаването на правоъгълник и неговото име на дъската съответства на командата за описание на името на стойността (и нейния тип).

Записване на информация в правоъгълник с изтриване стара информациясъответства на специална команда - командата за присвояване (:=); информацията за четене съответства на използването на името на стойността в изразите.

Стойността има няколко характеристики. Най-важното от тях е името. Имената на стойностите в един алгоритъм трябва да са различни, както се казва, името трябва да е уникално за този алгоритъм.

Отстъпление. Уникалността на името на човек. Уникални ли са имената, които използваме в ежедневието? За съжаление не. В клас може да има два Дени и три Даши и двама Вова в едно семейство. Хората се борят с това, като добавят към името Допълнителна информация: прякор, фамилия, бащино име, дата и място на раждане. В класа правят разлика между Денис Иванов и Денис Петров, в семейство Сидорови правят разлика между Вова големия и Вова малкия. Това обаче не дава 100% гаранция за уникалност. И така, през 90-те години в Австралия се срещнаха две дами, които са родени в един и същи ден и имаха едно и също фамилно и собствено име. Те се запознали, когато на една от дамите изпратили фиш за нарушения при паркиране, който тя не е нарушила. Тогава се оказа, че името, фамилията и датата на раждане не могат еднозначно да идентифицират човек. За да изясните, трябва да добавите адреса и още много различни характеристики, които заедно образуват уникалното име на конкретно лице (име с Главна буква). Проблемът с уникалността е древен. Всички знаят името на известния древногръцки философ Талес от Милет, тоест Талес от Милет, града, в който е живял. Още по-известен е Исус от Назарет. Четейки Стария Завет, се натъкваме на дълги родословия на мъжка линия: в библейски времена такова родословие е било уникалното име на човек.

Името се случва със стойности, таблици, алгоритми и изпълнители. Името е поредица от думи, разделени с интервали. Първата дума на името не трябва да започва с число. Нито една от думите не трябва да е ключова дума.

Думата е поредица от разрешени (речникови) знаци:

· букви (кирилица и латиница, главни и малки);

· числа;

· два специални знака: "@", "_"

Примери за имена: m, времето за утре, 7 ноември, 7 ноември, къща_57b.

Примери за неправилни имена:

· алфа-бета (“-” е невалиден знак);

алфа илиомега ( или - ключова дума).

Ключовите думи на езика KuMir са: alg начало крайна употреба крайна употреба дадена нужда arg cut argrez стойност int ve log sim lit tab celtab vehtab logtab symtab littab и или не да не да изход вход изход ns ако в противен случай целият избор в nc ccc cc_at време докато за от до стъпка true false

Забележка. Ключова дума не може да се вмъкне в логически имена с няколко думи.

пример:

log l, утре е четвъртък

л:= неУтре е четвъртък | Точно, но не

л:= утре неще бъде четвъртък | Точно така,

л: = утре ще бъде нечетвъртък | Точно така

л: = утре е четвъртък не| Грешно

л:= неутре неще бъде четвъртък | Грешно

Стойностите в алгоритмичен език се различават не само по име, но и по мястото, на което „живеят“: стойностите от различни алгоритми могат да имат едно и също име. Когато x-стойността се използва в алгоритъма Walk the Wall, човек може да си представи това пълно иметази стойност звучи така
„x от разходка около стената“: в друг алгоритъм е възможно да се използва същото име x за напълно различна стойност.

Втората важна характеристика на едно количество е неговата тип.

В алгоритмичния език има 5 вида величини: числови типове цялаи нещо, текстови типове лити Сими булев тип дневник. Познавайки вида, можете да кажете много за величината. Първо, какви стойности може да приеме. И така, цяло число ( цяла) може да съхранява цяло число, но не може да съхранява реални стойности, а за реални стойности има отделен тип (нещо). Текстова стойност може да съхранява поредица от знаци, включително празен, булева стойност съхранява една от двете стойности Не точно.

Типът също така ви казва какви операции са разрешени върху стойността.

Операциите за сравнение са приложими за стойности на числови и текстови типове; аритметичните операции и изчисляването на различни функции са приложими за стойности от числови типове. Логическите операции са приложими за стойности от булев тип и ,или,не.

Особено внимание заслужава операцията, обозначена с „ + ” . Може да се приложи към числови типове и в тази ситуация означава добавяне. Може да се приложи и към текстови типове и означава „залепване“ на два низа или знака заедно:

Операциите за сравнение са приложими за стойности на числови и текстови типове. Така че с реални (и целочислени) стойности са разрешени аритметични операции и операции за сравнение. За буквени знаци са разрешени операции за сравнение и т.н.

Типове стойности

Алгоритмичните езикови количества са разделени на няколко типа:

· цяла - приема целочислени стойности от -2 147 483 647 до 2 147 483 647;

· нещо - приема реални стойности между тях? 2 1023 и 2 1023;

· дневник - приема стойности да или не;

· Сим - стойността може да бъде буквален знак;

· лит - стойността може да бъде низ от буквални знаци.

Видове цялаи нещо се наричат ​​числови; видове Сими лит- текст.

Всяка стойност трябва да има описание, например:

дължина, ширина на артикула

светна моя текст

Друга количествена характеристика е изгледстойности: аргумент, резултат, междинна стойност на алгоритъма, обща стойност на изпълнителя. Типът на стойността показва нейната информационна роля в алгоритъма. Например, аргументите съдържат първоначалната информация, необходима за работата на алгоритъма, а междинните стойности са предназначени да съхраняват текущата информация, която алгоритъмът обработва. По време на изпълнението на алгоритъма във всеки конкретен момент стойността или има някаква стойност, или не е дефинирана.

Името, видът и типът на стойността могат да се определят недвусмислено от текста на алгоритъма.

Това са статични характеристики на количеството. Студентите винаги могат да ги намерят в програмата. Обратно, стойността на дадено количество се определя само по време на изпълнение. Можем да кажем, че това е динамична характеристика.

Имайки под ръка такъв инструмент като количества, можете да използвате компютър - електронен КомпютърниМашина - не за управление на различни устройства, а за нейното "предназначение" - за изчисление. Нека започнем с едно сравнително просто изчисление - намиране на сумата С първо н нечетни числа:

S = 1 + 3 + 5 + 7 + ... + 2N–1

В това количество нчисла и ако ги номерирате от 1 до н, след това числото с номер ище бъде равно на 2 и–1.

Изчислителната програма, която ще напишем, трябва, както всяка друга програма, да получи първоначалната информация от някъде и да „изпрати” някъде резултата от изчислението. Ще направим диалогова програма. Той ще получи първоначална информация от човек, който напише на клавиатурата необходимия брой членове на сумата Н.Нашата програма също ще „докладва“ резултата на лицето, като показва стойността на изчислената сума на екрана С. За да съхраняваме информация в процеса на изчисление, ще използваме две цели числа - ни С. За да съхраним числото на следващия сбор, ще използваме целочислена стойност и. За въвеждане и извеждане на информация ще използваме командите входи заключение, и за да повторим условията на сумата, ще използваме цикъла чао. Програмата ще изглежда така:

Екипите са нови тук входи заключениеизползвайки третия прозорец - I/O прозорецсистема "КуМир". Досега всъщност използвахме само два прозореца от три в системата KuMir. Третият прозорец показва съобщения като „изпълнението е започнало“ и „изпълнението е завършено“, а понякога и съобщения за грешки. Сега този прозорец ще се използва „по предназначение“ - за въвеждане и извеждане на стойности. Как би се случило това?

При изпълнение на командата вход нКомпютърът ще покаже мигащ курсор в изходния прозорец, подканяйки ученика да въведе число от клавиатурата. Ако ученикът напише число на клавиатурата, например числото 3, и завърши въвеждането с натискане на клавиша, тогава компютърът ще извърши точно същите действия, както при изпълнение на командата за присвояване н := 3 . Тоест числото 3 ще стане стойността на количеството н(ще бъде записано вътре в „правоъгълника“ на стойността н).

За разлика от BASIC и Pascal, новото извикване на команда заключениев училищния алгоритмичен език, сам по себе си не води до нов ред в I / O прозореца. Ако искаме да кажем на компютъра, че следващата част от информация трябва да бъде изведена от нов ред, тогава трябва изрично да напишем думата ns(съкратено от „нов ред“) в команда заключение . Направихме точно това в програмата. Ако ние сме думатаnsне пишете, тогава не се извършва имплицитен преход към нов ред и различни извиквания към командата заключениеще показва информация една след друга на един ред. Въвеждането на информация обикновено завършва с натискане на клавиш , т.е. преминете към нов ред. Следователно, обикновено при преплитане на изходна команда с входни команди, като правило, неnsняма нужда да пишете. Ако искаме, както в програмата "Sum", да показваме информация на два реда, тогава трябва да напишем командите на правилното място заключениедума ns .

Нека изпълним програмата "Sum" в непрекъснат режим. В началото на изпълнението в I/O прозореца ще се покаже ред с информация за началото на изпълнението. Освен това при изпълнение на реда

ранна цел N, S, т.е

в паметта на алгоритъма "Sum" се отделя място за съхранение на целочислени стойности н , С , и Отначало тези три количества не са дефинирани (в техните „правоъгълници“ не са вписани стойности). Стойност н ще получи желаната стойностпри изпълнение на командата

вход н

Виждайки мигащ курсор вътре в I / O прозореца и съобщението „Очакван вход: цяло число“ в долната част на прозореца, потребителят въвежда цяло число, натиска клавиша и стойността на стойността н става равно на това число. Имайте предвид, че този номер няма да се промени по време на по-нататъшното изпълнение на програмата. След въвеждане на число н програмата подготвя за сумиране: стойността С се присвоява първоначалната стойност на сумата, тоест 0, и стойносттаи присвоява се номерът на първия член на сумата, тоест 1. След това цикълът “while” ще започне да се изпълнява. В процеса на изпълнение на цикъла, стойноститеС и и ще се промени в концерт: след к циклични изпълнения С ще бъде равен на сбора от първия к сумируеми числа ии ще бъде равно на числото на следващото, все още не сумирано число, т.ек + 1 . Цикълът ще приключи, когато и става равен н + 1 . След като цикълът приключи, командата ще бъде изпълнена

изход "Сбор от първия", н, "

нечетни числа ", ns, "е равно на", С

Тази команда предоставя изхода на няколко части информация:

1) низ "Сбор от първи"

2) стойността на цяло число н

3) низ "нечетни числа"

4) инструкция за подаване на линия ns

5) низ "равен"

6) стойността на цяло число С

Защото в отбора заключениесрещна думата ns, продукцията ще се произвежда в два реда.

Последният ред, който трябва да бъде изпълнен, ще бъде кон. Когато този ред се изпълни, в I/O прозореца ще се покаже съобщение за завършване на изпълнението на програмата и хоризонтална лента.

Отстъпление. За експериментална проверка на математическите теореми. Стартирайте програмата Sum няколко пъти, давайки броя на членовете 4, 5, 6 и 10. Програмата ще ни даде отговори 16, 25, 36 и 100.

Изглежда, че сумата от първата н нечетните числа винаги са равни N 2 ! Тази математическа хипотеза наистина е вярна, формулата

1 + 3 + 5 + 7 + ... + 2Н- 1 =н 2

може да бъде строго доказано математически, но ако не успеем, бихме могли да продължим да изследваме хипотезата експериментално, да напишем програма, която изчислява сумите на първите 7, 8, 9, 10, 11, ..., 99, 100 нечетни числа и проверява дали такава сума винаги е равна на квадрата на броя на сумираните числа. Ето как математиците използват компютъра за експериментално тестване на недоказани теореми. Край на отстъплението.

Едно от най-известните изчисления, често срещани в гимназията, е изчисляването на корените на квадратно уравнение. Такова изчисление е в състояние да извърши значителна част от завършилите гимназияРусия, което ги отличава от чуждестранните им връстници. Освен това всеки ученик, който се е научил да изчислява корените на квадратно уравнение, може да обясни на друг ученик как да извърши такова изчисление. Това означава, че този алгоритъм няма да е трудно да се „обясни“ на компютър.

Така, дадено квадратно уравнениемил брадва 2 + bx+ ° С= 0
С нещоестествени (реални) коефициенти а,б,° С.

Какво необходимоправя?

Казвате, че трябва да намерите истинските корени на уравнението х 1 и х 2. Този отговор като цяло е правилен, но не е пълен. Трябва да се изясни, тъй като квадратното уравнение може да няма корени, а за някои стойности на коефициентите а,б,° СЕдно уравнение може да има един корен, а не два. Реакцията на компютъра в тези случаи също трябва да бъде предвидена в алгоритъма. Така че, по-подробно, задачата за компилиране на алгоритъма изглежда така:

Дадени реални числа а,б,° С, и ане е равно на нула.

Трябва да се намери номер нреалните корени на това уравнение и самите корени (в случая н= 2 намерете х 1 и х 2 , а в случай н= 1 находка х 1 .

Вече започнахме да се ровим в математически детайли, без да решаваме въпроса как нашият алгоритъм ще получи първоначалната информация и къде ще бъде „изпратен“ резултатът. Този път ще съставим алгоритъм, който в началото и в края на изпълнението му ще бъде готов да „общува” не с човек, а с всеки друг алгоритъм, като получава първоначална информация (аргументи) от него и връща резултати.

За нашия алгоритъм ние избираме кратко имеkvoor- квадратно уравнение. Аргументи на алгоритъмаkvoor ще бъдат реални числаа , б,° С.Резултати от алгоритъма kvoorще бъде едно цяло число ни две реални числа x1и x2.Първият ред на алгоритъма ще изглежда така:

alg quur(arg ref a, b, c, int res n, ref x1, x2)

Правилата на алгоритмичния език позволяват след заглавието на алгоритъма да се пише в командата даденоусловия, на които трябва да отговарят аргументите, и в командата необходимоусловия, на които трябва да отговарят резултатите от алгоритъма. Тези условия могат да бъдат написани или формално, под формата на логически изрази, а след това компютърът ще ги провери, или неформално, под формата на коментари за човек. В алгоритъма kvoorизползваме и двата подхода:

alg quur (arg wt a, b, c, res int n,

дадено а<>0 |a, b, c – коефициенти

трябва 0<= n <= 2 |при n = 2, x1 и x2

| корени на уравнението, за n = 1, x1

| единственият корен на уравнението,

| за n = 0, уравнението няма корени

Как да се реши такъв проблем? Първо трябва да изчислите дискриминанта ( д) по формулата D = b 2 – 4ac.Ако д< 0, тогава уравнението няма корени, с д = 0 - коренът е един (понякога казват, че корените съвпадат). Кога д> 0 - два корена. В този случай корените се намират по формулата:

номер д не е аргумент на нашия алгоритъм, не е включен в условието на задачата; не ед и резултата, тъй като в условието на задачата се изисква да се намери броят на корените и самите корени, но не и дискриминанта; д е междинен резултат от нашето изчисление и за съхраняване на това число ще опишем в алгоритъмаkvoor реална междинна стойност нещо Д. Междинните стойности на алгоритъма обикновено са описани в реда рано или веднага след него:

alg quur (arg wt а, б, в,нарязани непокътнати н,

нещо x1, x2)

дадено а<> 0 |а, б, в- коефициенти

| уравнение a * x * x + b * x + c = 0

трябва 0<= н<= 2

| кога н= 2, корените на уравнението равни x1и x2;

| кога н= 1, единственият корен е x1;

| кога н= 0, уравнението няма корени;

започват нещата д; д:= б* б– 4 * a*c

Спомняйки си как изразите се записват на алгоритмичен език, получаваме следната програма:

Вход изход

Формат на обаждането заключение :

заключение израз 1, . . . , изразN

Всеки израз може да бъде или аритметичен, логически или текстов израз, или команда за нов ред (ключова дума ns). Стойностите на изразите се извеждат последователно в реда на I/O зоната и са разделени с интервал. Когато редът е пълен, той автоматично прескача в началото на нов ред. Когато I/O прозорецът е пълен, следващите изходни команди ще избутат съдържанието на прозореца нагоре, изтривайки горните редове на прозореца.

Формат на обаждането вход :

въведете име1, . . . , име N

При изпълнение на тази команда “KuMir” поставя курсора в I/O прозореца и изчаква потребителят да въведе съответните стойности. Когато приключите, въведените стойности се присвояват на посочените стойности. Като име на стойност можете да посочите името на проста стойност или името на елемент от таблица със стойности на индекса. Знак за края на въвеждането е натискането на клавиша . При въвеждане на множество числа те се отделят едно от друго със запетая или интервал.

Файлове на изпълнители

По принцип простите алгоритми могат да се справят без входно-изходни команди. Въвеждането на стойности на количества може успешно да бъде заменено с команди за присвояване, а изходът на резултатите от алгоритъма може да се наблюдава в полетата:

В полетата виждаме последната стойност на количеството С, равно на 10 000. Тази стойност е резултат от изчислението.

Но в някои случаи, когато искаме напълно да автоматизираме решаването на някаква задача, да я поверим на компютър, да разгледаме съдържанието на полета или прозорци за вход-изход или да натискаме клавиши за въвеждане на числа, просто няма кой , тъй като просто искаме напълно да изключим човек от процеса на изчисление, извършван от компютъра. Разбира се, вместо да въвеждате една или две първоначални стойности на количества, можете да въведете команди за присвояване в програмата, но това няма да бъде универсална програма, която работи за всякакви стойности на параметри, а специализирана, да речем, изчисляване на сумата от първия нсамо нечетни числа н= 100. Ясно е, че нямаме нужда от такива програми. Друго нещо е, ако във входната команда би било възможно да се получат стойностите на количествата, като се изискват от някакъв изпълнител, а не от човек. За да разрешите такъв проблем, имате нужда от изпълнителни файлове. Файлът е позната концепция за ученик и няма да ви се налага да прекарвате много време в измислянето на методология за въвеждане на концепцията за „файл“. Ще трябва да отделите малко време за характеристиките на изпълнителя на Files в KuMir.

Традиционно използваме последователендостъп до файла. Нека има файл, съдържащ три реални числа а, б, ° С, коефициентите на квадратното уравнение. При последователен достъп няма да можем да четем от файла ббез да чета аи да стигнем до С, първо трябва да прочетете аи б.Същото важи и за запис във файл. Стойностите на количествата се извеждат във файла в реда, в който са изброени в изходната команда и в реда, в който се появяват извикванията на изходната команда. Изпълнителят на файлове може да работи с всеки файл в един от двата режима: в режим на четене или в режим на запис. Работата с файл в режим на четене започва с командата отворен за четене; работата с файл в режим на запис започва с командатаотворен за писане.Файлът трябва да съществува, когато се извика някоя от тези две команди. Няма смисъл да създаваме файла, който ще четем, той ще бъде празен. Но има смисъл да създадете празен файл, преди да запишете информация в него и това може да стане с командата create.

Подобно на стойностите в алгоритмичен език, файловете също трябва да бъдат наречени по някакъв начин. Принципите на именуване на файлове са малко по-различни в зависимост от операционната система, на която работи KuMir (MS Windows, MacOS, Linix и др.). Името на файла е необходимо само за команди за отваряне и създаване на файлове. Командата за отваряне (независимо дали четене или запис) връща цяло число, като я присвоява на стойност, която наричаме Ключ. Всеки отворен файл има свой собствен уникален ключ, свързан с него, а I/O командите използват ключа, получен при отваряне на файла, а не името на файла. За да се разграничат командите за четене/запис на файлове от обикновените I/O команди, имената им започват с буква е(виж таблицата).

Файлове на изпълнители

Командната система за изпълнител на файлове включва:

· 5 команди-поръчки (създаване/затваряне на файл, отваряне за четене/запис, започване на повторно четене);

· 2 команди за проверка на условията (съществуване на файла и достигане до края на файла);

· 2 I/O оператора.

· създайте файл ( arg litИме на файл)

Създава нов празен файл в текущата I/O директория.

· отворен за четене ( arg litИме на файл, нарязани непокътнатиключ)

Отваря файл за четене и му присвоява идентификатор.

· отворен за писане ( arg litИме на файл, нарязани непокътнатиключ)

Отваря файл за запис и му присвоява идентификатор.

· започнете да четете ( arg цяло числоключ)

Започва да чете елементите на файл отначало

· f_input Ключ, . . .

Оператор. Въвеждане на данни от файл с идентификационен ключ.

f_output Ключ, . . .

Оператор. Извеждане на данни във файл с идентификационен ключ.

· дневниккрай на файла ( arg цяло числоключ)

Проверява дали краят на файла е достигнат.

· близо ( arg цяло числоключ)

Затваря файл, след като е бил отворен за четене или запис.

· дневникфайлът съществува ( arg litИме на файл)

Проверява дали файл съществува в текущата I/O директория.

В края на работата с файла му казваме „сбогом“ с командата близо.Аргументът на тази команда отново ще бъде стойността на стойността Key .

Важно е да се отбележи, че не можете да четете и пишете в един и същ файл по едно и също време. Следват промени в алгоритъма quur, които позволяват четене на коефициенти от четим файл с ключа и запис на резултатите във файл с възможност за запис с изходния ключ. Ще наречем този алгоритъм f_quur . Има и програма за тестване, която чете коефициентите на квадратното уравнение от файла “tR.txt” и записва резултата във файл с име “tW.txt” и ако файл с това име не съществува, след това се създава.

В последния пример за файл имаме нова команда от изпълнителя на файлове:

отворен за четене ( арг литИме на файл,

разрез цялаключ)

В същото време това не е просто нов Екип на нов изпълнител. За нас това е нов стил в работа със спомагателните алгоритми. Тук ние не само предаваме аргумент на алгоритъма (който е името на файла ) или просто получете резултата - обратна връзка от изпълнителя. Тук и двете от тези явления са комбинирани в едно обаждане. В същото време, независимо дали говорим за командите на изпълнителя (например Files) или за спомагателния алгоритъм, написан от нас, механизмът на взаимодействие остава непроменен. Ако по-рано, използвайки аргументи, предавахме информация от основния алгоритъм към спомагателния, сега, използвайки резултатите, можем да прехвърлим информация от допълнителния алгоритъм към основния алгоритъм.

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

Когато се извика допълнителен алгоритъм, се случва следното тайнство: спомагателният алгоритъм започва да „живее“, разпределя място в паметта си за параметри (било то аргументи или резултати), след това стойностите на аргументите, които са били предадени на той от основния алгоритъм при извикване се копира в тези, създадени в количествата на спомагателния алгоритъм. Следва изпълнението на самия спомагателен алгоритъм. Преди приключване, резултатите от допълнителния алгоритъм се копират в стойностите, посочени в повикването. И тогава спомагателният алгоритъм престава да съществува, премахва се от паметта на компютъра заедно с всички негови стойности.

По този начин, ако трябва да предадем стойности от основния алгоритъм към спомагателния, тогава използваме аргументи, ако от спомагателния към основния -
след това резултатите. С помощта на аргументи и резултати можем да организираме всякакъв обмен на информация между главния и спомагателния алгоритми.

В същото време е желателно учениците не само да овладеят концепцията за спомагателен алгоритъм с резултати, но и да се научат самостоятелно да идентифицират тези помощни алгоритми в задачите, да представят своите аргументи и резултати и накратко да ги описват в даденои необходимо предназначение и условия на работа на алгоритъма.

Сега нека преминем към друг вид помощни алгоритми - алгоритъм-функция.В горните примери - както при намирането на дължината на хипотенузата, така и при решаването на квадратното уравнение - е използвана математическата функция, вградена в KuMir sqrt. Както вероятно се досещате (или знаехте), тази функция изчислява квадратния корен на посочения аргумент, например, sqrt(1.21) . Може да се предположи, че има цял клас помощни алгоритми, вградени в KuMir, които са подредени по подобен начин. И това е истинската истина.

Командите за обратна връзка на изпълнителите са подредени по същия начин, например командата „top free“ на робота. Формата на писане на такива помощни алгоритми-функции е малко по-различна от спомагателните алгоритми с резултати.

Ето как изглежда модифицираният алгоритъм за изчисляване на хипотенузата по два крака, използвайки допълнителен алгоритъм-функция:

Алгоритми-процедури и алгоритми-функции

Функцията-алгоритъм след изпълнение връща стойност-резултат. Правилата за описание на алгоритми-процедури и алгоритми-функции имат две разлики.

Първо, за функционални алгоритми на място, algorithm_type трябва да се посочи един от простите алгоритмични езикови типове (нещо , цяла и т.н.), който определя типа стойности, които тази функция приема. За алгоритми на процедурататип_алгоритъм трябва да се пропусне.

Второ, в тялото на функцията на алгоритъма е необходимо да се използва стойността на услугата стойност , в който е записана изчислената стойност на функцията. В тялото на алгоритъма-процедура, стойносттастойност не може да бъде използван.

Алгоритмите-функции и алгоритмите-процедури също се различават по начина, по който се извикват.

Всеки алгоритъм, който използва алгоритъм за спомагателна функция, винаги може да бъде написан без функционални алгоритми, като ги замените със спомагателни алгоритми с резултати (това може да се види от предишния пример, но ние направихме обратното). Вместо команда за присвояване а:= е(х), където е- функция-алгоритъм, можете да напишете обаждане Ф(х,а), където хе аргумент и а- резултат.

Разбира се, функциите са по-удобни в някои случаи. Ако сравним два алгоритма за изчисляване на хипотенузата по катета, можем да отбележим, че в основния алгоритъм, когато се използват помощни алгоритми-функции, „допълнителната“ стойност изобщо не се изисква С. Алгоритмите-функции са удобни с това, че можем незабавно да ги запишем в израз и по този начин да опростим нотацията. В същото време няма фундаментална същност в функциите на алгоритъма. Това е само специална форма за писане на спомагателен алгоритъм с резултат.

При използване на алгоритми-функции и алгоритми с резултати се случва същото: аргументите се предават от основния алгоритъм към спомагателния, а резултатът се предава обратно. Същността на алгоритмите с резултати и алгоритмите-функции е една и съща. Едва в края на изпълнението на алгоритъма-функция, стойността на количеството стойност се замества в израза, вместо да извиква функцията на алгоритъма. думастойносте съкращение за думите „стойност на функция“ и, подобно на останалата част от терминологията на училищния курс по информатика и алгоритмичния език (алгоритъм, аргумент, резултат, стойност, стойност и т.н.), е въведена от акад. Андрей Петрович Ершов чрез заемане от математиката.

Тук можете да привлечете вниманието на учениците към факта, че тази задача не е еквивалентна на задачата на Шарл Перо, който в една добре позната приказка искаше да се върне у дома с братята си: „... Палецът на крака беше последният да отиде. От време на време вадеше бели камъчета от джоба си и ги хвърляше зад себе си на пътя. Проблемът Thumb-Boy се решава чрез боядисване върху клетките, през които е минал Роботът (първоначално се предполага, че няма боядисани клетки на полето). В този случай не е нужно да помните броя на стъпките. ( Перо Ш.Палец момче. Червената шапчица. Синя брада и др. М .: Издателство "HARVEST LLC".)

2 Не всички алгоритми, които се изучават в училище, са лесни за обяснение на компютър. Опитайте например да напишете алгоритъм за умножение в колона от многоцифрени (максимум 6 цифри) десетични числа, който манипулира само символна информация, за да представи числата от 0 до 9. Това изобщо не е толкова прост алгоритъм, колкото решаването квадратно уравнение.

Важна забележка: трябва да се отбележи, че докато се изпълнява спомагателният алгоритъм, изпълнението на основния е спряно.

За да начертаем два квадрата с различни страни, да речем 2 и 3, трябваше да напишем два различни помощни алгоритма. Но какво, ако трябва да нарисувате много различни квадрати с различни дължини на страните? Не пишете свой собствен алгоритъм за всеки! Оказва се, че алгоритмите могат да имат аргументи, възможно е да се състави алгоритъм за рисуване на квадрат с произволна дължина на страната.

Вече сте срещали понятието аргумент в математиката. В математиката аргументът на функцията е независима променлива, от чиито стойности зависят стойностите на функцията.
Например, функцията f(x) = x 2 +1 има един аргумент. За различни стойности на аргумента ще получим различни стойности на функцията - за x=2 получаваме f(x)=5, за x=3 получаваме f(x)=10 и т.н.

Помощният алгоритъм, от който се нуждаем (който чертае квадрат с определена дължина), може да бъде записан по следния начин:

alg квадрат (arg w)
рано
. спуснете писалката
. изместване по вектор(0,а)
. изместване по вектор(a,0)
. изместване по вектор(0,-a)
. изместване по вектор(-a,0)
. вдигнете писалката
кон

Нотацията „alg square (arg w)“ означава, че алгоритъмът „квадрат“ има един аргумент (arg) „a“, който може да бъде произволно реално (реално) число.
За да извикате този алгоритъм, трябва да напишете, например, "квадрат (2)" - получаваме квадрат със страна 2 или "квадрат (3)" - получаваме квадрат със страна 3 и т.н. .
Някаква специфична стойност "a" ще получи само докато програмата работи по време на съответния допълнителен алгоритъм. И навсякъде вместо "а" това число ще бъде заменено от компютъра.

Програмата за рисуване на тази картина може да бъде така:

използвайте чекмедже
алг квадрати
рано
. преминете към точка(1,1)
. квадрат (2)
. преминете към точка(4,1)
. квадрат (3)
. преминете към точка(8,1)
. квадрат (4)
. преминете към точка(13,1)
. квадрат (5)
. преминете към точка(0,0)
кон
alg квадрат (arg w)
рано
. спуснете писалката
. изместване по вектор(0,а)
. изместване по вектор(a,0)
. изместване по вектор(0,-a)
. изместване по вектор(-a,0)
. вдигнете писалката
кон

Нека научим чертожника на нови команди. Нека една от командите се нарича " ред(arg th x1,y1,x2,y2)» – за начертаване на линия от точка (x1,y1) до точка (x2,y2).


рано
. преминете към точка(x1,y1)
. спуснете писалката
. преминете към точка(x2,y2)
. вдигнете писалката
кон

Нека втората команда се нарича " правоъгълник (arg th x1,y1,x2,y2)', за да нарисувате правоъгълник. Точката (x1,y1) е една точка от AC диагонала на правоъгълника, точката (x2,y2) е противоположната. Преди да напишете алгоритъма, трябва да разберете какви са координатите на другите две точки.

Помощният алгоритъм може да изглежда така:


рано
. преминете към точка(x1,y1)
. спуснете писалката
. преминете към точка(x2,y1)
. преминете към точка(x2,y2)
. преминете към точка(x1,y2)
. преминете към точка(x1,y1)
. вдигнете писалката
кон

Сега с помощта на тези команди ще нарисуваме къща:



използвайте чекмедже
алг къща
рано
. правоъгълник (2,1,8,5)
. правоъгълник (3,2,5,4)
. правоъгълник (6,1,7,4)
. ред (1,4,5,8)
. ред (5,8,9,4)
кон
alg ред(arg th x1, y1, x2, y2)
рано
. преминете към точка(x1,y1)
. спуснете писалката
. преминете към точка(x2,y2)
. вдигнете писалката
кон
alg правоъгълник(arg th x1, y1, x2, y2)
рано
. преминете към точка(x1,y1)
. спуснете писалката
. преминете към точка(x2,y1)
. преминете към точка(x2,y2)
. преминете към точка(x1,y2)
. преминете към точка(x1,y1)
. вдигнете писалката
кон

Забележка: разбира се, заедно с тези команди, можем да използваме стандартните команди на чертожника (преместване в точка, преместване на вектор ...).

Задача 1. Използвайки алгоритмите за помощна линия и правоъгълник, създайте чертеж.

Задача 2. Опитайте се да пренапишете линейните и правоъгълните алгоритми, така че чертането да се извършва от командата за изместване на вектора.

Задача 3. Напишете алгоритъм "правоъгълник (arg w x, y, a, b)", който чертае правоъгълник с дължини на страните a и b, започващ от и завършващ в точката (x, y).

Задача 4. Начертайте сами какво ще нарисува Чертожникът, като изпълните алгоритъма:

използвайте чекмедже
алг спирала
рано
. преминете към точка(3,3)
. спуснете писалката
. намотка(1); намотка(3); намотка(5); намотка(7); намотка (9)
. вдигнете писалката
кон
alg turn(arg w)
рано
. изместване по вектор(а, 0)
. изместване по вектор(0, -a)
. изместване по вектор(-a-1.0)
. изместване по вектор(0, а+1)
кон