к оглавлению

Организация подпрограмм в QB

Цель занятия – ознакомить Вас на примерах с важнейшим понятием программирования - ПОДПРОГРАММА.

Впервые в этом курсе применим необычную форму обучения – электронную лекцию. Главная сущность таких занятий в том, что Вы будете получать информацию не со слов преподавателя, не с доски, а с экранов мониторов. Как же работать с электронной лекцией?

-Внимательно изучите и обязательно законспектируйте предлагаемый Вам теоретический материал.

-законспектируйте и поработайте с программами, предложенными в качестве примеров, для этого необходимо удалить оператор 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?

  • познакомились с понятием “подпрограмма”, условия реализации программ, содержащих подпрограммы;
  • научились работать с электронной лекцией: снимаем REM в нужном месте и запускаем программу, нет необходимости вводить эту программу – очень эффективная форма работы;
  • рассмотрели конкретные интересные задачи, программная реализация которых требует применения подпрограмм;
  • научились суммировать цифры натурального числа;
  • получили навыки в умении программно реализовать несложные текстовые задачи, требующие организации подпрограмм.

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

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution