Общие сведения о функциях языка С
Практическая часть
Пример 1. Напишите программу сортировки по возрастанию заданного массива случайных чисел, равномерно распределенных в интервале [–6;6], с помощью вспомогательной функции.
Программный код решения примера:
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> #define MAX 10 // Прототип функции с формальными параметрами void sort(double arr[], int n); int main (void) { double M[MAX]; int i, size = MAX; long int L; unsigned int some; L = (long) time(NULL); srand((unsigned)L); for (i = 0; i < MAX; ++i) M[i] = 12.0*rand()/RAND_MAX - 6.0; printf("\n\t The original array:\n"); for (i = 0; i < MAX; ++i) printf("\t%8.4f\n", M[i]); // Обращение к функции с фактическими параметрами sort(M, size); // Распечатка отсортированного массива printf("\n\t After sorting: \n"); for (i = 0; i < MAX; ++i) printf("\t%8.4f\n", M[i]); printf("\n Press any key: "); _getch(); return 0; } // Вспомогательная функция сортировки void sort(double Array[], int m) { int i, j; double tmp; for (i = 0; i < m-1; ++i) for (j = 0; j < m-i-1; ++j) if (Array[j+1] < Array[j]) { tmp = Array[j]; Array[j] = Array[j+1]; Array[j+1] = tmp; } }
Следует обратить внимание на имена формальных параметров в самой функции sort() и в ее прототипе: они имеют разные имена, но одинаковые типы. Фактические параметры или аргументы функции sort() в вызывающей программе (в теле функции main() ) имеют свои имена, не связанные с именами формальных параметров.
Заполнение массива случайными числами производится с помощью библиотечной функции rand() и макроопределения RAND_MAX. Для рандомизации массива случайных чисел при каждом новом запуске программы используется библиотечная функция srand(), аргументом которой является системное время, формируемое библиотечной функцией time().
Возможный результат выполнения программы показан на рис. 10.2.
Задание 1
- Используйте программу без прототипа функции sort().
- С помощью вспомогательной функции произведите сортировку массива по убыванию.
- С помощью вспомогательной функции произведите сортировку целых чисел из заданного интервала [X; 10*X], где Х – номер компьютера, за которым выполняется лабораторная работа.
- Выполните операцию умножения исходного массива как матрицы-столбца на отсортированный массив как матрицы-строки. Выведите на консоль результат перемножения. Для операции перемножения создайте специальную функцию.
- Выполните операцию умножения исходного массива как матрицы-строки на отсортированный массив как матрицы-столбца. Выведите на консоль результат перемножения. Для операции перемножения создайте специальную функцию.
Пример 2. Напишите программу вычисления квадратного корня числа по методу Ньютона–Рафсона с использованием функции расчета квадратного корня числа и функции расчета абсолютного значения числа.
При вычислении квадратного корня из числа следует помнить, что подкоренное выражение не должно быть отрицательным.
Алгоритм метода Ньютона–Рафсона для вычисления квадратного корня числа:
Шаг 1. Выбрать приблизительное значение 1.
Шаг 2. Если |guess^2 – x| < e, перейти к шагу 4.
Шаг 3. Установить приблизительное значение, равное (x/guess + guess)/2, и перейти к шагу 2.
Шаг 4. Считать приблизительное значение квадратным корнем числа [7].
Программный код решения примера:
#include <stdio.h> #include <conio.h> // Функция абсолютного значения числа double absValue(double x) { if (x < 0) x = -x; return (x); } // Функция расчета квадратного корня из числа double squareRoot (double x) { const double epsilon = 0.000001; double guess = 1.0; //Начальное приближение while (absValue(guess*guess - x) >= epsilon) guess = (x/guess + guess)/2.0; return (guess); } int main (void) { double result, X; printf("\n\t Enter a number: "); scanf_s("%lf", &X); // Обращение к функции с фактическим параметром result = squareRoot(X); printf("\n\t Square root of \"%1.4f\" is: %1.8f\n", X, result); printf("\n Press any key: "); _getch(); return 0; }
В программе используются три функции: main(), absValue(), squareRoot().
Вспомогательные функции расположены в определенном порядке: сначала функция absValue(), а потом функция squareRoot(). В функцию absValue() передается значение guess, которое вычисляется в функции squareRoot(), находящейся в условии оператора цикла while. Когда условие для оператора цикла будет ложным, т.е. когда значение корня будет меньше заданного числа epsilon, то полученное значение возвращается в вызывающую функцию main().
В программе использована переменная epsilon, определенная с помощью спецификатора const, что делает переменную неизменной. При таком объявлении компилятор определяет ее как константное значение. Таким переменным нельзя присваивать значения в программе, нельзя их инкрементировать или декрементировать [10.2].
Возможный результат выполнения программы показан на рис. 10.3.
Задание 2
- В качестве формальных параметров функций возьмите начальные буквы своей фамилии, имени из двух букв. В качестве возвращаемого значения из функции squareRoot() – месяц своего рождения.
- В функции absValue() примените оператор условия ? вместо оператора if без определения дополнительной переменной.
- В главной функции main() введите проверку ввода неотрицательного числа.
- В программу введите прототипы функций.
- Зафиксируйте результат вычисления квадратного корня от числа Х, где Х – номер компьютера, за которым выполняется лабораторная работа.
- В качестве начального приближения возьмите 1.5*Х, где Х – номер компьютера, за которым выполняется лабораторная работа.
- В программе примените тип float вместо типа double.