关于结构体数组的相关问题

img
img



#include<iostream>
using namespace std;

class moon{
    public:
    double s;
    double p;
    double i;
};

struct sumdata{
    double sum;
};

struct pricedata{
    double price;
};
//10 20
//18 15 10 12 13 1 2 3 4 5
//75 72 45 1  2  3 4 5 6 7
//4  5  4.5 
//每个输入包含一个测试用例。
//每个测试用例先给出一个不超过 1000 的正整数 N 表示月饼的种类数、
//以及不超过 500(以万吨为单位)的正整数 D 表示市场最大需求量。
//随后一行给出 N 个正数表示每种月饼的库存量(以万吨为单位);
//最后一行给出 N 个正数表示每种月饼的总售价(以亿元为单位)。
//数字间以空格分隔。
//N D
//S1 S2 S3 SN
//P1 P2 P3 PN
int main()
{
    int N,D;
    cin>>N>>D;
    class moon M[N];
    sumdata S[N];
    pricedata P[N];
    for(int i=0;i<N;i++)
    {
        cin>>S[i].sum;
    }
    for(int i=0;i<N;i++)
    {
        cin>>P[i].price;
    }
    for(int i=0;i<N;i++)
    {
        M[i].s = S[i].sum;
        M[i].p = P[i].price;
        M[i].i = M[i].p / M[i].s;
    }
    for(int i=0;i<N;i++)//对结构体数组进行冒泡排序,大的在前,小的在后 
    {
        for(int j=0;j<N-i;j++)
        {
            if(M[i].i<M[i+1].i)
            {
                double sum,price,ind;
                sum = M[i].s;
                price = M[i].p;
                ind = M[i].i;
                M[i].s = M[i+1].s;
                M[i].p = M[i+1].p;
                M[i].i = M[i+1].i;
                M[i+1].s = sum;
                M[i+1].p = price;
                M[i+1].i = ind;
            }
        }
    }
    cout<<M[1].s<<endl;//输出第二个大的 
    cout<<M[1].p<<endl;
    cout<<M[N-1].s<<endl;//输出最后一个小的,(数组长度为N,所以最后一个下标为N-1} 
    cout<<M[N-1].p<<endl;
}


想问一下,为什么长度为N的结构体数组,输出下标为N-1时出现了错误?

这题的主要问题在 class moon; 类里定义了元素 i ,然后在后面的代码里又将 i 定义成for()循环里的自变量,然后就乱了,出现莫名其妙的现象,修改如下,供参考:

#include<iostream>
using namespace std;
class moon{
    public:
    double s;
    double p;
    double i;
};
struct sumdata{
    double sum;
};
struct pricedata{
    double price;
};
//10 20
//18 15 10 12 13 1 2 3 4 5
//75 72 45 1  2  3 4 5 6 7
//4  5  4.5
//每个输入包含一个测试用例。
//每个测试用例先给出一个不超过 1000 的正整数 N 表示月饼的种类数、
//以及不超过 500(以万吨为单位)的正整数 D 表示市场最大需求量。
//随后一行给出 N 个正数表示每种月饼的库存量(以万吨为单位);
//最后一行给出 N 个正数表示每种月饼的总售价(以亿元为单位)。
//数字间以空格分隔。
//N D
//S1 S2 S3 SN
//P1 P2 P3 PN
int main()
{
 int N=10,D=20;
    cin>>N>>D;
    class moon M[N];
    sumdata S[N];
    pricedata P[N];
    for(int i=0;i<N;i++)
    {
        cin>>S[i].sum;
    }
    for(int i=0;i<N;i++)
    {
        cin>>P[i].price;
    }
    for(int k=0;k<N;k++)
    {
        M[k].s = S[k].sum;
        M[k].p = P[k].price;
        M[k].i = M[k].p / M[k].s;
    }
    for(int k=0;k<N-1;k++)//对结构体数组进行冒泡排序,大的在前,小的在后
    {
        for(int j=0;j<N-k-1;j++)
        {
            if(M[j].i<M[j+1].i)
            {
                double sum,price,ind;
                sum = M[j].s;
                price = M[j].p;
                ind = M[j].i;
                M[j].s = M[j+1].s;
                M[j].p = M[j+1].p;
                M[j].i = M[j+1].i;
                M[j+1].s = sum;
                M[j+1].p = price;
                M[j+1].i = ind;
            }
        }
    }
    cout<<M[1].s<<endl;//输出第二个大的
    cout<<M[1].p<<endl;
    cout<<M[N-1].s<<endl;//输出最后一个小的,(数组长度为N,所以最后一个下标为N-1}
    cout<<M[N-1].p<<endl;
    system("pause");
}

//10 20
//18 15 10 12 13 1 2 3 4 5
//75 72 45 1 2 3 4 5 6 7
//k=0,M[0].s=18.000000,M[0].p=75.000000,M[0].i=4.166667
//k=1,M[1].s=15.000000,M[1].p=72.000000,M[1].i=4.800000
//k=2,M[2].s=10.000000,M[2].p=45.000000,M[2].i=4.500000
//k=3,M[3].s=12.000000,M[3].p=1.000000,M[3].i=0.083333
//k=4,M[4].s=13.000000,M[4].p=2.000000,M[4].i=0.153846
//k=5,M[5].s=1.000000,M[5].p=3.000000,M[5].i=3.000000
//k=6,M[6].s=2.000000,M[6].p=4.000000,M[6].i=2.000000
//k=7,M[7].s=3.000000,M[7].p=5.000000,M[7].i=1.666667
//k=8,M[8].s=4.000000,M[8].p=6.000000,M[8].i=1.500000
//k=9,M[9].s=5.000000,M[9].p=7.000000,M[9].i=1.400000

//10
//45
//12
//1
//请按任意键继续. . .

出错?是报错还是输出错误?我这里看了,能输出的。输出:
15
45
75
4