Обработка символьной информации
Кроме числовых значений переменные в Бейсике могут принимать значения в виде строки символов. Символьные значения (константы) заключаются в кавычки " ". Имя символьной (строковой) переменной отличается от обычной числовой переменной добавлением справа специального символа, чаще знака доллара $, например, AS, Fl$, MaxS. Над символьными переменными допустима операция сложения (склейка строк символов); могут быть использованы функции и процедуры обработки символьных величин. Начнем с примеров программ, аналогичных приведенным ранее на языке Паскаль. Программа 68 (см. программу 11) 10 ' ******* Количество гласных в тексте ************ 20 с$ = "аеиоуыэюяАЕИОУЫЭЮЯ" 30 INPUT "Введите текст"; а$ 40 n» О 50 FOR k = 1 ТО LEN(c$) 6t> b$ = MID$(c$, k, 1) 70 FOR i = 1 TO LEN(a$) 80 IF b$ = MID$(a$, i, 1) THEN n = n + 1 90 NEXT i 100 NEXT k 110 PRINT "Количество гласных равно", n 120 END Здесь использована строковая функция MID(a$,ij) - вырезка подстроки из строки а$, где первый аргумент - исходная строка, второй - начальная позиция подстроки, третий - длина подстроки. Функция LEN(aS) - длина текста. В следующей программе дополнительно использованы строковые функции LEFT$(a$,i) - выделение подстроки длиной i от левого края заданной строки и RIGHT$(a$,i) - то же, но с правого края. Программа 69 (см. программу 12) 10 ' ******* Замена в тексте sqr на ехр ************ 20 INPUT "Введите текст"; а$ 30 FOR i = 1 ТО LEN(a$) - 2 40 IF MID$(a$, i, 3) О "THEN GOTO 60 50 a$ = LEFT$(a$, i -1) + "+ RIGHT$(a$, LEN(a$) - i - 2) 60 NEXT i 70 PRINT a$ 80 END Приведем еще несколько примеров. Программа 70 10 ' ******* игра клавиатурный тренажер ************ 12 DATA "азбука", "год",".23*45/56", letter, pc-ibm 15 DATA "дом-home", "Красноярск", "Омск", "Пермь", "Воронеж" 20 FOR i = 1 ТО 10
30 READ a$(i) 40 NEXT i 60 FOR i = 1 TO 10 70 CLS: PRINT: PRINT TAB(IO); a$(i); 100 PRINT: PRINT: PRINT 110 PRINT "введите слово и нажмите <ВК>"; 120 LOCATE 8, 5: х» TIMER: INPUT b$: CLS 130 у = TIMER: PRINT: n =LEN(a$(i)) 140 IF a$(i) <> b$ THEN 190 150 PRINT USING "###.#<"; (y - x) / П; 160 PRINT "сек. на один символ": GOTO 200 170 PRINT: PRINT "слово набрано неверно" 180 FOR m = 1 ТО 5000: NEXT m 190 NEXT i Функция TIMER возвращает текущее время системной среды в секундах. В строке 180 предусмотрен пустой цикл для осуществления временной задержки в исполнении программы. Использование функций LEFTS(aS,n) и MID$(a$,n,k) еще раз продемонстрировано в следующем примере. Здесь же использованы математические функции INT(x) -целая часть числа х, RND(x) - случайное число в интервале от 0 до 1. В программе задается массив (оператор DIM aS(k)) из пяти слов, представленных в списке DATA (30 и 40 строки). Случайным образом выбирается одно из них и предлагается его угадать вводом подходящих символов.
Программа 71 5 ' *************** угадай слово ********************* 10 k = 5 15 DIM a$(k) 30 DATA "вечер","информатика","университет" 40 DATA "эхо","тра-ля-ля" 50 FOR i = 1 ТО k 60 READ a$ (i) 70 NEXT i 80 CLS 90 r = INT(k * RND(-TIMER)) + 1 100 n = LEN(a$(r)) 110 PRINT "Я задумал слово из "; n; "букв" 120 LOCATE 5, 20: PRINT LEFT$(s$, n) Ш 130 t = о т 140 DO • 150 LOCATE 8, 12: PRINT "введи букву" Щ 160 INPUT h$ 170 у = О 180 FOR i = 1 ТО n ] 190 IF h$ = MID$(a$(r), i, 1) THEN | 200 LOCATE 5, 19 + i: PRINT h$: | 210 t=t+l:y=l | 220 END IF | 230 NEXT i 240 LOCATE 8, 12: PRINT " " 250 IF у О 1 THEN LOCATE,10, 15: PRINT "нет такой буквы" 260 FOR m = 1 ТО 5000: NEXT m 270 LOCATE 10, 15: PRINT " " | 280 LOOP WHILE t 0 n I 290 LOCATE 13, 13: PRINT "угадал, поздравляю!" f Обратим внимание на использованный в данной программе цикл DO-LOOP-WHILE, который допустим в некоторых версиях Бейсика (QBASIC, Turbo-BASIC).
Контрольные вопросы и задания 1. Охарактеризуйте использованные выше строковые функции.
ПОДПРОГРАММЫ В Бейсике предусмотрена работа с подпрограммами, если необходимо использовать многократно сходные действия, или для блочно-структ\рпрованного построения программы. Для организации подпрограмм используют две команды: GOSUB <номер строки> - перейти на подпрограмм: RETURN - возврат.
Во многих версиях Бейсика предусмотрен переключатель подпрограмм ON k GOSUB 100,200,300. Здесь k может принимать значения 1.2.3, что соответствует обращению к одной из трех подпрограмм, начинающихся с номеров 100. 200, 300. Начнем с примера, аналогичного одному из тех, которые сопровождали рассказ о процедурах Паскаля выше. Программа 72 (см. программу 17). 10 ' ****** квадратные корни и логарифмы********************* 15 CLS / 20 " а» 35: с$ = "-" 30 GOSUB 1000 40 PRINT: PRINT "Таблица квадратных корней" 50 GOSUB 1000 55 PRINT 60 FOR x = 1 TO 10 70 PRINT USING "x = ##» sqr(x) = t».#»#<"; x; SQR(x): 80 NEXT x 90 GOSUB 1000 100 PRINT: PRINT "Таблица логарифмов"; 110 GOSUB 1000 120 PRINT 130 FOR x = 1 TO 5 140 PRINT USING "x = ««» log(x) =»».»»»»"; X; LOG(x) 150 NEXT x :60 с$ = "*" 170 GOSUB 1000 180 END 1000 FOR i = 1 TO a: PRINT c$: NEXT i 1010 RETURN Обратим внимание на существенно иной механизм передачи параметров в подпрограмму на Бейсике, нежели в паскалевскую процедуру. Формирование входных параметров производится с помощью присваиваний до обращения к процедуре. Это гораздо менее удобно, чем использование формальных и фактических параметров в Паскале. Приведем еще несколько примеров работы с подпрограммами. Программа 73 '*********** меню графиков функций *********** 10 CLS: PRINT: PRINT 20 PRINT " ГРАФИКИ ФУНКЦИЙ" 30 PRINT 40 PRINT ". Синус" 50 PRINT ". Косинус" 60 PRINT ". Тангенс" 70 PRINT: PRINT 80 INPUT "введи номер"; j 90 SCREEN 2 100 LINE (200, 0) - -(200, 200): LINE (0, 100) - (400, 100) 110 PSET (0, 0), 4 120 FOR x = - 4 TO 4 STEP 1/32 130 ON j GOSUB 500, 600, 700 140 PSET (200 + 32 * x, 100 - 32 * у) 150 NEXT x 160 r$ = INPUT$(1) 170 IF r$ = "К" OR r$ = "к" THEN END ELSE SCREEN 0: GOTO 10 500 у = SIN(x): RETURN 600 у = COS(x): RETURN 700 у = TAN(x): RETURN Подпрограммы, к которым обращаются по GOSUB, сильно уступают истинным процедурам Паскаля, поскольку у них отсутствуют возможности локализации переменных, нет формальных параметров, которые можно замещать при обращении фактическими. Однако, в более поздних версиях (например в Qbasic) предусмотрены подпрограммные единицы SUB - подпрограммы-процедуры и FUNCTION - подпрограммы-функции. В следующем примере использована подпрограмма решения квадратного уравнения SUB kvur(a,b,c) со списком входных данных. В основной программе можно объявить подпрограмму оператором DECLARE, а вызвать ее с помощью команды CALL.
Программа 74 5 ' ********** пример работу с подпрограммой ******** 10 DECLARE SUB kvur (а!, Ь!, с!) 20 INPUT "введи а, Ь, с"; а, Ь, с 30 CALL kvur (a, Ь, с) 40 END SUB kvur (a, b, c) 1000 d.=b*b-4*a*c 1010 IF d < 0 THEN PRINT "корней нет": GOTO 1050 1020 xl = (- b + SQR(d)) / 2 / a 1030 x2 = (- b - SQR(d)) / 2 / a 1040 PRINT ="; xl, ="; x2 1050 END SUB
Контрольные вопросы 1. В чем подпрограммы Бейсика принципиально отличаются от процедур Паскаля? РАБОТА С ФАЙЛАМИ
Для осуществления связи с внешними периферийными устройствами и с файловой системой операционной среды в Бейсике предусмотрена работа с файлами. В следующем фрагменте программы показаны команды для открытия внешнего файла с именем "aaa3.dat" на активном устройстве внешней памяти для записи (OPEN-FOR OUTPLT-AS ff). Запись в файл осуществляется командой PRINT или WRITE с указанием номера файла (строка 30). По завершении работы с файлом его закрытие осуществляется оператором CLOSE. 5 ' ********* работа с файлами для записи ********* 10 OPEN "аааЗ.ааГ FOR OUTPUT AS ^3 20FORi=1TO10 30 PRINT #3, i:' либо эквивалентная команда WRITE #3, i 40 NEXT i 50 CLOSE #3 Аналогичные команды используют при извлечении данных из существующего файла. При этом в команде OPEN указывают служебное слово INPUT, а считывание информации происходит по команде INPUT с указанием номера файла. ' *(******** работа с файлами доя чтения ********** 60 OPEN "aa3.dat" FOR INPUT AS #2 'для чтения 70 FOR i = 1 TO 10 80 INPUT #2, a(i) 90 PRINT a(i) 100 NEXTi 110 CLOSE #2 Добавить данные в существующий файл можно, используя служебное слово APPEND. ' работа с файлами для продолжения записи в существующий файл 120 OPEN "aa3.dat" FOR APPEND AS #1 130 WRITE #1, 13 140 CLOSE #1 Ниже приведен пример двух программ, осуществляющих передачу и прием зашифрованного послания. Текст шифруется заменой символа его порядковым номером в русском алфавите со смещением на 10. Например, код буквы "а"равен 11, буквы "б" - 12 и т.д. Программы вполне аналогичны программам 26 на Паскале, разобранным в параграфе 3, хотя для разнообразия способ шифровки принят несколько иным. Программа 75 (см. программу 27 sekret) 5 ' ******«-** шифровка текста **************
10 INPUT "введи текст"; а$ 23 с5 = "абвгдежзийклмнопрстуфхцчшшъыэюя " 30 х$ = " " 40 FOR i = 1 ТО LEN(a$) 50 FOR j = 1 TO LEN(c$) 60 IF MID$(a$, i, 1) - MID$(c$, j, 1) THEN k = j: GOTO 90 70 NEXT j 80 PRINT "таких символов в таблице кодов нет": GOTO 160 90 kk = k + 10 100 x$ = x$ + STR$(kk) 110 NEXT i 120 OPEN "letter.txt" FOR OUTPUT AS #1 130 PRINT #1, x$ 140 CLOSE»1 150 PRINT "шифровка - "; x$ 160 END Результатом работы программы является зашифрованный текст, записанный в файл с именем letter.txt. Следующая программа считывает информацию из этого файла и проводит его раскодирование, используя указанный выше ключ. Программа 76 (см. программу 27 retsek) 5 '*********•* расшифровка текста *******•***«*» 10 OPEN "letter.txt" FOR INPUT AS #1 20 INPUT tl, a$ 30 CLS 40 PRINT a$ 50 c$ = "абвгдежзийклшюпрстуфхцчшщъыэюя " 60 x$ = " " 70 FOR i = 1 TO LEM(a$) STEP 3 SO k = VAL(MID$(a$, i, 2)) 90 k = k - 10 100 x$ = x$ + MID$(c$, k, 1) 110 NEXT i 120 CLOSE #1 130 PRINT "шифровка - "; x$ 140 END
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|