Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
QBasic_metodichka.doc
Скачиваний:
7
Добавлен:
03.11.2018
Размер:
349.7 Кб
Скачать

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

PRINT

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 "Расчет"

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]