-c1E
+\/d
ГЛАВА IV. ФУНКЦИИ И ПОДПРОГРАММЫ
-
-
+\/d-
Любая по-настоящему полезная классификация
содержит от трех до шести категорий.
Энон
-
-
В MSX-BASIC различают следующие основные типы функций:
1) встроенные функции:
а) встроенные числовые функции;
Заметим, что встроенные ч и с л о в ы е функции мы уже изучили (см.
раздел I.7.4.)!
-
-
IV.1. ВСТРОЕННЫЕ ФУНКЦИИ ПРЕОБРАЗОВАНИЯ
-
Напомним, что множество значений строковых переменных - это множество
упорядоченных наборов символов. Упорядоченность означает, что строковые
значения различаются не только набором, но и последовательностью символов,
значается " "(между кавычками есть пробел) и имеет длину 1.
Отметим, что символ "пробел" - равноправный с остальными символ!
-
-
IV.1.1. LEN - ф у н к ц и я
-
- Ее общий вид LEN(α)
+ Ее общий вид LEN(α) ,
где: LEN ("LENgth"-"длина") - служебное слово;
α - строковое выражение.
Результатом функции LEN(α) является длина значения строкового выраже-
ния α (или что то же самое,количество символов в строке α),LEN(α)∈[0,255].
Напомним, что в том месте дисплейной строки,где надо обратить Ваше вни-
мание на наличие символа пробел (" "), мы будем использовать символ "·".
-
П р и м е р 1.
─────────────
NEW
переменными. С ее помощью, например, можно определить,не является ли стро-
ка пустой до выполнения действий, которые не могут выполняться над пустой
строкой ("").
-
П р и м е р 2. 10 IF LEN(A$)>0 THEN PRINT "Все в порядке!" ELSE PRINT
───────────── "Строка пустая!" 'Проверка, является ли строка пустой,
т.е. не содержащей ни одного символа.
-
П р и м е р 3. NEW
───────────── Ok
10 'Выравнивание слов по правому краю.
··········фанатичный
·········программист
Ok
-
Сравните функцию LEN() с функцией длин (А), где длин(А) - длина текс-
──── ────
та A, в школьном алгоритмическом языке [11, с.53]!
-
IV.1.2. INSTR - ф у н к ц и я
-
Общий вид функции INSTR:
INSTR([n,]α,β)
Здесь: INSTR("IN STRing"-"в строке") - служебное слово;
1 Illegal function call in 20
Ok Ok
-
-
IV.1.3. VAL - ф у н к ц и я
-
Ц и ф р о в а я строка - это строка,содержащая любое количество распо-
ложенных в любом месте строки пробелов, знак "плюс" или "минус", десятич-
ные цифры и десятичную точку.
В ряде случаев удобнее работать с числами, а не с их представлениями в
виде цифровых строк. Цифровую строку можно преобразовать в числовое значе-
ние с помощью функции преобразования VAL, общий вид которой:
- VAL(α)
+ VAL(α) ,
где: VAL("VALue"-"значение") - служебное слово;
α - строковое выражение.
Преобразование начинается с крайнего левого символа значения строково-
го выражения α и заканчивается, когда преобразован последний символ значе-
ния α, либо когда встретился нецифровой символ.
-
П р и м е р ы:
─────────────
Ok Ok
print VAL("12.5E-3") print val("&b1");val("&o76");val("&hF")
.0125 ·1··62··15
Ok Ok
-
Если строка является пустой или начинается с нецифрового символа, то
функция VAL возвращает значение 0.
-
П р и м е р ы:
─────────────
1) Ok 2) Ok
? VAL("a12");VAL("23A12:");VAL("") ? VAL("-1.24")
·0··23··0 -1.24
Ok Ok
-
Если одним из символов цифровой строки является восклицательный знак,
то в зависимости от его расположения возможны следующие случаи.
-
П р и м е р ы:
─────────────
1) Ok
? VAL("1234.56789!")
·1234.57 ◀─── результат преобразования: число одинарной точности
Ok (шесть значащих цифр!)
-
2) Ok 3) Ok 4) Ok
? VAL("34!5.1") ? VAL("3456789!.7") ? VAL("!1")
·34 ·3456790 ·0
Ok Ok Ok
-
И наконец, парочка патологических случаев:
-
5) Ok 6) Ok
? VAL("&") ? VAL("&H")
Syntax error 0
Ok Ok
-
Таким образом, функция VAL позволяет выделить цифры, входящие в значе-
ние строкового выражения, и образовать из них число для последующей мате-
матической обработки.
-
IV.1.4. STR$ - ф у н к ц и я
-
Часто бывает необходимо осуществить преобразование числа в цифровую
строку, например, число 1234.56 преобразовать в цифровую строку"1234.56".
Это преобразование осуществляет функция STR$, общий вид которой:
- STR$(α)
+ STR$(α) ,
где: STR ("convert to STRing"-"преобразовать в строку") - служебное слово;
α -арифметическое выражение.
Данная функция преобразует значение арифметического выражения α в циф-
ровую строку, что позволяет выделять и обрабатывать каждый символ (цифру)
полученной строки с помощью с т р о к о в ы х (!) функций.
-
П р и м е р ы:
─────────────
1) Ok 2) Ok 3) Ok
print STR$(-15) print STR$(1/3) ? STR$(1.E-3)
-15 ·.33333333333333 ·1E-03
Ok Ok Ok
-
4) Ok
? STR$(&b111);STR$(&o23);STR$(&HF1)
·7·19·241
Ok
-
Обратите о с о б о е внимание на следующие примеры (первый символ в
получаемых цифровых строках зарезервирован для указания знака числа):
-
5) Оk 6) Ok
? LEN(STR$(20)) ? LEN(STR$(-56.20))
3 5
Ok Ok
-
7) Оk 8) Ok
? LEN(STR$(-5620)) ? LEN(STR$(1.2E-27)
5 8
Ok Ok
-
Еще один пример использования функции STR$: оператор
PRINT n;"X"
выводит на экран дисплея пробел между последней цифрой значения арифмети-
ческого выражения n и символом "X". Для исключения этого пробела восполь-
зуйтесь оператором PRINT STR$(n);"X"
-
9) NEW 10) NEW
Ok Ok
10 INPUT N 10 INPUT N
10i i10
Ok Ok
(о строковой функции MID$() см. в разделе IV.2.1.).
-
Отметим, что обычно в программах функции VAL() и STR$() используются
совместно.
-
11) Ok
input N$:print STR$(VAL(N$))
? 23123.45 ? -4.7 ? &HFF однако... ? 12ABBA
·23123.45 -4.7 ·255 ·12
Ok Ok Ok Ok
-
12) Ok
input N:print VAL(STR$(N))
? 12 ? -14.6E-2 ? &b111 ? &o21 ? &h1E
·12 -.146 ·7 ·17 ·30
Ok Ok Ok Ok Ok
-
13) найдите натуральные числа, не превосходящие заданного N и равные
сумме кубов своих цифр.
NEW
9 8 ▲
Ok Ok │
16 символов
-
- 15) найти наибольшую из цифр,встречающуюся в десятичной записи данного
-натурального числа M более одного раза.
+ 15) найдите наибольшую из цифр, встречающуюся в десятичной записи дан-
+ного натурального числа M более одного раза.
NEW
Ok
10 INPUT М
Ok
и все становится ясным!
-
-
IV.1.5. ASC - ф у н к ц и я
-
Напомним,что при вводе в ЭВМ символы преобразуются в соответствии с ко-
дом ASCII (см. раздел I.7.3.).
- Функция ASC(α)
+ Функция ASC(α) ,
где: ASC("ASC"-"American Standard Code") - служебное слово;
α - строковое выражение,
дает возможность установить десятичный код ASCII первого символа значения
строкового выражения α. Результатом функции ASC является целое число из
отрезка [0,255] (говорят, что функция ASC в о з в р а щ а е т целое чис-
ло из отрезка [0,255]).
-
П р и м е р. NEW
─────────── Ok
10 INPUT X$:Y=ASC(X$):PRINT X$;Y
? π ? αδβ ? ; ? "," ? ♪ ◀─ символ,
π 163 αδβ 160 ; 59 , 44 ♪ 1 имеющий
Ok Ok Ok Ok Ok двойной код
-
Из приведенного примера ясно, что символ "π", например, имеет десятич-
ный код 163,а символ "α"(первый символ значения строковой константы"αδβ")
- десятичный код 160.
Снова неудача! Не волнуйтесь, код символа "кавычка" можно получить кос-
венным путем с помощью функции преобразования CHR$.
-
-
IV.1.6. CHR$ - ф у н к ц и я
-
- Общий вид функции: CHR$(α)
+ Общий вид функции: CHR$(α) ,
где: CHR("CHaRacter"-"символ") - служебное слово;
α - арифметическое выражение.
Вначале компьютер вычисляет к о д - целую часть значения выражения α.
вол, соответствующий полученному коду (говорят, что функция CHR$ в о з -
в р а щ а е т однобайтовую строку, содержащую символ, соответствующий
полученному коду).
-
П р и м е р ы:
- ─────────────
1) INPUT X:Y$=CHR$(X):PRINT X;Y$
? 34 ? 187 ? 163
34 " 187 √ 163 π
Ok Ok Ok
-
2) переменной A$ присвоить значение "A$="BANSAJ!""
A$="A$="+CHR$(34)+"BANSAJ!"+CHR$(34)
А теперь... print A$
A$="BANSAJ!"
Ok
-
3) вывести на экран дисплея текст: "Нажмите клавишу "SHIFT"+"1".
Ok
PRINT "Нажмите клавишу ";CHR$(34);"SHIFT";CHR$(34);"+";CHR$(34)
;"1";CHR$(34)
Нажмите клавишу "SHIFT"+"1"
Ok
-
4) инициализация строкового массива B$(N) "псевдослучайными" словами.
Ok
20 Z=RND(-TIME)
X=ASC(CHR$(X)) и Y$=CHR$(ASC(Y$)),
если только значение арифметического выражения X находится в допустимых
пределах (напомним, что 0≤X≤255!), а LEN(Y$)=1.
-
5) присвоить строковой переменной Y$ значение "yes", если X≥1 и "no"
- если X<1. Оператор условного перехода IF...THEN...ELSE... не применять!
NEW
печатаемыми "символами" (BS, SELECT, RETURN, клавиши управления курсором).
-
IV.1.7. BIN$ - ф у н к ц и я
-
BIN$-функция применяется для преобразования целого числа в двоичную
символьную строку. Ее общий вид:
- BIN$(α)
+ BIN$(α) ,
где: BIN ("BINary"-"двоичный") - служебное слово;
α - арифметическое выражение.
Вначале вычисляется значение арифметического выражения α; результат
Обозначим целую часть значения выражения α буквой N.
Заметим, что для отрицательных N компьютер вычисляет значение функции
BIN$(N) по рекуррентной формуле: BIN$(N) = BIN$(65536+N) .
-
П р и м е р ы:
─────────────
1) BIN$(-1) возвращает "1111111111111111",
BIN$(-32768) возвращает "1000000000000000",
BIN$(32768) возвращает "1000000000000000",
BIN$(65535) возвращает "1111111111111111".
-
2) print VAL("&B"+BIN$(15))
15
Ok
-
Наконец, при помощи функции BIN$ можно "научить" компьютер двоичной
арифметике. Посмотрите, например, как работает следующая программа:
-
3) Ok
10 PRINT"Могу найти сумму двух двоичных чисел!"
20 INPUT "Первое число, второе число";N1$,N2$
Первое число, второе число? 1111111111111111,1
Ответом является:0000000000000000 или 0 десятичное
Ok
-
Неизвестные Вам пока строковые функции RIGHT$ и STRING$ рассмотрены ни-
же в разделах IV.2.3. и IV.2.4.
-
4) среди простых чисел, не превосходящих N , найти такое, в двоичной
записи которого максимальное число единиц.
NEW
1 1 ·7·111 ·17·10001
3 11 ·11·1011 ·3··7
5 101 ·13·1101 Ok
-
5) выделить старший и младший байты двоичного числа A%
NEW
Ok
run
Введите число А% (не более 16 двоичных цифр)? &B1011110001010011
10111100 01010011 ▲
- Ok │ число отрицательное!
+ Ok └ число отрицательное!
run
Введите число А% (не более 16 двоичных цифр)? &B0011110001010000
00111100 01010000 ▲
- Ok │ число положительное!
-
-
+ Ok └ число положительное!
IV.1.8. OCT$ - ф у н к ц и я
-
OCT$-функция служит для преобразования числа в восьмеричную символьную
строку. Ее общий вид:
- OCT$(α)
+ OCT$(α) ,
где: OCT ("OCTal-"-"восьмеричный-") - служебное слово;
α - арифметическое выражение.
Эта функция вычисляет значение арифметического выражения α, преобразу-
В противном случае результат преобразуется в символьную строку, представ-
ляющую его значение в восьмеричной системе счисления.
Максимальная длина строки-результата OCT$() - 6 символов (6 байтов).
-
П р и м е р. Ok
─────────── print OCT$(&HFFFF)
177777
Ok
-
Обозначим буквой N целую часть значения выражения α.
Если N принадлежит диапазону [0,65535],то значение функции OCT$() нахо-
дится компьютером без обращения к дополнительному коду, например:
? OCT$(-32768) сравните с print OCT$(32768)
100000 100000
Ok Ok
-
З а д а ч а. Попытайтесь научить компьютер "восьмеричной" арифметике.
─────────── Используйте для этой цели идею следующего фрагмента:
print VAL("&O"+OCT$(100))
Ok
И, наконец ...
-
-
IV.1.9. HEX$ - ф у н к ц и я
-
HEX$-функция служит для преобразования целого числа в шестнадцатерич-
ную символьную строку. Ее общий вид:
- HEX$(α)
+ HEX$(α) ,
где: HEX ("HEXadecimal-"-"шестнадцатеричный-") - служебное слово;
α - арифметическое выражение.
Вначале вычисляется N - целая часть значения арифметического выраже-
Если целое число N находится на отрезке [0,65535], то преобразование
элементарно: HEX$(0) возвращает "0" ,
HEX$(65535) возвращает "FFFF" .
- Однако, значение функции при отрицательных N,принадлежащих [-32768,-1],
+ Однако значение функции при отрицательных N, принадлежащих [-32768,-1],
вычисляется компьютером с использованием дополнительного кода, т.е. с при-
менением рекуррентной формулы:
HEX$(N)=HEX$(65536+N);
───────────── ? VAL("&h"+HEX$(3)) ? VAL("&H"+HEX$(-10))
3 -10
Ok Ok
-
Существование функции HEX$() делает возможным "обучение" компьютера
шестнадцатеричной арифметике. Единственная трудность состоит в добавлении
к числу нулей, стоящих в старших разрядах (если, конечно,это необходимо!).
+
+
+
IV.2. ВСТРОЕННЫЕ СТРОКОВЫЕ ФУНКЦИИ
Космос с болью сочился над разбитой любовью,
Был из скрытных людей свет твой медленно изгнан,
И небо не спало.
- Избранные стихотворения компьютера RCA-301, поэма 929
+ Избранные стихотворения компьютера
+ RCA-301, поэма 929
В этом разделе мы рассмотрим следующие встроенные функции: MID$, LEFT$,
RIGHT$, STRING$, SPACE$.
- IV.2.1. MID$ - ф у н к ц и я
+ IV.2.1. MID$ - ф у н к ц и я
+
Oбщий вид MID$ - функции следующий:
- MID$(α,m[,n])
+ MID$(α,m[,n]) ,
где: MID ("MIDdle"-"середина") - служебное слово;
α - строковое выражение;
m, n - арифметические выражения, целые части значений которых должны
чать соответственно M и N.
По умолчанию N равно количеству символов значения строкового выражения
α от позиции M и до конца строки включительно.
-
Рассмотрим два возможных случая.
-
1. Функция MID$ с л е в а от знака равенства в операторе присваива-
ния LET. ┌───────────────────────────────────┐
│ [LET] MID$(α,m[,n]) = β │
ражения α остаются без изменений (см. рис.1).
-
-
-
-
-
-
1-й 2-й М-й (М+1)-й (M+N-1)-й LEN(α)-й
символ символ символ символ символ символ
│ │ │ │ │ │
? MID$("КЛАВИАТУРА",3,4) ? MID$("капрал"+"литр",4,5)
АВИА └──┘ ралли └──────┘
Ok Ok
-
3) Ok 4) Ok
? MID$("молоко"+"брат",5,5) ? MID$("СОР У НОР",3,5)
кобра └──────┘ Р У Н └───┘
Ok Ok
-
5) Ok 6) NEW
10 input I,J:? MID$("234",I,J) Ok
run run run run 1 Z$="123"
? 2,-1 ? 0,1 костяная нога
Illegal function call in 10 Ok
Ok
-
7) определить третий символ в слове X$.
Ok
input x$:z$=mid$(x$,3,1):print z$
? интеграл
т
Ok
-
Если требуется определить K-й символ в слове X$, то программа будет
иметь следующий вид (разумеется, 1≤K≤LEN(X$)):
NEW
? информатика,3 ? информатика,12
ф Буквы с указанным номером в слове нет
Оk Ok
-
П р и м е р 8. Для получения числа, состоящего из двух младших цифр це-
───────────── лого числа N, воспользуйтесь строкой:
10 X%=VAL(MID$(STR$(N),LEN(STR$(N))-1,2))
Заметим,что Вы можете выполнить то же самое,используя функцию INT():
10 INPUT N:PRINT N-INT(N/100)*100
-
П р и м е р 9. Написать программу, определяющую, сколько раз слово Z$
───────────── встречается в слове X$.
NEW
? БАОБАБ,БА
2
Ok
-
П р и м е р 10. Написать программу, заменяющую в слове X$ слово Z$ на
────────────── слово Y$ той же длины.
NEW
?? КИРПИЧНЫЙ
?? БАНАНОВЫЙ
ДОМ БАНАНОВЫЙ
- Оk
-
-
- Косо лети же, житель осок. Я разуму уму заря, Мечтатель! Летать чем?
- В.Хлебников Я иду с мечом судия. С.Кирсанов
- Г.Р.Державин
-
-
+ Оk Я разуму уму заря,
+ Я иду с мечом судия.
+ Г.Державин
+ Мечтатель! Летать чем?
+ С.Кирсанов
П р и м е р 11. Слова и фразы,переходящие в себя при "акустическом ото-
────────────── бражении", получили название п а л и н д р о м о в.
Это слово греческого происхождения и означает "движущийся обратно", "обра-
? косолетижежителосок ? мечтателлетатчем ? я разуму уму заря
Палиндром! Палиндром! Не палиндром!
Ok Ok Ok
-
Сравните результат действия функции MID$(A$,I,J),стоящей справа от зна-
ка равенства в операторе присваивания, с результатом операции в ы р е з-
к и: A[i:i+j-1] ,
IV.2.2. LEFT$ - ф у н к ц и я
-
- Общий вид функции: LEFT$(α,n)
+ Общий вид функции: LEFT$(α,n) ,
где: LEFT ("left"-"левый") - служебное слово;
α - строковое выражение;
n - арифметическое выражение, целая часть значения которого должна
строкового выражения α .
LEFT$ - функция является"частным случаем" MID$- функции и через нее мо-
жет быть определена так: LEFT$(α,n) = MID$(α,1,n) .
-
П р и м е р ы:
─────────────
1) Ok 3) Ok
? 1234567890,6 ("def",2),1)
123456123456 abd
Ok Ok
-
2) Ok 5) Ok
? LEFT$("деньги",0) ? LEFT$("wap",-1)
Illegal function call
Ok Ok
-
-
IV.2.3. RIGHT$ - ф у н к ц и я
-
- Общий вид функции: RIGHT$(α,n)
+ Общий вид функции: RIGHT$(α,n) ,
где: RIGHT ("right"-"правый") - служебное слово;
α - строковое выражение;
n - арифметическое выражение, целая часть значения которого должна
чения строкового выражения α (в этом смысле функция RIGHT$() симметрич-
на функции LEFT$()!).
RIGHT$ - функция является частным случаем MID$ -функции и через нее мо-
-жет быть определена так: RIGHT$(α,n) = MID$(α,L-n+1,n)
+жет быть определена так: RIGHT$(α,n) = MID$(α,L-n+1,n) ,
где L - длина значения строкового выражения α.
-
П р и м е р ы:
─────────────
1) Ok 2) Ok
? RIGHT$("abcdgoldfish",8) ? RIGHT$("гамбит",3)
goldfish └──────┘ бит └─┘
Ok Ok
-
3) Ok 4) Ok
10 INPUT X$,N ? RIGHT$(LEFT$("рубa
20 U$=MID$(X$,LEN(X$)-N+1) йте!",6),4)
? 1234567890,4 5) ? MID$("рубайте!",3,4)
78907890 байт └──┘
Ok Ok
-
Заметим, что хотя функции LEFT$ и RIGHT$ являются "частными случаями"
функции MID$, их нельзя использовать с л е в а от символа присваивания в
операторе LET!
Кортик
Syntax error in 2
Ok
-
П р и м е р 6. Образовать слово Y$, состоящее из первых N и последних
───────────── К символов данного слова Х$.
Первоначальный вариант программы выглядит так:
Строка 15 обеспечивает повторный запрос на ввод исходных данных в том
случае, когда K<0 или К> длины слова Х$, или N<0, или N>длины слова X$
(своеобразная "защита"программы от непредусмотренной исходной информации).
-
П р и м е р 7. Написать программу перевода чисел, записанных римскими
───────────── цифрами, в числа, записанные арабскими цифрами.
NEW
4 904 3691 1917 1812
Ok Ok Ok Ok Ok
А как насчет программы обратного перевода? Пожалуйста!
-
П р и м е р 8. Написать программу перевода чисел, записанных арабскими
───────────── цифрами, в числа, записанные римскими цифрами.
NEW
Ok Ok Ok Ok
-
IV.2.4. STRING$ - ф у н к ц и я
-
Общий вид STRING$ -функции следующий:
STRING$(n,α) или STRING$(n,m) ,
где: STRING ("string"-"строка") - служебное слово;
Таким образом, с помощью STRING$ - функции можно назначать длину и про-
водить инициализацию строковых переменных пробелами. Приведем несколько
тривиальных примеров:
-
1) Ok
Y$=STRING$(10,"*"):? LEN(Y$):? "#"+Y$+"FILE"
10
#**********FILE
Ok
-
2) Ok
print STRING$(10,52);STRING$(10,CHR$(52))
44444444444444444444
Ok
-
3) Ok
A$=STRING$(5," "):MID$(A$,3,3)="Все!":? A$
··Все
Ok
-
Если n=0, то функция STRING$ возвращает пустую строку (""), независимо
от того, какие α или m Вы задали.
В тех случаях, когда целые части значений арифметических выражений n и
m находятся вне отрезка [0,255],на экране дисплея появляется сообщение об
ошибке: "Illegal function call"
("Н е д о п у с т и м ы й в ы з о в ф у н к ц и и").
-
-
-
+
IV.2.5. SPACE$ - ф у н к ц и я
-
- Общий вид функции: SPACE$(n)
+ Общий вид функции: SPACE$(n) ,
где: SPACE ("space"-"пространство") - служебное слово;
n - арифметическое выражение, целая часть значения которого должна
принадлежать отрезку [0,255].
SPACE$-функция является частным случаем STRING$-функции и через нее мо-
жет быть определена так: SPACE$(n)=STRING$(n," ")
-
-
IV.2.6. П р и м е р ы
-
1) выделить из текста,являющегося значением строковой переменной T$,от-
дельные слова (они отделены друг от друга одним пробелом) и записать их
в строковый массив с именем W$. (Психологи утверждают, что из минуты, за-
run
123 4 567
123·····4·····567
- Ok
-
-
- Елечвок енмяет ослог.
+ Ok Елечвок енмяет ослог.
А.Вознесенский. Человек
-
-
2) даны два слова X$ и Y$. Проверить, можно ли из символов, входящих в
слово X$, составить слово Y$. Символы можно переставлять, и каждый символ
можно использовать несколько раз!
? 12345432,1236 ? 1234554320,1022
Нельзя! Можно!
Ok Ok
-
4) число 41 обладает следующим свойством: 41²=1681,√16=4 и √81=9, т.е.
числа 16 и 81 - точные квадраты; найти все натуральные числа, не превосхо-
дящие N,и такие, что первые две и последние две цифры квадрата числа явля-
Сколько чисел необходимо проверить? 100
Интересующие Вас числа: 41
Ok
-
5) написать программу, которая заменяет часть слова Z$ текста T$ на
текст Y$ с сохранением одного пробела между словами.
NEW
·································
Мама очень любила Эмму
Ok
-
6) составьте программу, в результате работы которой выяснялось бы, мож-
но ли переставить цифры десятичной записи числа K так,чтобы они образовы-
вали арифметическую или геометрическую прогрессию.
NEW
Ok
- 10 CLS:DIM K,M%,D%,Q,F$:INPUT"Введите нат. число";K
+ 10 CLS:DIM K,M%,D%,Q,F$:INPUT"Введите натуральное число";K
30 F$=STR$(K):M%=LEN(F$):DIM A(M%)
40 FOR I=1 TO M%:A(I)=VAL(MID$(F$,I,1)):NEXT
50 FOR I=2 TO M%-1:FOR J=I+1 TO M%
Арифм.прогрессия есть! Арифм.прогрессия есть!
Геом.прогрессии нет Геом.прогрессия есть!
Ok Ok
-
7) составить программу, которая m-кратно повторяет каждый символ в сло-
ве X$.
NEW
Укажите число повторений символов? 2
Вы этого хотели? ккееррппккппрр
Ok
-
8) составить программу вывода всех натуральных чисел, меньших N, сумма
квадратов цифр которых равна M.
NEW
? 123,65
·18··47··74··81··108
Ok
-
9) по данному натуральному N найдите наименьшее из чисел, имеющих сто-
лько же и таких же цифр, что и N, если известно, что каждую цифру числа N
можно использовать при записи один раз.
В каком числе хотите перетрясти цифры? 112235799435213
Не озоруй!
В каком числе хотите перетрясти цифры? ...
-
10) написать программу, устанавливающую, какие из натуральных чисел,не
большие заданного натурального M, делятся на каждую свою цифру.
10 DEFINT I,J,M:DEFSTR A:INPUT M
? 40
·1··2··3··4··5··6··7··8··9··11··12··15··22··24··33··36
Ok
-
11) определите,сколько цифр используется в записи натурального числа X
только по одному разу.
П е р в ы й способ. В т о р о й способ
10 INPUT X:X$=STR$(X) 10 INPUT"Введите число";X$
20 K=0 20 L=LEN(X$):P=L
30 FOR J=2 TO LEN(X$) 30 FOR I=1 TO L:FOR J=1TO L
- 40 P=0 40 IFMID$(X$,I,1)=MID$(X$,J
- 50 FOR I=2 TO LEN(X$) ,1)ANDI<>J THEN P=P-1:NEXTI
+ 40 P=0 40 IFMID$(X$,I,1)=MID$(X$,J,1)
+ 50 FOR I=2 TO LEN(X$) ANDI<>J THEN P=P-1:NEXTI
60 IF MID$(X$,J,1)=MID$(X$,I,1) ELSE NEXT J,I
THEN P=P+1 50 PRINT"Цифр,используемых
70 NEXTI 1 раз:";P
? 45687345976
K= 3
Ok
-
12) из каждого слова массива C$(N) слов вычеркнуть те символы, которые
употребляются при написании каждого из слов массива.
NEW
Вот 3 слово:сон - не правда ли?
Вот 4 слово:ортфель - не правда ли?
Ok
-
13) определить количество р а з л и ч н ы х букв,встречающихся в сло-
ве A$ более одного раза.
NEW
1 1 3 0
Ok Ok Ok Ok
- IV.3. ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ . ОПЕРАТОР DEF FN
+ IV.3. ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ . ОПЕРАТОР DEF FN
Язык MSX-BASIC предоставляет возможность программисту (пользователю)
о п р е д е л я т ь в составляемой им программе одну или несколько "соб-
Ok
Напомним, что и с п о л н я е м ы м оператором мы называем оператор
программы, определяющий конкретные действия, которые должны быть выполнены.
- Оператор DEF FN может стоять в любом месте программной строки.Однако,он,
+ Оператор DEF FN может стоять в любом месте программной строки.Однако он,
в отличие от оператора DATA,- и с п о л н я е м ы й оператор, т.е. функция
пользователя должна быть определена до обращения к ней. Если же обращение
к функции пользователя произведено раньше ее определения оператором DEF FN,
Другими словами, компьютер выполнит над значениями фактических аргумен-
тов (параметров) все те действия,которые оператор DEF FNα выполняет над
своими формальными аргументами.
-
П р и м е р ы:
─────────────
1) Ok
50 PRINT S:END
run
175
- Ok
- Ф о р м а л ь н ы й параметр X
+ Ok Ф о р м а л ь н ы й параметр X
2) NEW │ │
Ok ▼ ▼
10 DEF FNA(X)=X*7
? 2,-3,5
18
Ok
-
4) NEW 5)NEW
Ok Ok
10 DEF FNS$(X$,K)=MID$(X$,K,1) 10 INPUT X:IF X>1 TH
P$ t$ ? 2 ? -12
Ok Ok 4 -1728
Ok Ok
-
6) 10 'Функция FNODD$(N) помогает проверить,является ли целое число N
нечетным:если значением функции является -1, то число N - нечетное,
если же значением функции является 0, то число N - четное.
20 DEF FNODD(N)=RIGHT$(BIN$(N),1)="1"
Отметим, что можно определить 4 различные функции пользователя,имеющие
одинаковое имя, но различающиеся по типам.
-
7) NEW
Ok
10 DEF FNQ%=1:DEF FNQ!=2:DEF FNQ=3:DEF FNQ$="4"
кции (несоответствие типов формальных и фактических параметров при обраще-
нии к функции пользователя ──▶ ошибка ──▶ обработка прерывания по ошибке
("ловушка" ошибки) ──▶ изменение типа функции пользователя).
-
- 8) NEW
- Ok
+ 8) Ok
5 ON ERROR GOTO 100
10 DEF FNY(X)=X^3
15 DEF FNY$(X$)=X$+"(Козьма Прутков)"
м ы , то DEFFN - один из нескольких операторов, которые нельзя использо-
вать в режиме прямого выполнения команд (это пример о п е р а т о р а ,ко-
торый не является к о м а н д о й !).
-
- 9) Ok
- DEF FNR(X)=X^5:PRINT FNR(2)
+ 9) DEF FNR(X)=X^5:PRINT FNR(2)
Illegal direct
Ok
Сообщение об ошибке "Illegal direct" означает, что в качестве команды
использована неверно заданная функция, а не на ту строку , где эта функ-
ция была определена!
-
-
IV.4. ПОДПРОГРАММЫ
-
Прежде всего отметим, что п о д п р о г р а м м ы - это специальным
образом оформленные группы программных строк. Подпрограммы бывают двух ти-
пов: с т а н д а р т н ы е и н е с т а н д а р т н ы е .
ются на этих аксиомах.
Общая форма записи оператора обращения к подпрограмме (оператора вызо-
ва подпрограммы) следующая:
- GOSUB n
+ GOSUB n ,
где: GOSUB ("GO to SUBroutine"-"идти к подпрограмме") - служебное слово;
n - номер первой строки подпрограммы, 0≤n≤65529.
Разумеется, нежелательно, чтобы строка с номером n находилась внутри
"Undefined line number"
("Н е о п р е д е л е н н о м е р с т р о к и").
Подпрограмма, как правило (!), завершается оператором
- RETURN
-где RETURN ("return"-"возврат") - служебное слово.
+ RETURN [m] ,
+где: 1) RETURN ("return"-"возврат") - служебное слово;
+ 2) m - номер существующей программной строки, которой должно быть пе-
+редано управление после выполнения подпрограммы.
Оператор GOSUB n используется для вызова подпрограммы - группы операто-
ров, начинающихся программной строкой с номером n и заканчивающихся опе-
ратором RETURN. Подпрограмма может начинаться с комментария и находиться
в любом месте Вашей программы.
Главной особенностью оператора GOSUB является то, что оператор RETURN
-возвращает управление оператору,стоящему за последним выполненным операто-
-ром GOSUB. Заметим,что оператор, которому возвращается управление, может
-находиться не на следующей, а на той же программной строке!
+(без параметра m) возвращает управление оператору, стоящему за последним
+выполненным оператором GOSUB. Заметим,что оператор, которому возвращается
+управление, может находиться на той же программной строке, что и GOSUB !
Приведем пример:
Ok Ok ┌──────────────────┐
100 X=2 100 X=2 ▼ │
Образно говоря, переменные,имеющие одно и то же имя в основной (вызыва-
ющей) программе и подпрограмме не "однофамильцы", а одно и то же лицо!
При вызове подпрограммы значения переменных в основной программе не"за-
-мораживается", а могут быть изменены операторами подпрограммы! Без "замо-
+мораживаются", а могут быть изменены операторами подпрограммы! Без "замо-
раживания" то и дело происходят пренеприятнейшие вещи.
Представьте себе,что Вы подарили своему товарищу очень ценную для него
подпрограмму и объяснили, как ею пользоваться. Разумеется,Вашему товарищу
run
·7··7.5··7
Ok
-
Наиболее распространенной ошибкой при использовании подпрограмм являет-
ся их неполное отделение от основной программы. Основными способами защи-
ты от указанной ошибки являются:
Например, 50 RETURN '──▶ или 50 RETURN ──▶ .
Поговорим теперь о совместном использовании операторов FOR...NEXT
и GOSUB n.
- Внутри цикла использовать оператор GOSUB, м о ж н о, но оператор NEXT
+ Внутри цикла использовать оператор GOSUB м о ж н о, но оператор NEXT
должен быть выполнен только п о с л е выполнения оператора RETURN.
В противном случае последует сообщение:
"NEXT without FOR" ("NEXT б е з FOR").
-
П р и м е р.
───────────
NEW
? 2,6 ? 0,6
NEXT without FOR in 100 ·1··2··3··4··5··6
Ok Ok
-
С другой стороны, если цикл FOR...NEXT используется в подпрограмме, то
оператор RETURN, находящийся в цикле FOR...NEXT, позволяет выйти из цикла
и вернуться в основную программу. Это наводит на мысль,что наиболее эффек-
Однако учтите, что в момент выполнения оператора RETURN [k] любой неза-
конченный цикл FOR ... NEXT в подпрограмме заканчивается и часть стеково-
го пространства, которое он (цикл) занимал, освобождается!
-
П р и м е р. Вывести на экран дисплея первое нечетное число,встретивше-
─────────── еся в целочисленном массиве A(K).
NEW
? 3 ? 5
1 1
Ok Ok
-
При многократном выполнении выхода из подпрограмм с помощью операторов
GOTO, ON GOTO или IF...THEN...ELSE (вместо оператора RETURN) в конце кон-
цов на экране может появиться сообщение об ошибке:
ве подпрограммы, так что в результате размер стека может превысить величи-
ну отведенного ему участка памяти. В итоге программа прекращает работу, и
выдается сообщение об ошибке.
-
П р и м е р. 10 GOSUB 20:END
─────────── 20 FOR I=1 TO 1:K=K+1:GOTO 10:NEXTI:RETURN
run а теперь... print K
- Out of memory in 100 ·894
+ Out of memory in 10 ·894
Ok Ok
В программе может быть несколько операторов RETURN, относящихся к одно-
му оператору GOSUB n . Отметим,что наличие оператора RETURN в некотором
месте подпрограммы еще не означает фактического окончания подпрограммы в
данном месте.
-
П р и м е р. Написать программу,вычисляющую значение функции y=│ x+x²│
─────────── в точке x=A(не применяя функции ABS()).
NEW
12
Ok
Подпрограмма может, в свою очередь, вызывать другую подпрограмму, та -
-другую и так далее. Глубина вложения (степень вложения) подпрограмм огра-
-ничивается лишь размерами стека.
+следующую и так далее. Глубина вложения (степень вложения) подпрограмм ог-
+раничивается лишь размерами стека.
Наглядно это можно представить себе следующим образом. Пусть Вас
из Куйбышева послали в Москву на повышение квалификации, а оттуда еще в
Ленинград на курсы. По окончании этих курсов Вы возвращаетесь в Москву,за-
2
Ok
- IV.4.1. П р и м е р ы
+ П р и м е р ы
-
- П р и м е р 1. Написать программу, вычисления числа сочетаний из m
- ───────────── по n по формуле:
+ П р и м е р 1. Написать программу вычисления числа сочетаний из m
+ ───────────── элементов по n , используя формулу
n m!
С = ──────── , (m≥n).
m n!(m-n)!
Введите значения m,n? 6,3
Число сочетаний из M= 6 по N= 3 равно 20
Ok
-
Заметим, что оператор GOSUB может оказаться полезным в качестве коман-
ды прямого режима. Если Ваша программа состоит из подпрограмм, которые Вы
хотите проверить, то, используя команду GOSUB в прямом режиме,можно войти
print F
24
Ok
-
-
Ибо это недостойно совершенства человеческого,
подобно рабам тратить часы на вычисления.
- Г.В.Лейбниц
-
-
+ Г.Лейбниц
П р и м е р 2. Составить программу, которая позволяет методом половин-
───────────── ного деления (дихотомии) на отрезке [A,B] с точностью
E определить какой-либо (!) вещественный корень уравнения F(x)=0, где
? 1,3,.00001
Корень···1.27163·точность·1Е-05
Оk
-
П р и м е р 3. Если у Вас есть знакомый художник, попросите его разде-
───────────── лить произвольный отрезок на две неравные части. Возмож-
но он сделает это в золотом отношении, если его чувство меры воспитано на
Y мин=-10.999971821564 при x=
3.999996477694
Ok
-
П р и м е р 4. Вычислить π
───────────── 1 ⎧ ┌ sin(10·x)┐6
-·│ │──────────│ dx
Количество точек? 250 Количество точек? 500
Интеграл = 55251.99567425 Интеграл = 55251.995674258
Ok Ok
-
П р и м е р 5. Написать программу, осуществляющую лексикографическое
───────────── упорядочение (расположение в алфавитном порядке) масси-
ва фамилий на русском языке (после фамилий можно указывать инициалы,напри-
·1··2··3··5··7··11··13··17··31··37··71··73··79··97
Надеюсь, Вы остались довольны?
Ok
-
П р и м е р 7.
─────────────
10'****************************************************
Ok
+
У попа была собака, он ее любил.
Она съела кусок мяса - он ее убил!
Убил и закопал, и надпись написал:
"У попа была собака, он ее любил.
Она съела кусок мяса - ..."
Из русского народного фольклора
-
-
Допустимо использование рекурсивных подпрограмм.
Р е к у р с и е й называется обращение подпрограммы (функции) к самой
себе непосредственно или посредством других подпрограмм. Такие программы
(функции) называются р е к у р с и в н ы м и. Само слово "рекурсия" озна-
чает "возвращение" (лат. "recursio").
В программировании различают два типа рекурсии - рекурсивное определе-
-ние или п р я м у ю рекурсию и рекурсивное использование или к о с -
+ние, или п р я м у ю рекурсию и рекурсивное использование, или к о с -
в е н н у ю рекурсию.
Рекурсивное использование - это способ описания процесса через подпро-
цессы, идентичные основному процессу, а рекурсивное определение - способ
программ, несмотря на то, что коварство рекурсии проявляется в том,что бы-
вает довольно трудно заметить дефект программы или алгоритма,а в цикличес-
ком процессе все на виду!
-
П р и м е р 2. Пользуясь рекуррентной формулой
───────────── 0 m n-m+1 m-1
C = 1 ; C = ────── · C ,(∗)
? 232,231 ? 233,232 ? 4080,4079 print m
232 0 ◀── ?! Out of memory in 100 2
Ok Ok Ok Ok
-
П р и м е р 3 [6].
─────────────
NEW
туацию, при которой первая подпрограмма вызывает вторую, а та в свою оче-
редь вызывает первую!
-
-
IV.5. ОПЕРАТОР ON GOSUB
-
Кроме оператора перехода на подпрограмму в MSX-BASIC есть оператор вы-
бора подпрограмм (оператор-"переключатель").
- Его общий вид: ON β GOSUB n1,n2,...nk
+ Его общий вид: ON β GOSUB n1,n2,...nk ,
где: ON("на"),GOSUB("to GO to SUBroutine"-"идти к подпрограмме") - служеб-
ные слова;
β - арифметическое выражение;
Если p<0, то компьютер выдает сообщение об ошибке:
"Illegal function call".
+
П р и м е р 1.
─────────────
NEW
20 INPUT "Ваш выбор (1-3)";CH
27 ON CH GOSUB 31,32,33:END
31 PRINT "1":RETURN'Попадаем сюда, если CH=1
- 32 PRINT "2"'RETURN'Попадаем сюда, если CH=2
- 33 PRINT "3"'RETURN'Попадаем сюда, если CH=3
+ 32 PRINT "2": RETURN 'Попадаем сюда, если CH=2
+ 33 PRINT "3": RETURN 'Попадаем сюда, если CH=3
run
Ваш выбор (1-3)? 2
2
В ы в о д ы [8]. При применении подпрограмм BASIC придерживайтесь сле-
─────────────── дующих правил:
1. Четко обозначайте начало и конец каждой подпрограммы. Если это воз-
-можно, выделяте их путем отступа операторов вправо.
+можно, выделяйте их путем отступа операторов вправо.
+
2. Никогда не пользуйтесь оператором GOTO для входа в подпрограмму и
для выхода из нее. Каждую подпрограмму надо рассматривать как независимый
логически завершенный м о д у л ь .
+
3. Имейте под рукой список глобальных входных переменных и выходных ре-
зультатов каждой подпрограммы. Лучше всего оформить его комментариями к
программе с помощью операторов REM .
+
4. Обязательно убедитесь, что в подпрограмме не изменяются значения та-
ких внешних переменных, как счетчики циклов. Если это возможно, в каждой
подпрограмме вводите свой принцип именования внутренних переменных.
- 5. В отличии от функций, подпрограммы не появляются в программе до то-
+
+ 5. В отличие от функций подпрограммы не появляются в программе до то-
го, как ими будут пользоваться, поэтому полезно группировать подпрограммы
вместе после оператора END, указанного в конце основной программы.
+\page
+ IV.6. Д о п о л н е н и е 1 [77]
- Д о п о л н е н и е 1 [77]. Программа позволяет умножить два числа,
- ────────────────────────── причем каждое из них может иметь "л ю -
-б о е" количество цифр при следующих ограничениях: в произведении должно
-содержаться не более 765 цифр и длина каждого из чисел должна быть ограни-
-чена возможной длиной строки.
+ Программа позволяет умножить два числа, причем каждое из них может
+иметь "л ю б о е" количество цифр при следующих ограничениях: в произве-
+дении должно содержаться не более 765 цифр,и длина каждого из чисел долж-
+на быть ограничена возможной длиной строки.
В заключение отметим, что приведенная программа работает неправильно
либо когда одно из введенных чисел меньше 10, либо когда их произведение
меньше 1000. Безусловно имеет смысл сделать программу "защищенной" в этом
print 12345678*987654321
1.2193262222375E+16
Ok
+\page
run
Точное произведение целых чисел
Введите первое число: 11111111111111111111
, 74, 74, 74, 74, 74, 73,333,333,333,33
3,333,333,325,925,925,925,925,925,926
Ok
+
print 11111111111111111111*6666666666666666666666666666666666666666
7.4074074074074E+58
Ok
- Д о п о л н е н и е 2[90]. Нахождение факториалов "огромных" чисел.
- ──────────────────────────
+
+
+
+ IV.7. Д о п о л н е н и е 2 [90]
+
+ Программа, позволяющая находить факториалы "огромных" чисел ( >1).
+
10 DIM A(100):PRINT"Введите число N":INPUT N:A(1)=1:J=1
60 FOR I=2 TO N
80 P=0
? 23
23!=25852016738884976640000
Ok
+
run
Введите число N
? 50