看看有错没
//把40个学生数据写入到文件中,然后排序总分高低输出#include <stdio.h>
#include <string.h>
#define M 40
void pai_xu(float data[],int i);
struct stu_info
{
long no;
char name[8];
float math,english,politics,computer;
}stua[M],*stup;
int main()
{
FILE*fp;
float sum;
int i;
stup=stua;
if((fp=fopen("d: \\School\\students","w+"))==NULL)
{
printf("Open file error!");
exit(0);
}
printf("\n请输入学生数据,输入完成按"#"确认: \n");
for(i=0;i<M;i++,stup++)
{
scanf("%d%s%f%f%f%f",&stu_p->no,stu_p->name,stu_p->math,stu_p->english,
stu_p->politics,stu_p->computer);
if(&stu_p->no||stu_p->name||stu_p->math||stu_p->english||
stu_p->politics||stu_p->computer=='#')break;
sum=(stup_math+stu_p->english+stu_p->poplitics+stu_pcomputer);//计算总分数
pai_xu(sum,M); //调用pai_xu函数 ,使成绩总分从高到低排序
stu_p=stua;
fwrite(stu_p,sizeof(struct stuinfo),M,fp); //成块写入到文件中
rewind(fp); //指针移到文件开头
for(i=0;i<M;i++,stu_p++)
printf("学生成绩排名如下:\n");
printf("%5d %s %f %f %f %f\n",&stu_p->no,stu_p->name,stu_p->math,
stu_p->english,stu_p->politics,stu_p->computer); //读出40个学生分数从高到低排序
stua=stu_p;
fclose(fp);
return 0;
}
void pai_xu(float data[],int n)
{
int i,j;
float max,temp;
for(i=0;i<n-1;i++)
{
max=i;
for(j=i+1;j<n;j++)
if(data[i]>data[max]
max=j;
temp=data[i];
data[i]=data[max];
dat[amax]=temp;
}
return;
}
----------------解决方案--------------------------------------------------------
void pai_xu(float data[],int n)
{
int i,j;
float max,temp;
for(i=0;i<n-1;i++)
{
max=i;
for(j=i+1;j<n;j++)
if(data[i]>data[max] //这里,少半个括号.还有,既然max=i,那么这个条件永远都不会成立了.还有, 要想执行语句块的话,请用{}.
max=j;
temp=data[i];
data[i]=data[max];
dat[amax]=temp;
}
return;
}
----------------解决方案--------------------------------------------------------
大哥,你的错误可不止一处阿...我把程序改过了,你自己看看阿(我把M改成4了,方便测试)
//把40个学生数据写入到文件中,然后排序总分高低输出
#include <stdio.h>
#include <string.h>
#define M 4
typedef struct
{
long no;
char name[8];
float math,english,politics,computer;
float sum;
}stu_info;
void pai_xu(stu_info data[],int i);
int main(void)
{
FILE*fp;
float sum;
int i;
stu_info stua[M];
if((fp=fopen("d:\\students.txt","w+"))==NULL)
{
printf("Open file error!");
exit(0);
}
printf("\n请输入学生数据,输入完成按\"Enter\"确认: \n");
for(i=0;i<M;i++)
{
scanf("%d%s%f%f%f%f",&stua[i].no,&stua[i].name,&stua[i].math,&stua[i].english,&stua[i].politics,&stua[i].computer);
stua[i].sum=(stua[i].math+stua[i].english+stua[i].politics+stua[i].computer);//计算总分数
}
pai_xu(stua,M); //调用pai_xu函数 ,使成绩总分从高到低排序
for(i=0;i<M;i++)
{
fwrite(&stua[i],sizeof(stua[i]),M,fp);//成块写入到文件中
}
rewind(fp); //指针移到文件开头
printf("学生成绩排名如下:\n");
for(i=0;i<M;i++)
{
printf("%5d %s %f %f %f %f %f\n",stua[i].no,stua[i].name,stua[i].math,stua[i].english,stua[i].politics,stua[i].computer,stua[i].sum);
}
fclose(fp);
return 0;
}
void pai_xu(stu_info data[],int n)
{
int i,j,max;
stu_info temp;
for(i=0;i<n-1;i++)
{
max=i;
for(j=i+1;j<n;j++)
{
if(data[j].sum>data[max].sum)
{
temp=data[max];
data[max]=data[j];
data[j]=temp;
}
}
}
return;
}
----------------解决方案--------------------------------------------------------
//把40个学生数据写入到文件中,然后排序总分高低输出
#include <stdio.h>
#include <string.h>
#define M 40
void pai_xu(float data[],int i);
struct stu_info
{
long no;
char name[8];
float math,english,politics,computer;
}stua[M],*stup;
int main()
{
FILE*fp;
float sum;
int i;
stup=stua;
if((fp=fopen("d: \\School\\students","w+"))==NULL)
{
printf("Open file error!");
exit(0);
}
printf("\n请输入学生数据,输入完成按"#"确认: \n");
//Q1:既然已经指定学生个数,就不用再设置结束符,因为其后的循环次数都设置为学生个数
for(i=0;i<M;i++,stup++)
//Q2:强烈建议把格式调整得整洁点,容易观察括号是否对称
{
scanf("%d%s%f%f%f%f",&stu_p->no,stu_p->name,stu_p->math,stu_p->english,
stu_p->politics,stu_p->computer); //stu_p是什么?
if(&stu_p->no||stu_p->name||stu_p->math||stu_p->english||
stu_p->politics||stu_p->computer=='#')break;
sum=(stup_math+stu_p->english+stu_p->poplitics+stu_pcomputer);//计算总分数
pai_xu(sum,M); //调用pai_xu函数 ,使成绩总分从高到低排序
//Q3:函数传递参数正确否?
stu_p=stua;
fwrite(stu_p,sizeof(struct stuinfo),M,fp); //成块写入到文件中
rewind(fp); //指针移到文件开头
for(i=0;i<M;i++,stu_p++)
printf("学生成绩排名如下:\n");
printf("%5d %s %f %f %f %f\n",&stu_p->no,stu_p->name,stu_p->math,
stu_p->english,stu_p->politics,stu_p->computer); //读出40个学生分数从高到低排序
//Q4:既然是以总分排序,建议把总分都显示出来
stua=stu_p;
fclose(fp);
return 0;
}
void pai_xu(float data[],int n)
//Q5:再仔细检查一下排序程序,尤其是总分排序和原学生数组联系起来没?
{
int i,j;
float max,temp;
for(i=0;i<n-1;i++)
{
max=i;
for(j=i+1;j<n;j++)
if(data[i]>data[max]
max=j;
temp=data[i];
data[i]=data[max];
dat[amax]=temp;
}
return;
}
//最有效的检查方式是调试,自己动手调吧,错误信息一目了然
//建议:不如在学生信息里直接加入总分一项,排序时就简单一点
----------------解决方案--------------------------------------------------------
//建议:不如在学生信息里直接加入总分一项,排序时就简单一点
//建议:不如在学生信息里直接加入总分一项,排序时就简单一点??成绩是几门,请问你是怎么排序,??请指教。。
----------------解决方案--------------------------------------------------------