Программирование на smart BASIC. Урок 3

User avatar
Mr. Kibernetik
Site Admin
Posts: 4786
Joined: Mon Nov 19, 2012 10:16 pm
My devices: iPhone, iPad, MacBook
Location: Russia
Flag: Russia

Программирование на smart BASIC. Урок 3

Post by Mr. Kibernetik »

Урок 3 - Функции пользователя

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

В программе:

Code: Select all

DEF F (X,Y) = SQR (X^2 + Y^2)
A = 3 ! B = 4
PRINT "Для катетов";A;"и";B;"гипотенуза равна";F (A,B)
функция пользователя F задается в виде выражения SQR (X^2 + Y^2), где X и Y - это передаваемые в функцию параметры. Таким образом вызывая функцию F с разными параметрами можно получать результат вычисления по этой формуле.

Функция пользователя может состоять из нескольких строк:

Code: Select all

DEF F (X,Y)
X2 = X^2
Y2 = Y^2
F = X2 + Y2
END DEF
А вот пример использования функции пользователя в качестве команды:

Code: Select all

'функция выводит текущее время
DEF MY_TIME
H = CURRENT_HOUR()
M = CURRENT_MINUTE()
S = CURRENT_SECOND()
TEXT CLEAR
PRINT H & ":" & M & ":" & S
END DEF
'бесконечный цикл
LOOP: 'метка
MY_TIME 'вызов функции
PAUSE 1
GOTO LOOP 'переход на метку
Как видите, в этой программе функция пользователя не имеет параметров и не возвращает никаких результатов, а просто совершает необходимые действия, поэтому скобки ни в описании функции, ни при ее вызове можно не ставить - все-равно они были бы пустыми.

ЗАДАЧА 4
Решите одну из предыдущих задач, используя функции пользователя.

User avatar
niks26
Posts: 14
Joined: Sun Sep 28, 2014 11:16 pm
My devices: iPadmini2, 64gb, cell
iPhone 5s, 16 gb
MacBook Air 13' 2013
iMac 27' 2013
Location: Фаэтон
Contact:

Re: Программирование на smart BASIC. Урок 3

Post by niks26 »

Подскажите, чем отличается label от loop?

Какой командой можно стирать предыдущий результат?
Человек, измученный Нарзаном

User avatar
Mr. Kibernetik
Site Admin
Posts: 4786
Joined: Mon Nov 19, 2012 10:16 pm
My devices: iPhone, iPad, MacBook
Location: Russia
Flag: Russia

Re: Программирование на smart BASIC. Урок 3

Post by Mr. Kibernetik »

niks26 wrote:Подскажите, чем отличается label от loop?

Какой командой можно стирать предыдущий результат?
Имя метки может быть любым - как и имя переменной. Можете написать

Code: Select all

my_super_point: goto my_super_point
В текстовом окне нельзя стирать предыдущий результат, можно только печатать дальше и дальше.
Но можно очистить все текстовое окно командой TEXT CLEAR.

Dedjto
Posts: 32
Joined: Wed Oct 01, 2014 5:04 am
My devices: IPad , iPhone, iPod, Mac mini
Location: Россия

Re: Программирование на smart BASIC. Урок 3

Post by Dedjto »

Код:

DEF F (X,Y) = SQR (X^2 + Y^2)
input "Чему равен катет А" : a
input "Чему равен катет B" : b
A = a ! B = b
PRINT "Для катетов";A;"и";B;"гипотенуза равна";F (A,B)

User avatar
Mr. Kibernetik
Site Admin
Posts: 4786
Joined: Mon Nov 19, 2012 10:16 pm
My devices: iPhone, iPad, MacBook
Location: Russia
Flag: Russia

Re: Программирование на smart BASIC. Урок 3

Post by Mr. Kibernetik »

Dedjto wrote:Код:

DEF F (X,Y) = SQR (X^2 + Y^2)
input "Чему равен катет А" : a
input "Чему равен катет B" : b
A = a ! B = b
PRINT "Для катетов";A;"и";B;"гипотенуза равна";F (A,B)
А зачем записано

