在进行了大量C语言的学习后,我们急需一个小项目练手,学生信息管理系统的项目可以帮助你更好的巩固所学知识。
1,项目要求
(1) 数据存储
你需要将⼀系列的学⽣期末考试信息进⾏存储(学⽣⼈数不会超过100)。
每个学⽣的信息包括:
姓名(由 first name 和last name 两部分组成,例如Jingyu LI,first_name = "Jingyu" last_name = "LI") ;
学号(12 位数字组成,开头4位为2022、2021、2020);
C语⾔成绩(⼀个⼤于等于零的整数);
重修信息(学号 2022………为否,其余为是);
GPA等级(A+, A, B+, B, C+, C, D, F );
班级排名(成绩相同需并列)。其 中,姓名,学号,成绩为输入数据,其余数据需要你计算。
同时,你需要添加⼀些维护数据库的功能
Add(name, id, score): 新增⼀个学⽣的信息;
Delete(id): 根据学号删除某个学⽣的信息;
Search(id):根据学号查找某个学⽣的信息。
(2) 数据处理
Sort_by_score(): ⽣成根据分数由⾼到低顺序排列学⽣信息的表格
(3)数据加密和解密
void encrypt(int key): 加密学⽣成绩并返回 ;
void decrypt(int key): 解密学⽣成绩并返回。
加密规则:把所有学⽣的成绩拼接成⼀个只包含数字的字符串,然后依据整数key对其进⾏加密。例如:数 字1被key=5加密之后变成6;数字5被key=5加密之后变成0。单个数字加密之后仍是单个数字。 解密规则与加密规则对称。
(4)数据分析
根据GPA对学⽣成绩进⾏考情分析:A+多少⼈,A多少⼈,以此类推。GPA等级参考SZTU评分等级。
(5)⽤户界⾯
实现⼀个菜单,以供⽤户决定要使⽤哪个功能。
2,代码实现
首先定义结构体变量
使用宏定义是为了便于修改学生人数和相关信息
而结构体中low_grade的使用是为了便于后续数据的解密(后文会再次提及)
//宏定义便于修改
#define MAX_STUDENTS 100
#define FIRST_NAME 50
#define LAST_NAME 50
#define ID 13
//定义结构体储存学生信息
typedef struct {
char first_name[FIRST_NAME];
char last_name[LAST_NAME];
char id[ID];//学号
int score;//分数
char retake[4]; // 重修信息
char gpa_grade[3]; // GPA等级
int rank; // 班级排名
int low_grade;//判断该学生是不是分数小于10
}Student;
add_student()函数编写
我直接在add_student()函数中进行了学生是否重修,GPA等级的计算
void add_student(char* first_name, char* last_name, char* id, int score) {
//判断学生是否超过数量
if (student_count >= MAX_STUDENTS)
{
printf("Student list is full.\n");
return;
}
//未超过数量时
strcpy(students[student_count].first_name, first_name);
strcpy(students[student_count].last_name, last_name);
strcpy(students[student_count].id, id);
students[student_count].score = score;
//判断是否是重修学生
if (strncmp(id, "2022", 4) == 0) //判断是否为重修学生,2022级不重修
{
strcpy(students[student_count].retake, "No");
}
else
{
strcpy(students[student_count].retake, "Yes");
}
// 测定GPA等级
if (score >= 93) {
strcpy(students[student_count].gpa_grade, "A+");
students[student_count].low_grade = 0;
}
else if (score >= 85) {
strcpy(students[student_count].gpa_grade, "A");
students[student_count].low_grade = 0;
}
else if (score >= 80) {
strcpy(students[student_count].gpa_grade, "B+");
students[student_count].low_grade = 0;
}
else if (score >= 75) {
strcpy(students[student_count].gpa_grade, "B");
students[student_count].low_grade = 0;
}
else if (score >= 70) {
strcpy(students[student_count].gpa_grade, "C+");
students[student_count].low_grade = 0;
}
else if (score >= 65) {
strcpy(students[student_count].gpa_grade, "C");
students[student_count].low_grade = 0;
}
else if (score >= 60) {
strcpy(students[student_count].gpa_grade, "D");
students[student_count].low_grade = 0;
}
else if(score >= 10){
strcpy(students[student_count].gpa_grade, "F");
students[student_count].low_grade = 0;
}
else if (score > 0)
{
strcpy(students[student_count].gpa_grade, "F");
students[student_count].low_grade = 1;
}
student_count++;
}
Delete()函数的编写
//删除student
void delete_student(char* id) {
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].id, id) == 0) {
for (int j = i; j < student_count - 1; j++) {
students[j] = students[j + 1];
}
student_count--;
printf("Student with ID %s deleted.\n", id);
return;
}
}
printf("Student with ID %s not found.\n", id);
}
Search()函数的编写
//查找student
void search_student(char* id) {
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].id, id) == 0) {
printf("Name: %s %s\n", students[i].first_name, students[i].last_name);
printf("ID: %s\n", students[i].id);
printf("Score: %d\n", students[i].score);
printf("Retake: %s\n", students[i].retake);
printf("GPA Grade: %s\n", students[i].gpa_grade);
printf("Rank: %d\n", students[i].rank);
return;
}
}
printf("Student with ID %s not found.\n", id);
}
sort_by_score()数据处理函数的编写
void sort_by_score() {
//将学生根据分数高低排序
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (students[j].score < students[j + 1].score) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
// 统计学生的排名
for (int i = 0; i < student_count; i++) {
if (i > 0 && students[i].score == students[i - 1].score) {
students[i].rank = students[i - 1].rank;
}
else {
students[i].rank = i + 1;
}
}
// 打印学生列表
for (int i = 0; i < student_count; i++) {
printf("%d. %s %s, ID: %s, Score: %d, GPA Grade: %s, Rank: %d\n",
i + 1, students[i].first_name, students[i].last_name,
students[i].id, students[i].score, students[i].gpa_grade, students[i].rank);
}
}
void encrypt(int key)加密学生信息
//加密学生信息
void encrypt(int key) {
for (int i = 0; i < student_count; i++)
{
int score;
score = students[i].score;
if (score > 0 && score < 10)
{
students[i].score = (score + key) % 10;
}
else if (score < 100)
{
students[i].score = ((score / 10 + key) % 10) * 10 + (score % 10 + key) % 10;
}
else if (score == 100)
{
students[i].score = (1 + key) * 100 + key * 10 + key;
}
}
// 打印学生列表
for (int i = 0; i < student_count; i++) {
printf("%d. %s %s, ID: %s, Score: %d, GPA Grade: %s\n",
i + 1, students[i].first_name, students[i].last_name,
students[i].id, students[i].score, students[i].gpa_grade);
}
}
void decrypt(int key)解密学生信息
//解密学生信息
void decrypt(int key) {
for (int i = 0; i < student_count; i++)
{
int score;
score = students[i].score;
if (score > 0 && score < 10)
{
if (students[i].low_grade == 1)
{
students[i].score = (score + 10 - key) % 10;
}
else if (students[i].low_grade == 0)
{
students[i].score = (10-key)*10+(score + 10 - key) % 10;
}
}
else if (score < 100)
{
students[i].score = ((score / 10 + 10 - key) % 10) * 10 + (score % 10 + 10 - key) % 10;
}
else if (score > 100)
{
students[i].score = 100;
}
}
// 打印学生列表
for (int i = 0; i < student_count; i++) {
printf("%d. %s %s, ID: %s, Score: %d, GPA Grade: %s\n",
i + 1, students[i].first_name, students[i].last_name,
students[i].id, students[i].score, students[i].gpa_grade);
}
}
analysis()数据分析函数
//统计学生等级人数
void analysis() {
int count_Aplus = 0, count_A = 0, count_Bplus = 0, count_B = 0;
int count_Cplus = 0, count_C = 0, count_D = 0, count_F = 0;
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].gpa_grade, "A+") == 0) count_Aplus++;
else if (strcmp(students[i].gpa_grade, "A") == 0) count_A++;
else if (strcmp(students[i].gpa_grade, "B+") == 0) count_Bplus++;
else if (strcmp(students[i].gpa_grade, "B") == 0) count_B++;
else if (strcmp(students[i].gpa_grade, "C+") == 0) count_Cplus++;
else if (strcmp(students[i].gpa_grade, "C") == 0) count_C++;
else if (strcmp(students[i].gpa_grade, "D") == 0) count_D++;
else if (strcmp(students[i].gpa_grade, "F") == 0) count_F++;
}
printf("Grade Analysis:\n");
printf("A+: %d\n", count_Aplus);
printf("A: %d\n", count_A);
printf("B+: %d\n", count_Bplus);
printf("B: %d\n", count_B);
printf("C+: %d\n", count_Cplus);
printf("C: %d\n", count_C);
printf("D: %d\n", count_D);
printf("F: %d\n", count_F);
}
最最重要的main()函数
由于课程设计作业要求,main()函数将在6.28日后全部开源,在此之前想获得本人全部代码可移步本人主页名为“学生管理系统”的资源。
以及,各位深圳技术大学的同学,在CV本人代码中,请做部分修改!!!!!不要全抄,改几个变量名都可以!!!!
有疑问可评论区留言,期待与你共同进步
3,代码实现效果
其中CTRL+Z连续输入三次是visual studio 2022 里EOF的输入方法(非常zz)
下面演示的是存入学生数据
接下来演示各个功能函数(啊啊怕被拿去交作业,所以只放一两张)
感谢观看到此处的你,觉得文章内容对你有帮助的话,请点赞关注我吧!
有疑问可评论区留言,期待与你共同进步