Программа 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>

<см. график>

*/