Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
01.11.2025
Размер:
2.68 Mб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего образования

«Поволжский государственный университет телекоммуникаций и информатики»

Факультет

Факультет № 1.

Направление подготовки / специальность

09.03.01 Информатика и вычислительная техника

Кафедра информатики и вычислительной техники

ФИО студента

Группа студента

,Лабораторная работа № 5

по программированию С

Тема: функции

Цель работы: научиться использовать функции для выполнения однотипных действий над различными данными, правильно задавать параметры функций, передавать указатели на функции в качестве параметров

Вариант 4

1. В матрицах А(1015) и В(1510) заменить все совершенные числа нулями. Совершенным называется натуральное число N, равное сумме всех своих делителей, меньших самого N.

2. Допустимым преобразованием матрицы назовём перестановку двух соседних строк или двух соседних столбцов. Дана вещественная квадратная матрица порядка n n  12. С помощью допустимых преобразований получить матрицу, в которой максимальный элемент располагается в левом верхнем углу. Использовать функции для выполнения допустимых преобразований и для нахождения индексов максимального элемента.

3.

Ход работы:

1.

2.

3.

Ответы на контрольные вопросы

  1. Что такое функция?

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

  1. Что такое прототип функции?

Прототип функции – это объявление функции, которое сообщает компилятору о ее имени, типе возвращаемого значения и типах формальных параметров.

  1. Чем отличается прототип функции от вызова функции?

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

Вызов функции запускает выполнение кода функции с указанными фактическими параметрами.

  1. Чем отличается описание функции от определения функции?

• Описание функции (прототип) – это объявление функции, которое сообщает компилятору о ее существовании.

• Определение функции – это реализация функции, которая содержит код, выполняющий задачу.

  1. Критерии соответствия формальных и фактических параметров.

Количество: должно быть одинаковое количество формальных и фактических параметров.

Тип: тип каждого формального параметра должен соответствовать типу фактического параметра (с учетом преобразований).

Порядок: параметры должны соответствовать по порядку.

6. Соответствие типов формальных и фактических параметров.

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

7. Когда при объявлении функции используется слово void?

Слово void используется:

• В качестве типа возвращаемого значения: когда функция не возвращает никакого значения.

• В списке параметров: когда функция не принимает никаких параметров.

8. Зачем нужен оператор return?

Оператор return используется для:

• Возврата значения из функции.

• Преждевременного выхода из функции.

9. Может ли в функции быть несколько операторов return?

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

10. Когда необходимо писать оператор return в функции, не возвращающей значения?

• Преждевременного выхода из функции.

• Улучшения читаемости кода.

11. Что такое побочный эффект функции?

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

Например:

• Изменение глобальной переменной.

• Вывод данных на экран.

• Запись в файл.

12. Когда используются формальные параметры-указатели? Какими в этом случае должны быть фактические параметры?

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

13. Как передать массив в функцию одномерный массив?

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

void printArray(int arr[], int size) {

for (int i = 0; i < size; i++) {

printf("%d ", arr[i]);

}

printf("\n");

}

14. Как передать в функцию двумерный массив?

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

void printMatrix(int matrix[][4], int rows, int cols) {

for (int i = 0; i < rows; i++) {

for (int j = 0; j < cols; j++) {

printf("%d ", matrix[i][j]);

}

printf("\n");

}

}

15. Как описать функцию, позволяющую работать и с одномерными, и с многомерными массивами?

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

void printArray(void *arr, int size, int dimensions, int *sizes) {

// Логика для обработки массива

}

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

16. Что такое параметр-константа? Когда используются такие параметры?

Параметр-константа - это формальный параметр функции, который объявлен с помощью ключевого слова const. Это означает, что функция не может изменять значение параметра.

Параметры-константы используются для:

• Защиты данных: они гарантируют, что функция не изменит исходные данные.

• Повышения читаемости: они указывают на то, что функция не изменяет значения параметра.

17. От чего зависит тип функции? Какие функции считаются однотипными?

Тип функции зависит от:

• Типа возвращаемого значения: например, int, float, void.

• Типов формальных параметров: например, int, float, char.

• Порядка формальных параметров: * int func(float, int) отличается от int func(int, float)

• Числа формальных параметров: * int func(int) отличается от int func(int, int) Функции считаются однотипными, если они имеют:

• Одинаковый тип возвращаемого значения. • Одинаковый тип и порядок формальных параметров.

18. Что такое указатель на функцию? Как его описать?

Указатель на функцию - это переменная, которая хранит адрес функции. Описание:

int (*funcPtr)(int, float); // Указатель на функцию, которая принимает int и float и возвращает int

19. Как передать функцию в функцию? Что будет являться формальным параметром, что фактическим?

Функция передается в другую функцию через указатель на функцию.

• Формальным параметром будет указатель на функцию.

• Фактическим параметром будет имя функции. Пример:

int sum(int a, int b) {

return a + b;

}

void processFunction(int (*funcPtr)(int, int), int a, int b) {

int result = funcPtr(a, b);

printf("Результат: %d\n", result);

}

int main() {

processFunction(sum, 5, 3);

return 0;

}

20. Как обратиться к функции, переданной через параметры?

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

Пример:

int result = funcPtr(a, b);

21. Что такое рекурсия? Когда она применяется? Что такое глубина рекурсии?

Рекурсия - это техника, при которой функция вызывает себя саму. Рекурсия применяется для решения задач, которые могут быть разбиты на подзадачи того же типа, например:

• Вычисление факториала.

• Обход дерева.

• Быстрая сортировка.

Глубина рекурсии - это количество рекурсивных вызовов, которые выполняются до достижения базового случая.

22. Что такое рекурсивный спуск и рекурсивный возврат?

• Рекурсивный спуск – это процесс, когда функция вызывает себя саму для решения подзадач.

• Рекурсивный возврат – это процесс, когда функция возвращает значения, полученные из рекурсивных вызовов.

23. Как описать функцию с переменным числом параметров? Как использовать такую функцию?

Функция с переменным числом параметров объявляется с помощью ... после последнего параметра. Для работы с этими параметрами используется макрос va_arg. Пример:

int sum(int n, ...) {

va_list ap;

int sum = 0;

va_start(ap, n);

for (int i = 0; i < n; i++) {

sum += va_arg(ap, int);

}

va_end(ap);

return sum;

}

24. Какие параметры могут быть у функции main()? Как отлаживать и тестировать программу, содержащую функцию main() с параметрами?

Функция main() может принимать два параметра:

• argc (количество аргументов командной строки).

• argv (массив указателей на строки, представляющие аргументы командной строки). Отладка и тестирование:

• Отладка: Используйте отладчик, чтобы шаг за шагом выполнять код и просматривать значения переменных.

• Тестирование: Создайте набор тестовых случаев, которые проверяют различные варианты входных данных и ожидаемых результатов.

• Анализ покрытия кода: Используйте инструменты покрытия кода, чтобы убедиться, что все части функции main() протестированы.

Важно:

• Обратите внимание, что main() может иметь разные типы возвращаемого значения (int, void) в зависимости от компилятора.

• Для правильной работы программы, содержащей функцию main() с параметрами, нужно передавать ей аргументы при запуске программы.

Соседние файлы в папке Лаба5