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

Программирование на языке Си. Практикум

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
893 Кб
Скачать

2. Сложение (вычитание) возможно только для матриц одинакового размера. Результатом сложения двух матриц An x m и Bn x m является матрица С таких же размеров, каждый элемент которой равен сумме (разности) соответствующих элементов матриц А и В:

cij aij

bij

 

cij aij

bij .

 

 

 

 

 

 

 

3. Умножение матрицы на число - все элементы матрицы

 

умножаются на это число: Сn x m

An x m k,

 

cij aij

k

 

 

4. Транспонирование. Матрица Вm x n называется

 

транспонированной к матрице Аn x m и обозначается B = АT, если

 

строки матрицы В совпадают со столбцами матрицы А, т.е. это

 

поворот - строки становятся столбцами, а столбцы – строками.

 

 

 

 

 

1

2

7

 

 

 

1

9

5

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A

 

9

4 3 ,

B

 

AT 2 4 6

8 ,

т.е . b a

 

4 x 3

 

5

6

7

3 x 4

 

 

 

 

 

 

ji

ij

 

 

 

 

 

 

 

 

 

 

 

 

 

7

3

7

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

4

1

 

 

 

 

 

 

 

 

 

 

5. Перемножение двух матриц. Произведением матрицы An x k на

 

матрицу Вk x m называют матрицу С, размером n x m. Выполнить

 

умножение можно только тогда, когда длина строки первого

 

сомножителя равна длине столбца второго. Результат должен

 

иметь число строк, как у первого сомножителя, а число столбцов

 

как у второго. Формулу для вычисления каждого элемента

 

выведем последовательно:

 

 

 

 

 

 

 

 

 

 

k

 

 

 

 

k

 

 

 

 

k

 

 

с11 a1h bh1 ,

с12 a1h bh2 , т.е.

с1 j a1h bhj

 

 

 

h 1

 

 

 

h 1

 

 

 

h 1

 

 

 

 

k

 

 

 

 

 

k

 

 

 

 

k

 

 

с21 a2 h bh2 ,

с22 a2 h bh2 , т.е .

с2 j a2 h bhj

 

 

 

h 1

 

 

 

h 1

 

 

 

h 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

 

 

 

сij

ai 1 b1 j

ai 2 b2 j ai 3 b3 j

..... aik

bkj aih bhj

 

 

h 1

21

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

int a[n][k], b[k][m], c[n][m]; int i, j, h;

for (i=0; i<n; i++) // перебор всех элементов матрицы С for (j=0; j<m; j++)

{

c[i][j]=0;

for (h=0; h<k; h++) // вычисление одного элемента м-цы С c[i][j]+=a[i][h]*b[h][j];

}

Лабораторная работа №4 Вычисление матричных выражений

Задание:

1.Выполнить расчет матричного выражения в Exсel.

2.Написать программу вычисления матричного выражения, используя циклы и индексированные переменные.

3.Сравнить результаты работы программы и расчета в Excel.

 

Вариант задания

 

Вариант задания

 

1

C 0,8AT (A E), где

 

2

L 2(N 4D) A, г де

 

 

 

0,3

4

0

0

 

D AT ,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A

0,8

5

0

0

 

2

1

4

2

3

 

 

 

0

0

0,3

4

 

 

 

 

 

 

0

0

0,8

 

 

A

2

, N 9

8

 

 

 

5

 

5

1

0

0,5

 

 

 

 

 

 

 

 

 

 

 

 

 

22

3

F 0,5RT T A, г де

 

 

4

K LT T 3B, г де

 

 

 

 

 

8

 

6 12

3

1 1

 

0

 

6 1

 

 

1 1

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

R 1

 

2 3

, A 1

2 1 ,

 

L 1

 

12 3 , B

3 2

1 ,

 

 

0

 

7

5

 

1

1

1

 

0

 

5 7

 

 

1 1

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

3

2

 

 

 

 

 

3

 

3

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T 1

 

5 2

 

 

 

 

 

T 2

 

1 2

 

 

 

 

 

 

 

 

 

 

 

 

3

 

2

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

2

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

