IV.2.1. MID$ - ф у н к ц и я Oбщий вид MID$ - функции следующий: MID$(α,m[,n]) где: MID ("MIDdle"-"середина") - служебное слово; α - строковое выражение; m, n - арифметические выражения, целые части значений которых должны принадлежать отрезку [1,255]. Напомним, что квадратные скобки,встречающиеся при описании синтаксиса,- обозначение, указывающее, что элемент синтаксической конструкции внутри них не является обязательным. Условимся целые части значений арифметических выражений m и n обозна- чать соответственно M и N. По умолчанию N равно количеству символов значения строкового выражения α от позиции M и до конца строки включительно. Рассмотрим два возможных случая. 1. Функция MID$ с л е в а от знака равенства в операторе присваива- ния LET. ┌───────────────────────────────────┐ │ [LET] MID$(α,m[,n]) = β │ └───────────────────────────────────┘ Здесь β - строковое выражение. Пусть L - длина значения строкового выражения β.При выполнении операто- ра LET символы значения строкового выражения α, начиная с позиции M, по- следовательно замещаются на первые min(L,N) символов строкового выражения β. Остальные символы значения строкового вы- ражения α остаются без изменений (см. рис.1). 1-й 2-й М-й (М+1)-й (M+N-1)-й LEN(α)-й символ символ символ символ символ символ │ │ │ │ │ │ ┌───▼───┬───▼───┬───┬───▼───┬───▼───┬───┬───▼───┬───┬───▼───┐ │ │ │...│███████│███████│...│███████│...│ │ α └───────┴───────┴───┴───────┴───────┴───┴───────┴───┴───────┘ │◀─────── N символов ──────▶│ ▲ ▲ │ │ ┌───────────────────────────┐ │ MID$(α,M,N) = β │ ▲───────────────────────────▲ │ │ ┌────────────────────────────────────────┐ L > N │███████│███████│...│███████│ ...│███████│ β └────────────────────────────────────────┘ │◀──────────────── L символов ──────────▶│ или ▲ ▲ │ │ ┌───────────────────┐─ ─ ─ ─┐ L < N │███████│...│███████│ │β └───────────────────┘─ ─▲─ ─┘ │◀─── L символов───▶│ │ символы из α Р и с. 1 П р и м е р. ─────────── 10 X$="12345678910":INPUT Y$,M,N:MID$(X$,M,N)=Y$:PRINT X$ run ┌────────────────┐ run ┌────────────────┐ ? стол,8,4 │X$="12345678910"│ ? стул,1,4 │X$="12345678910"│ 1234567стол │ └──┘ │ стул5678910 │ └──┘ │ Ok │ Y$="стол"│ Ок │Y$="стул" │ └────────────────┘ └────────────────┘ run ┌────────────────┐ run ┌────────────────┐ ? сто,8,3 │X$="12345678910"│ ? казак,8,5 │X$="12345678910"│ 1234567сто0 │ └─┘ │ 1234567каза │ └──┘ │ Ok │ Y$="сто" │ Ok │ Y$="каза"│ └────────────────┘ └────────────────┘ И наконец, вместо оператора присваивания вида А$ = строковое выражение , используйте оператор: MID$(А$,1) = строковое выражение , чтобы избежать использования дополнительной памяти. Но учтите, что строко- вая переменная A$ уже должна существовать и LEN(A$)≥LEN(строковое выражение) ! 2. Функция MID$ с п р а в а от знака равенства в операторе присваи- вания LET. ┌─────────────────────────────────────┐ │ [LET] γ = MID$(α,m[,n]) │ └─────────────────────────────────────┘ Здесь γ - строковая переменная. При выполнении указанной конструкции N последовательных символов значе- ния α, начиная с позиции M, становятся значением строковой переменной γ. Предварительное определение γ не обязательно (см. рис.2). 1-й 2-й М-й (М+1)-й (М+N-1)-й LEN(α)-й символ символ символ символ символ символ │ │ │ │ │ │ ┌───▼───┬───▼───┬───┬───▼───┬───▼───┬───┬───▼───┬───┬───▼───┐ │ │ │...│███████│███████│...│███████│...│ │ α └───────┴───────┴───┴───────┴───────┴───┴───────┴───┴───────┘ │ ┌─────────────────┐ │ │ │ γ = MID$(α,M,N) │ │ │ └─────────────────┘ │ ▼───────┬───────┬───┬───────▼ │███████│███████│...│███████│ γ └───────┴───────┴───┴───────┘ │◀────── N символов────────▶│ Р и с. 2 П р и м е р ы: ───────────── 1) Ok 2) Ok ? 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" ? 1,1 ? 2,90 ? 10,1 ? 1,0 2 INPUT X$,M 2 34 3 Z$=MID$(X$,M) Ok Ok Ok Ok 4 Y$=MID$(X$,M+4) run или run 5 PRINT Z$ ? -1,1 ? 0,0 6 PRINT Y$ Illegal function call in 10 run Ok ? Баба-Яга-костяная нога,6 run или run Яга-костяная нога ? 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 Ok 10 INPUT X$,K 20 IF K<1 OR K>LEN(X$) THEN PRINT"Буквы с указанным номером в слове не т":END ELSE Z$=MID$(X$,K,1):PRINT Z$:END run run ? информатика,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 Оk 10 INPUT X$,Z$:J=0 20 FOR I=1 TO LEN(X$)-LEN(Z$)+1 30 IF Z$<>MID$(X$,I,LEN(Z$)) THEN NEXTI ELSE J=J+1:NEXTI 40 PRINT J:END run ? БАОБАБ,БА 2 Ok П р и м е р 10. Написать программу, заменяющую в слове X$ слово Z$ на ────────────── слово Y$ той же длины. NEW Оk 10 INPUT X$,Z$,Y$:IF LEN(Z$)>MID$(X$,J,LEN(Z$)) THEN 50 40 MID$(X$,J,LEN(Y$))=Y$ 50 NEXT J:PRINT X$:END run ? ДОМ КИРПИЧНЫЙ ?? КИРПИЧНЫЙ ?? БАНАНОВЫЙ ДОМ БАНАНОВЫЙ Оk Косо лети же, житель осок. Я разуму уму заря, Мечтатель! Летать чем? В.Хлебников Я иду с мечом судия. С.Кирсанов Г.Р.Державин П р и м е р 11. Слова и фразы,переходящие в себя при "акустическом ото- ────────────── бражении", получили название п а л и н д р о м о в. Это слово греческого происхождения и означает "движущийся обратно", "обра- тимый". Найти палиндром практически невозможно, но его нетрудно построить. В качестве "строительных блоков" простейших палиндромов следует выбирать слова, не изменяющиеся при чтении от конца к началу. Выдерживают отраже- ние в "акустическом зеркале" такие слова, как боб, дед, кок, мим, иди, то- пот, потоп, колок, ротор, кабак, моном и выражения, такие, например,как "Леша на полке клопа нашел". Ok 10 INPUT X$:Y$="" 20 FOR I=1 TO LEN(X$):Y$=MID$(X$,I,1)+Y$:NEXT 30 IF X$=Y$ THEN PRINT"Палиндром!" ELSE PRINT"Не палиндром!" run run run ? косолетижежителосок ? мечтателлетатчем ? я разуму уму заря Палиндром! Палиндром! Не палиндром! Ok Ok Ok Сравните результат действия функции MID$(A$,I,J),стоящей справа от зна- ка равенства в операторе присваивания, с результатом операции в ы р е з- к и: A[i:i+j-1] , где: А - текст; i - номер первого символа фрагмента,вырезаемого из текста A; j - количество символов в фрагменте,вырезаемом из текста A, в школьном алгоритмическом языке. Рассмотрите интересный часто встречающийся частный случай j=1, т.е.про- ведите аналогию между MID$(A$,I,1) и A[i:i]. И, наконец, сопоставьте результат действия функции MID$, стоящей слева от знака равенства в операторе присваивания, с результатом работы команды частичного изменения значения литерной величины (команды присваивания вы- резке) A[i:j]=B , позволяющей заменить часть слова А,начинающуюся с i-той буквы и оканчиваю- щуюся j-той буквой, на слово B, в школьном алгоритмическом языке.