看看这个c++程序关于冒泡法的是哪里错了

来源:百度知道 编辑:UC知道 时间:2024/07/04 14:28:46
#include<iostream>
using namespace std;
enum{N=5};
struct Student
{
int num;
string name;
string study;
int mark;
};
Student Stu[N];
int main(){
int i,j,k;
int temp;
for(i=0;i<N;i++)
{cin>>Stu[i].num;
cin>>Stu[i].name;
cin>>Stu[i].study;
cin>>Stu[i].mark;}
for(int k=0;k<N;k++)
for(int j=N-1;j>=k;j--)
{
if(Stu[j].num>Stu[j+1].num)
{
temp=Stu[j].num;
Stu[j].num=Stu[j+1].num;
Stu[j+1].num=temp;
}}
for(i=0;i<N;i++)
{cout<<Stu[i].num<<" "<<Stu[i].name<<" "<<Stu[i].study<<" "<<Stu[i].mark<<endl;}
system("pause");
return 0;
}
为什么输入num有的会变成0 ?

for(int j=N-1;j>=k;j--)
改成
for(int j=N-2;j>=k;j--)

否则越界

j=n-1就是数组最后一个了,j+1 超界。
数组N,从0开始到N-1结束,从1开始到N结束。
冒泡比较一轮只比较N-1次,从最后一个开始往前比,或从倒数第二个往后比较。

#include"iostream.h"
#include"conio.h"
void maop(int a[],int n)
{
int i,j,t,tmp;
for(i=1;i<=n-1;i++)
{
t=n-1;
for(j=0;j<=t-1;j++)
{
if(a[j]>a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
for(i=0;i<n;i++) cout<<a[i]<<endl;
}
void main()
{

int a[10];

for(int i=0;i<10;i++)
{
cout<<"please input "<<i<<"th:"<<endl;
cin>>a[i];
}

textbackground(1);
textcolor(7);
clrscr();
window(50,200,50,400);
maop(a,10);
}