C++新手调试的问题

输入4个人的信息,按高数成绩从低到高输出他们的信息,为什么输出的时候会多了个0 0?而且明明是输入4个就可以的了,为什么要输5个?而且用起泡法还不能把人的信息调换过来。在这里请教各位高手了!
附:

#include <iostream.h>
#include <iomanip.h>
#include <string.h>
struct Student
{
int num;
char name[20];
float score;
}stu[10];
void main()
{
int i,h,m,j;
float t;
char p[20];
int g;
cout<<"请输入任意10个学生的信息,包括学号、姓名以及高数成绩。"<<endl;
for(i=0;i<=4;i++)
{
cin>>stu[i].num>>stu[i].name>>stu[i].score;
}
for (j=0;j<=4;j++)
for (i=0;i<=4-j;i++)
if(stu[i].num>stu[i+1].num)
{
t=stu[i].score;stu[i].score=stu[i+1].score;stu[i+1].score=t;
strcpy(p,stu[i].name); strcpy(stu[i].name,stu[i+1].name); strcpy(stu[i+1].name,p);
g=stu[i].num;stu[i].num=stu[i+1].num;stu[i+1].num=g;
}
for(i=0;i<=4;i++)
{
cout<<stu[i].num<<setw(5)<<stu[i].name<<setw(5)<<stu[i].score<<endl;
}
cout<<"高数成绩最高的三位同学的信息:"<<endl;
for(i=1;i<=3;i++)
{
cout<<stu[i].num<<setw(5)<<stu[i].name<<setw(5)<<stu[i].score<<endl;
}
cout<<"请输入该转专业同学的学号"<<endl;
cin>>h;
for(i=0;i<=3;i++)
{
if(stu[i].num==h)
{
m=i;
}
}
i=0;
for(i=0;i<=3;i++)
{
if(i==m) continue;
cout<<stu[i].num<<setw(5)<<stu[i].name<<setw(5)<<stu[i].score<<endl;
}
}
问一下 ,0 0的问题已经解决了,可是为什么按高数成绩从低到高排列人的信息为什么不行?还是原来的样子?我见strcpy在VC中没变成蓝色,那么这样就没起作用了吗?请教一下各位大大

楼主,根据你的要求再此改了

1.按高数成绩从低到高排列人的信息可以了,只是把原来的for循环里< 改为 >,即是从低到高排列。

2.strcpy在VC中的颜色是不变的

具体的代码里有说明,楼主看看:

#include <iostream.h>

#include <iomanip.h>

#include <string.h>

struct Student

{

 int num;

 char name[20];

 float score;

}stu[10];

void main()

{

 int i,h,m,j;

 float t;

 char p[20];

 int g;

 cout<<"请输入任意4个学生的信息,包括学号、姓名以及高数成绩。"<<endl;

 for(i=0;i<4;i++) //i<=4 改为 i<4,你输入的是4个学生的信息,下标是0,1,2,3正好四个,如果i<=4那就是5个了!!!

 {

  cin>>stu[i].num>>stu[i].name>>stu[i].score;

 }

 cout<<"按高数成绩从低到高排列:"<<endl;

 for (j=1;j<4;j++)  //j=0改为j=1,就不会出现0 0了,j<=4 改为 j<4

 {/////

 for (i=0;i<4-j;i++)  //i<=4-j 改为 i<4-j

  if(stu[i].score > stu[i+1].score) ////从低到高排列

  {

   t=stu[i].score;stu[i].score=stu[i+1].score;stu[i+1].score=t;

   strcpy(p,stu[i].name); strcpy(stu[i].name,stu[i+1].name); strcpy(stu[i+1].name,p);

   g=stu[i].num;stu[i].num=stu[i+1].num;stu[i+1].num=g;

  }

 }/////

 for(i=0;i<4;i++) //i<=4 改为 i<4

 {

  cout<<stu[i].num<<setw(5)<<stu[i].name<<setw(5)<<stu[i].score<<endl;

 }

 cout<<"高数成绩最高的三位同学的信息:"<<endl;

 for(i=3;i>0;i--) ///(i=1;i<=3;i++)改为(i=3;i>0;i--),输出的是高数成绩最高3个学生信息,下标为3,2 ,1

 {

  cout<<stu[i].num<<setw(5)<<stu[i].name<<setw(5)<<stu[i].score<<endl;

 }

 cout<<"请输入该转专业同学的学号"<<endl;

 cin>>h;

 for(i=0;i<=3;i++)

 {

  if(stu[i].num==h)

  {

   m=i;

  }

 }

 i=0;

 for(i=0;i<=3;i++)

 {

  if(i==m) continue;

  cout<<stu[i].num<<setw(5)<<stu[i].name<<setw(5)<<stu[i].score<<endl;

 }

}

