01 (537404), страница 11
Текст из файла (страница 11)
Write(2, 4) ((A(i, j), j = 1, 4), i = 1, 4), Max_1
4 Format(4(9X, 4F6.2/), 9X, ' Max A = ', F6.2/)
Write(2, 5) ((B(i, j), j = 1, 7), i = 1, 7), Max_2
5 Format(7(7F6.2/), ' Max B = ', F6.2/)
Write(2, 6) ((C(i, j), j = 1, 3), i = 1, 3), Max_3
6 Format(3(12X, 3F6.2/), 12X, ' Max C = ', F6.2)
Close(1)
Close(2)
End
Function Poisk(N, A)
Dimension A(N, N)
R = A(1, 1)
Do 1 i = 1, N
Do 1 j = 1, N
If (R.LT.A(i, j)) R = A(i, j)
1 Continue
Poisk = R
Return
End
Подпрограмма общего вида используется в тех случаях, когда в качестве результата расчетов необходимо получить несколько значений. Так же, как и подпрограмма-функция, она является отдельной программной единицей и отличается от подпрограммы-функции тем, что не передает никакого численного значения, связанного с ее именем. Ввод и вывод данных осуществляется через список ее параметров, а вызов подпрограммы организуется с помощью специального оператора Call.
Первым оператором подпрограммы общего вида должен быть оператор Subroutine, который записывается в общем виде:
Subroutine имя ([параметр_1 [, параметр_2]...])
где имя – имя подпрограммы;
параметр_i – формальные параметры (i=1, 2, ...).
Имя подпрограммы общего вида не имеет типа, поскольку результаты вычислений возвращаются через список параметров. Оно не должно появляться в каком-либо другом операторе подпрограммы, кроме оператора Subroutine. В качестве формальных параметров, повторение которых в описании подпрограммы не допускается, могут использоваться имена переменных, массивов и внешних подпрограмм. Если в качестве формальных параметров использованы массивы, то их необходимо описывать по тем же правилам, что и для подпрограммы-функции.
Подпрограмма общего вида имеет следующую структуру:
-
оператор Subroutine;
-
группа операторов, реализующая вычислительный алгоритм;
-
оператор Return;
-
оператор End.
Например:
123456789............................................................72 73.......80
Subroutine Prog(A, B, C, N)
...............
Return
End
Использование операторов Return и End аналогично их применению в подпрограмме-функции.
Обращение к подпрограмме общего вида выполняется с помощью специального оператора Call.
Call имя ([параметр_1 [, параметр_2]...])
где имя – имя подпрограммы;
параметр_i – фактические параметры (i=1, 2, ...).
В качестве фактических параметров могут использоваться выражения, имена массивов и других подпрограмм. Количество, тип и порядок следования формальных и фактических параметров должны совпадать. Фактический параметр, являющийся именем подпрограммы, должен быть описан в программной единице, вызывающей подпрограмму общего вида так же, как и для подпрограммы-функции. Оператор Call передает управление из вызывающей программы в подпрограмму общего вида и устанавливает соответствие между ее формальными параметрами и фактическими параметрами обращения.
Использование подпрограммы общего вида может быть показано на следующем примере: написать подпрограмму вычисления корней приведенного квадратного уравнения и программу ее тестирования следующими уравнениями:
1. x2 - 3x + 2 = 0;
2. x2 + 4x + 4 = 0;
3. x2 - 4x + 13 = 0.
В результате решения тестовых уравнений должны быть получены результаты
1. | x1 = 1, | x2 = 2; | |||
2. | x1 = -2, | x2 = - 2; | |||
3. | x1 = 2 + 3i, | x2 = 2 - 3i. | |||
*** Замечания по программе: | – в качестве признака типа корней уравнения вводится параметр n, принимающий значение 0 для действительных корней и 1 – для комплексных. | ||||
– в случае комплексных корней значения действительной и мнимой частей хранить отдельно. |
С учетом вышесказанного программа имеет вид:
123456789................................................................72 73....80
Dimension A(3, 2), X1(3), X2(3), N(3)
Open(1, File = 'prog.dat')
Open(2, File = 'prog.res')
Read(1, 1) ((A(i, j), j = 1, 2), i = 1, 3)
1 Format(2F6.2)
Do 10 i = 1, 3
10 Call Roots(A(i, 1), A(i, 2), X1(i), X2(i), N(i))
Write(2, 2)
2 Format(' P', T10, 'Q', T16, 'X1', * T22, 'X2', T27, 'N')
Write(2, 3) ((A(i, j), j = 1, 2), X1(i), X2(i), N(i), i = 1, 3)
3 Format(4F6.2, I3)
Close(1)
Close(2)
End
Subroutine Roots(P, Q, X1, X2, N)
D = (P/2)**2 - Q
If (D.GE.0.0) Then
N = 0
X1 = -P/2 + Sqrt(D)
X2 = -P/2 - Sqrt(D)
Else
N = 1
X1 = -P/2
X2 = Sqrt(-D)
EndIf
Return
End
Формальные параметры в подпрограмме могут отсутствовать и скобки в этом случае необязательны. В этом случае способом передачи данных между программными единицами являются так называемые общие блоки. Под ними понимают общие блоки памяти, доступные различным программным единицам для хранения своей информации. Для описания общих блоков используется оператор Common в форме:
Common список
где список - список имен переменных и массивов, разделенных запятыми.
Оператор должен оформляться в соответствии со следующими правилами:
-
имена переменных и массивов могут встречаться в списке оператора только один раз;
-
имена формальных параметров и функций в списке не до пускаются;
-
оператор Common должен располагаться в программной единице до первого выполняемого оператора.
Работа оператора Common может быть пояснена на примере:
123456789.............................................................72 73.......80
Dimension C(3), X(3), N(3)
Common A, B, C
Open(1, File = 'prog.dat')
Open(2, File = 'prog.res')
.............
Close(1)
Close(2)
End
Subroutine Test(Q, X, N)
Dimension F(3)
Common P, E, F
D = (P/2)**2 - Q
......
Return
End
В данном случае главная программа имеет оператор Common, описывающий общий блок, который содержит значения переменных A и B и одномерного массива C из трех элементов. Такой же блок описан в подпрограмме Test, что позволяет располагать его переменные P, E и массив F в той же области памяти ЭВМ. В результате такого наложения переменные A и P, B и E, а также элементы массивов C и F будут всегда иметь одни и те же значения.
З а д а н и е к л а б о р а т о р н о й р а б о т е
Написать подпрограмму-функцию или подпрограмму общего вида, осуществляющую заданные вычисления, и программу ее тестирования. При тестировании подпрограмм, использовать массивы с количеством элементов не менее 16-ти (например, A(16), B(4, 4)). Исходные данные и результаты вычислений сохранить в файлах prog_7.dat и prog_7.res.
1. Умножить матрицу на вектор.
2. Упорядочить элементы одномерного массива по возрастанию.
3. Найти максимальный элемент двумерного массива и его индексы.
4. Найти среднее арифметическое значение элементов двумерного массива и индексы самого близкого к нему элемента.
6. Вычислить сумму двух матриц.
7. Вычислить площадь треугольника по координатам его вершин.
8. Сформировать одномерный массив, заполненный простыми числами.
9. Выделить в одномерный массив строку матрицы с максимальным элементом.
10. Вычислить с помощью ряда Маклорена, учитывая 10 членов ряда
11. Упаковать верхний треугольник симметричной матрицы в вектор.
12. Вычислить площадь треугольника по длине его стороны и прилежащих к ней углам.
13. Сформировать симметричную матрицу, распаковывая вектор в ее верхний треугольник.
14. Определить количество повторений значения первого элемента в двумерном массиве.
15. Переформировать одномерный массив так, чтобы его элементы располагались в обратном порядке.
16. Вычислить норму вектора в декартовом пространстве.
17. Вычислить ex с помощью ряда Маклорена, учитывая 10 членов ряда
18. Вычислить центральный момент инерции ромба, заданного координатами своих углов в виде двумерного массива.
19. Пронормировать вектор по максимальной по модулю составляющей.
20. Найти угол между двумя векторами, которые представлены одномерными массивами.
21. Умножить матрицу на матрицу.
22. Найти длину наибольшей стороны треугольника, заданного координатами своих вершин в виде двумерного массива.
23. Вычислить коэффициенты параболы, проходящей через три точки, координаты которых заданы в виде двумерного массива.
24. Пересчитать декартовы координаты точки в полярные.
25. Вычислить с помощью ряда Маклорена, учитывая 10 членов ряда
26. Сформировать единичную матрицу заданного размера.
27. Сформировать таблицу из n значений произвольно задаваемой функции на отрезке [a, b].
28. Сформировать одномерный массив, заполненный факториалами чисел натурального ряда.
29. Найти номера двух элементов одномерного массива с самыми близкими значениями.
30. Вычислить площадь многоугольника, заданного координатами своих вершин. Координаты хранить в виде двумерного массива.
Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 8
ГРАФИЧЕСКИЙ ВЫВОД ИНФОРМАЦИИ
С п р а в о ч н а я и н ф о р м а ц и я
На экране монитора изображение формируется с помощью светящихся точек – пикселов (от англ. picture element ~ pixel). Используется два режима организации вывода информации на экран: текстовый и графический. Каждый из этих режимов имеет свои особенности. В текстовом режиме информация выводится в 25 строк по 80 символов каждая. При этом каждый символ размещен в прямоугольной области пикселов, которая окрашивается в два цвета: цвет фона и цвет символа. В графическом режиме возможно управление цветом каждого пиксела, что позволяет формировать более сложные изображения.
Существует несколько графических режимов работы монитора, которые различаются как количеством пикселов, формирующих изображение, так и количеством используемых цветов. Например:
-
строк по 640 пикселов и 16 цветов (64035016);
-
строк по 640 пикселов и 16 цветов (64048016);
-
строк по 640 пикселов и 256 цветов (640480256);
и другие.
Каждый из режимов использует фиксированный набор цветов, который называется цветовой палитрой. При выполнении лабораторной работы рекомендуется использовать режим (64048016). В данном режиме в цветовую палитру входят следующие цвета, каждый из которых имеет свой номер:
0 | – черный; | 8 | – темно-серый; |
1 | – синий; | 9 | – ярко-синий; |
2 | – зеленый; | 10 | – ярко-зеленый; |
3 | – голубой; | 11 | – светло-голубой; |
4 | – красный; | 12 | – розовый; |
5 | – сиреневый; | 13 | – светло-сиреневый; |
6 | – коричневый; | 14 | – светло-желтый; |
7 | – светло-серый; | 15 | – белый. |
Горизонтальные и вертикальные ряды пикселов образуют экранную систему координат, начало которой помещено в верхний левый угол экрана, как показано на рис.1. Экранная координата xэ откладывается по горизонтали, а yэ - по вертикали.
Рис.1.
При включении ЭВМ автоматически устанавливается и поддерживается текстовый режим работы монитора и требуется выполнить ряд специальных действий для того, чтобы перевести его в графический режим. Для упрощения этих операций используются графические пакеты – библиотеки подпрограмм, ориентированных на организацию графического режима и построение изображения. В настоящее время существует широкий спектр различных графических пакетов. В лабораторной работе будет рассмотрен пакет Connell Scientific Graphics, разработанный Е.Коннеллом (Ed. Connell).