Изобразить распределение населения по профессиям в виде круговой диаграммы - QBasic
Формулировка задачи:
Задан массив K(n) распределения населения по профессиям (названия профессии и соответствующее ей количество человек). Изобразить распределение в виде круговой (секторной) диаграммы с необходимыми подписями
помогите написать начало, т.е. задать массив из названий профессий и соответсвующее им количество человек
Решение задачи: «Изобразить распределение населения по профессиям в виде круговой диаграммы»
textual
Листинг программы
DECLARE SUB Tria (x1%, y1%, x2%, y2%, x3%, y3%, cv%) CONST cx = 320, cy = 175, r = 150 ' Параметр точности, чем больше точность тем качественнее ' геометрия, вычисляется относительно процентов, поэтому ' если поставим .5, то урежем кол-во процентов при отображении ' вдвое, а если поставим 10, то сделаем визуально 1000 процентов. ' ВНИМАНИЕ: При значениях < 1, теряем отображение некоторых ' областей которые равны 1 проценту. CONST Tochnost = 1 CONST Pi = 3.141592653589793#, PlusU = Pi / (50 * Tochnost) DIM n AS INTEGER, SDi AS LONG, PDi AS LONG, Dolya AS DOUBLE TYPE Professia PNAME AS STRING * 20 Quantity AS DOUBLE END TYPE CLS INPUT "Vvedite kol-vo professij: ", n DIM Prof(1 TO n%) AS Professia DIM Di(1 TO n%) AS LONG, Pri(1 TO n%) AS LONG, s AS DOUBLE FOR i = 1 TO n% PRINT " - Vvod professii N"; CHR$(248); LTRIM$(STR$(i)) INPUT " Vvedite nazvanie: ", Prof(i).PNAME INPUT " Vvedite Kol-vo : ", Prof(i).Quantity s = s + Prof(i).Quantity NEXT SCREEN 9 LOCATE 13, 35: PRINT "Zagruzka..." SCREEN 9, , 1, 0 FOR i = 1 TO n% - 1 Dolya = Prof(i).Quantity * 100 Di(i) = CINT((Dolya * Tochnost) / s) Pri(i) = CINT(Dolya / s) SDi = SDi + Di(i): PDi = PDi + Pri(i) NEXT Pri(i) = 100 - PDi ' Замыкающее звено(проценты) Di(n) = (100 * Tochnost) - SDi ' Замыкающее звено(деления) FOR i = 1 TO n% LOCATE 2 + i, 3: PRINT STR$(Pri(i)); "% - "; LTRIM$(Prof(i).PNAME) FOR j = 1 TO Di(i) u2 = u + PlusU Tria cx, cy, INT(cx + COS(u) * r), INT(cy + SIN(u) * r), INT(cx + COS(u2) * r), INT(cy + SIN(u2) * r), (i MOD 13) + 1 u = u + PlusU NEXT NEXT PCOPY 1, 0 SUB Tria (x1%, y1%, x2%, y2%, x3%, y3%, cv%) DIM xx1%, xx2%, xx3%, yy1%, yy2%, yy3% DIM Dl1%, St1, St2, St3, Xt1, Xt2 DIM i% xx1% = x1%: xx2% = x2%: xx3% = x3% yy1% = y1%: yy2% = y2%: yy3% = y3% IF yy1% > yy2% THEN SWAP yy1%, yy2%: SWAP xx1%, xx2% IF yy2% > yy3% THEN SWAP yy2%, yy3%: SWAP xx2%, xx3% IF yy1% > yy2% THEN SWAP yy1%, yy2%: SWAP xx1%, xx2% Dl1% = ABS(yy2% - yy1%) Dl2% = ABS(yy3% - yy2%) IF Dl1% = 0 AND Dl2% = 0 THEN IF xx1% > xx2% THEN SWAP xx1%, xx2% IF xx2% > xx3% THEN SWAP xx2%, xx3% IF xx1% > xx2% THEN SWAP xx1%, xx2% LINE (xx1%, yy1%)-(xx3%, yy1%), cv% EXIT SUB END IF IF Dl1% > 0 THEN St1 = (xx3% - xx1%) / (Dl1% + Dl2%) St2 = (xx2% - xx1%) / (Dl1%) Xt1 = xx1%: Xt2 = xx1% FOR i% = yy1% TO yy1% + Dl1% - 1 LINE (Xt1, i%)-(Xt2, i%), cv% Xt1 = Xt1 + St1 Xt2 = Xt2 + St2 NEXT END IF IF Dl2% > 0 THEN IF Dl1% = 0 THEN St1 = (xx3% - xx1%) / Dl2% Xt1 = xx1% END IF St3 = (xx3% - xx2%) / Dl2% Xt2 = xx2% FOR i% = yy2% TO yy2% + Dl2% LINE (Xt1, i%)-(Xt2, i%), cv% Xt1 = Xt1 + St1 Xt2 = Xt2 + St3 NEXT END IF END SUB
Объяснение кода листинга программы
- Объявлены следующие переменные:
- n (количество профессий)
- Tochnost (параметр точности, чем больше точность, тем качественнее геометрия)
- Pi (число Пи)
- PlusU (добавочная переменная для вычисления делений и процентов)
- Prof (массив профессий, содержит название и количество)
- Di (массив делений, вычисляется относительно процентов)
- Pri (массив процентов)
- SDi (сумма делений)
- PDi (сумма процентов)
- Dolya (общее количество введенных данных)
- s (сумма количества профессий)
- cx (центр круга на экране)
- cy (центр круга на экране)
- r (радиус круга на экране)
- Tria (подпрограмма для отрисовки треугольников)
- xx1%, xx2%, xx3%, yy1%, yy2%, yy3% (шесть вспомогательных переменных для работы с координатами)
- Dl1%, Dl2%, Dl3% (три вспомогательные переменные для хранения длин сторон треугольника)
- St1, St2, St3 (три вспомогательные переменные для хранения смещения осей)
- Xt1, Xt2, Xt3 (три вспомогательные переменные для хранения текущих координат осей)
- i% (переменная цикла)
- Ввод количества профессий и их названий и количества.
- Задается количество профессий (n)
- Для каждой профессии вводится название (Prof(i).PNAME) и количество (Prof(i).Quantity)
- Суммируется общее количество (s)
- Вычисление длин сторон треугольника и суммарного количества процентов.
- Инициализируются начальные значения для длин сторон треугольника (SDi) и суммарного количества процентов (PDi)
- Для каждой профессии вычисляется длина стороны треугольника (Di) и суммарное количество процентов (Pri)
- Длина стороны треугольника (Di) добавляется к SDi, а суммарное количество процентов (Pri) добавляется к PDi
- Вывод информации о профессиях.
- На экран выводится информация о количестве процентов каждой профессии (Pri) и ее названии (Prof(i).PNAME)
- Вычисление координат для отрисовки треугольников.
- Для каждой профессии вычисляются координаты осей (Xt1, Xt2, Xt3) и смещения (St1, St2, St3)
- Используя эти координаты и подпрограмму Tria, на экран отрисовываются треугольники
- Код содержит вложенные циклы, которые могут вызвать проблемы при использовании ввода с клавиатуры, так как не предусмотрена проверка на ввод некорректных значений.
- При вводе количества профессий (n) может быть введено некорректное значение (меньше 1 или не число)
- При вводе количества (Prof(i).Quantity) также может быть введено некорректное значение (меньше 1 или не число)
- Если количество профессий (n) будет меньше 1, то некоторые области, равные 1 проценту, будут потеряны
- Если введено некорректное значение для количества (Prof(i).Quantity), то графическое представление может быть некорректным
- При вводе названий профессий (Prof(i).PNAME) также может быть введено некорректное значение (не строка или не уникальное значение)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д