Опубликован: 14.12.2010 | Доступ: свободный | Студентов: 3125 / 717 | Оценка: 4.53 / 4.12 | Длительность: 26:28:00
Лекция 18:

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

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

Задание 4

  1. Файлы hcum.h и fcum.c расположите за пределами папки проекта. Применить различные комбинации расположения файлов hcum.h и fcum.c в различных папках данного диска. Обеспечьте работоспособность программы.
  2. Внесите изменения в программу, чтобы она была работоспособной без заголовочного файла hcum.h.
  3. Напишите программу формирования накопительной суммы вещественных чисел заданного массива. Формирование исходного массива выполните по случайному равномерному закону из интервала [–X; +X], где Х – номер компьютера, на котором выполняется лабораторная работа.
  4. Напишите функцию для расчета накопительной суммы столбцов прямоугольной матрицы, размерность которой задается пользователем, и заполняется, например, натуральными числами.
  5. Напишите функцию для расчета накопительной суммы строк прямоугольной матрицы, размерность которой задается пользователем, и заполняется, например, натуральными числами.
  6. В программе предусмотрите вывод результатов в текстовый файл с именем 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(&amp;t));

// Для поддержки русских шрифтов
	setlocale(LC_ALL, ".1251"); 

	printf("\n\t Быстрая сортировка Хоара\n");
     printf("\n Введите размерность одномерного массива: ");
	scanf_s("%d", &amp;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.

Пример сортировки одномерного массива

Рис. 17.8. Пример сортировки одномерного массива

Задание 5

  1. Произведите сборку проекта из трех предложенных файлов.
  2. Напишите программу с сохранением исходного массива и полученного отсортированного массива.
  3. Выведите результаты в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. В текстовом файле массивы выведите в виде двух столбцов: исходный массив и отсортированный массив. Размер массивов не менее 10.
  4. Измените программу: исключите заголовочный файл hsort.h.
  5. Введите изменения в программу для сортировки вещественных чисел.

Пример 6. Напишите программу вычисления степенного полинома в заданной точке по схеме Горнера.

Пусть задан полином в следующем виде:

P(x)=a_o x^n+a_1x^{n-1}+\cdots+a_{n-1}x+a_n.

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

P(x)=a_o+x(a_1+x(a_2+\cdots+x(a_{n-1}+xa_n)\cdots)).

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

u_k=x_ou_{k+1}+a_k,k=n-1,\cdots,1,10.

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

P(x)=x^4+2x^3+3x^2+4x+5.

Рассчитаем значение полинома в точке х_0 = 2.

Программный код решения примера:

#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.

Результат вычисления полинома по схеме Горнера

Рис. 17.9. Результат вычисления полинома по схеме Горнера

Задание 6

  1. Примените оператор цикла do – while вместо оператора цикла for.
  2. Создайте подключаемый файл, в котором реализуется схема Горнера. Предусмотрите вызов этого файла из главной функции.
  3. Предусмотрите ввод коэффициентов полинома с клавиатуры. Далее предусмотрите обращение к созданному файлу с реализацией схемы Горнера.
  4. Напишите программу символической записи на консоли заданного полинома по известным коэффициентам. Оформите этот фрагмент программы в виде подключаемого файла.
  5. Предусмотрите запись в текстовый файл символического представления полинома с заданными коэффициентами и значения полинома в заданной точке. Имя файла примите compX.txt, где X – номер компьютера, на котором выполняется лабораторная работа.

Контрольные вопросы

  1. Как рекомендуется организовать внутреннюю работу пользовательских функций по отношению к другим функциям в программах на языке С? Перечислите основные правила организации внутренней работы функций и достоинства этих правил.
  2. В чем заключается основное назначение заголовочных файлов ( h -файлов) в проектах языка С?
  3. Как следует объявить функцию, чтобы доступ к ней был невозможен за пределами файла, где она была определена?
  4. Как следует объявить функцию, чтобы к ней можно было обращаться из других функций проекта?
  5. Какие классификаторы классов памяти поддерживает стандарт языка С?
  6. Какой классификатор памяти используется по умолчанию в программах на языке С?
  7. Какие расширения можно применить к файлам, содержащим пользовательские функции?
  8. Как осуществляется компиляция файлов с пользовательскими функциями в программной среде Visual Studio?
  9. Как осуществляется подключение файлов с пользовательскими функциями, которые расположены на различных логических дисках компьютера?
< Лекция 17 || Лекция 18: 12345 || Лекция 19 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов