Цель занятия – ознакомить Вас на примерах с важнейшим понятием программирования - ПОДПРОГРАММА.
Впервые в этом курсе применим необычную форму обучения – электронную лекцию. Главная сущность таких занятий в том, что Вы будете получать информацию не со слов преподавателя, не с доски, а с экранов мониторов. Как же работать с электронной лекцией?
-Внимательно изучите и обязательно законспектируйте предлагаемый Вам теоретический материал.
-законспектируйте и поработайте с программами, предложенными в качестве примеров, для этого необходимо удалить оператор REM со строк конкретной программы и запустить всю программу. После окончания работы с программой снова восстановить REM и перейти к следующей программе. Рекомендуем студентам внести изменения в программу и записать под другим именем, с тем, чтобы текст лекции сохранялся неизменным и доступным для студентов других подгрупп.
Текст лекций помещены здесь с той целью, чтобы преподаватель мог руководить Вашей учебной деятельностью, используя эту твердую копию информации, которую Вы не читайте, а изучайте в электронном виде. Итак, первая лекция, посвященная понятию подпрограмма.
CLS : SCREEN 9: COLOR 14, 1
pi = 4 * ATN(1)
________________Листинг электронной лекции для преподавателя_________
'* Уважаемые студенты! Познакомьтесь с очень важным вопросом в программировании
'* Организация и использование ПОДПРОГРАММ
'* Поступите так: что-нибудь измените в этом файле, например, вместо
'* этих строк поместите свое имя и сохраните файл под другим именем
'* с тем, чтобы Вы работали в СВОЕМ файле. Проделайте это, пожалуйста.
'Уважайте студентов других подгрупп.
'* Подпрограмма - это группа операторов или часть программы, описывающая
'* некоторый алгоритм, который можно многократно использовать, обращаясь
'* к нему из различных точек программы. Использование подпрограмм уменьшает
'* общее количество операторов в программе, чем обеспечивает
'* более эффективное использование памяти.
'* В языке Бейсик подпрограмма оформляется как группа операторов,
'* которая должна выполняться при обращении к ней.
'* Обращение к подпрограмме осуществляется оператором GOSUB n, где
'* n - номер строки, с которой начинается подпрограмма.
'* Подпрограмма может содержать обращения к другим
'* подпрограммам. При этом внутренняя подпрограмма считается вложенной.
'* После завершения выполнения подпрограммы управление должно быть возвращено
'* в ту точку программы, из которой сделан переход в подпрограмму. Выход из
'* подпрограммы осуществляется с помощью оператора RETURN, который
'* автоматически возвращает управление строке, следующей за строкой, где
'* расположен оператор GOSUB. Все подпрограммы должны завершаться RETURN.
'* При многократном обращении к подпрограмме
'* один оператор RETURN может обслуживать несколько операторов GOSUB.'* Два предупреждения. Первое.
'* Необходимо внимательно отслеживать имена переменных, используемых в
'* подпрограмме и в основном теле программы. Например, в основной программе
'* Вы организуете цикл по i и в подпрограмме у Вас тоже цикл по i.
'* Программа работать не будет!!! Будьте внимательны.
'* И второе. Внимательно следите за тем, с КАКОЙ (какими) переменной Вы
'*" идете" в подпрограмму и, особенно, с КАКОЙ (какими) "возвращаетесь".
'* Ведь до последующего обращения к подпрограмме значение переменной, полу-
'* ченное в подпрограмме должно быть "использовано", иначе оно будет утеряно.
'*И еще проблема при использовании подпрограмм. Как правило, подпрограммы
'* располагают в конце программы, а значит основное тело программы
'* должно завершаться либо каким либо переходом, либо END, иначе получите
'*" Ошибка: RETURN без GOSUB", понятно почему.
'***************************************************************************
'* Первый пример приведем с подробными комментариями.
'* Важное значение во многих разделах математики играет понятие "число'* сочетаний из n по k". (обязательно n>=k) В дальнейшем Вы будете его изучать.
'* Вычисляется оно по формуле С = n!/(k!*(n-k)!). 3 раза необходимо вычислять
'* факториалы. Их вычисление организуем в подпрограмме.
'* Снимите REM, где необходимо и запустите программу, предварительно
'* изучив и законспектировав ее
'5 INPUT "Введите n и k"; n, k: 'Запросили у пользователя исходные данные
'IF n < k THEN PRINT "Вы не правы, повторите ввод": GOTO 5: 'Защита от дураков"'* Идем в подпрограмму за n! Но подпрограмма вычисляет факториал натурального
'*"х" и запоминает его значение в переменной "y". Значит необходимо:
'x = n: GOSUB 50: 'Пришли с y = n!, его необходимо запомнить!
'p = y
'*Теперь идем за k!? аналогично:
'x = k: GOSUB 50: 'Пришли с y = k!, запоминаем и его:
'q = y: 'И идем за (n-k)!
'x = n - k: GOSUB 50: 'Пришли с y = (n-k)! и вычисляем "С"
'c = p / q / y: 'Выводим ответ
'PRINT "Число сочетаний из"; n; "по"; k; "равно"; c'END'50 ' Подпрограмма вычисления факториала
'IF x = 0 THEN y = 1: GOTO 20
'y = 1: FOR i = 1 TO x: y = y * i: NEXT i
'20 RETURN
'* Окончание первой программы*******************************************
'* Восстановите REM в освоенной программе*******************************
'* Вы уже составляли программу табулирования функции: вывод ее n значений
'* на отрезке [a;b]. Функцию мы задавали оператором DEF FN
'*А если функция задана несколькими формулами при различных значениях
'* аргумента? Необходимо организовать подпрограмму.
'INPUT "Введите отрезок a,b"; a, b'INPUT "Введите число строк таблицы значений n"; n
'h = (b - a) / n
'FOR x = a TO b STEP h'GOSUB 100
'PRINT x, y
'NEXT x
'END
'100 '* Подпрограмма вычисления значений функции'IF x <= -1 THEN y = -x'IF x > -1 AND x <= 1 THEN y = x ^ 2
'IF x > 1 THEN y = x
'y = (INT(y * 1000 + .5)) / 1000
'x = (INT(x * 1000 + .5)) / 1000
'RETURN
'* Окончание программы табулирования функции
'* Вы уже составляли программу вычисления интеграла по формуле трапеций
'*на отрезке [a;b]: I = h*((f(a)+f(b))/2+f(a+h)+f(a+2h)+...+f(b-h))
'*где h = (b - a)/n
'* Функцию мы задавали оператором DEF FN
'*А если функция задана несколькими формулами при различных значениях
'* аргумента? Необходимо организовать подпрограмму.'INPUT "Введите отрезок a,b"; a, b
'n = 4
'5 n = n * 2
'h = (b - a) / n
's = 0
'x = a: GOSUB 100: s = s + y
'x = b: GOSUB 100: s = s + y
's = s / 2
'FOR x = a + h TO b - h STEP h
'GOSUB 100
's = s + y
'NEXT x
's = s * h
'PRINT "При n="; n; "значение интеграла равно"; s
'GOTO 5
'100 '* Подпрограмма вычисления значений функции
'IF x <= -1 THEN y =sin(x)
'IF x > -1 AND x <= 1 THEN y = x ^ 2
'IF x > 1 THEN y = cos(x)
'RETURN
'* Окончание программы интегрирования функции
'* Составим программу с двумя подпрограммами
'* Студент ведет вычисления по формуле, аргументы a,b,c,d задает в градусах:
'* z = (COS(a) + SIN(b) + 3) / SQR(COS(c) + SIN(d) + 3)
'* Организуем подпрограмму перевода градусов в радианы и подпрограмму
'* вычисления выражения w = COS(p) + SIN(q) + 3
'10 INPUT "Введите значения углов a,b,c,d в градусах"; a, b, c, d
'g = a: GOSUB 30: p = r
'g = b: GOSUB 30: q = r
'GOSUB 40: ch = w
'g = c: GOSUB 30: p = r
'g = d: GOSUB 30: q = r
'GOSUB 40: zn = SQR(w)
'z = ch / zn'PRINT "Записывайте ответ: z = "; z
'END
'30 'Подпрограмма перевода градусов в радианы: входим с g, выходим с r
'r = g * pi / 180: RETURN
'40 ' Подпрограмма вычисления выражения COS(p) + SIN(q) + 3
'w = COS(p) + SIN(q) + 3: RETURN
'* Окончание программы
'***********************************************************************
'* Подпрограммы широко применяются в графике, мы будем изучать ее позже.
'* В качестве отдыха рассмотрите программу, ее не переписывайте в конспект.
'* Снимите REM в нашей последней на сегодня программе
'CLS : SCREEN 9:
'pi = 4 * ATN(1)
'COLOR 4, 0: PRINT "Большая Медведица и Кассиопея вращаются вокруг Полярной звезды
'COLOR 14, 0: WINDOW (-70, -70)-(70, 70)
'CIRCLE (0, 0), .3, 12
'k = 1.2
'FOR f = 0 TO 1000 STEP .003
't = f - .05: a = 30: GOSUB 100: t = f: a = 17: GOSUB 100
't = f - .4: a = 33: GOSUB 100: t = f - .65: a = 23: GOSUB 100
't = f - 1.2: a = 27: GOSUB 100: t = f - 1.4: a = 40: GOSUB 100
't = f - 1.4: a = 55: GOSUB 100: t = f + 3: a = 33: GOSUB 100
't = f + 2.8: a = 43: GOSUB 100: t = f + 2.5: a = 33: GOSUB 100
't = f + 2.2: a = 43: GOSUB 100: t = f + 2: a = 33: GOSUB 100
'FOR i = 1 TO 700: NEXT i
't = f - .05: a = 30: GOSUB 200: t = f: a = 17: GOSUB 200
't = f - .4: a = 33: GOSUB 200: t = f - .65: a = 23: GOSUB 200
't = f - 1.2: a = 27: GOSUB 200: t = f - 1.4: a = 40: GOSUB 200
't = f - 1.4: a = 55: GOSUB 200: t = f + 3: a = 33: GOSUB 200
't = f + 2.8: a = 43: GOSUB 200: t = f + 2.5: a = 33: GOSUB 200
't = f + 2.2: a = 43: GOSUB 200: t = f + 2: a = 33: GOSUB 200
'NEXT f
'100 'Подпрограмма рисования звезд
'x = a * COS(t): y = k * a * SIN(t): CIRCLE (x, y), .3: RETURN
'200 'Подпрограмма стирания звезд
'x = a * COS(t): y = k * a * SIN(t): CIRCLE (x, y), .3, 0: RETURN
'* Окончание программы
А теперь рассмотрим и прокомментируем несколько задач, реализация которых предусматривает организацию подпрограмм.
1.Вычислить значение выражения:
Организовать вычисление значений квадратных корней в подпрограмме.
,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
SCREEN 9: COLOR 14, 1
2 CLS
PRINT TAB(22); : INPUT "Введите x,y,z"; x, y, z
t = x: 'Присвоение t значения x, т.к. в подпрограмме
'использована переменная t
GOSUB 100: 'Идем в подпрограмму с переменной t
p = b: 'Запоминаем значение первого корня в переменной p
t = y: 'Присвоение t значения
GOSUB 100: 'Идем в подпрограмму с переменной t
q = b: 'Запоминаем значение второго корня в переменной q
t = z: 'Присвоение t значения z
GOSUB 100: 'Идем в подпрограмму с переменной t
s = p / (q + b):’**Вычисляем значение выражения
COLOR 7: PRINT TAB(18); "Записывайте ответ"; s: COLOR 14
PRINT TAB(22); "1 - новые данные, 2 - окончание работы"
PRINT TAB(22); "Нажмите соответствующую клавишу"
5 g$ = INKEY$
IF g$ = "1" THEN 2 ELSE IF g$ = "2" THEN STOP ELSE 5
100 '***Подпрограмма вычисления корня******
b = SQR((t + 2) ^ 2 + ABS(t + EXP(-t)))
RETURN
2.Как известно, автомобильные номера – это буквы с тремя цифрами. Если сумма этих цифр номера равна 7 – такой номер будем считать счастливым, а если 13 – это несчастливый номер. Сколько автомобилей, имеющих разные номера, имеют счастливые и несчастливые номера?
,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
SCREEN 9: COLOR 14, 1
CLS
GOTO 20
10 '******Подпрограмма суммирования цифр*******
m = n: p = n: 'переменным m и p присвоили значения n
ts = n \ 100: 'выделяем первую цифру - сотни
ds = (m - ts * 100) \ 10: 'выделяем вторую цифру - десятки
ed = p - ts * 100 - ds * 10: 'выделяем третью цифру - единицы
s = ts + ds + ed: 'суммируем
RETURN
20 k7 = 0: k13 = 0: 'обнуляем счетчики
FOR i = 0 TO 999
n = i: GOSUB 10: 'переменной n присваиваем значение i и направляемся в подпрограмму
IF s = 7 THEN k7 = k7 + 1
IF s = 13 THEN k13 = k13 + 1
NEXT i
PRINT TAB(20); "Счастливых номеров"; k7
PRINT TAB(20); "Несчастливых номеров"; k13
Изменим программу с тем, чтобы она не только подсчитывала количество нужных нам номеров, но и распечатывала их
,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.2.1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
GOTO 20
10 '******Подпрограмма суммирования цифр*******
m = n: p = n : ts = n \ 100: ds = (m - ts * 100) \ 10
ed = p - ts * 100 - ds * 10
s = ts + ds + ed
RETURN
20 k7 = 0
FOR i = 0 TO 999
n = i: GOSUB 10
IF s = 7 THEN k7 = k7 + 1: PRINT i;
NEXT i
PRINT TAB(20); "Счастливых номеров"; k7
PRINT : PRINT : PRINT : PRINT : PRINT
k13 = 0
FOR i = 0 TO 999
n = i: GOSUB 10
IF s = 13 THEN k13 = k13 + 1: PRINT i;
NEXT i
PRINT TAB(20); "Несчастливых номеров"; k13
Мы уже рассматривали задачу табулирования функции. А что, если функция задана не одной формулой, а различными для различных значений аргумента, например, так:
Это означает, что вычисление значений функции необходимо находить в подпрограмме.
,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
SCREEN 9: CLS
COLOR 14, 8
LOCATE 2, 5
INPUT "введите отрезок a,b"; a, b
PRINT TAB(5); : INPUT "число строк таблицы"; n
h = (b - a) / n
PRINT TAB(15); "x"; TAB(30); "y"
FOR x = a TO b STEP h
GOSUB 10
PRINT TAB(10); x; TAB(25); y
NEXT x
END
10 '***** подпрограмма вычисления значения функции *******
IF x <= -1 THEN y = x ^ 3 + 3 * x ^ 2 + 3 * x + 2
IF x > -1 AND x <= 1 THEN y = x ^ 2
IF x > 1 THEN y = (x + 4) / (3 * x + 2)
RETURN
Найти значение функции:
, если a = 17° , b = 23° , c = 39° , d = 43°
,,,,,,,,,,,,,,,,,,,,,,,,,Программа 12.4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
SCREEN 9: CLS
COLOR 14, 8
pi = 4 * ATN(1)
READ a, b, c, d
x = a * pi / 180: y = b * pi / 180
GOSUB 200
z1 = w 'это числитель
x = c * pi / 180: y = d * pi / 180
GOSUB 200
z2 = SQR(w) 'это знаменатель
z = z1 / z2:
LOCATE 10, 10: PRINT "z="; z
END
200 '***** подпрограмма ******
w = COS(x) + SIN(y) + 3
RETURN
DATA 17,23,39,43
Задания для самостоятельной работы
12.5. Написать письмо стандартной формы, адресованное различным людям. Текст письма расположить в подпрограмме.
12.6 Вычислить:
Вычисление выражения организовать в подпрограмме.
12.7Величина x изменяется от -5 до 5 с шагом 1. найти сумму значений
. Вычисление y организуйте в подпрограмме.
Какими знаниями Вы овладели, какие умения и навыки Вы приобрели на занятии №12?