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);
}//快速排序库函数有的,不过以前写了,粘贴过来改改,效果一样。