Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

WinRAR ZIP archi / 2011_Лабораторные по инф_паскаль_Ч2

.pdf
Скачиваний:
30
Добавлен:
14.02.2015
Размер:
264.15 Кб
Скачать

Начало

 

 

1

'Матрица A'

'Произведение C=A*B'

 

i := 1 to 3

i := 1 to 3

 

j := 1 to 4

c[i], ' '

 

a[i, j], ''

 

 

Конец

'Вектор B'

 

j := 1 to 4

 

b[j], ''

 

i := 1 to 3

j := 1 to 4

c[i] := c[i] + a[i, j] * b[j]

1

Рисунок 17.4 - Схема алгоритма умножения матрицы на вектор

11

program N_17_4;

//умножение матрицы на вектор var

i, j: integer;

c:array [1..4] of integer;

a:array [1..3, 1..4] of integer := ((1, 2, 6, 4),

(7, 5, 3, 7), (7, 5, 9, 0));

b: array [1..4] of integer := (5, 4, 2, 1);

begin

writeln(' Матрица A'); for i := 1 to 3 do begin

for j := 1 to 4 do begin

write(a[i, j], ' '); end;

writeln end;

writeln(' Вектор B'); for j := 1 to 4 do begin

write(b[j], ' '); end;

writeln;

for i := 1 to 3 do begin

for j := 1 to 4 do begin

c[i] := c[i] + a[i, j] * b[j]; end;

end;

writeln('Произведение C=A*B'); for i := 1 to 3 do

begin

write(c[i], ' '); end;

end.

12

Контрольные вопросы

1.Что такое массив?

2.Как осуществляется описание массивов в PascalABC.NET ?

3.Какова роль оператора writeln без списка?

4.Как вывести два вектора одинакового размера в два параллельных столбца?

5.Что нужно указать в разделе описаний для разметки массива?

6.

Задачи

1.Найти сумму элементов одномерного массива F размером 4. Разделить каждый элемент исходного массива на полученное значение. Вывести на экран в виде строки.

2.Вычислить сумму и разность двух заданных одномерных массивов размером 5. Вывести значения элементов массивов и результаты вычисления в виде четырех параллельных столбцов.

3.Просуммировать элементы строк массива размером 4*3. Результат получить в одномерном массиве размером 4. Вывести его на экран.

4.Найти среднее значение элементов заданного массива размером 5. Преобразовать исходный массив, вычитая из каждого элемента среднее значение. Вывести результат на экран.

5.Вычислить сумму двух заданных массивов размером 3*3. Вывести значения элементов массивов и результаты вычисления.

6.Найти сумму всех элементов матрицы размером 4*3. Вывести значения элементов массивов и результаты вычисления.

7.Просуммировать элементы столбцов заданной матрицы размером 4*3. Результат получить в одномерном массиве размером 3.

8.Задан массив А размером 10 элементов. Сформировать два массива (В и С ) размером по 5 элементов, включая в первый элементы исходного массива с четными индексами, а во второй - с нечетными. Вывести все три массива на экран в виде строк.

9.Для заданной квадратной матрицы 6*6 сформировать одномерный массив из ее диагональных элементов.

10.Задана прямоугольная матрица. Получить транспонированную матрицу и вывести ее на экран.

11.Описать массив целого типа из 100 элементов, присвоить всем элементам случайные значения в диапазоне [-34,42]. Найти наибольший по абсолютной величине элемент.

13

Лабораторная работа №18 Использование процедур и функций пользователя. Численные методы решения уравнений (4 чаcа).

Цель работы: получение практических навыков разработки и выполнения компьютерной программы.

Предмет и содержание работы: разработка и отладка компьютерной программы для численных решений уравнений.

Технические средства и программное обеспечение: персональный компьютер с операционной системой Windows™, система PascalABC.NET

Подпрограммы

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

встроку основной программы, следующей за вызывающей.

Вязыке Паскаль для организации подпрограмм используются процедуры и функции. Процедура - независимая часть программы, предназначенная для выполнения определенных действий. Функция аналогична процедуре, но имеет отличие: она может использоваться как часть выражения. Они разделяются на встроенные (стандартные) и пользовательские (создаваемые программистом) процедуры и функции. Встроенные (стандартные) процедуры и функции являются частью языка и могут вызываться по имени без предварительного определения в разделе описаний программы. Процедуры и функции пользователя описываются самим программистом в соответствии с синтаксисом языка и их предварительное описание (перед использованием) в тексте программы обязательно.

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

14

Описание процедуры имеет вид:

procedure имя(<список формальных параметров>); раздел описаний

begin

операторы

end;

Описание функции имеет вид:

function имя(список формальных параметров): тип возвращаемого значения; раздел описаний

begin

операторы

end;

Операторы подпрограммы, окаймленные операторными скобками begin/end, называются телом этой подпрограммы.

Список формальных параметров вместе с окружающими скобками может отсутствовать. Он состоит из одной или нескольких секций, разделенных символом ";". Каждая секция состоит из списка переменных, перечисляемых через запятую, после которого следуют двоеточие и тип.

