НОВОСТИ   БИБЛИОТЕКА   ЮМОР   КАРТА САЙТА   ССЫЛКИ   О САЙТЕ  




предыдущая главасодержаниеследующая глава

Лабораторная работа 6. Подпрограммы и их использование при решении задач

В названии лабораторной работы вы, конечно, заметили новое слово: подпрограммы. И уже, наверно, догадались: оно означает вспомогательные алгоритмы, записанные на языке, понятном ЭВМ.

Вам хорошо известно, что запись программы отличается от записи алгоритма. Точно так же и оформление подпрограмм отличается от оформления вспомогательных алгоритмов. Сравните, например, вспомогательный алгоритм и подпрограмму, предназначенные для поиска максимума из двух чисел:

 Вспомогательный алгоритм 
 Алгоритм "Поиск максимума из двух чисел". 
 Аргументы: х и у. Результат: z. 
 Если х<у, то: 
 Присвоить z значение у. 
 Иначе: 
 Присвоить z значение х. 
 Конец ветвления.
 Подпрограмма 
 20 ПОДПРОГРАММА [X, Y] 
 25 ЕСЛИ X<Y, TO: 
 30 Z = Y 
 35 ИНАЧЕ: 
 40 Z = X 
 45 КОНЕЦ ВЕТВЛЕНИЯ 
 50 КОНЕЦ ПОДПРОГРАММЫ [Z]

Вы видите, что при оформлении подпрограммы ее имя, а также слова "Аргументы" и "Результаты" надо опускать. Буквы, обозначающие аргументы, записываются в квадратных скобках после слова "ПОДПРОГРАММА". Подпрограмма завершается командой "КОНЕЦ ПОДПРОГРАММЫ". После этих слов в квадратных скобках записывают буквы, обозначающие результаты работы подпрограммы (если, конечно, таковые имеются).

А как же вызвать подпрограмму, раз имя ее ВЫЧИСЛИТЕЛЮ не сообщается? Роль имени играет номер первой строки подпрограммы. Поэтому, чтобы вызвать подпрограмму, пишут слова "ВЫПОЛНИТЬ ПОДПРОГРАММУ", после них - не имя, а номер строки, с которой начинается подпрограмма. В квадратных скобках после номера перечисляют выражения, значения которых ЭВМ должна взять в качестве аргументов.

Например, вот как выглядит вызов подпрограммы "Поиск максимума..." при x = a + bc, a y = a/b + c

5 ВЫПОЛНИТЬ ПОДПРОГРАММУ 20 [А + В∗С, А/В + С]

Договоримся еще располагать подпрограммы после основной программы. Так, если последний номер основной программы 33, то подпрограмма должна начинаться с номера большего, чем 33.

Усвоив правила оформления подпрограмм, запишите в виде программы для ЧЕРТЕЖНИКА алгоритм рисования фигуры, изображенной на рисунке 25 (§ 14), и запустите программу, поставив ЧЕРТЕЖНИКА в центр листа.

Теперь поставьте его близко к краю листа. Вы видите, что ЧЕРТЕЖНИК не смог выполнить программу. Почему же это произошло? Может, программа написана неверно? Нет! Все дело в том, что наш алгоритм предназначался для работы на бесконечном листе бумаги, а вы заставили ЧЕРТЕЖНИКА работать на ограниченном листе (бесконечный лист, как вы понимаете, трудно изобразить на экране дисплея). Многие ошибки людей связаны с попытками применить в новых условиях старые методы, алгоритмы, инструкции.

Алгоритм изображения рисунка 25 на ограниченном листе бумаги довольно сложен. Попытайтесь его составить самостоятельно.

Теперь посмотрим, как вспомогательные алгоритмы выполняет ВЫЧИСЛИТЕЛЬ. Как вы помните, в § 14 мы специально приготовили для него задачу о двух лодках.

Задача. Две моторные лодки равномерно двигались по реке в направлении к озеру, в которое река впадает. Поравнявшись, они начали двигаться равноускоренно. Какая из лодок раньше дойдет до озера?

Запишите программу решения этой задачи и запустите ее при подходящих значениях скоростей, ускорений и расстояния до озера.

Зафиксируйте начальные скорости обеих лодок и ускорение первой лодки. С каким наименьшим ускорением должна двигаться вторая лодка, чтобы не отстать от первой? Сделайте так, чтобы ВЫЧИСЛИТЕЛЬ сообщил вам об этом.

Измените программу так, чтобы ВЫЧИСЛИТЕЛЬ сообщал, сколько времени затратила каждая лодка на путь до озера. Запустите программу. А теперь давайте проверим нашего исполнителя. Подставьте найденное время движения, скажем, первой лодки в левую часть уравнения

vt + at2/2 = S

