Студопедия — Department: electronic engineering
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Department: electronic engineering







 

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

// Подключаемый файл fun1.c #include <stdlib.h> // для функции exit() void print_file(char**st) { char str[79+1]; FILE *fid; printf("\n Data from \"%c\":\n", st); if ((fopen_s(&fid, st, "r"))) { printf("\n File could not be opened.\n"); printf("\n Break. Press any key: "); getch(); exit(1); } printf("\n Data from the file \"%c"\n", st); if (!feof(fid)) { fgets(str, 79, fid); printf("%c", str); } fclose(fid); printf("\n"); }  
   
// Основной программный модуль проекта main.c #include <stdio.h> #include <conio.h> #include "D:\\fun1.c" // Главная функция int main (void) { char str[79+1]; printf("\n Enter the file name and path: "); gets_s(str, 79); // Вызов функции распечатки файла print_file(str); printf("\n Press any key: "); getch(); return 0; }


Результат выполнения программы приведен на рис. 17.5.

Рис. 17.5. Содержимое заданного текстового файла

Задание 2

1. Выведите на консоль содержимое подключаемого файла fun1.c.

2. Измените расположение подключаемого файла, например поместите его на диск D:\students\fun1.c.

3. В текстовый файл запишите фамилию и имя пользователя (студента), год рождения, год поступления в университет, наименование специальности.

4. Содержимое текстового файла предыдущего пункта выведите на консоль и запишите в другой текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. Запись в текстовый файл оформите в виде функции surname.c, где surname – фамилия пользователя.

5. В программе вместо указателя, являющегося формальным параметром функции print_file(), примените массив символов.

Пример 3. Написать программу преобразования десятичной системы счисления в двоичную, восьмеричную, шестнадцатеричную на основе системы меню. Применитеьмассив указателей на функцию, использовать заголовочные файлы.

Перевод заданного десятичного числа в соответствующее число по заданному основанию оформим в виде трех функций, каждая из которых будет вызываться по индексу, по которому из массива будет выбираться указатель на нужную функцию. Прототипы функций включим в заголовочный h -файл. Основания систем счисления также поместим в заголовочный h -файл. Для решения примера используем программы предыдущего примера.

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

// Основной программный модуль main.c #include <stdio.h> #include <conio.h> #include "hdec.h" int main (void) { int index[3] = {0, 1, 2}; long int number; int basen; void (*fun[3])(long int) = {dec2, dec8, dec16}; printf("\n Enter a positive integer numbers: "); scanf_s("%c", &number); printf("\n Select base system notation (2, 8, 16): "); scanf_s("%d", &basen); if (basen == 2) (*fun[0])(number); else if (basen == 8) (*fun[1])(number); else if (basen == 16) (*fun[2])(number); else { printf("\n\t Error choice."); printf("\n Break. Press any key: "); getch(); return -1; } printf("\n\n Press any key: "); getch(); return 0; }

 

// Подключаемый файл Dec_2.c // Перевод в двоичную систему счисления #include "base.h" void dec2 (long int x) { int i = 0; int Num[64]; int next; long int xx = x; do { Num[i] = x % base2; ++i; x /= base2; } if (x!= 0); // Результат в обратном порядке printf("\n Decimal number \"%c\" has a binary equivalent:\n", xx); for (--i; i >= 0; --i) { next = Num[i]; printf("%2d", next); } }
 
// Подключаемый файл Dec_8.c // Перевод в восьмеричную систему счисления #include "base.h" void dec8 (long int y) { int i = 0, next, Num[64]; long int yy = y; do { Num[i] = y % base8; ++i; y /= base8; } if (y!= 0); // Результат в обратном порядке printf("\n Decimal number \"%c\" has an octal equivalent:\n", yy); for (--i; i >= 0; --i) { next = Num[i]; printf("%2d", next); } }
 
// Подключаемый файл Dec_16.c // Перевод в шестнадцатеричную систему счисления #include "base.h" void dec16 (long int z) { int i = 0; int next, Num[64]; long int zz = z; const char digits_16[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; do { Num[i] = z % base16; ++i; z /= base16; } if (z!= 0); // Результат в обратном порядке printf("\n Decimal number \"%c\" has a hexadecimal equivalent:\n", zz); for (--i; i >= 0; --i) { next = Num[i]; printf("%2c", digits_16[next]); } }
 
// Подключаемый файл base.h // Основания систем счисления #define base2 2 #define base8 8 #define base16 16
 
// Подключаемый файл hdec.h // Подключение файлов с функциями преобразования систем // счисления #include "Dec_2.c" #include "Dec_8.c" #include "Dec_16.c" // Прототипы функций преобразования систем счисления void dec2 (long int a); void dec8 (long int b); void dec16 (long int c);

В программе используется заголовочный файл base.h в целях демонстрации препроцессорных директив языка С. Другой заголовочный файл hdec.h подключает файлы с программами преобразования чисел и прототипы функций. Внимание! Особенность при их создании заключается в том, что они должны заканчиваться пустой строкой (после всех операторов, прототипов функций и пр.)

