====== Глава IV ====== |{{..author_files:004.msx|}}|{{..author_files:004.txt|}}|[[..004|]]| @@ -1,13 +1,10 @@ -c1E +\/d ГЛАВА IV. ФУНКЦИИ И ПОДПРОГРАММЫ - - +\/d- Любая по-настоящему полезная классификация содержит от трех до шести категорий. Энон - - В MSX-BASIC различают следующие основные типы функций: 1) встроенные функции: а) встроенные числовые функции; @@ -24,11 +21,8 @@ Заметим, что встроенные ч и с л о в ы е функции мы уже изучили (см. раздел I.7.4.)! - - IV.1. ВСТРОЕННЫЕ ФУНКЦИИ ПРЕОБРАЗОВАНИЯ - Напомним, что множество значений строковых переменных - это множество упорядоченных наборов символов. Упорядоченность означает, что строковые значения различаются не только набором, но и последовательностью символов, @@ -43,19 +37,15 @@ значается " "(между кавычками есть пробел) и имеет длину 1. Отметим, что символ "пробел" - равноправный с остальными символ! - - IV.1.1. LEN - ф у н к ц и я - - Ее общий вид LEN(α) + Ее общий вид LEN(α) , где: LEN ("LENgth"-"длина") - служебное слово; α - строковое выражение. Результатом функции LEN(α) является длина значения строкового выраже- ния α (или что то же самое,количество символов в строке α),LEN(α)∈[0,255]. Напомним, что в том месте дисплейной строки,где надо обратить Ваше вни- мание на наличие символа пробел (" "), мы будем использовать символ "·". - П р и м е р 1. ───────────── NEW @@ -70,11 +60,9 @@ переменными. С ее помощью, например, можно определить,не является ли стро- ка пустой до выполнения действий, которые не могут выполняться над пустой строкой (""). - П р и м е р 2. 10 IF LEN(A$)>0 THEN PRINT "Все в порядке!" ELSE PRINT ───────────── "Строка пустая!" 'Проверка, является ли строка пустой, т.е. не содержащей ни одного символа. - П р и м е р 3. NEW ───────────── Ok 10 'Выравнивание слов по правому краю. @@ -86,16 +74,13 @@ ··········фанатичный ·········программист Ok - Сравните функцию LEN() с функцией длин (А), где длин(А) - длина текс- ──── ──── та A, в школьном алгоритмическом языке [11, с.53]! - IV.1.2. INSTR - ф у н к ц и я - Общий вид функции INSTR: INSTR([n,]α,β) Здесь: INSTR("IN STRing"-"в строке") - служебное слово; @@ -136,11 +121,8 @@ 1 Illegal function call in 20 Ok Ok - - IV.1.3. VAL - ф у н к ц и я - Ц и ф р о в а я строка - это строка,содержащая любое количество распо- ложенных в любом месте строки пробелов, знак "плюс" или "минус", десятич- ные цифры и десятичную точку. @@ -154,102 +136,84 @@ В ряде случаев удобнее работать с числами, а не с их представлениями в виде цифровых строк. Цифровую строку можно преобразовать в числовое значе- ние с помощью функции преобразования 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 @@ -261,23 +225,19 @@ 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 @@ -309,9 +269,8 @@ 9 8 ▲ Ok Ok │ 16 символов - - 15) найти наибольшую из цифр,встречающуюся в десятичной записи данного -натурального числа M более одного раза. + 15) найдите наибольшую из цифр, встречающуюся в десятичной записи дан- +ного натурального числа M более одного раза. NEW Ok 10 INPUT М @@ -331,21 +290,17 @@ 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 @@ -353,7 +308,6 @@ ? π ? αδβ ? ; ? "," ? ♪ ◀─ символ, π 163 αδβ 160 ; 59 , 44 ♪ 1 имеющий Ok Ok Ok Ok Ok двойной код - Из приведенного примера ясно, что символ "π", например, имеет десятич- ный код 163,а символ "α"(первый символ значения строковой константы"αδβ") - десятичный код 160. @@ -372,12 +326,9 @@ Снова неудача! Не волнуйтесь, код символа "кавычка" можно получить кос- венным путем с помощью функции преобразования CHR$. - - IV.1.6. CHR$ - ф у н к ц и я - - Общий вид функции: CHR$(α) + Общий вид функции: CHR$(α) , где: CHR("CHaRacter"-"символ") - служебное слово; α - арифметическое выражение. Вначале компьютер вычисляет к о д - целую часть значения выражения α. @@ -387,27 +338,22 @@ вол, соответствующий полученному коду (говорят, что функция 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) @@ -427,7 +373,6 @@ 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 @@ -443,13 +388,11 @@ печатаемыми "символами" (BS, SELECT, RETURN, клавиши управления курсором). - IV.1.7. BIN$ - ф у н к ц и я - BIN$-функция применяется для преобразования целого числа в двоичную символьную строку. Ее общий вид: - BIN$(α) + BIN$(α) , где: BIN ("BINary"-"двоичный") - служебное слово; α - арифметическое выражение. Вначале вычисляется значение арифметического выражения α; результат @@ -467,21 +410,17 @@ Обозначим целую часть значения выражения α буквой 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$ @@ -493,10 +432,8 @@ Первое число, второе число? 1111111111111111,1 Ответом является:0000000000000000 или 0 десятичное Ok - Неизвестные Вам пока строковые функции RIGHT$ и STRING$ рассмотрены ни- же в разделах IV.2.3. и IV.2.4. - 4) среди простых чисел, не превосходящих N , найти такое, в двоичной записи которого максимальное число единиц. NEW @@ -515,7 +452,6 @@ 1 1 ·7·111 ·17·10001 3 11 ·11·1011 ·3··7 5 101 ·13·1101 Ok - 5) выделить старший и младший байты двоичного числа A% NEW Ok @@ -527,20 +463,17 @@ run Введите число А% (не более 16 двоичных цифр)? &B1011110001010011 10111100 01010011 ▲ - Ok │ число отрицательное! + Ok └ число отрицательное! run Введите число А% (не более 16 двоичных цифр)? &B0011110001010000 00111100 01010000 ▲ - Ok │ число положительное! - - + Ok └ число положительное! IV.1.8. OCT$ - ф у н к ц и я - OCT$-функция служит для преобразования числа в восьмеричную символьную строку. Ее общий вид: - OCT$(α) + OCT$(α) , где: OCT ("OCTal-"-"восьмеричный-") - служебное слово; α - арифметическое выражение. Эта функция вычисляет значение арифметического выражения α, преобразу- @@ -551,12 +484,10 @@ В противном случае результат преобразуется в символьную строку, представ- ляющую его значение в восьмеричной системе счисления. Максимальная длина строки-результата OCT$() - 6 символов (6 байтов). - П р и м е р. Ok ─────────── print OCT$(&HFFFF) 177777 Ok - Обозначим буквой N целую часть значения выражения α. Если N принадлежит диапазону [0,65535],то значение функции OCT$() нахо- дится компьютером без обращения к дополнительному коду, например: @@ -574,7 +505,6 @@ ? OCT$(-32768) сравните с print OCT$(32768) 100000 100000 Ok Ok - З а д а ч а. Попытайтесь научить компьютер "восьмеричной" арифметике. ─────────── Используйте для этой цели идею следующего фрагмента: print VAL("&O"+OCT$(100)) @@ -582,14 +512,11 @@ Ok И, наконец ... - - IV.1.9. HEX$ - ф у н к ц и я - HEX$-функция служит для преобразования целого числа в шестнадцатерич- ную символьную строку. Ее общий вид: - HEX$(α) + HEX$(α) , где: HEX ("HEXadecimal-"-"шестнадцатеричный-") - служебное слово; α - арифметическое выражение. Вначале вычисляется N - целая часть значения арифметического выраже- @@ -601,7 +528,7 @@ Если целое число N находится на отрезке [0,65535], то преобразование элементарно: HEX$(0) возвращает "0" , HEX$(65535) возвращает "FFFF" . - Однако, значение функции при отрицательных N,принадлежащих [-32768,-1], + Однако значение функции при отрицательных N, принадлежащих [-32768,-1], вычисляется компьютером с использованием дополнительного кода, т.е. с при- менением рекуррентной формулы: HEX$(N)=HEX$(65536+N); @@ -614,7 +541,6 @@ ───────────── ? VAL("&h"+HEX$(3)) ? VAL("&H"+HEX$(-10)) 3 -10 Ok Ok - Существование функции HEX$() делает возможным "обучение" компьютера шестнадцатеричной арифметике. Единственная трудность состоит в добавлении к числу нулей, стоящих в старших разрядах (если, конечно,это необходимо!). @@ -664,6 +590,9 @@ + + + IV.2. ВСТРОЕННЫЕ СТРОКОВЫЕ ФУНКЦИИ @@ -671,17 +600,19 @@ Космос с болью сочился над разбитой любовью, Был из скрытных людей свет твой медленно изгнан, И небо не спало. - Избранные стихотворения компьютера 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 - арифметические выражения, целые части значений которых должны @@ -693,9 +624,7 @@ чать соответственно M и N. По умолчанию N равно количеству символов значения строкового выражения α от позиции M и до конца строки включительно. - Рассмотрим два возможных случая. - 1. Функция MID$ с л е в а от знака равенства в операторе присваива- ния LET. ┌───────────────────────────────────┐ │ [LET] MID$(α,m[,n]) = β │ @@ -709,12 +638,6 @@ ражения α остаются без изменений (см. рис.1). - - - - - - 1-й 2-й М-й (М+1)-й (M+N-1)-й LEN(α)-й символ символ символ символ символ символ │ │ │ │ │ │ @@ -794,12 +717,10 @@ ? 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" @@ -814,14 +735,12 @@ ? 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 @@ -833,13 +752,11 @@ ? информатика,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 @@ -852,7 +769,6 @@ ? БАОБАБ,БА 2 Ok - П р и м е р 10. Написать программу, заменяющую в слове X$ слово Z$ на ────────────── слово Y$ той же длины. NEW @@ -867,14 +783,11 @@ ?? КИРПИЧНЫЙ ?? БАНАНОВЫЙ ДОМ БАНАНОВЫЙ - Оk - - - Косо лети же, житель осок. Я разуму уму заря, Мечтатель! Летать чем? - В.Хлебников Я иду с мечом судия. С.Кирсанов - Г.Р.Державин - - + Оk Я разуму уму заря, + Я иду с мечом судия. + Г.Державин + Мечтатель! Летать чем? + С.Кирсанов П р и м е р 11. Слова и фразы,переходящие в себя при "акустическом ото- ────────────── бражении", получили название п а л и н д р о м о в. Это слово греческого происхождения и означает "движущийся обратно", "обра- @@ -892,7 +805,6 @@ ? косолетижежителосок ? мечтателлетатчем ? я разуму уму заря Палиндром! Палиндром! Не палиндром! Ok Ok Ok - Сравните результат действия функции MID$(A$,I,J),стоящей справа от зна- ка равенства в операторе присваивания, с результатом операции в ы р е з- к и: A[i:i+j-1] , @@ -911,8 +823,7 @@ IV.2.2. LEFT$ - ф у н к ц и я - - Общий вид функции: LEFT$(α,n) + Общий вид функции: LEFT$(α,n) , где: LEFT ("left"-"левый") - служебное слово; α - строковое выражение; n - арифметическое выражение, целая часть значения которого должна @@ -921,7 +832,6 @@ строкового выражения α . LEFT$ - функция является"частным случаем" MID$- функции и через нее мо- жет быть определена так: LEFT$(α,n) = MID$(α,1,n) . - П р и м е р ы: ───────────── 1) Ok 3) Ok @@ -933,18 +843,14 @@ ? 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 - арифметическое выражение, целая часть значения которого должна @@ -953,16 +859,14 @@ чения строкового выражения α (в этом смысле функция 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) @@ -971,7 +875,6 @@ ? 1234567890,4 5) ? MID$("рубайте!",3,4) 78907890 байт └──┘ Ok Ok - Заметим, что хотя функции LEFT$ и RIGHT$ являются "частными случаями" функции MID$, их нельзя использовать с л е в а от символа присваивания в операторе LET! @@ -984,7 +887,6 @@ Кортик Syntax error in 2 Ok - П р и м е р 6. Образовать слово Y$, состоящее из первых N и последних ───────────── К символов данного слова Х$. Первоначальный вариант программы выглядит так: @@ -1016,7 +918,6 @@ Строка 15 обеспечивает повторный запрос на ввод исходных данных в том случае, когда K<0 или К> длины слова Х$, или N<0, или N>длины слова X$ (своеобразная "защита"программы от непредусмотренной исходной информации). - П р и м е р 7. Написать программу перевода чисел, записанных римскими ───────────── цифрами, в числа, записанные арабскими цифрами. NEW @@ -1033,7 +934,6 @@ 4 904 3691 1917 1812 Ok Ok Ok Ok Ok А как насчет программы обратного перевода? Пожалуйста! - П р и м е р 8. Написать программу перевода чисел, записанных арабскими ───────────── цифрами, в числа, записанные римскими цифрами. NEW @@ -1049,10 +949,8 @@ Ok Ok Ok Ok - IV.2.4. STRING$ - ф у н к ц и я - Общий вид STRING$ -функции следующий: STRING$(n,α) или STRING$(n,m) , где: STRING ("string"-"строка") - служебное слово; @@ -1073,36 +971,29 @@ Таким образом, с помощью 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]. @@ -1113,11 +1004,8 @@ SPACE$-функция является частным случаем STRING$-функции и через нее мо- жет быть определена так: SPACE$(n)=STRING$(n," ") - - IV.2.6. П р и м е р ы - 1) выделить из текста,являющегося значением строковой переменной T$,от- дельные слова (они отделены друг от друга одним пробелом) и записать их в строковый массив с именем W$. (Психологи утверждают, что из минуты, за- @@ -1139,13 +1027,8 @@ run 123 4 567 123·····4·····567 - Ok - - - Елечвок енмяет ослог. + Ok Елечвок енмяет ослог. А.Вознесенский. Человек - - 2) даны два слова X$ и Y$. Проверить, можно ли из символов, входящих в слово X$, составить слово Y$. Символы можно переставлять, и каждый символ можно использовать несколько раз! @@ -1184,7 +1067,6 @@ ? 12345432,1236 ? 1234554320,1022 Нельзя! Можно! Ok Ok - 4) число 41 обладает следующим свойством: 41²=1681,√16=4 и √81=9, т.е. числа 16 и 81 - точные квадраты; найти все натуральные числа, не превосхо- дящие N,и такие, что первые две и последние две цифры квадрата числа явля- @@ -1201,7 +1083,6 @@ Сколько чисел необходимо проверить? 100 Интересующие Вас числа: 41 Ok - 5) написать программу, которая заменяет часть слова Z$ текста T$ на текст Y$ с сохранением одного пробела между словами. NEW @@ -1240,13 +1121,12 @@ ································· Мама очень любила Эмму 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% @@ -1273,7 +1153,6 @@ Арифм.прогрессия есть! Арифм.прогрессия есть! Геом.прогрессии нет Геом.прогрессия есть! Ok Ok - 7) составить программу, которая m-кратно повторяет каждый символ в сло- ве X$. NEW @@ -1289,7 +1168,6 @@ Укажите число повторений символов? 2 Вы этого хотели? ккееррппккппрр Ok - 8) составить программу вывода всех натуральных чисел, меньших N, сумма квадратов цифр которых равна M. NEW @@ -1303,7 +1181,6 @@ ? 123,65 ·18··47··74··81··108 Ok - 9) по данному натуральному N найдите наименьшее из чисел, имеющих сто- лько же и таких же цифр, что и N, если известно, что каждую цифру числа N можно использовать при записи один раз. @@ -1324,7 +1201,6 @@ В каком числе хотите перетрясти цифры? 112235799435213 Не озоруй! В каком числе хотите перетрясти цифры? ... - 10) написать программу, устанавливающую, какие из натуральных чисел,не большие заданного натурального M, делятся на каждую свою цифру. 10 DEFINT I,J,M:DEFSTR A:INPUT M @@ -1335,15 +1211,14 @@ ? 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 @@ -1354,7 +1229,6 @@ ? 45687345976 K= 3 Ok - 12) из каждого слова массива C$(N) слов вычеркнуть те символы, которые употребляются при написании каждого из слов массива. NEW @@ -1394,7 +1268,6 @@ Вот 3 слово:сон - не правда ли? Вот 4 слово:ортфель - не правда ли? Ok - 13) определить количество р а з л и ч н ы х букв,встречающихся в сло- ве A$ более одного раза. NEW @@ -1413,8 +1286,8 @@ 1 1 3 0 Ok Ok Ok Ok - IV.3. ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ . ОПЕРАТОР DEF FN + IV.3. ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ . ОПЕРАТОР DEF FN Язык MSX-BASIC предоставляет возможность программисту (пользователю) о п р е д е л я т ь в составляемой им программе одну или несколько "соб- @@ -1472,7 +1345,7 @@ Ok Напомним, что и с п о л н я е м ы м оператором мы называем оператор программы, определяющий конкретные действия, которые должны быть выполнены. - Оператор DEF FN может стоять в любом месте программной строки.Однако,он, + Оператор DEF FN может стоять в любом месте программной строки.Однако он, в отличие от оператора DATA,- и с п о л н я е м ы й оператор, т.е. функция пользователя должна быть определена до обращения к ней. Если же обращение к функции пользователя произведено раньше ее определения оператором DEF FN, @@ -1512,7 +1385,6 @@ Другими словами, компьютер выполнит над значениями фактических аргумен- тов (параметров) все те действия,которые оператор DEF FNα выполняет над своими формальными аргументами. - П р и м е р ы: ───────────── 1) Ok @@ -1529,8 +1401,7 @@ 50 PRINT S:END run 175 - Ok - Ф о р м а л ь н ы й параметр X + Ok Ф о р м а л ь н ы й параметр X 2) NEW │ │ Ok ▼ ▼ 10 DEF FNA(X)=X*7 @@ -1559,7 +1430,6 @@ ? 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 @@ -1570,14 +1440,12 @@ 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" @@ -1594,9 +1462,7 @@ кции (несоответствие типов формальных и фактических параметров при обраще- нии к функции пользователя ──▶ ошибка ──▶ обработка прерывания по ошибке ("ловушка" ошибки) ──▶ изменение типа функции пользователя). - - 8) NEW - Ok + 8) Ok 5 ON ERROR GOTO 100 10 DEF FNY(X)=X^3 15 DEF FNY$(X$)=X$+"(Козьма Прутков)" @@ -1614,9 +1480,7 @@ м ы , то 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" означает, что в качестве команды @@ -1628,11 +1492,8 @@ использована неверно заданная функция, а не на ту строку , где эта функ- ция была определена! - - IV.4. ПОДПРОГРАММЫ - Прежде всего отметим, что п о д п р о г р а м м ы - это специальным образом оформленные группы программных строк. Подпрограммы бывают двух ти- пов: с т а н д а р т н ы е и н е с т а н д а р т н ы е . @@ -1657,7 +1518,7 @@ ются на этих аксиомах. Общая форма записи оператора обращения к подпрограмме (оператора вызо- ва подпрограммы) следующая: - GOSUB n + GOSUB n , где: GOSUB ("GO to SUBroutine"-"идти к подпрограмме") - служебное слово; n - номер первой строки подпрограммы, 0≤n≤65529. Разумеется, нежелательно, чтобы строка с номером n находилась внутри @@ -1667,16 +1528,18 @@ "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 ▼ │ @@ -1712,7 +1575,7 @@ Образно говоря, переменные,имеющие одно и то же имя в основной (вызыва- ющей) программе и подпрограмме не "однофамильцы", а одно и то же лицо! При вызове подпрограммы значения переменных в основной программе не"за- -мораживается", а могут быть изменены операторами подпрограммы! Без "замо- +мораживаются", а могут быть изменены операторами подпрограммы! Без "замо- раживания" то и дело происходят пренеприятнейшие вещи. Представьте себе,что Вы подарили своему товарищу очень ценную для него подпрограмму и объяснили, как ею пользоваться. Разумеется,Вашему товарищу @@ -1744,7 +1607,6 @@ run ·7··7.5··7 Ok - Наиболее распространенной ошибкой при использовании подпрограмм являет- ся их неполное отделение от основной программы. Основными способами защи- ты от указанной ошибки являются: @@ -1777,11 +1639,10 @@ Например, 50 RETURN '──▶ или 50 RETURN ──▶ . Поговорим теперь о совместном использовании операторов FOR...NEXT и GOSUB n. - Внутри цикла использовать оператор GOSUB, м о ж н о, но оператор NEXT + Внутри цикла использовать оператор GOSUB м о ж н о, но оператор NEXT должен быть выполнен только п о с л е выполнения оператора RETURN. В противном случае последует сообщение: "NEXT without FOR" ("NEXT б е з FOR"). - П р и м е р. ─────────── NEW @@ -1792,7 +1653,6 @@ ? 2,6 ? 0,6 NEXT without FOR in 100 ·1··2··3··4··5··6 Ok Ok - С другой стороны, если цикл FOR...NEXT используется в подпрограмме, то оператор RETURN, находящийся в цикле FOR...NEXT, позволяет выйти из цикла и вернуться в основную программу. Это наводит на мысль,что наиболее эффек- @@ -1802,7 +1662,6 @@ Однако учтите, что в момент выполнения оператора RETURN [k] любой неза- конченный цикл FOR ... NEXT в подпрограмме заканчивается и часть стеково- го пространства, которое он (цикл) занимал, освобождается! - П р и м е р. Вывести на экран дисплея первое нечетное число,встретивше- ─────────── еся в целочисленном массиве A(K). NEW @@ -1816,7 +1675,6 @@ ? 3 ? 5 1 1 Ok Ok - При многократном выполнении выхода из подпрограмм с помощью операторов GOTO, ON GOTO или IF...THEN...ELSE (вместо оператора RETURN) в конце кон- цов на экране может появиться сообщение об ошибке: @@ -1836,17 +1694,15 @@ ве подпрограммы, так что в результате размер стека может превысить величи- ну отведенного ему участка памяти. В итоге программа прекращает работу, и выдается сообщение об ошибке. - П р и м е р. 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 @@ -1859,8 +1715,8 @@ 12 Ok Подпрограмма может, в свою очередь, вызывать другую подпрограмму, та - -другую и так далее. Глубина вложения (степень вложения) подпрограмм огра- -ничивается лишь размерами стека. +следующую и так далее. Глубина вложения (степень вложения) подпрограмм ог- +раничивается лишь размерами стека. Наглядно это можно представить себе следующим образом. Пусть Вас из Куйбышева послали в Москву на повышение квалификации, а оттуда еще в Ленинград на курсы. По окончании этих курсов Вы возвращаетесь в Москву,за- @@ -1916,11 +1772,10 @@ 2 Ok - IV.4.1. П р и м е р ы + П р и м е р ы - - П р и м е р 1. Написать программу, вычисления числа сочетаний из m - ───────────── по n по формуле: + П р и м е р 1. Написать программу вычисления числа сочетаний из m + ───────────── элементов по n , используя формулу n m! С = ──────── , (m≥n). m n!(m-n)! @@ -1941,7 +1796,6 @@ Введите значения m,n? 6,3 Число сочетаний из M= 6 по N= 3 равно 20 Ok - Заметим, что оператор GOSUB может оказаться полезным в качестве коман- ды прямого режима. Если Ваша программа состоит из подпрограмм, которые Вы хотите проверить, то, используя команду GOSUB в прямом режиме,можно войти @@ -1954,13 +1808,9 @@ print F 24 Ok - - Ибо это недостойно совершенства человеческого, подобно рабам тратить часы на вычисления. - Г.В.Лейбниц - - + Г.Лейбниц П р и м е р 2. Составить программу, которая позволяет методом половин- ───────────── ного деления (дихотомии) на отрезке [A,B] с точностью E определить какой-либо (!) вещественный корень уравнения F(x)=0, где @@ -1986,7 +1836,6 @@ ? 1,3,.00001 Корень···1.27163·точность·1Е-05 Оk - П р и м е р 3. Если у Вас есть знакомый художник, попросите его разде- ───────────── лить произвольный отрезок на две неравные части. Возмож- но он сделает это в золотом отношении, если его чувство меры воспитано на @@ -2017,7 +1866,6 @@ Y мин=-10.999971821564 при x= 3.999996477694 Ok - П р и м е р 4. Вычислить π ───────────── 1 ⎧ ┌ sin(10·x)┐6 -·│ │──────────│ dx @@ -2045,7 +1893,6 @@ Количество точек? 250 Количество точек? 500 Интеграл = 55251.99567425 Интеграл = 55251.995674258 Ok Ok - П р и м е р 5. Написать программу, осуществляющую лексикографическое ───────────── упорядочение (расположение в алфавитном порядке) масси- ва фамилий на русском языке (после фамилий можно указывать инициалы,напри- @@ -2142,7 +1989,6 @@ ·1··2··3··5··7··11··13··17··31··37··71··73··79··97 Надеюсь, Вы остались довольны? Ok - П р и м е р 7. ───────────── 10'**************************************************** @@ -2184,21 +2030,20 @@ Ok + У попа была собака, он ее любил. Она съела кусок мяса - он ее убил! Убил и закопал, и надпись написал: "У попа была собака, он ее любил. Она съела кусок мяса - ..." Из русского народного фольклора - - Допустимо использование рекурсивных подпрограмм. Р е к у р с и е й называется обращение подпрограммы (функции) к самой себе непосредственно или посредством других подпрограмм. Такие программы (функции) называются р е к у р с и в н ы м и. Само слово "рекурсия" озна- чает "возвращение" (лат. "recursio"). В программировании различают два типа рекурсии - рекурсивное определе- -ние или п р я м у ю рекурсию и рекурсивное использование или к о с - +ние, или п р я м у ю рекурсию и рекурсивное использование, или к о с - в е н н у ю рекурсию. Рекурсивное использование - это способ описания процесса через подпро- цессы, идентичные основному процессу, а рекурсивное определение - способ @@ -2233,7 +2078,6 @@ программ, несмотря на то, что коварство рекурсии проявляется в том,что бы- вает довольно трудно заметить дефект программы или алгоритма,а в цикличес- ком процессе все на виду! - П р и м е р 2. Пользуясь рекуррентной формулой ───────────── 0 m n-m+1 m-1 C = 1 ; C = ────── · C ,(∗) @@ -2257,7 +2101,6 @@ ? 232,231 ? 233,232 ? 4080,4079 print m 232 0 ◀── ?! Out of memory in 100 2 Ok Ok Ok Ok - П р и м е р 3 [6]. ───────────── NEW @@ -2287,14 +2130,11 @@ туацию, при которой первая подпрограмма вызывает вторую, а та в свою оче- редь вызывает первую! - - IV.5. ОПЕРАТОР ON GOSUB - Кроме оператора перехода на подпрограмму в MSX-BASIC есть оператор вы- бора подпрограмм (оператор-"переключатель"). - Его общий вид: ON β GOSUB n1,n2,...nk + Его общий вид: ON β GOSUB n1,n2,...nk , где: ON("на"),GOSUB("to GO to SUBroutine"-"идти к подпрограмме") - служеб- ные слова; β - арифметическое выражение; @@ -2309,6 +2149,7 @@ Если p<0, то компьютер выдает сообщение об ошибке: "Illegal function call". + П р и м е р 1. ───────────── NEW @@ -2316,8 +2157,8 @@ 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 @@ -2345,25 +2186,30 @@ В ы в о д ы [8]. При применении подпрограмм BASIC придерживайтесь сле- ─────────────── дующих правил: 1. Четко обозначайте начало и конец каждой подпрограммы. Если это воз- -можно, выделяте их путем отступа операторов вправо. +можно, выделяйте их путем отступа операторов вправо. + 2. Никогда не пользуйтесь оператором GOTO для входа в подпрограмму и для выхода из нее. Каждую подпрограмму надо рассматривать как независимый логически завершенный м о д у л ь . + 3. Имейте под рукой список глобальных входных переменных и выходных ре- зультатов каждой подпрограммы. Лучше всего оформить его комментариями к программе с помощью операторов REM . + 4. Обязательно убедитесь, что в подпрограмме не изменяются значения та- ких внешних переменных, как счетчики циклов. Если это возможно, в каждой подпрограмме вводите свой принцип именования внутренних переменных. - 5. В отличии от функций, подпрограммы не появляются в программе до то- + + 5. В отличие от функций подпрограммы не появляются в программе до то- го, как ими будут пользоваться, поэтому полезно группировать подпрограммы вместе после оператора END, указанного в конце основной программы. +\page + IV.6. Д о п о л н е н и е 1 [77] - Д о п о л н е н и е 1 [77]. Программа позволяет умножить два числа, - ────────────────────────── причем каждое из них может иметь "л ю - -б о е" количество цифр при следующих ограничениях: в произведении должно -содержаться не более 765 цифр и длина каждого из чисел должна быть ограни- -чена возможной длиной строки. + Программа позволяет умножить два числа, причем каждое из них может +иметь "л ю б о е" количество цифр при следующих ограничениях: в произве- +дении должно содержаться не более 765 цифр,и длина каждого из чисел долж- +на быть ограничена возможной длиной строки. В заключение отметим, что приведенная программа работает неправильно либо когда одно из введенных чисел меньше 10, либо когда их произведение меньше 1000. Безусловно имеет смысл сделать программу "защищенной" в этом @@ -2410,6 +2256,7 @@ print 12345678*987654321 1.2193262222375E+16 Ok +\page run Точное произведение целых чисел Введите первое число: 11111111111111111111 @@ -2418,12 +2265,18 @@ , 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 @@ -2443,6 +2296,7 @@ ? 23 23!=25852016738884976640000 Ok + run Введите число N ? 50 {{tag> }}