Программы на языке С, состоящие из нескольких файлов
Задание 3
- Получаемые результаты проверьте с помощью встроенного калькулятора calc операционной системы Windows.
- Все файлы проекта, кроме main.c, расположите на один уровень выше с помощью нотации ../.
- Дополните программу вывода преобразованного десятичного числа во всех системах счисления одновременно, т.е. по основаниям 2, 8, 16.
- Видоизмените программу так, чтобы функции преобразования десятичного числа возвращали преобразованное число в основной модуль программного проекта и в нем происходил вывод на консоль.
Пример 4. Напишите программу, в которой используется функция формирования накопительной суммы для заданного одномерного целочисленного массива, размерность которого вводится с клавиатуры пользователем.
Для пояснения формирования накопительной суммы приведем пример. Пусть задан исходный одномерный массив:
1 2 3 4 5 6 7.
Тогда массив накопительной суммы (cumsum – cumulative sum of elements):
1 3 6 10 15 21 28.
Программный код решения примера состоит из трех файлов:
// Файл main.c
// Основной модуль проекта
//#include <stdio.h>
#include <conio.h>
//#include <stdlib.h>
#include <locale.h>
#include "hcum.h"
int main (void) {
int i, n;
int *M;// Указатель для исходного массива
int *N;// Указатель для накопительного массива
// Для поддержки русских шрифтов
setlocale(LC_ALL, ".1251");
printf("\n Введите размерность одномерного массива: ");
scanf_s("%d", &amp;amp;amp;n);
M = (int *)calloc(n, sizeof(int));
// Формирование исходного массива
for (i = 0; i < n; ++i)
M[i] = (i + 1);
printf("\n Исходный массив:\n ");
for (i = 0; i < n; ++i)
if (M[i] < 10)
printf("%3d", M[i]);
else if (M[i] == 10)
printf(" %3d", M[i]);
else if (M[i] > 10 && M[i] < 100)
printf("%4d", M[i]);
else
printf("%5d", M[i]);
printf("\n\n Массив накопительной суммы:\n ");
// M - фактический аргумент функции cumsum()
N = cumsum(M, n);
for (i = 0; i < n; ++i)
if (N[i] < 10)
printf("%3d", N[i]);
else if (N[i] == 10 )
printf(" %3d", N[i]);
else if (N[i] > 10 && N[i] < 100)
printf("%4d", N[i]);
else
printf("%5d", N[i]);
// Освобождение выделенной памяти
free(M);
free(N);
printf("\n\n\n Нажмите любую клавишу (Press any key): ");
_getch();
return 0;
}// Подключаемый заголовочный Файл hcum.h #include <stdlib.h> #include <stdio.h> #include <locale.h> // Прототип функции cumsum() int *(cumsum)(int *arr, int n);
// Подключаемый файл fcum.c
// Функция cumsum()
#include "hcum.h"
int *(cumsum)(int *arr, int n)
{
int i;
int *SUM;// Указатель для накопительного массива
// Выделение памяти для нового указателя
SUM = (int *)calloc(n, sizeof(int));
setlocale(LC_ALL, ".1251"); // для русских шрифтов
// Проверка выделенной памяти
if (SUM == NULL) {
printf("\n Память не выделена.\n");
exit(1); }
// Основной код формирования накопительной суммы
SUM[0] = arr[0];
for (i = 1; i < n; ++i)
SUM[i] = SUM[i-1] + arr[i];
return (SUM);
}Следует обратить внимание на расположение заголовочного файла stdlib.h – он впереди подключаемого файла fcum.c, поскольку в файле fcum.c используется динамическое распределение памяти, для чего требуется библиотека stdlib.h. Формирование накопительной суммы выполнено в разработанной функции fcum.c.
В программе закомментированы библиотечные заголовочные файлы, которые включены в файл hcum.h. Сама накопительная функция cumsum() определена через указатель на функцию. Поэтому она возвращает указатель, который указывает на нулевой элемент массива накопительной суммы. Созданные файлы hcum.h и fcum.c расположены в папке проекта вместе с файлом главной функции main.c.
Возможный результат выполнения программы показан на рис. 17.7.
