学生信息管理,声明一个结构体存储信息先。
//存储学生信息的结构体
typedef struct Student {
//姓名,学号,语文成绩,数学成绩,英语成绩
char name[30];
char ID[20];
int chinese;
int math;
int english;
} Student;
然后呢,增,删,查,改,显示,分别封装为五个函数。其中添加和删除的部分,为了使数据长度随函数内增加和删除的操作改变,传参时除了数组指针,数组的长度也使用指针型传递。
增
//添加学生信息
void AddStudent(Student stu_arr[], int* length) {
//如果存储的信息量已达最大
if (*length == MAXSIZE) {
printf("不能添加更多的学生信息了!\n");
return ;
}
Student stu;
printf("请输入要添加的学生姓名:");
scanf("%s", &stu.name);
printf("请输入要添加的学生学号:");
scanf("%s", &stu.ID);
printf("请输入要添加的学生语文成绩:");
scanf("%d", &stu.chinese);
printf("请输入要添加的学生数学成绩:");
scanf("%d", &stu.math);
printf("请输入要添加的学生英语成绩:");
scanf("%d", &stu.english);
stu_arr[*length] = stu;
(*length)++;
int in = (*length) - 1;
printf("学生 %s 信息添加成功!\n", stu_arr[in].name);
}
删
删除的部分使用数组覆盖的方式实现。
//删除学生信息
void DeleteStudent(Student stu_arr[], int* length) {
//如果数组已经为空
if (length == 0) {
printf("没有可删除的数据!\n");
return ;
}
char name[30];
printf("请输入要删除的学生姓名:");
scanf("%s", &name);
int i, j, is_find = 0;
for (i = 0; i < *length && is_find == 0; i++) {
if (strcmp(stu_arr[i].name, name) == 0) {
is_find = 1;
//对被删除信息进行覆盖
for (j = i; j < (*length) - 1; j++) {
stu_arr[j] = stu_arr[j + 1];
}
}
}
if (is_find == 0) {
printf("未找到该学生信息!\n");
} else {
(*length)--;
printf("学生 %s 信息删除成功!\n", name);
}
}
查
//查找学生信息
void FindStudent(Student stu_arr[], int length) {
char name[30];
printf("请输入要查找的学生姓名:");
scanf("%s", &name);
int i, is_find = 0;
for (i = 0; i < length && is_find == 0; i++) {
if (strcmp(stu_arr[i].name, name) == 0) {
is_find = 1;
printf("学生姓名\t学生学号\t语文成绩\t数学成绩\t英语成绩\n");
printf("%s\t\t%s\t\t%d\t\t%d\t\t%d\n",
stu_arr[i].name, stu_arr[i].ID,
stu_arr[i].chinese, stu_arr[i].math,
stu_arr[i].english);
}
}
if (is_find == 0) {
printf("未找到该学生信息!\n");
}
}
改
//修改学生信息
void UpdateStudent(Student stu_arr[], int length) {
char name[30];
printf("请输入要修改的学生姓名:");
scanf("%s", &name);
int i, is_find = 0;
for (i = 0; i < length && is_find == 0; i++) {
if (strcmp(stu_arr[i].name, name) == 0) {
is_find = 1;
printf("姓名:%s\n修改为:", stu_arr[i].name);
scanf("%s", &stu_arr[i].name);
printf("学号:%s\n修改为:", stu_arr[i].ID);
scanf("%s", &stu_arr[i].ID);
printf("语文成绩:%d\n修改为:", stu_arr[i].chinese);
scanf("%d", &stu_arr[i].chinese);
printf("数学成绩:%d\n修改为:", stu_arr[i].math);
scanf("%d", &stu_arr[i].math);
printf("英语成绩:%d\n修改为:", stu_arr[i].english);
scanf("%d", &stu_arr[i].english);
}
}
if (is_find == 0) {
printf("未找到该学生信息!\n");
} else {
printf("学生 %s 信息修改成功!\n", name);
printf("学生姓名\t学生学号\t语文成绩\t数学成绩\t英语成绩\n");
printf("%s\t\t%s\t\t%d\t\t%d\t\t%d\n",
stu_arr[i - 1].name, stu_arr[i - 1].ID,
stu_arr[i - 1].chinese, stu_arr[i - 1].math,
stu_arr[i - 1].english);
}
}
显示
输出学生信息时,我们使用一些制表符美化输出。
//显示所有学生信息
void PrintAll(Student stu_arr[], int length) {
printf("学生信息\n");
printf("学生姓名\t学生学号\t语文成绩\t数学成绩\t英语成绩\n");
int i;
for (i = 0; i < length; i++) {
printf("%s\t\t%s\t\t%d\t\t%d\t\t%d\n",
stu_arr[i].name, stu_arr[i].ID,
stu_arr[i].chinese, stu_arr[i].math,
stu_arr[i].english);
}
}
录入
实现分不同科目录入学生信息。
//录入各科成绩
void SetScore(Student stu_arr[], int length) {
int key;
printf("请问你想录入哪个科目的成绩?\n");
printf("1.语文 2.数学 3.英语\n");
printf("@请输入操作号码>");
scanf("%d", &key);
if (key < 1 || key > 3) {key = 1;}
if (key == 1) {
int i;
for (i = 0; i < length; i++) {
printf("请输入 %s 的语文成绩:", stu_arr[i].name);
scanf("%d", &stu_arr[i].chinese);
}
} else if (key == 2) {
int i;
for (i = 0; i < length; i++) {
printf("请输入 %s 的数学成绩:", stu_arr[i].name);
scanf("%d", &stu_arr[i].math);
}
} else {
int i;
for (i = 0; i < length; i++) {
printf("请输入 %s 的英语成绩:", stu_arr[i].name);
scanf("%d", &stu_arr[i].english);
}
}
printf("录入成功!\n");
}
排序函数
我们调用< stdlib.h>库中的 qsort 对学生成绩进行排名,首先为不同科目各写一个排序函数。
//比较语文成绩的排序函数
int CmpByChinese(const void* x, const void* y) {
Student stu_x = *(Student*)x;
Student stu_y = *(Student*)y;
return stu_x.chinese < stu_y.chinese;
}
//比较数学成绩的排序函数
int CmpByMath(const void* x, const void* y) {
Student stu_x = *(Student*)x;
Student stu_y = *(Student*)y;
return stu_x.math < stu_y.math;
}
//比较英语成绩的排序函数
int CmpByEnglish(const void* x, const void* y) {
Student stu_x = *(Student*)x;
Student stu_y = *(Student*)y;
return stu_x.english < stu_y.english;
}
排名
调用不同的排序函数实现不同科目成绩的排名并输出。
//查看各科成绩排名
void ShowRanking(Student stu_arr[], int length) {
int key;
printf("请问你想根据哪个科目的成绩进行排名?\n");
printf("1.语文 2.数学 3.英语\n");
printf("@请输入操作号码>");
scanf("%d", &key);
if (key < 1 || key > 3) {key = 1;}
if (key == 1) {
qsort(stu_arr, length, sizeof(Student), CmpByChinese);
} else if (key == 2) {
qsort(stu_arr, length, sizeof(Student), CmpByMath);
} else {
qsort(stu_arr, length, sizeof(Student), CmpByEnglish);
}
printf("排序成功!\n");
PrintAll(stu_arr, length);
}
查看不及格学生
实现一个查看挂科超 2 科的学生名单的功能。
//查看不及格科目达两科的学生
void ShowFailStudent(Student stu_arr[], int length) {
printf("@学生名单@以下同学不及格科目达 2 科\n");
printf("学生姓名\t学生学号\t语文成绩\t数学成绩\t英语成绩\n");
int i;
for (i = 0; i < length; i++) {
int sum = 0;
if (stu_arr[i].chinese < 60) sum++;
if (stu_arr[i].math < 60) sum++;
if (stu_arr[i].english < 60) sum++;
if (sum >= 2) {
printf("%s\t\t%s\t\t%d\t\t%d\t\t%d\n",
stu_arr[i].name, stu_arr[i].ID,
stu_arr[i].chinese, stu_arr[i].math,
stu_arr[i].english);
}
}
}
主菜单。
简单的交互界面。
//显示主菜单
void ShowMenu() {
printf("@@学生信息管理系统@@\n");
printf("1.添加学生信息\n");
printf("2.删除学生信息\n");
printf("3.查找学生信息\n");
printf("4.修改学生信息\n");
printf("5.查看所有信息\n");
printf("6.录入学生成绩\n");
printf("7.查看成绩排名\n");
printf("8.查看不及格名单\n");
printf("9.退出管理系统\n");
}
主函数
收尾部分。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "student.h"
int main() {
//存储学生信息的数组
Student stu_arr[MAXSIZE];
int length = 0;
int flag = 1;
while (flag == 1) {
ShowMenu();
char key;
printf("@@请输入操作号码>");
scanf("%c", &key);
switch (key) {
case '1':
AddStudent(stu_arr, &length);
break;
case '2':
DeleteStudent(stu_arr, &length);
break;
case '3':
FindStudent(stu_arr, length);
break;
case '4':
UpdateStudent(stu_arr, length);
break;
case '5':
PrintAll(stu_arr, length);
break;
case '6':
SetScore(stu_arr, length);
break;
case '7':
ShowRanking(stu_arr, length);
break;
case '8':
ShowFailStudent(stu_arr, length);
break;
case '9':
flag = 0;
system("cls");
printf("谢谢使用!\n");
break;
default:
break;
}
system("pause");
system("cls");
//清空键盘输入缓冲区,防止 key 读入键入的回车
fflush(stdin);
}
return 0;
}
运行效果
开发工具 Dev-C++。 源码下载地址。