IV.2.2. LEFT$ - ф у н к ц и я Общий вид функции: LEFT$(α,n) где: LEFT ("left"-"левый") - служебное слово; α - строковое выражение; n - арифметическое выражение, целая часть значения которого должна принадлежать отрезку [0,255]. Функция LEFT$ позволяет выделить самые л е в ы е n символов значения строкового выражения α . LEFT$ - функция является"частным случаем" MID$- функции и через нее мо- жет быть определена так: LEFT$(α,n) = MID$(α,1,n) . П р и м е р ы: ───────────── 1) Ok 3) Ok 10 INPUT X$,N ? LEFT$("деньги",4) 20 U$=MID$(X$,1,N) день └──┘ 30 V$=LEFT$(X$,N) Ok 40 PRINT U$;V$ 4) Ok run ? LEFT$("abc",2);LEFT$(LEFT$ ? 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 ("right"-"правый") - служебное слово; α - строковое выражение; n - арифметическое выражение, целая часть значения которого должна принадлежать отрезку [0,255]. Функция RIGHT$ позволяет выделить самые п р а в ы е n символов зна- чения строкового выражения α (в этом смысле функция RIGHT$() симметрич- на функции LEFT$()!). RIGHT$ - функция является частным случаем MID$ -функции и через нее мо- жет быть определена так: 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) 30 V$=RIGHT$(X$,N):? U$;V$ байт run Ok ? 1234567890,4 5) ? MID$("рубайте!",3,4) 78907890 байт └──┘ Ok Ok Заметим, что хотя функции LEFT$ и RIGHT$ являются "частными случаями" функции MID$, их нельзя использовать с л е в а от символа присваивания в операторе LET! Посмотрите... NEW Ok 1 A$="Барсик":MID$(A$,1,4)="Корт":PRINT A$ 2 B$="Комик":LEFT$(B$,3)="Том":PRINT B$ run Кортик Syntax error in 2 Ok П р и м е р 6. Образовать слово Y$, состоящее из первых N и последних ───────────── К символов данного слова Х$. Первоначальный вариант программы выглядит так: NEW Ok 10 INPUT X$,N,K 20 Y$=LEFT$(X$,N)+RIGHT$(X$,K) 30 PRINT "Результат:";Y$ 40 END run run run ? аллигатор,3,6 ? аллигатор,0,6 ? аллигатор,0,0 Результат:аллигатор Результат:игатор Результат: Ok Ok Ok однако ... run ? аллигатор,-4,3 Illegal function call in 20 Ok Поэтому дополним программу строкой: 15 IF N<0 OR N>LEN(X$) OR K<0 OR K>LEN(X$) THEN PRINT"Не балуйтесь! По вторите!":GOTO 10 Выполним полученную программу: run run ? аллигатор,9,10 ? аллигатор,-1,5 Не балуйтесь! Повторите! Не балуйтесь! Повторите! ? аллигатор,6,0 ? аллигатор,9,10 Результат:аллига Не балуйтесь! Повторите! Оk ? Строка 15 обеспечивает повторный запрос на ввод исходных данных в том случае, когда K<0 или К> длины слова Х$, или N<0, или N>длины слова X$ (своеобразная "защита"программы от непредусмотренной исходной информации). П р и м е р 7. Написать программу перевода чисел, записанных римскими ───────────── цифрами, в числа, записанные арабскими цифрами. NEW Ok 1 DATA 1000,M,900,CM,500,D,400,CD,100,C,90,XC,50,L,40,XL,10,X,9,IX,5,V ,4,IV,1,I:INPUT"N$";N$ 2 READ A,A$ 3 IF A$=LEFT$(N$,LEN(A$)) THEN N$=RIGHT$(N$,LEN(N$)-LEN(A$)):N=N+A:GOT O 3 4 IF N$>" "GOTO 2 5 PRINT N run run run run run N$? IV N$? CMIV N$? MMMDXCLLI N$? MCMXVII N$? MDCCCXII 4 904 3691 1917 1812 Ok Ok Ok Ok Ok А как насчет программы обратного перевода? Пожалуйста! П р и м е р 8. Написать программу перевода чисел, записанных арабскими ───────────── цифрами, в числа, записанные римскими цифрами. NEW Ok 1 DATA 1000,M,900,CM,500,D,400,CD,100,C,90,XC,50,L,40,XL,10,X,9,IX,5,V, 4,IV,1,I:INPUT"N";N 2 READ A,A$ 3 IF A<=N THEN PRINT A$;:N=N-A:GOTO 3 4 IF N>0 GOTO 2 run run run run N? 654 N? 25 N? 11111 N?3691 DCLIV XXV MMMMMMMMMMMCXI MMMDCXCI Ok Ok Ok Ok IV.2.4. STRING$ - ф у н к ц и я Общий вид STRING$ -функции следующий: STRING$(n,α) или STRING$(n,m) , где: STRING ("string"-"строка") - служебное слово; α - строковое выражение; n,m - арифметические выражения, целые части значений которых должны принадлежать отрезку [0,255]. Обозначим N-значение арифметического выражения n. Тогда,в случае форма- та STRING$(n,α) функция возвращает строку,состоящую из N одинаковых симво- лов, равных первому символу значения строкового выражения α. А в случае формата STRING$(n,m) значением функции является последова- тельность N одинаковых символов, код ASCII которых одинаков (ведь симво- лы одинаковы!) и равен целой части значения арифметического выражения m. Поэтому, если Вы хотите инициализировать строковую переменную A$, N п р о б е л a м и (наиболее часто встречающаяся операция!), то два приве- денных ниже оператора выполняют идентичное действие: A$=STRING$(N,32) , A$=STRING$(N," ") (ведь CHR$(32)=" "!). Таким образом, с помощью 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 ("space"-"пространство") - служебное слово; n - арифметическое выражение, целая часть значения которого должна принадлежать отрезку [0,255]. С помощью SPACE$-функции назначается длина и проводится начальная ини- циализация пробелами строковых переменных. Например, если Вы хотите иници- ализировать новую строковую переменную X$ N пробелами, то используйте опе- ратор присваивания X$=SPACE$(N) SPACE$-функция является частным случаем STRING$-функции и через нее мо- жет быть определена так: SPACE$(n)=STRING$(n," ") IV.2.6. П р и м е р ы 1) выделить из текста,являющегося значением строковой переменной T$,от- дельные слова (они отделены друг от друга одним пробелом) и записать их в строковый массив с именем W$. (Психологи утверждают, что из минуты, за- траченной на чтение, мы 58 секунд считываем промежутки между символами!) NEW Ok 10 LINEINPUT T$:T$=T$+" ":K=0'K-количество слов в T$ 20 FOR I=1 TO LEN(T$):IF MID$(T$,I,1)=" " THEN K=K+1 35 NEXT I 'Количество слов в Т$ найдено! 40 DIM W$(K):DIM P(K)'Вот теперь можно описать массивы! 45 FOR J=1 TO K:W$(J)=SPACE$(5):NEXTJ 'Начальная инициализация пробела ми элементов массива W$(K) 47 N=1:FOR J=1 TO K:FOR I=N TO LEN(T$) 70 IF MID$(T$,I,1)=" " GOTO 85 80 NEXT I 85 P(J)=I:W$(J-1)=MID$(T$,N,P(J)-P(J-1)-1):N=P(J)+1:PRINT W$(J-1);SPC(5) 90 NEXT J run 123 4 567 123·····4·····567 Ok Елечвок енмяет ослог. А.Вознесенский. Человек 2) даны два слова X$ и Y$. Проверить, можно ли из символов, входящих в слово X$, составить слово Y$. Символы можно переставлять, и каждый символ можно использовать несколько раз! NEW Ok 10 INPUT X$,Y$ 30 FOR I=1 TO LEN(Y$):FOR J=1 TO LEN(X$) 50 IF MID$(Y$,I,1)=MID$(X$,J,1) THEN A$="да":NEXT I ELSE A $="нет":NEXT J 80 PRINT A$:END run run ? школаа,алокша ? AB,BB да да Ok Ok 3) даны два натуральных числа M и N.Проверьте,можно ли из цифр числа M составить число N. Цифры можно переставлять и использовать: a) более одно- го раза; b) не более одного раза. a) NEW Ok 10 INPUT M,N:M$=STR$(M):N$=STR$(N) 30 FOR I=2 TO LEN(N$):FOR J=2 TO LEN(M$) 40 IF MID$(N$,I,1)<>MID$(M$,J,1) THEN NEXT J:?"Нельзя!"ELSE NEXTI: ?"Можно!" run run run ? 6785,58758 ? 6785,58358 ? 6785,87 Можно! Нельзя! Можно! Ok Ok Ok b) NEW Ok 10 INPUT M,N:X$=" ":M$=STR$(M):N$=STR$(N) 40 FOR I=2 TO LEN(N$):FOR J=2 TO LEN(M$) 50 IF MID$(N$,I,1)=MID$(M$,J,1) THEN MID$(N$,I,1)=X$:MID$(M$,J,1)= X$:NEXTI:?"Можно!" ELSE NEXTJ:?"Нельзя!" run run ? 12345432,1236 ? 1234554320,1022 Нельзя! Можно! Ok Ok 4) число 41 обладает следующим свойством: 41²=1681,√16=4 и √81=9, т.е. числа 16 и 81 - точные квадраты; найти все натуральные числа, не превосхо- дящие N,и такие, что первые две и последние две цифры квадрата числа явля- ются точными квадратами. NEW Ok 10 INPUT"Сколько чисел необходимо проверить";N:PRINT"Интересующие Вас числа:"; 20 FOR I=10 TO N:B=I^2 40 B$=MID$(STR$(B),2):IF VAL(RIGHT$(B$,2))<>0 THEN 50 ELSE NEXT I: END 50 IF SQR(VAL(LEFT$(B$,2)))=FIX(SQR(VAL(LEFT$(B$,2)))) AND SQR(VAL(RIG HT$(B$,2)))=FIX(SQR(VAL(RIGHT$(B$,2))))THENPRINT I;:NEXTI ELSE NEXTI run Сколько чисел необходимо проверить? 100 Интересующие Вас числа: 41 Ok 5) написать программу, которая заменяет часть слова Z$ текста T$ на текст Y$ с сохранением одного пробела между словами. NEW Ok 5 PRINTSPC(8);"Вводите текст !":LINEINPUT T$:T$=T$+" ":K=0 15 INPUT "Какое слово менять";Z$ 16 INPUT "На какое слово менять";Y$ 20 FOR I=1 TO LEN(T$):IF MID$(T$,I,1)=" " THEN K=K+1:NEXTI ELSE NEXTI 'K-количество слов в тексте T$ 40 DIM W$(K):DIM P(K)'Вот теперь можно описать массивы! 45 FOR J=1 TO K:W$(J)=SPACE$(5):NEXT J 47 N=1'N-номер первой буквы текущего слова в тексте 50 FOR J=1 TO K: FOR I=N TO LEN(T$) 70 IF MID$(T$,I,1)=" " GOTO 85 80 NEXT I 84 'P()-массив,содержащий номера позиций пробелов в тексте 85 P(J)=I:W$(J-1)=MID$(T$,N,P(J)-P(J-1)-1):N=P(J)+1 90 NEXT J 95 A$="Образец не найден! Ваш текст:" 100 FOR J=0 TO K-1 105 IF W$(J)=Z$ THEN W$(J)=Y$:A$="":GOTO 120 106 FOR I=1 TO LEN(W$(J))-LEN(Z$)+1 107 IF Z$<>MID$(W$(J),I,LEN(Z$))THEN115 108 W$(J)=LEFT$(W$(J),I-1)+Y$+RIGHT$(W$(J),LEN(W$(J))-I-LEN(Z$)+1):A$= "" 115 NEXTI 120 NEXT J 130 FOR J=0 TO K-1:B$=B$+W$(J)+" ":NEXT 145 PRINT A$ 150 PRINT B$:END run ········Вводите текст ! Мама мыла Эмму Какое слово менять? мы На какое слово менять? очень люби ································· Мама очень любила Эмму Ok 6) составьте программу, в результате работы которой выяснялось бы, мож- но ли переставить цифры десятичной записи числа K так,чтобы они образовы- вали арифметическую или геометрическую прогрессию. NEW Ok 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% 60 IF A(I)>A(J)THEN SWAP A(I),A(J) 70 NEXT J,I 80 D%=A(3)-A(2) 90 IF M%<3 THEN PRINT"Число должно содержать не менее 2 цифр":GOTO 20 100 IF M%=3 THEN PRINT"Арифм.прогрессия есть!":GOTO 150 110 FOR I=4TO M% 120 IF A(I)-A(I-1)<>D%THEN ?"Арифм.прогрессии нет":GOTO160 130 NEXT I 140 PRINT"Арифм.прогрессия есть!" 150 IF M%=3 AND A(3)=0 THEN PRINT"Геом.прогрессии нет":END 160 FOR I=2 TO M%:IF A(I)=0 THEN?"Геом.прогрессии нет":END 170 NEXT I 180 Q=A(3)/A(2) 190 IF M%=3 THEN ?"Геом.прогрессия есть!":END 200 FOR I=4 TO M% 210 IF A(I)/A(I-1)<>Q THEN PRINT"Геом.прогрессии нет":END 220 NEXT I 230 PRINT"Геом.прогрессия есть!":END run run Введите нат. число? 7132546 Введите нат. число? 42 Арифм.прогрессия есть! Арифм.прогрессия есть! Геом.прогрессии нет Геом.прогрессия есть! Ok Ok 7) составить программу, которая m-кратно повторяет каждый символ в сло- ве X$. NEW Ok 10 INPUT"Введите слово";X$ 20 INPUT"Укажите число повторений символов";M% 30 IF M%=0 OR M%*LEN(X$)>255 THEN ?"Повторите ввод":GOTO10 40 N$="":FOR I=1 TO LEN(X$):FOR J=1 TO M% 70 N$=N$+MID$(X$,I,1):NEXTJ,I 90 PRINT "Вы этого хотели? ";N$ run Введите слово? керпкпр Укажите число повторений символов? 2 Вы этого хотели? ккееррппккппрр Ok 8) составить программу вывода всех натуральных чисел, меньших N, сумма квадратов цифр которых равна M. NEW Ok 5 DEFINT I,J,N,M,Y:INPUT N,M 10 FOR I=1 TO N:Y=0:A$=STR$(I) 20 FOR J=2 TO LEN(A$):Y=Y+VAL(MID$(A$,J,1))^2:NEXTJ 30 IF Y=M THEN PRINTI;:NEXTI ELSE NEXTI 40 END run ? 123,65 ·18··47··74··81··108 Ok 9) по данному натуральному N найдите наименьшее из чисел, имеющих сто- лько же и таких же цифр, что и N, если известно, что каждую цифру числа N можно использовать при записи один раз. NEW Ok 10 DEFINT I,J: DEFSTR A 20 INPUT "В каком числе хотите перетрясти цифры";N 25 IF LEN(STR$(N))>14 THEN PRINT "Не озоруй!":GOTO 20 30 FOR I=0 TO9:FOR J=2 TO LEN(STR$(N)) 40 IF I=VAL(MID$(STR$(N),J,1))THEN A=A+STR$(I) 50 NEXT J,I 60 PRINT VAL(A):END run В каком числе хотите перетрясти цифры? 87655543 ·34555678 Ok run В каком числе хотите перетрясти цифры? 112235799435213 Не озоруй! В каком числе хотите перетрясти цифры? ... 10) написать программу, устанавливающую, какие из натуральных чисел,не большие заданного натурального M, делятся на каждую свою цифру. 10 DEFINT I,J,M:DEFSTR A:INPUT M 30 FOR I=1 TO M:A=STR$(I):FOR J=2 TO LEN(A) 55 IF VAL(MID$(A,J,1))=0 THEN NEXT J:NEXT I:END ELSE::::IF I MOD VAL(M ID$(A,J,1))=0 THEN NEXTJ:PRINTI;:NEXTI ELSE NEXTI run ? 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 60 IF MID$(X$,J,1)=MID$(X$,I,1) ELSE NEXT J,I THEN P=P+1 50 PRINT"Цифр,используемых 70 NEXTI 1 раз:";P 80 IF P=1 THEN K=K+1 run 90 NEXTJ Введите число? 12341524162 100 PRINT "K=";K Цифр,используемых 1 раз: 3 run Ok ? 45687345976 K= 3 Ok 12) из каждого слова массива C$(N) слов вычеркнуть те символы, которые употребляются при написании каждого из слов массива. NEW Ok 10 CLEAR 1500 20 INPUT"Введите количество слов";N:PRINT"Вводите слова!" 27 'В строках 30-60 идентификация исходного массива C$(N). 30 DIM C$(N):FOR I=1 TO N:INPUTC$(I):NEXT:K$="" 75 'В строках 80-130 находятся "общие" символы. Значение переменной К$ состоит из "общих" символов. 80 FOR I=1 TO N:FOR J=1 TO LEN(C$(I)):FOR R=1 TO N 110 FOR K=1 TO LEN(C$(R)) 120 IF MID$(C$(I),J,1)=MID$(C$(R),K,1) THEN NEXT R:K$=K$+MID$(C$(I),J, 1):NEXT J ELSE NEXT K,J 130 NEXT I 135 'В строках 140-180 происходит"вычеркивание"из слов массива "общих" символов. 140 FOR I=1 TO N:FOR J=1 TO LEN(C$(I)):FOR K=1 TO LEN(K$) 170 IF MID$(C$(I),J,1)=MID$(K$,K,1)THENMID$(C$(I),J,1)=" " 180 NEXT K,J,I 185 'Строки 190-230 выполняют "сжатие" слов массива C$(N),т.к.при "выч еркивании" "общих" символов образуются пробелы. 190 DIM N$(N) 200 FOR I=1 TO N:FOR J=1 TO LEN(C$(I)) 220 IF MID$(C$(I),J,1)<>" "THENN$(I)=N$(I)+MID$(C$(I),J,1) 230 NEXT J,I 240 FOR I=1TO N:PRINT"Вот";I;"слово:" ;N$(I);" - не правда ли?":NEXT run Введите количество слов? 4 Вводите слова! ? апро ? ажип ? сонп ? портфель Вот 1 слово:аро - не правда ли? Вот 2 слово:ажи - не правда ли? Вот 3 слово:сон - не правда ли? Вот 4 слово:ортфель - не правда ли? Ok 13) определить количество р а з л и ч н ы х букв,встречающихся в сло- ве A$ более одного раза. NEW Ok 10 INPUT A$:S=0 20 FOR I=1 TO LEN(A$) 30 P=0 40 FOR J=1 TO LEN(A$) 50 IF MID$(A$,I,1)=MID$(A$,J,1) THEN P=P+1 60 NEXT J 70 IF P>1 THEN S=S+1/P 80 NEXT I 90 PRINT FIX(S+.5):END run run run run aaaaaaaa ? бегемот ? Кинг-Конг ? мяучело 1 1 3 0 Ok Ok Ok Ok