
Структуры и объединения.
Структура – это объединение в одной инфоомационной сфере - переменной, данных разных типов, принадлежащих одному объекту предметной области решаемой задачи
Определить структурный тип можно следующим образом:
typedef struct
{
Определение_элементов_структуры;
Имя_структурного_типа;
}
Пример: Имеется информация о студентах факультета. Информация включает в себя: фамилию и инициалы студента, курс, группу, оценку по пяти предметам. Обеспечить возможность ввода данных и сохранения их на диске, вывод информации о студентах заданной пользователем группы.
#include <stdio.h>
#include <conio.h>
struct student
{
int kurs,group;
float s[5];
};
FILE *f;
void input()
{
student st;
char s=”\0”;
clrscr(); //Очистка экрана
f=fopen(“students.dat”, “rb+”);
if(f)
{
do
{
fflush(stdin);
printf(“\nФайл существует! Выберите действие:\n”);
printf(“0 – создать файл заново\n”);
printf(“1 – добавить данные в существующий файл\n”);
printf(“2 – отказаться от ввода\n”);
s = getch();
if(s=='0');
f=fopen(“students.dat”,”wb+”);
else
if(s=='1')
f=fopen(“students.dat”,”ab+”);
while(s!='0' && s!='1' && s!='2');
}ф
else f=fopen('students.dat”,”wb+”);
if(s!='2')
{
do
{
fflush(stdin);
printf(“\nФамилия ИО:”); gets(st.FIO);
printf(“\nКурс:”);scanf(“%d”,&st.kurs);
printf(“\nГруппа:”);scanf(“%d”,&st.group);
for(int i=0;i<5,i++)
scanf(“%f”,&st.s[5]);
fwrite(&st,sizeof(st),1,f);
printf(“\nПродолжить ввод?[д/н]:”);
fflush(stdin);
s=getchar();
}
while(s=='д' || s=='Д');
fclose(f);
f=fopen(“students.dat”,”rb”);
if(!f)
{
printf(“Нет данных! Нажмите любую клавишу...”);
getch();
}
else
{
printf(“Укажите курс:”); scanf(“%d”,%kurs);
printf(“ и группу:”); scanf(“%d”,&group”);
clrscr();
printf(“Фамилия ИО Курс Группа Оценки\n”);
int k=0:
while(fread(&st,sizeof(st),1,f))
if(st.kurs==kurs && st.group=group);
{
printf(“\n|%-25s|%2d|%3d|”,st.FIO,st.kurs,st.group);
for(int i=0,i<5,i++)
printf(“%6.2f”,st.s[i]);
printf(“\”);
k++;
if(k%21==0)
{
printf(“\nНажмите любую клавишу!”);
getch();
gotoxy(1,4);
}
}
printf(“\nНайдено %d записей”,k);
}
fclose(f);
}
Объединение
Объединение — это аналог структуры, в которой элементы разделяют одну и ту же область памяти, то есть в любой момент времени может быть доступен только один элемент объединения. Для переменной типа объединения выделяется памяти столько, сколько требует ее наибольший элемент. Синтаксис описания объединения
union[имя_типа_объединения]
{
тип 1 имя1.1,...,имя 1.k;
тип n имя n.1,...,имя n.m;
} [имя_переменной1,..., имя_переменной2];
#include <stdio.h>
struct type_data
{
unsigned char day, month;
int year;
}
union u1
{
long int l;
type_data data;
};
Void main()
{
u1, d1, d2;
printf (“\nВведите первую дату:\n”);
scanf (“\n%ld %d %d”, &d1.data.day, &d1.data.month, &d1.data.year);
printf (“\nВведите вторую дату:\n”);
scanf (“\n%ld %d %d”, &в2.data.day, &d2.data.month, &d2.data.year);
if (d2.l > d1.l) printf (“\n d2 > d1”);
else if (d2.l < d1.l) printf (“\n d2 < d1”);
else printf (“\n d2 = d1”);
Управление экраном в текстовом режиме в среде MS-DOS
В текстовом режиме (по умолчанию) экран разбит на 25 строк по 80 символов в строке. Левый верхний угол имеет координаты (1,1). Устройством ввода (по умолчанию) является клавиатура.
Функции, обеспечивающие работу с экраном в текстовом режиме собраны в модуле conio.h.
Window(int x1, int y1, int x2, int y2) – устанавливает на экране окно. После вызова функции часть экрана вне окна становится недоступной. Левый верхний угол окна имеет координаты (1,1).
Clrscr() – очищает экран или текущее окно, заполняет его цветом фона и перемещает курсор в левый верхний угол экрана или окна.
Textbackground(int color) - Цвет фона символа (от 0 до 7)
Textcolor(int color) – устанавливает цвет символа (от 0 до 15)
Textattr(int attr) – позволяет задать цвет фона и символа одновременно, параметры задаются битовой матрицей
M |
Ф |
Ф |
Ф |
С |
С |
С |
С |
Textmode(int mode) – позволяет изменить текстовый режим.
Mode |
|
|
|
C80 |
3 |
Цветной |
80 символов/строка |
C40 |
1 |
80 символов/строка |
|
C4350 |
64 |
43/50 строк по 80 симв |
|
LASTMODE |
-1 |
Предыдущий режим |
Highvideo();lowvideo();normvideo(); - устанавливает яркость символов повышенное/пониженное/нормальное
int gettext(int x1, int y1,int x2,int y2, void *buf) — копирует текст с части экрана определенного левым верхним и правым нижним координатами в буфер.
int gettext(int x1, int y1,int x2,int y2, void *buf) — выводыит на экран текст из буфера, ту его часть, которая задана координатам(см. пр)
Текст сохраняется и выводится вместе со своими атрибутами, поэтому каждый символ экрана требует в буфере два байта.
Delline() - удаляется строка, на которой расположен курсор; строки, находящиеся ниже поднимаются.
Insline() - вставляет строку в то место, где находится курсор.
gotoxy(int x, int y) — перемещает курсор на указанную позицию
wherex(), wherey() - где находится курсор.
Int kbhit() - возвращает не ноль, если была нажата клавиша на клавиатуре
Работа в графическом режиме
Работа в графическом режиме предоставляется функциями модуля graphics.h, которую реализует Borland Graphic Interface (BGI).
Для подключения графики необходимо подключить опцию Options Linker Libralies Graphics libraly
Для постраничного режима необходимо задать следующие значения параметров:
void for initgraph (int far *graphdrive, int far *graphmode, char far *path); — инициализирует графический режим определенный двумя первыми параметрами graphdrive — собственный режим (по умолчанию graphdrive = DETECT) graphmode — режим VGA с одной страницы видео памяти и разрешением 640х480 pixels.
graphdriver = VGA // 9, graphmode=VGAMED // 1
path — строка, задающая путь к файлу egavga.bgi
Драйверы находятся в папке BGI. После вызова функции экран очищается, невидимый курсор помещается в левый верхний угол экрана с координатами (0,0).