Изобразить распределение населения по профессиям в виде круговой диаграммы - QBasic

Узнай цену своей работы

Формулировка задачи:

Задан массив K(n) распределения населения по профессиям (названия профессии и соответствующее ей количество человек). Изобразить распределение в виде круговой (секторной) диаграммы с необходимыми подписями
помогите написать начало, т.е. задать массив из названий профессий и соответсвующее им количество человек

Решение задачи: «Изобразить распределение населения по профессиям в виде круговой диаграммы»

textual
Листинг программы
  1. DECLARE SUB Tria (x1%, y1%, x2%, y2%, x3%, y3%, cv%)
  2.   CONST cx = 320, cy = 175, r = 150
  3.   '  Параметр точности, чем больше точность тем качественнее
  4.   '  геометрия, вычисляется относительно процентов, поэтому
  5.   '  если поставим .5, то урежем кол-во процентов при отображении
  6.   '  вдвое, а если поставим 10, то сделаем визуально 1000 процентов.
  7.   '  ВНИМАНИЕ: При значениях < 1, теряем отображение некоторых
  8.   '  областей которые равны 1 проценту.
  9.   CONST Tochnost = 1
  10.   CONST Pi = 3.141592653589793#, PlusU = Pi / (50 * Tochnost)
  11.   DIM n AS INTEGER, SDi AS LONG, PDi AS LONG, Dolya AS DOUBLE
  12.  
  13. TYPE Professia
  14.   PNAME AS STRING * 20
  15.   Quantity AS DOUBLE
  16. END TYPE
  17.  
  18. CLS
  19. INPUT "Vvedite kol-vo professij: ", n
  20.   DIM Prof(1 TO n%) AS Professia
  21.   DIM Di(1 TO n%) AS LONG, Pri(1 TO n%) AS LONG, s AS DOUBLE
  22.     FOR i = 1 TO n%
  23.        PRINT "   - Vvod professii N"; CHR$(248); LTRIM$(STR$(i))
  24.        INPUT "  Vvedite nazvanie: ", Prof(i).PNAME
  25.        INPUT "  Vvedite Kol-vo  : ", Prof(i).Quantity
  26.        s = s + Prof(i).Quantity
  27.     NEXT
  28. SCREEN 9
  29. LOCATE 13, 35: PRINT "Zagruzka..."
  30. SCREEN 9, , 1, 0
  31.  
  32.     FOR i = 1 TO n% - 1
  33.        Dolya = Prof(i).Quantity * 100
  34.        Di(i) = CINT((Dolya * Tochnost) / s)
  35.        Pri(i) = CINT(Dolya / s)
  36.        SDi = SDi + Di(i): PDi = PDi + Pri(i)
  37.     NEXT
  38.   Pri(i) = 100 - PDi              ' Замыкающее звено(проценты)
  39.   Di(n) = (100 * Tochnost) - SDi  ' Замыкающее звено(деления)
  40.  
  41.   FOR i = 1 TO n%
  42.      LOCATE 2 + i, 3: PRINT STR$(Pri(i)); "% - "; LTRIM$(Prof(i).PNAME)
  43.      FOR j = 1 TO Di(i)
  44.         u2 = u + PlusU
  45.         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
  46.         u = u + PlusU
  47.      NEXT
  48.   NEXT
  49. PCOPY 1, 0
  50.  
  51. SUB Tria (x1%, y1%, x2%, y2%, x3%, y3%, cv%)
  52.   DIM xx1%, xx2%, xx3%, yy1%, yy2%, yy3%
  53.   DIM Dl1%, St1, St2, St3, Xt1, Xt2
  54.   DIM i%
  55.   xx1% = x1%: xx2% = x2%: xx3% = x3%
  56.   yy1% = y1%: yy2% = y2%: yy3% = y3%
  57.     IF yy1% > yy2% THEN SWAP yy1%, yy2%: SWAP xx1%, xx2%
  58.     IF yy2% > yy3% THEN SWAP yy2%, yy3%: SWAP xx2%, xx3%
  59.     IF yy1% > yy2% THEN SWAP yy1%, yy2%: SWAP xx1%, xx2%
  60.   Dl1% = ABS(yy2% - yy1%)
  61.   Dl2% = ABS(yy3% - yy2%)
  62.  
  63. IF Dl1% = 0 AND Dl2% = 0 THEN
  64.       IF xx1% > xx2% THEN SWAP xx1%, xx2%
  65.       IF xx2% > xx3% THEN SWAP xx2%, xx3%
  66.       IF xx1% > xx2% THEN SWAP xx1%, xx2%
  67.     LINE (xx1%, yy1%)-(xx3%, yy1%), cv%
  68.     EXIT SUB
  69. END IF
  70.  
  71.   IF Dl1% > 0 THEN
  72.     St1 = (xx3% - xx1%) / (Dl1% + Dl2%)
  73.     St2 = (xx2% - xx1%) / (Dl1%)
  74.     Xt1 = xx1%: Xt2 = xx1%
  75.        FOR i% = yy1% TO yy1% + Dl1% - 1
  76.          LINE (Xt1, i%)-(Xt2, i%), cv%
  77.          Xt1 = Xt1 + St1
  78.          Xt2 = Xt2 + St2
  79.        NEXT
  80.   END IF
  81.  
  82.   IF Dl2% > 0 THEN
  83.       IF Dl1% = 0 THEN
  84.         St1 = (xx3% - xx1%) / Dl2%
  85.         Xt1 = xx1%
  86.       END IF
  87.     St3 = (xx3% - xx2%) / Dl2%
  88.     Xt2 = xx2%
  89.       FOR i% = yy2% TO yy2% + Dl2%
  90.          LINE (Xt1, i%)-(Xt2, i%), cv%
  91.          Xt1 = Xt1 + St1
  92.          Xt2 = Xt2 + St3
  93.       NEXT
  94.   END IF
  95. END SUB