и найдите ее значение с помощью ВЫЧИСЛИТЕЛЯ. Вы увидите, что значение левой части не равно S! Как же так? Ведь значение t является корнем как раз этого уравнения. Подумав, вы легко поймете, в чем тут дело: ответственность за несовпадение несут ошибки округления. ЭВМ округляет числа при любых вычислениях, неизбежно внося в результаты небольшие ошибки. Если же вычислений очень много, то ошибки могут "накапливаться", искажая результаты так, что с истиной не остается ничего общего. Впрочем, выполняя лабораторные работы, вы вряд ли с этим столкнетесь; и если ЭВМ выдала вам абсолютно неверный результат, то виноваты вы, а не безропотный компьютер.

Если осталось время, то давайте обратимся еще раз к нашей задаче о лодках. Мы считали, что они двигались равноускоренно. А что, если допустить и равнозамедленное движение? Тогда ускорения смогут принимать и отрицательные значения. Вот и тема для вычислительного эксперимента! Надо, конечно, уточнить построенную математическую модель, алгоритм и программу. Прежде всего, уберите проверку положительности ускорений. Запустите программу, взяв расстояние S = 500 м и следующие скорости и ускорения: р = 2 м/с, q = 4 м/с, d= -0,01 м/с2, е= -0,02 м/с2. На экране появится сообщение "Уравнение корней не имеет". Откуда оно взялось? Это сработала подпрограмма "РЕКВУР". Раньше такое сообщение нам не встречалось, поскольку при положительном ускорении соответствующее квадратное уравнение всегда имеет корни (мы это обсуждали в § 14). Если же ускорения отрицательны, то нельзя гарантировать, что обе лодки доплывут до озера. Другими словами, нельзя гарантировать, что каждое из наших квадратных уравнений имеет корни. Понятно, что в случае отсутствия корней ВЫЧИСЛИТЕЛЬ должен вежливо сообщить, что соответствующая лодка до озера не доплыла. Проверка этого должна быть предусмотрена в основной программе. Значит, выполнив "РЕКВУР", ВЫЧИСЛИТЕЛЬ должен запомнить, имело уравнение корни или нет. А сейчас он, сообщив об отсутствии корней, тут же забывает об этом. Да и не может ВЫЧИСЛИТЕЛЬ анализировать сообщения (даже свои собственные).

Как видите, порой недостаточно просто снабдить алгоритм заголовком, чтобы эффективно воспользоваться им как вспомогательным. Нередко результаты вспомогательного алгоритма не позволяют "состыковать" его с основным алгоритмом. Это довольно распространенная ситуация. Она заслуживает отдельного обсуждения. Понятно, что основной алгоритм "обращается" к вспомогательному не просто так, а ради получения результатов. А они далеко не всегда пригодны для дальнейшего использования исполнителем алгоритма. Например, как мы видели, результатом вспомогательного алгоритма может быть не только число, но и какое-либо сообщение. У других исполнителей бывают и еще более "неудобные" результаты (например, звуковые сигналы или рисунки).

Программисты давно придумали выход: в таких случаях обычно вводят специальную переменную и ее значениями заменяют (кодируют) "неудобные" результаты. Эта переменная называется сигнальной. Каждому из возможных результатов соответствует свое значение сигнальной переменной. Например, если алгоритм предназначен для проверки какого-либо условия, то его результатом будет одно из сообщений "да" или "нет". Чтобы сделать этот алгоритм пригодным для использования в других алгоритмах, можно ввести сигнальную переменную, принимающую одно из двух значений. Например, сообщение "да" кодируется числом 0, а сообщение "нет" - числом 1.

Вернемся к задаче о лодках. Обозначим сигнальную переменную буквой k. Она будет равна 0, если уравнение имеет корни, и 1 в противном случае. Вот как запишется вспомогательный алгоритм "РЕКВУР" с использованием сигнальной переменной:

 Алгоритм "РЕКВУР" 
 Аргументы: a, b, с (коэффициенты квадратного уравнения). 
 Результаты: x, у (корни уравнения) и k (сигнальная переменная). 
 Присвоить дискриминанту d значение b2 - 4ас. 
 Если d<0, то: 
 Присвоить сигнальной переменной k значение 1. Иначе: 
 Присвоить сигнальной переменной k значение 0. 
 Присвоить х значение ( - b - d)/(2a). 
 Присвоить у значение ( - b + d)/(2a). Конец ветвления.

В основной программе после каждого вызова "РЕКВУРА" надо проверять, чему равно к. Если k оказалось равным 1, то ВЫЧИСЛИТЕЛЬ должен сообщить, что лодка не доплыла до озера (выбыла из соревнования), и остановиться.

Измените программу и запустите ее при тех же значениях исходных данных. Все в порядке? Тогда при тех же значениях скоростей и ускорений возьмите S = 100 м. ВЫЧИСЛИТЕЛЬ сообщит вам, что первой придет первая лодка. Это неправда! Разберитесь, в чем ошибка, и исправьте программу.

предыдущая главасодержаниеследующая глава








© Злыгостев А.С., 2001-2019
При использовании материалов сайта активная ссылка обязательна:
http://informaticslib.ru/ 'Библиотека по информатике'
Рейтинг@Mail.ru
Поможем с курсовой, контрольной, дипломной
1500+ квалифицированных специалистов готовы вам помочь