Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет по срсп.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
180.74 Кб
Скачать

Функции в языке Си

Овладение навыками алгоритмизации и программирования задач с использованием подпрограмм пользователя различных видов.

Краткие теоретические сведения

Подпрограммы в языке Си организуются в виде функций. Функции состоят из тела и заголовка. Общее описание заголовка: тип функции:

имя функции (список аргументов)

Тип_функции - это тип возвращаемого функцией значения. По умолчанию типом функции считается int.

Имя_функции составляется по правилам, установленным для идентификаторов.

Список_аргументов - либо пустой список, либо множество пар "тип_аргумента имя_аргумента", отделенных друг от друга запятыми.

Тело функции - это множество операторов, реализующих функцию и заключенных в операторные скобки .

Пример:

#include <stdio.h> int func (int a, int b)

{

printf ("%d+%d=%d", a,b,(a+b)); return (a+b);

}

void main ()

{

int x=5,y=7,z;

z=func (x,y);

printf("Вот результат работы функции func: %d",z);

}

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

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

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

int func (int, int);

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

Способы передачи параметров в функции

В языке Си имеется два способа передачи параметров:

- по значению;

- по указателю, или по адресу.

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

Особенности передачи и обработки массивов и строк

Массивы и строки передаются в функции по указателю. Это может быть сделано явным образом:

int MatrixSum (int *Array, int rows, int cols)

{

int Sum=0;

for (int i=0 ;i<rows; i++) for (int j=0 ;j<cols; j++)

Sum+= *(Array+i*cols+j); // Доступ к Array[i][j]

return Sum;

},

либо неявно:

int MatrixSum (int Array [][10], int rows)

{

int Sum=0;

for (int i=0 ;i<rows; i++) for (int j=0 ;j<10; j++)

Sum+= Array[i][j]; // Доступ к Array[i][j]

return Sum;

}.

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

Функция main также может возвращать DOS целочисленные значения. Пример программы:

#include <stdio.h>

int main (int argc, char *argv[])

{

printf ("В массиве argv имеется %d элементов!")

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

printf ("\n %d - %s",i,argv[i]);

return 0; //Успешное завершение программы

}

Классы памяти. Область видимости переменных

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

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

Переменные классов памяти auto, register, static описываются внутри функции, а все прочие - вне какой-либо функции (табл. 3).

Таблица 3 - Переменные классов памяти

Класс памяти

Ключевое слово

Продолжительность существования

Область действия

Автоматический

Auto

Временно

Локальная

Регистровый

Register

Временно

Локальная

Статический

Static

Постоянно

Локальная

Внешний

Extern

Постоянно

Глобальная (все файлы проекта)

Внешний

extern static

Постоянно

Глобальная статический (один файл)