2016-08-16 6 views
0

Моя программа запускается для запроса ввода пользователем указанного целого числа с последующим хранением большего числа целых чисел в динамическом массиве. На выходе выдается гистограмма, использующая звезды, чтобы показать, сколько из каждого целого.Функция гистограммы с использованием динамических массивов C++ 11

У меня есть все задачи, за исключением одного. Я пробовал реализовать функцию swap в течение нескольких часов, но не смог найти решение моей проблемы.

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

Enter number of grades: 5 Enter grades (each on a new line): 20 4 10 10 20 Histogram: 20 ** 4 * 10 **

Однако, я хочу следующий вывод вместо

Histogram: 4 * 10 ** 20 **

Вот мой код:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <iomanip> 

using namespace std; 

void hist(int arr[], int n); 

void swap(int &a, int &b); 

int main(){ 
    int* arr = NULL; 
    int number; 
    cout << "Enter number of grades:" << endl; 
    cin >> number; 

    cout << "Enter grades (each on a new line):" << endl; 
    arr = new int[number]; 
    for(int i = 0; i < number; i++){ 
    cin >> arr[i]; 
    } 
    hist(arr, number); 
    return 0; 
    delete [] arr; 
} 

void hist(int arr[], int n){ 
    cout << "Histogram:" << endl; 
    for (int i = 0; i < n; i++){ 
    int j; 
    for (j = 0; j < i; j++) 
     if(arr[i] == arr[j]) 
     break; 
    if (i == j){ 
     int xx = count(arr, arr+n, arr[i]); 
     cout << setw(3) << arr[i] << " "; 
     for (int j = 0; j < xx; ++j){ 
     cout << "*"; 
     } 
     cout << endl; 
    } 
    } 
} 

void swap(int &a, int &b){ 
    int temp; 
    temp = a; 
    a = b; 
    b = temp; 
} 
+1

см. [Std :: swap] (http://en.cppreference.com/w/cpp/algorithm/swap). Вы используете «namespace std;», поэтому добавляете в 'std :: swap' перегрузку. Вы пробовали вызывать свою функцию свопинга из более простой функции, чтобы убедиться, что это на самом деле дает вам проблемы? Также прекратите делать это: 'int x; x = 1; 'и просто' int x = 1; ' –

ответ

0

Что вы хотите, чтобы отсортировать вектор перед подсчетом элементов.

void hist(int arr[], int n){ 
    sort(arr, arr+n); 
    ... 
} 

Я предлагаю вам изменить ваше решение. Если вы использовали std::map, у вас было бы решение вашей проблемы прямо там, предварительно упорядоченным образом. Кроме того, почему бы вам не использовать std::vector?