Code: Select all

A = a ! B = b
?

Dedjto
Posts: 32
Joined: Wed Oct 01, 2014 5:04 am
My devices: IPad , iPhone, iPod, Mac mini
Location: Россия

Re: Программирование на smart BASIC. Урок 3

Post by Dedjto »

Да, спасибо, это лишнее.

User avatar
niks26
Posts: 14
Joined: Sun Sep 28, 2014 11:16 pm
My devices: iPadmini2, 64gb, cell
iPhone 5s, 16 gb
MacBook Air 13' 2013
iMac 27' 2013
Location: Фаэтон
Contact:

Re: Программирование на smart BASIC. Урок 3

Post by niks26 »

Code: Select all

def GIP
input "длина первого катета" : X
input "длина второго катета" : Y
print "длина гипотенузы " & sqr (X^2 + Y^2)
end def

loop:
GIP
pause 0.5
goto loop
У меня так
Человек, измученный Нарзаном

Dedjto
Posts: 32
Joined: Wed Oct 01, 2014 5:04 am
My devices: IPad , iPhone, iPod, Mac mini
Location: Россия

Re: Программирование на smart BASIC. Урок 3

Post by Dedjto »

Вариант с меткой:

DEF TR
input "Чему равен катет А" : x
input "Чему равен катет B" : y
C = SQR (X^2 + Y^2)
PRINT "Для катетов";x;"и";y;"гипотенуза равна " &C
pause 1
TEXT CLEAR
END DEF
LABEL:
TR
PAUSE 0.5
GOTO LABEL

DmitryiS
Posts: 5
Joined: Sat Oct 04, 2014 6:27 am
My devices: iPad 4, IOS 7.1.2, jailbreak
iPhone 5, IOS 7.1.2 jailbreak

Re: Программирование на smart BASIC. Урок 3

Post by DmitryiS »

Скажите, а как можно округлить результат вычислений к ближайшему значению с заданным шагом изменения. Например, вот такая мини программа для определения нужного диаметра эндотрахеальной трубки в детской анестезиологии (упрощенно расчитывается по формуле (16+возраст в годах)/4 = номер трубки):

def F
input "Введите возраст ребенка в годах":X
if X<1 or X>18 then print "Некорректный возраст больного"
if X>=1 and X=<18 then print "Эндотрахеальная трубка ="&(16+X)/4
pause 2
text clear
end def
loop:F
pause 0.5
goto loop

Результат должен быть представлен с шагом изменения 0.5. Например: 6, 6.5, 7, 7.5, 8 и т.д. Какой командой можно задать округление полученного результата вычисления к ближайшему чуть меньшему значению? Например, чтобы вместо 7.25 выводился результат 7. Вместо 7.75 выводился результат 7.5 и т.д.
С командой INT не получилось. Она округляет до ближайшего большего целого числа.

P.S. Меня возможность программирования заинтересовала чисто с практической позиции. Некоторые программы невозможно найти в готовом виде, а на русском языке тем более. Лучше научиться создавать самому. ;)
Но с полным отсутствием опыта, медицинским образованием и далеким от математического мышлением, это сделать непросто. :oops:

User avatar
Mr. Kibernetik
Site Admin
Posts: 4786
Joined: Mon Nov 19, 2012 10:16 pm
My devices: iPhone, iPad, MacBook
Location: Russia
Flag: Russia

Re: Программирование на smart BASIC. Урок 3

Post by Mr. Kibernetik »

DmitryiS wrote:С командой INT не получилось. Она округляет до ближайшего большего целого числа.
Если округление до ближайшего целого - это слишком грубо, и вам нужно получить в два раза более детальный результат, то есть не 5, 6, 7, а 5, 5.5, 6, 6.5, 7, то получите в два раза большую величину, округлите ее до ближайшего целого, а потом разделите на два - таким образом нужный вам шаг составит 0.5:

Code: Select all

tt=int((16+x)/2)/2

Post Reply