Печать гистограммы на C ++ - PullRequest
       15

Печать гистограммы на C ++

0 голосов
/ 17 октября 2019

Я пытаюсь напечатать гистограмму, используя циклы for, но по какой-то причине мой второй цикл, который должен работать в зависимости от условий, не работает, и в результате я получаю только 1 "#" для каждого счетчика.

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

int main () {

char hash = '#';                                
double list[10];                                
int size = sizeof(list) / sizeof(list[0]);      

for(int i = 0; i < size; i++) {                 
  list[i] = ((rand() % 10000) / 10000.0);       

  for(int j = 0; j < 10000; j++) {              
    if
    (      
        (list[i] >= 0 && list[i] <= .1) ||
        (list[i] >= .1 && list[i] <= .2) || 
        (list[i] >= .2 && list[i] < .3) ||
        (list[i] >= .3 && list[i] < .4) ||
        (list[i] >= .4 && list[i] < .5) ||
        (list[i] >= .5 && list[i] < .6) ||
        (list[i] >= .6 && list[i] < .7) ||
        (list[i] >= .7 && list[i] < .8) ||
        (list[i] >= .8 && list[i] < .9) ||
        (list[i] >= .9 && list[i] < 1.0)
    ) 
      {
      list[i] += 1;             
    }
  }
}

cout << "HISTOGRAM OF 10 COUNTERS " << endl;
for(int i = 0; i < size; i++) {

  cout << "[" << i << "] \t" << list[i] << "\t" << string(list[i], hash) << endl;
}

  return 0;
}

Ответы [ 2 ]

1 голос
/ 17 октября 2019

В вашем коде много неправильных вещей, но так как это похоже на домашнюю работу, которую вы должны выполнить самостоятельно, я просто объясню наблюдаемое поведение:

В каждой итерации внешнего цикла for list[i] изначально установлен на значение от 0 до 1. Ваше условие if может быть сокращено до list[i] >= 0. && list[i] < 1.. Он всегда будет совпадать на первой итерации цикла. Но затем вы добавляете 1 к этому значению. В результате он не будет соответствовать ни одной из последующих оценок этого условия, потому что тогда list[i] равно 1 + original value of list[i], что не между 0 и 1.

0 голосов
/ 18 октября 2019
  1. Вы используете list[] для случайных чисел и гистограммы

    Это неверно! Случайные значения должны храниться впеременная temp и генерируется в основном цикле (j<10000) вместо этого.

  2. циклы for не должны быть вложенными

    Первый (i<10) должен просто очистить вашу гистограмму до нуля. Второй должен генерировать ваше случайное значение, вычислять индекс бина гистограммы из него и увеличивать количество бинов на единицу.

  3. Большое if условие

    не является полным, и это должны быть (size=10) отдельные или if/else условия, которые вычисляют индекс i. Также следует использовать временное случайное значение вместо значения гистограммы:

    random_value=((rand()%10000)/10000.0);
    i=-1;if (random_value<0.0);
    else if (random_value<0.1) i=0;
    else if (random_value<0.2) i=1;
    else if (random_value<0.3) i=2;
    ...
    else if (random_value<1.0) i=9;
    if (i>=0) list[i]++;
    

    Однако ваше случайное значение находится в диапазоне <0.0,1.0), поэтому, если значения могут быть полностью удалены:

    random_value=((rand()%10000)/10000.0);
    i=floor(random_value*double(size));
    list[i]++;
    

Для получения дополнительной информации см.

Вы можете найти там пример гистограммы C ++ ..

...