Раздел описаний процедуры или функции устроен так же, как и раздел описаний основной программы. Здесь описываются так называемые локальные переменные и константы, типы а также вложенные процедуры и функции. Все такие локальные объекты доступны лишь внутри данной подпрограммы и не видны извне.

procedure Reverse(var a: array [1..100] of integer; n: integer); var i,v: integer;

begin

for i:=1 to n div 2 do begin

v:=a[i]; a[i]:=a[n-i+1]; a[n-i+1]:=v; end;

end;

Внутри тела функции имя этой функции можно использовать как специальную переменную, которой необходимо присвоить возвращаемое значение.

15

function Add(a,b: real): real; begin

Add:=a+b;

end;

Имя функции может быть использовано с целью возврата значения только в левой части оператора присваивания. Если имя функции встречается в выражении, то это трактуется как рекурсивный вызов этой функции.

Вместо имени функции, внутри тела функции можно использовать другую специальную переменную с именем Result. В отличие от имени функции, переменную Result можно использовать и в выражениях:

function MinElement(var a: array [1..100] of real; n: integer): real; var i: integer;

begin Result:=a[1]; for i:=1 to n do

if a[i]<Result then Result:=a[i]; end;

Если внутри функции не присвоить имени функции или переменной Result некоторое значение, то функция вернет в результате своего вызова нулевое значение.

Пример 1. Программа вычисляет площадь круга по формуле S = πR2. Вычисление происходит в функции Area, которая вызывается из основной программы.

Начало

RADIUS := 6

RADIUS1 := 8

'Радиус= ', RADIUS:4:1, ' Площадь

= ', Area(RADIUS):4:2

'Радиус= ', RADIUS1:4:1, ' Площадь

= ', Area(RADIUS1):4:2

Конец

Рисунок 18.1 – Схема алгоритма вычисления площади круга

16

Area

Area := pi * SQR(b)

f Возврат

Рисунок 18.2 - Схема алгоритма функции Area

program N_18_1;

var

RADIUS, RADIUS1: real;

function Area(b: real): real;//b - переменная для радиуса в подпрограмме(формальный параметр)

begin

Area := pi * SQR(b); end;

begin

RADIUS := 6;

RADIUS1 := 8;

writeln('Радиус= ', RADIUS:4:1, ' Площадь = ', Area(RADIUS):4:2);

writeln('Радиус= ', RADIUS1:4:1, ' Площадь = ', Area(RADIUS1):4:2);

end.

Численные методы решения уравнений

Наиболее наглядно преимущества применения процедур и функций пользователя проявляются при программировании численных методов решения уравнений.

Решение конкретных задач часто сводится к нахождению корней уравнения вида f(x)=0 , где функция f(x) определена и непрерывна на некотором интервале [a,b].

17

Метод деления отрезка пополам

Пример. Методом половинного деления найти корень уравнения cos(2/x)-2*sin(1/x)+1/x=0 на отрезке [1;2] с точностью ε=10-4

Рисунок 18.2 - Метод деления отрезка пополам

Сущность метода половинного деления заключается в следующем: пусть дано уравнение f(x)=0, где функция f непрерывна на [a,b] и на концах отрезка [a,b] имеет разные знаки (т.е. f(a)*f(b)<0). Если непрерывная функция на отрезке меняет знак, то она имеет на этом отрезке по крайней мере один корень. Пусть на [a,b] есть только один корень уравнения. Найдем этот корень методом половинного деления. Для этого разделим [a,b] пополам и положим с=(a+b)/2. Если f(с)=0, то с - корень уравнения, в противном случае выбираем тот из отрезков [a,с] или [с,b] на концах которого f(x) имеет разные знаки. Полученный отрезок снова делим пополам и проводим те же рассуждения. Процесс продолжается до тех пор, пока длина вновь полученного отрезка не будет меньше

некоторого заданного числа ε. Тогда любую точку этого отрезка с погрешностью ε можно принять за корень уравнения f(x)=0.

18

19

Начало

 

'Задайте интервал:'

 

a, b

 

func_x(a) * func_x(B) <

Y

0

 

'Интервал задан неверно!

'дoпустимая погрешность='

На данном интервале нет

EPS

корней'

 

ABS(A - B) > EPS

Y

 

 

'A=', A:12:8, ' B=', B:12:8

 

 

 

 

 

 

 

 

 

 

C := (A + B) / 2

 

 

 

 

 

 

 

Y

 

 

 

 

 

 

 

 

func_x(C) <> 0

 

 

 

 

a := c

 

 

 

 

 

 

 

 

 

 

 

func_x(C) * func_x(B) <

Y

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

B := C

A := C

 

 

 

 

 

 

 

'Корень=', A:12:8

Конец

func_x

func_x := cos(2 / x) - 2 * sin(1 / x) + 1 / x

Конец

Рисунок 18.3 Схема алгоритма метода половинного деления

20