C++ c+中的平均值、中值和模式不正确+;程序

C++ c+中的平均值、中值和模式不正确+;程序,c++,C++,标题说明了这一点。该程序基本上应该做如下工作:;询问调查学生的人他们调查了多少部电影,输入学生观看的电影数量,然后找出平均值、平均值和模式。它确实使用指针和动态数组。代码如下,非常感谢您的帮助。对于输入,我使用1-10,这使我的平均值为5.5,中位数为6.5,模式为-1 EDIT忘了提到这一点,但我的逻辑似乎有缺陷。如果有人能指出原因,那就太好了 编辑2使用冒泡排序更新了代码,以帮助修复我遇到的一些问题。以下是更新后的代码: #include <iostream> #include

标题说明了这一点。该程序基本上应该做如下工作:;询问调查学生的人他们调查了多少部电影,输入学生观看的电影数量,然后找出平均值、平均值和模式。它确实使用指针和动态数组。代码如下,非常感谢您的帮助。对于输入,我使用1-10,这使我的平均值为5.5,中位数为6.5,模式为-1

EDIT忘了提到这一点,但我的逻辑似乎有缺陷。如果有人能指出原因,那就太好了

编辑2使用冒泡排序更新了代码,以帮助修复我遇到的一些问题。以下是更新后的代码:

#include <iostream>
#include <iomanip>
using namespace std;

double calculateMean(int *, int);
double calculateMedian(int *, int);
int calculateMode(int *, int);
void bubbleSort(int *, int);

int main()
{
    int *nums;
    int num_students;
    char repeat = ' ';

    do
    {


        cout << "Enter in how many students were surveyed: ";
        cin >> num_students;


        while (num_students < 0)
        {
            cout << "Invalid number of students!\n";
            cout << "Enter in how many students were surveyed: ";
            cin >> num_students;
        }


        nums = new int[num_students];


        for (int count = 0; count < num_students; count++)
        {
            cout << "Number of movies say by Person #" << (count + 1) << ": ";
            cin >> nums[count];

            while (nums[count] < 0)
            {
                cout << "Invalid number. Please enter in a positive number: ";
                cout << "\nNumber of movies say by Person #" << (count + 1) << ": ";
                cin >> nums[count];
            }

        }
        bubbleSort(nums, num_students);

        cout << fixed << showpoint << setprecision(1);

        cout << "\nThe mean is: ";
        cout << calculateMean(nums, num_students) << endl;

        cout << "\nThe median is: ";
        cout << calculateMedian(nums, num_students) << endl;

        cout << "\nThe mode is: ";
        cout << calculateMode(nums, num_students) << endl;

        delete[] nums;
        nums = 0;

        cout << "Do you want to go again? Y for Yes, N for No.";
        cin >> repeat;


    } while (repeat == 'Y' || repeat == 'y');
    cout << "Program ending.\n";

    return 0;
}

void bubbleSort(int *nums, int num_students)
{
    int temp;
    for (int i = 0; i < num_students; i++){
        for (int j = i + 1; j < num_students; j++){
            if (nums[i] > nums[j])
{
                temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            }
        }
    }
}


double calculateMean(int *nums, int num_students)
{
    double total = 0;
    double average;

    for (int count = 0; count < num_students; count++)
    {
        total += nums[count];
    }
    average = total / num_students;
    return average;
}


double calculateMedian(int *nums, int num_students)
{
    double median = 0.0;
    cout << fixed << showpoint << setprecision(1);


    if (num_students % 2 == 0)
    {
        median = (nums[num_students / 2 - 1] + nums[(num_students / 2)]) / 2.0;
    }
    else
        median = nums[num_students / 2];

    return median;
}