Файлы Dec_2.c, Dec_8.c, Dec_16.c, base.h, hdec.h созданы с помощью инструментальной среды Microsoft Visual Studio 2010. Эти файлы следует сохранить в папке с основным программным кодом функции main.c.

В программе использован массив указателей на функцию. По определению указатель на функцию содержит адрес первого байта или слова выполняемого кода функции. Над указателями на функцию запрещены арифметические операции. Так же как для других типов переменных, можно использовать массив указателей на функцию. Соответствующая функция вызывается с указанием индекса требуемой функции. Например:

(*fun[0])(number);

Десятичное число number передается в функцию dec2(). Нулевой индекс соответствует выбору функции перевода десятичного числа в двоичный эквивалент.

Расположение файлов с созданными функциями в основной папке проекта, где находится файл main.c, позволяет подключать необходимые файлы как в текущей папке (директории).


 


Возможный результат выполнения программы представлен на рис. 17.6.

Рис. 17.6. Перевод десятичного числа в шестнадцатеричное

Задание 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, "rus"); // для поддержки русских шрифтов printf("\n Введите размерность одномерного массива: "); scanf_s("%d", &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 Память не выделена. Нажмите любую клавишу"); 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. Пример расчета накопительной суммы


 

Задание 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"); 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 { if (A[i] < x) i++; if (x < A[j]) j--; if (i <= j){ k = A[i]; A[i] = A[j]; A[j] = k; i++; j--; }// end if } if (i < j); // end 3d do if (i < R) {s++; st[s].L = i; st[s].R = R;} R = j; } if (L < R); } if (s!= 0); }

Цикл do – if применен для того, чтобы тело цикла выполнялось хотя бы один раз.

Возможный результат выполнения программы показан на рис. 17.8.


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

Задание 5

1. Произведите сборку проекта из трех предложенных файлов.

2. Напишите программу с сохранением исходного массива и полученного отсортированного массива.

3. Выведите результаты в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа. В текстовом файле массивы выведите в виде двух столбцов: исходный массив и отсортированный массив. Размер массивов не менее 10.

4. Измените программу, исключив заголовочный файл hsort.h.

5. Введите изменения в программу для сортировки вещественных чисел.

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

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

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

Полагая, что , расчет полинома в заданной точке производится по следующей итерационной формуле [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.

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

Задание 6

1. Примените оператор цикла do – if вместо оператора цикла for.

2. Создайте подключаемый файл, в котором реализуется схема Горнера. Предусмотрите вызов этого файла из главной функции.

3. Предусмотрите ввод коэффициентов полинома с клавиатуры. Далее предусмотрите обращение к созданному файлу с реализацией схемы Горнера.


 

4. Напишите программу символической записи на консоли заданного полинома по известным коэффициентам. Оформите этот фрагмент программы в виде подключаемого файла.

 

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

1. Как рекомендуется организовать внутреннюю работу пользовательских функций по отношению к другим функциям в программах на языке С? Перечислите основные правила организации внутренней работы функций и достоинства этих правил.

2. В чем заключается основное назначение заголовочных файлов (h -файлов) в проектах языка С?

3. Как следует объявить функцию, чтобы доступ к ней был невозможен за пределами файла, где она была определена?

4. Как следует объявить функцию, чтобы к ней можно было обращаться из других функций проекта?

5. Какие классификаторы классов памяти поддерживает стандарт языка С?

6. Какой классификатор памяти используется по умолчанию в программах на языке С?

7. Какие расширения можно применить к файлам, содержащим пользовательские функции?

8. Как осуществляется компиляция файлов с пользовательскими функциями в программной среде Visual Studio?

9. Как осуществляется подключение файлов с пользовательскими функциями, которые расположены на различных логических дисках компьютера?

 

 







Дата добавления: 2015-09-06; просмотров: 436. Нарушение авторских прав; Мы поможем в написании вашей работы!



Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

ТЕРМОДИНАМИКА БИОЛОГИЧЕСКИХ СИСТЕМ. 1. Особенности термодинамического метода изучения биологических систем. Основные понятия термодинамики. Термодинамикой называется раздел физики...

Травматическая окклюзия и ее клинические признаки При пародонтите и парадонтозе резистентность тканей пародонта падает...

Подкожное введение сывороток по методу Безредки. С целью предупреждения развития анафилактического шока и других аллергических реак­ций при введении иммунных сывороток используют метод Безредки для определения реакции больного на введение сыворотки...

БИОХИМИЯ ТКАНЕЙ ЗУБА В составе зуба выделяют минерализованные и неминерализованные ткани...

Типология суицида. Феномен суицида (самоубийство или попытка самоубийства) чаще всего связывается с представлением о психологическом кризисе личности...

ОСНОВНЫЕ ТИПЫ МОЗГА ПОЗВОНОЧНЫХ Ихтиопсидный тип мозга характерен для низших позвоночных - рыб и амфибий...

Studopedia.info - Студопедия - 2014-2024 год . (0.008 сек.) русская версия | украинская версия