关于c语言结构体数组

定义结构体数组,结构体包括学号、姓名、性别、年龄身高、数学成绩、英语成绩
1) 输入 N 位同学信息,包括学号、姓名、性别、年龄身高、数学成绩、英语成绩
2) 计算学生的平均年龄,平均身高,并打印输出
3) 计算每位同学的平均分和总分,然后按照总分从高到低排序,并打印输出。
4) 按照学号对从小到大进行排序,并把所有的同学信息打印输出
5) 根据学号,查找某一位同学的信息,并打印输出。要求两种实现方法:
遍历查找
对学号排序后,二分查找

for循环遍历;二分法查找需要先排序。运行结果:

img

代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
typedef struct _student
{
    long long id; //学号
    char name[20];//姓名
    char sex[4];//性别:男、女
    int age; //年龄
    int height; //身高,cm
    int math;//数学成绩
    int eng;  //英语成绩
}Student;


//显示打印条目--带总成绩和平均分
void showTitleAll()
{
    printf("%10s  %10s  %10s  %4s  %4s  %4s  %4s  %6s  %6s\n","学号","姓名","性别","年龄","身高","数学","英语","总成绩","平均分");
}

//显示单条学生信息--带总成绩和平均分
void showStudentAll(Student stu)
{
    printf("%10lld  %10s  %10s  %4d  %4d  %4d  %4d  %6d  %.2f\n", stu.id, stu.name, stu.sex, stu.age, stu.height, stu.math, stu.eng, (stu.math + stu.eng), (stu.math + stu.eng) / 2.0);
}

//显示打印条目--不带总成绩和平均分
void showTitleSmp()
{
    printf("%10s  %10s  %10s  %4s  %4s  %4s  %4s\n", "学号", "姓名", "性别", "年龄", "身高", "数学", "英语");
}

//显示单条学生信息--不带总成绩和平均分
void showStudentSmp(Student stu)
{
    printf("%10lld  %10s  %10s  %4d  %4d  %4d  %4d\n", stu.id, stu.name, stu.sex, stu.age, stu.height, stu.math, stu.eng);
}

//1.输入N位同学的信息
void input(Student stu[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("请输入第%d位同学的学号:", i + 1); scanf("%lld", &stu[i].id);
        printf("请输入第%d位同学的姓名:", i + 1); scanf("%s", stu[i].name);
        printf("请输入第%d位同学的性别:", i + 1); scanf("%s", stu[i].sex);
        printf("请输入第%d位同学的年龄:", i + 1); scanf("%d", &stu[i].age);
        printf("请输入第%d位同学的身高(cm):", i + 1); scanf("%d", &stu[i].height);
        printf("请输入第%d位同学的数学成绩:", i + 1); scanf("%d", &stu[i].math);
        printf("请输入第%d位同学的英语成绩:", i + 1); scanf("%d", &stu[i].eng);
    }
    printf("录入完毕!\n");
}

//2. 计算学生的平均年龄,平均身高,并打印输出
void averageAge(Student stu[], int n)
{
    int i;
    float ave = 0;
    float he = 0;//平均身高
    for (i = 0; i < n; i++)
    {
        ave += stu[i].age;
        he += stu[i].height;
    }
    printf("平均年龄:%.1f\n", ave / n); //保留1位小数
    printf("平均身高:%.1f\n", he / n); //保留1位小数
}
//3.计算每位同学的平均分和总分,然后按照总分从高到低排序,并打印输出。
void sortByTotal(Student stu[], int n)
{
    int i, j;
    Student t;
    //冒泡排序,根据总成绩,从大到小排序
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if ((stu[j].math + stu[j].eng) < (stu[j + 1].math + stu[j + 1].eng))
            {
                t = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = t;
            }
        }
    }
    //输出
    showTitleAll();
    for (i = 0; i < n; i++)
        showStudentAll(stu[i]);
}
//4.按照学号对从小到大进行排序,并把所有的同学信息打印输出
void sortById(Student stu[], int n)
{
    int i, j;
    Student t;
    //冒泡排序,根据学号从小到大排序
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (stu[j].id > stu[j+1].id)
            {
                t = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = t;
            }
        }
    }
    //输出
    showTitleSmp();
    for (i = 0; i < n; i++)
        showStudentSmp(stu[i]);

}
//5.根据学号,查找某一位同学的信息,并打印输出。要求两种实现方法 : 遍历查找
void searchId(Student stu[], int n)
{
    long long id;
    int i, flag = 0;
    printf("--------------根据学号遍历查找----------\n");
    printf("请输入要查找的学号:");
    scanf("%lld", &id);
    for (i = 0; i < n; i++)
    {
        if (stu[i].id == id)
        {
            showTitleSmp();
            showStudentSmp(stu[i]);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
        printf("未找到该学号的同学\n");
}
//6.对学号排序后,二分查找
void searchBin(Student stu[], int n)
{
    long long id;
    int low, high, mid;
    int flag = 0;
    low = 0;
    high = n - 1;
    printf("--------------根据学号二分查找----------\n");
    printf("请输入要查找的学号:");
    scanf("%lld", &id);


    while (low <= high)
    {
        mid = (low + high) / 2;
        if (id < stu[mid].id)
            high = mid - 1;
        else if (id > stu[mid].id)
            low = mid + 1;
        else
        {
            showTitleSmp();
            showStudentSmp(stu[mid]);
            flag = 1;
            break;
        }
    }
    if(flag == 0)
        printf("未找到该学号的同学\n");
}

int main()
{
    int op;
    int n = 0;
    Student stu[1000];
    printf("请输入学生人数:");
    scanf("%d", &n);
    input(stu, n); //1.录入数据
    averageAge(stu, n); //2.计算平均年龄
    sortByTotal(stu, n); //3.根据总分排序并输出
    sortById(stu, n);//4.根据学号从小到大排序并输出
    searchId(stu, n); //5.根据学号遍历查找
    searchBin(stu, n); //6.根据学号二分法查找
    return 0;
}