Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_informatika / Бейсик (курс 'Информатика') №6.doc
Скачиваний:
21
Добавлен:
14.02.2016
Размер:
523.78 Кб
Скачать

6. Работа с массивами

Как правило, данные для вычислений на компьютере задаются в упорядоченной форме – в виде последовательности (вектора) чисел или в виде таблицы (матрицы) чисел. Такие совокупности данных называются массивами. Построение программ, оперирующих с элементами массивов – важнейшая часть техники программирования.

Например, вектор A длиной К чисел и матрица В из N строк и M столбцов (всего из NM элементов) выглядят следующим образом (рис. 6.1).

Цифры при имени массива, указывающие порядковый номер эле­мента, называются индексами. В алгоритмических языках элементы массивов AI и BIJ обозначаются как A(I) и B(I,J). К массиву в целом обратиться нельзя. Обработка массива обычно означает последовательную обработку отдельных его элементов.

Оператор описания массивов. Если предполагается работа с массивами, предварительно следует “известить” об этом компьютер оператором вида

DIM список_массивов

Описание массива содержит имя массива и его размерность. Например, оператор DIM A(20), B(4,6) читается как “Установить размерность одномерного массива A из 20 элементов и двумерного массива В из 24–х элементов (4 строки, 6 столбцов)”.

По умолчанию отсчет элементов в Бейсике начинается с нуля, то есть оператор DIM A(20) определяет на самом деле 21 элемент памяти (нулевой элемент можно игнорировать). Если есть необходимость установить нестандартную нумерацию, можно при определении размерности использовать указатель вида нижняя граница индекса ТО верхняя граница. Например, оператор DIM Y(5 TO 20, 1 TO 8) определяет двухмерный мас­сив Y, у которого первый индекс изменяется от 5 до 20, а второй – от 1 до 8. Размерность массива задается исходя из условий решаемой задачи. Первоочередной задачей при работе с массивами является ввод-вывод данных, который организуется с помощью циклов. На рис. 6а осуществляется ввод данных в вектор A размерностью N эле­ментов. На рис. 6б – в матрицу В размерностью N строк на M столбцов. Ввод осуществляется с помощью двух циклов, один из которых вложен в другой. В наружном цикле изменяется первый индекс I элемента матрицы В, во внутреннем – второй индекс J. Таким образом, второй индекс J изменяется быстрее, чем первый. Это означает, что ввод элементов матрицы будет производиться в следующей последовательности: B(1,1), B(1,2), ... , B(1,M); B(2,1), B(2,2), ... , B(2,M); ... ; B(N,1), B(N,2), ... B(N,M), т.е. по строкам. Замечание. Два последних оператора могут быть объединены в один вида NEXT j,i (первым должен быть указан индекс внутреннего цикла, вторым – внешнего). Аналогичным образом осуществляется и вывод (рис. 6в), но вместо оператора INPUT используется оператор PRINT. Здесь, однако, следует позаботиться об удобстве восприятия выводимых данных. Желательно, чтобы строка матрицы занимала на экране именно одну строку. Для этого во внутреннем цикле печати нужно поставить точку с запятой после оператора вывода (PRINT;), что подавляет переход на новую строку монитора после вывода каждого числа. Напротив, после завершения вывода всех элементов строки матрицы, как раз следует перейти на следующую строку монитора. Для этого ниже оператора NEXT j следует поставить пустой оператор PRINT, который переведет вывод на следующую строку экрана. Кроме того, для обеспечения фиксированного расположения элементов матрицы друг под другом в столбцы, имеет смысл использовать для вывода не оператор PRINT, а PRINT USING (например, PRINT USING "####.##"; b(i,j);).

Программа к задаче 6.1

INPUT n

DIM c(n)

FOR i=1 TO n

INPUT c(i)

NEXT

Проверка

m=c(1): k=1

FOR i=2 TO n

IF m<c(i) THEN m=c(i): k=i

NEXT

?m k

m=5, k=1

i=2

5>2

i=3

5<7 m=7,k=3

i=4

7>4

i=5

7, 3

Задача 6.1. В векторе С размерности N элементов найти максимальный по значению элемент и его номер в С. Ниже приведена программа и ее проверка для N=4 и C=[5,2,7,4] (с оператора m=c(1)). Здесь переменная М запоминает значение максимального элемента, а К – номер этого элемента в векторе С. Первоначально в качестве такого элемента берется самый первый.

Sub primer()

n = Val(InputBox("vvedite n"))

Dim a(5) As Integer

For i = 1 To n

a(i) = Val(InputBox("vvedite a(i)"))

Next

m = a(1): k = 1

