Создание гистограммы с C ++ (домашнее задание) - PullRequest
2 голосов
/ 05 февраля 2012

В моем классе c ++ мы получили назначенные пары.Обычно я могу довольно легко придумать эффективный алгоритм, на этот раз я не могу понять, как это сделать, чтобы спасти мою жизнь.

То, что я ищу, - это кто-то, кто объяснит алгоритм (или просто даст мне советы о том, что будет работать), чтобы сделать это.Я все еще на стадии планирования и хочу сделать этот код самостоятельно, чтобы учиться.Мне просто нужна небольшая помощь, чтобы добраться туда.

Мы должны создавать гистограммы на основе 4 или 5 целочисленного ввода.Он должен выглядеть примерно так:

Calling histo(5, 4, 6, 2) should produce output that appears like:

        *
    *   *
    * * *
    * * *
    * * * *
    * * * *
    -------
    A B C D

Форматирование этого просто убивает меня.Хуже всего то, что мы не можем использовать какие-либо типы массивов или "продвинутые" системы сортировки с использованием других библиотек.

Сначала я подумал, что могу расположить значения от высшего к низшему порядку.Но потом я понял, что не знаю, как это сделать, не используя функцию сортировки, и я не был уверен, что делать дальше.

Спасибо всем, кто мог бы помочь мне начать выполнять это задание.:)

Ответы [ 3 ]

1 голос
/ 05 февраля 2012

Попробуйте что-нибудь вроде этого:

  1. Определить наибольшее число в гистограмме
  2. Использование такого цикла для построения гистограммы:

    for(int i = largest; i >= 1; i--)

    Внутри тела цикла выполните шаги с 3 по 5 включительно

  3. Если i <= value_of_column_a, выведите *, в противном случае выведите пробел

  4. Повторите шаг 3 для каждого столбца (или запишите цикл ...)

  5. Печать символа новой строки

  6. Печать горизонтальной линии с использованием -

  7. Печать меток столбцов

0 голосов
/ 25 мая 2014

Если я правильно понял проблему, я думаю, что проблему можно решить следующим образом:

a= <array of the numbers entered>
T=<number of numbers entered> = length(a) //This variable is used to 
                                          //determine if we have finished
                                          //and it will change its value

Alph={A,B,C,D,E,F,G,..., Z}  //A constant array containing the alphabet
                             //We will use it to print the bottom row

for (i=1 to T) {print Alph[i]+" "}; //Prints the letters (plus space), 
                                    //one for each number entered

for (i=1 to T) {print "--"};        //Prints the two dashes per letter above 
                                    //the letters, one for each

while (T!=0) do {
   for (i=1 to N) do {
       if (a[i]>0) {print "*"; a[i]--;} else {print " "; T--;};
   };
   if (T!=0) {T=N};

}

Для каждого ненулевого введенного числа он напечатает *, а затем уменьшитномер введен.Когда одно из чисел становится равным нулю, оно прекращает ставить * s для своего столбца.Когда все числа стали равны нулю (обратите внимание, что это произойдет, когда значение T выйдет из для как ноль. Это то, для чего предназначена переменная T), тогда оно остановится.Я думаю, что проблема была не в гистограммах.Обратите внимание, что это также не требует сортировки или даже знания

0 голосов
/ 05 февраля 2012

Может быть, я ошибаюсь в вашем вопросе, но если вы знаете, сколько элементов в каждом столбце, вам будет довольно легко напечатать их, как в вашем примере:

Шаг 1: Найдите максимумчисла, сохранить в переменной, присвоить столбцу.

Шаг 2: Печать пробелов, пока вы не попадете в столбец с макс.Печать звездочки.Печать оставшихся звездочек / пробеловДобавьте символ \ n.

Шаг 3: Найдите следующий макс.Печатайте звезды в столбцах, где max>> max, в противном случае выведите пробел.Добавить новую строку.в конце.

Шаг 4: Повторите шаг 3 (пока условие остановки ниже)

, когда вы напечатали количество звездочек, равное наибольшему максимуму, вы распечатали все из них.

Шаг 5: добавьте строку -------- и \ n

Шаг 6: добавьте заголовки строк и \ n

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...