多次调用成绩排序函数,之后几次无法实现;文件无法正常读写
/数学排名
fun(score1,NUM);
while(j<NUM)
{
for(i=0; i<NUM; i++)
if(stu[i].math==score1[j])
{
stu[i].rank_math=j+1;
}
j++;
}
//计算机排名
fun(score2,NUM);
while(k<NUM)
{
for(i=0; i<NUM; i++)
if(stu[i].computer==score2[k])
{
stu[i].rank_computer=k+1;
}
k++;
}
//英语排名
fun(score3,NUM);
while(l<NUM)
{
for(i=0; i<NUM; i++)
if(stu[i].English==score3[l])
{
stu[i].rank_English=l+1;
}
l++;
}
//总成绩排名
fun(score,NUM);
while(m<NUM)
{
for(i=0; i<NUM; i++)
if(stu[i].sum==score[m])
{
stu[i].rank=m+1;
}
m++;
}
以下为错误程序:
#include <stdio.h>
#include<string.h>
#include<math.h>
#define NUM 3
struct student_score
{
char ID[10];
float math;
int rank_math;
float computer;
int rank_computer;
float English;
int rank_English;
float sum;
int rank;
char name[10];
char code[10];
}stu[NUM];
void fun(float p,int n)/排序并删除数组中重复元素/
{
int i,j,k,temp;
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
if((p+i)<(p+j))
{
temp=(p+j);
(p+j)=(p+i);
(p+i)=temp;
}}}
for(i=0;i<n;i++) //循环判断数组中每一个数
{
for(j=i+1;j<n;j++) //判断a[i]后边的数是否和a[i]相等
{
if((p+i)==*(p+j))
{
for(temp=j;temp<n;temp++)
(p+temp)=(p+temp+1); //将a[j]后面的元素全往前移一个位置
j--; //a[j+1]取代a[j]位置,为使下次从a[j+1]开始查找,j减一(为使j保持不变)
n--; //数组长度减一
}}}
}
int main()
{
int i,j=0,k=0,l=0,m=0;
float temp;
float score1[NUM],score2[NUM],score3[NUM],score[NUM];
for(i=0;i<NUM;i++)
scanf("%s%f%f%f%s",stu[i].ID,&stu[i].math,&stu[i].computer,
&stu[i].English,stu[i].name);/输入各科成绩/
for(i=0;i<NUM;i++)
stu[i].sum=stu[i].math+stu[i].computer+stu[i].English;/总分/
for(i=0;i<NUM;i++)
{
score[i]=stu[i].sum;
score1[i]=stu[i].math;
score2[i]=stu[i].computer;
score3[i]=stu[i].English;}
//数学排名
fun(score1,NUM);
while(j<NUM)
{
for(i=0; i<NUM; i++)
if(stu[i].math==score1[j])
{
stu[i].rank_math=j+1;
}
j++;
}
//计算机排名
fun(score2,NUM);
while(k<NUM)
{
for(i=0; i<NUM; i++)
if(stu[i].computer==score2[k])
{
stu[i].rank_computer=k+1;
}
k++;
}
//英语排名
fun(score3,NUM);
while(l<NUM)
{
for(i=0; i<NUM; i++)
if(stu[i].English==score3[l])
{
stu[i].rank_English=l+1;
}
l++;
}
//总成绩排名
fun(score,NUM);
while(m<NUM)
{
for(i=0; i<NUM; i++)
if(stu[i].sum==score[m])
{
stu[i].rank=m+1;
}
m++;
}
for(i=0;i<NUM;i++)
printf("%s %.1f %d %.1f %d %.1f %d %.1f %d\n",
stu[i].ID,
stu[i].math,stu[i].rank_math,
stu[i].computer,stu[i].rank_computer,
stu[i].English,stu[i].English,
stu[i].sum,stu[i].rank);
/存入文件/
FILE *fp;
if((fp=fopen("F:\stu_list,txt","w"))==NULL)
{ printf("cannot open file\n");
return 1; }
for(i=0;i<NUM;i++)
fprintf(fp,"%s %f %d %f %d %f %d %f %d %s\n",stu[i].ID,
stu[i].math,stu[i].rank_math,
stu[i].computer,stu[i].rank_computer,
stu[i].English,stu[i].English,
stu[i].sum,stu[i].rank,
stu[i].name[10]);
fclose(fp);
}
代码有点乱。
(1)用score1、score2、score3存储成绩,但是这些成绩跟你的结构体没绑定,score1这些在排序的时候,结构里的信息没有随之排序。
(2)fclose(fp)上面一行写文件的地方: stu[i].name[10]);这里用stu[i].name);就可以了,stu[i].name[10]是一个字符,而且越界了。
(3)fun函数只排序就可以了,排名可以再单独处理就是了,没必要删除数据啊,删了数据,你的NUM的值没变,还是按之前的数来处理,肯定出错啊。
代码给你重写了,如下:
#include <stdio.h>
#include<string.h>
#include<math.h>
#define NUM 3
struct student_score
{
char ID[10];
float math;
int rank_math;
float computer;
int rank_computer;
float English;
int rank_English;
float sum;
int rank;
char name[10];
char code[10];
}stu[NUM];
//显示数组
void display(struct student_score stu[],int n)
{
int i;
for (i=0;i<n;i++)
{
printf("%s %.1f %d %.1f %d %.1f %d %.1f %d\n",
stu[i].ID,
stu[i].math,stu[i].rank_math,
stu[i].computer,stu[i].rank_computer,
stu[i].English,stu[i].rank_English,
stu[i].sum,stu[i].rank);
}
}
//计算排名flag=0表示用总分排序,1表示用数学排序,2表示计算机排序,3表示英语排序
void rank(struct student_score stu[], int n,int flag)
{
int i,rank = 1;
for (i=0;i<n;i++)
{
if (flag == 0)
{
if (i==0)
{
stu[i].rank = rank;
}else
{
if (stu[i].sum == stu[i-1].sum)
{
stu[i].rank = rank;
}else
{
rank++;
stu[i].rank = rank;
}
}
}else if (flag == 1)
{
if (i==0)
{
stu[i].rank_math = rank;
}else
{
if (stu[i].math == stu[i-1].math)
{
stu[i].rank_math = rank;
}else
{
rank++;
stu[i].rank_math = rank;
}
}
}else if (flag == 2)
{
if (i==0)
{
stu[i].rank_computer = rank;
}else
{
if (stu[i].computer == stu[i-1].computer)
{
stu[i].rank_computer = rank;
}else
{
rank++;
stu[i].rank_computer = rank;
}
}
}else if (flag == 3)
{
if (i==0)
{
stu[i].rank_English = rank;
}else
{
if (stu[i].English == stu[i-1].English)
{
stu[i].rank_English = rank;
}else
{
rank++;
stu[i].rank_English = rank;
}
}
}
}
}
//排序 flag=0表示用总分排序,1表示用数学排序,2表示计算机排序,3表示英语排序
void bubble_sort(struct student_score stu[], int n,int flag)
{
int i,j;
struct student_score temp;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if (flag==0 && stu[j].sum < stu[j+1].sum)
{
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1]= temp;
}else if (flag==1 && stu[j].math < stu[j+1].math)
{
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1]= temp;
}else if (flag ==2 && stu[j].computer < stu[j+1].computer)
{
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1]= temp;
}else if (flag==3 && stu[j].English < stu[j+1].English)
{
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1]= temp;
}
}
}
//排序后计算排名
rank(stu,n,flag);
}
int main()
{
int i,j=0,k=0,l=0,m=0;
for(i=0;i<NUM;i++)
scanf("%s%f%f%f%s",stu[i].ID,&stu[i].math,&stu[i].computer, &stu[i].English,stu[i].name);//输入各科成绩
for(i=0;i<NUM;i++)
stu[i].sum=stu[i].math+stu[i].computer+stu[i].English;//总分
//按照总分排序
bubble_sort(stu,NUM,0);
//按照数学排序
bubble_sort(stu,NUM,1);
//按照计算机排序
bubble_sort(stu,NUM,2);
//按照英语排序
bubble_sort(stu,NUM,3);
//显示数组
display(stu,NUM);
/*存入文件*/
FILE *fp;
if((fp=fopen("F:\stu_list,txt","w"))==NULL)
{
printf("cannot open file\n");
return 0;
}
for(i=0;i<NUM;i++)
fprintf(fp,"%s %f %d %f %d %f %d %f %d %s\n",stu[i].ID,
stu[i].math,stu[i].rank_math,
stu[i].computer,stu[i].rank_computer,
stu[i].English,stu[i].rank_English,
stu[i].sum,stu[i].rank,
stu[i].name);
fclose(fp);
return 0;
}