共3门学科,要求用C语言编程,输入全班成绩,并把它们的平均分进行排序,如何做到?

我请教下,共3门学科,要求用C语言编程,输入全班成绩,并把它们的平均分进行排序,如何做到?
最新回答
玲宝咱深乃

2024-11-23 10:17:28

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define stuNum  3 //假设全班学生3人  太多我懒得输,反正测试,你想改多少自己改
#define nameLen 11 //学科名称的最大字符数  我预设最多5个中文字  不满意自己改

typedef struct xueke
{
    char xkName[nameLen];//学科名称
    float xkp;//学科平均分
}XK;
int main()
{
    int y[stuNum],s[stuNum],w[stuNum],i,j;//定义语文 数学 外语 三学科
    int numsave,sum[]={0,0,0};//记录三科成绩和
    char *nameSave=(char *)malloc(sizeof(char)*nameLen);
    XK xk[3];//记录三科名称及平均分
    //录入成绩
    printf("录入%d名学生的语文成绩:\n",stuNum);
    for(i=0;i<stuNum;i++)
    {
        scanf("%d",&y[i]);
        sum[0]=sum[0]+y[i];
    }
    printf("录入%d名学生的数学成绩:\n",stuNum);
    for(i=0;i<stuNum;i++)
    {
        scanf("%d",&s[i]);
        sum[1]=sum[1]+s[i];
    }
    printf("录入%d名学生的外语成绩:\n",stuNum);
    for(i=0;i<stuNum;i++)
    {
        scanf("%d",&w[i]);
        sum[2]=sum[2]+w[i];
    }

    strcpy(xk[0].xkName,"语文");
    xk[0].xkp=(float)sum[0]/stuNum;
    strcpy(xk[1].xkName,"数学");
    xk[1].xkp=(float)sum[1]/stuNum;
    strcpy(xk[2].xkName,"外语");
    xk[2].xkp=(float)sum[2]/stuNum;

    for(i=0;i<3;i++)
    {
        for(j=i;j<3;j++)
        {
            if(xk[i].xkp<xk[j].xkp)//降序排列
            {
                numsave=xk[i].xkp;
                memset(nameSave,0,nameLen);
                strcpy(nameSave,xk[i].xkName);

                xk[i].xkp=xk[j].xkp;
                memset(xk[i].xkName,0,nameLen);
                strcpy(xk[i].xkName,xk[j].xkName);

                xk[j].xkp=numsave;
                memset(xk[j].xkName,0,nameLen);
                strcpy(xk[j].xkName,nameSave);
            }
        }

    }


    //打印
    printf("降序排列\n");
    for(i=0;i<3;i++)
    {
        printf("学科:%s 平均分:%.1f\n",xk[i].xkName,xk[i].xkp);
    }
}
拿命去忘记你°

2024-11-23 11:19:50

你这个问题有一些不清楚的地方。程序设计很重要的一点就是明确要求。第一,三门学科成绩是精确到那一位的?(确定数据类型)。第二:这个班有多少人?(一个,两个。。。)那我就猜好了。精确到小数点后一位,人数由键盘输入。

思路:把平均分存进数组,然后用排序法排序,一个班大约50个人左右。用快速排序法吧。

代码如下:

#include<stdio.h>

int n;
float score[101];//定义两个全局变量,这两个变量需要在子函数中使用

void quicksort(int ,int );

int main(void)
{
int i;
float a,b,c;
//读入数据
printf("输入班级人数\n");
scanf("%d",&n);

for(i=0;i<n;i++)
{
printf("输入%d号学生的三门成绩\n",i);
scanf("%f%f%f",&a,&b,&c);
score[i] = (a+b+c)/(float)3;
}

quicksort(0,n-1);

printf("从小到大的分数\n");
for(i=0;i<n;i++)
printf("%f\n",score[i]);
}

void quicksort(int left,int right)
{
int i,j;//定义哨兵
float term;//中间量

if(left>right)
return;
term = score[left];
i = left;
j = right;
while(i!=j)
{
//顺序很重要,要先往右从左找。
while(score[j]>=term&&i<j)
j--;
//再从左往右找
while(score[i]<=term&&i<j)
i++;
//交换两个数在数组中的位置
if(i<j)
{
score[i] = score[i]+score[j];
score[j] = score[i]-score[i];
score[i] = score[i]-score[j];
}
}
//将基准数归位
score[left] = score[i];
score[i] = term;

quicksort(left,i-1);
quicksort(i+1,right);
}//快速排序库函数有的,不过以前写了,粘贴过来改改,效果一样。