有5个学生,每个学生包括学号、姓名、三门课的成绩。从键盘输入5个学生数据,(1)打印出每门课程的总平均分;(2)要求按照总分由高到低的顺序打印出学生的数据(包括学号、姓名、三门课的成绩、总分)

img

  1. 有5个学生,每个学生包括学号、姓名、三门课的成绩。从键盘输入5个学生数据,1)打印出每门课程的总平均分;2)要求按照总分由高到低的顺序打印出学生的数据(包括学号、姓名、三门课的成绩、总分)
    分析:
  1. 在主函数中输入学生数据,建立一维的学生结构体数组
  2. 用average()函数求每门课程的平均分
  3. 用sort()函数对每个学生的总分进行排序,(采用指针变量作为形参)
  4. 用print()函数输出总分排序后的学生的信息
  5. 程序通过调试后,再将输入学生数据的程序段编写成input()函数,在main()函数中调用它,建立学生数据数组
#include <stdio.h>
typedef struct _student
{
    char num[20];
    char name[20];
    float score[3];
    float total;
}student;
void sort(student *s,int n)
{
    int i,j;
    student temp;
    for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
        {
            if(s[j].total < s[j+1].total)
            {
                temp = s[j];
                s[j] = s[j+1];
                s[j+1] = temp;
            }
        }
}
void print(student *s,int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%-20s%-20s%-10.1f%-10.1f%-10.1f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2]);
}
void query(student *s,int n,char *name)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(strcmp(s[i].name,name) == 0)
        {
            printf("%-20s%-20s%-10.1f%-10.1f%-10.1f\n",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2]);
            break;
        }
    }
}
void average(student *s,int n)
{
    int i,j,sum=0;
    for(i=0;i<3;i++)
    {
        sum = 0;
        for(j=0;j<n;j++)
        {
            sum += s[j][i];
        }
        printf("第%d门课平均分:%.1f\n",i+1,sum/3.0);
    }
}
int main()
{
    student s[100];
    int n,i;
    char name[20];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%s%s%f%f%f",s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]);
        s[i].total =  s[i].score[0] + s[i].score[1] + s[i].score[2];
    }
    printf("总分分别为:\n");
    for(i=0;i<n;i++)
        printf("%d\n",s[i].total);
    average(s,n);
    sort(s,n);
    print(s,n);
    scanf("%s",name);
    query(s,n,name);
    //
    return 0;
}

如下:

#include <stdio.h>

struct student 
{
    int id; //学号
    char name[30]; //姓名
    float score[3]; //5门课成绩
    float total; //总分
    float ave; //平均分
};
//录入
void input(struct student stu[],int n)
{
    int i,j;
    for (i=0;i<n;i++)
    {
        printf("请输入学生%d的学号:",i+1);
        scanf("%d",&stu[i].id);
        getchar();
        printf("请输入学生%d的姓名:",i+1);
        scanf("%s",stu[i].name);
        printf("请输入学生%d的3门课成绩:");
        for(j=0;j<3;j++)
            scanf("%f",&stu[i].score[j]);
    }
}
//计算总分、平均分
void average(struct student stu[],int n)
{
    int i,j;
    for (i=0;i<n;i++)
    {
        stu[i].total = 0;
        //总分
        for(j=0;j<3;j++)
        {
            stu[i].total += stu[i].score[j];
        }
        //平均分
        stu[i].ave = stu[i].total/3;
        printf("学生%d的总分:%.1f,平均分:%.1f\n",i+1,stu[i].total,stu[i].ave);
    }
}
//查询
void findbyid(struct student stu[],int n)
{
    int id,i,j;
    printf("请输入需要查找的学号:");
    scanf("%d",&id);
    for (i=0;i<n;i++)
    {
        if(stu[i].id == id)
        {
            printf("学号:%d\n",stu[i].id);
            printf("姓名:%s\n",stu[i].name);
            printf("成绩:");
            for(j=0;j<3;j++)
                printf("%.1f ",stu[i].score[j]);
            printf("\n");
            printf("总分:%.1f\n",stu[i].total);
            printf("平均分:%.1f\n",stu[i].ave);
            break;
        }
    }
    if(i==n)
        printf("未找到该学号的学生\n");
}
//根据学分排序
void sort(struct student stu[],int n)
{
    int i,j;
    struct student tt;
    for (i=0;i<n-1;i++)
    {
        for (j=0;j<n-1-i;j++)
        {
            if(stu[j].total < stu[j+1].total)
            {
                tt = stu[j];
                stu[j]=stu[j+1];
                stu[j+1]=tt;
            }
        }
    }
}
//显示
void print(struct student stu[],int n)
{
    int id,i,j;
    for (i=0;i<n;i++)
    {
        printf("学号:%d\n",stu[i].id);
        printf("姓名:%s\n",stu[i].name);
        printf("成绩:");
        for(j=0;j<3;j++)
            printf("%.1f ",stu[i].score[j]);
        printf("\n");
        printf("总分:%.1f\n",stu[i].total);
        printf("平均分:%.1f\n",stu[i].ave);
    }
}
int main()
{
    struct student stu[100];
    int nmb = 0;
    printf("请输入学生人数:");
    scanf("%d",&nmb);
    //(1)
    input(stu,nmb);
    //(2)
    average(stu,nmb);
    //(4)
    findbyid(stu,nmb);
    //(5)
    sort(stu,nmb);
    //显示
    print(stu,nmb);
    return 0;
}


struct student
{
int num;
char name[100];
int score[3];
int sum;
}stu[5];

void average(struct student stu[],int n)
{
int i = 0, s1 = 0, s2 = 0, s3 = 0;
for (i = 0; i < 5; i++)
{
s1 = s1+(stu[i].score[0]);
s2 += stu[i].score[1];
s3 += stu[i].score[2];
}
printf("\nscore1的总平均成绩为:%d\n", s1/ 5);
printf("\nscore2的总平均成绩为:%d\n", s2 / 5);
printf("\nscore3的总平均成绩为:%d\n", s3 / 5);
}

void sort(struct student* p)
{//排序函数
int flag = 0;
for (int i = 0;i < 4;i++)
{
flag = 1;//标记
for (int j = 0;j < 4 - i;j++) {
if ((p + j)->sum < (p + j + 1)->sum)
{//比较sum(总分)大小
struct student temp = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = temp;
}
}
if (flag == 0)break;
}
}

void print(struct student stu[])
{
int i;
for (i = 0;i < 5;i++)
{
printf("%d %s %d %d %d", stu[i].num, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);
}
}

void input(struct student stu[])
{
for (int i = 0;i < 5;i++)
{
scanf_s("%d", &stu[i].num);
scanf_s("%s", stu[i].name);
scanf_s("%d", &stu[i].score[0]);
scanf_s("%d", &stu[i].score[1]);
scanf_s("%d", &stu[i].score[2]);
}
}
int main()
{
input(stu);
for (int i = 0;i < 5;i++)
{
stu[i].sum = stu[i].score[0] + stu[i].score[1] + stu[i].score[2];
}
print(stu);
student* p;
p = stu;
return 0;
}
可以看看我这代码有什么问题吗?