温馨提示:内容为网友见解,仅供参考
第1个回答  2010-05-03
for循环里应该是小于4而不是小于等于4,如果小于等于4,那你肯定在输入的时候要输入5个数了,下标分别为0,1,2,3,4
第2个回答  2010-05-04

输入输出的for循环里,将循环条件改为<。

将排序那段改为下面的:

for (j=0;j<4;j++)

for (i=j;i<3;i++)

  if(stu[j].score>stu[i+1].score)

  {

   t=stu[j].score;stu[j].score=stu[i+1].score;stu[i+1].score=t;

            strcpy(p,stu[j].name); strcpy(stu[j].name,stu[i+1].name); strcpy(stu[i+1].name,p);

            g=stu[j].num;stu[j].num=stu[i+1].num;stu[i+1].num=g;

  }

这是部分结果,没运行完。

第3个回答  2010-05-03
数组越界

C++新手调试的问题
1.按高数成绩从低到高排列人的信息可以了,只是把原来的for循环里< 改为 >,即是从低到高排列。2.strcpy在VC中的颜色是不变的 具体的代码里有说明,楼主看看:include <iostream.h> include <iomanip.h> include <string.h> struct Student { int num;char name[20];float score;}stu[10];...

c++调试过程中出现错误 2 error LNK1120: 1 个无法解析的外部命令为什 ...
你是不是用了动态链接库啊,这个错误是说能找到这个符号,但是不知道如何解析,也就是找不到这个符号的源。你是不是用了动态链接库?把库加进来就行了

关于C++编译器F5、F11键调试的问题
有两个办法解决,第一个:在进入后按shift+F11,操作是跳出函数。那么就会执行完那个文件里面的有关代码并跳出来,接下来的<<是个重载操作符,在F11的作用下也会进入更底层的操作。解决的方法同上。除此之外还有个办法:将光标移到输出语句的下一行语句,按ctrl+F10,直接执行到当前光标所在的地方,这...

C++调试出现的问题,弹框。
这种就是运行时错误,编译器是检查不出来的

Dev C++ 调试功能详细总结
确保Dev C++的调试配置正常,常见问题如下:1. 确认工具栏中的编译选项已设置。2. 开启产生调试信息功能,此功能未开启可能导致无法进入调试模式。3. 解决“error-begin No source file named xxx”错误。若遇到该问题,可以通过以下步骤解决:检查项目配置,确保源文件路径正确,如需添加配置,参照Dev ...

C++程序调试过程中:写入位置 0x3767BEC0 时发生访问冲突。
2、句柄或指针在使用前被释放解决方法:检查代码配合调试,揪出野指针分析:内存冲突问题经常发生于用malloc等进行内存分配后指针的使用。3、或者是因为参数没有进行初始化,导数访问冲突这种情况,在调用时,一定注意把相应的参数进行初始化。。。Ps:不知道你是编写C++还是C#程序,也没有出错位置源代码,...

请问C++里面单步调试问题!
调试的时候,你可以设置断点啊,从一个断点到另一个断点,可以选择调试方法的,单步调试,或者运行到下一个断点。

vs2010 c++ 调试的时候。debug assertion failed
既然提示这个了就说明你使用的某个东西有问题。解决:1.遇到这个问题可以选择Retry。会跳到断言处。你可以看看到底是哪个函数遇到的问题。2.到你自己的代码中找到使用该函数处。3。检查自己的代码中是否使用有问题。建议:遇到该问题应多调试。下次再截图,请截图Retry后的代码。

在c++程序进行调试时,如何设置断点!
1、打开Dve-C++软件,文件——新建——项目,这步必需要新建项目,如果是新建源代码的话,程序可以正常运行,但是不能使用断点功能的,所以,必需新建项目。2、选择“Console Application"这个是最常用的,确定——保存。3、把原有的程序删掉,写自己程序。4、在要添加断点的行中左侧单击,就可以添加断点...

用visual c++调试c程序,调试了几次后出现了错误后,就不能调试 了这是...
我用VC++6.0也常遇到这种情况,这时强制关闭,重新打开工作空间,再调试。强制关闭方法:打开任务管理器(Ctrl+Alt+Delete),在“应用程序”选项卡下选择VC,点结束任务。

相似回答
大家正在搜