- •Содержание
- •Введение
- •1. Общие сведения
- •2. Основные элементы языка Бейсик
- •2.1. Алфавит.
- •2.2. Типы данных.
- •2.3. Стандартные функции языка Бейсик
- •2.4. Арифметическое выражение
- •3. Управляющие операторы языка Бейсик
- •3.1. Оператор присваивания
- •3.2. Операторы ввода/вывода данных
- •4. Операторы управления
- •4.1. Программирование разветвлений
- •4.1.1. Логические выражения и выражения отношения
- •4.1.2. Оператор if-then-else-условный оператор
- •4.1.3. Оператор select case
- •4.2. Программирование циклов
- •4.2.1. Операторы организации циклов for-next
- •4.2.2. Оператор while-wend-итерационный цикл 1
- •4.2.3. Оператор do-while (until) lоор-итерационный цикл 2
- •4.3. Процедуры и функции
- •5. Описание и обработка массивов
- •5.1. Оператор размерности массива dimension
- •5.2. Сортировка массивов
- •5.2.1. Сортировка методом пузырька
- •5.2.2. Сортировка массива с помощью оператора обмена swap
- •5.2.3. Другие методы сортировки
- •6. Строковые выражения и функции
- •7. Файлы данных
- •8. Работа с графикой
- •Литература
5.2.3. Другие методы сортировки
Сортировка Шелла быстрее метода пузырька, она похожа на метод пузырька, но, в отличие от него, начинает сравнивать не смежные, а далеко отстоящие друг от друга значения (примерно на N/2) и сортирует все эти значения, а затем уменьшает расстояние между сравниваемыми значениями. На последнем проходе расстояние между ними равно 1 и поэтому фактически этот проход выполняется по методу пузырька.
Сортировка с помощью индекса вместо переупорядочения самих значений в процессе сортировки можно образовать индекс (предметный указатель), в котором отмечаются правильные места значений в массиве. Во время сортировки значения остаются на исходных местах, а изменяется индекс. По окончанию сортировки индекс используется для копирования сортируемых значений в новый массив или служит справочником для работы с исходным массивом.
Если нам требуется отсортировать массив А(100) , то надо ввести индекс I(100), лучше всего целочисленный, если такая возможность предусмотрена в системе (это сократит занимаемую массивом память), и задать начальные значения его элементов операторами
FOR L=0 TO 100
I(L) =L
NEXT L
Для индекса должно выполняться соотношение
I(исходная позиция) = новая позиция
поэтому перед началом сортировки I(1) = 1, I(2) = 2 и т. д. При сортировке во время каждого прохода сравниваются значения из А, определенные по I( ), а переставляются значения индекса в I( ).
При введении индекса программа для сортировки методом пузырька превратится в следующую программу:
REM СОРТИРОВКА С ПРИМЕНЕНИЕМ ИНДЕКСА
FOR L=l TO N
I(L)=L
NEXT L
REM ФРАГМЕНТ ПУЗЫРЬКОВОЙ СОРТИРОВКИ
REM
FOR I=N TO 2 STEP –1
FOR J=l TO I-1
I1=I(J)
I2=I(J+1)
IF A(I1)<A(I2) THEN
I(J)=I2
I(J+1)=I1
ENDIF
NEXT J
NEXT I
REM КОНЕЦ СОРТИРОВКИ С ПРИМЕНЕНИЕМ ИНДЕКСА
Операторы
FOR L = 1 ТО N
PRINT A (L);
NEXT L
распечатают исходный, неизмененный набор значений, а операторы
FOR L = 1 ТО N
I1=I(L)
PRINT A(II)
NEXT L
распечатают отсортированный набор значений.
Пример. Задана целочисленная квадратная матрица. Необходимо упорядочить элементы главной диагонали матрицы по убыванию.
INPUT "Введите размерность матрицы N="; N
DIM A(N, N)
FOR I = 1 TO N
FOR J = 1 TO N
PRINT " A("; I; J; ")=";
INPUT A(I, J)
NEXT J, I
FOR I = 1 TO N - 1
FOR J = I + 1 TO N
IF A(I, I) < A(J, J) THEN
SWAP A(I, I), A(J, J)
END IF
NEXT J, I
FOR I = 1 TO N
FOR J = 1 TO N
PRINT A(I, J);
NEXT J
NEXT I
END
6. Строковые выражения и функции
Наряду с числовыми переменными в языке Бейсик определены и строковые переменные. Имена строковых переменных заканчиваются знаком $. Константы строкового типа при записи заключаются в кавычки. В языке Бейсик над строками определена единственная операция — операция конкатенации (слияние строк). Она обозначается знаком + , при этом длина результирующей строки не должна быть больше N.
Для присваивания строковым переменным значений строкового типа в языке служит обычный оператор присваивания, в левой части которого указывается имя строковой переменной, а в правой части — выражение строкового типа.
Строковым выражением называется выражение, включающее в себя строковые константы, переменные строкового типа, элементы строковых массивов, строковые функции, связанные между собой операцией конкатенации. Например, результатом выполнения приведенных ниже операторов
А$="СТР"
B$="ОКА СИМ"
С$=А$+В$+"ВОЛОВ"
PRINT С$
будет строка на экране монитора СТРОКА СИМВОЛОВ
В строковых выражениях могут использоваться следующие функции:
CHR$(N) |
Возвращает символ по коду ASCII. PRINT CHR$(68). Результат D |
ASC(A$) |
Возвращает ASCII код первого символа. PRINT ASC(“ADF”). Результат 65. |
STR$(N) |
Возвращает строковое выражение числа. PRINT STR$(68). Результат 68. PRINT STR$(А68). Результат 0. |
VAL(A$) |
Переводит строковое выражение в число. |
LEN(A$) |
Возвращает длину строкового выражения. PRINT LEN("Бейсик"). Результат 6. |
INSTR(N,A1$,A2$) |
Возвращает позицию строкового выражения A2$ в A1$, начиная с N позиции. PRINT INSTR(1,"ABC","B"). Результат 2. PRINT INSTR(3,"ABC","B"). Результат 0. |
STRING$(N1,A$) STRING$(N1,N2) |
Возвращает строку длиной N1 c повторяющегося символа A$ или с кодом N2. PRINT STRING$(26,"-") или PRINT STRING$(26,45). Результат - строка в 26 символов – (тире) |
SPACE$(N) |
Возвращает строку с N пробелами PRINT SPACE$(5). |
LEFT(A$,N) RIGHT$(A$,N) |
Возвращают N символов с левого или правого конца строкового выражения. |
MID$(A$,N1,N2) |
Возвращает часть строкового выражения или замещает часть строковой переменной. |
LTRIM$(A$) RTRIM$(A$) |
Удаляют начальные и концевые пробелы. |
INKEY$ |
Считывает символ с клавиатуры. |
Пример 1.
I$="МАТЕМАТИКА"
J$=LEFT$(I$,4)
K$=RIGHT$(I$,5)
L$=MID$(I$,3,3)
PRINT J$;"РИАЛ НОВОЙ ";L$;"Ы-ТРУДЕН"
PRINT "СТ"+К$,"-ЭТО РАЗДЕЛ МЕХАНИКИ"
на экране появятся следующие две строки:
МАТЕРИАЛ НОВОЙ ТЕМЫ-ТРУДЕН
СТАТИКА -ЭТО РАЗДЕЛ МЕХАНИКИ
Пример 2.
Х$="PROGRAM"
L=LEN(X$)
K=ASC(X$)
М=INSTR(X$,"GRAM")
D=VAL("777")
PRINT "ДЛИНА СТРОКИ ";Х$;"=";L
PRINT "КОД 1-ГО СИМВОЛА СТРОКИ=";К
PRINT "НАЧАЛЬНАЯ ПОЗИЦИЯ ВХОЖДЕНИЯ СТРОКИ GRAM=";M
PRINT "ЦЕЛОЕ ЧИСЛО=";D
на экран будет выведена следующая информация:
ДЛИНА СТРОКИ PROGRAM = 7
КОД 1-ГО СИМВОЛА СТРОКИ= 80
НОМЕР НАЧАЛЬНОЙ ПОЗИЦИИ ВХОЖДЕНИЯ СТРОКИ GRAM= 4
ЦЕЛОЕ ЧИСЛО = 777
Строки можно сравнивать в условных выражениях операторов IF. При проверке на равенство (операция =) вырабатывается истинное значение, только если строки идентичны. Применительно к строкам можно использовать и операции < (меньше), < = (меньше или равно), > (больше) и >= (больше или равно). Строки сравниваются посимвольно слева направо. Символ считается меньшим, если он имеет меньший числовой код (меньший номер в алфавите). Многие системы имеют различные внутренние числовые коды символов, поэтому операции над строками называют машинно-зависимыми.
Символы латинских букв. как правило, во всех алфавитах расположены подряд, поэтому, например,
"LY" < "LYC" < "NYC" < "NZ"
Строка 'LY" меньше строки "LYC", так как при совпадении первых двух символов вторая строка длиннее первой. "LYC" меньше "NYC", потому что символ "L" стоит раньше символа "N" в латинском алфавите, т. е. имеет меньший числовой код. Строка "NYC" меньше строки "NZ", так как при совпадении первых символов сравниваются вторые символы строк, "Y"<"Z".
При вводе строковых значений с помощью оператора INPUT вводимые строки символов можно и не заключать в кавычки, но если в состав строки входит символ ",",то кавычки обязательны, иначе запятая будет воспринята как разделитель вводимых значений. Например, если для оператора INPUT К, L$, М$ на клавиатуре набрать следующие значения:
? 25.4, "MAX=, MIN=", СУММА <ENTER>
то переменной К присвоится вещественное число 25.4, строковой переменной L$ присвоится строка символов "MAX=, MIN=", а строковой переменной М$ — строка "СУММА". Если бы при наборе исходной информации кавычки были опущены, то переменной L$ соответствовала бы строка "MAX=", переменной М$ - строка "MIN=". а последнее вводимое строковое значение оказалось бы лишним. В таких случаях некоторые системы выдают предупреждение о несоответствии числа параметров в списке ввода и числа вводимых данных.
В большинстве Бейсик-систем предусмотрен специальный оператор LINE INPUT, предназначенный для ввода в одну строковую переменную произвольной строки символов. Вводимая последовательность символов может содержать любые знаки, в том числе запятые, пробелы и кавычки. Строковой переменной присваиваются все вводимые данные до тех пор, пока не будет превышена допустимая длина строки, определяемая реализацией, или пока не будет нажата клавиша <ENTER>.
В Бейсик-программах для представления текстовой информации часто используют массивы строк. Как и числовые массивы, они должны описываться в программе с помощью оператора DIM. Например, оператор DIM А$(5) определяет массив, состоящий из шести компонентов строкового типа.
Ниже приводится пример программы, в которой по исходным данным — списку учащихся группы и их оценкам — осуществляется поиск учащихся, средний балл оценок у которых выше 4,5:
REM ПРИМЕР 3
INPUT "ВВОДИ ЧИСЛО УЧАЩИХСЯ В ГРУППЕ->";N
INPUT "ВВОДИ ЧИСЛО ЭКЗАМЕНОВ->";M
DIM A$(N),B(N,M)
FOR I=l TO N
INPUT "ВВОДИ ФАМИЛИЮ->";A$(I)
FOR J=l TO M
INPUT "ВВОДИ OЦEHKУ->";B(I,J)
NEXT J.I
FOR I=l TO N
S=0
FOR J=l TO M
S=S+B(I,J)
NEXT J
IF S/M>4.5 THEN
PRINT A$(I);"СРЕДНИЙ БАЛЛ=";S/М
END IF
NEXT I
END
В данной программе формируются два массива: А$ — одномерный массив строк, содержащий фамилии учащихся. и В - двумерный массив, содержащий их оценки. Массивы описываются динамически в соответствии с вводимым числом учащихся в группе и числом экзаменов. В первых двух вложенных циклах осуществляется ввод исходной информации, а в следующих двух вложенных циклах – вычисление среднего балла каждого учащегося и вывод на экран фамилий тех учащихся, чей средний балл выше 4,5.
Пример 4. В заданной переменной вычислить количество гласных букв и на их место поставить символ " " (пробел). Преобразованную переменную вывести на экран.
INPUT "Введите переменную->"; P$
G$ = "АИЕОУЯЮЭЫаиеоуяюэы"
K = 0
FOR I = 1 TO LEN(P$)
IF INSTR(G$, MID$(P$, I, 1)) <> 0 THEN
K = K + 1
MID$(P$, I, 1) = " "
END IF
NEXT I
PRINT "Преобразованная переменная->"; P$
PRINT "Количество гласных букв= "; K
END
Пример 5. В текстовой переменной, состоящей из букв и цифр, цифры переставить в порядке возрастания, оставив буквы на своих местах. Полученную переменную вывести на экран дисплея.
INPUT "Введите переменную->"; P$
FOR I = 1 TO LEN(P$) - 1
FOR J = I + 1 TO LEN(P$)
IF VAL(MID$(P$, I, 1)) <> 0 THEN
IF VAL(MID$(P$, J, 1)) <> 0 THEN
IF VAL(MID$(P$, I, 1)) >= VAL(MID$(P$, J, 1)) THEN
A$ = MID$(P$, I, 1)
MID$(P$, I, 1) = MID$(P$, J, 1)
MID$(P$, J, 1) = A$
END IF
END IF
END IF
NEXT J, I
PRINT "Преобразованная переменная->"; P$
END
Пример 6. В заданной переменной, состоящей из букв и цифр все цифры заменить на символ "*". Полученную переменную вывести на экран дисплея.
INPUT "Введите строку символов->"; S$
FOR I = 1 TO LEN(S$)
IF VAL(MID$(S$, I, 1)) <> 0 THEN
MID$(S$, I, 1) = "*"
END IF
NEXT I
PRINT "Преобразованная переменная->"; S$
END
Пример 7. Существует ведомость, состоящая из N фамилий. Вывести на экран дисплея самую короткую фамилию, количество букв в ней и ее порядковый номер.
INPUT "Количество фамилий->"; N
DIM FAM$(N)
FOR I = 1 TO N
PRINT "Введите фамилию->"; I
INPUT FAM$(I)
NEXT I
MIN = LEN(RTRIM$(FAM$(1)))
F$ = FAM$(1)
NOM = 1
FOR I = 1 TO N
IF LEN(RTRIM$(FAM$(I))) < MIN THEN
MIN = LEN(RTRIM$(FAM$(I)))
F$ = FAM$(I)
NOM = I
END IF
NEXT I
PRINT "Самая короткая фамилия->"; F$
PRINT "Количество букв в ней->"; MIN; "Порядковый номер->"; NOM
END
Пример 8. Задан список фамилий. Вывести на экран фамилии, которые заканчиваются на гласную букву.
INPUT "Введите количество фамилий-> "; N
DIM FAM$(N),F$(N)
FOR I = 1 TO N
PRINT "Введите фамилию->"; I
INPUT FAM$(I)
NEXT I
J = 0
FOR I = 1 TO N
IF INSTR("АИЕОУЯЮЭЫаиеоуяюэы", MID$(FAM$(I), LEN(FAM$(I)))) <> 0 THEN
J = J + 1
F$(J) = FAM$(I)
END IF
NEXT I
PRINT "Фамилии, заканчивающиеся на гласную букву->"
FOR I = 1 TO J
PRINT F$(I)
NEXT I
END
Пример 9. Определить букву, на которую начинается больше всего слов в заданном тексте.
DIM a(255)
LINE INPUT "Введите текст->"; s$
s$ = " " + s$
FOR i = 2 TO LEN(s$)
s1$ = MID$(s$, i, 1)
s0$ = MID$(s$, i - 1, 1)
IF s1$ <> " " AND s0$ = " " THEN
a(ASC(s1$)) = a(ASC(s1$)) + 1
END IF
NEXT i
FOR i = 31 TO 255
PRINT "i="; i
IF a(i) > max THEN
max = a(i)
st = i
END IF
NEXT i
PRINT "Символ->"; CHR$(st);"Встречается " max; " раз"
END
Функция INKEY$ (Input KEY – ввод по ключу) предназначена для считывания символа с клавиатуры:
Формат записи INKEY$:
INKEY$
Функция INKEY$ возвращает нулевую строку символов, если нет символа для возврата.
Для стандартных клавиш INKEY$ возвращает 1-байтовую строку символов, содержащую считанный символ.
Пример 10.
PRINT "Для выхода нажмите Esc…"
DO: LOOP UNTIL INKEY$=CHR$(27) '27 – это ASCII код для Esc
Пример 11. В зависимости от нажатой клавиши клавиатуры (Y/N) вывести на экран монитора сообщение "Корректировка данных" или "Расчет".
DO
PRINT "Будете корректировать данные? (Y/N)"
DO
p$ = INKEY$
LOOP WHILE p$ =""
K = INSTR("YyНнNnТт", p$)
LOOP WHILE K = 0
IF N <= 4 THEN PRINT "Корректировка данных"
IF N > 4 THEN PRINT "Расчет"