Программа на языке Фортран

 

*$nolist

*$include с:\WF77\gkscover.for

*$list

 

Character*80 a(5),h

Integer y(5),b

Real x(5)

Print*, ‘Введите название диаграммы’

Read 10,h

Print*,’Введите количество частей’

Read*,n

Do 1 i=1,n

Print*,’Введите значение ’, i ,’-той части’

Read*,x(i)

Print*,’ Введите описание ’, i ,’-той части’

Read*,a(i)

10 format(a)

1 continue

 

Do 2 i= 1,n

2 S = S + x(i)

 

Do 3 i=1,n

3 y(i)=x(i)/S*360

 

Call init(0)

 

B=0

C=0.3

D=0.35

 

Call block (0.,0.,1.,1.,8)

Call block (0.095,0.8, 0.4,0.95,4)

Call text(0.1,0.85,h,5)

 

Do 4 i=1,n

Call slice(0.5,0.6,0.2,I,b,b+y(i))

B=B+y(i)

Call block(0.1,c,0.14,d,i)

Call text(0.15,c,a(i),i)

C=c-0.05

4 D=d-0.05

End

 

Вариант программы на языке СИ.

#include <math.h> /* Прототипы математических функций */

#include <conio.h> /* Прототипы функций ввода/вывода на консоль */

#include <stdio.h> /* Прототипы стандартных функций ввода/вывода */

#include <stdlib.h> /* Прототипы универсальных процедур */

#include <graphics.h> /* Прототипы графических функций */

#define Pi 3.1415 /* Объявление константы */

/*

Переменные, используемые в программе, и краткий комментарий к ним

A - Проекция C на ось X

Alpha - Угол между C и A

B - Проекция C на ось Y

C - Расстояние между центром диаграммы и точкой вывода значения

Color - Цвет сектора

DName - Название диаграммы

dR - Центральный угол сектора

E - Переменная общего назначения

Element - Массив, содержащей значения элементов диаграммы(типа double)

Elements - Количество элементов диаграммы

ElementString - Массив, содержащей значения элементов диаграммы(типа char)

GDriver - Тип адаптера

GMode - Режим графики

MaxX - Максимальное значение координаты X в графическом режиме

MaxY - Максимальное значение координаты Y в графическом режиме

Pattern - Тип штриховки

RF - Угол левой границы сектора

RS - Угол правой границы сектора

SE - Сумма элементов диаграммы

*/

main(void)

{

int MaxX, MaxY;

int GDriver, GMode;

char DName[80];

int Elements, E, SE=0, dR=360;

char **ElementString;

double *Element;

int Pattern=1, Color=0;

int RS=0, RF=0;

int A, B, C;

int Alpha;

detectgraph(&GDriver, &GMode); /*Автоматическое определение подходящего режима*/

initgraph(&GDriver, &GMode,""); /*Переход в выбранный графический режим*/

MaxX = getmaxx(); /*В MaxX помещаем максимальную координату по оси X*/

MaxY = getmaxy(); /*B MaxY помещаем максимальную координату по оси Y*/

C = MaxY / 6;

printf("Введите название диаграммы:");

scanf("%s", DName);

printf("Введите количество элементов:");

scanf("%d", &Elements);

ElementString = (char**)malloc(Elements * sizeof(char*));

for (E = 0; E < Elements; E++)

/* Выделяем память под массивы */

ElementString[E]=(char*)malloc(12*sizeof(char));

Element=(double*)malloc(Elements*sizeof(double));

/* Вводим значения элементов */

for (E=0;E<Elements;E++)

{

printf("Введите значение элемента №%d:",E+1);

scanf("%s",ElementString[E]);

Element[E]=atof(ElementString[E]);

SE += Element[E];

}

/* Установка параметров для вывода синего прямоугольника */

setfillstyle(SOLID_FILL,BLUE); /* Залить синим цветом */

bar(0,0,MaxX,MaxY/25); /* Нарисовать прямоугольник */

/* Установка параметров для вывода названия диаграммы */

setcolor(WHITE); /* Цвет белый */

settextjustify(CENTER_TEXT,CENTER_TEXT); /* Центрировать строку относительно CP */

settextstyle(DEFAULT_FONT,0,2); /* Шрифт стандартный, ориентация нормальная, размер символов 2 */

outtextxy(MaxX/2,MaxY/50+2,DName); /* Вывод названия */

/* Установка параметров для вывода белого прямоугольника */

setfillstyle(SOLID_FILL,WHITE); /* Залить белым цветом */

bar(0,MaxY/25,MaxX,MaxY); /* Нарисовать */

/* Установка шрифта для вывода значений элементов */

settextstyle(SMALL_FONT,0,5);

/* Основ ная часть программы */

for (E=0;E<Elements;E++)

{

/* Расчёт нужного цвета и нужной штриховки */

Color ++;

if (Color == 15)

{

Color = 1;

Pattern ++;

}

if (Pattern == 12) Pattern = 1;

/* Параметры закраски сектора */

setfillstyle(Pattern,Color);

setcolor(Color);

/* Расчёт размеров сектора */

RS=RF;

RF=Element[E]/SE*dR+RS;

/* Вывод сектора */

sector(MaxX/2,MaxY/2,RS,RF,MaxY/3,MaxY/3);

/* Установка цвета для вывода значения сектора */

setcolor(WHITE);

/* Расчёт позиции CP */

Alpha = (RS + RF) / 2; /* Расчёт центрального угла */

A = cos(Alpha * Pi / 180) * C; /* Расчёт проекции на ось X */

B = sin(Alpha * Pi / 180) * C; /* Расчёт проекции на ось Y */

/* Вывод значения */

outtextxy(MaxX / 2 + A, MaxY / 2 - B, ElementString[E]);

dR -= RF - RS;

SE -= Element[E];

}

/* Установка параметров для вывода Copyright*/

setcolor(GREEN);

settextjustify(RIGHT_TEXT,TOP_TEXT);

settextstyle(DEFAULT_FONT,0,1);

/* Вывод */

outtextxy(MaxX-10,MaxY-10,"(c) 2009");

/* Задержка до нажатия любой клавиши */

getch();

closegraph(); /* Выход из графического режима */

/* код возврата */

return 23;

}

Дополнительные задания:

1. Изменить цвет рабочего поля.

2. Изменить цвет заголовка.

3. Расположить легенду над диаграммой.

4. В правом нижнем углу подписать фамилию.

 

Вопросы для самопроверки:

1. Какими параметрами описывается отрезок?

2. Какой стандарт для описания прямоугольного окна?

3. Как задается цвет объекта?

4. Как указывается место расположения текста?

5. Каков алгоритм вычисления угла сектора на диаграмме?

 

 

Литература

1. Строительное черчение. Учебник для вузов/ под ред. Георгиевского О.В., М.:Стройиздат, 2002 (455 стр.)

2. Сиденко Л.А. Компьютерная графика и геометрическое моделирование: Учебное пособие. – СПб.: Питер, 2009 (224 стр.)

3. Стандарты ЕСКД. 2001. Основные положения. Общие правила выполнения чертежей.

4. Полещук Н.Н. AutoCAD 2007: 2D/3D-моделирование.- М.: Издательство «Русская редакция», 2007 (416 стр.).