Программа 1.3. Разнородные списки
Эта программа создаёт связанный список, состоящий из объектов типа Circle, Rectangle и RightTriangle. Файл figures содержит элементы этого списка в следующем формате:
<фигура> <координаты базовой точки> <параметры фигуры>
Фигура описывается буквой с (окружность), r (прямоугольник) или t (прямоугольный треугольник). Координаты базовой точки является пара чисел с плавающей точкой. Параметрами являются окружность или стороны. Ниже приводится пример выходных записей.
c 0,5 0,5 0,25 //окружность с центром (1/2, 1/2) и радиусом 1/4
r 1,0 0,25 0,5 0,5 //прямоугольник с базовой точкой (1, 1/4)
//и сторонами 1/2, 1/2
t 2,0 0,75 0,25 0,5 //прямоугольный треугольник с базовой
//точкой (2, 3/4) и сторонами 1/4, 1/2
Программа читает файл и формирует связанный список геометрических объектов. В процессе прохождения списка фигуры отображаются визуально.
#include <lostream.h>
#include <fstream.h>
#include <stdlib.h>
#include “graphlib.h”
#include “shapelst.h”
void main (void)
{
//listHeader – заголовок кольцевого списка форм
NodeShape listHeader, *p, *nFig;
//фигуры: c (окружность), r (прямоугольник),
//t (прямоугольный треугольник)
char figType;
//начальный образец заполнения – нет заполнения
int pat = 0;
float x, y, radius, length, width, tb, th;
//входной поток fin
ifstream fin;
//открыть файл figures, содержащий описание фигур
fin.open (“figures”, ios::in | ios::nocreate);
if (!fin)
{
cerr << “Нельзя открыть файл figures” << end1;
exit1;
}
//установить p на начала списка
p = &listHeader;
//прочитать файл до конца и построить связанный список
//фигур
while (!fin.eof())
{
//ввести тип фигуры и координаты базовой точки
fin >> figType;
if (fin.eof())
break;
fin >> x >> y;
//построить конкретную фигуру
switch (figType)
{
case ‘c’:
//ввести радиус и включить окружность в список
fin >> radius;
nFig = new CircleFigure (x, y, radius, pat);
p -> InsertAfter (nFig);
break;
case ‘r’:
//ввести длину и ширину и включить прямоугольник в список
fin >> length >> width;
nFig = new RectangleFigure (x, y, length, width, pat);
p -> InsertAfter (nFig);
break;
case ‘t’:
//ввести базу и высоту и включить прямоугольный треугольник
fin >> tb >>th;
nFig = new RectangleFigure (x, y, tb, th, pat);
p -> InsertAfter (nFig);
break;
}
//сменить образец заполнения. продвинуть указатель
pat = (pat+1) % 12;
p = p->Next();
}
//инициализировать графическую систему
InitGraphics();
//начиная с 1-й фигуры, пройти по списку и нарисовать каждую
//фигуру
p = listHeader.Next();
while (p != &listHeader)
{
p -> Draw();
p = p->Next();
}
//организовать паузу для просмотра фигур и закрыть
//графическую систему
ViewPause();
ShutdownGraphics();
}
/*
<прогон программы 1.3>
<см. график>
*/
![]() | |||||||
![]() | |||||||
![]() | ![]() | ||||||
![]() | |||||
![]() | |||||
![]() | |||||