По теме лабораторной работы

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

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

Тип Имя_функции (список формальных параметров)

{

Тело функции

}

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

В списке формальных параметров для каждого параметра должен быть указан тип.

Пример заголовка функции.

float f (float x, int y, int z)

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

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

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

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

Прототип функции задается следующим образом:

Тип Имя_функции (список формальных параметров)

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

float f (float x, int y, int z)

или так:

float f (float, int, int)

Два этих описания абсолютно равносильны.

Перепишем рассмотренную выше программу с использованием прототипа функции. Параллельно введем в программу некоторые усовершенствования.

#include <iostream.h>

#include <conio.h>

float min(float x, float y)

void main()

{

float a ,b ,c, d, m;

cin>>a>>b>>c>>d;

m=min(min(a, b), min(c, d));

cout<<"min="<<m;

getch();}

float min(float x, float y)

{

if (x<y) return x; else return y;}

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

void gorizontal_line(char ch)

{

for (int i=0; i<80; i++)

cout<<ch;}

Если функция не имеет аргументов, то при описании прототипа такой функции следует вместо аргументов писать ключевое слово void. Это касается и функции main. Заголовок ее определения может иметь вид:

void main(void), void main(), main(void)

В языке Си есть особенность, связанная с тем, что все аргументы передаются по значению. При вызове функции в стеке выделяется место для формальных параметров функции, и в это выделенное место заносится значение фактического параметра, т.е. значение параметра при вызове функции. Далее функции использует и меняет значения в стеке. При выходе из функции измененные значения параметров теряются.

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

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

void swap (int x, int y)

{int t;

t=x;

x=y;

y=t;}

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

Функция swap будет выглядеть тогда так.

void swap (int *px, int *py)

{int t;

t=*px;

*px=*py;

*py=t;}

Примеры:

1. Для заданных значений a, b, c, d найти минимальное значение, т.е. m=min{a, b, c, d}.

Для решения этой задачи воспользуемся функцией, которая будет находить минимум из двух значений x и y, т.е. z=min{x, y}.

Тогда решение основной задачи будет выглядеть, например, так: m1=min{a, b}, m2=min{c, d}, m=min{m1, m2}. Т.е. три раза используя функцию, получаем решение исходной задачи.

 

Листинг программы.

#include <iostream.h>

#include <conio.h>

float min(float x, float y)

{float z;

if (x<y) z=x; else z=y;

return z;}

void main()

{float a, b, c, d, m1, m2, m;

cin>>a>>b>>c>>d;

m1=min(a, b);

m2=min(c, d);

m=min(m1, m2);

cout<<"min="<<m;

getch();}

 

2. Заданы значения a, b, c. Требуется упорядочить их в порядке возрастания, т.е. переприсвоить так, чтобы выполнялись неравенства .

 

#include <iostream.h>

#include <conio.h>

void swap (int *px, int *py)

{int t;

t=*px;

*px=*py;

*py=t;}

void main()

{int a, b, c;

cin>>a>>b>>c;

if (a>b) swap(&a, &b);

if (a>c) swap(&a, &c);

if (b>c) swap(&b, &c);

cout<<a<<" "<<b<<" "<<c;

getch();}

Задания для лабораторной работы:

1. Заданы квадратные матрицы A, B, C и векторы X, Y, Z. Вычислить вектор P=AX+BY+CZ.
Функции:
1) вычисление произведения матрицы на вектор.
2) вычисление суммы двух векторов.

2. Заданы две квадратные матрицы A и B. Проверить, являются ли они перестановочными, т.е. выполнено ли равенство AB=BA.
Функция:
вычисление произведения двух матриц.

3. Заданы три квадратные матрицы A, B, С. Вычислить матрицу D=(A+B)k+(B+C)k+(C+A)k.
Функции:
1) вычисление суммы двух матриц.
2) вычисление произведения матрицы на вектор.

4. Заданы k квадратных матриц A1, A2,…, Ak. Вычислить для каждой матрицы .

Функции:
1) вычисление транспонированной матрицы.
2) вычисление произведения двух матриц.

5. Заданы квадратная матрица A и вектор X. Вычислить вектор Z=AnX.
Функции:
1) вычисление произведения двух матриц.
2) вычисление произведения матрицы на вектор.

6. Заданы квадратные матрицы A и B. Вычислить матрицу .
Функции:
1) вычисление k-ой степени матрицы.
2) вычисление произведения двух матриц.
3) вычисление суммы двух матриц.

7. Заданы три квадратные матрицы A, B, С. Найти (A+B+С)k.
Функции:
1) вычисление суммы двух матриц.
2) вычисление произведения матрицы на вектор.

8. Найти произведение k квадратных матриц A1, A2,…, Ak.
Функция:
вычисление произведения двух матриц.

9. Заданы k квадратных матриц A1, A2,…, Ak. Определить количество совпадающих матриц.
Функции:
определение равенства двух матриц.

10. Задана квадратная матрица A. Вычислить An.
Функции:
1) вычисление произведения двух матриц.
2) вычисление суммы двух матриц

11. Заданы квадратные матрицы A и B. Найти (AB)k.
Функция:
вычисление произведения двух матриц.

12. Заданы k квадратных матриц A1, A2,…, Ak. Найти сумму .
Функции:
1) вычисление транспонированной матрицы.
2) вычисление произведения двух матриц.
3) вычисление суммы двух матриц.

13. Заданы квадратные матрицы A и B. Проверить, можно ли получить одну матрицу из другой путем транспонирования один или несколько раз.
Функции:
1) транспонирование относительно главной диагонали.
2) транспонирование относительно побочной диагонали.

14. Найти сумму k квадратных матриц A1+A2+…+Ak.
Функция:
вычисление суммы двух матриц.

15. Заданы три квадратные матрицы A, B, С. Вычислить матрицу D=Ak+Bk+Ck.
Функции:
1) вычисление суммы двух матриц.
2) вычисление произведения матрицы на вектор.

16. Задана квадратная матрица A. Вычислить An.
Функция:
вычисление произведения двух матриц.

17. Заданы k векторов X1, X2,…, Xk. Найти их сумму X1+ X2+… + Xk.
Функция:
вычисление суммы двух векторов.

18. Заданы k квадратных матриц A1, A2,…, Ak и векторы X1, X2,…, Xk. Вычислить вектор Z=A1X1+A2X2+…+AkXk.
Функции:
1) вычисление произведения матрицы на вектор.
2) вычисление суммы двух векторов.

19. Заданы квадратные матрицы A, B, C и векторы X, Y, Z. Вычислить вектор P=AkX+BkY+CkZ.
Функции:
1) вычисление произведения матрицы на вектор.
2) вычисление суммы двух векторов.

 

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

1. Всегда ли вызов функции осуществляется из функции main()?

2. Как передать значение функции?

3. Как получить значение от функции?

4. Для чего в языке Си++ используют указатели?

5. Каким образом указатели передаются функции?