20251期《C语言程序设计B》专项训练04-结构体01部分-程序P765.C

16 阅读3分钟

题面

根据要求编写程序P765.C的指定部分:  
  程序P765.C已编写部分代码请根据程序中的要求完善程序——注意,**除指定位置外,不能对程序中已有部分作任何修改或重新编写一个程序,否则作0分处理**。  
  程序的功能是:有五个学生,每个学生的数据包括学号、姓名(最长19字节)、三门课的成绩,从键盘输入五个学生的数据,计算每个学生的平均成绩并按平均成绩由高到低排序,并将排序结果显示。要求用结构体编程,变量数据类型的选择应适当,在保证满足设计要求精度的情况下,养成不浪费内存空间和计算时间的好习惯。编程可用素材:printf("Please input info of students:No Name Math English Computer\n")...。  
  程序的运行效果应类似地如图1所示,图1中的:  
    2001 wanghai    78 83 90  
    2003 zhangzhong 82 80 98  
    2005 liumei     95 81 90  
    2006 sunqian    70 77 90  
    2009 jiansansa  63 87 90  
  是从键盘输入的内容。

原码

#include <stdio.h>  
#include <stdlib.h>  
  
/* User Code Begin(考生可在本行后添加代码,行数不限) */  
  
  
  
/* User Code End(考生添加代码结束) */  
  
int main(void)  
{  
    STUDENT myclass[5], *pStu = myclass;  
    int i;  
    const int N = 5;  
  
    /* User Code Begin(考生可在本行后添加代码,行数不限) */  
  
  
  
    /* User Code End(考生添加代码结束) */  
      
    printf("\nResult of sort:\n");  
    printf("Num   Name                 Math     English  Computer Average\n");  
    for (i=0; i<N; i++)  
    {  
        printf("%-5d %-20s %-8d %-8d %-8d %-.2f\n", (pStu+i)->num, (pStu+i)->name,  
            (pStu+i)->math, (pStu+i)->english, (pStu+i)->computer, (pStu+i)->average);  
    }  
  
    return 0;  
}  
  
/* User Code Begin(考生在此后根据设计需要完成程序的其它部分,行数不限) */

修改后

#include <stdio.h>  
#include <stdlib.h>  
  
/* User Code Begin(考生可在本行后添加代码,行数不限) */  
typedef struct student  
{  
    int num;  
    char name[20];  
    int math;  
    int english;  
    int computer;  
    float average;  
} STUDENT;  
  
void sort(STUDENT myclass[5],int N);  
/* User Code End(考生添加代码结束) */  
  
int main(void)  
{  
    STUDENT myclass[5], *pStu = myclass;  
    int i;  
    const int N = 5;  
  
    /* User Code Begin(考生可在本行后添加代码,行数不限) */  
    printf("Please input info of students:No Name Math English Computer\n");  
    // 2001 wanghai    78 83 90  
    for(i=0;i<N;i++)  
    {  
        printf("%d:",i+1);  
        scanf("%d%s%d%d%d", &myclass[i].num, myclass[i].name,  
                    &myclass[i].math,&myclass[i].english,&myclass[i].computer);  
        myclass[i].average = (float)(myclass[i].math+myclass[i].english+myclass[i].computer)/3.0;  
    }  
      
    sort(myclass,N);  
  
    /* User Code End(考生添加代码结束) */  
      
    printf("\nResult of sort:\n");  
    printf("Num   Name                 Math     English  Computer Average\n");  
    for (i=0; i<N; i++)  
    {  
        printf("%-5d %-20s %-8d %-8d %-8d %-.2f\n", (pStu+i)->num, (pStu+i)->name,  
            (pStu+i)->math, (pStu+i)->english, (pStu+i)->computer, (pStu+i)->average);  
    }  
  
    return 0;  
}  
  
/* User Code Begin(考生在此后根据设计需要完成程序的其它部分,行数不限) */  
void sort(STUDENT myclass[5],int N)  
{  
    // bubble sort  
    int i,j;  
    STUDENT tmp;  
      
    for(i=0;i<N-1;i++)  
    {  
        for(j=0;j<N-1-i;j++)  
        {  
            // compare exchange  
            if(myclass[j].average<myclass[j+1].average)  
            {  
                tmp = myclass[j];  
                myclass[j] = myclass[j+1];  
                myclass[j+1] = tmp;  
            }  
        }  
    }  
}

知识点

  • 结构体的定义,成员变量名的反推命名
  • 函数的声明,定义和调用
  • 结构体数组当成参数的传参,同时传入元素个数,方便做冒泡排序
  • 对结构体数组排序,比较的是平均分,交换的是结构体元素数据
  • 基本的要求,节约内存,这就是为何用float不用double的原因,具体问题要具体分析,满足要求即可