来高手求教..............
#include <stdio.h>#define N 2
void main ()
{
int i,j,bujige=0,youxiu=0;
struct student
{
int num;
char name[20];
float score[2];
};
struct student stu[N],temp;
printf ("这是一个学生成绩管理程序\n");
printf ("请输入学生的学号,姓名,平时成绩,期末成绩\n");
printf ("输入姓名时按回车,其他用空格分开\n");
for (i=0;i<N;i++)
{
scanf ("%d%s%f%f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1]);
stu[i].score[2]=stu[i].score[0]*0.2+stu[i].score[1]*0.8;
if (stu[i].score[2]<60) bujige++;
if (stu[i].score[2]>=90) youxiu++;
}
printf ("排序前学生的学号,姓名,平时成绩,期末成绩,总成绩是\n");
for (i=0;i<N;i++)
printf ("%d,%s,%.1f,%.1f,%.1f\n",stu[i].num,stu[i].name,stu[i].score[0],
stu[i].score[1],stu[i].score[2]);
for (i=0;i<N;i++)
for (j=0;j<N-i;j++)
if (stu[j].score[2]<stu[j+1].score[2])
{
temp=stu[j];stu[j]=stu[j+1];stu[j+1]=temp;
}
printf ("排序后学生的学号,姓名,平时成绩,期末成绩,总成绩是\n");
for (i=0;i<N;i++)
printf ("%d,%s,%.1f,%.1f,%.1f\n",stu[i].num,stu[i].name,stu[i].score[0],
stu[i].score[1],stu[i].score[2]);
printf ("不及格的百分比为%.2f\n优秀的比例为%.2f\n",bujige/N,youxiu/N);
}
以上是一个学生管理系统程序,这个程序有两个错误,第一个是score数组时候是应该是score[3];第二个是计算优秀不及格比例时候应该是除以一个浮点数,
但是.............这个程序现在能运行,并且有一丁点小问题
第一,这个程序写的时候定义的是score[2],这样是有两个元素,但是输入的时候调用stu.score[2]会输出最后一个学生的总成绩,是不是因为stu.score[2]虽然没有定义出来,但是由于c没有边界检测,造成了内存入侵,恰好这个结构体数组后面的几个字节是可修改的,没有崩溃,随着循环进行下一个结构体数组成员写入的时候,因为number跟score都是一样的int型,就把入侵的部分完全覆盖掉了,所以只剩下最后一个stu.score[2],我这个解释合理不....如果是这样的话输出前面学生的总分时候为什么前面的学生总分都是零而没有调用出来下一个成员的学号?难道是没有定义的结构体成员部分(stu.score[2])也会改变结构体整体大小?这样貌似也说不过去呀的.....
第二,Eric S Roberts说过写程序首先要考虑的是他的实用性,这里我想写一个文件读写部分来保存这个成绩表的,不过我们年前是没有学习文件操作的,自己弄了半天没有搞定,如果老师有空可不可以帮我搞定一下,然后我再看看
第三,这个程序断点调试时候程序会出来错误提示(Loaded 'ntdll.dll', no matching symbolic information found.Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.),不晓得老师调试怎过不过得去,是因为机器不一样,还是软件冲突,还是系统是盗版,还是别的什么的?
初来乍到这个论坛没有什么分可以给,希望了解数据结构的大虾来帮忙解释一下