Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Обработка символьной информации




 

Кроме числовых значений переменные в Бейсике могут принимать значения в виде строки символов. Символьные значения (константы) заключаются в кавычки " ".

Имя символьной (строковой) переменной отличается от обычной числовой переменной добавлением справа специального символа, чаще знака доллара $, например, 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

 





Поделиться с друзьями:


Дата добавления: 2016-11-12; Мы поможем в написании ваших работ!; просмотров: 394 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Вы никогда не пересечете океан, если не наберетесь мужества потерять берег из виду. © Христофор Колумб
==> читать все изречения...

2282 - | 2104 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.009 с.