L 0,5( A 4D)N , г де

 

 

6

C 3M T P N , г де

 

 

D AT ,

 

 

 

 

 

 

 

1

2

3

9

 

 

 

1

 

 

3

 

2

 

 

 

 

 

 

 

 

8

 

3

 

 

N

 

 

 

 

,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

6 0 1

 

 

A 4

 

5 6 , N

9

8

 

 

 

 

 

 

2

 

1

3

 

0

0,5

 

P N

T

, mij i j 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

C 0,33E DK, где

 

 

8

C 3LK E, где

 

 

 

 

 

 

1

 

 

 

 

 

 

2

 

1

2

 

 

 

 

 

D

2 2 1

2 ,

 

 

 

K 4

 

3 4 ,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

2

 

5

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

K D DT

 

 

 

 

 

 

L K K T

 

 

 

 

 

9

F 5(K M) 0,4L, где

 

 

10

F 5(H B)L, г де

 

 

 

 

 

1

 

2 3 0

 

 

 

1

2 3 0

 

 

 

 

4

 

3

0

 

5

 

 

 

 

4

3

0

 

5

 

 

 

K

 

 

 

 

 

 

,

 

 

 

H

 

,

 

 

 

 

0

 

2 5

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

1

 

 

 

 

 

 

0

2

5

4

 

 

 

7,5

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

M K

T

,

 

 

 

 

 

 

7,5

2

1

 

4

 

 

 

 

 

 

 

 

 

1

 

2

0

1

 

 

 

1

 

2

0

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0,5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

1

2

 

 

L

 

3

 

1

2

0,5

 

 

 

B

 

 

 

 

 

, L H T

 

 

 

4

 

2 1 3

 

 

 

 

 

4

 

2 1 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0,5

 

1

2

1

 

 

 

 

0,5

1

2

1

 

 

23

11

Q KLT

4D, г де

 

 

 

12

C 3,5NB PT , г де

 

 

 

 

1

8

2

 

1

2

 

 

1

8

 

2

1,5

2

 

K 4

0 3 , D 5

4 ,

 

N 4

0 3 , B

5

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

21

6

7

 

6

7

 

 

2

6

0,7

 

6

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

4 1

 

 

 

 

 

8

4 1

 

 

 

 

L

 

 

 

 

 

 

 

 

P

 

 

3

2

 

 

 

 

 

3,5 3

2

 

 

 

 

 

5

 

 

 

 

13

C 3KT M N, где

 

 

14

B 0,8E(A AT ), где

 

 

 

 

1

2

3

9

 

 

 

 

 

0,3

4

 

0

0

 

 

 

N

 

 

 

,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

6

0

1

 

 

 

 

A

 

0,8

5

 

0

0

 

 

 

M NT ,

 

 

 

 

 

 

 

 

 

 

0

 

0

0,3

4

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

0

 

0,8

 

 

 

 

1

2

3

 

4

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

 

1

 

0

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

K 2

3 4 5

 

 

 

 

 

0

 

1 0 0

 

 

 

 

3

4

5

 

6

 

 

 

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

0

1

0

 

 

 

 

4

5

6

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

0

0

1

 

 

 

15

A (D 3C)F T , г де

 

 

 

16

D (0,5K A)QT , где

 

 

 

8

6

 

 

1

2

 

 

 

8

6

 

 

4

 

2

 

 

 

 

 

 

 

 

A 3

2 , K 12

 

6 ,

 

 

D 3

2 , F

 

,

 

 

 

 

 

4

5

 

 

8

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

5

 

 

24

18

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

1

2

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

Q

 

 

 

 

 

 

 

C 3 4

 

 

 

 

 

 

 

8

3

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

17

L 5,2(D 4A)N, где

 

18

C (2A BT )A, где

 

 

 

 

1

8

3

 

 

 

 

 

 

 

3

4

 

1

 

 

 

 

 

 

 

 

 

 

T

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A 4

5 6 , D A ,

 

 

A

 

 

 

 

 

 

 

 

 

 

2

5

 

3

,

 

 

 

 

2

1

3

 

 

 

 

 

 

 

 

 

