Строковые функции и операторы

Приведем наиболее часто употребляемые строковые функции:

Функции, возвращающие числовые значения:

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), цвет сим­вола (цвет переднего плана) и цвет фона (цвет заднего плана).