程序代码:
#include <stdio.h>
#include <string.h>
#define STUDENT_MAX 100
typedef struct {
char name[21]; // 姓名
int sex; // 性别
int birthday; // 生日
float height; // 身高
float c_language; // C语言
float calculus; // 微积分
float total; // 成绩和
} Student;
select_sort_desc(Student * students, int size) { // 降序排序
int i, j, k;
for(i = 0; i < size - 1; i++) {
k = i;
for(j = i + 1; j < size; j++) {
if(students[k].total < students[j].total) {
k = j;
}
}
if(k != i) {
Student temp = students[k];
students[k] = students[i];
students[i] = temp;
}
}
}
int main(void) {
Student students[STUDENT_MAX];
int n, i, tmp;
char sex_tmp[3];
printf("请输入学生人数:");
fflush(stdout);
while(!scanf("%d", &n) || (n > STUDENT_MAX || n < 1)) { // 输入学生人数,如果不合法则继续
printf("请输入学生人数:");
fflush(stdout);
}
for(i = 0; i < n; i++) { // 输入学生的信息,以空格分隔,如输入有错则重新输入当前学生的信息
printf("输入%d名学生的信息(姓名、性别、生日、身高、C语言、微积分),输入用空格分隔:\n", i + 1);
scanf("%s%s%d%f%f%f", &students[i].name, sex_tmp, &students[i].birthday, &students[i].height, &students[i].c_language, &students[i].calculus);
students[i].sex = strcmp("男", sex_tmp) ? 0 : 1;
if(students[i].c_language < 0 || students[i].c_language > 100 ||
students[i].calculus < 0 || students[i].calculus > 100) {
printf("输入有误!\n");
i--;
}
}
printf("\n");
for(i = 0; i < n; i++) { // 输出每个学生对应的总成绩
students[i].total = students[i].c_language;
students[i].total += students[i].calculus;
printf("%s的总成绩是:%.1f\n", students[i].name, students[i].total);
}
select_sort_desc(students, n); // 降序排序,最高分在前面,最低分在后面
printf("最高分是:%.1f\n", students[0].total);
printf("最低分是:%.1f\n", students[n - 1].total);
printf("\n");
for(i = 0; i < n; i++) {
printf("获得最高分的同学是:%s\n", students[i].name); // 输出最高分同学的信息,如有多个并列第一则全部输出
printf("性别:%s\n", (students[i].sex ? "男" : "女"));
printf("生日:");
tmp = 10000000;
while(tmp > 0) {
putchar((students[i].birthday / tmp % 10) + '0');
tmp == 10000 && putchar('/');
tmp == 100 && putchar('/');
tmp /= 10;
}
printf("\n身高:%.2f m\n", students[i].height);
printf("C语言:%.1f\n", students[i].c_language);
printf("微积分:%.1f\n\n", students[i].calculus);
if(students[i].total != students[i + 1].total)
break;
}
return 0;
} /* Output:
请输入学生人数:3
输入1名学生的信息(姓名、性别、生日、身高、C语言、微积分),输入用空格分隔:
小明 男 19941118 1.75 98.7 97.8
输入2名学生的信息(姓名、性别、生日、身高、C语言、微积分),输入用空格分隔:
小红 女 19940203 1.65 97.8 98.7
输入3名学生的信息(姓名、性别、生日、身高、C语言、微积分),输入用空格分隔:
小东 男 19930506 1.70 96.6 95.5
小明的总成绩是:196.5
小红的总成绩是:196.5
小东的总成绩是:192.1
最高分是:196.5
最低分是:192.1
获得最高分的同学是:小明
性别:男
生日:1994/11/18
身高:1.75 m
C语言:98.7
微积分:97.8
获得最高分的同学是:小红
性别:女
生日:1994/02/03
身高:1.65 m
C语言:97.8
微积分:98.7
Process returned 0 (0x0) execution time : 66.875 s
Press any key to continue.
*/