Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Visual_Studio_2010

.pdf
Скачиваний:
109
Добавлен:
03.03.2016
Размер:
5.94 Mб
Скачать

// Файл myfile3.c

int degree(int x, int k)

{

int i, a = 1;

for (i = 1; i <= k; ++i) a *= x; return a;

}

// Файл myfie2.c

#include <math.h>

#include <stdlib.h>

void print(int k)

{

int i, j, N, *PTR; FILE *fid;

N = degree(2,k); // N = 2^k

//Динамически выделяемая память

PTR = (int *)malloc(N*k*sizeof(int)); for (i = 0; i < N; ++i)

for (j = 0; j < k; ++j)

PTR[i*k + j] = 0; // заполнение нулями

for (i = 0; i < N; ++i) for (j = 0; j < k; ++j)

PTR[i*k + j] = degree(-1,(int)floor(i/degree(2,j)));

printf("\n Matrix is planning experiment, N = 2^k, N = %d, k = %d\n", N, k);

if (k < 5)

{

for (i = 0; i < N; ++i)

{

printf("\n%4d) ", i+1);

for (j = 0; j < k; ++j) printf(" %3d", PTR[i*k+j]);

}

}

else

{

fopen_s(&fid, "D:\\data.txt", "w");

fprintf(fid, "\r\n Matrix is planning experiment, N = 2^k, N =

%d, k = %d\r\n", N, k);

301

for (i = 0; i < N; ++i)

{

fprintf(fid, "\r\n%4d) ", i+1);

for (j = 0; j < k; ++j) fprintf(fid, "%3d", PTR[i*k+j]);

}

fclose(fid);

printf("\n See the result in the file \"D:\\data.txt\" \n");

}

}

// Заголовочный файл hfile.h

#include "D:\myfile3.c"

#include "D:\myfile2.c"

Подключение файлов сделано в двух местах: в главной функции main() и в заголовочном файле hfile.h. При этом прототипы функций не прописаны. Заголовочный файл hfile.h «выгружает» содержимое файлов myfile3.c и myfile2.c перед главной функцией main(), поэтому в теле функции можно обращаться к функциям degree() и print(). Первая предназначена для возведения целого числа в степень, она формирует матрицу планирования (с помощью указателя *PTR) и вывода значений матрицы на консоль и (или) в текстовый файл. Важное значение имеет очередность подключения файлов myfile3.c и myfile2.c. Следует обратить внимание на синтаксис: заключение в двойные ковычки имени текстового файла data.txt. Функция ceil() возвращает наименьшее целое (представленное в виде значения с плавающей точкой), которое больше своего аргумента или равно ему [2]. Она включена на тот случай, если пользователь введет нецелое число.

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

302

Рис.17.4. Матрица планирования N 24

Задание1

1.Проверьте работу программ при записи результата в файл. В качестве имени текстового файла примите compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

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

3.Вместо разработанной функции degree() примените стандартную функцию pow(). Сравните полученные результаты.

4.В программу добавьте изменения для вывода матрицы планирования при зеркальном отображении столбцов.

5.Дополните программу запросом знака единицы в первом столбце матрицы планирования.

6.В матрицу планирования добавьте в качестве первого столбца массив положительных единиц, т. е. +1.

Пример 2. Написать программу вывода на консоль содержимого текстового файла, расположенного в заданном каталоге, оформить вывод в виде отдельного файла.

Предположим, что программный проект расположен на диске Е:\Project_C, текстовый файл находится на диске D:\data16.txt. Пусть содержимое текстового файла будет следующим:

1,

2,

3,

4,

5

Programming

in C

department:

electronic engineering

303

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

// Подключаемый файл fun1.c

#include <stdlib.h> // для функции exit()

void print_file(char *st)

{

char str[79+1];

FILE *fid;

printf("\n Data from \"%s\":\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 \"%s"\n", st); while (!feof(fid)) {

fgets(str, 79, fid); printf("%s", 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;

}

304

Результат выполнения программы приведен на рис.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;

305

void (*fun[3])(long int) = {dec2, dec8, dec16};

printf("\n Enter a positive integer numbers: "); scanf_s("%ld", &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;

} while (x != 0);

// Результат в обратном порядке

printf("\n Decimal number \"%ld\" has a binary equivalent:\n", xx);

for (--i; i >= 0; --i) { next = Num[i]; printf("%2d", next);

}

}

306

//Подключаемый файл 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;

} while (y != 0);

// Результат в обратном порядке

printf("\n Decimal number \"%ld\" 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;

} while (z != 0);

// Результат в обратном порядке

printf("\n Decimal number \"%ld\" has a hexadecimal equivalent:\n", zz);

for (--i; i >= 0; --i) { next = Num[i];

printf("%2c", digits_16[next]);

}

}

307

//Подключаемый файл 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, позволяет подключать необходимые файлы как в текущей папке (директории).

308

Возможный результат выполнения программы представлен на рис.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);

309

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);

310

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]