用C语言构建的学生信息管理系统设计,通过课上学到一些关于结构体、数组、指针、函数以及循环的运用和字符串的处理等基本知识可以初步的实现学生信息的输入、显示、查找、删除等功能,主要功能清单如下:
(1)学生信息有:学号,姓名,性别,出生日期,E-mail,电话,C成绩,数据结构成绩,数学成绩等,选用合适的数据结构对学生的信息进行存储;
(2)输入学生信息;
(3)查找学生信息,根据学生的学号或姓名对学生的信息进行查找;
(4)删除学生信息,删除某个学生的所有信息;
(5)插入学生信息:将某个学生的信息插入到已经输入的信息中;
(6)显示学生信息,将所有学生的信息显示出来;
(7)排序,将所有学生按某个科目或总成绩依次排序
我可以使用C语言构建一个学生信息管理系统,实现以下功能: 1. 学生信息的存储和显示 2. 学生信息的输入 3. 学生信息的查找、删除等操作 4. 将学生信息按照某个科目或总成绩进行排序
在实现学生信息的存储和显示方面,我建议使用结构体数组来存储,每个学生对应一个结构体,结构体包含学生的基本信息,如姓名、学号、年龄、性别等等,还包含每个学生的成绩信息,可以设置成员变量表示不同科目的成绩,如语文、数学、英语等等。同时,还可以设置一个计算总成绩的函数,方便后面对学生信息进行排序。
示例代码:
struct Student { char name[20]; int id; int age; char gender[10]; float score_Chinese; float score_Math; float score_English; float score_total; };
struct Student stu_arr[100]; // 假设最多存储100个学生信息
void add_student() { // 学生信息的输入 // 可以使用scanf函数逐个输入学生的基本信息和成绩信息,并调用总成绩计算函数 }
void show_student() { // 学生信息的显示 // 可以使用循环遍历结构体数组,输出每个学生的信息,可以使用printf函数 }
void search_student() { // 学生信息的查找 // 可以使用for循环查找学号或姓名匹配的学生信息,并输出相关信息 }
void delete_student() { // 学生信息的删除 // 可以使用for循环查找学号或姓名匹配的学生信息,然后删除该学生信息,并将后面的学生信息依次往前移 }
void sort_by_subject() { // 将学生信息按照某个科目成绩进行排序 // 可以使用快速排序等算法,按照某个科目成绩排序,并输出排序后的结果 }
void sort_by_total() { // 将学生信息按照总成绩进行排序 // 可以使用快速排序等算法,按照总成绩进行排序,并输出排序后的结果 }
在输入学生信息时,可以使用指针和结构体进行交互: 示例代码:
void add_student() { struct Student stu; struct Student *p = &stu; printf("请输入姓名:"); scanf("%s", p->name); printf("请输入学号:"); scanf("%d", &(p->id)); printf("请输入年龄:"); scanf("%d", &(p->age)); printf("请输入性别:"); scanf("%s", p->gender); printf("请输入语文成绩:"); scanf("%f", &(p->score_Chinese)); printf("请输入数学成绩:"); scanf("%f", &(p->score_Math)); printf("请输入英语成绩:"); scanf("%f", &(p->score_English)); p->score_total = calc_total_score(p); // 计算总成绩 stu_arr[num_of_students++] = stu; // 将学生信息存入结构体数组中 }
其中,calc_total_score函数可以计算一个学生的总成绩,示例代码如下:
float calc_total_score(struct Student *p) { return p->score_Chinese + p->score_Math + p->score_English; }
在删除学生信息时,需要将后面的学生信息往前移,可以使用memcpy函数完成,示例代码如下:
void delete_student(int id) { int i; for (i = 0; i < num_of_students; i++) { if (stu_arr[i].id == id) { break; } } if (i == num_of_students) { printf("该学号不存在!"); return; } memcpy(&stu_arr[i], &stu_arr[i+1], sizeof(struct Student) * (num_of_students-i-1)); // 将后面的信息往前移 num_of_students--; // 学生人数减1 }
在对学生信息进行排序时,可以使用qsort函数,它是C标准库中提供的排序函数,使用时需要提供排序的数组、数组元素个数以及每个元素的大小和比较函数,示例代码如下:
int cmp_subject(const void p1, const void p2) { struct Student s1 = (struct Student )p1; struct Student s2 = (struct Student )p2; return (int)((s2->score_Chinese) * 100 - (s1->score_Chinese) * 100); // 按照语文成绩进行排序 }
void sort_by_subject() { struct Student p_arr[100]; int i; for (i = 0; i < num_of_students; i++) { p_arr[i] = &stu_arr[i]; // 将结构体指针存入指针数组中 } qsort(p_arr, num_of_students, sizeof(struct Student ), cmp_subject); // 排序 for (i = 0; i < num_of_students; i++) { printf("%s %d %d %s %.2f %.2f %.2f %.2f\n", p_arr[i]->name, p_arr[i]->id, p_arr[i]->age, p_arr[i]->gender, p_arr[i]->score_Chinese, p_arr[i]->score_Math, p_arr[i]->score_English, p_arr[i]->score_total); } // 输出排序后的结果 }
在排序时,需要提供一个指向比较函数的指针,该函数必须返回整数值,表示两个元素的大小关系。如果p1小于p2,返回负数;如果p1等于p2,返回0;如果p1大于p2,返回正数。在排序时,qsort会根据指针数组中每个指向结构体的指针取出该结构体并传递给比较函数进行比较。