Строковые функции и операторы
Приведем наиболее часто употребляемые строковые функции:
Функции, возвращающие числовые значения:
ASC(Str$)– выдает числовое значение ASCII-кода первого символа в Str$.
LEN(Str$)– выдает целое число, равное длине строкового выражения Str$.
VAL(Str$)– преобразует строку в числовое выражение, если первый символ аргумента не числовой, то функция возвращает ноль.
INSTR(n, Str$, Str1$)– определяет позицию вхождения выражения Str1$ в Str$, начиная с позиции n.
Функции, аргумент которых числовое выражение):
CHR$(код)– выдает символ ASCII, код которого является аргументом.
STR$(числовое выражение) – преобразует числовое выражение в символьное. Если значение выражения положительно, то к полученной строке слева добавляется пробел.
Пары функций ASC(Str$)иCHR$(код); VAL(Str$)иSTR$(числовое выражение) являются обратными по своему назначению.
Функции, и аргумент и значение которых символьные выражения:
MID$(St$, n, m) в качестве результата дает фрагмент строки St$, длиной m, начиная с позиции n.
Оператор MID$(St$, n, m)= Zt$ заменяет фрагмент строки St$ длиной m, начиная с позиции n на строку Zt$.
LEFT$(St$, n) - выделяет из выражения n левых символов.
RIGHT$(St$, n) - выделяет из выражения n правых символов.
LTRIM$(St$) - удаляет левые пробелы.
RTRIM$(St$)- удаляет правые пробелы.
INKEY$ - функция анализирует информацию о нажатых клавишах. Эта функция, помещенная в цикл DO … LOOP, может быть использована для создания паузы произвольной продолжительности, управления графическим объектом, выхода из цикла и т.д.
HEX$(числовое выражение&) – возвращает шестнадцатеричное представление аргумента.
OCT$(числовое выражение&) – возвращает восьмеричное представление аргумента.
LCASE$(Str$) –переводит все буквы строки Str$ в строчные.
UCASE$(Str$) –переводит все буквы строки Str$ в прописные.
SPASE$(n%) –возвращает строку из n% пробелов.
STRING$(n%, {код | строковое выражение}) –возвращает строку из n% повторяющихся символов.
Следует обратить внимание на то, что тексты могут содержать числовую информацию, но в этом случае цифры в тексте воспринимаются как символы.
ПРИМЕР 14.1. Из исходной строки a$ удалить подряд идущие повторяющиеся пробелы (из группы подряд идущих пробелов остается один).
CLS
LINE INPUT a$ ' вводим исходную строку
DIM I, dl AS INTEGER
dl = LEN(a$) 'определяем длину строки
FOR I = 1 TO dl-1
REM Формируем новую строку b$ без лишних пробелов
REM Из строки a$ выделяем очередной символ и следующий за ним
s$ = MID$(a$, i, 1)
ss$ = MID$(a$, i + 1, 1)
IF s$ <> " " AND ss$ <> " " OR s$ <> " " AND ss$ = " " THEN
b$ = b$ + s$
REM В строку b$ записывается последний пробел из подряд идущих пробелов
ELSEIF s$ = " " AND ss$ <> " " THEN
b$ = b$ + s$
END IF
NEXT I
PRINT b$ 'выводим полученную строку
END
Пояснения к программе:
Новую строку b$ формируем следующим образом:
- в исходной строке a$ выделяются два соседних символа;
- если первый из них не пробел, то он присоединяется к новой строке;
- если оба символа пробелы, то в новую строку ничего не добавляется;
- пробел добавляется с случае, когда первый из символов пробел, а второй нет. Таким образом, в новую строку добавляется последний пробел из группы подряд идущих пробелов;
- все условия в блочном операторе можно объединить в одно сложное условие.
ПРИМЕР 14.2.Для строки a$ определить, является ли она симметричной (читается одинаково слева направо и справа налево).
LINE INPUT a$ 'вводим исходную строку
DIM I AS INTEGER
FOR I=LEN(a$) TO 1 STEP -1 'используем отрицательный шаг
b$=b$ + MID$(a$, I, 1) 'заполнение зеркально отраженной строки
NEXT I
IF a$=b$ THEN 'сравнение исходной строки и зеркально отраженной
PRINT "Строка симметричная"
ELSE PRINT "Строка несимметричная"
END IF
END
Пояснения к программе:
- по исходной строке a$ формируем новую строку b$, которая является зеркальным отображением исходной (исходная строка переписанная от конца к началу);
- если строки a$ и b$ совпадают, то исходная строка a$ является симметричной.
Рассмотрим другой способ решения задачи.
LINE INPUT a$ 'вводим исходную строку
DIM I, n AS INTEGER
n=LEN(a$)
FOR I=1 TO n\2
b1$=MID$(a$, I, 1) 'считывание очередного символа строки
b2$=MID$(a$, n-I+1, 1) 'считывание симметричного символа
IF b1$<>b2$ THEN PRINT "Строка несимметричная" : END
NEXT I
PRINT "Строка симметричная"
END
Пояснения к программе:
- в этом способе в цикле считываются очередной символ исходной строки и симметричный ему символ из второй половины строки;
- если эти символы не совпадают, исходная строка не является симметричной.
ПРИМЕР 14.3. Сложить два целых положительных числа большой длины.
CLS
INPUT "введите первое число", a$
INPUT "введите второе число", b$
DIM la, lb, I, per, sd, s1, s2 AS INTEGER
la = LEN(a$) : lb = LEN(b$)
IF la < lb THEN
DO WHILE la <> lb 'цикл выравнивания строк по длине
a$="0"+a$: la = LEN( a$)
LOOP
END IF
IF la > lb THEN
DO WHILE la <> lb ' цикл выравнивания строк по длине
b$="0" + b$: lb = LEN(b$)
LOOP
END IF
per = 0
FOR I = la TO 1 STEP -1
REM Выделяем по одному символу из строк и преобразуем их в числа
s1 = VAL(MID$(a$, I, 1))
s2 = VAL(MID$(b$, I, 1))
s = s1 + s2 + per 'складываем поразрядно числа и перенос
IF s > 9 THEN
ed = s MOD 10: per = 1 'разделяем сумму на единицы и десятки-перенос
ELSE
ed = s: per = 0
END IF
REM Преобразуем число в строку, убираем пробелы
REM и присоединяем к результату
c$ = LTRIM$(STR$(ed)) + c$
NEXT I
IF per = 1 THEN c$ = STR$(per) + c$ 'присоединяем последний перенос
PRINT a$ : PRINT b$ : PRINT c$
END
Пояснения к программе:
- т.к. диапазон представления чисел ограничен, для операций над ними могут быть использованы символьные данные, с их помощью имитируют арифметические действия над числами большой величины;
- в данной программе имитируется сложение двух чисел столбиком;
- вводятся два числа в символьной форме;
- строки выравниваются по длине, для этого к началу более короткой строки приписываются нули;
- начиная с конца строк, выделяется по одной цифре из каждой строки, которые преобразуются в числовую форму, и складываются (s1 и s2);
- если их сумма больше 9, то отдельно записываются единицы в ячейку «ed» и перенос - в ячейку «per»; перенос участвует в сложении цифр следующего разряда заданных чисел.
ПРИМЕР 14.4. Дана строка символов, заканчивающаяся точкой. Посчитать, сколько слов содержит данная строка.
CLS
LINE INPUT a$ ' вводим исходную строку
REM Описываем целочисленные переменные, K – счетчик слов
DIM L, I, K AS INTEGER
L = LEN(a$)
K = 0 'устанавливаем начальное значение счетчика слов
FOR I = 1 TO L-1
REM Считываем из исходной строки два соседних символа
s$ = MID$(a$, I, 1)
ss$ = MID$(a$, I + 1, 1)
REM Счетчик увеличивается, если за пробелом следует не пробел
IF s$ <> " " AND ss$ <> " " THEN K = K + 1
NEXT I
PRINT K + 1
END
Пояснения к программе:
- учитываем, что слова отделяются друг от друга пробелами. Подсчитав количество пробелов (групп пробелов), можно определить количество слов в строке. Т.к. в конце строки стоит точка, то количество пробелов будет на единицу меньше, чем число слов;
- в исходной строке a$ выделяются два соседних символа;
- если первый из них пробел, а второй нет, то счетчик слов увеличивается на единицу;
- после обработки строки выводится увеличенное на единицу значение счетчика слов;
- данная программа правильно работает и в случае, когда слова отделяются друг от друга более чем одним пробелом;
- считаем, что перед первым словом исходной строки пробелов нет и между последним словом и завершающей точкой также нет пробелов, иначе программа будет выдавать неверный результат.
Группу строк (символов) можно хранить в строковом массиве, например A$(i), и обращаться к отдельным строкам по именам A$(1),A$(2),A(3) и т.д. Например, список фамилий в телефонном справочнике можно представить, как одномерный строковый массив.
Для массивов строк допустимы те же имена, что и для числовых массивов, только к имени добавляется знак $ или в описании указывается тип. Каждый элемент массива равноценен строковой переменной. Действие всех вышеперечисленных строковых функций распространяется и на элементы массивов.
ПРИМЕР 14.5. С клавиатуры вводится список фамилий. Количество фамилий заранее известно. Распечатать список фамилий в алфавитном порядке.
REM Задача представляет собой задачу сортировки одномерного массива
CLS
DIM n, i, j AS INTEGER
INPUT n 'вводим количество фамилий
DIM fio(n) AS STRING 'описываем символьный массив
REM Вводим с клавиатуры список фамилий
FOR i = 1 TO n
INPUT fio(i)
NEXT
REM Сортировка массива методом «пузырька»
FOR i = 1 TO n - 1
FOR j = 1 TO n - i
REM Если фамилии не по алфавиту, меняем их местами оператором "swap"
IF fio(j) > fio(j + 1) THEN SWAP fio(j), fio(j + 1)
NEXT j
NEXT i
REM Выводим на экран отсортированный список фамилий
FOR i = 1 TO n
PRINT fio(i)
NEXT
END
ПРИМЕР 14.6. Дана строка, состоящая из нескольких слов. Записать слова строки в символьный массив (элемент массива – слово строки). Вывести полученный массив в столбик.
CLS
LINE INPUT a$ ' вводим исходную строку
REM Описываем целочисленные переменные, K – счетчик слов в строке
DIM L, I, K, J, m AS INTEGER
L = LEN(a$)
K = 0 'устанавливаем начальное значение счетчика слов
FOR I = 1 TO L-1
REM Считываем из исходной строки два соседних символа
s$ = MID$(a$, I, 1)
ss$ = MID$(a$, I + 1, 1)
REM Счетчик увеличивается, если за пробелом следует не пробел
IF s$ <> " " AND ss$ <> " " THEN K = K + 1
NEXT I
K = K + 1 'окончательное значение счетчика слов
a$ = a$ + " " 'пробел в конце строки: каждое слово заканчивается пробелом
DIM SL$(1 TO K) 'описываем строковый массив по числу слов в строке
REM Формируем строковый массив
I = 1 'устанавливаем позицию начала поиска первого пробела в строке
FOR J = 1 TO K
m = INSTR(I , a$, " ") 'ищем позицию вхождения в строку очередного пробела
SL$(J) = MID$(a$, I, m-I) 'записываем очередное слово в массив
I = m +1 'устанавливаем позицию начала поиска очередного пробела
PRINT SL$(J) 'выводим сформированный элемент массива на экран
NEXT J
END
Пояснения к программе:
- подсчитываем число слов в исходной строке a$: переменная K;
- добавляем пробел в конце строки, теперь каждое слово в строке заканчивается пробелом;
- описываем строковый массив SL$, количество элементов которого равно числу слов в исходной строке a$;
- переменная I – позиция начала поиска очередного пробела в строке одновременно является позицией начала очередного слова в строке, начальное значение переменной I равно 1;
- ищем позицию вхождения очередного пробела в строке – функция INSTR и формируем элемент массива SL$;
- выводим очередной элемент массива SL$ на экран.
Лабораторное задание
1. При домашней подготовке составить программы обработки строк согласно варианту Вашего индивидуального задания.
2. В системе QBASIC создать файлы программ.
3. Отладить и выполнить программы. Результат вывести на экран.
4. Проанализировать работу операторов и символьных функций.
5. Составить отчет. Защитить работу.
Лабораторная работа состоит из двух задач. Студент выбирает из списка заданий свой индивидуальный вариант и выполняет его.
Вариант №1
Задание № 1.
Даны строки a$ и b$. Вывести все символы строки a$, не входящие в строку b$.
Задание № 2.
В исходной строке b$ определить количество слов, начинающихся заданным символом x$.
Вариант №2
Задание № 1.
Дана строка a$. Расположить все символы строки a$ в алфавитном порядке.
Задание № 2.
В исходной строке b$ заменить все вхождения заданного символа x$ на другой заданный символ y$.
Вариант №3
Задание № 1.
В исходной строке b$ определить сумму цифр самой длинной последовательности подряд идущих цифр.
Задание № 2.
В исходной строке b$ определить количество слов, содержащих хотя бы один заданный символ x$.
Вариант №4
Задание № 1.
В исходной строке b$ определить количество цифр, входящих в эту строку, если цифр нет, выдать соответствующее сообщение.
Задание № 2.
В исходной строке b$ отсортировать все слова по алфавиту.
Вариант №5
Задание № 1.
В исходной строке b$ определить все слова, отличные от первого слова. Вывести эти слова в столбик.
Задание № 2.
Определить для строки b$, является ли она правильной записью целого числа без знака в двоичной системе счисления. Если да, определить является ли это число четным.
Вариант №6
Задание № 1.
В исходной строке b$ после каждого вхождения заданного сочетания символов x$ ввести сочетание символов y$.
Задание № 2.
Определить для строки b$, является ли она правильной записью целого числа без знака в десятичной системе счисления.
Вариант №7
Задание № 1.
Определить для строки b$, является ли она правильной записью целого числа без знака в восьмеричной системе счисления.
Задание № 2.
В исходной строке а$ произвести циклическую перестановку слов влево на n слов. Вывести исходную и полученную строки.
Вариант №8
Задание № 1.
Определить для строки b$, является ли она правильной записью целого числа без знака в шестнадцатеричной системе счисления.
Задание № 2.
Вывести все символы исходной строки а$, начиная от первого заданного символа x$ до последнего заданного символа y$. Если заданных символов в строке нет, вывести сообщение об этом.
Вариант №9
Задание № 1.
Определить сумму ASCII-кодов символов, составляющих строку а$. Сформировать строку b$, состоящую из символов, ASCII-коды которых на заданное число n больше кодов соответствующих символов строки а$.
Задание № 2.
Вывести все слова исходной строки а$, которые встречаются в ней один раз.
Вариант №10
Задание № 1.
В исходной строке а$ заменить все вхождения знака «.» на знак «!».
Задание № 2.
Определить, сколько предложений содержится в исходной строке а$ и сколько слов находится в каждом предложении. Результат анализа вывести на экран.
Вариант №11
Задание № 1.
Определить, сколько слов содержится в исходной строке а$. Найти самое длинное слово в строке.
Задание № 2.
Дано натуральное число n. Приписать по единице перед старшим и после младшего разрядов числа. Задачу решить с использованием символьных функций.
Вариант №12
Задание № 1.
В исходной строке а$ найти и вывести самое длинное и самое короткое слова.
Задание № 2.
В исходной строке b$ заменить все вхождения заданной подстроки x$ на другую заданную подстроку y$.
Вариант №13
Задание № 1.
В исходной строке b$ определить количество слов, заканчивающихся заданным символом x$.
Задание № 2.
Определить для строки b$, является ли она правильной записью целого нечетного числа без знака в двоичной системе счисления. Если да, инвертировать это число.
Вариант №14
Задание № 1.
В исходной строке b$ определить среднее арифметическое всех цифр, входящих в эту строку, если цифр нет, выдать соответствующее сообщение.
Задание № 2.
В исходной строке а$ произвести циклическую перестановку слов вправо на n слов. Вывести исходную и полученную строки.
Лабораторная работа № 15
Работа в графическом режиме
Цель работы:
1. Изучение приемов программирования с использованием графического режима.
2. Приобретение практических навыков работы в графическом режиме.
Для воспроизведения графики компьютер снабжен специальными аппаратными средствами. К ним относятся монитор и специальное устройство – видеоадаптер (видеокарта), выполняющее роль переводчика между памятью и экраном. Видеоадаптер вместе с монитором образуют видеоподсистему.
Видеоподсистемы работают в двух видеорежимах: текстовом или графическом. В текстовом режиме экран монитора разбивается на отдельные символьные позиции, в каждой из которых может выводиться только один символ.
В графическом режиме для каждой точки изображения, называемой пикселем, отводится от одного (монохромный режим) до 24-бит (цветной). В этом режиме имеется доступ к каждой точке изображения. Любое изображение можно представить в виде множества мельчайших точек, каждой из которых сопоставлены две координаты и номер цвета. Полученный числовой набор, называемый растром, более или менее точно опишет изображение. Графические режимы используются для формирования рисунков.
В программировании используется такая характеристика как разрешение. Для графических режимов - это количество доступных точек на экране, для текстовых - количество символов в строке. Разрешение экрана является одним из важнейших параметров видеоподсистемы. Чем оно выше, тем больше информации можно отобразить на экране.
Количество различных цветов (цветовое разрешение), доступных для раскрашивания изображений - другое важное свойство графического режима. Базовая палитра IBM - совместимых ЭВМ включает 16 стандартных цветов. В программах цвета задаются своими номерами, приведенными ниже:
Таблица 9. Номера экранных цветов
номер | цвет | номер | цвет | |||
черный | серый | |||||
голубой | ярко-голубой | |||||
зеленый | ярко-зеленый | |||||
бирюзовый | ярко-бирюзовый | |||||
красный | ярко-красный | |||||
розовый | ярко-розовый | |||||
коричневый | желтый | |||||
белый | ярко-белый | |||||
Современные персональные компьютеры комплектуются дисплеями способными отображать палитры от 256 до 16 млн. цветов.
В графическом режиме каждый пиксель определяется цветом и своими координатами - положением относительно левого верхнего угла экрана, который, в свою очередь, имеет координаты (0,0). Программист может управлять цветом любого пикселя, что позволяет формировать на экране любые изображения, в том числе рисунки, графики, чертежи, символы.
В текстовых режимах можно задавать координаты символа, определяя положение курсора, относительно левого верхнего угла экрана (1,1), цвет символа (цвет переднего плана) и цвет фона (цвет заднего плана).