
Лаб по С и С++ / Лаб_С_№ 18
.doc
/*ТЕМА: СТРУКТУРЫ (STRUCT)
ЦЕЛЬ РАБОТЫ
Изучить материал и продемонстрировать умение работать со структурами в том числе:
1. описать шаблон структуры (в том числе вложенные структуры, структуры, содержащие объединение);
2. уметь объявить структурную переменную, массив структур, указатель на структуру, массив указателей на структуру;
3. уметь обращаться к полям структуры через имя структуры, указатель на структуру, элемент массива структур;
4. максимально просто копировать поля одной структуры в другую (пример 1);
5. максимально быстро осуществлять ввод (вывод) одной и более структур из файла (в файл) и хранить информацию в файле с минимальными затратами места на диске (функции fread, fwrite или read, write);
6. уметь передать структуру в функцию через параметры функции и, возможно, передать структуру в качестве результата;
7. уметь отсортировать массив структур, используя функцию qsort.
ПРИ НАПИСАНИИ ПРОГРАММЫ
1. Взять за основу программу оконного интерфейса.
2. Исходить из принципа модульного программирования:
2.1. отдельные функции должны быть написаны в соответствии с основными принципами построения функции (каждая функция решает только одну задачу, исходные данные передаются через параметры, результат всегда передается в вызывающую функцию);
2.2. разбить весь текст на раздел описаний и раздел реализаций. Раздел описаний (файл с расширением *.h) содержит заголовочные файлы, макроопределения, описания внешних переменных, прототипы собственных функций. Раздел реализаций (один или несколько файлов с расширением *.с) содержит тексты самих функций. Сборку программы производить с помощью файла проекта (пункт меню Project в BC или TC), на стадии отладки можно подключать файлы с помощью соответствующей директивы препоцессора.
3. Написать по тексту комментарии, особенно в файле описаний.
ПРИ ЗАЩИТЕ РАБОТЫ
1. Уметь выполнить программу.
2. Изложить узловые моменты и особенности алгоритма.
3. Дать объяснение любому оператору программы по требованию преподавателя.
СТРУКТУРЫ
Успех программы часто зависит от удачного выбора способа представления данных. С помощью структур возможно моделировать сложные объекты, возникающие при решении задач. Структуры представляют средство для доступа к записям, которые содержат поля одного или нескольких типов.
Для использования структуры необходимо:
1. установить шаблон для структуры
2. объявить переменную, соответствующую этому шаблону
3. осуществить доступ к компонентам структуры.
Шаблон структуры
Шаблон - это схема, описывающая содержание структуры.Установка структурного шаблона телефонный справочник:
struct sprav {
char fio[20];
long num;
};
Данный шаблон описывает структуру с именем типа структуры sprav, состоящую из двух компонентов: строки fio и целой переменной num типа long. Имя типа структуры sprav необязательно и используется для ссылки на эту структуру. Компоненты структуры - данные любого типа, включая и другие структуры. Имя внутри структуры может быть таким же, как имя объекта вне структуры. Если шаблон описан внутри функции - он доступен только этой функции, если шаблон описан вне функции - он доступен любой
функции программы. Установка шаблона не вызывает никаких действий в программе.
Структурные переменные
Объявление структурных переменных приводит к выделению памяти для компонент структуры, куда можно записать данные или откуда можно прочитать их. Для объявления структурных переменных имеются несколько способов.
1. Установить структурный шаблон:
struct sprav {
char fio[20];
long num;
};
Объявить простую переменную, массив структур, указатель на структуру: struct sprav tel1, tel2[5], *tel3;
2. Установить структурный шаблон с помощью макроопределения:
#define SPRAV struct sprav
SPRAV {
char fio[20];
long num;
};
Объявить переменные:
SPRAV sp1, sp2[6], *sp3;
3. Объявить переменные одновременно с установкой шаблона (если на данную структуру вы больше не ссылаетесь):
struct {
char fio[20];
long num;
} tel1, tel2[3], *tel3;
4. Ввести новый тип данных (TEL)-структура определенного вида:
typedef struct {
char fio[20];
long num;
} TEL;
Объявить переменные нового типа:
TEL tel1, tel2[6], *tel3;
Если программа достаточно объемна, представляется более удобным четвертый способ.
Инициализация структуры
Инициализировать можно только внешние или статические структуры.
static struct {
char fio[20];
long num;
} tel[2]={
"Иванов Ф.А.", 456756,
"Петров В.П.", 632345
};
Доступ к компонентам структуры
Доступ к компонентам структуры продемонстрируем с помощью примеров.
Пример 1.
/* Обращение к элементам структуры через имя переменной */
#include <stdio.h>
#include <conio.h>
void main(void)
{
struct{
char fio[20]; /* фамилия */
long num; /* телефон */
} tel1, tel2;
clrscr();
puts("введите фио абонента-");
gets(tel1.fio);
puts("введите его номер-");
scanf("%ld",&tel1.num);
tel2=tel1; /* нельзя так же сравнивать структуры */
puts("Введено:");
printf("Фамилия :%s номер: %ld\n",tel2.fio,tel2.num);
}
Пример 2.
/* Динамическое выделение памяти для структуры */
/* Обращение к элементам структуры через указатель */
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
struct sprav {
char fio[20];
long num;
};
void main(void)
{
struct sprav *tel1, *tel2;
clrscr();
/* Выделение памяти для структуры */
tel1=(struct sprav *)malloc(sizeof(struct sprav));
tel2=(struct sprav *)malloc(sizeof(struct sprav));
puts("введите фио абонента-");
gets(tel1->fio);
puts("введите его номер-");
scanf("%ld",&tel1->num);
*tel2= *tel1;
puts("Введено:");
printf("Фамилия :%s номер: %ld\n",(*tel2).fio,(*tel2).num);
}
Массив структур
Пример 3.
/* Массив структур. Обращение к элементам структуры через */
/* имя элемента массива */
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define SPRAV struct sprav
void main(void)
{
SPRAV{
char fio[20];
long num;
};
SPRAV tel[5]; /* массив структур - 5 элементов */
char fio_tek[20];
int i;
clrscr();
/* ввод данных в массив структур */
for(i=0; i<5; i++)
{
puts("введите фио абонента-");
gets(tel[i].fio);
puts("введите его номер-");
scanf("%ld",&tel[i].num);
getchar();
}
puts("Выбор телефона по фамилии");
gets(fio_tek);
/* поиск структуры по фамилии абонента */
for(i=0; i<5; i++)
if(!strcmp(fio_tek,tel[i].fio)) break;
if(i!=5) /* цикл закончен по break */
printf("номер абонента %s равен %ld\n",fio_tek, \
tel[i].num);
else /* цикл выполнился полностью */
puts("Абонент не найден");
}
Пример 4.
/* Массив структур. Память выделяется динамически. */
/* Обращение к элементам структуры через указатель */
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <alloc.h>
typedef struct{
char fio[20];
long num;
} TEL;
void main(void)
{
TEL *tel;
char fio_tek[20];
int i;
clrscr();
/* Выделение памяти для массива - 3 элемента */
tel=(TEL *)malloc(sizeof(TEL)*3);
for(i=0; i<3; i++)
{
puts("введите фио абонента-");
gets((tel+i)->fio);
puts("введите его номер-");
scanf("%ld",&(tel+i)->num);
getchar();
}
puts("Выбор телефона по фамилии");
gets(fio_tek);
for(i=0; i<5; i++,tel++)
if(!strcmp(fio_tek,tel->fio)) break;
if(i!=5)
printf("номер абонента %s равен %ld\n",fio_tek, \
tel->num);
else
puts("Абонент не найден");
}
Передача структуры в функцию
Непосредственный доступ к компонентам структуры - плохой стиль программирования. Все операции, которые разрешены применительно к структуре, должны быть при этом реализованы в виде отдельных функций. Не все компиляторы языка Си позволяют передавать структуры в функцию по значению, поэтому в примерах передача структуры идет через указатель.
Пример 5.
/* Передача структуры в функцию через указатель на структуру */
/* Определение комплексного числа через структуру и действия */
/* над комплексными числами ( ввод, вывод, вычисление суммы) */
#include <stdio.h>
typedef struct { float a; /* действительная часть */
float b; /* мнимая часть */
} COMPLEX;
void vvod(COMPLEX *,float,float);
void sum(COMPLEX *,COMPLEX *,COMPLEX *);
void out(COMPLEX *);
void main(void)
{
COMPLEX x,y,z;
vvod(&x,2.5,6.7);
vvod(&y,6.89,8.45);
puts("Введены числа:");
out(&x);
out(&y);
sum(&x,&y,&z);
puts("Сумма комплексных чисел равна:");
out(&z);
}
/* Вывод комплексного числа */
void out( COMPLEX *p)
{
printf("(%.2f,%.2f)\n", (*p).a,(*p).b);
return;
}
/* Вычисление суммы двух комплексных чисел */
void sum(COMPLEX *p1,COMPLEX *p2,COMPLEX *p3)
{
(*p3).a=(*p1).a+(*p2).a;
(*p3).b=(*p1).b+(*p2).b;
return;
}
/* Ввод значений для элементов структуры */
void vvod(COMPLEX *p,float a, float b)
{
p->a=a;
p->b=b;
return;
}
Вложенные структуры
Структура, являющаяся компонентом другой структуры, называется вложенной.
Пример 6.
/* Даны четыре точки - центры четырех окружностей. Заполнить структуру окружность, если все окружности проходят через начало координат. */
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
struct POINT {
float x;
float y;
};
struct CIRCLE {
struct POINT point; /* вложенная структура */
double r;
} circle[2], *p;
void main (void)
{
int i,j;
float a,b,c,d;
clrscr();
gotoxy(17,1);
cputs("ВВЕДИТЕ КООРДИНАТЫ ТОЧЕК :\r\n");
for(i=0;i<2;i++)
{
cprintf ("\n\n ВВЕДИТЕ X: ");
cprintf ("X[%d]= ",i+1);
cscanf("%f",&circle[i].point.x);
cprintf ("\n ВВЕДИТЕ Y: ");
cprintf ("Y[%d]= ",i+1);
cscanf ("%f",&circle[i].point.y);
}
p=circle;
gotoxy(17,12);
cputs("РЕЗУЛЬТАТ:\r\n\n");
for(i=0;i<2;i++)
{
a=p->point.x;
b=p->point.y;
c=sqrt(a*a+b*b);
p->r=c;
cprintf("\nРАДИУС : %lf ЦЕНТР (%f,%f)\r\n",p->r,a,b);
p++;
}
}
ЗАДАНИЕ
Общая формулировка для всех вариантов
Определить шаблон структуры на заданную тему, состоящий из полей различного типа. Создать файл с базой данных, состоящий из структур описанного шаблона (использовать функции fwrite и fread или функции системного ввода/вывода). Количество структур, если не оговорено особо, в пределе 10.
Вариант 1
Используя прямой доступ к видеопамяти, вывести каждую структуру из файла на экран, располагая каждое поле ровным столбцом (количество структур меньше 20). Изменяя байт атрибута в текущей строке организовать выбор нужной структуры с помощью клавиш "стрелка вверх" и "стрелка вниз" (аналогично меню). При нажатии на клавишу "ввод" экран очищается и остается только выбранная структура.
Вариант 2
Структуры вводятся в память (можно не создавать файла с базой данных) в виде однонаправленных связанных списков. Предоставить пользователю возможность вывода всех структур из списка на экран и в файл в отформатированном виде.
Вариант 3
Используя прерывание, вывести структуры из файла на разные страницы видеопамяти в зависимости от первого символа поля строка. В меню предусмотреть пункты "активна 1стр", и пр. для просмотра результата.
Вариант 4
Произвести ввод структур в файл, организовав тщательный контроль за вводом по полю целого типа:
1. по количеству введенных символов;
2. по качеству введенных символов (цифры, буквы, пробелы и пр.).
После обработки ввода вывести на экран получившееся число с предложением пользователю внести изменения. Предоставить возможность пользователю согласиться или отказаться от изменений.
Вариант 5
Считать базу данных из файла в массив структур, вывести ее на экран, использую функции консольного вывода. Массив структур организовать таким образом, чтобы память под каждую структуру выделялась динамически по мере необходимости. Отсортировать массив структур по возрастанию поля целого типа, вывести полученный массив структур на экран.
Вариант 6
Произвести удаление и замену структуры непосредственно в файле базы данных, не использую массивов структур и вспомогательных файлов. Предоставить возможность вывода базы на экран.
Вариант 7
Структуры вводятся в память (можно не создавать файла с базой данных) в виде однонаправленных связанных списков. Предоставить пользователю возможность вывода всех структур из списка на экран и удаления структуры из списка.
Вариант 8
Описать шаблон структуры, используя объединение нескольких структур (например, база данных, содержащая три вида документов с разными характеристиками). Создать базу данных в файле. Произвести выборку документов одного типа (по запросу) в другой файл в отформатированном виде.
Вариант 9
Заполнить статический массив структур из файла с базой данных и отсортировать его по убыванию поля целого типа. Вывести массив структур до и после сортировки, делая задержку при полном заполнении экрана (количество записей не менее 30).
Вариант 10
Произвести выборку структур из файла с базой данных по указанным ключам
Вариант 11
Произвести ввод структур в файл, организовав тщательный контроль за вводом по полю типа float или double:
1. по количеству введенных символов;
2. по качеству введенных символов (цифры, буквы, пробелы и пр.).
После обработки ввода вывести на экран получившееся число с предложением пользователю внести изменения. Предоставить возможность пользователю согласиться или отказаться от изменений.
Вариант 12
Структуры вводятся в память (можно не создавать файла с базой данных) в виде однонаправленных связанных списков. Предоставить пользователю возможность вывода всех структур из списка на экран и изменения структуры в списке.
Вариант 13
Считать базу данных из файла в массив структур. Массив структур организовать таким образом, чтобы память под каждую структуру выделялась динамически по мере необходимости. Отсортировать массив структур по убыванию поля типа double. Вывести массив структур до и после сортировки в файл в отформатированном виде.
Вариант 14
Используя прерывание, произвести просмотр базы данных на экране (количество структур не менее 30). После заполнения всего экрана производить прокрутку экрана вверх или вниз на одну строку в зависимости от нажатой клавиши. Для наглядности структуры пронумеровать.
Вариант 15
Используя прямой доступ к видеопамяти, вывести из файла на экран только структуры, у которых значение поля целого типа входит в заданный диапазон. Выделить цветом поле, по которому идет выборка, красиво расположить поля структур на экране.
Вариант 16
Считать базу данных из файла в массив структур. Массив структур организовать таким образом, чтобы память под каждую структуру выделялась динамически по мере необходимости. Отсортировать массив структур по возрастанию поля - строки. Вывести из массива на экран структуры, у которых первая буква отсортированной строки входит в заданный диапазон.
Вариант 17
Структуры вводятся в память (можно не создавать файла с базой данных) в виде однонаправленных связанных списков. Предоставить пользователю возможность вывода всех структур из списка на экран и выборки структур из списка по полю типа long.
Вариант 18
Из файла с базой данных прочитать произвольную структуру с указанным номером (например, пятую структуру от начала файла) и вывести на экран в заданной строке. Перезаписать измененную структуру на прежнее место в файле.
Вариант 19
Заполнить статический массив структур из файла с базой данных и отсортировать его по убыванию поля типа long. Вывести массив структур до и после сортировки, делая задержку при полном заполнении экрана (количество записей не менее 30).
Вариант 20
Структуры вводятся в память (можно не создавать файла с базой данных) в виде однонаправленных связанных списков. Предоставить пользователю возможность вывода всех структур из списка на экран и вставки структуры в список, не нарушая упорядоченности по определенному полю структуры.
Вариант 21
Описать шаблон структуры, используя вложенную структуру. Создать базу данных в файле. Произвести выборку структур из файла на экран по любому ключу (ключи выбирает пользователь).
Вариант 22
Считать базу данных из файла в массив структур. Массив структур организовать таким образом, чтобы память под каждую структуру выделялась динамически по мере необходимости. Произвести выборку структур по любому ключу (ключ задает пользователь) и вывод их на экран.
Вариант 23
Заполнить статический массив структур из файла с базой данных и отсортировать его по возрастанию поля - строки. Вывести массив структур в файл в отформатированном виде до и после сортировки.
Вариант 24
Произвести ввод структур в файл, организовав тщательный контроль за вводом по полю строке:
1. по количеству введенных символов;
2. по качеству введенных символов;
3. преобразование строки к единообразной форме.
После обработки ввода вывести на экран получившуюся строку с предложением пользователю внести изменения. Предоставить возможность пользователю согласиться или отказаться от изменений.
Вариант 25
Структуры вводятся в память (можно не создавать файла с базой данных) в виде двунаправленных связанных списков. Предоставить пользователю возможность вывода всех структур из списка на экран и выборку по ключевому полю структуры предыдущей и последующей структуры из списка.
ВАРИАНТЫ СТРУКТУР
Структура - книги.
Структура - ценная бумага.
Структура - товар.
Структура - игрушка.
Структура - ученик.
Структура - автомобиль.
Структура - пассажир.
Структура - банк.
Структура - осадки.
Структура - дневная температура.
Структура - сессия.
Структура - телефонный справочник.
Структура - квартира.
Структура - сотрудник учереждения.
Структура - акция и п