QBasic №6(Массивы) - школа 73. воронеж.

advertisement
1
А Л Г О Р И Т М И З А Ц И Я
И
П Р О Г Р А М М И Р О В А Н И Е
( ТАБЛИЧНЫЙ
СПОСОБ
ОРГАНИЗАЦИИ ДАННЫХ.
РАБОТА С МАССИВАМИ.)
( ЧАСТЬ VI)
Методическое пособие для учащихся
общеобразовательных классов.
Составила учитель ОИВТ
Школы №73
Богданова О.А.
2001 г.
Настоящее пособие подготовлено в помощь учащимся и учителю ОИВТ по изучению темы "Табличный способ организации
данных. Обработка массивов". При объяснении основных алгоритмов использован алгоритмический язык. Основным языком
программирования в пособии считается язык QBASIC. В пособии разобран ряд интересных алгоритмов. Некоторые из них
учитель может оставить для самостоятельного изучения учащимися. Разобранные алгоритмы можно использовать для составления более сложных программ. В пособии содержатся
задачи для самостоятельной работы и контрольные вопросы.
Изучение материала рассчитано на 15 уроков. Методическое
пособие может быть использовано для преподавания в 10-11
классах.
Литература:
1. Основы информатики и вычислительной техники. Пробный
учебник для 10-11 классов средней школы. Москва 1994г.
2. Кушниренко А.Г.,Лебедев Р.А., Сворень Р.А. Основы информатики и вычислительной техники. Москва 1990г.
2
1. Табличный способ организации данных.
До сих пор, изучая алгоритмы, мы говорили лишь об организации действий,
составляющих алгоритмы, и почти не касались объектов, над которыми эти действия производятся. Исполнение многих алгоритмов было бы просто невозможно, если бы соответствующие объекты не были каким-либо образом организованы: упорядочены, классифицированы и т.д.
1.1 Понятие массива (таблицы).
Массив – это совокупность данных, объединенных общим
свойством.
Пример: Ученики одного класса.
Элементами массива могут быть не только числа, но и слова. (Слово - это
набор символов.)
Чтобы можно было оперировать с элементами массива, надо каким-то образом обозначать таблицы и их элементы.
Таблицы обозначаются по тем же правилам, что и переменные:
1. Имя состоит их латинских букв, цифр и некоторых специальных символов.
2. Первым символом должна быть латинская буква.
3. Имя не должно совпадать со служебными словами.
В Qbasic мы можем построить таблицы целых, вещественных и литерных
типов. Для этого используются суффиксы:
- Имя% - таблица содержит целые числа.
- Имя – таблица содержит вещественные числа.
- Имя$ - таблица содержит литерные величины.
Любая таблица состоит из строк и столбиков.
Договоримся:
1) строки нумеруются сверху вниз;
2) столбики нумеруются слева направо.
Таблица, состоящая из одной строки или столбика, называется линейной.
Пример:
Список учеников:
1. Иванов Женя
2. Петров Витя
3. Рягузова Света
4. ...............
Среднедневная температура за каждый месяц 1999 года:
1
2
3
4
5
6
7
8
-10
-2
+2
+5
+15
+25
+20
+18
Таблица, состоящая из несколько строк и нескольких столбиков,
называется прямоугольной.
Пример:
1) Значения функции y=X^2.
Значения Х
Значения Y
(1-й столбик) (2-й столбик)
1
1
2
4
3
9
4
16
Таблица состоит из 2-х столбиков и 4-х строк.
2) Температура за каждый день 1998 года.
Число
1
2
3
4
месяц
Январь
-10
-12
-10
-15
Февраль -5
-4
-1
-3
Март
-1
0
+1
+2
Апрель
+5
+4
+6
+5
май
+10
+12
+10
+11
Перед началом работы машина должна точно знать какое количество элементов (переменных) будет в массиве. Это необходимо для того, чтобы в памяти
построить нужную вам таблицу.
Примечание: Если заказать очень много строк и столбиков, то машина не
сможет построить такую таблицу в памяти, так как память, в которой хранятся
все данные, ограничена. Вы получите сообщение, что «мало памяти». В языках
типа Pascal имеется возможность перевести данные из стековой памяти в динамическую. Что существенно увеличивает объем данных, но и она не безгранична.
1.2 Объявление массива (таблицы).
Сразу после заголовка программы необходимо поставить команду, которая
построит в памяти нужную вам таблицу. Эта команда называется командой объявления массива.
50 DIM «имя» «суффикс»(N,M)
где N – количество строк;
M - - количество столбиков.
Например:
50 DIM A$(3,5)
Распределится таблица литерных величин из 4 строк и 6 столбиков.
Примечание:
1. В Qbasic нумерация строк и столбиков начинается с нуля.
3
2. Для обозначения строк будем использовать букву N. Для обозначения столбиков – букву M.
1.3. Типы таблиц.
В массиве могут содержаться переменные только одного типа.
Например:
DIM D$(23) – таблица литерных величин. В ней можно хранить список
учащихся.
DIM В%(7,8) – прямоугольная таблица целых чисел.
DIM А$(3,4) – прямоугольная таблица вещественных чисел.
После выполнения оператора DIM для таблиц целых и вещественных чисел
каждый элемент будет равен нулю, для литерных величен каждый элемент будет
пустой.
Если в памяти машины необходимо хранить страничку классного журнала,
то необходимо распределить две таблички. Один массив литерный и будет содержать список учащихся, а второй массив целых чисел будет содержать отметки
учащихся. Литерный массив будет линейным, а массив отметок – прямоугольным. Связать эти два массива можно по номеру строки.
1.5. Обращение к конкретному элементу массива.
Пусть распределен и заполнен линейный литерный массив, в котором находится список учащихся.
50 DIM SP$(5)
СТРОКИ
Если массив состоит из одной строки или одного столбика, то он объявляется так:
50 DIM A(N)
где N количество строк или столбиков в зависимости от вашего желания.
В операторе DIM для указания количества строк или столбиков можно использовать переменные. Дать значения этим переменным можно с помощью команды INPUT, т.е. присвоить значения с помощью команды ввода данных с клавиатуры. Но при этом следует помнить, что эта операция может быть выполнена
до того, как проработает команда DIM.
50 INPUT “Введите количество строк и столбиков:”;N,M
60 DIM A(N,M)
Эта пара строк в программе может проработать только один раз. Если нужно
проработать еще раз, но с таблицей других размеров, необходимо завершить работу программы и выполнить ее снова. Распределенную таблицу нельзя во
время работы программы расширить или сжать.
В машине будет построена и заполнена следующая таблица:
Номер строки Значение
Обращение
0
Пусто
SP$(0)
1
Иванов Женя
SP$(1)
2
Рагозина Вера
SP$(2)
3
Калинина Оля
SP$(3)
4
Ярыгин Денис
SP$(4)
5
Петров Коля
SP$(5)
Все переменные массива имеют одно и то же имя, а различаются по номеру
строки, который проставляется в круглых скобках.
Пример 2: Распределен и заполнен прямоугольный массив целых чисел:
50 DIM А%(3,7)
Номера
0
1
2
3
0
3
5
2
7
СТОЛБИКИ
1
2
7
9
0
4
2
9
5
6
3
0
5
7
3
4
5
1
0
1
5
4
3
2
6
6
4
8
6
3
7
4
8
4
0
Все переменные массива имеют одно и то же имя, а различаются по номеру
строки и номеру столбика, которые проставляется в круглых скобках через запятую. Например, переменная А%(3,2) будет иметь значение пять.
Номера строк и столбиков могут храниться в переменной, но эта переменная
должна быть целым неотрицательным числом.
Следует помнить, что нет команд, которые работали бы со всем массивом сразу, кроме команды распределения массива. Массив следует воспринимать как совокупность элементов или переменных. Изученные нами команды могут обращаться только к одному отдельному элементу массива, то
есть по конкретно указанному вами адресу номеру строки и столбца.
2. Способы заполнения массивов.
Только что распределенная в памяти таблица литерных величин будет пустой, а каждый элемент числовой таблицы будет равен нулю. При изучении
предыдущих тем, в наших программах было не много переменных и значения
им мы давали с помощью команды ввода данных с клавиатуры или с помощью
команды присвоить. Небольшая таблица из 3 строк и 5 столбиков будет содержать уже 24 переменные и, при отладки программы, каждый раз набирать значение для 24 переменных очень утомительно.
Можно выделить 5 способов заполнения массивов.
- 1 способ - заполняется массив с помощью команды присвоить;
4
-
2 способ – массив заполняется с помощью команды ввода данных с клавиатуры;
3 способ – массив заполняется с помощью функции;
4 способ – массив заполняется с помощью команд READ, DATA;
5 способ – информация в массив считывается из файла.
3. Заполнение массива с помощью команды присвоить.
Этот способ применяется в том случае, если информация содержащаяся в
массиве практически не меняется. Например: названия месяцев, дней недели,
список учащихся конкретного класса и так далее.
Каждому элементу массива его значение дается в теле программы с помощью команды присвоить.
Часть программы, где происходить заполнение массива, будем оформлять в
виде вспомогательных алгоритмов. Вспомогательный алгоритм для этого способа заполнения будем располагать с 1000 строчки.
Задача 1. По введенному номеру дня недели распечатать название этого
дня.
Названия дней недели будем хранить в линейном массиве DN$. Номер строки будет соответствовать номеру дня недели. Нулевой элемент массива будем
игнорировать.
10 REM Задача 1
20 CLS : COLOR 4
30 PRINT “Печать названий дней недели.”
40 PRINT “Программу составил учение 11 класса Федоров Женя.”
50 DIM DN$(7)
60 GOSUB 1000
70 INPUT “Введи номер дня недели:”; N
80 IF N<1 OR N>7 THEN PRINT “Ошибочный номер.”: GOTO 70
90 PRINT “Название: ”; DN$(N)
100 END
1000 REM Заполнение 1
1010 DN$(1)=”Понедельник.”
1020 DN$(2)=”Вторник.”
1030 DN$(3)=”Среда.”
1040 DN$(4)=”Четверг.”
1050 DN$(5)=”Пятница.”
1060 DN$(6)=”Суббота.”
1070 DN$(7)=”Воскресенье.”
1080 RETURN
4. Печать элементов массива.
Вспомогательный алгоритм печати будем оформлять с 2000 строки.
4.1. Печать линейного массива.
Для того чтобы распечатать массив, в цикле необходимо обратится к каждому элементу строки или столбика.
Пусть распределен линейный массив DN$(7) и заполнен названиями дней
недели. Необходимо распечатать его в строчку (при печати необходимо самим
отделять один элемент массива от другого пробелом или запятой):
2000 REM печать в строчку
2010 FOR I=1 TO N
2020 PRINT DN$(I);”,”:
2030 NEXT I
2040 RETURN
В переменной N содержится количество столбиков. Для нашего случая N=7.
Если необходимо распечатать массив в виде столбика, то алгоритм будет
следующий:
2100 REM печать в столбик
2110 FOR I=1 TO N
2120 PRINT DN$(I)
2130 NEXT I
2140 RETURN
В переменной N содержится количество строчек.
4.2. Печать прямоугольного массива.
Прямоугольный массив обычно распечатывают в виде таблички. Для печати
необходимо организовать два вложенных цикла. Внешний для прохождения по
всем строчкам, и внутренний для перебора внутри каждой строчки всех столбиков. Столбики печатаются в строчку и необходим разделитель элементов строки.
Пусть заполнен массив из N строк и М столбиков числами.
2200 REM печать прямоугольного массива
2210 FOR I=1 TO N
2220 FOR J=1 TO M
2230 PRINT A(I,J):”,”;
2240 NEXT J
2250 PRINT
2260 NEXT I
2270 RETURN
5
5. Работа с элементами массива, обладающими
определенным свойством.
Задача: В массиве заполнены фамилии учащихся посещающих шахматный
кружок. Всего в списке 10 человек.
5.1. Алгоритм поиска в массиве элемента, обладающего определенным свойством.
Составить алгоритм, отвечающий на вопрос «Есть ли в списке Иванов?»
Ответ получим с помощью сигнальной переменной OTV$.
Перед началом поиска считаем, что элемента обладающего определенным
свойством нет. Для нашей задачи:
OTV$=”нет”
В цикле будем смотреть значение каждой переменной, и если найдем нужный элемент, значение сигнальной переменной поменяем на «Да» и выйдем из
цикла на печать результата. Цикл работает от начала и до конца в том случае,
если нужного элемента нет, а если он найден, то остальные элементы не проверяются, осуществляется выход из цикла на печать результата.
В общем виде алгоритм будет следующий:
10 ЗА
20
ГО
30
ЛО
40
ВОК
50 Задать количество строк или столбиков
60 Распределить массив
70 GOSUB Заполнение
80 GOSUB Печать
90 OTV$=”НЕТ”
100 FOR I=1 TO N
110 IF «УСЛОВИЕ» THEN OTV$=”ДА”: GOTO 130
120 NEXT I
130 PRINT OTV$
140 END
1000 REM ЗАПОЛНЕНИЕ 1
............
RETURN
2000 ПЕЧАТЬ
........
RETURN
Для нашей задачи алгоритм будет выглядеть следующим образом:
10 REM ЗАДАЧА
20 CLS :COLOR 3
30 PRINT” ПРОГРАММУ СОСТАВИЛ ПЕТРОВ ”
40 PRINT” ЕСТЬ ЛИ В СПИСКЕ ИВАНОВ?”
50 N=10
60 DIM SP$(N)
70 GOSUB 1000
80 GOSUB 2100
90 OTV$=”НЕТ”
100 FOR I=1 TO N
110 IF SP$(I)=”Иванов” THEN OTV$=”ДА”: GOTO 130
120 NEXT I
130 PRINT OTV$
140 END
1000 REM Заполнение 1
1010 SP$(1)=”Петров.”
1020 SP $(2)=”Сидорова.”
1030 SP $(3)=”Макарова.”
1040 SP $(4)=”Иванов”
1050 SP $(5)=”Шмаков”
1060 SP $(6)=”Антонова”
1070 SP $(7)=”Понаморенко”
1080 SP $(8)=”Пискунов”
1090 SP $(9)=”Кузьмин”
1100 SP $(10)=”Семенова”
1080 RETURN
2100 REM печать в столбик
2110 FOR I=1 TO N
2120 PRINT SP$(I)
2130 NEXT I
2140 RETURN
5.2. Алгоритм, определяющий, сколько раз в массиве
встречается элемент, обладающий определенным
свойством.
Задача: Составить алгоритм, отвечающий на вопрос «Сколько в списке
Ивановых?»
Переменная K будет считать нужные элементы. Перед началом цикла счетчик К обнуляем, то есть К=0. В цикле, если найдем нужный элемент, то включим
счетчик К=К+1. Цикл работает от начала и до конца.
В общем виде алгоритм будет следующий:
10 ЗА
20
ГО
30
ЛО
6
40
ВОК
50 Задать количество строк или столбиков
60 Распределить массив
70 GOSUB Заполнение
80 GOSUB Печать
90 K=0
100 FOR I=1 TO N
110 IF «УСЛОВИЕ» THEN K=K+1
120 NEXT I
130 PRINT ”КОЛИЧЕСТВО НУЖНЫХ ЭЛЕМЕНТОВ:”; K
140 END
1000 REM ЗАПОЛНЕНИЕ 1
............
RETURN
2000 ПЕЧАТЬ
........
RETURN
Для нашей задачи алгоритм будет выглядеть следующим образом:
10 REM ЗАДАЧА
20 CLS :COLOR 3
30 PRINT” ПРОГРАММУ СОСТАВИЛ ПЕТРОВ ”
40 PRINT”СКОЛЬКО В СПИСКЕ ИВАНОВЫХ?”
50 N=10
60 DIM SP$(N)
70 GOSUB 1000
80 GOSUB 2100
90 K=0
100 FOR I=1 TO N
110 IF SP$(I)=”Иванов” THEN K=K+1
120 NEXT I
130 PRINT “В списке ”;K; “ Ивановых.”
140 END
1000 REM Заполнение 1
1010 SP$(1)=”Петров.”
1020 SP $(2)=”Сидорова.”
1030 SP $(3)=”Макарова.”
1040 SP $(4)=”Иванов”
1050 SP $(5)=”Шмаков”
1060 SP $(6)=”Антонова”
1070 SP $(7)=”Понаморенко”
1080 SP $(8)=”Пискунов”
1090 SP $(9)=”Кузьмин”
1100 SP $(10)=”Семенова”
1080 RETURN
2100 REM печать в столбик
2110 FOR I=1 TO N
2120 PRINT SP$(I)
2130 NEXT I
2140 RETURN
5.3. Алгоритм, распечатывающий все элементы обладающие определенным свойством.
Задача: Составить алгоритм, распечатывающий все фамилии, начинающиеся на букву «И».
В цикле просматриваем все элементы массива, и если для них выполняется
условие, печатаем их содержимое. Цикл работает от начала и до конца.
В общем виде алгоритм будет следующий:
10 ЗА
20
ГО
30
ЛО
40
ВОК
50 Задать количество строк или столбиков
60 Распределить массив
70 GOSUB Заполнение
80 GOSUB Печать
100 FOR I=1 TO N
110 IF «УСЛОВИЕ» THEN PRINT элемент массива
120 NEXT I
140 END
1000 REM ЗАПОЛНЕНИЕ 1
............
RETURN
2000 ПЕЧАТЬ
........
RETURN
Для нашей задачи алгоритм будет выглядеть следующим образом:
10 REM ЗАДАЧА
20 CLS :COLOR 3
30 PRINT”ПРОГРАММУ СОСТАВИЛ ПЕТРОВ”
40 PRINT”РАСПЕЧАТАТЬ ВСЕ ФАМИЛИИ НА БУКВУ «И»”
50 N=10
60 DIM SP$(N)
70 GOSUB 1000
80 GOSUB 2100
100 FOR I=1 TO N
7
110 IF LEFT$(SP$(I),1)=”И” THEN PRINT SP$(I)
120 NEXT I
140 END
1000 REM Заполнение 1
1010 SP$(1)=”Петров.”
1020 SP $(2)=”Сидорова.”
1030 SP $(3)=”Макарова.”
1040 SP $(4)=”Иванов”
1050 SP $(5)=”Шмаков”
1060 SP $(6)=”Антонова”
1070 SP $(7)=”Понаморенко”
1080 SP $(8)=”Пискунов”
1090 SP $(9)=”Кузьмин”
1100 SP $(10)=”Семенова”
1080 RETURN
2100 REM печать в столбик
2110 FOR I=1 TO N
2120 PRINT SP$(I)
2130 NEXT I
2140 RETURN
6. Заполнение массива с помощью команды ввода данных с клавиатуры.
Этот способ применяется в том случае, если информация меняется перед
каждым выполнением программы.
Пусть распределен линейный массив вещественных чисел А, содержащий N
элементов.
Вспомогательный алгоритм:
1500 REM Заполнение 2
1510 FOR I=1 TO N
1520 INPUT “Введи значение”; A(I)
1530 NEXT I
1540 RETURN
Задача 3. Вычислить среднемесячную температуру в январе прошлого года.
10 REM Среднемесячная температура
20 CLS :COLOR 3
30 PRINT”ПРОГРАММУ СОСТАВИЛ ПЕТРОВ”
40 PRINT”Определение среднемесячной температуры.”
50 N=31
60 DIM T(N)
70 GOSUB 1500
80 GOSUB 2000
90 S=0
100 FOR I=1 TO N
110 S=S+T(I)
120 NEXT I
130 SR=S/N {SR=SR\N}
135 PRINT “Средняя температура равна”; SR
140 END
1500 REM Заполнение 2
1510 FOR I=1 TO N
1515 PRINT “Введи среднедневную температуру за ”;I;” января.”;
1520 INPUT “:”; T(I)
1530 NEXT I
1540 RETURN
2000 REM печать в строчку
2010 FOR I=1 TO N
2020 PRINT T(I);”,”:
2030 NEXT I
2040 RETURN
6.1. Вычислить значение многочлена по схеме Горнера.
Пусть дан многочлен x4+2x3+3x2-5x-15.
Требуется вычислить значение многочлена пи х=123.2345.
Если у Вас под руками калькулятор, то вы облегчите себе работу, воспользовавшись схемой Горнера.
Пусть задан произвольный многочлен:
a0x3+a1x2+a2x+a3x0
Преобразуем его:
a0x3+a1x2+a2x+a3x0= x2(a0x+a1)+a2x+a3x0=x(x(a0x+a1)+a2)+a3x0
Алгоритм вычислений будет следующий:
a0 умножаем на х и к результату прибавляем а1.
Результат умножаем на х и прибавляем а2.
Результат умножаем на х и прибавляем а3.
Все эти действия мы можем проделать в одном окне и будем избавлены от
необходимости запоминать промежуточные результаты.
Преобразуем наш пример и его вид будет следующий:
x4+2x3+3x2-5x-15= x(x(x(x+2)+3)-5)-15
 Занесем значение х=123.2345
 Умножим на 1 и прибавим 2.
 Умножим на х и прибавим 3.
 Умножим на х и прибавим -5.