Объяснение кода листинга программы

  1. Объявлены следующие переменные:
    • 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% (переменная цикла)
  2. Ввод количества профессий и их названий и количества.
    • Задается количество профессий (n)
    • Для каждой профессии вводится название (Prof(i).PNAME) и количество (Prof(i).Quantity)
    • Суммируется общее количество (s)
  3. Вычисление длин сторон треугольника и суммарного количества процентов.
    • Инициализируются начальные значения для длин сторон треугольника (SDi) и суммарного количества процентов (PDi)
    • Для каждой профессии вычисляется длина стороны треугольника (Di) и суммарное количество процентов (Pri)
    • Длина стороны треугольника (Di) добавляется к SDi, а суммарное количество процентов (Pri) добавляется к PDi
  4. Вывод информации о профессиях.
    • На экран выводится информация о количестве процентов каждой профессии (Pri) и ее названии (Prof(i).PNAME)
  5. Вычисление координат для отрисовки треугольников.
    • Для каждой профессии вычисляются координаты осей (Xt1, Xt2, Xt3) и смещения (St1, St2, St3)
    • Используя эти координаты и подпрограмму Tria, на экран отрисовываются треугольники
  6. Код содержит вложенные циклы, которые могут вызвать проблемы при использовании ввода с клавиатуры, так как не предусмотрена проверка на ввод некорректных значений.
    • При вводе количества профессий (n) может быть введено некорректное значение (меньше 1 или не число)
    • При вводе количества (Prof(i).Quantity) также может быть введено некорректное значение (меньше 1 или не число)
    • Если количество профессий (n) будет меньше 1, то некоторые области, равные 1 проценту, будут потеряны
    • Если введено некорректное значение для количества (Prof(i).Quantity), то графическое представление может быть некорректным
    • При вводе названий профессий (Prof(i).PNAME) также может быть введено некорректное значение (не строка или не уникальное значение)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы