我最近创建了一个C ++程序来查找值数组的平均值和模式。
我能够从我在网上找到的东西修改一个片段,以创建一个生成模式的函数,或者至少它能够实现的第一个最常出现的值。但是,我并不是100%确定如何围绕函数中实际发生的事情。
非常感谢您更好地了解模式功能中发生的事情。
到目前为止,这是我的代码:
#include <iostream>
using namespace std;
void mode(int[], int);
void mean(int[], int);
void sort(int[], int);
void median(int[], int);
int main()
{
int array[15];
float total, mode;
int n = 15;//number of elements in array
//fill in the value of array
for(int i=0; i<n; i++){
cout << "fill in the "<< i+1 << " number. :";
cin >> array[i];
}
sort(array, n);
return 0;
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
void mean(int new_array[], int num){
//GET TOTAL & CALCULATE MEAN
float total = 0;
for(int i=0;i<num; i++){
total += new_array[i];
}
cout << "The mean is " << total/num << endl;
mode(new_array, num);
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
void median(int new_array[], int num){
//CALCULATE THE MEDIAN (middle number)
if(num % 2 != 0){// is the # of elements odd?
int temp = ((num+1)/2)-1;
cout << "The median is " << new_array[temp] << endl;
}
else{// then it's even! :)
cout << "The median is "<< new_array[(num/2)-1] << " and " << new_array[num/2] << endl;
}
mean(new_array, num);
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
void mode(int new_array[], int num) {
int* ipRepetition = new int[num];
// alocate a new array in memory of the same size (round about way of defining number of elements by a variable)
for (int i = 0; i < num; i++) {
ipRepetition[i] = 0;//initialize each element to 0
int j = 0;//
while ((j < i) && (new_array[i] != new_array[j])) {
if (new_array[i] != new_array[j]) {
j++;
}
}
(ipRepetition[j])++;
}
int iMaxRepeat = 0;
for (int i = 1; i < num; i++) {
if (ipRepetition[i] > ipRepetition[iMaxRepeat]) {
iMaxRepeat = i;
}
}
cout<< "The mode is " << new_array[iMaxRepeat] << endl;
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
void sort(int new_array[], int num){
//ARRANGE VALUES
for(int x=0; x<num; x++){
for(int y=0; y<num-1; y++){
if(new_array[y]>new_array[y+1]){
int temp = new_array[y+1];
new_array[y+1] = new_array[y];
new_array[y] = temp;
}
}
}
cout << "List: ";
for(int i =0; i<num; i++){
cout << new_array[i] << " ";
}
cout << "\n";
median(new_array, num);
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
答案 0 :(得分:3)
在非常高的水平上,首先是泄漏记忆。
int* ipRepetition = new int[num];
分配一个新数组,之后不会调用delete[]
。
其次,它通过遍历原始数据数组的大小,用零填充新数组,直到它到i
的当前位置,如果(new_array[i] != new_array[j])
(其中它检查两次以确保它增加j
。
如果找到匹配项或到达目前已填充的元素的末尾,则会向位置ipRepetition
中的j
数组添加一个匹配项。
这是为了跟踪使用new_array
索引i
中的数字的频率。
然后,下一个for
循环遍历这些数字,以查找索引i
最大值。
然后在此索引处打印原始数组中的值。
如果更改函数以返回值,则可能更有用。因为它是C ++,所以你可以使用向量来避免内存泄漏。
答案 1 :(得分:1)
你有两个并行数组:一个用于数字,一个用于计算重复次数。
计算重复的方式是通过在列表中迭代到当前数字,在第一个匹配处停止并递增其重复计数。假设您有以下数组:
5 5 2
在第一次迭代中,将并行数组的第一个值设置为0,然后立即断开内部循环并递增它,然后使用:
1? ?
并行数组中的。在第二次迭代中,循环将再次在第一个项上断开,因为new_array[1] == new_array[0] == 5
。所以你将离开:
2 0?
...当然在第三次迭代中,第三个值最终会设置为1。
如果您仍然难以理解,您可以将其视为给原始列表中的每个数字赋予一个“点”,然后将点向后移动到每个数字的第一个实例。你甚至可以在纸上试试这个。