2015-08-30 1 views
0

Мое задание состоит в том, чтобы ввести тип пользователя в количестве элементов в массиве, а затем ввести целочисленное число, которое будет помещено в массив. Затем мне приходится сортировать массив и находить наибольшее число и распечатывать элементы массива, но если есть повторение, то печатайте только этот номер один раз. Мне также приходится печатать количество раз, когда происходит каждый элемент массива. Например, если пользователь вводит то, что существует 5 элементов, то он вводит 2, 1, 2, -3, 2, тогда он должен печатать -3 с 1 счетчиком, 1 с 1 счетом и 2 с 3 счетами. Пока у меня это есть, чтобы он распечатывал элементы и удалял повторы, но я не могу заставить его распечатать правильное количество вхождений для каждого элемента. Это мой код до сих пор.C++ Как распечатать элементы массива, но не оставлять повторы?

  void findRepeats(int numbers[], int num) 
      { 
       int instances = 0; 

       cout << "Number" << " " << "Occurrences" << endl; 
       for (int i = 0; i < num; i++) 
       { 
        bool matching = false; 
        instances = 1; 
        for (int j = 0; (j < i); j++) 
        { 
         if (numbers[i] == numbers[j]) 
         { 
          instances++; 
          matching = true; 

         } 

        } 
        if (!matching) 
         cout << numbers[i] << "  " << instances << endl; 

       } 
      } 

Сейчас его говорят все номера происходит только 1 раз

+0

Если вы можете использовать библиотеку алгоритмов std, взгляните на std :: sort и std :: count. –

ответ

1

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

void findRepeats(int numbers[], int num); 

int main(){ 

    int array[] = {2, 1, 2, -3, 2}; 
    findRepeats(array,5); 

} 

void findRepeats(int numbers[], int num) { 

    //sort the array first 
    std::sort(numbers, numbers + num); 

    int last = numbers[0]; 
    int count = 0; 
    cout << "Number of Occurrences\n"; 

    for (int i = 0; i < num; i++) { 
     if (last == numbers[i]) { 
      ++count; 
     } else { 
      cout << last << "  " << count << '\n'; 
      count = 1; 
     } 
     last = numbers[i]; 
    } 

    if (count > 0) { 
     cout << last << "  " << count << '\n'; 
    } 

} 

печатает:

Number of Occurrences 
-3  1 
1  1 
2  3 
1

Я хотел бы использовать map или unordered_map, ну ..., сопоставьте число к числу его вхождений. Это делает вещи довольно простыми, поскольку в основном они заботятся о дубликатах для вас.

#include <iostream> 
#include <unordered_map> 
using namespace std; 

void reportCounts(const int numbers[], const size_t size){ 
    unordered_map<int, unsigned int> counts; 

    //unfortunately range-for here would a little PIA to apply 
    //or at least I don't know convenient way 
    for(size_t i = 0; i < size; ++i) { 
     counts [ numbers[i] ]++; //increase `count` of i-th number 
    } 

    //print results 
    for(auto count : counts){ 
     cout << count.first << ' ' << count.second << endl; 
    } 
} 

int main(){ 
    int array[] = {2, 1, 2, -3, 2}; 
    reportCounts(array,5); 
} 

Поскольку это задание я уезжаю выяснить C++ shenaningans вам и http://cppreference.com. Ключевые слова: map, map::iterator и, возможно, ассоциативный контейнер который map в примере.

Я понимаю, что это может быть труднее понять, чем простая реализация какого-либо алгоритма, но это, вероятно, близко к оптимальному решению в современном C++, и попытка понять, как и почему он работает, должна оказаться полезной. Следует заметить, что нужно было записать меньше кода, и алгоритм не должен был быть изобретен. Меньше времени выполнения, меньше места для ошибок, меньше тестирования.

0

Поиск в массиве. Для каждого целого числа либо записывайте его, либо увеличивайте его количество. Повторите процесс до завершения, затем распечатайте его.

Как? ты говоришь? Один из подходов заключался бы в использовании параллельных массивов для хранения уникальных целых чисел, а другой для хранения целых чисел. Затем напечатайте уникальные целые числа и их количество.

Пример кода простого алгоритма поиска:

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

void print(vector<int> valueArray,vector<int> countArray){ 
    for(unsigned int i = 0; i < valueArray.size(); ++i){ 
     cout<<"Found value "<<valueArray[i]<<": "<<countArray[i]<<" times."<<endl; 
    } 
} 
void findRepeats(vector<int> testArray,vector<int> &valueArray,vector<int> &countArray){ 
    for(unsigned int i = 0; i < testArray.size(); ++i){ 
     if(valueArray.size() == 0){ 
      valueArray.push_back(testArray[i]); 
      countArray.push_back(1); 
     }else{ 
      bool newEntry = true; 
      for(unsigned int j = 0; j < valueArray.size(); ++j){ 
       if(testArray[i] == valueArray [j]){ 
        countArray[j]++; 
        newEntry = false; 
        break;//After find, break out of j-for-loop to save time. 
       } 
      } 
      if(newEntry){ 
       valueArray.push_back(testArray[i]); 
       countArray.push_back(1); 
      } 
     } 
    } 
} 
int main(){ 

    vector<int> testArray;     //To store all integers entered. 
    vector<int> valueArray;     //To store non-copied integers, dynamically, else handle it yourself. 
    vector<int> countArray;     //To count increments of numbers found, dynamically, else handle it yourself. 

    testArray = {0,2,5,4,1,3,6,2,5,9,8,7,4,1,2,6,5,4,8,3,2,1,5,8,6,9,8,7,4,4,5,6,8,2,1,3,0,0,1,2,0,2,5,8};//Dummy data. 
    findRepeats(testArray,valueArray,countArray);//Function to find statistics on testArray. 

    cout<<"\nPrinting found characters, and number of times found: "<<endl; 
    print(valueArray,countArray); 
    return 0; 
} 

выход будет что-то вроде:

Printing found characters, and number of times found: 
Found value 0: 4 times. 
Found value 2: 7 times. 
Found value 5: 6 times. 
Found value 4: 5 times. 
Found value 1: 5 times. 
Found value 3: 3 times. 
Found value 6: 4 times. 
Found value 9: 2 times. 
Found value 8: 6 times. 
Found value 7: 2 times. 

В выше, я использовал векторы для простоты, но если вы должны делать это с c- одним из способов было бы создать все три вектора одинакового размера и сохранить один целочисленный счетчик для числа индексов, используемых в valueArray и countArray; они должны делиться, так как они связаны 1 к 1. И вам нужно будет передать его функции findRepeats.

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

Смежные вопросы