0,6

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

2

3

 

 

 

 

 

 

 

 

2

1

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N 9

8

 

 

 

 

 

 

 

B

3

7 1

 

 

 

 

0

0,5

 

 

 

 

 

 

 

7

4,5

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

24

19

S 0,1( A KM ), г де

 

 

20

F PT 3A, г де

 

 

 

3

 

2

1

 

 

 

 

 

2

3

1

 

 

 

 

 

 

 

 

 

 

T

 

 

 

 

 

 

 

 

 

 

A 2

 

4 2 , M K

 

,

 

P 5

2 8 ,

 

 

 

 

1

 

2

3

 

 

 

 

 

7

0

9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

3,5

8

11

 

 

 

 

 

1

2 1

 

 

 

 

A

 

 

 

, T P T

 

 

K 4

 

 

 

 

3

1 1

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

1

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

21

F 0,5RT A, г де

 

 

 

22

S A 2,5KN , г де

 

 

8

 

6

12

 

 

 

 

8

10

11

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

R 1

 

2

3

,

 

 

 

 

A

2

14

0,2 ,

 

 

0

 

7

2

 

 

 

 

 

15

2,5 30

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

3 1

 

 

 

 

 

4

6 8

 

 

 

 

 

 

 

 

T

 

 

 

 

 

 

 

 

 

T

 

A 3

 

1 1 , T R

 

 

 

 

K

9

3

11 , N K

 

 

 

 

1

 

 

 

 

 

 

7

2

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

1

 

 

 

 

 

 

 

 

 

 

23

L ( AB 0,25B)C, г де

24

M PT (N 3E), где

 

 

1

 

2

3

 

 

 

 

1

5

2

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A 2

 

4

2 ,

 

 

 

 

0

2

 

3

 

 

 

 

 

 

 

P

0,6 ,

 

 

3

 

2

1

 

 

 

 

 

 

4

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5,2

1

 

 

10

 

 

 

 

 

 

2

3

4

 

 

 

 

B 11 4

6 , C BT

 

N 1

2 5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

2

8

 

 

 

 

12

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

25

25

C AT (2B E), где

 

 

26

S ( AB 5B)K , г де

 

 

 

1

5 2

3

 

 

1

2 3

 

40

60

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A 0

2

3 0,6 ,

 

 

A 2

4

2 ,

B

45

75 ,

 

5,2

4

1

1

 

 

 

3

2

1

 

56

99

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

3

4

 

 

 

 

K BT

 

 

 

 

 

 

 

B 1

2

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

2

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

27

P FH 4DT , г де

 

 

28

D BF 0,2 AT , г де

 

 

 

1

 

8 2

 

1

2

 

 

8

4 1

 

 

 

 

F 4

 

0 3 , H

5

4 ,

 

A

3,5

3

,

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

21

6

7

 

6

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

2

1

8

2

 

 

8

 

4

1

 

 

 

 

 

 

 

 

F 5

4 , B

4

0 3

 

D

 

 

3

 

 

 

 

 

3,5

2

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

6

7

21

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

29

P FH 4DT , где

 

 

30

D BF 0,2AT , где

 

 

 

1

8

2

 

 

 

8

4

1

 

 

 

 

F 4

0

3 ,

 

 

 

A

3,5

3

,

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

21

6

7

 

 

 

1

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

 

4 1

 

 

 

F 5

4 ,

 

 

 

 

 

D

 

 

 

,

 

 

 

6

7

 

 

 

 

 

 

3,5

3

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

2

 

 

 

 

 

1

8

2

 

 

 

 

 

 

 

 

 

 

B 4

0

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

H 5 4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

21 6

7

 

 

 

 

 

6

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

26

1.4. Указатели

Указатель – это переменная, предназначенная для хранения адреса объекта некоторого типа в памяти ЭВМ. В качестве объекта может быть переменная, массив, функция, структура и т.д. Указатель, как любой объект, должен быть объявлен:

тип_указываемых_данных *идентификатор;

Над указателями можно производить следующие операции:

1.Получение значения по адресу – унарная операция *, называется косвенной адресацией. Результат – значение того типа, на который указывал указатель.

