Изобразить распределение населения по профессиям в виде круговой диаграммы - 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) также может быть введено некорректное значение (не строка или не уникальное значение)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д