Как использовать двумерный массив для вычисления и хранения частот значений из другого массива? - PullRequest
0 голосов
/ 01 февраля 2019

Я начинаю изучать программирование на С, поэтому я не знаю, как делать базовые вещи (может быть, то, что я делаю, не имеет смысла).Что мне нужно сделать, так это получить от пользователя неопределенное число целых чисел от 1 до 9 и загрузить его в массив, когда пользователь введет 0 или 10, цикл завершается и массив завершается, поэтому у меня есть: int qualifications [SIZEQ] и функция для его загрузки, все работает.Теперь я должен вычислить частоту каждого числа, представленного в этом массиве.Я предполагаю, что есть много способов сделать это просто (я не знаю ни одного), я пытаюсь сделать это с другим массивом, двумерным, с 2 строками и 10 столбцами, используя 1 строку, чтобы содержать значения изОт 0 до 9, чтобы сравнить каждое число с количеством квалификаций массива [].И другой ряд для хранения количества раз, которое каждый номер присутствует в квалификации.Я не знаю, как это сделать, я стараюсь:

// 1st row of the freq array contains the 1-9 possible qualifications
// 2nd row to count the times that every value appears in qualifications array
// example: 1st row {0,1,2,3...} if 1 repeated 3 times:
//          2nd row {0,2,0,0...}  

int freq[2][10]={{0,1,2,3,4,5,6,7,8,9},{0,0,0,0,0,0,0,0,0,0}};

    int  j=0;   //var to load 0-9 positions of freq[1][j]

    for (int i = 0; i < SIZEQ; i ++)
    {
        if(qualifications[i]==freq[0][j]){
//what i want to do is to compare from 0 each cell of
//qual with freq with 1-9 numbers

        freq[1][j] = freq[1][j] + freq[1][j];
        //if detected a coincidence, increment the field of the row to
        //count repetitions
        //so, if qualifications[i] it's now '2' when compared to 
        //freq[0][2] (what it's 2) freq[1][2] it's now 1.  
        }
        j=i; 

        if(j>=9){ //to avoid that j be bigger than freq column size
        j=0;
        }

    }
    j=1; //skip 0
        while(j<=9){
            //j print 1-9 numbers and freq[1][j] print the number of
            //times it is repeated 
                cout << "Qualification " << j << " repeated " << freq[1][j] << " times." << endl;
            j++;
        }
}

1 Ответ

0 голосов
/ 01 февраля 2019

В исходном коде вы не проверяете каждую «квалификацию» на предмет каждого возможного значения в «freq».

Я думаю, что-то вроде этого - то, что вы ищете.

#include <iostream>
using namespace std;

int main()
{
  //make an example 'qualifications'
  int SIZEQ = 5;
  const int SIZEQ = 5;
  int qualifications[SIZEQ] = {1,1,2,3,4};




  int freq[2][10]={{0,1,2,3,4,5,6,7,8,9},{0,0,0,0,0,0,0,0,0,0}};

  for (int i = 0; i < SIZEQ; i ++) // loop through each qualification
  {
    for (int j = 0; j < 10; j++)   // loop through each frequency to see if it matches
    {
      if(qualifications[i]==freq[0][j])
      {
        freq[1][j] += 1;
      }
    }

  }
  int k;
  k=1; //skip 0
  while(k<=9){
    //j print 1-9 numbers and freq[1][j] print the number of
    //times it is repeated
    cout << "Qualification " << k << " repeated " << freq[1][k] << " times." << endl;
    k++;
  }



  return 0;
}

вывод должен быть:

Qualification 1 repeated 2 times.
Qualification 2 repeated 1 times.
Qualification 3 repeated 1 times.
Qualification 4 repeated 1 times.
Qualification 5 repeated 0 times.
Qualification 6 repeated 0 times.
Qualification 7 repeated 0 times.
Qualification 8 repeated 0 times.
Qualification 9 repeated 0 times.
...