For i = 1 To n

If m < a(i) Then m = a(i): k = i

Next

MsgBox (m)

MsgBox (k)

End Sub

Задача 6.2. Определение значения вклада в банке на конец года. Пусть в банке имеется N счетов вкладчиков. Для всех известны значения остатков на счете в конце каждого квартала. Следует определить и напечатать значения всех вкладов на конец года с учетом известного процента роста вклада Р. Данные о вкладах хранятся в массиве X из N строк и пяти столбцов. Первые четыре элемента каждой i-ой строки X(i,1), X(i,2), X(i,3), X(i,4), хранят остатки вклада на конец каждого из четырех кварталов года. В последний пятый элемент строки X(i,5) следует занести вычисленную величину вклада на конец года. Он равен остатку вклада на конец последнего квартала X(i,4) плюс установленный процент Р/100 от среднего значения вклада (X(i,1)+X(i,2)+X(i,3)+X(i,4))/4 за год. Отсюда X(i,5)=X(i,4)+(Р/100)*(X(i,1)+X(i,2)+X(i,3)+ X(i,4))/4.

I кв

X(i,1)

II кв

X(i,2)

III кв

X(i,3)

IV кв

X(i,4)

Остаток на конец года

X(i,5)=X(i,4)+(Р/100)*(X(i,1)+X(i,2)+X(i,3)+X(i,4))/4

Кроме перечисленного, следует найти сумму всех вкладов в банке S и среднее значение вклада, приходящееся на одного вкладчика S/N.

Программа к задаче 6.2

INPUT "Введите число вкладчиков и процент ",N,P

DIM x(n,5)

FOR i=1 TO n

FOR j=1 TO 4

?"Введите остаток вклада №"i "за" j "квартал ";

INPUT x(i,j)

NEXT j,i

s=0

?" Счет Остатки по кварталам ВСЕГО"

?" I II III IV"

FOR i=1 TO n

x(i,5)=x(i,4)+(р/100)*(x(i,1)+x(i,2)+x(i,3)+x(i,4))/4

PRINT USING "#######"; i,x(i,1),x(i,2),x(i,3),x(i,4),x(i,5)

s=s+x(i,5)

NEXT

? "Сумма вкладов =" s, "Средний вклад =" s/n

Программа к задаче 6.3

INPUT n

DIM x(n)

'формирование исходного вектора

FOR i = 1 TO n: x(i) = i: NEXT

FOR i = 1 TO n - 1

FOR j = i + 1 TO n

'при x(i)<x(j), числа меняются местами

IF x(i)<x(j) THEN SWAP x(j), x(i)

NEXT j

NEXT i

'вывод результатов

FOR i = 1 TO n: PRINT x(i): NEXT

Задача 6.3. Сортировка чисел в массиве.Пусть имеется вектор чисел X длиной N. Напечатать массив в порядке убывания значений его элементов. Алгоритм реализуется при помощи двух вложенных циклов. В наружном цикле последовательно перебираются числа X(i) в массиве и во вложенном цикле сравниваются со всеми оставшимися числами справа от данного X(j). Если выясняется, что какое-то из X(i) меньше сравниваемого, они меняются местами – большее число становится на место меньшего. В программе для упрощения в качестве элементов массива взяты их номера i. Если вектор имеет длину четыре (X(4)), то будет выполнена следующая последовательность перестановок чисел массива:1,2,3,4; 2,1,3,4; 3,1,2,4; 4,1,2,3; 4,3,2,1.

Задачи для самостоятельного решения.

1). Напечатать число из массива X(N), предшествующее минимальному. Sub primer()

n = Val(InputBox("vvedite n"))

Dim a(5) As Integer

For i = 1 To n

a(i) = Val(InputBox("vvedite a(i)"))

Next

m = a(1): k = 1

For i = 1 To n

If m > a(i) Then m = a(i - 1): k = i - 1

Next

MsgBox (m)

MsgBox (k)

End Sub

2). Переместить элементы массива X в массив Y таким образом, чтобы в нем сначала оказалась вторая половина исходного массива X, а затем первая.

3). В массиве X(N) N произвольных чисел (N нечетное). Напечатать эти числа, начиная с центрального, затем число, стоящее рядом слева, затем справа и т.д. до достижения границ массива.

4). Имеются (рис. 6.3) массивы X(N) и Y(N) с координатами X, Y точек на плоскости в порядке их обхода. Определить (с помощью теоремы Пифагора) периметр замкнутой фигуры, с вершинами в этих координатах.

5). Построить вложенный цикл для печати таблицы умножения (как на обложке ученической тетради).