8
 Умножим на х и прибавим -15.
 В окне можем считать результат.
При разложении многочлена по схеме Горнера следует помнить, что если какие либо степени х отсутствуют, то коэффициент при них равен нулю
Задача: Распечатать на экран таблицу значений многочлена
a0xn+a1xn-1+…+an-1x+an= (x(x…x(a0x+a1)+a1)+…+an-1)+an.
Известно, что x[A,B] , x=P.
Схема, предложенная Горнером, даст нам возможность написать универсальную программу.
В массиве MAS будем сохранянять значения коэффициэнтов при степенях х.
Эти данные будем вносить с клавиатуры. Еще с клавиатуры будем задавать:
N размерность массива (максимальная степень х)
А, В границы отрезка и шаг Р.
10 REM СХЕМА ГОРНЕРА
20 CLS: COLOR 2
30 PRINT “Печать таблицы значений”
40 PRINT “Программу составила Степанова Света”
50 INPUT”Максимальная степень:”;N
60 INPUT “Границы отрезка и шаг:”;A,B,P
70 DIM MAS(N)
80 J=N
90 FOR I=0 T0 N
100 PRINT “ВВЕДИ КОЭФФИЦИЭНТ ПРИ Х В СТЕПЕНИ ”;J;
110 INPUT “:”;MAS(I)
120 J=J-1
130 NEXT I
140 FOR X=A TO B STEP P
150 Y=MAS(0)
160 FOR I=1 TO N
170 Y=Y*X+MAS(I)
180 NEXT I
190 PRINT “ПРИ X=”;X;” Y=”;Y
200 NEXT X
210 END
7. Заполнение массива с помощью функции.
Этот способ используется наиболее часто. Чтобы не тратить время на ввод
реальных данных, во время отладки, массив заполняется значениями какой-либо
подходящей функции.
7.1. Заполнение функции с помощью датчика случайных
чисел.
Используется в том случае, если не важно какие данные содержатся в массиве, а также для экономии времени во время отладки программы.
Заполненный подобным образом массив необходимо сразу распечатать, чтобы была возможность визуально оценить результат работы программы, так как
неизвестно какие данные будут содержаться в массиве.
Пусть распределен линейный массив А вещественных чисел из N элементов.
Вспомогательный алгоритм:
1600 REM Заполнение 3
1610 FOR I=1 TO N
1620 A(I)=INT(RND(1)+10)
1630 NEXT I
1640 RETURN
1620 A(I)=INT(RND(1)+10)
 массив заполняется целыми однозначными
