Н.Ф.Кузенко
Министерство путей сообщения Российской Федерации
Дальневосточный государственный университет путей сообщения
Кафедра “Информационные технологии и системы”
Хабаровск
1998
Алгоритмические языки используют различные приемы объявления данных. Все данные при решении задачи на ЭВМ могут классифицироваться по разным признакам. Если под одним именем переменной хранится одно значение данных (число, запись), то оно занимает одну “ячейку” оперативной памяти. Указание только этого имени в каком-либо операторе достаточно для обращения к этому данному. Такие данные называются простыми переменными. Если же используется набор данных одного типа и по своей функциональной значимости в логике они однозначны, то каждому элементу давать свое уникальное имя неэффективно. Такие данные объединяются в массивы и им присваивают одно уникальное имя для всего набора этих данных.
Практически во всех составленных программах обязательно используются массивы, поэтому студенты должны хорошо усвоить этот оператор овладеть практическими навыками в программировании задач, совершенствовать навыки в редактировании программ при помощи данных методических указаний.
В работе описывается лишь несколько способов применения массивов. Если возникнет потребность в более глубоком изучении этого раздела программирования, необходимо обратиться к специальной литературе для соответствующего алгоритмического языка.
Массив – это набор чисел, которому дано общее имя. Каждое число в массиве называют элементом. Массив является структурным типом данных. В данной работе рассмотрены только одно- и двумерные числовые массивы.
Пример 1. Допустим число сотрудников в различных отделах некоторого предприятия следующее:
1 отдел | 2 отдел | 3 отдел | 4 отдел | 5 отдел | 6 отдел |
32 чел. | 11 чел. | 24 чел. | 10 чел. | 17 чел. | 26 чел. |
Набор этих данных можно представить как одномерный массив с шестью элементами. Пусть этому массиву дано имя L. Тогда элементы массива L можно записать в виде переменных с индексами:
L(1) L(2) L(3) L(4) L(5) L(6)
или L(I), где I = 1, 2, 3, 4, 5, 6. Индекс данного массива будет один – I. Каждая переменная будет иметь свое значение:
L(1) = 32 L(2) = 11 L(3) = 24 L(4) = 10 L(5) = 17 L(6) = 26
Пример 2. В качестве примера двумерного массива рассмотрим матрицу:
В этой матрице две строки, три столбца и ее элементы можно представить как двумерный массив. Индексация элементов двумерного массива производится таким образом: первый индекс обозначает номер строки матрицы, в которой находится данный элемент, второй индекс – это столбец в строке. Пусть имя заданного массива – R. Тогда элементы массива обозначаются как R(I,J), где I = 1,2 и J = 1,2,3.
R(1,1) = 1 R(1,2) = 3 R(1,3) = 7
R(2,1) = 6 R(2,2) = 9 R(2,3) = 10
Заметим, что индекс не имеет ничего общего с содержимым ячейки. Пара индексов служит для адресации заданной ячейки памяти.
В Basic элементы массивов располагаются в последовательных ячейках памяти. Это означает, что массив занимает непрерывную область памяти. Прежде, чем мы сможем обратиться к массиву из программы, надо указать, сколько памяти необходимо для размещения массива. Описание размера массива выполняется с помощью оператора DIM, который имеет следующий синтаксис:
DIM переменная (индексы) [, переменная (индексы)]...
Здесь имя переменной является именем массива, индексы – это список числовых выражений, определяющих максимальное значение соответствующих индексов, разделенных запятыми. В одном операторе DIM возможно описание нескольких массивов, разделенных запятыми.
Опишем заданные в примерах массивы:
DIM L(6), R(2,3)
где L, R – имена массивов; 6, 2, 3 – их индексы.
Этот оператор предписывает интерпретатору отвести достаточно памяти для размещения массива L с шестью элементами и двумерного массива R из двух строк и трех колонок.
Элементам массива мы можем присвоить значение точно таким же образом как и обычным переменным. И так же, как обычные переменные, элемент массива имеет значение 0 с того момента, когда массив определен, и до того, как он получит какое-то другое значение. Чаще всего элементы массива получают значения с помощью оператора присваивания или оператора ввода.
Приведенные ниже программы присваивают значения элементам массива L с помощью оператора присваивания LET, операторов DATA-READ и оператора INPUT. Строки с оператором INPUT введены в программы для просмотра содержимого массивов.
Поочередно наберите и запустите программы 1–3. Перед набором очередной программы не забывайте очищать память ЭВМ (команда NEW) и экран (команда CLS).
ПРОГРАММА 1
10 DIM L(6)
15 L(1) = 32:L(2) = 11:L(3) = 24:L(4) = 10:L(5) = 17:L(6) = 26
20 PRINT L(1), L(2), L(3), L(4), L(5), L(6)
25 END
ПРОГРАММА 2
10 DIM L(6)
15 DATA 32,11,24,10,17,26
20 READ L(1), L(2), L(3), L(4), L(5), L(6)
30 PRINT L(1), L(2), L(3), L(4), L(5), L(6)
35 END
ПРОГРАММА 3
10 DIM L(6)
15 INPUT L(1), L(2), L(3), L(4), L(5), L(6)
20 PRINT L(1), L(2), L(3), L(4), L(5), L(6)
30 END
Возможно присваивание значений не всем элементам массива. Тогда оставшиеся элементы будут иметь начальное нулевое значение.
Если загрузить значения в большой массив, то эти методы работы с массивами становятся непрактичными. Можно значительно упростить программу, если привлечь для присвоения значений оператор цикла FOR.
Выполните и проанализируйте действие программы 4.
ПРОГРАММА 4
10 DIM L(6)
15 FOR I = 1 TO 6
20 INPUT "Введите элемент массива ",L(I)
25 NEXT I
30 FOR I = 1 TO 6
35 PRINT L(I)
40 NEXT I
45 END
В этой программе печать элементов массива на экран реализована тоже с помощью оператора FOR. Поставьте в конце строки 35 точку с запятой ( ; ) и запустите программу. Найдите и запомните отличия в действиях программ. Затем замените в программе 4 точку с запятой ( ; ) на запятую ( , ) и снова запустите программу. Сделайте выводы об особенностях работы оператора PRINT и не забывайте о них, так как именно этот оператор формирует формат выходных данных в программе.
Ввод нескольких массивов одного размера можно осуществить в одном цикле (программа 5).
ПРОГРАММА 5
10 PRINT “Введите массивы А, С”
20 PRINT “ Набирайте элементы массива поочередно”
30 DIM A(6),C(5)
35 FOR I = 1 TO 6
20 INPUT A(I),C(I)
25 NEXT I
35 END
При выполнении программы 5 данные вводятся попарно: А(I), С(I). После ввода каждой пары значений нажимается клавиша Enter. Однако такой способ ввода часто является причиной ошибок. Более естественно вводить сначала все элементы одного массива, а затем другого. Для этого ввод каждого массива нужно осуществлять в отдельном цикле, как показано в программе 6.
ПРОГРАММА 6
10 DIM A(5), C(5)
20 PRINT “Введите массив А”
30 FOR I = 1 TO 6
20 INPUT A(I)
30 NEXT I
40 PRINT “Введите массив С”
50 FOR I = 1 TO 6
60 INPUT C(I)
70 NEXT I
80 END
Если вводимые массивы имеют различные размеры, то последний способ ввода данных является оптимальным. Аналогичным образом можно вводить любое количество массивов. Действия со строковыми массивами аналогичны действиям c числовыми массивами, но не забывайте, что имена строковых массивов должны оканчиваться символом $, например, L$, PROBA$, S$ и т. д.
При выводе массивов необходимо обеспечить наглядность и удобство восприятия полученных результатов. В программах 1–4 использовался вывод элементов массивов при помощи оператора PRINT. Рассмотрим это более подробно.
Вывод одномерного массива, как правило, целесообразно осуществлять в строку, сопровождая поясняющим текстом (программа 7).
ПРОГРАММА 7
200 PRINT “Массив А”
210 FOR I = 1 TO N
220 PRINT A(I);
230 NEXT I
240 PRINT
Число N в программе 7 обозначает размерность массива А. В приведенной программе вывод массива А в строку обеспечивается использованием точки с запятой ( ; ) в операторе PRINT (строка 220). PRINT без списка (строка 240) осуществляет вывод пустой строки после окончания вывода массива А.
При выводе двух или нескольких одномерных массивов одного размера часто удобно вывести их как параллельно расположенные столбцы (программа 8).
ПРОГРАММА 8
200 PRINT “Массив А”, “Массив В”
210 FOR I = 1 TO N
220 PRINT A(I), B(I);
230 NEXT I
Вывод двух или более массивов различных размеров, как правило осуществляется в строку. Вывод нового массива начинается с новой строки. В программе 9 обеспечивается печать элементов массива А в ту же строку, в которую выводится заголовок “Массив А:”, что реализуется использованием точки с запятой в строке 200. Аналогично для массива В.
ПРОГРАММА 9
200 PRINT “Массив А:”;
210 FOR I = 1 TO N
220 PRINT A(I);
230 NEXT I
240 PRINT
250 PRINT “Массив В:”;
260 FOR I=1 TO M
270 PRINT B(I);
280 NEXT I
290 PRINT
1.1.3. Задания для самостоятельной работы
1. Составить программу, которая выводит в одномерный числовой массив десять последовательных целых чисел, начиная с числа К (число К запрашивается программой) и выводит содержимое массива в строку.
2. Составить программу по условию задания 1, вывести содержание массива в виде столбца.
3. Составить программу, которая выводит в одномерный строковый массив список из пяти фамилий, а затем выводит их в столбец.
4. Составить программу “Вычислитель календаря”. Программа должна запрашивать номер месяца и в ответ выводить название месяца и количество дней в нем.
Циклы могут быть вложенными друг в друга, то есть один цикл выполняется внутри другого цикла. Если циклы вложены, то каждый цикл должен иметь уникальное имя счетчика цикла. Оператор NEXT, заканчивающий внутренний цикл, должен появляться раньше, чем оператор NEXT, заканчивающий внешний цикл. Пример работы программы с вложенными циклами показан в программе 10.
ПРОГРАММА 10
. . .
50 FOR I=1 TO 4
. . .
80 FOR J=1 TO 4
. . .
100 NEXT J
. . .
125 NEXT I
При I = 1 переменная J поочередно принимает значения от 1 до 4, затем I увеличивается на 1 и переменная J опять принимает значения от 1 до 4 и так далее, пока I не примет последнее значение 4. В итоге получаем цикл в цикле. Для усвоения этой темы можно выполнить программу 11.
ПРОГРАММА 11
5 CLS
10 FOR I = 1 TO 6
20 FOR J = 1 TO 4
30 PRINT "I = ";I,"J = ";J
40 NEXT J
50 NEXT I
В Basic не делается ограничений на число вложенных циклов.
1.3. Двумерные массивы
Значения элементам двумерного массива могут быть присвоены любым из способов, которые мы использовали для присвоения значений переменным (см. программы 1, 2). Наиболее естественный путь присваивания значений двумерным массивам – использование этих операторов в теле цикла FOR. Счетчик одного цикла I пробегает по строкам массива, счетчик другого цикла J – по столбцам. При этом используются так называемые вложенные циклы. Этот прием показан в программе 12.
ПРОГРАММА 12
10 DIM R(2,3)
15 FOR I=1 TO 2
20 FOR J=1 TO 3
25 READ R(I,J)
30 NEXT J
35 NEXT I
. . .
90 REM значения элементов массива
95 DATA 1,3,7,6,9,10
100 END
Двумерные массивы необходимо вводить в привычном виде (по строкам), начиная ввод новой строки массива в новую строку экрана.
Для распечатки значений элементов двумерного массива удобнее пользоваться вложенными циклами. После вывода очередной строки матрицы оператор PRINT (строка 75 в программе 13) обеспечивает переход на новую строку.
ПРОГРАММА 13
10 DIM R(2,3)
. . .
50 REM печать значений элементов на экран
55 FOR I = 1 TO 2
60 FOR J = 1 TO 3
65 PRINT R(I,J);
70 NEXT J
75 PRINT
80 NEXT I
. . .
100 END
Рассмотрим несколько примеров программ с использованием двумерных массивов.
В программе 14 в переменную S поочередно складываются значения элементов матрицы B(I,J) размерностью N строк на M столбцов. После окончания работы программы в переменной S будет содержаться искомая величина элементов матрицы.
ПРОГРАММА 14
90 REM Вычисление суммы элементов матрицы
100 S = 0
110 FOR I = 1 TO N
120 FOR J = 1 TO M
130 S = S+B(I,J)
140 NEXT J
150 NEXT I
В программе 15 производится суммирование элементов матриц А и В одинаковой размерности (N x M), в результате которого получается суммарная матрица С той же размерности. Суммирование производится при использовании вложенных циклов.
ПРОГРАММА 15
90 REM Суммирование матриц
100 FOR I = 1 TO N
110 FOR J = 1 TO M
120 C(I,J) = A(I,J)+B(I,J)
130 NEXT J
140 NEXT I
В программе 16 в переменную S поочередно складываются элементы матрицы В, принадлежащие строке 1.
ПРОГРАММА 16
90 REM Вычисление суммы I-й строки матрицы
100 S = 0
110 FOR J = 1 TO M
120 S = S+B(I,J)
130 NEXT J
Составьте программу, позволяющую заполнять двумерную числовую матрицу размерностью и выводить ее на экран.
Составьте программу, определяющую сумму элементов произвольного столбца матрицы.
Составьте программу, вычисляющую произведение двух матриц размерностями.
Напишите программу, вычисляющую определитель матрицы размерностью.
Напишите программу, заменяющую строки матрицы ее столбцами.
Изучить возможности языка Basic и овладеть практическими навыками в программировании задач, используя данные в виде массивов. Совершенствовать навыки в редактировании программ.
1. Изучить операторы, позволяющие организовать данные в виде массивов.
2. Изучить возможности ввода и вывода данных в массив различными способами, включая способ вложения циклов.
3. Вводить, редактировать, отлаживать и реализовывать программы на языке Basic.
4. Оформить отчет. Отчет содержит: 1) цель работы; 2) постановку задачи согласно варианта; 3) листинг текста программы; 4) результаты реализации программы (распечатка) согласно заданиям каждого варианта; 5) выводы по проделанной работе.
Дана матрица:
Задание 1. Найти среднее значение элементов, стоящих в первой строке.
Задание 2. Умножить все элементы матрицы на число 3 и вывести полученную матрицу на печать.
Заданной матрице присвоить имя A. Матрица двумерная, следовательно все ее значения заносятся в программу в цикле. В данном примере используется оператор DATA-READ. Умножение элементов матрицы на число 3 также удобнее выполнить в цикле. Для нахождения среднего значения определяется переменная S и ее значение выводится на печать. В конце программы элементы полученной новой матрицы выводятся на печать также с помощью цикла. Для того, чтобы на экране элементы матрицы располагались в привычном для нас виде, то есть по три элемента в строке, в программе написаны два оператора PRINT.
5 REM очистка экрана
10 CLS
15 REM присвоение данных элементам матрицы
20 DIM A(2,3)
25 FOR I = 1 TO 2
30 FOR J = 1 TO 3
35 READ A(I,J)
40 NEXT J
45 NEXT I
50 REM вычисление среднего значения элементов матрицы
55 S = (A(1,1)+A(1,2)+A(2,3))/3
60 PRINT " СРЕДНЕЕ ЗНАЧЕНИЕ ЭЛЕМЕНТОВ ПЕРВОЙ
СТРОКИ S = ";S:PRINT
65 REM умножение элементов матрицы на число
70 FOR I = 1 TO 2
75 FOR J = 1 TO 3
80 B(I,J) = A(I,J)*3
85 NEXT J
90 NEXT I
95 REM распечатка значений элементов новой матрицы
100 PRINT "ЗНАЧЕНИЯ ЭЛЕМЕНТОВ НОВОЙ МАТРИЦЫ": PRINT
105 FOR I = 1 TO 2
110 FOR J = 1 TO 3
115 PRINT B(I,J);
120 NEXT J
125 PRINT:PRINT
130 NEXT I
135 DATA 2,3.1,8.1,-1,5,-3
140 END
После отладки программы необходимо вывести на печать текст программы, используя команду LLIST. Для вывода результатов вычислений на печать используется оператор LPRINT. В программе надо все операторы PRINT заменить оператором LPRINT и запустить программу. Результат будет печататься на бумаге.
СРЕДНЕЕ ЗНАЧЕНИЕ ЭЛЕМЕНТОВ ПЕРВОЙ СТРОКИ S = 4.4
ЗНАЧЕНИЯ ЭЛЕМЕНТОВ НОВОЙ МАТРИЦЫ
Определение массивов.
Одномерные массивы.
Двумерные массивы.
Операторы описания массивов.
Различные способы присвоения значений элементам массивов.
Операторы присвоения DATA-READ, INPUT, LET.
Операторы цикла.
Вложенные циклы.
Использование вложенных циклов для присвоения значений элементам массива.
Использование вложенных циклов для вывода результатов на печать.
Операторы вывода на печать.
Вариант 1
Оклады сотрудников распределены по степеням и классам:
Степень1 | Степень 2 | Степень 3 | |
Класс 1 Класс 2 Класс 3 |
973 1180 1300 |
989 1265 1400 |
1060 1345 1520 |
Произведено увеличение окладов для 1 класса на 2.3 %; для 2 класса на 3.5 %; для 3 класса на 5.6 %.
Задание 1. Подсчитать новые оклады и вывести их на печать в заданной форме.
Задание 2. Найти сумму всех окладов.
ВАРИАНТ 2
Результаты сдачи экзаменов занесены в ведомость:
Математика | История | Физика | |
Иванов Кузнецов Михайлов Петров |
3 с+1 5 3 |
3 3 с+1 4 |
5 3 5 с+1 |
Задание 1. Подсчитать средний балл по каждой дисциплине и по каждому учащемуся.
Задание 2. Подсчитать общий средний балл по группе.
ВАРИАНТ 3
Дана матрица:
Задание 1. Найти сумму всех элементов матрицы и сумму элементов, стоящих на главной диагонали матрицы.
Задание 2. Поменять местами первый и второй столбец и распечатать полученную матрицу.
ВАРИАНТ 4
Дан определитель:
Задание 1. Найти значение определителя.
Задание 2. Умножить определитель на число с+2.3. Вывести полученный определитель на печать.
ВАРИАНТ 5
Даны две матрицы:
и
Задание 1. Найти сумму матриц и распечатать полученную матрицу.
Задание 2. Найти определители матриц.
ВАРИАНТ 6
В компании служат шесть человек с различной почасовой оплатой:
Служащий | 1 | 2 | 3 | 4 | 5 | 6 |
Отработанные за неделю часы |
40+c | 42 | 38+c | 44 | 35+c | 36 |
Плата за один час | 3.2 | 3.2 | 3.0 | 3.0 | 3.0 | 2.8 |
Задание 1. Подсчитать недельный заработок каждого служащего и всю сумму денег, выплачиваемую всем служащим за неделю.
Задание 2. Результаты задания 1 вывести на печать в виде одномерного массива.
ВАРИАНТ 7
Дана матрица:
Задание 1. Умножить первую строку на число "c". Матрицу вывести на печать.
Задание 2. Поменять местами второй и третий, первый и четвертый столбец. Матрицу вывести на печать.
ВАРИАНТ 8
Даны две матрицы:
и
Задание 1. Найти произведение матриц. Вывести полученную матрицу на печать.
Задание 2. Найти среднее значение элементов полученной матрицы.
ВАРИАНТ 9
Дана матрица:
Задание 1. Просуммировать элементы первой и второй строки. Результат вывести в одномерном массиве размером 4.
Задание 2. Найти среднее значение элементов заданной матрицы.
ВАРИАНТ 10
Дана матрица:
Задание 1. Сформировать одномерный массив из диагональных элементов (I = J).
Задание 2. Просуммировать элементы полученного одномерного массива.
ВАРИАНТ 11
Дан массив X:
Задание 1. Вычислить значения функции при значениях аргумента, заданных в массиве X, поместить их в массив Y и распечатать этот массив.
Задание 2. Найти среднее значение элементов массива X и массива Y.
ВАРИАНТ 12
Для изготовления печенья требуется следующий расход продуктов:
мука | 2 стакана | по 1 р. 20 к. | за 1 стакан |
яйцо | 4 шт. | по 2 р. 20 к. | за шт. |
маргарин | 200 г | по 3 р. 10 к. | за 100 г |
сахар | 1 стакан | по 2 р. 40 к. | за 1 стакан |
Задание 1. Сформировать два одномерных массива: по величине требуемого продукта и по стоимости. Найти стоимость отдельных продуктов и вывести на печать с помощью одномерного массива.
Задание 2. Найти общую стоимость печенья.
ВАРИАНТ 13
Даны два одномерных массива:
Задание 1. Вычислить сумму и разность двух одномерных массивов.
Задание 2. Считая, что оба массива являются координатами векторов X и Y, найти скалярное произведение векторов.
ВАРИАНТ 14
Дана матрица:
Задание 1. Найти сумму первой и второй строки, полученный результат оформить в виде одномерного массива и вывести на печать.
Задание 2. Найти среднее значение всех столбцов, результат оформить в виде одномерного массива.
ВАРИАНТ 15
Дана матрица:
Задание 1. Переставить первую и вторую строку матрицы и полученную матрицу вывести на печать.
Задание 2. Найти сумму элементов, стоящих на диагонали матрицы в виде одномерного массива.
ВАРИАНТ 16
Даны две матрицы:
и
Задание 1. Найти произведение матриц и распечатать полученную матрицу.
Задание 2. Найти разность матриц.
ВАРИАНТ 17
В компании служат пять человек с различной почасовой оплатой:
Служащий | 1 | 2 | 3 | 4 | 5 |
Отработанные за неделю часы | 66 | 49 | 76 | 55 | 22 |
Плата за 1 час | 203 | 239 | 451 | 563 | 365 |
Задание 1. Подсчитать заработок каждого служащего за месяц и всю сумму денег, выплачиваемую всем служащим за неделю.
Задание 2. Увеличить всем оклад на 5 %.
ВАРИАНТ 18
Дана матрица:
Задание 1. Умножить третью строку на произвольное число "c". Матрицу вывести на печать.
Задание 2. Поменять местами вторую и третью, первую и четвертую строку. Матрицу вывести на печать.
ВАРИАНТ 19
Даны две матрицы:
и
Задание 1. Найти сумму матриц. Вывести полученную матрицу на печать.
Задание 2. Найти определители матриц.
ВАРИАНТ 20
Дана матрица:
Задание 1. Найти разность между первой и второй строкой. Результат вывести в одномерном массиве размером 4.
Задание 2. Найти среднее значение элементов заданной матрицы.
ВАРИАНТ 21
Дана матрица:
Задание 1. Найти обратную матрицу.
Задание 2. Просуммировать элементы первой строки.
ВАРИАНТ 22
Дан массив X:
Задание 1. Вычислить значения функции Y = sin(x) при значениях аргумента, заданных в массиве X, поместить их в массив Y и распечатать этот массив.
Задание 2. Найти среднее значение элементов массива Y.
ВАРИАНТ 23
Для изготовления одной порции печенья требуется следующий расход продуктов:
мука | 2 стакана | по 346 р. | за 1 стакан |
яйцо | 4 шт. | по 2454 р. | за шт. |
маргарин | 200 г | по 723 р. | за 100 г |
сахар за | 1 стакан | по 837 р. | 1 стакан |
Задание 1. Сформировать массив (). Найти стоимость отдельных продуктов и вывести на печать с помощью одномерного массива.
Задание 2. Найти общую стоимость печенья. Сформировать массив для данного количества порций печенья.
ВАРИАНТ 24
Даны два одномерных массива:
Задание 1. Сформировать программным способом двумерный массив и найти среднее значение элементов полученного массива.
Задание 2. Считая, что оба массива являются координатами векторов X и Y, найти скалярное произведение векторов.
ВАРИАНТ 25
Дана матрица:
Задание 1. Диагональные элементы оформить в виде одномерного массива и вывести на печать. Найти среднее этих диагональных элементов.
Задание 2. Поменять местами первую и третью строку.
ВАРИАНТ 26
Дана матрица:
Задание 1. Сложить первую и вторую строку матрицы и полученную матрицу вывести на печать.
Задание 2. Найти обратную матрицу.
Примечание. В заданных вариантах значение буквы "с" принимается равным последней цифре номера группы студента.
Светозарова Г.И., Мельников А.А., Козловский А.В. Практикум по программированию на языке Бейсик: Учебное пособие для вузов. – М.: Наука, 1988.
Мельникова О.И., Бонюшкина А.Ю. Начало программирования на языке Q Basic. – М.: ЭКОМ, 1997.
Вострикова З.П., Вострикова О.Ю., Туева С.С. Программирование на языке “Бейсик” для персональных ЭВМ. – М.: Финансы и статистика, 1993.
Фигурнов В.Э. IBM-PС для пользователя. – 6–7-е изд. – М.: Финансы и статистика, 1997–1998.