Department: electronic engineering
Программный код решения примера
Рис. 17.5. Содержимое заданного текстового файла Задание 2 1. Выведите на консоль содержимое подключаемого файла fun1.c. 2. Измените расположение подключаемого файла, например поместите его на диск D:\students\fun1.c. 3. В текстовый файл запишите фамилию и имя пользователя (студента), год рождения, год поступления в университет, наименование специальности. 4. Содержимое текстового файла предыдущего пункта выведите на консоль и запишите в другой текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. Запись в текстовый файл оформите в виде функции surname.c, где surname – фамилия пользователя. 5. В программе вместо указателя, являющегося формальным параметром функции print_file(), примените массив символов. Пример 3. Написать программу преобразования десятичной системы счисления в двоичную, восьмеричную, шестнадцатеричную на основе системы меню. Применитеьмассив указателей на функцию, использовать заголовочные файлы. Перевод заданного десятичного числа в соответствующее число по заданному основанию оформим в виде трех функций, каждая из которых будет вызываться по индексу, по которому из массива будет выбираться указатель на нужную функцию. Прототипы функций включим в заголовочный h -файл. Основания систем счисления также поместим в заголовочный h -файл. Для решения примера используем программы предыдущего примера. Программный код решения примера состоит из шести файлов
В программе используется заголовочный файл base.h в целях демонстрации препроцессорных директив языка С. Другой заголовочный файл hdec.h подключает файлы с программами преобразования чисел и прототипы функций. Внимание! Особенность при их создании заключается в том, что они должны заканчиваться пустой строкой (после всех операторов, прототипов функций и пр.) Файлы Dec_2.c, Dec_8.c, Dec_16.c, base.h, hdec.h созданы с помощью инструментальной среды Microsoft Visual Studio 2010. Эти файлы следует сохранить в папке с основным программным кодом функции main.c. В программе использован массив указателей на функцию. По определению указатель на функцию содержит адрес первого байта или слова выполняемого кода функции. Над указателями на функцию запрещены арифметические операции. Так же как для других типов переменных, можно использовать массив указателей на функцию. Соответствующая функция вызывается с указанием индекса требуемой функции. Например: (*fun[0])(number); Десятичное число number передается в функцию dec2(). Нулевой индекс соответствует выбору функции перевода десятичного числа в двоичный эквивалент. Расположение файлов с созданными функциями в основной папке проекта, где находится файл main.c, позволяет подключать необходимые файлы как в текущей папке (директории).
Рис. 17.6. Перевод десятичного числа в шестнадцатеричное Задание 3 1. Получаемые результаты проверьте с помощью встроенного калькулятора calc операционной системы Windows. 2. Все файлы проекта, кроме main.c, расположите на один уровень выше с помощью нотации ../. 3. Дополните программу вывода преобразованного десятичного числа во всех системах счисления одновременно, т. е. по основаниям 2, 8, 16. 4. Видоизмените программу так, чтобы функции преобразования десятичного числа возвращали преобразованное число в основной модуль программного проекта и в нем происходил вывод на консоль. Пример 4. Написать программу, в которой используется функция формирования накопительной суммы для заданного одномерного целочисленного массива, размерность которого вводится с клавиатуры пользователем. Для пояснения формирования накопительной суммы приведем пример. Пусть задан исходный одномерный массив: 1 2 3 4 5 6 7. Тогда массив накопительной суммы (cumsum – cumulative sum of elements) будет выглядеть так: 1 3 6 10 15 21 28. Программный код решения примера состоит из трех файлов
Следует обратить внимание на расположение заголовочного файла stdlib.h, он находится впереди подключаемого файла fcum.c, поскольку в последнем используется динамическое распределение памяти, для чего требуется библиотека stdlib.h. Формирование накопительной суммы выполнено в разработанной функции fcum.c. В программе закомментированы библиотечные заголовочные файлы, которые включены в файл hcum.h. Сама накопительная функция cumsum() определена через указатель. Поэтому она возвращает указатель, который принимает адрес нулевого элемента массива накопительной суммы.
Рис. 17.7. Пример расчета накопительной суммы
Задание 4 1. Файлы hcum.h и fcum.c расположите за пределами папки проекта. Примените различные комбинации расположения файлов hcum.h и fcum.c в нескольких папках рабочего диска. Обеспечьте работоспособность программы. 2. Внесите изменения в программу, чтобы она была работоспособной без заголовочного файла hcum.h. 3. Напишите программу формирования накопительной суммы вещественных чисел заданного массива. Формирование исходного массива выполните по случайному равномерному закону из интервала [–X; +X], где Х – номер компьютера, на котором выполняется лабораторная работа. 4. Напишите функцию для расчета накопительной суммы столбцов прямоугольной матрицы, размерность которой задается пользователем и заполняется, например, натуральными числами. 5. Напишите функцию для расчета накопительной суммы строк прямоугольной матрицы, размерность которой задается пользователем и заполняется, например, натуральными числами. 6. В программе предусмотрите вывод результатов в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. Пример 5. Написать программу быстрой сортировки Хоара одномерного массива целых чисел с расположением функций в разных файлах [5]. Предусмотреть формирование одномерного массива случайным образом с динамическим распределением памяти. Программный код решения примера состоит из трех файлов
Цикл do – if применен для того, чтобы тело цикла выполнялось хотя бы один раз. Возможный результат выполнения программы показан на рис. 17.8.
Задание 5 1. Произведите сборку проекта из трех предложенных файлов. 2. Напишите программу с сохранением исходного массива и полученного отсортированного массива. 3. Выведите результаты в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. В текстовом файле массивы выведите в виде двух столбцов: исходный массив и отсортированный массив. Размер массивов не менее 10. 4. Измените программу, исключив заголовочный файл hsort.h. 5. Введите изменения в программу для сортировки вещественных чисел. Пример 6. Написать программу вычисления степенного полинома в заданной точке по схеме Горнера. Пусть задан полином в виде Алгоритм схемы Горнера осуществляется при помощи формулы [6] Полагая, что Для программной реализации примера примем полином Рассчитаем значение полинома в точке Программный код решения примера
Следует обратить внимание на индексацию массива, который находится в теле цикла. В последней функции printf() использован спецификатор «\a» для подачи звукового сигнала.
Рис. 17.9. Результат вычисления полинома по схеме Горнера Задание 6 1. Примените оператор цикла do – if вместо оператора цикла for. 2. Создайте подключаемый файл, в котором реализуется схема Горнера. Предусмотрите вызов этого файла из главной функции. 3. Предусмотрите ввод коэффициентов полинома с клавиатуры. Далее предусмотрите обращение к созданному файлу с реализацией схемы Горнера.
4. Напишите программу символической записи на консоли заданного полинома по известным коэффициентам. Оформите этот фрагмент программы в виде подключаемого файла.
Контрольные вопросы 1. Как рекомендуется организовать внутреннюю работу пользовательских функций по отношению к другим функциям в программах на языке С? Перечислите основные правила организации внутренней работы функций и достоинства этих правил. 2. В чем заключается основное назначение заголовочных файлов (h -файлов) в проектах языка С? 3. Как следует объявить функцию, чтобы доступ к ней был невозможен за пределами файла, где она была определена? 4. Как следует объявить функцию, чтобы к ней можно было обращаться из других функций проекта? 5. Какие классификаторы классов памяти поддерживает стандарт языка С? 6. Какой классификатор памяти используется по умолчанию в программах на языке С? 7. Какие расширения можно применить к файлам, содержащим пользовательские функции? 8. Как осуществляется компиляция файлов с пользовательскими функциями в программной среде Visual Studio? 9. Как осуществляется подключение файлов с пользовательскими функциями, которые расположены на различных логических дисках компьютера?
|