题目要求:
你需要将一系列的学生期末考试信息进行存储(学生人数不会超过100)。每个学生的信息包括:
- 姓名(由 first name 和last name 两部分组成,例如Jingyu LI,first_name = "Jingyu" last_name = "LI") ;
- 学号(12 位数字组成,开头4位为2022、2021、2020);
- C语言成绩(一个大于等于零的整数);
- 重修信息(学号 2022开头的重修信息为否(0),其余为是(1));
- GPA等级(A+, A, B+, B, C+, C, D, F ):
A+: 100-93;
A: 92-85;
B+: 84-80;
B: 79-75;
C+:74-70;
C: 69-65;
D: 64-60;
F: <60.
其中,姓名,学号,成绩为输入数据,其余数据需要你计算。 另外,学号不符合规定的数据需要删除掉。 本实训所有关卡需要采用结构体知识点。
编程要求
根据提示,在右侧编辑器补充代码,完成学生考试信息的初始化。
测试说明
输入说明: 一系列 名、姓、学号、成绩。
输出说明: 名、姓、学号、成绩、重修信息、GPA等级。
测试用例解释:Geinyu LEE 20210000 89
不合法,需删掉。
平台会对你编写的代码进行测试:
测试输入: Jingyu LI 202200000000 85
Jy LEE 202200100000 89
Jxxxyx Leeeee 202000100000 100
Geinyu LEE 20220000 89
Jingyu11 LI 202200000001 85
预期输出: Name_f Name_l stu_id score retake GPA rank
Jingyu LI 202200000000 85 0 A
Jy LEE 202200100000 89 0 A
Jxxxyx Leeeee 202000100000 100 1 A+
Jingyu11 LI 202200000001 85 0 A
代码实现
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
// 好吧还是只能定义一个结构体来储存学生信息
typedef struct {
char first_name[20];
char last_name[20];
long long id;
int c_score;
int retake;
char gpa_grade[3];
} Student;
// 老夫先定义一个计算GPA等级的函数,其中strcpy 会将 src 所指向的字符串(包括终止的空字符 '\0')复制到 dest 所指向的数组中。函数返回 dest 的值(即目标数组的起始地址)。简单来说strcpy 函数用于复制一个字符串到另一个字符串,这里我复制了输入成绩的字符串和由条件得到成绩等待输出
void calculateGPA(int score, char* gpa_grade) {
if (score >= 93) strcpy(gpa_grade, "A+");
else if (score >= 85 && score <= 92) strcpy(gpa_grade, "A");
else if (score >= 80 && score <= 84) strcpy(gpa_grade, "B+");
else if (score >= 75 && score <= 79) strcpy(gpa_grade, "B");
else if (score >= 70 && score <= 74) strcpy(gpa_grade, "C+");
else if (score >= 65&& score <= 69) strcpy(gpa_grade, "C");
else if (score >= 60 && score <= 64) strcpy(gpa_grade, "D");
else strcpy(gpa_grade, "F");
}
int main(){
Student students[100]; // 使用结构体数组存储学生信息
int n = 0; // 当前学生数量
//接下来读取学生信息,直到文件结束或达到最大限制
while (n < 100 && scanf("%19s %19s %lld %d", students[n].first_name, students[n].last_name, &students[n].id, &students[n].c_score) == 4) {
// 验证一波学号
if (students[n].id < 202000000000LL || students[n].id > 202299999999LL || (students[n].id >= 202300000000LL)) {
//printf("Invalid ID, skipped.\n");
//如果有小笨蛋输入错误,跳过这个错误输入
} else {
// 设置重修信息,students[n].id >= 202200000000LL 是一个条件表达式,它会检查students[n].id是否大于或等于202200000000LL。如果这个条件为真(即学号大于或等于202200000000),则三元运算符的结果为0。如果这个条件为假(即学号小于202200000000),则三元运算符的结果为1,然后,这个三元运算符的结果(即0或1)会被赋值给students[n].retake。
students[n].retake = (students[n].id >= 202200000000LL) ? 0 : 1;
// 引用前面定义的函数计算GPA等级
calculateGPA(students[n].c_score, students[n].gpa_grade);
n++; // 增加学生数量
}
}
// 输出学生信息
printf("Name_f Name_l stu_id score retake GPA rank\n");
for (int i = 0; i < n; i++) {
printf("%s %s %lld %d %d %s\n", students[i].first_name, students[i].last_name, students[i].id, students[i].c_score, students[i].retake, students[i].gpa_grade);
}
return 0;
}
我是菜鸡,还求指正。