Структура – это объединение в одной инфоомационной сфере - переменной, данных разных типов, принадлежащих одному объекту предметной области решаемой задачи
Определить структурный тип можно следующим образом:
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) –позволяет задать цвет фона и символа одновременно, параметры задаются битовой матрицей
Textmode(int mode) –позволяет изменить текстовый режим.
Mode
|
|
|
|
C80
|
| Цветной
| 80 символов/строка
|
C40
|
| 80 символов/строка
|
C4350
|
| 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).