weixin_63076421 2022-01-17 15:57 采纳率: 75%
浏览 46
已结题

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

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

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

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

/数学排名
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条回答 默认 最新

  • 关注

    代码有点乱。
    (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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月25日
  • 已采纳回答 1月17日
  • 创建了问题 1月17日

悬赏问题

  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起