Я должен написать функцию, которая находит режим массива значений для класса. Он принимает два аргумента: массив значений и переменную, равную количеству допустимых значений в массиве. Это звучало достаточно просто, но после недели попыток я не могу понять, как работает мой код.
Идея состоит в том, чтобы взять одномерный массив и сохранить его в двухмерном массиве, где первое значение — это значение из массива значений, а второе — сколько раз это значение встречается. Пока что это работает не совсем правильно, или вообще. Проблема в том, что она должна быть очевидной, но я был в тупике на неделю.
Я тестирую его с массивом, содержащим следующее:
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 раза.
2 х if (y[j][1] = max)
— Похоже на проблему (match = false) — На данный момент max
равно 2, и поэтому значение перезаписывается на 2.
Проблема с первым столбцом звучит так, как будто это связано с match = false
вопрос. Это все еще происходит после того, как вы исправили это и перекомпилировали?
Починил это. Я включил основную функцию, написанную для работы здесь.
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 раза.
Нажмите любую клавишу для продолжения . , ,