反复调用自定义函数,除第一次剩下几次为什么调用无法实现?

问题遇到的现象和发生背景

多次调用成绩排序函数,之后几次无法实现;文件无法正常读写

问题相关代码,请勿粘贴截图

/数学排名
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;
}