Изобразить распределение населения по профессиям в виде круговой диаграммы - 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

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

  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
Похожие ответы