int a, y, *px; // 2 переменные целого типа и указатель

a=6;

px=&a; // px получает значение адреса переменной a y=*px; // у присвоено значение, взятое по адресу px Два последних оператора эквивалентны y=a;

Операция косвенной адресации может быть использована и

влевой части оператора присваивания

int a, *pa;

….

a=6;

pa=&a;

*pa=10; // значение а после данного оператора равно 10

2.Получение адреса переменной – операция &, возвращает адрес переменной в памяти

3.Операции сравнения

-равно = =, не равно !=

-меньше <, меньше или равно < =,

-больше >, больше или равно >= 4. Вычитание

int *pa, *px, n;

….n=px-pa; // n число элементов между двумя указателями

5.Увеличение на 1 (px++ переход к следующему элементу) или уменьшение на 1 (pa- - переход к предыдущему элементу)

6.Увеличение px + i (перемещение вперёд к элементу, отстающему от указанного на i элементов)

27

7. Уменьшение pa - i (перемещение к элементу, отстающему от указанного на i элементов в обратную сторону)

Операциями 4-7 необходимо пользоваться аккуратно, работают только при определенных условиях.

1.5. Связь понятия массива с понятием указателя

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

float mas[30]; float *pm= mas;

Таким образом, если mаs - имя массива, то &mas[0] - адрес первого элемента массива, и mas без указания индексов тоже адрес первого элемента массива.

Начальный адрес массива определяется компилятором в момент объявления массива и изменен быть не может.

Память под массив выделяется в момент объявления и остается закрепленной за ним до окончания работы программы.

Пусть задано: int m[4];

int *pm=m;

Предположим, что первый байт массива m расположен в памяти с адресом 10000.

Адреса

10000

10001

10002

10003

10004

10005

10006

10007

Индекс

 

0

 

1

 

2

 

3

Память

 

 

 

 

 

 

 

 

Обращение

m[0]

m[1]

m[2]

m[3]

к элементу

*(pm+0)

*(pm+1)

*(pm+2)

*(pm+3)

массива

pm[0]

pm[1]

pm[2]

pm[3]

 

 

 

 

 

Получение

&m[0]

&m[1]

&m[2]

&m[3]

адреса

&pm[0]

&pm[1]

&pm[2]

&pm[3]

элемента

pm

pm+1

pm+2

pm+3

28

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

Арифметические действия над указателями обеспечивают удобный способ работы с массивами.

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

int a[10]; // выделяется автоматическая память для хранения 10 // элементов массива целого типа

static float b[3]; // выделяется статическая память для хранения

3 // элементов массива вещественного типа

Память под динамические массивы выделяется и освобождается по мере необходимости во время работы программы с использованием специальных функций malloc() и calloc().

Например:

1. Определить динамический массив из n элементов вещественного типа с помощью функции malloc()

double *d;

d = (double *)malloc(n*sizeof(double));

или

double *d = (double *)malloc(n*sizeof(double)); /* Здесь выделяется память из n x 8 байт и указателю d присваивается адрес первого байта из выделенного участка */

29

2. Определить динамический массив из n элементов вещественного типа с помощью функции calloc()

double *ab;

 

ab =(double *)calloc(n,sizeof(double ));

 

или

 

double *ab = (double *)calloc(n, sizeof(double ));

/* Здесь

выделяется память из n элементов, каждый из которых занимает 8 байт, и указателю ab присваивается адрес расположения в памяти первого элемента, выделенная память обнуляется */

Если описываем два массива:

int *a = (int*)calloc(10, sizeof(int)); static int b[10];

то доступ к их элементам осуществляется одинаково:

а[4] и b[4] доступ к 5 элементу соответствующего массива. После того, как выделенная память больше не требуется, ее

можно освободить с использованием функции free: free(а);

Рассмотрим, как получить значение любого элемента двумерного массива, имея адрес его начала. Пусть есть массив an

x m.

int *a, n, m;

a = (int*)calloc(n*m,sizeof(int));

0 1 2 3 … j … m-1

0

1

2

i

n-1

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]