Visual_Studio_2010
.pdf//Подключаемый файл 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 Память не выделена. Нажмите любую клавишу"); _getch();
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, поскольку в последнем используется динамическое распределение памяти, для чего требуется библиотека stdlib.h. Формирование накопительной суммы выполнено в разработанной функции fcum.c.
В программе закомментированы библиотечные заголовочные файлы, которые включены в файл hcum.h. Сама накопительная функция cumsum() определена через указатель. Поэтому она возвращает указатель, который принимает адрес нулевого элемента массива накопительной суммы.
Возможный результат выполнения программы показан на рис.17.7.
Рис.17.7. Пример расчета накопительной суммы
311
Задание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"// cозданный заголовочный файл |
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");
312
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);
313
//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);
}while (s != 0);
}
Цикл do – while применен для того, чтобы тело цикла выполнялось хотя бы один раз.
Возможный результат выполнения программы показан на рис.17.8.
314