числами.
1620 A(I)=INT(RND(1)*89+10)  массив заполняется целыми двузначными
числами.
1620 A(I)=INT(20-RND(1)*40)
 массив заполняется целыми числами из
интервала [-20;+20].
Задача: В массиве OTM(N) содержатся сведения об успеваемости за последнюю четверть. Составить алгоритм, отвечающий на вопрос «Сколько в
классе неуспевающих?»
10 REM Неуспевающие
20 CLS :COLOR 3
30 PRINT”ПРОГРАММУ СОСТАВИЛ ПЕТРОВ”
40 PRINT”Количество неуспевающих.”
50 INPUT “Введи количество учащихся: ”;N
60 DIM OTM(N)
70 GOSUB 1600
80 GOSUB 2000
90 K=0
100 FOR I=1 TO N
110 IF OTM(I)=2 THEN K+K+1
120 NEXT I
130 PRINT “Имеют двойки ”;K;” человек.”
140 END
1600 REM Заполнение 3
1610 FOR I=1 TO N
1620 OTM(I)=INT(RND(1)*2+4)
1630 NEXT I
9
1640 RETURN
2000 REM печать в строчку
2010 FOR I=1 TO N
2020 PRINT OTM(I);”,”:
2030 NEXT I
2040 RETURN
7.2. Табуляция функции в массив.
Протабулировать функцию в массив это значит записать в массив все значения функции полученные на определенном интервале и с указанном шагом. Если
сохраняются только значения функции, то достаточно распределить линейный
массив, а если надо сохранить и значения аргумента или аргументов, то распределяется прямоугольная таблица.
7.2.1. Табуляция в массив функции от одной переменной.
Задача: Протабулировать в массив F функцию y=x2 ,если x[A;B] шаг Р.
Распечатать ее значения на экран.
Для того чтобы распределить массив, необходимо вычислить количество точек, полученных при вычислении значений функции на указанном интервале.
N
|B  A|
P
В программе вставляем строчки:
50 N=INT(ABS(B-A)/P+1)
60 DIM F(N)
Цикл организуем по переменной Х:
80 FOR x=A TO B STEP P
Элементы массива перебираем в ручную.
Вспомогательный алгоритм:
1600 REM Табуляция
1610 I=1
1620 FOR X=A TO B STEP P
1630 F(I)=X^2
1640 I=I+1
1650 NEXT X
1660 RETURN
Программа к задаче 5:
10 REM Табуляция
20 CLS :COLOR 3
30 PRINT”ПРОГРАММУ СОСТАВИЛ ПЕТРОВ”
40 PRINT”Табуляция функции и печать.”
50 DEF FNY(X)=X^2
60 INPUT “ВВЕДИТЕ ГРАНИЦЫ ОТРЕЗКА И ШАГ A,B,P:”;A,B,P
70 N=INT(ABS(B-A)/P+1)
80 DIM F(N)
90 GOSUB 1600
100 GOSUB 2000
110 END
1600 REM Заполнение 3
1610 I=1
1620 FOR X=A TO B STEP P
1630 F(I)=FNY(X)
1640 I=I+1
1650 NEXT X
1660 RETURN
2000 REM печать в строчку
2010 FOR I=1 TO N
2020 PRINT F(I);”,”:
2030 NEXT I
2040 RETURN
Задача: Протабулировать в массив F функцию y=x2 ,если x[A;B] шаг Р.
Распечатать ее значения на экран. В массив занести значения аргументов и
значения функции.
Необходимо распределить прямоугольную таблицу, состоящею из двух
столбиков.
В нулевой столбик заносим значения функции, а в первый столбик – значения аргумента.
Наша программа будет иметь следующий вид:
10 REM Табуляция
20 CLS :COLOR 3
30 PRINT”ПРОГРАММУ СОСТАВИЛ ПЕТРОВ”
40 PRINT”Табуляция функции и печать.”
50 DEF FNY(X)=X^2
60 INPUT “ВВЕДИТЕ ГРАНИЦЫ ОТРЕЗКА И ШАГ A,B,P:”;A,B,P
70 N=INT(ABS(B-A)/P+1)
80 DIM F(N,1)
90 GOSUB 1600
100 GOSUB 2200
110 END
1600 REM Заполнение 3
1610 I=1
1620 FOR X=A TO B STEP P
1630 F(I,0)=FNY(X)
1635 F(I,1)=X
1640 I=I+1
10
Общий вид:
1000 DATA C1, C2, C3,…, Ci, …, Cn
(список значений)
90 READ X1, X2, X3, …, Xi, … ,Xn
(список переменных)
1650 NEXT X
1660 RETURN
2200 REM печать
2210 FOR I=1 TO N
2230 PRINT “При x=”; F(I,0);” y=”; F(I,1)
2240 NEXT I
2270 RETURN
7.2.2. Табуляция в массив функции от нескольких переменных.
Пусть дана функция y=(x,z), где x[Ax;Bx] z[Az;Bz] а x=Px z=Pz
В массив F заносим значение функции и значения аргументов.
В нулевой столбик заносим значение функции.
В первый столбик значение аргумента Х.
Во второй столбик значение аргумента Z.
Необходимо вычислить количество строк массива F.
| Bx  Ax |
Nx 
Px
| Bz  Az |
Nz 
Pz
N  Nx  Nz
Объявляем массив DIM F(N,2)
Вспомогательный алгоритм:
1600 REM Табуляция
1610 I=1
1620 FOR X=Ax TO Bx STEP Px
1630 FOR Z=Az TO Bz STEP Pz
1640 F(I,0)=X^2
1650 F(I,1)=X
1660 F(I,2)=Z
1670 I=I+1
1680 NEXT Z
1690 NEXT X
1695 RETURN
8. Заполнение массива с помощью операторов
READ, DATA.
Операторы READ, DATA служат для организации и хранения наборов данных внутри программы.
Последовательно каждой величине Xi оператора READ присваивается значение Ciиз оператора DATA, то есть действия операторов равносильно выполнению следующих операторов:
X1 = C1
X2 = C2
X3 = C3
………….
Xi = Ci
Оператор DATA помещается обычно в конце или начале программы. При
обычном выполнении строка с этим оператором пропускается.
Операторы DATA (сколько бы их не было в программе) рассматриваются
как один линейный массив. Данные из этого массива считываются по порядку.
Причем машина помнит, где она закончила чтение.
RESTORE – служит для повторного чтения данных. Список данных читается
с начала.
1600 REM ЗАПОЛНЕНИЕ
1610 FOR I=1 TO N
1620 READ VP$(I)
1630 NEXT I
1640 RETURN
1650 DATA CLS,PRINT
1660 DATA INPUT, REM,COLOR
8.1. Алгоритм программы «Контроль знаний».
Рассмотрим алгоритм очень простой программы, которая будет контролировать знания операторов языка Qbasic и в конце работы поставит отметку.
В памяти машины будем хранить две таблицы. В одной будут содержатся
вопросы VP$ а в другой правильные ответы OT$. Эти два массива будут связаны
между собой по номеру. В каждом массиве будет по 15 элементов.
Программа будет состоять из следующих частей:
11
Начало
Объявление и заполнение массивов VP$, OT$
Тестирование
Оценка результата.
Конец
В блоке объявления и заполнения массивов будем использовать заполнения
массива с помощью операторов READ, DATA.
40 REM ОБЪЯВЛЕНИЕ И ЗАПОЛНЕНИЕ МАССИВОВ
50 N=15
60 DIM VP$(N), OT$(N)
70 GOSUB 1600
Блок заполнения пишется в конце программы после команды END.
1600 REM ЗАПОЛНЕНИЕ
1610 FOR I=1 TO N
1620 READ VP$(I),OT$(I)
1630 NEXT I
1640 RETURN
1650 DATA CLS,ОЧИСТКА ЭКРАНА,PRINT,ПЕЧАТЬ
1660 DATA INPUT,ВВОД, REM,КОМЕНТАРИЙ,COLOR,ЦВЕТ
Из 15 вопросов машина задает 10. Программа очень простая и вопросы могут
повторяться. В переменной К накапливается количество правильных ответов.
100 REM ТЕСТИРОВАНИЕ
110 K=0
120 FOR I=1 TO 10
130 NV=INT(RND(1)*15+1)
140 PRINT “”;VP$
150 INPUT “”;OTV$
160 IF OTV$=OT$(NV) THEN K=K+1
170 NEXT
Анализируем значение переменной К. Если отвечено на все вопросы, то ее
значение должно быть равно 10. В этом блоке можно использовать команду
“ВЫБОР” – “CASE».
200 REM АНАЛИЗ РЕЗУЛЬТАТОВ
210 IF K=10 THEN PRINT “МОЛОДЕЦ”:GOTO 220
210 IF K>=8 THEN PRINT “ХОРОШО”:GOTO 220
210 IF K>=5 THEN PRINT “УДОВЛЕТВОРИТЕЛЬНО”:GOTO 220
210 PRINT “ПЛОХО”
220 END
При составлении программы необходимо позаботиться об оформлении экрана. Нужно обязательно использовать команды позиционирования курсора и задания цвета букв и фона.
8.2. Алгоритм программы «Каталог».
Будем составлять программу “Каталог книг”.
Схему работы программы можно посмотреть на Рис.1.
Вся информация, которая распечатывается на экране, хранится в массивах. В
каждом массиве будет по 5 строк. В массиве A0$ хранится информация, которая
печатается на главном экране.
При вызове первого раздела печатается информация из массива A1$.
При вызове второго раздела печатается информация из массива A2$.
При вызове третьего раздела печатается информация из массива A3$.
При вызове четвертого раздела печатается информация из массива A4$.
При вызове пятого раздела печатается информация из массива A5$.
По своей сути это программа печати нужных массивов.
12
Информация первого экрана:
Раздел фантастика
Каталог книг
Программу составил
Иванов Виктор
Информация главного экрана:
1.Фантастика
2.Детективы
3.Сказки
4.Стихи
5.Приключения
Введите номер
раздела -
Раздел детективы
Раздел сказки
Раздел стихи.
Раздел приключения
Основная программа:
10 REM КАТАЛОГ КНИГ
20 COLOR 5,1:CLS
30 LOCATE 5,5:PRINT “К А Т А Л О Г К Н И Г”
40 LOCATE 10,10:PRINT “Программу составил”
50 LOCATE 11,10:PRINT “ученик 11 а класса”
60 LOCATE 12,10:PRINT “Иванов женя”
70 LOCATE 14,10:PRINT “Нажмите на любую клавишу ввод.”
80 INPUT B$
90 N=5:DIM A0(N),A1$(N),A2$(N),A3$(N),A4$(N),A5$(N)
100 GOSUB 1000 :REM ЗАПОЛНЕНИЕ МАССИВОВ
110 REM ПЕЧАТЬ ГЛАВНОГО МАССИВА
120 COLOR 2,1:CLS: GOSUB 2000
130 LOCATE 24,5:INPUT “ВВЕДИТЕ НОМЕР РАЗДЕЛА :”;K
140 IF K<1 OR K>5 THEN 130
150 COLOR 3,1:CLS
160 IF K=1 THEN GOSUB 2100:GOTO 210
170 IF K=2 THEN GOSUB 2200:GOTO 210
180 IF K=3 THEN GOSUB 2300:GOTO 210
190 IF K=4 THEN GOSUB 2100:GOTO 210
200 IF K=5 THEN GOSUB 2100
210 END
1000 REM ЗАПОЛНЕНИЕ
1005 REM Главный экран
1010 FOR I=1 TO N
1020 READ A0$(I)
1030 NEXT I
1040 DATA 1.Фантастика, 2.Детективы, 3.Сказки
1050 DATA 4.Стихи, 5.Приключения
1100 REM Раздел фантастика
1110 FOR I=1 TO N
1120 READ A1$(I)
1130 NEXT I
1140 DATA 1.Ефремов, 2.Стругацкие, 3.Лем
1150 DATA 4.Беляев, 5.Уилксон
….
1560 RETURN
2000 REM Распечатка массивов
2010 FOR I=1 TO N
2020 PRINT A0$(I)
2030 NEXT I
2040 RETURN
2100 REM ПЕЧАТЬ РАЗДЕЛА ФАНТАСТИКИ
2110 FOR I=1 TO N
2120 PRINT A1$(I)
2130 NEXT I
2140 RETURN
……
При составлении программы необходимо позаботиться об оформлении экрана. Нужно обязательно использовать команды позиционирования курсора и задания цвета букв и фона.
13
9. Алгоритмы поиска минимального и
максимального элементов массива.
Задача:
a) Найти в массиве минимальный (максимальный) элемент.
b) Найти в массиве максимальный (минимальный) элемент
и его номер.
c) Сколько раз в массиве встречается максимальный (минимальный) элемент.
Пусть дан линейный массив MAS из N элементов. Массив заполняется однозначными целыми числами с помощью датчика случайных чисел.
А) Алгоритм поиска в массиве минимального (максимального) элемента
следующий:
3000 REM ПОИСК MIN или MAX
Считаем, что первый элемент массива минимален (максимален). Сохраняем
его значение в переменной, где будет храниться результат.
3010 MIN=MAS(1)  для поиска минимального;
3020 MAX=MAS(1)  для поиска максимального.
Просматриваем все элементы массива:
3030 FOR I=1 TO N
Каждый элемент массива сравниваем с MIN (MAX), если найдем элемент
меньше (больше), то запомним его значение.
3040 IF MIN>MAS(I) THEN MIN=MAS(I)
3050 IF MAX>MAS(I) THEN MAX=MAS(I)
Конец цикла.
3060 NEXT I
3070 RETURN
После окончания цикла в переменных MAX, MIN будут нужные значения.
Общий вид алгоритма:
3000 REM ПОИСК MIN или MAX
3010 MIN=MAS(1
3020 MAX=MAS(1)
3030 FOR I=1 TO N
3040 IF MIN>MAS(I) THEN MIN=MAS(I)
3050 IF MAX>MAS(I) THEN MAX=MAS(I)
3060 NEXT I
3070 RETURN
B) Для этого алгоритма нам понадобятся еще переменные, в которых мы запомним номера минимального и максимального элементов.
Вспомогательный алгоритм будет следующий:
4000 REM
4010 MIN=MAS(1):K=1
4020 MAX=MAS(1):L=1
4030 FOR I=1 TO N
4040 IF MIN>MAS(I) THEN MIN=MAS(I):K=I
4050 IF MAX>MAS(I) THEN MAX=MAS(I):L=I
4060 NEXT I
4070 RETURN
Если в задаче требуется определить номер первого минимального (максимального) элемента, то можно воспользоваться предложенным алгоритмом. Какие изменения нужно внести в алгоритм, чтобы получить номер последнего минимального (максимального) элемента?
С) Алгоритм состоит из двух частей. В первой части выполняется алгоритм
поиска минимального (максимального) элемента. А потом пишется цикл для
подсчета количества повторений минимального (максимального) элемента.
Задача. В массиве хранится температура в феврале. Номер элемента
массива сответствует дню месяца. Составить алгоритм отвечающий на вопрос «Сколько было самых холодных дней в феврале и какая температура была в
эти дни?»
10 REM ТЕМПЕРАТУРА
20 CLS:COLOR 3
30 PRINT”Самые холодные дни в феврале”
40 PRINT “Составил программу Петров Женя”
50 N=28
60 DIN T(N):GOSUB 1300
70 PRINT “ТЕМПЕРАТУРА В ФЕВРАЛЕ:”:GOSUB 2000
80 GOSUB 3000
90 K=0
100 FOR I=1 TO N
110 IF T(I)=MIN THEN K=K+1
120 NEXT I
130 PRINT “МИНИМАЛЬНАЯ ТЕМПЕРАТУРА РАВНЯЛАСЬ”;MIN
140 PRINT “САМЫХ ХОЛОДНЫХ ДНЕЙ БЫЛО ”;K
150 END
1300 REM ЗАПОЛНЕНИЕ
1310 FOR I=1 TO N
1320 T(I)=INT(RND(1)*(-30)+2)
1330 NEXT I
1340 RETURN
2000 REM ПЕЧАТЬ
2010 FOR I=1 TO N
2020 PRINT T(I):” “;
14
2030 NEXT I
2040 PRINT
2050 RETURN
3000 REM ПОИСК МИНИМАЛЬНОГО
3010 MIN=T(1)
3030 FOR I=1 TO N
3040 IF MIN>MAS(I) THEN MIN=MAS(I)
3060 NEXT I
3070 RETURN
10. Обмен элементов в массиве.
Задача: Дан массив А(N) элементов заполненный случайными числами из
интнрвала от 10 до 30. Найти минимальный и поменять его местами с первым.
Алгоритм программы будет следующий:
1. Заполняем массив.
2. Печатаем его содержимое.
3. Ищем минимальный элемент и его номер.
4. Меняем местами первый и К-й элементы.
5. Сново печатаем массив.
6. Конец работы программы.
Вспомним алгоритм обмена из материала 10-го класса. Если нужно обменять
содержимое двух ячеек, то используем третью ячейку.
Нам необходимо поменять местами элемент A(1) и А(К). Но значение элемента А(К) мы уже запомнили в переменной MIN.
Алгоритм обмена будет следующим:
100 REM ОБМЕН
110 A(K)=A(1)
120 A(1)=MIN
11. Получение из одного массива другого.
Задача: В массиве FAM$ содержится список учащихся, а в массиве OTM их
отметки по сочинению. Фамилии всех отличников переписать в массив F$.
Размерность массива F$ должна быть не меньше размерности массива FAM$,
так как мы не знаем, сколько человек написали сочинение на 5. Возможно, это
сделали все учащиеся.
DIM FAM$(6)
1.Петров 3
2.Иванов 5
3. Сидорова 4
4. Алексеева 5
5.Жукова 2
6. Иванова 5
DIM F$(6)
1.Иванов
2. Алексеева
3. Иванова
Организуем цикл по массиву отметок. Если отметка пять, то номеру хранящимуся в переменной I из массива FAM$(I) будем брать фамилию. Следить за
номером записываемого элемента в массив F$ будем сами.
10 REM ПОИСК
20 CLS:COLOR 3
30 PRINT”ПОИСК ОТЛИЧНИКОВ”
40 PRINT “Составил программу Петров Женя”
50 N=10
60 DIN FAM$(N), F$(10),OTM(10)
70 PRINT “ ЗАПОЛНЕННЫЙ МАССИВ»
80 FOR I=1 TO N
90 READ FAM$(I)
100 OT(I)=INT(RND(1)*4+2)
110 PRINT FAM$(I);” ОТМЕТКА “;OTM(I)
120 NEXT I
130 J=1
140 FOR I-1 TO N
150 IF OT(I)=5 THEN F$(J)=FAM$(I):J=J+1
160 NEXT I
170 PRINT “ФАМИЛИИ ОТЛИЧНИКОВ “
180 FOR I=1 TO J-1
200 PRINT F$(I)
210 NEXT I
220 END
230 DATA Алексеева, Бурова, Демидов, Дмитриева, Ершова
240 DATA Иванов, Петров, Сидорова, Калинина, Ярова
15
Задания для самостоятельной работы.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
По введенному номеру месяца, распечатать его название.
Через станцию проходят 10 поездов. В массиве содержится время отправления этих поездов. Составить программу, распечатывающею время
отправления всех поездов с 10 до 11 часов вечера..
Таблица содержит расписание движения автобусов. Можно ли уехать с
12 до 13 часов?
Одна таблица содержит список учащихся, а другая их год рождения.
Таблицы связаны по номеру строки. Распечатать фамилии всех, кому
исполнилось 15 лет.
Массив содержит список улиц города. Составить алгоритм, отвечающий
на вопрос «Есть ли улица Тверская?»
В массиве A(N) содержатся положительные и отрицательные элементы.
Найти сумму положительных и произведение отрицательных элементов.
Протабулировать в массив функцию Y=X+Z, где x[1;3] x=0.1, z[4;5]
z=0.5.
А) Сохранить в массиве и значения функции и аргументов. Массив распечатать.
Б) Найти сумму по каждому столбику и распечатать.
В) Найти и распечатать сумму по каждой строчке.
Протабулировать в массив функцию Y=x2-y, где x[-5;4] x=0.2; z[5;2] z=0.3. Подсчитать отдельно сумму отрицательных и положительных элементов массива.
Составить алгоритм, отвечающий на вопрос «В какие дни в марте была
самая низкая температура?»
Составить алгоритм, отвечающий на вопрос «В какие дни в мае была самая высокая температура? Найти среднюю температуру в мае.»
В массив протабулировать функцию y  sin 2 x , х[-10;10] и х=0.1.
Найти ее экстремальные значения.
Дан массив A(N). Массив заполнен числами от 10 до 50. Найти минимальный и максимальный элементы и обменять их местами.
Масиив заполнен двузначными числами. Найти минимальный и максимальный и их номера.
Заполнить массив однозначными числами. Найти минимальный и максимальный элементы. Минимальный поменять местами с первым, а максимальный со вторым элементами массива.
Протабулировать в массив функцию y  sin 2 x cos 2 x , при х[-5;5],
х=0.1. При каких Х эта функция принимает экстремальные значения.
16. В массиве F$(10) находится список учащихся. Все фамилии начинающиеся на букву «Л» переписать в другой массив F1$.
17. В массиве FAM$(10) фамилии учащихся, а в массиве OT(10) их отметки
за контрольную работу. Фамилии всех хорошистов переписать в другой
массив и распечатать его.
18. В массиве ОТМ отметки за контрольную работу. Подсчитать среднюю
отметку и количество двоек.
19. Протабулировать функцию y  x  sin x , где x[-2,3], x=0.2. Найти
экстремальные значения и подсчитать сколько раз функция принимала
MIN значения.
20. В массиве FAM$(N) список учащихся. Переписать все фамилии начинающиеся на букву «И» в другой массив.
21. В массиве Т(31) среднедневная температура в мае. Распечатать самые
жаркие дни.
22. Массив из N элементов заполнен случайными числами из интервала
(0:50]. Найти сумму первых десяти элементов.
23. Массив из N элементов заполнен числами из интервала (0:15]. Найти
произведение первых пяти элементов и сумму остальных.
24. Массив из N элементов заполнен числами из интервала (0:55]. Найти
среднее арифметическое первых 20 элементов.
25. Массив из N элементов заполнен числами из интервала (0:12]. Распечатать все элементы массива большие 7.
26. Массив из N элементов заполнен числами из интервала (5:30]. Распечатаь все элементы массива, которые расположены перед минимальным.
27. Массив из N элементов заполнен числами из интервала (10:99]. Распечатаь все элементы массива, которые меньше среднего арифметического
между максимальным и минимальным элементами массива.
28. Массив из N элементов заполнен числами из интервала (40;60]. Найти
минимальный элемент и максимальный и их среднее арифметическое.
Распечатать сумму элементов и их количесво меньших среднего арифметического и произведение элементов больших среднего арифметического. Подсчитать количество элементов, которые равны среднему
арифметическому.
29. Массив из N элементов заполнен числами из интервала (30;40]. Найти
минимальный элемент и максимальный и их среднее арифметическое.
Распечатать все элементы с их номерами, которые больше среднего
арифметического.
30. Массив из N элементов заполнен числами из интервала (0;9]. Найти минимальный элемент и максимальный. Заменить все элементы большие
разности между максимальным и минимальным на значение максимального элемента..
2
16
Содержание:
1. Табличный способ организации данных. ............................................................... 2
1.1 Понятие массива (таблицы). .............................................................................. 2
1.2 Объявление массива (таблицы). ........................................................................ 2
1.3. Типы таблиц. ...................................................................................................... 3
1.5. Обращение к конкретному элементу массива. ............................................... 3
2. Способы заполнения массивов. ............................................................................... 3
3. Заполнение массива с помощью команды присвоить. .......................................... 4
4. Печать элементов массива. ...................................................................................... 4
4.1. Печать линейного массива. ............................................................................... 4
4.2. Печать прямоугольного массива. ..................................................................... 4
5. Работа с элементами массива, обладающими определенным свойством. .......... 5
5.1. Алгоритм поиска в массиве элемента, обладающего определенным
свойством. ................................................................................................................. 5
5.2. Алгоритм, определяющий, сколько раз в массиве встречается элемент,
обладающий определенным свойством. ................................................................. 5
5.3. Алгоритм, распечатывающий все элементы обладающие определенным
свойством. ................................................................................................................. 6
6. Заполнение массива с помощью команды ввода данных с клавиатуры. ............. 7
6.1. Вычислить значение многочлена по схеме Горнера. ..................................... 7
7. Заполнение массива с помощью функции. ............................................................ 8
7.1. Заполнение функции с помощью датчика случайных чисел. ........................ 8
7.2. Табуляция функции в массив. .......................................................................... 9
7.2.1. Табуляция в массив функции от одной переменной. .............................. 9
7.2.2. Табуляция в массив функции от нескольких переменных. .................. 10
8. Заполнение массива с помощью операторов READ, DATA. ............................. 10
8.1. Алгоритм программы «Контроль знаний». ................................................... 10
8.2. Алгоритм программы «Каталог».................................................................... 11
9. Алгоритмы поиска минимального и максимального элементов массива. ........ 13
10. Обмен элементов в массиве. ................................................................................ 14
11. Получение из одного массива другого. .............................................................. 14
Задания для самостоятельной работы. ..................................................................... 15
Содержание: ................................................................................................................ 16
Download