键盘输入20个学生的姓名和总分,按总分从大到小的顺序输出这20个学生的姓名和总分。

c语言 注:冒泡排序 双循环 外循环控制次数结构体的定义和使用,scanf输入注意 结构体类型中的元素类型为char不加&

你题目的解答代码如下:(如有帮助,望采纳!谢谢! 点击我这个回答右上方的【采纳】按钮)

#include<stdio.h>
#include<stdlib.h>
#define n 20
struct student{
    char name[10];
    int score;
};
void main()
{
    struct student a[n];
    int i, j;
    struct student buf;
    for(i=0;i<n;i++)
    {
        scanf("%s%d",a[i].name,&a[i].score);
    }
    for (i=0; i<n-1; ++i)  //比较n-1轮
    {
        for (j=0; j<n-1-i; ++j)  //每轮比较n-1-i次,
        {
            if (a[j].score < a[j+1].score)
            {
                buf = a[j];
                a[j] = a[j+1];
                a[j+1] = buf;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%s,%d\n",a[i].name,a[i].score);
    }
}

参考:

#include<stdio.h>
 
#define N 20   //定义输入学生的个数
 
struct student //定义学生结构体
{
 
 char num[6] ;
 
 char name[8] ;
 
 int score[3] ;
 
 float avr; 
 
}stu[N]; 
 
void main() 
 
{
 
 int i,j,max,maxi,sum; 
 
 float average; 
 
 for(i=0;i<N;i++) 
 
 {
 
  printf("请输入学生成绩 %d:\n",i+1); //输入每个学生的数据
 
  printf("第:%d",i+1); 
 
  scanf("%s",stu[i].num); 
 
  printf("name:"); 
 
  scanf("%s",stu[i].name); 
 
  for(j=0;j<3;j++) 
 
  {
 
   printf("score %d:",j+1); 
 
   scanf("%d", &stu[i].score[j]); 
 
  } 
 
 } 
 
 average=0; 
 
 max=0; 
 
 maxi=0; 
 
 for(i=0;i<3;i++) //求平均数
 
 {
 
  sum=0; 
 
  for(j=0;j<3;j++) 
 
  sum+=stu[i].score[j]; 
 
  stu[i].avr=sum/3.0; 
 
  average+=stu[i].avr; 
 
  if(sum>max) 
 
  {
 
   max=sum; 
 
   maxi=i; 
 
  } 
 
 } 
 
 average/=N; 
 
 printf("  NO.     name    score1   score2    score3   average\n"); 
 
  for(i=0;i<N;i++) //输出每个学生的信息
 
  {
 
   printf("%5s%8s",stu[i].num, stu[i].name); 
 
   for(j=0;j<3;j++) 
 
    printf("%9d",stu[i].score[j]); 
 
   printf("%8.2f\n",stu[i].avr); 
 
  } 
 
 printf("平均分=%7.2f\n",average); 
 
  printf("最高成绩是:%s,score total:%d.",stu[maxi].name,max); 
 
}