Программы на языке С, состоящие из нескольких файлов
Задание 4
- Файлы hcum.h и fcum.c расположите за пределами папки проекта. Применить различные комбинации расположения файлов hcum.h и fcum.c в различных папках данного диска. Обеспечьте работоспособность программы.
- Внесите изменения в программу, чтобы она была работоспособной без заголовочного файла hcum.h.
- Напишите программу формирования накопительной суммы вещественных чисел заданного массива. Формирование исходного массива выполните по случайному равномерному закону из интервала [–X; +X], где Х – номер компьютера, на котором выполняется лабораторная работа.
- Напишите функцию для расчета накопительной суммы столбцов прямоугольной матрицы, размерность которой задается пользователем, и заполняется, например, натуральными числами.
- Напишите функцию для расчета накопительной суммы строк прямоугольной матрицы, размерность которой задается пользователем, и заполняется, например, натуральными числами.
- В программе предусмотрите вывод результатов в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.
Пример 5. Напишите программу быстрой сортировки Хоара одномерного массива целых чисел с расположением функций в разных файлов [5]. Предусмотрите формирование одномерного массива случайным образом с динамическим распределением памяти.
Программный код решения примера состоит из трех файлов:
// 1-й файл с главной функцией - файл main.c
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#include "hsort.h"// Созданный заголовочный файл
int main (void) {
int i, n;
int *M;// Указатель для исходного массива
int Limit = 100;
time_t t; // переменная текущего времени
// Рандомизация генератора псевдослучайных чисел
srand( (unsigned int) time(&t));
// Для поддержки русских шрифтов
setlocale(LC_ALL, ".1251");
printf("\n\t Быстрая сортировка Хоара\n");
printf("\n Введите размерность одномерного массива: ");
scanf_s("%d", &n);
// Выделение памяти для заданной размерности массива
M = (int *)malloc(n*sizeof(int));
// Формирование случайного исходного массива
for (i = 0; i < n; ++i)
M[i] = -Limit/2 + rand() % Limit;
printf("\n Исходный одномерный массив:\n");
for (i = 0; i < n; ++i)
if (abs(M[i]) < 10) {
if (M[i] < 0)
printf("%4d", M[i]);
else
printf("%3d", M[i]);
}
else {
if (M[i] < 0)
printf("%5d", M[i]);
else
printf("%4d", M[i]);
}
printf("\n\n Отсортированный одномерный массив:\n");
QuickSort(M, n);
for (i = 0; i < n; ++i)
if (abs(M[i]) < 10) {
if (M[i] < 0)
printf("%4d", M[i]);
else
printf("%3d", M[i]);
}
else {
if (M[i] < 0)
printf("%5d", M[i]);
else
printf("%4d", M[i]);
}
printf("\n\n Нажмите любую клавишу: ");
_getch();
return 0;
}// 2-файл - подключаемый заголовочный файл hsort.h // с прототипом функции быстрой сортировки Хоара void QuickSort(int *A, int n);
// 3-й файл - подключаемый файл my_sort.c
// с кодом быстрой сортировки Хоара
void QuickSort (int *A, int n)
{
int i, j, s;
int L, R;
int k, x;
#define D 1000
struct stack {
int L;
int R;
} st[D];// имитация стека
s = 1; st[1].L = 0; st[1].R = n - 1;
do {
L = st[s].L; R = st[s].R; s--;
do {
i = L; j = R;
x = A[(L+R)/2]; // разделяющий элемент
do {
while (A[i] < x)
i++;
while (x < A[j])
j--;
if (i <= j){
k = A[i]; A[i] = A[j]; A[j] = k;
i++; j--;
}// end if
} while (i < j); // end 3d do
if (i < R)
{s++; st[s].L = i; st[s].R = R;}
R = j;
} while (L < R);// end 2nd do
} while (s != 0);// end 1st do
}Цикл do–while применен для того, чтобы тело цикла выполнялось хотя бы один раз.
Возможный результат выполнения программы показан на рис. 17.8.
Задание 5
- Произведите сборку проекта из трех предложенных файлов.
- Напишите программу с сохранением исходного массива и полученного отсортированного массива.
- Выведите результаты в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. В текстовом файле массивы выведите в виде двух столбцов: исходный массив и отсортированный массив. Размер массивов не менее 10.
- Измените программу: исключите заголовочный файл hsort.h.
- Введите изменения в программу для сортировки вещественных чисел.
Пример 6. Напишите программу вычисления степенного полинома в заданной точке по схеме Горнера.
Пусть задан полином в следующем виде:

Алгоритм схемы Горнера осуществляется при помощи формулы [17.6]:

Полагая, что
расчет полинома в заданной точке производится по следующей итерационной формуле [17.6]:

Для программной реализации примера примем следующий полином:

Рассчитаем значение полинома в точке 
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <locale.h>
// Размерность массива коэффициентов полинома
#define N 5
// Главная функция
int main (void) {
int i;
// Массив коэффициентов полинома
double A[ ] = {1.0, 2.0, 3.0, 4.0, 5.0};
double x0 = 2.0, y;
// Для русских шрифтов
setlocale(LC_ALL, ".1251");
// Для вывода чисел с плавающей точкой
setlocale(LC_NUMERIC, "English");
// Консольный заголовок
printf("\n\t Применение схемы Горнера\n");
printf(" Вычисление полинома P(x) %d порядка в точке х = %1.4f:\n", N-1, x0);
// Основной цикла расчета по схеме Горнера
y = A[0];
for ( i = N-2; i >= 0; --i )
y = y*x0 + A[(N-1)-i];
// Вывод результата
printf("\n\t P(x) = %0.4f \n", y );
printf("\n Нажмите любую клавишу (Press any key): \a");
_getch();
return 0;
}Следует обратить внимание на индексацию массива, который находится в теле цикла. В последней функции printf() использован спецификатор "\a" для подачи звукового сигнала.
Результат выполнения программы показан на рис. 17.9.
Задание 6
- Примените оператор цикла do – while вместо оператора цикла for.
- Создайте подключаемый файл, в котором реализуется схема Горнера. Предусмотрите вызов этого файла из главной функции.
- Предусмотрите ввод коэффициентов полинома с клавиатуры. Далее предусмотрите обращение к созданному файлу с реализацией схемы Горнера.
- Напишите программу символической записи на консоли заданного полинома по известным коэффициентам. Оформите этот фрагмент программы в виде подключаемого файла.
- Предусмотрите запись в текстовый файл символического представления полинома с заданными коэффициентами и значения полинома в заданной точке. Имя файла примите compX.txt, где X – номер компьютера, на котором выполняется лабораторная работа.
Контрольные вопросы
- Как рекомендуется организовать внутреннюю работу пользовательских функций по отношению к другим функциям в программах на языке С? Перечислите основные правила организации внутренней работы функций и достоинства этих правил.
- В чем заключается основное назначение заголовочных файлов ( h -файлов) в проектах языка С?
- Как следует объявить функцию, чтобы доступ к ней был невозможен за пределами файла, где она была определена?
- Как следует объявить функцию, чтобы к ней можно было обращаться из других функций проекта?
- Какие классификаторы классов памяти поддерживает стандарт языка С?
- Какой классификатор памяти используется по умолчанию в программах на языке С?
- Какие расширения можно применить к файлам, содержащим пользовательские функции?
- Как осуществляется компиляция файлов с пользовательскими функциями в программной среде Visual Studio?
- Как осуществляется подключение файлов с пользовательскими функциями, которые расположены на различных логических дисках компьютера?

