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