ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Написать программу с функцией пузырьковой сортировки, использующей вызов по ссылке.
Пример 1. Написать программу с функцией пузырьковой сортировки, использующей вызов по ссылке. Вызов по ссылке означает, что в качестве фактических параметров функций будут использоваться адреса переменных, и в этом случае прототип таких функций будет содержать указатели на соответствующие типы. Программный код решения примера
В программе функция сортировки bsort() в качестве формального параметра используется константный указатель, который указывает на первый элемент заданного массива. Второй формальный параметр также константный, так подчеркивается его неизменность в теле функции bsort(). Передача функции размера массива в качестве параметра имеет два преимущества – это хороший стиль программирования и, кроме того, такую функцию можно использовать многократно. Прототип функции swap() включен в тело функции bsort(), потому что это единственная функция, которая вызывает функцию обмена swap().
Рис. 11.2. Пример сортировки массива методом пузырька Задание 1 1. Напишите программу сортировки семи вещественных, которые должны быть случайными по равномерному закону из интервала [–Х, +Х], где Х – номер компьютера, на котором выполняется лабораторная работа. 2. Видоизмените программу так, чтобы функция bsort() возвращала указатель на отсортированный массив, а сам исходный массив был при этом неизменным. Предусмотрите вывод на консоль исходного массива, потом отсортированного массива после вызова функции сортировки, и снова для контроля исходный массив. При этом аргументы функции bsort() оставить без изменения. Пример 2. Написать программу, в которой используется функция по расчету среднего значения (среднего арифметического) одномерного числового массива, его исправленной выборочной дисперсии и среднего квадратичного отклонения (стандартного отклонения). Эти значения должны быть выведены на консоль в главной функции программы main(). Приведем расчетные формулы. Среднее выборочное значение (mean) одномерного массива размерностью N
где Исправленная выборочная дисперсия (D) одномерного массива
Исправленное среднеквадратичное отклонение есть плюс корень квадратный из дисперсии. Программный код решения примера
Расчетные характеристики одномерного массива размещаются последовательно друг за другом в выделенной памяти для указателя *PTR3. Сформированный указатель функция возвращает в точку вызова функции mean_D_S().
Рис. 11.3. Расчет статистических характеристик числового массива Задание 2 1. В качестве первого аргумента функции mean_D_S() используйте указатель на числовой массив. 2. Воспользуйтесь справкой по математическим функциям и в программе примените функцию, которая осуществляет возведение в степень. 3. Дополните возврат функцией mean_D_S() исходного массива, поэлементно возведенного в квадрат. В главной функции main() результаты выведите на консоль. Пример 3. Написать программу с указателем на функции, которые рассчитывают следующие статистические характеристики одномерного числового массива: среднее арифметическое значение, медиану и модус (моду). Среднее арифметическое рассчитывалось в предыдущем примере. Приведем определения медианы и модуса [3]. Медиана – это серединное значение в наборе данных – т. е. такое, что ровно половина значений располагается выше, и ровно половина ниже его. Модус – это значение, наиболее часто встречающееся в наборе данных. Программный код решения примера
В программе указатель на функции (*fun) – это массив указателей на три функции. В случае когда возвращаемые значения функций имеют различный тип, можно определить несколько указателей на функции.
Для понимания работы функции по расчету модуса алгоритм вычислений рекомендуется формулировать следующим образом: «Разбить сортированный список значений на ряд меньших списков, каждый из которых содержит одинаковые значения. Пересчитать число элементов в этих списках, и список с наибольшим числом элементов будет соответствовать модусу данных» [3].
Рис. 11.4. Значения среднего, медианы и модуса Задание 3 1. В функции расчета модуса приведение типов примените только один раз. 2. Создайте три указателя на функции: на функцию расчета среднего арифметического, функцию расчета медианы и функцию расчета модуса. При этом для массива целых чисел функция расчета модуса должна возвращать целое значение. 3. Объедините три функции – mean(), median(), mode() в одну и определите необходимый тип возвращаемого значения, чтобы в главной функции main() можно было распечатать результаты расчетов статистических характеристик. Пример 4. Написать программу сортировки массива строк с использованием указателей на функции. Программный код решения примера
В программе используются указатель на функцию для вызова двух функций – less() и greater() в процессе сортировки для определения порядка расположения элементов (слов).
Рис. 11.5. Пример сортировки строк Задание 4 1. Ввод массива строк осуществите с клавиатуры построчно. 2. Ввод массива строк осуществите с клавиатуры одной строкой, содержащей несколько слов, разделенных пробелами, и заполните символьный массив так, чтобы в каждом элементе было по одному слову из исходной строки. 3. Измените программу так, чтобы при сравнении строк не различались строчные и прописные буквы латинского алфавита. Пример 5. Написать программу построения на экране дисплея графика функции
Предусмотреть возможность записи в текстовый файл графика данной функции. Для решения примера используем средства вывода на печать форматированных данных без применения специальных графических библиотек. Программный код решения примера
В программе используется указатель на файл, который может быть стандартным потоком, т. е. экраном дисплея. В главной функции main() происходит обращение к функции рисования графика plot(), в которую вводят фактические параметры, в частности файл – это stdout, т. е. стандартный поток, 0.0 – это левая граница оси абсцисс, 10.0 – правая граница оси абсцисс, f – имя функции с описанием зависимости y = f (x). Пример выполнения программы представлен на рис. 11.6.
Задание 5 1. Выполните вывод графика в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. 2. Проанализируйте программу с целью возможного улучшения вида графика заданной функции. 3. В программу добавьте описание кубической и параболической функций. Напишите необходимые строчки программного кода для запроса о построении графика соответствующей функции. Контрольные вопросы 1. Каким образом можно вернуть из функции несколько значений? 2. Каким образом определяется тип функции? 3. Как выглядит описание функции, которая возвращает указатель на заданный тип, например char? 4. Можно ли использовать многоуровневую адресацию для функции, которая возвращает указатель на заданный тип? Если можно, то как происходит определение такой функции? 5. В каком месте программы можно определить указатель на функцию? 6. Имеет ли указатель на функцию прототип и определение? 7. Как осуществляется вызов функции с помощью указателя? 8. Как взаимосвязаны между собой объявление функции, ее определение и вызов?
|