И.Сильванович ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ QBASIC Курс лекций 1. Основные операторы языка 1.1. Имя переменной (идентификатор) Имя (идентификатор) ячейки (переменной) состоит из двух частей - имени и знака. * имя - буква или сочетание букв латинского алфавита (A, B, SUM). Имя ячейки не может содержать более 40 символов. * знак - специальный символ, указывающий, какого рода данные находятся в этой ячейке. Возможны 3 знака: % - в ячейке содержатся целые числа (например 1 или 3), ! - в ячейке содержатся вещественные числа (1,6 или 8,43), $ - в ячейке содержатся символьные (строковые) данные. Отсутствие знака после имени эквивалентно знаку ! Пример имен ячеек: А! В% С ALF$ Правила записи арифметических выражений Арифметические выражения, состоящие из чисел и ячеек записываются в следующей форме: Арифметическая операция Как записать Пример Сложение + 23.4+345.67 Вычитание A-B Умножение * A*45 Деление / 43/2 Целочисленное деление (с отбрасыванием дробной \ 7\2 части) (результат: 3) Деление по модулю (вычисление остатка от деления) MOD 5 MOD 2 (результат: 1) Возведение в степень ^ 6^2 Извлечение квадратного корня SQR SQR(4) Извлечение корня N-ой степени ^(1/N) 5^(1/3) Сложные арифметические выражения выполняются компьютером в следующем порядке: 1. Операции в скобках. 2. Возведение в степень. 3. Умножение, деление. 4. Целочисленное деление. 5. Деление по модулю. 6. Сложение, вычитание. 1.3. Оператор присваивания LET Оператор LET присваивает ячейкам некоторое значение (содержание). Если указанной ячейки не существует, она будет создана. Если указанная ячейка существует, то ее предыдущее значение заменяется на указанное. Структура команды: LET имя ячейки = значение Значение – это данные, записываемые в ячейку. Значением может быть не только число или символы, но и результат арифметического выражения, состоящего из чисел и имен других существующих ячеек (A*B, SUM+1). И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 2 LET - единственный оператор, который допускается не указывать, то есть строка LET F=3 равнозначна строке F=3. 1.4. Оператор вывода на экран PRINT Оператор PRINT выводит на экран значение ячейки, небольшой текст, или и то, и другое вместе. Структура команды: PRINT имя ячейки PRINT “текст” PRINT “текст”; имя ячейки Можно указывать несколько ячеек, разделяя их точкой с запятой или запятой. При разделении точкой с запятой, значения будут выводиться на экран через одно знакоместо друг от друга. При разделении запятой, на каждой значение на экране будет отведено 15 знакомест. Текст обычно служит для подсказки пользователю - какие данные появились на экране. Вместо имени ячеек можно использовать арифметическое выражение, состоящее из чисел и имен существующих ячеек. В этом случае, при выполнении оператора на экране появится значение этого выражения. Пример 1: LET A=3 LET B=A+4 LET A=5 LET C=B+3 PRINT “Числа - ”; A; B, C END Результат: Числа - 5 7 10 Пример 2: LET A=5 LET B=3 PRINT “Число - ”; A+B*2 END Результат: Число - 11 1.5. Оператор ввода данных INPUT Оператор INPUT позволяет присваивать ячейкам значения уже в момент выполнения программы. Структура команды: INPUT имя ячейки INPUT “текст”; имя ячейки В момент выполнения этого оператора, исполнение программы приостановится, на экране появится знак вопроса, и система будет ждать пока пользователь наберет на клавиатуре какое-либо число (или символы, если ячейка должна содержать символьное значение), и нажмет затем клавишу Enter. Введенное пользователем число запишется в указанную ячейку. Текст, как и в операторе PRINT, служит для подсказки пользователю - какие данные запрашиваются. Пример: A=4 В=3 INPUT “Введите число”; A B=B+A PRINT “Числа - ”; A; B И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 3 END Если на запрос было введено число “2”, то результат выполнения программы: Числа - 2 5 1.6. Оператор перехода GOTO Строки программы выполняются последовательно. Оператор GOTO нарушает этот порядок. После него система перейдет к выполнению строки, помеченной специальной меткой (а затем будет выполнена следующая, нижележащая строка программы). Структура команды: GOTO метка . . (команды) . метка: Метка - символ или сочетание символов латинского алфавита. Пример: M=4 N=M+1 GOTO NU N=N+3 NU: N=N+2 PRINT N END Результат: 7 1.7. Оператор условия IF-THEN Оператор IF-THEN производит выполнение одного из двух действий в зависимости от того, окажется ли условие ложным или истинным. Структура команды: IF условие THEN действие1 ELSE действие2 (полная форма) IF условие THEN действие (неполная форма) Для полной формы: если условие окажется верным, то выполнится действие1, если условие окажется неверным, то выполнится действие2. Для неполной формы: если условие окажется верным, то выполнится действие, если условие окажется неверным, то никакого действия выполнено не будет. Действиями могут служить любые операторы - LET, PRINT, GOTO, INPUT и другие. Возможен вариант условия, когда необходимо выполнить несколько действий. В этом случае использует структура условия IF-THEN-ENDIF. Структура команды: IF условие THEN действие1 действие2 ELSE действие3 действие4 ENDIF IF условие THEN действие1 действие2 ENDIF И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 4 Каждое действие при этом записывается на отдельной строке. Условия записываются в следующей форме: Условия A равно 3 B не равно 4 C больше 5 N меньше или равно 6,45 P меньше 5, но больше 2,5 Как записать A=3 B<>4 или B><4 C>5 6<=6.45 P<5 AND P>2.5 или P>2.5 AND P<5 Задача 1: Ввести 2 числа. Напечатать на экране меньшее из них. INPUT “Введите первое число”; А INPUT “Введите второе число”; В IF A>B THEN PRINT B ELSE PRINT A END Задача 2: Ввести число. Если оно положительно, то увеличить его в два раза. Результат вывести на экран. INPUT “Введите число”; А IF A>0 THEN LET А=А*2 PRINT A END Для составления сложных условий можно использовать специальные связки OR и AND, которые связывают простые условия в сложные. Задача 3: Ввести 3 числа. Если все они разные, то напечатать на экране их сумму, в других случаях напечатать на экране их произведение. INPUT A INPUT B INPUT C IF A><B AND B><C AND A><C THEN LET D=A+B+C ELSE LET D=A*B*C PRINT D END Задача 4: Ввести три числа. Если хотя бы два из них равны между собой, то напечатать на экране их сумму, в других случаях - напечатать на экране их произведение. INPUT A INPUT B INPUT C IF A=B OR B=C OR A=C THEN PRINT A+B+C ELSE PRINT A*B*C END 1.8. Цикл 1.8.1. Цикл FOR-NEXT Цикл FOR-NEXT повторяет некоторые действия определенное число раз. Структура команды: FOR имя параметра = начальное значение TO конечное значение STEP шаг . . (повторяющиеся действия) . NEXT имя параметра * * * параметр - это ячейка, которая будет менять свое значение при выполнении цикла; нач.значение - значение ячейки-параметра при первом выполнении цикла; кон.значение - значение ячейки-параметра при последнем выполнении цикла; И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 5 * шаг - величина, которая прибавляется к значению параметра при каждом выполнении цикла. Шаг может быть дробным (например 1.5) и отрицательным (-2.5). Если шаг не указан, он равен +1. Начальным, конечным значением параметра и шагом может быть не только число но другая ячейка. При первом выполнении строки “FOR ...” параметру присваивается начальное значение. Затем подряд выполняются строки, вплоть до строки “NEXT...”. После этого вновь выполняется строчка “FOR ...” значение параметра увеличивается на величину шага и сравнивается с конечным значением. Если значение параметра меньше или равно конечному, то вновь выполняются строки вплоть до строки “NEXT...”. Если же значение параметра превысило конечное значение, то выполняется строка, находящаяся после строки “NEXT...”, то есть выполнение цикла на этом заканчивается. Следует помнить, что когда параметр равен конечному значению, цикл выполняется последний раз. Например, цикл FOR F=3 TO 5 . . NEXT F выполняется 3 раза, когда F=3, 4, 5. Существует формула, которая позволяет определить - сколько раз будет выполнен цикл: кон.значение - нач.значение Число цикла = +1 шаг Для указанного цикла число выполнений равно = (5-3)/1+1=3 Задача1: Напечатать на экране 10 раз букву “Я”. FOR B=1 TO 10 PRINT “Я” NEXT B END FOR B=6 TO 15 PRINT “Я” NEXT B END FOR B=6 TO 24 STEP 2 PRINT “Я” NEXT B END Задача 2: Напечатать на экране все числа от 10 до 25. FOR A=10 TO 25 PRINT A NEXT A END Задача 3: Напечатать на экране квадраты всех чисел от 2 до 10. FOR C=2 TO 10 N=C^2 PRINT N NEXT C END 1.8.2. Цикл DO-WHILE Цикл DO-WHILE повторяет выполнение некоторых действий до тех пор, пока будет верно условие, указанное в цикле. Структура команды: DO WHILE условие . . (повторяющиеся действия) . LOOP Условие проверяется уже при первом выполнении строки “DO ...”. Если оно - верно, то выполняются строки цикла, вплоть до строчки “LOOP”. Затем вновь выполняется строка “DO ...” - опять проверяется условие. Если оно - истинно, то снова выполняются строки цикла, если оно - ложно, то выполняется первая строка, находящаяся после строчки “LOOP”, то есть выполнение цикла на этом заканчивается. Задача:Напечатать на экране 10 раз букву “Я”. И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 6 K=1 DO WHILE K<=10 PRINT “Я” K=K+1 LOOP END Задачи для самостоятельного решения: 1. Составить программу нахождения площади квадрата по его стороне. 2. Составить программу нахождения стороны прямоугольника по периметру и другой стороне. 3. Составить программу нахождения скорости автомобиля по времени и пути. 4. Составить программу нахождения возраста человека по году его рождения. 5. Составить программу нахождения площади круга и длины окружности по радиусу. 6. Ввести три числа. Если хотя бы одно из них - положительно, то найти их сумму, иначе - найти их произведение. 7. Ввести три числа. Если все они - равны между собой, то найти их произведение, иначе - сумму. 8. Ввести два числа (разные). Напечатать большее из них. 9. Ввести два числа (разные). Напечатать разность между большим и меньшим из них. 10. Составить программу, которая запрашивает возраст человека, и печатает на экране слово ЭВМ столько раз, сколько лет человеку. 11. Напечатать на экране все чётные числа от 1 до 20. 12. Напечатать на экране кубы всех нечётных чисел от 10 до 20. 2. Методы решения простейших численных задач 2.1. Задачи по обработке натурального ряда чисел Задачи по нахождению суммы или произведения натуральных чисел всегда решаются с помощью цикла. Задача: Найти сумму натуральных чисел от 1 до 10 (то есть 1+2+...+10). Создаются две ячейки. Значение первой из них (назовем ее “А”) мы будем с помощью цикла менять так, чтобы оно равнялось требуемым числам - сначала-1, затем-2, в конце-10. И каждый раз очередное значение мы будем прибавлять ко второй ячейке “В”. Таким образом в ячейке “В” будет накапливаться сумма 1+2+3+...+10. Но в начале программы в ячейку “В” следует записать “0”. В конце программы значение ячейки “В” надо вывести на экран. С помощью цикла FOR-NEXT эта задача решается следующим образом: В=0 FOR А=1 TO 10 В=В+А NEXT А PRINT “Сумма равна - ”; В END Если использовать цикл DO-WHILE, решение будет выглядеть так: В=0 А=1 DO WHILE А<=10 В=В+А А=А+1 LOOP PRINT “Сумма равна - ”; В END Обратите внимание, что если в цикле FOR-NEXT значение ячейки “А” увеличивалось на 1 автоматически, то в цикле DO-WHILE это надо указывать специальной строкой (строчка №5). Кроме того, надо задать и начальное значение ячейки “А” (строчка №2). Кроме того, решить эту задачу можно, если организовать цикл с помощью операторов IF-THEN и GOTO: И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 7 B=0 A=1 N: IF A>10 THEN GOTO M B=B+A A=A+1 GOTO N M: PRINT “Сумма равна - ”; В END Обычно способ решения c GOTO не рекомендуется, ввиду его сложности - большого числа меток и переходов. Задача: Найти произведение натуральных четных чисел от 1 до 10. Решение аналогично предыдущему, с той лишь разницей, что начальное значение ячейки “В” должно быть “1”, а не “0”, иначе при умножении на ноль, всегда получится нулевой результат. Решение с циклом FOR - NEXT: В=1 FOR А=2 TO 10 STEP 2 В=В*А NEXT А PRINT “Произведение равно - ”; В END Решение задачи с циклом DO-WHILE: В=1 А=2 DO WHILE А<=10 В=В*А А=А+2 LOOP PRINT “Произведение равно - ”; В END Задачи для самостоятельного решения (каждую задачу следует решить двумя способами - с циклом FOR-NEXT и с циклом DO-WHILE): 1. Найти произведение натуральных чисел от 1 до 34. 2. Найти сумму натуральных четных чисел от 5 до 34. 3. Найти сумму натуральных нечетных чисел от 6 до 34. 4. Найти произведение натуральных нечетных чисел от 8 до 34. 2.2. Задачи по обработке произвольного ряда чисел Произвольный ряд, это ряд, содержащий произвольные числа. Количество чисел в ряду может также быть различным. Пример такого ряда: -5 6,5 -0,32 -1 16 32 3,2 2 -5 4 Существует два метода обработки ряда произвольных чисел. Метод предварительного ввода количества чисел в ряду В этом методе используется цикл FOR-NEXT. Сначала определим - сколько чисел в ряду, и запишем это количество в ячейку “N”. Для этой цели следует использовать оператор INPUT, поскольку количество чисел в ряду - величина переменная (в одном ряду может быть 15 чисел, а в другом - 25). Затем организуем цикл, который будет выполняться ровно N-раз (то есть столько, сколько чисел в ряду). Внутри этого цикла будем запрашивать значение очередного числа из произвольного ряда (опять с помощью INPUT), и, в зависимости от условия задачи, добавляем (или умножаем) его в специально созданную для этого ячейку “S”. В конце программы значение ячейки “S” выводим на экран. Метод фиктивного числа Описанный выше метод неудобно применять для рядов, содержащих большое количество чисел. Ведь нужно предварительно посчитать их количество, а при этом можно и ошибиться. Здесь удобно применять другой метод (с использованием цикла DO-WHILE). Ряд дополняется еще на одно число, которое на И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 8 несколько порядков отличается от всех остальных чисел в ряду. Такое число называется “фиктивное”. Мы будем считать, что фиктивное число - 1000. Теперь не надо будет вначале программы вводить количество чисел в ряду, зато каждый раз надо будет очередное вводимое число из ряда сравнивать с фиктивным. Если очередное число не равно фиктивному (то есть конец ряда еще не достигнут), это число надо прибавить (или умножить) к ячейке “S”. Если число из ряда равно фиктивному (мы дошли до конца ряда), следует вывести на экран значение ячейки “S” и закончить программу. Задача: Найти сумму чисел произвольного ряда. Метод пр.ввода кол-ва чисел: S=0 INPUT “Введите количество чисел в ряду”; N FOR A=1 TO N INPUT “Введите число из ряда”; X S=S+X NEXT A PRINT “Результат равен - ”; S END Метод фикт. числа: S=0 INPUT “Введите первое число из ряда”; X PRINT “Для окончания ввода чисел введите число 1000” DO WHILE X><1000 S=S+X INPUT “Введите следующее число из ряда”; X LOOP PRINT “Результат равен - ”; S END Задача: Найти сумму отрицательных чисел произвольного ряда Метод пр.ввода кол-ва чисел: S=0 INPUT “Введите количество чисел в ряду”; N FOR A=1 TO N INPUT “Введите число из ряда”; X IF X<0 THEN S=S+X NEXT A PRINT “Результат равен - ”; S END Метод фикт. числа: S=0 INPUT “Введите первое число из ряда”; X PRINT “Для окончания ввода чисел введите число 1000” DO WHILE X><1000 IF X<0 THEN S=S+X INPUT “Введите следующее число из ряда”; X LOOP PRINT “Результат равен - ”; S END Задача: Найти среднее арифметическое отрицательных чисел произвольного ряда. Среднее арифметическое - это сумма, деленная на количество. В данной задаче среднее арифметическое отрицательных чисел рассчитывается как сумма отрицательных, деленная на количество отрицательных. Метод пр.ввода кол-ва чисел: S=0 (будет подсчитывать сумму отрицательных) С=0 (будет подсчитывать количество отрицательных) INPUT “Введите количество чисел в ряду”; N FOR A=1 TO N И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 9 INPUT “Введите число из ряда”; X IF X<0 THEN S=S+X IF X<0 THEN C=C+1 NEXT A PRINT “Результат равен - ”; S/C END Метод фикт. числа: S=0 C=0 INPUT “Введите первое число из ряда”; X PRINT “Для окончания ввода чисел введите число 1000” DO WHILE X><1000 IF X<0 THEN S=S+X IF X<0 THEN C=C+1 INPUT “Введите следующее число из ряда”; X LOOP PRINT “Результат равен - ”; S/C END Задачи для самостоятельного решения (каждую задачу решить двумя способами): 1. Найти произведение чисел произвольного ряда. 2. Найти сумму положительных чисел произвольного ряда. 3. Найти произведение положительных чисел произвольного ряда. 4. Найти произведение отрицательных чисел произвольного ряда. 5. Найти количество положительных чисел произвольного ряда. 6. Найти количество отрицательных чисел произвольного ряда. 7. Найти среднее арифметическое чисел произвольного ряда. 8. Найти среднее арифметическое положительных чисел произвольного ряда. 2.3. Задачи по нахождению наибольшего и наименьшего числа в произвольном ряду Для нахождения наибольшего числа создадим ячейку с именем, например, “MAX”. В начале программы мы полагаем, что первое число в произвольном ряду и есть самое большое. Запишем его в ячейку “МАХ”. Затем все остальные числа ряда, начиная со второго, мы будем сравнивать с содержанием ячейки “МАХ”. Если окажется, что очередное число больше содержания ячейки “МАХ”, то мы это число и запишем в “МАХ”. Таким образом, к концу программы, в ячейке “МАХ” действительно будет находиться самое большое число в ряду. Если в программе потребуется найти и наибольшее и наименьшее число, то надо будет создать две ячейки (МАХ и МIN), и каждое число из ряда сравнивать с обеими. Задача: Найти наибольшее число среди произвольных. Метод пр.ввода кол-ва чисел: INPUT “Введите количество чисел в ряду”; N INPUT “Введите первое число из ряда”; X MAX=X FOR A=1 TO N-1 INPUT “Введите следующее число из ряда”; X IF X>MAX THEN MAX=X NEXT A PRINT “Результат равен - ”; MAX END Метод фикт. числа INPUT “Введите первое число из ряда”; X MAX=X PRINT “Для окончания ввода чисел введите число 1000” DO WHILE X><1000 IF X>MAX THEN MAX=X INPUT “Введите следующее число из ряда”; X LOOP И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 10 PRINT “Результат равен - ”; MAX END Задачи для самостоятельного решения: 1. Найти наименьшее число среди произвольных. 2. Найти наименьшее и наибольшее число среди произвольных. 3. Найти сумму наименьшего и наибольшего числа среди произвольных. 3. Найти произведение наименьшего и наибольшего числа среди произвольных. 2.4. Задача по нахождению корней произвольного квадратного уравнения Программа должна находить корни произвольного квадратного уравнения. Разные квадратные уравнения отличаются друг от друга своими коэффициентами. Эти коэффициенты и являются исходными данными. Вначале определяем дискриминант. Если он отрицателен, то на экран должна быть выведена фраза “Корней нет” и программа на этом заканчивается. Если дискриминант неотрицателен, то подсчитываются два корня, выводятся на экран и программа заканчивается. INPUT “Введите первый коэффициент”; A INPUT “Введите второй коэффициент”; B INPUT “Введите третий коэффициент”; C D=B*В-4*A*C IF D<0 THEN GOTO K XI=(-B+SQR(D))/(2*A) XII=(-B-SQR(D))/(2*A) PRINT “Первый корень равен ”; XI PRINT “Второй корень равен ”; XII GOTO N K: PRINT “Корней нет” N: END Обратите внимание, как в программе записывается функция квадратного корня. 2.5. Блок-схемы Блок-схема - это графическая схема алгоритма, по которой впоследствии можно составить программу. Элементы блок-схем: Задача1: Найти площадь круга по радиусу. INPUT R LET S=3.14*R^2 PRINT S END Такой алгоритм и такая блок-схема называются линейными. Задача 2: Ввести два числа (разные). Напечатать большее. INPUT A INPUT B IF A>B THEN PRINT A ELSE PRINT B END Такой алгоритм и такая блок-схема называются разветвляющимися. Задача 3: Найти сумму натуральных чисел от 1 до 10. B=0 FOR A=1 TO 10 B=B+A NEXT A PRINT B END или B=0 A=1 DO WHILE A<=10 B=B+A A=A+1 LOOP PRINT B END Такой алгоритм и такая блок-схема называются циклическими. 2.6. Задачи со случайными числами Случайное число - это число, величина которого не может быть заранее известна. Классический пример - число очков, выпадающих при бросании игрального кубика. В QBasic имеется функция RND(1), которая возвращает случайное значение из интервала от 0 до 1. Познакомимся с ней. Составим программу вывода первых 3 случайных чисел на экран. И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 12 FOR A = 1 TO 3 X = RND(1) PRINT X NEXT A Результат: .7055475 .533424 .5795186 Если выполнить эту программу несколько раз, то мы с удивлением обнаружим, что на экран выдается одна и та же последовательность “случайных” чисел! Это происходит потому, что на самом деле каждое следующее случайное число получается из предыдущего по хитрой формуле, которая имитирует отсутствие закономерности в последовательности чисел. А поскольку первое число последовательности одно и то же, то повторяться будут и остальные числа. Чтобы получать разные последовательности нужно при каждом запуске брать новую “затравку”. Для изменения “затравки” в начале программы (первая строка) используем команду RANDOMIZE TIMER. RANDOMIZE получает от функции TIMER значение системного времени на компьютере и формирует “затравку” для RND. При следующем запуске программы функция TIMER вернет другое значение, и получится другая последовательность чисел. Задача: Составить простейшую компьютерную игру, предлагающую пользователю с трёх попыток угадать число, «загаданное» компьютером. RANDOMIZE TIMER A=INT(RND(1)*10) PRINT “Загадано число от 0 до 10. Угадай его. У тебя 3 попытки… ” FOR B=1 TO 3 INPUT “Введи своё число”: X IF X<A THEN PRINT “Твоё число меньше загаданного” IF X>A THEN PRINT “Твоё число больше загаданного” IF X=A THEN PRINT “Ты угадал!!!” GOTO R ENDIF NEXT B PRINT “Ты проиграл. Было загадано число ”; A R: END Примечание: Функция INT округляет дробное число до целого. 3. Организация и использование массивов 3.1. Теория массивов Массив - это упорядоченный набор данных, то есть группа различных чисел или символов. Массивы могут быть одномерными, двухмерными, трехмерными. Одномерные массивы иногда называют векторами, а двухмерные - матрицами. Массивы обозначаются заглавной латинской буквой (имя массива). Каждый элемент в массиве имеет имя, состоящее из имени массива (строчная буква) и индекса (порядковый номер элемента). В одномерном массиве нумерация начинается с номера 1 и идет слева направо; в двухмерных: в строке - слева направо, в столбце - сверху вниз. В индексе двухмерного массива первое число обозначает номер строки, второе - номер столбца. И.Сильванович “Основы программирования на языке BASIC. Курс лекций” А= | B= 1 4 -5 -2.3 0 4 6 6 4 3 1 2 2 1 1 | 13 a3 = -5 1 2 4 1 5 3 2 1 b 2,3 = 4 b3,2 = 1 Двухмерные массивы, у которых число строк и число столбцов одинаково, называют квадратными. У квадратных массивов есть две диагонали: главная и побочная. 6 4 3 1 2 2 1 1 1 4 5 2 2 1 3 1 поб. гл. Любой квадратный массив характеризуется величиной, называемой Детерминант. Детерминант рассчитывается как произведение элементов лежащих на главной диагонали за вычетом произведения элементов побочной диагонали. 3.2. Создание массивов и вывод их элементов на экран Процесс создания массивов в памяти компьютера начинается с команды DIM имя массива(размер массива) Эта команда создает группу пустых ячеек под будущий массив, и присваивает им соответствующие имена. Например, команда DIM A(5) создает пять пустых ячеек с именами А(1) А(2) А(3) А(4) А(5) а команда DIM B(2,3) создает 6 ячеек с именами В(1,1) В(2,1) В(1,2) В(2,2) В(1,3) В(2,3) Следующий этап заключается в заполнении ячеек массива значениями. Проще всего сделать это с клавиатуры (с помощью INPUT). Перебор имен ячеек организуется с помощью цикла: DIM A(5) FOR I=1 TO 5 INPUT “Введите значение элемента”; A(I) NEXT I Несколько сложнее осуществить эту процедуру в двухмерных массивах. Чтобы произвести построчный ввод, следует организовать вложенные циклы - внутренний производит запрос элементов одной строки, а внешний меняет строки: DIM В(2,3) FOR I=1 TO 2 FOR J=1 TO 3 INPUT “Введите значение элемента”; B(I,J) NEXT J NEXT I Иногда по условию задачи элементы массива требуется заполнить случайными числами. Это осуществляется с помощью команды RND. Следующая программа создаёт массив из 5 элементов и заполняет его элементы целыми произвольными числами от 1 до 100. RANDOMIZE TIMER И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 14 DIM A(5) FOR I=1 TO 5 A(I)=INT(RND(1)*100) NEXT I Во многих задачах необходимо вывести полученный массив на экран. Для одномерных массивов эта процедура выглядит следующим образом: FOR I=1 TO 5 PRINT A(I); NEXT I Знак ; после имени элемента в команде PRINT указывает на то, что значения элементов массива будут располагаться на экране на расстоянии одного знакоместа друг от друга (см. главу 1.4.). При выводе на экран элементов двухмерного массива следует позаботиться о том, чтобы строки массива располагались одна над другой. Для этого, после цикла вывода каждой строки массива, надо поставить оператор PRINT, который без параметров печатает на экране одну пустую строку. FOR I=1 TO 2 FOR J=1 TO 3 PRINT B(I,J); NEXT J PRINT NEXT I 3.3. Задачи с использованием массивов Большинство задач с массивами заключается в выделении некоторых элементов. Задача: создать произвольный одномерный массив и найти сумму его положительных элементов. INPUT “Введи количество элементов массива”; N DIM A(N) S=0 FOR I=1 TO N INPUT “Введи значение элемента”;A(I) IF A(I)>0 THEN S=S+A(I) NEXT I PRINT “Результат равен ”;S END Задача: создать произвольный одномерный массив и найти его наибольший элемент. INPUT “Введи количество элементов массива”; N DIM A(N) INPUT “Введи значение элемента”;A(1) MAX=A(1) FOR I=2 TO N INPUT “Введи значение элемента”;A(I) IF A(I)>MAX THEN MAX=A(I) NEXT I PRINT “Результат равен ”;MAX END Задача: создать произвольный одномерный массив и рассортировать его элементы по убыванию. Перебираем все элементы массива. Текущий элемент сравниваем со всеми, находящимися справа от него. Если найден элемент с большим значением, чем текущий, меняем значения этих элементов командой SWAP (Команда SWAP A, B производит взаимный обмен значений ячеек А и В). INPUT "Введите размерность будущего массива"; N DIM A(N) И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 15 FOR I = 1 TO N INPUT "Введите значение"; A(I) NEXT I FOR I = 1 TO N FOR J = I TO N IF A(I) < A(J) THEN SWAP A(I), A(J) NEXT J NEXT I FOR I = 1 TO N PRINT A(I); NEXT I END Задача: создать произвольный двухмерный массив и найти сумму его элементов, лежащих во втором столбце. Первый способ - перебираем все элементы, выделяя нужные по условию (у всех элементов во втором столбце J=2). INPUT “Введи количество строк массива”; N INPUT “Введи количество столбцов массива”; M DIM A(N,M) FOR I=1 TO N FOR J=1 TO M INPUT “Введи значение элемента”;A(I,J) NEXT J NEXT I S=0 FOR I=1 TO N FOR J=1 TO M IF J=2 THEN S=S+A(I,J) NEXT J NEXT I PRINT “Результат равен ”; S END Второй способ - перебираем только требуемые элементы. INPUT “Введи количество строк массива”; N INPUT “Введи количество столбцов массива”; M DIM A(N,M) FOR I=1 TO N FOR J=1 TO M INPUT “Введи значение элемента”;A(I,J) NEXT J NEXT I S=0 FOR I=1 TO N S=S+A(I,2) NEXT I PRINT “Результат равен ”; S END Задача: создать произвольный двухмерный массив и найти сумму его элементов, лежащих ниже главной диагонали. Все элементы, лежащие ниже главной диагонали выделяет простое условие - у них второй индекс всегда меньше первого, то есть I>J. INPUT “Введи количество строк массива”; N INPUT “Введи количество столбцов массива”; M DIM A(N,M) FOR I=1 TO N FOR J=1 TO M И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 16 INPUT “Введи значение элемента”;A(I,J) NEXT J NEXT I S=0 FOR I=1 TO N FOR J=1 TO M IF I>J THEN S=S+A(I,J) NEXT J NEXT I PRINT “Результат равен ”; S END Задачи для самостоятельного решения: 1. Создать произвольный одномерный массив и найти произведение его элементов с четными индексами. 2. Создать произвольный одномерный массив и найти сумму его наибольшего и наименьшего элементов. 3. Создать произвольный одномерный массив и отсортировать его элементы по возрастанию их значений. 4. Создать произвольный двухмерный массив и найти сумму его элементов, лежащих на главной диагонали. 5. Создать произвольный двухмерный массив и найти произведение его элементов, лежащих во втором и третьем столбце. 6. Создать произвольный двухмерный массив и найти его детерминант. 7. Создать произвольный двухмерный квадратный массив. Сформировать из него одномерный массив, развернув первый построчно. 8. Создать произвольный двухмерный квадратный массив. Сформировать из него другой массив, развернув первый относительно главной диагонали (столбцы становятся строками, а строки - столбцами). 9. Создать произвольный двухмерный квадратный массив и проверить - является ли он магическим квадратом, то есть массивом у которого сумма элементов во всех строках, столбцах и обоих диагоналях одинакова. 4. Символьными (строковые) переменные 4.1. Функции обработки символьных пременных Содержанием ячейки может быть не только число, но и набор символов. Если ячейка содержит символы, то в ее имени указывается знак $. В этом случае размеры ячейки неограниченны. В операторе LET содержание символьной ячейки следует указывать в кавычках: LET A$=“ТЫ И Я” PRINT A$ END Результат: ТЫ И Я Ясно, что арифметические операции над символьными ячейками невозможны. Исключение составляет только операция сложения, именуемая в этом случае “конкатенация”: LET A$=“ГРАФ” LET B$=“ПАРА” LET C$=B$+A$ PRINT C$ END Результат: ПАРАГРАФ Для работы с символьными переменными используются специальные функции. Функция LEN(имя ячейки) определяет количество символов, из которых состоит данная ячейка: И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 17 LET A$=“ТЫ И Я” B=LEN(A$) PRINT B END Результат: 6 Функция STRING$(кол-во, “символ”) создает символьную переменную, состоящую из одинаковых символов: A$=STRING$(8, “K”) PRINT A$ END Результат: KKKKKKKK Функция MID$(имя ячейки, N1, N2) выбирает некоторые подряд идущие символы значения символьной ячейки (кусок). N1 - порядковый номер символа, с которого начинается выборка; N2 количество выбираемых символов. Пример: LET A$=“УНИВЕРСАЛЬНЫЙ” LET B$=MID$(A$, 4, 7) PRINT B$ END Результат: ВЕРСАЛЬ MID$ - единственная функция языка BASIC, которая в операторе LET может находиться слева от знака =. В этом случае указанные ей символы подлежат замене. Пример: LET A$=“УНИВЕРМАГ” LET B$=“САМБО” MID$(A$, 7, 3)=MID$(B$, 1, 3) PRINT A$ END Результат: УНИВЕРСАМ 4.2. Задачи с символьными переменными Задача: Ввести фразу, слова в которой разделены одним пробелом. Подсчитать количество слов в этой фразе. Подсчитаем количество пробелов и прибавим единицу - это и будет количество слов во фразе. Решение: INPUT “Введите фразу”; A$ S=0 B=LEN(A$) FOR K=1 TO B IF MID$(A$, K, 1)=“ ” THEN S=S+1 NEXT K PRINT “В этой фразе ”; S+1; “ слов” END И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 18 Задача: Ввести произвольную фразу. Ввести произвольное слово и выяснить - сколько раз это слово встречается в данной фразе. Решение: INPUT “Введите фразу”; A$ INPUT “Введите слово”; B$ S=0 N=LEN(A$) M=LEN(B$) FOR K=1 TO N-M IF MID$(A$, K, M)=MID$(B$, 1, M) THEN S=S+1 NEXT K PRINT “Слово встречается во фразе ”; S; “ раз” END Задачи для самостоятельного решения: 1. Составить диалоговую программу: запрашивается имя и возраст пользователя; на экран выводится фраза: ”Ты еще молод, ИМЯ!” (если возраст - до 20 лет включительно) или “А ты неплохо выглядишь, ИМЯ” (если возраст - свыше 20 лет). 2. Ввести фразу и проверить, является ли она палиндромом, то есть фразой, читающейся одинаково в обоих направлениях. (Обратите внимание, что при чтении палиндрома пробелы должны пропускаться.) 3. Ввести фразу, слова в которой разделены одним или несколькими пробелами. Подсчитать количество слов в этой фразе. 4. Составить базу данных, в которую вводятся фамилии учащихся класса, и их отметки по информатике, истории и физике за прошлую четверть. В конце программы на экран должны быть выведены фамилии учащихся, средний бал которых (среднее трех отметок) больше 4. (Для решения используйте массивы. Обратите внимание, что если массив будет содержать символьные данные, в его имени должен присутствовать знак $.) 5. Графика 5.1. Операторы графики SCREEN номер режима экрана Переключает экран в текстовый или графический режим работы. В текстовом режиме экран состоит из отдельных участков - знакомест. В каждое знакоместо может быть выведен один символ. Номер текстового режима для любого типа монитора - 0. В графическом режиме экран состоит из отдельных точек (пикселов). Количество точек, из которых состоит экран, называется разрешающей способностью монитора. Номер режима определяет эту разрешающую способность. Например, для команды SCREEN 12 разрешение будет составлять 640х480 точек. Каждый пиксель определяется своей координатой, которая отсчитывается от левого верхнего угла экрана. В программах с графикой используются следующие операторы: CLS И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 19 Очищает экран, окрашивая его в черный цвет. PSET (X,Y),Z Рисует на экране точку с координатами Х и У цветом Z. Номера цветов: 0 - черный (цвет экрана), 1 - синий, 2 - зеленый, 3 - бирюзовый, 4 - красный, 5 - малиновый, 6 коричневый, 7 - белый, 8 - серый, 9 - голубой, 10 - салатовый, 11 - светло-бирюзовый, 12 - розовый, 13 светло-малиновый, 14 - желтый, 15 - ярко-белый. LINE (X1,Y1)-(X2,Y2),Z Рисует на экране линию цвета Z, с началом в точке X1,Y1 и концом в точке X2,Y2. LINE (X1,Y1)-(X2,Y2),Z,В Рисует на экране прямоугольник цвета Z; указанные координаты являются координатами концов диагонали прямоугольника. LINE (X1,Y1)-(X2,Y2),Z,ВF Тот же прямоугольник, но закрашен внутри цветом Z. CIRCLE (X,Y),R,Z Рисует на экране окружность цвета Z, с центром в точке Х,У и радиусом R. PAINT (X,Y),Z1,Z2 Закрашивает замкнутую область цветом Z1. Х,У - координаты любой точки, находящейся внутри закрашиваемой области, Z2 - цвет границы закрашиваемой области. SLEEP количество секунд Приостанавливает выполнение программы на указанное количество секунд (пауза). 5.2. Создание статических (неподвижных) изображений Изображение создается командами графики, после чего устанавливается пауза в некоторое количество секунд (рисунок “висит” на экране). Координаты можно указывать не только в абсолютной форме (реальные координаты), но и в относительной, когда указывается величина сдвига по осям относительно предыдущей точки. Например, линию с абсолютными координатами следует построить командой LINE (400,100)-(200,350),5 Ту же линию можно построить командой с относительной координатой второй точки LINE (400,100)-STEP(-200,250),5 Опция STEP говорит о том, что координаты второй точки задаются относительно предыдущей. Следует обратить внимание, что если при движении из одной точки в другую мы следуем сонаправленно с осью, то приращение положительно, если следуем в противоположную сторону - приращение отрицательно. Задача: создать на экране изображение в виде произвольного закрашенного треугольника. Построение с абсолютными координатами CLS SCREEN 12 LINE (200,100)-(400,250),6 LINE (400,250)-(100,300),6 LINE (100,300)-(200,100),6 PAINT (200,200),5,6 SLEEP 10 SCREEN 0 END Построение с относительными координатами CLS SCREEN 12 LINE (200,100)-STEP(200,150),6 LINE -STEP(-300,50),6 LINE -STEP(100,-200),6 PAINT -STEP(0,100),5,6 SLEEP 10 SCREEN 0 END Обратите внимание на 4 и 5 строки второй программы - если в команде LINE не указана первая точка, то за нее принимается последняя точка, построенная в предыдущей команде. И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 20 Задача: создать на экране модель звездного неба с двумя планетами и большим количеством звезд. Звезды будем изображать точками. Чтобы они появлялись в произвольных местах, используем функцию RND. При выполнении команды A=RND(1) ячейке А присваивается произвольное значение из интервала [0,1]. Интервал можно увеличить, если умножить полученное значение на определенное число. Например, при выполнении команды А=RND(1)*100 получим произвольное число из интервала [0,100]. CLS RANDOMIZE TIMER SCREEN 12 ‘Планета 1 CIRCLE (400,200),100,2 PAINT (400,200),2,2 ‘Планета 2 CIRCLE (150,350),50,4 PAINT (150,350),4,4 ‘Звезды FOR A=1 TO 1000 NEXT A PSET (RND(1)*640, RND(1)*480), RND(1)*15 SCREEN 0 END 5.3. Создание динамических (движущихся) изображений Движущиеся изображения создаются способом мультипликации - рисуется объект, затем стирается (рисуется цветом 0), рисуется рядом, снова стирается и т.д. Для многократных повторений используется цикл. Следует изменять координаты только одной (основной) точки изображения, а все остальные изображения строят в относительных координатах (относительно основной точки). Задача: создать на экране модель падающего треугольника. CLS SCREEN 12 FOR A= 0 TO 540 STEP 10 ‘Фаза рисования LINE (200,A)-STEP(100,0),4 LINE -STEP(-50,100),4 LINE -STEP(-50,-100),4 ‘Фаза стирания LINE (200,A)-STEP(100,0),0 LINE -STEP(-50,100),0 LINE -STEP(-50,-100),0 NEXT A SCREEN 0 END Переменной координатой в этой программе является координата У (движение по вертикали). Изменение координаты задается в цикле. Величина шага определяет скорость движения треугольника - чем шаг больше, тем быстрее движется фигура. Задача: создать на экране модель плывущей по морю лодки, скорость которой можно задать в начале программы. PRINT “Задайте значение скорости числом из ряда 1, 2, ... ,10.” PRINT “ (1 - быстро, 10 - медленно)” INPUT B B=1/B CLS SCREEN 12 ‘Море LINE (0,350)-(640,350),1 PAINT (300,400),1,1 ‘Солнце И.Сильванович “Основы программирования на языке BASIC. Курс лекций” 21 CIRCLE (500,80),50,14 PAINT (500,80),14,14 ‘Лодка FOR A=0 TO 565 STEP B LINE (A,350)-STEP(0,-200),2 LINE -STEP(75,150),2 LINE -STEP(-75,50),2 LINE (A,350)-STEP(0,-200),0 LINE -STEP(75,150),0 LINE -STEP(-75,50),0 NEXT A SCREEN 0 END Задачи для самостоятельного решения: 1. Нарисуйте забор с разноцветными досками, число которых задается в начале программы. 2. Вводятся два произвольных числа. Необходимо построить две касающиеся окружности, радиусы которых - введенные числа. 3. Постройте дом с задаваемым в начале программы количеством этажей и окон на каждом этаже. 4. Создайте программу-мультфильм по сценарию: Ранняя весна, дерево. Появляется солнце. Вырастает трава, распускаются цветы, дерево покрывается листвой. UpDate 2008