Контрольные вопросы для подготовки и самостоятельной работы
1 Приведите общий формат объявления функции.
2 Приведите формат определения функции.
3 Какие классы памяти используются при объявлении функций.
4 Охарактеризуйте формальные параметры приведенных функций.
5 Что означает запись FILE *?
6 Что означает термин-поток?
7 Какие стандартные потоки открываются при выполнении программы?
8 Какие существуют режимы работы с файлами?
9 Какие заголовочные файлы содержат объявления библиотечных функций для работы с потоками.
10 Какие функции обеспечивают форматированный ввод/вывод данных?
11 Что такое буферизация и можно ли ею управлять?
Лабораторная работа № 18
Разработка программ с многофайловой структурой.
Заголовочные файлы. Классы памяти переменных и функций
(4 часа)
Цель работы: ознакомиться с написанием программ с многофайловой структурой, заголовочными файлами, изучить классы памяти переменных и функций, научиться создавать модульные программы и заголовочные файлы. Изучить область действия и время жизни переменных и функций с различными классами памяти.
Теоретические сведения
Управление многофайловыми проектами
Поскольку большинство программ состоит из нескольких файлов, желательно иметь возможность автоматической идентификации тех файлов, которые должны быть перекомпилированы и скомпонованы. Эти и многие другие обязанности выполняет встроенный администратор (менеджер) проектов системы Borland C.
Администратор проектов позволяет задавать те файлы, которые относятся к описываемому проекту. Когда осуществляется перекомпиляция проекта, администратор проектов автоматически обновляет информацию, которая хранится в файле проекта. В файл проекта входит следующая информация:
|
- имена всех файлов, входящих в проект;
- пути для поиска файлов;
- какие файлы зависят от других файлов, какие должны быть откомпилированы в первую очередь (решаются вопросы, касающиеся автоматически отслеживаемых зависимостей);
- какие компиляторы и параметры командной строки должны использоваться при создании каждой из частей программы;
- куда следует поместить результирующую программу;
- размер кода, размер данных и число строк, полученных в результате последней компиляции.
Использование администратора проектов
Использование администратора проектов не представляет затруднений. Для построения проекта следует:
- выбрать имя файла проекта (с помощью команды Project|Open Project);
- добавить к проекту имена исходных файлов (с помощью команды Project| Add Item);
- задать системе Borland C компиляцию файла (с помощью команды Compile|Make EXE).
Затем, когда в меню Project станут доступны команды ведения проекта, можно:
- добавлять имена файлов в проект или удалять их из него;
- задавать параметры файла, входящего в проект;
- просматривать содержимое файлов, включенных в конкретный проект.
Пример работы с администратором проектов.
Имеется программа, которая состоит из основного исходного файла с именем mymain.c, дополнительного файла myfuncs.c, содержащего определения функции и данные, обращения к которым имеются в основном файле, и файла myfuncs.h, где находятся объявления функций.
Файл mymain. c выглядит следующим образом:
#include <stdio.h> // заголовочный файл в стандартном каталоге
|
#include "myfuncs.h" // заголовочный файл в активном каталоге
main (int argc, char *argv[ ]) // передача в функцию main() параметров из //окружающей среды: argc – количество параметров, argv[i] - массив строковых //параметров, разделённых пробелом, argv[о] – имя программы
{
char *s; // класс памяти по умолчанию auto
if (argc > 1)
s = argv[1]; // выбор второго строкового параметра из массива
else
s = " вселенной"; // инициализация указателя строковой константой
printf("%s %s.\n",GetString(),s); // вывод результирующей работы функции
// GetString() и строки, связанной с указателем s
}
Файл myfuncs.c выглядит следующим образом:
char ss[] ="Приют на границе"; // массив ss[ ] проинициализирован строковой
// константой
char *GetString(void); // определение функции
{
return ss; // доступ к массиву из функции разрешён, т.к. класс памяти по
// умолчанию extern
}
А файл myfuncs. h выглядит следующим образом:
extern char *GetString(void); // класс памяти глобальный - extern.
Пример
/* ЗАНЯТИЕ N18
lab18.cpp - Основной файл проекта
Разработал Петров Ю.В.
Объявить глобальные переменные r (extern) и f (extern и static),
а также локальные переменные.
Объявить в отдельном файле функции, выполняющие работу с переменными
с различными классами памяти. Определение функций также разместить
в отдельных файлах. Выполнить инициализацию переменных. Вывести
значения рассчитанных глобальных и локальных переменных на экран */
#include <iostream.h>
#include <conio.h>
#include "my_18.h"
int r=5; //Глобальная переменная r
extern float f; //Глобальная переменная f = 0
void main()
{ auto int r; // Локальная переменная (auto) r
r = Sum_Variable(4, 5); //Функция объявлена в файле "my_18.h" r=9
|
clrscr();
cout << "Локальная (auto) r=\t" << r << " Глобальная r="<<::r << endl;
r+=10; //Локальная переменная r=19
::r = Sum_Variable(4, 3); //Глобальная переменная::r=7
cout << "Локальная (auto) r=\t" << r << " Глобальная r=\t"<<::r << endl;
cout << "Глобальная f=" << f;
cout << endl << " Локальная (auto) f=\t" << Function_1()
<< " Статическая (static) f=\t" << Function_2();
cout << endl << " Локальная (auto) f=\t" << Function_1()
<< " Статическая (static) f=\t" << Function_2();
cout << endl << " Локальная (auto) f=\t" << Function_1()
<< " Статическая (static) f=\t" << Function_2();
getch();
}
/* Локальная (auto) r= 9 Глобальная r= 5
Локальная (auto) r= 19 Глобальная r= 7
Глобальная f= 0.2
Локальная (auto) f= 8 Статическая (static) f= 2
Локальная (auto) f= 8 Статическая (static) f= 3
Локальная (auto) f= 8 Статическая (static) f= 4 */
// lab18f1.cpp – первый вспомогательный файл проекта
// Объявление переменной r и определение функций
extern r; // Глобальная переменная r
float Function_1()
{ auto float f= r; // Локальная переменная f
return ++f;
}
int Sum_Variable(int a, int b)
{return a + b;
}
// lab18f2.cpp – второй вспомогательный файл проекта
//Определение функции
static float f=1;//Статическая переменная (static) f
float Function_2()
{ return ++f;
}
// my_18.h – заголовочный файл
//Объявление переменных и функций
int Sum_Variable(int, int);
float Function_1();
float Function_2();
static float f = 0.2;
Ход работы
1 Изучить теоретические сведения.
2 В соответствии с индивидуальным заданием разработать алгоритм и программу, содержащую заголовочный файл и несколько модулей (2-3).В каждом модуле разработать отдельные функции.
3 Выполнить объявление переменных на внешних и внутренних уровнях с различными классами памяти.
4 Разработать функции, вызываемые из дополнительных модулей. Использовать объявленные переменные с различной областью действия (классами памяти).
5 Создать заголовочные файлы, содержащие информацию о функциях в дополнительных модулях.
6 Написать основную программу, подключающую необходимые заголовочные модули и использующую функции и переменные из других модулей.
7 Показать изменение переменных в различных областях действия.
8 Проверить доступ к переменным с различными классами памяти (внутри блока, модуля и в других модулях).
9 Как ограничивается доступ к членам класса? Как ограничивается доступ к членам класса?
10 Проверить выполнение инициализации переменных с классом памяти static, объявленных на внешнем уровне и внутри функции при нескольких вызовах.
11 Проверить доступ к функциям, объявленным с различными классами памяти.
12 Разработать функции, имеющие одно имя и различные области действия. Осуществить вызов этих функций.
13 Набрать программу на компьютере, и устранить ошибки.
14 Получить результат.
15 Оформить отчет.
16 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.
Индивидуальное задание к лабораторной работе №18
Составить проект для многофайловой структуры программы. Разработать заголовочный файл содержащий глобальные данные и объявления внешних функций. Разработать вспомогательный файл содержащий определения внешних функций и объявления и переопределения данных.
Проект должен содержать:
- объявление и использование глобальных и локальных переменных;
- передача глобальных данных в качестве параметров функций;
- переопределение глобальных данных внутри функций;
- вызов из вспомогательного файла внешней функции;
- вызов из основного файла внешних функций;
- переопределение функций во вспомогательных файлах.
Индивидуальные задания находятся в таблицах 18.1 и 18.2
Таблица 18.1 – индивидуальные задания
Варианты | Структура проекта |
1-10 | основной файл 2 вспомогательных файла заголовочный файл |
11-20 | основной файл 3 вспомогательных файла заголовочный файл |
21-30 | основной файл 4 вспомогательных файла |
Таблица 18.2 - индивидуальные задания
Вариант | функция c классом памяти static | внешняя функция | переопреде ленная функция | локаль ные данные | внешние данные | переопре деленные данные |
1,11,21 | auto int first (int, float) | void second (int *,float *) | static float *first(float) | auto int var1 | const float var2 | static long int var1 |
2,12,22 | auto cdecl int first (int, float) | void second (int *,float *) | static pascal char *first(int,…) | auto long unsigned int var1 | double var2 | static float var1 |
3,13,23 | near auto int first (int, float) | void far second (int *,float *) | huge static int *first(double) | auto int var1 | extern float var2 | static short unsigned int var1 |
4,14,24 | auto int first (near int, near float) | far void * pascal near second (far int *,far float *) | static unsigned int *first(char) | near auto double var1 | extern unsigned short int var2 | static char var1 |
5,15,25 | pascal auto int first(int) | char far * (far * second) (int *,float *) | cdecl static far short int *first(float, float) | register char var1 | far double var2 | static int var1 |
6,16,26 | cdecl auto int first(int, float) | extern near void * second (int *,float *) | static near double * first(void, …) | auto long int var1 | float var2 | static double var1 |
7,17,27 | huge auto int first(near int *, far int *) | extern void second (int *,float *) | near static float *first(void) | register int var1 | extern near float var2 | near static double var1 |
8,18,28 | far int * auto pascal huge first(huge int, huge float) | void second (int *,float *) | static short int *first(float *) | huge int var1 | far double var2 | static long unsigned int var1 |
9,19,29 | auto int first(int, float) | near void * extern far pascal second (int *,float *) | static float *first(float) | auto int var1 | far extern float var2 | near static char var1 |
10,20,30 | auto far int * (first)(int *, …) | void second (int *,float *) | int far * pascal far first() | auto float var1 | extern huge float var2 | extern long int var1 |
Требования к содержанию отчёта приведены в лабораторной работе №1.
Контрольные вопросы для подготовки и самостоятельной работы
1 Какие классы памяти (КП) допустимы применительно к переменным и функциям?
2 Какие классы памяти используются для переменных и функций по умолчанию?
3 Назовите область действия и время жизни данных и функций с различными классами памяти.
4 Можно ли использовать переменные с КП register в левой части выражения присваивания?
5 В каких случаях можно использовать переменные, а также функции с одинаковыми именами?
6 Можно ли переобъявить переменную во вложенных блоках? Какова область действия таких переменных?
7 Можно ли получить доступ к глобальной переменной в блоке, где объявлена локальная переменная с тем же именем?
8 Производится ли инициализация переменных с различными классами памяти?
9 Сколько раз производится инициализация переменных с КП static, объявленных в теле функции?
10 Какую информацию содержат заголовочные файлы и где они находятся?
11 Как предотвратить повторное включение заголовочных файлов в нескольких модулях?
Лабораторная работа № 19
Изучение графических средств С
(2 часа)
Цель работы: приобрести практические навыки в использовании графических функций языка С.
Теоретические сведения
Графические функции предназначены для управления видеорежимами работы дисплея, выводом графической информации на экран.
Графические функции
void far detectgraph(int far *graphdriver, int far *graphmode); – определение доступного видео-драйвера.
void far initgraph(int far * graphdriver, int far *graphmode, char far *pathtodriver); - установка видеорежима.
vo id far setgraphmode(int mode); - установка видеорежима.
void far restorecrtmode(void); - временный переход из графического видеорежима в текстовый.
void far closegraph(void); - закрытие графической системы.
void far setvisualpage(int page); - установка активной видеостраницы.
void far setactivepage(void); -вывод на активную видеостраницу.
int far getmaxx(void); - определение максимального значения координаты х.
int far getmaxy(void); - определение максимального значения координаты у.
void far setviewport(int left, int top, int right, int botton, int clip); - установка нового графического окна.
void far getviewsettings(struct viewporttype far *viewport); - получение параметров текущего окна.
void far moveto(int x, int y); void far moverel(int dx, int dy); - перемещение текущей графической позиции в координаты x, y или на величину dx, dy.
void far setlinestyle(int linestyle, unsigned upattern, int thickness); - установка типа линии.
i nt far getx(void); - получить текущую графическую позицию (х).
int far gety(void); - получить текущую графическую позицию (у).
void far clearviewport(void); - очистка текущего графического окна.
void far cleardevice(void); - очистить активную видеостраницу.
int far getmaxcolor(void); -определить максимальное количество цветов.
void far setpalette(int colornum, int color); - установка палитры.
void far setbkcolor(int color); -установка цвета фона.
Доступ к пикселям
unsigned far getpixel(int x, int y); - получить текущие параметры пикселя.
void far putpixel(int x, int y, int color); - вывести пиксель с параметрами.
Графические примитивы
void far bar(int left, int top, int right, int botton);
void far bar3d(int left, int top, int right, int botton, int depth, int topflag);
void far fillpoly(int numpoints, int far *polypoints);
void far fillelipse(int x, int y, int xradius, int yradius);
void far pielipse(int x, int y, stangle, int endangle, int radius);
void far sector(int x, int y, int stangle, int endangle, int xradius, int yradius);
void far line(int x1, int y1, int x2, int y2);
void far linerel(int dx, int dy);
void far lineto(int x, int y);
void far rectangle(int left, int top, int right, int botton);
void far drawpoly(int numpoints, far *polypoints);
void far circle(int x, int y, int radiuces);
void far arc(int x, int y, int stangle, int endangle, int radius);
void far ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius);
Пример
/* ЗАНЯТИЕ N 19
Разработал Гармаш В.Н.
Объявить массивы для вывода текста в графическом режиме,
выполнить их инициализацию. Инициализировать графический режим работы.
Выполнить расчеты и построить заданную геометрическую фигуру.
Вывести тексты на экран с применением необходимых функций. */
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <DOS.H>
#define ANGLES 15
#define PIXEL_COUNT 1000
#define DELAY_TIME 100 /* in milliseconds */
char *str[]={"А","л","ь","ф","а"," ","Ц","е","н","т","а","в","р","а","."};
char st[]="_";
void demo(int x,int y,int size,int color);
void demo1(void);
void main()
{// Инициализация графического режима работы
int graphdriver=DETECT,graphmode,errorcode;
initgraph(&graphdriver,&graphmode,"");
errorcode = graphresult();
if (errorcode!= grOk)
{ printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
//Рисование рамки по контуру экрана
setcolor(9); //Установка цвета
setlinestyle(0,0,3); //Установка типа линии
line(0,0,getmaxx(),0); // Рисование линии
line(0,0,0,getmaxy());
line(getmaxx(),0,getmaxx(),getmaxy());
line(0,getmaxy(),getmaxx(),getmaxy());
setcolor(10); // Вывод текста "ЗАДАНИЕ 19"
settextstyle(GOTHIC_FONT,HORIZ_DIR,4);
outtextxy(260,10,"ЗАДАНИЕ 19");
demo(320,250,125,11); // Функция вывода рисунка
demo1(); // Функция вывода текста "Альфа Центавра"
getch();
closegraph(); // Окончание графического режима работы
clrscr();
}
void demo(int x,int y,int size,int color)
{ setcolor(color);
setlinestyle(0,0,1);
int xx[ANGLES],yy[ANGLES],i,j;
for (i=0;i<=ANGLES-1;i++)
{ xx[i]=x+(int)(cos(i*2*M_PI/ANGLES)*size);
yy[i]=y-(int)(sin(i*2*M_PI/ANGLES)*size);
}
for (i=0;i<=ANGLES-1;i++)
{ for (j=0;j<=ANGLES-1;j++)
if (i!=j)
{ line(xx[i],yy[i],xx[j],yy[j]);
}
}
}
void demo1(void)
{ int f1 = installuserfont("rtri.CHR"); //Установка шрифта
unsigned int sz;
void far *ptr;
sz=imagesize(10,10,50,50);
ptr=malloc(sz);
getimage(10,10,50,50,ptr);
int size = 2,tt,ff,i;
while(!kbhit())
{ tt=0;
settextstyle(DEFAULT_FONT, HORIZ_DIR, size);
for(i=0; i<3; i++)
{ setcolor(3); outtextxy(260,60,st); delay(90);
setcolor(0); outtextxy(260,60,st); delay(90);
}
setcolor(3); ff=260;
for(i=0; i<15; i++)
{ setcolor(3);
settextstyle(f1, HORIZ_DIR, 4);
outtextxy(260+tt, 50, str[i]);
tt+=textwidth(str[i]);
sound(30); delay(20); nosound();
settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);
outtextxy(260+tt+4, 60, st); delay(40);
setcolor(0);
outtextxy(260+tt+4, 60, st); delay(10);
}
settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);
for(i=1;i<4;i++)
{ setcolor(3); outtextxy(260+tt+4, 60, st); delay(90);
setcolor(0); outtextxy(260+tt+4, 60, st); delay(90);
}
setcolor(3);
ff=tt+260; tt=0;
for(i=14;i>=0;i--)
{ settextstyle(f1, HORIZ_DIR, 4);
tt+=textwidth(str[i]);
sound(30); delay(20); nosound();
putimage(ff-tt, 50, ptr, COPY_PUT);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);
setcolor(3); outtextxy(ff-tt-4, 60, st); delay(40);
setcolor(0); outtextxy(ff-tt-4, 60, st); delay(10);
}
}
}
Ход работы
1 Изучить теоретические сведения.
2 В соответствии с индивидуальным заданием разработать алгоритм решения задачи и оформление интерфейса программы.
3 Подготовить и разметить на экране эскиз чертежа детали в масштабе 1:1.
4 Составить программу с использованием графических функций языка С для вывода на экран подготовленной графической информации. Размеры, указанные на чертеже, ввести с клавиатуры.
5 Набрать программу на компьютере и устранить ошибки.
6 Получить результат.
7 Оформить отчет.
8 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по теме.
Индивидуальное задание к лабораторной работе №19.
Варианты индивидуальных заданий находятся в таблице 19.1.
Таблица 19.1 - индивидуальные задания
Вариант | Номер рисунка | Вариант | Номер рисунка |
а | г | ||
б | д | ||
в | е | ||
г | ж | ||
д | з | ||
е | и | ||
ж | к | ||
з | л | ||
и | м | ||
к | а | ||
л | б | ||
м | в | ||
а | г | ||
б | д | ||
в | е |
Рисунок 19.1 - индивидуальные задания