int calculateMode(int *nums, int num_students)
{
    int mode = 0;
    int val = 0;
    int index;


    for (index = 0; index < num_students - 1; index++)  // note the - 1 here
    {
        if (nums[index] == nums[index + 1])
        {
            mode++;
            val = *(nums + index);
        }
    }
    if (val > 0)
        return val;
    else
        return -1;

}
#包括
#包括
使用名称空间std;
双计算表(int*,int);
双计算字典(int*,int);
int计算模式(int*,int);
void bubbleSort(int*,int);
int main()
{
int*nums;
国际大学学生;
字符重复=“”;
做
{
学生人数;
而(学生人数<0)
{
学生人数;
}
nums=新的整数[num_学生];
对于(int count=0;countcout您的
calculateMode
函数中有一个错误:

for (index = 0; index < num_students; index++)
{
    if (*(nums + index) == *(nums + (index + 1)))  
                                           ^^^ // this goes out of bounds

median = (nums[1] + nums[2]) / 2.0;  //nums[2] is out of bounds
纠正方法是这样做:

median = (nums[num_students / 2 - 1 ] + nums[(num_students / 2 )]) / 2.0;

你可以看看我的节目

#include<bits/stdc++.h>
using namespace std;

void fill_array(long int a[],long int size);
double mean(long int a[],double& sum,long int size);
double median(long int a[],long int size);
void bubble_sort(long int a[],long int size);
int mode(long int a[],long int size);

int main()
{
    long int size;
    cin >> size;
    long int a[size];
    double sum = 0.0,mn1,mn2,mn3;
    fill_array(a,size);
    mn1 = mean(a,sum,size);
    mn2 = median(a,size);
    mn3 = mode(a,size);
    cout << mn1 << endl;
    cout << mn2 << endl;
    cout << mn3;
    return 0;
}
void fill_array(long int a[],long int size)
{
    for(int i=0;i<size;i++)
    {
        cin >> a[i];
    }
}
double mean(long int a[],double& sum,long int size)
{
    for(int i=0;i<size;i++)
    {
        sum += a[i];
    }
    double mn;
    mn = sum/size;
    return mn;
}
double median(long int a[],long int size)
{
    bubble_sort(a,size);
    double md;
    if(size%2==0)
    {
        md = (a[size/2]+a[(size/2)-1])/2.0;
    }
    else
    {
        md = a[size/2];
    }
    return md;
}
void bubble_sort(long int a[],long int size)
{
    for(int i=size-1;i>0;i--)
    {
        for(int j=0;j<i;j++)
        {
            if(a[j] > a[j+1])
            {
                int temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
            }
        }
    }
}
int mode(long int a[],long int size)
{
    int mode=a[0], mx=1, count=1;
    for(int i=0;i<size-1;i++)
    {
        if(a[i]==a[i+1]) {
            ++count;
        }
        else
            count=1;
        if(count>mx)
        {
            mx=count;
            mode=a[i];
        }
    }
    return mode;
}
#包括
使用名称空间std;
空填充数组(长整数a[],长整数大小);
双平均值(长整数a[],双和,长整数大小);
双中位数(长整数a[],长整数大小);
void bubble_排序(长整数a[],长整数大小);
整数模式(长整数a[],长整数大小);
int main()
{
长整数大小;
cin>>尺寸;
长整型[尺寸];
双和=0.0,mn1,mn2,mn3;
填充数组(a,大小);
mn1=平均值(a、总和、大小);
mn2=中值(a,尺寸);
mn3=模式(a,尺寸);

问题是什么…?@WojciechFrohmberg我的逻辑似乎有缺陷。我忘了在主要帖子中添加这一点,但我只是想知道是否有人能帮我弄清楚为什么它不能像预期的那样工作。调试器肯定会帮助实现这一目标。你可能应该注意你的输入是否已排序。如果没有,只有t他的意思是计算似乎有成功的希望。而
模式
计算调用未定义的行为,如
*(nums+(index+1)
索引==(num_-1)时
超出了数组的界限。在
中值计算中也存在类似的问题。记住C/C++数组是零基的。@WhozCraig我很确定我已经修复了它…代码现在看起来如何?虽然,我不能100%确定如何输出多个模式。有什么想法吗?它可以工作,但减去模式部分。这似乎有帮助,然而,我得到的答案仍然是错误的。如果我说有7个学生,然后做10,20,30,40,50,60,10的输入,我得到的平均值是31.4(正确),中位数是30(错误),模式是10(正确)。这似乎是在转换为人类计数(人类开始计数1,计算机开始计数0),然后搞砸了…请更改
calculateMedian
函数,使其也符合边界条件。此外,必须对数字进行排序,才能用于中值计算。我将如何更改它?此外,我添加了一个气泡排序函数,代码如下:我更新了答案,以显示
的错误>calculateMedian
。对于链接中的代码,您的
bubbleSort
函数
return
语句——这应该做什么?此外,您应该使用此冒泡排序代码更新您的问题,因为其他人可能由于限制无法访问URL链接,并且不会是永久性的。谢谢您,VS13说这是正确的如果不存在返回语句,则返回一个返回语句,这就是我拥有它的原因。我现在也要更新它。但是,假设有7个学生,没有数字相同。模式将输出-1,这显然是错误的。对此有什么想法吗?
median = (nums[num_students / 2 - 1 ] + nums[(num_students / 2 )]) / 2.0;
#include<bits/stdc++.h>
using namespace std;

void fill_array(long int a[],long int size);
double mean(long int a[],double& sum,long int size);
double median(long int a[],long int size);
void bubble_sort(long int a[],long int size);
int mode(long int a[],long int size);

int main()
{
    long int size;
    cin >> size;
    long int a[size];
    double sum = 0.0,mn1,mn2,mn3;
    fill_array(a,size);
    mn1 = mean(a,sum,size);
    mn2 = median(a,size);
    mn3 = mode(a,size);
    cout << mn1 << endl;
    cout << mn2 << endl;
    cout << mn3;
    return 0;
}
void fill_array(long int a[],long int size)
{
    for(int i=0;i<size;i++)
    {
        cin >> a[i];
    }
}
double mean(long int a[],double& sum,long int size)
{
    for(int i=0;i<size;i++)
    {
        sum += a[i];
    }
    double mn;
    mn = sum/size;
    return mn;
}
double median(long int a[],long int size)
{
    bubble_sort(a,size);
    double md;
    if(size%2==0)
    {
        md = (a[size/2]+a[(size/2)-1])/2.0;
    }
    else
    {
        md = a[size/2];
    }
    return md;
}
void bubble_sort(long int a[],long int size)
{
    for(int i=size-1;i>0;i--)
    {
        for(int j=0;j<i;j++)
        {
            if(a[j] > a[j+1])
            {
                int temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
            }
        }
    }
}
int mode(long int a[],long int size)
{
    int mode=a[0], mx=1, count=1;
    for(int i=0;i<size-1;i++)
    {
        if(a[i]==a[i+1]) {
            ++count;
        }
        else
            count=1;
        if(count>mx)
        {
            mx=count;
            mode=a[i];
        }
    }
    return mode;
}