C ++ Как я могу найти режим (ы) массива?

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

Идея состоит в том, чтобы взять одномерный массив и сохранить его в двухмерном массиве, где первое значение — это значение из массива значений, а второе — сколько раз это значение встречается. Пока что это работает не совсем правильно, или вообще. Проблема в том, что она должна быть очевидной, но я был в тупике на неделю.

Я тестирую его с массивом, содержащим следующее:
9,0, 4,0, 4,0, 4,0, 5,0, 5,0, 6,0, 6,0, 6,0, 7,0, 1,0, 9,0, 10,0

Код:

void mode(double x[], const int n)
{
int j, k, m=1, p, numofmodes=0;
bool match=false, breaker;
double y[100][2]={0}, max=0;y[0][0] = x[0];
y[0][1] = 1;

for(j=1; j<=(n-1); j++)  //
{
for (k=0; k<=(m-1); k++)
if (x[j] == y[k][0])
{
y[k][1]++;
match = true;
}

if (match == false)
{
y[m][0] = x[j];
y[m][1] = 1;
m++;
}
match = false;
}for(j=0; j<=(n-1); j++)
{
if (y[j][1] > max)
max = y[j][1];
}

for(j=0; j<=(n-1); j++)
{
if (y[j][1] = max)
numofmodes++;
}for(j=0; j<=(n-1); j++)
{
cout<<y[j][0]<<"    "<<y[j][1]<<endl;
}cout<<"There are "<<numofmodes<< " modes in the data set."<<endl;

for(j=0; j<=(n-1); j++)
{
if (y[j][1] = max)
{
cout<<y[j][0]<<" appears "<<max<<" times."<<endl;
}
}

}

Выход:
9 2
0 2
0 2
0 2
0 2
0 2
0 2
0 2
0 2
0 2
0 2
0 2
0 2
В наборе данных 13 режимов.
9 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.
0 появляется 2 раза.

1

Решение

2 х if (y[j][1] = max) — Похоже на проблему (match = false) — На данный момент max равно 2, и поэтому значение перезаписывается на 2.

Проблема с первым столбцом звучит так, как будто это связано с match = false вопрос. Это все еще происходит после того, как вы исправили это и перекомпилировали?

0

Другие решения

Починил это. Я включил основную функцию, написанную для работы здесь.

Input1.txt:
9,0, 4,0, 4,0, 4,0, 4,0, 4,0, 5,0, 5,0, 6,0, 6,0, 6,0, 6,0, 6,0, 6,0, 6,0, 7,0, 1,0, 9,0, 10,0, 4,0, -9999

Я изменил несколько = в == и исправил математическую ошибку в одном из циклов for, и теперь я выгляжу … золотым. Aurum est potestas. : D

#include <iostream>
#include <cstdlib>
#include <fstream>
void mode(double x[], const int n);
using namespace std;

int main()
{
const int N = 100;
double x[N];
void mode (double x[],int n);
int n;
ifstream inFile;

inFile.open("input1.txt");
n=0;
inFile>>x[n];
while (x[n]!=-9999)
{
n++;
inFile >>x[n];
}
inFile.close( );
mode(x,n);

inFile.open("input2.txt");
n=0;
inFile >>x[n];
while (x[n]!=-9999)
{
n++;
inFile >>x[n];
}
inFile.close( );
mode(x,n);inFile.open("input3.txt");
n=0;
inFile >>x[n];
while (x[n]!=-9999)
{
n++;
inFile >>x[n];
}
inFile.close( );
mode(x,n);

system ("PAUSE");
return 0;
}

void mode(double x[], const int n)
{
int j, k, m=1, p, numofmodes=0;
bool match=false, breaker;
double y[100][2]={0}, max=0;

for(p=0;p<=n-1;p++)
{
y[p][0] = x[p];
y[p][1]++;
}for(j=1; j<=(n-1); j++)
{
for (k=0; k<=m; k++)
if (x[j] == y[k][0])
{
y[k][1]++;
match = true;
cout<<y[k][0]<<"   "<<y[k][1]<<endl;
}

if (match == true)
{
y[m][0] = x[j];
y[m][1] = 1;
m++;
}
match = false;
}for(j=0; j<=(n-1); j++)
{
if (y[j][1] > max)
max = y[j][1];
}

for(j=0; j<=(n-1); j++)
{
if (y[j][1] == max)
numofmodes++;
}cout<<"There are "<<numofmodes<< " modes in the data set."<<endl;

for(j=0; j<=(n-1); j++)
{
if (y[j][1] == max)
{
cout<<"The number "<<y[j][0]<<" appears "<<max<<" times."<<endl;
}
}
cout<<endl;
}

Выход:
В наборе данных есть 2 режима.
Число 4 появляется 6 раз.
Число 6 появляется 6 раз.

В наборе данных есть 2 режима.
Число 2 появляется 3 раза.
Число 5 появляется 3 раза.

В наборе данных есть 4 режима.
Число 1 появляется 2 раза.
Число 7 появляется 2 раза.
Число 19 появляется 2 раза.
Число 30 появляется 2 раза.

Нажмите любую клавишу для продолжения . , ,

0

По вопросам рекламы [email protected]