Опубликован: 14.12.2010 | Уровень: для всех | Доступ: платный
Лекция 18:

Программы на языке С, состоящие из нескольких файлов

< Лекция 17 || Лекция 18: 12345 || Лекция 19 >

Задание 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.

Программный код решения примера состоит из трех файлов:

// Файл 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;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 &amp;&amp; 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 &amp;&amp; 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.

Пример расчета накопительной суммы

Рис. 17.7. Пример расчета накопительной суммы
< Лекция 17 || Лекция 18: 12345 || Лекция 19 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов
Александр Соболев
Александр Соболев
Россия
Артем Полутин
Артем Полутин
Россия, Саранск