сортировать и показывать количество цифр - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу, чтобы моя программа могла отсортировать введенное целое число и вычислить число любого введенного целого числа, и я не знаю, куда следует записать cout примера c [9] = {2,3,2,6,6,3,5,2,2} число 2 равно 4, число 3 равно 2, число 6 равно 2.,пожалуйста исправьте этот код

int main()
{
cout << "please enter the number of digites :" << endl;
int n;
cin>>n;
int a[n];
cout<<"enter numbers :"<<endl;
for(int i=0;i<n;i++)
    cin>>a[i];


     int i,j;

for(i=0;i<n-1;i++)
{
    for(j=0;j<n-i-1;j++)
        if(a[j]>a[j+1])
        {
            int temp;
            temp=a[j+1];
            a[j+1]=a[j];
            a[j]=temp;
        }
}

int c;
for(int m=0;m<n;m++)
{
    if(a[m]==a[m+1])
        c++;
    else
        c=0;
}



return 0;
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Это типичный вариант использования для std::map.A std::map<char,int> позволяет легко считать частоту символов (проще обрабатывать вводимые пользователем символы, а не преобразовывать их в числа).

Это в основном все, что вам нужно:

#include <iostream>
#include <iterator>
#include <map>

int main(){
  std::istream_iterator<char> it( std::cin );
  std::istream_iterator<char> end_of_input;
  std::map<char,int> data;
  while (it != end_of_input ) data[*(it++)]++;
  for (const auto& e : data) std::cout << e.first << " " << e.second << "\n";
}

Это, вероятно, много за раз, поэтому давайте пойдем один за другим.

std::istream_iterator<char> позволяет извлекать символыиз потока, как будто вы перебираете контейнер.Таким образом, while повторяется std::cin, пока не достигнет конца ввода.Затем *(it++) увеличивает итератор и возвращает символ, извлеченный из потока.data[x]++ обращается к значению на карте для ключа x и увеличивает его значение.Если на карте еще нет значения ключа, для него по умолчанию устанавливается значение 0.

Для ввода: 11223 он печатает

1 2
2 2
3 1

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

Вы используете VLA (переменнаядлина массивов) здесь: int a[n];.Это расширение компилятора, а не стандартное c ++.

Вы получаете доступ к массиву за пределами.Когда i == 0, тогда j поднимается до j<n-i-1 == n-1, а затем вы получаете доступ к a[j+1] == a[n], но последний действительный индекс в массиве - n-1.Та же проблема в другом цикле (a[m+1]).

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

int current = a[0];
int counter = 1;
for(int m=1;m<n;m++) {
   if(a[m] == current) {
       counter++;
   } else {
       std::cout << current << " appears " << counter << " times" << endl;
       counter=1;   // note: minimum freq is 1 not 0
       current = a[m];
   }
}   
0 голосов
/ 28 ноября 2018

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

Чтобы ответить на ваш вопрос: вы должны напечатать вывод (частота целого числа в массиве), прежде чем сбросить переменную count в 1. Это будет работать, потому чтомы отсортировали массив, и нам не нужно будет заглядывать в будущее, чтобы найти вхождения текущего номера.

[EDIT] Я также добавил это выше вашего кода:

#include <iostream>
#include <vector>
using namspace std;

Полное решение

#include <iostream>
#include <vector>

using namespace std;

int main() {
    // Get input
    int n;
    cout << "Please enter the number of digits: ";
    cin>>n;

    vector<int> a;
    cout << "Enter " << n << " numbers: " << endl;
    for(int i=0;i<n;i++) {
        int temp;
        cin >> temp;
        a.push_back(temp);
    }

    // Sort input
    int i,j;
    for (i = 0; i < a.size(); i++) {
        for(j = 0; j < a.size()-i-1; j++) {
            if(a[j] > a[j+1]) {
                int temp;
                temp=a[j+1];
                a[j+1]=a[j];
                a[j]=temp;
            }
        }
    }

    // If an element is in an array
    // we can not have 0 occurrences
    // of that element, hence count
    // must start at 1
    int count = 1;

    // Int to count
    int current = a[0];

    // Ouput if we have reset the count,
    // or if it is the last iteration
    bool output;

    // Loop through array
    for (int i = 1; i < a.size(); i++) {
        output = false; // Reset output if we have printed
        if (a[i] == current) {
            // If current int and the element next to it are the same,
            // increase the count
            count++;
        } else {
            // If current and next are different,
            // we need to show the frequency,
            // and then reset count to 1
            cout << current << " occurs " << count << " times" << endl;
            count = 1;
            current = a[i];
        }
    }

    // Output one last time, for last int in sorted set
    cout << current << " occurs " << count << " times" << endl;

    return 0;
}

Если это не поможет, перейдите и прочитайте эту страницу, это решение на C, но его можно легко адаптировать к C ++.https://codeforwin.org/2015/07/c-program-to-find-frequency-of-each-element-in-array.html Это поможет вам понять и написать задачу.Они шаг за шагом проведут вас по алгоритму.

...