C语言学生系统管理
前言
"在许多学校中,C语言通常被选为学生的编程入门语言。许多教师会布置C语言的期末大作业,其中一个常见的题目是学生信息管理系统。以往的练习题通常只需要几十行代码就能完成,但完整编写这个系统却需要约400行代码。完成这个系统的编写不仅是对整个学期所学知识的深入理解和实践,还可以拓展课外知识。由于篇幅较长,建议收藏后慢慢阅读。"
1、题目详情
一、学生信息管理程序 基本要求:
1.要求实现学生信息的 添加、删除、修改、查找、统计、指定插入学生信息位置、浏览、排序、退出等9个功能,每个功能模块均能实现从模块中退出,从而完成一个学生管理系统所需功能。
2.要使用结构体来实现对学生信息的存储。
3.学生信息需至少包括:学号,姓名, 成绩信息.
4.系统制作完成后应实现类似下图所示界面:
2、系统设计(主要函数)
2.1结构体的创建
题目要求需要使用结构体来对学生信息进行储存,所以需要创建一个结构体,同时也要注意结构体中需要包含学生的那些信息。
typedef struct {
int number;//学号
char name[20];//姓名
int sort;//成绩
}StudentType;
typedef struct {
StudentType r[Maxsize];//学生信息数组
int count;//记录学生人数
}Student;
2.2main函数
这段代码是一个简单的主函数,它调用了两个函数:DisplayMenu() 和 choice()。通过DisplayMenu()函数,程序展示了一个菜单,为用户提供了不同的选择。而通过choice()函数,程序引导用户做出一个具体的选择。最后,函数返回0,表示程序顺利执行结束。这段代码虽然简短,却是整个程序的核心,负责引导用户进入程序的主要功能。
int main()
{
DisplayMenu();
choice();
return 0;
}
2.3DisplayMenu函数
这段代码定义了一个名为DisplayMenu()的函数,用于展示一个学生管理系统的菜单界面,包括各种操作选项。
void DisplayMenu()//展示界面
{
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("0. 退出程序\n");
printf("=================================\n\n");
}
2.4Ins函数
这段代码定义了一个名为Ins()的函数,用于录入学生信息。函数首先要求用户输入要录入的学生信息个数,然后逐个录入每位学生的学号、姓名和成绩。最后,打印出录入结束的提示信息。这个函数实现了向学生管理系统中添加新的学生信息的功能。
void Ins(Student* l)//学生信息录入
{
int i, n;
printf("*********************************\n");
printf("请输入录入学生信息个数:");
scanf_s("%d", &n);
l->count = n;
for (i = 1; i <= n; i++)
{
printf("---------------------------------\n");
printf("第%d个学生信息:", i);
printf("学生学号:");
scanf("%d", &l->r[i].number);
fflush(stdin);
printf("\t 学生姓名:");
scanf("%s", l->r[i].name );
fflush(stdin);
printf("\t 学生成绩:");
scanf("%d", &l->r[i].sort);
fflush(stdin);
}
printf("---------------------------------\n");
printf("录入学生信息结束!\n");
printf("*********************************\n");
}
2.5remove函数
这段代码定义了一个名为remove()的函数,用于删除学生信息。函数要求用户输入要删除的学生位置,如果位置合法,则删除该学生信息并将后续学生信息前移,最后更新学生总数。删除成功后给出提示。
void remove(Student* l) //删除学生信息
{
int n, i, flag = 1;
while (flag)
{
printf("请输入删除学生的所在位置:");
scanf("%d", &n);
if (n > l->count || n <= 0)
{
printf("输入错误,请再次输入!\n");
}
else
{
for (i = n; i < l->count; i++)
{
strcpy(l->r[i].name, l->r[i + 1].name);
l->r[i].number = l->r[i + 1].number ;
l->r[i].sort = l->r[i + 1].sort ;
}
l->count--;
printf("删除成功!\n");
flag = 0;
}
}
}
2.6print_info函数
这段代码的功能就是输出学生的信息。
void print_info(Student* l, int i)//输出学生信息
{
printf("学号:%d\n", l->r[i].number);
printf("\t 姓名:%s\n", l->r[i].name);
printf("\t 成绩:%d\n", l->r[i].sort);
}
2.7change函数
这段代码定义了一个名为change()的函数,用于修改已经输入的学生信息。用户需输入要修改的学生位置,然后可以输入新的学号、姓名和成绩来更新该学生信息。如果位置无效,会提示输入错误。修改成功后会给出相应提示。
int change(Student* l)//修改学生信息
{
int n, pos, x,i,w, flag;
char name[20];
printf("请选择查找该学生的方式:1.学号 2.姓名\n");
printf("请输入你的选择:");
scanf("%d", &n);
fflush(stdin);
switch (n)
{
case 1:
printf("请输入你要查找的学号:");
scanf("%d", &w);
for (i = 1; i <= l->count; i++)
{
if (l->r[i].number == w)
break;
}
pos = i;
break;
case 2:
printf("请输入你要查找的姓名:");
scanf("%s", name);
for (i = 1; i <= l->count; i++)
{
if (strcmp(l->r[i].name , name)==0)
break;
}
pos = i;
break;
default:
printf("输入错误!\n");
return 0;
}
printf("查找成功!\n");
printf("学生信息为:");
print_info(l, pos);
printf("请选择要修改的信息:1.学号 2.姓名 3.成绩\n");
scanf("%d", &x);
fflush(stdin);
switch (x)
{
case 1:
printf("请输入修改后的学号:");
scanf("%d", &l->r[pos].number);
for (int i = 1; i < pos; i++)
{
if (l->r[pos].number == l->r[i].number)
flag = 0;
}
for (int i = pos + 1; i <= l->count; i++)
{
if (l->r[pos].number == l->r[i].number)
flag = 0;
}
if (flag == 0)
printf("更改失败,此学号存在!\n");
else
{
printf("修改成功!\n");
printf("学生信息为:");
print_info(l, pos);
}
break;
case 2:
printf("请输入修改后的姓名:");
scanf("%s", l->r[pos].name);
printf("修改成功!\n");
printf("学生信息为:");
print_info(l, pos);
break;
case 3:
printf("请输入修改后的成绩:");
scanf("%d", &(l->r[pos].sort));
printf("修改成功!\n");
printf("学生信息为:");
print_info(l, pos);
break;
default:
printf("输入错误!\n");
break;
}
return 0;
}
2.8Binsrch_函数
这段代码定义了一个名为searchByName()的函数,用于根据学生姓名查找学生信息。用户需要输入要查找的学生姓名,程序会遍历学生信息列表,找到匹配的姓名并输出对应的学号和成绩。如果找不到匹配的姓名,会提示未找到该学生。
int Binsrch_(Student l)查找(按姓名查找)
{
int i, flag,w=0,h=0;//flag作为查找的判断标志
char name[20];
printf("请输入查找的姓名:");
scanf("%s", name);
fflush(stdin);
for (i = 1; i <= l.count; i++)
{
h++;
if (strcmp(l.r[i].name, name) == 0)
{
printf("查找成功!\n");
printf("学生信息为:");
print_info(&l, i);
flag = 0;
w = 1;
break;
}
}
return w;
}
2.9Search函数
这段代码定义了一个名为search()的函数,用于根据学生学号或姓名查找学生信息。用户需输入要查找的学生学号或姓名,程序会遍历学生信息列表,找到匹配的学生并输出其学号、姓名和成绩。如果找不到匹配的学生信息,会提示未找到匹配的学生。
int Search(Student l)//查找学生信息
{
printf("-----------------------------\n");
int i,n,number,flag=1;//flag作为是否继续查找的标志
int pos,w;
printf("请选择查找学生的方式:\n\t1.学号查找\n\t2.姓名查找\n");
printf("请输入你的选择:");
scanf("%d", &n);
fflush(stdin);
while (flag)
{
switch (n)
{
case 1:
pos=Binsrch(l);
if (pos == 0)
{
printf("查找失败!请确定是否再次查找!\n");
printf("请输入你的选择:1.是 2.否");
scanf("%d",&w);
fflush(stdin);
if (w == 1)
flag = 1;
else
flag = 0;
}
else
{
printf("查找成功!\n");
printf("学生信息为:");
print_info(&l,pos);
flag = 0;
}
break;
case 2: {
pos = Binsrch_(l);
if (pos == 1)
flag = 0;
else
{
printf("查找失败!请确定是否再次查找!\n");
printf("请输入你的选择:1.是 2.否");
scanf("%d", &w);
fflush(stdin);
if (w == 1)
flag = 1;
else
flag = 0;
}
}break;
default:break;
}
}
return 0;
}
2.10Ins_change函数
这段代码定义了一个名为insert()的函数,用于在指定位置插入学生信息。用户需要输入要插入的位置,程序会将该位置之后的学生信息依次向后移动,然后用户可以输入新的学生学号、姓名和成绩来插入到指定位置。插入成功后会给出相应提示。如果输入的位置无效,会提示位置无效。
int Ins_change(Student* l)//指定插入学生信息位置
{
int n, i,flag=1,flag_=1;
Student New;
printf("-----------------------------\n");
printf("请输入插入学生信息的位置:");
scanf("%d", &n);
if (n > l->count || n < 1)
{
printf("输入失败!\n");
flag = 1;
}
else
{
printf("请输入你想加入学生的信息:");
while (flag_)
{
printf("\n\t学生学号:");
scanf("%d", &New.r[1].number);
fflush(stdin);
for (int i = 1; i <= l->count; ++i)
{
if (l->r[i].number == New.r[1].number)
{
printf("学号已存在,请重新输入!\n");
flag_ = 1;
break;
}
if (i == l->count)
flag_ = 0;
}
}
printf("\t学生姓名:");
scanf("%s", New.r[1].name);
fflush(stdin);
printf("\t学生成绩:");
scanf("%d", &New.r[1].sort);
fflush(stdin);
for (int i = l->count; i >= n; --i)
{
l->r[i + 1] = l->r[i];
}
l->r[n].number = New.r[1].number;
strcpy(l->r[n].name, New.r[1].name);
l->r[n].sort = New.r[1].sort;
l->count++;
printf("插入成功!\n");
}
printf("-----------------------------\n");
return 0;
}
3、整个程序代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <cstring>
#define Maxsize 100
typedef struct {
int number;//学号
char name[20];//姓名
int sort;//成绩
}StudentType;
typedef struct {
StudentType r[Maxsize];//学生信息数组
int count;//记录学生人数
}Student;
void DisplayMenu()//展示界面
{
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("0. 退出程序\n");
printf("=================================\n\n");
}
void Ins(Student* l)//学生信息录入
{
int i, n;
printf("*********************************\n");
printf("请输入录入学生信息个数:");
scanf_s("%d", &n);
l->count = n;
for (i = 1; i <= n; i++)
{
printf("---------------------------------\n");
printf("第%d个学生信息:", i);
printf("学生学号:");
scanf("%d", &l->r[i].number);
fflush(stdin);
printf("\t 学生姓名:");
scanf("%s", l->r[i].name );
fflush(stdin);
printf("\t 学生成绩:");
scanf("%d", &l->r[i].sort);
fflush(stdin);
}
printf("---------------------------------\n");
printf("录入学生信息结束!\n");
printf("*********************************\n");
}
void remove(Student* l) //删除学生信息
{
int n, i, flag = 1;
while (flag)
{
printf("请输入删除学生的所在位置:");
scanf("%d", &n);
if (n > l->count || n <= 0)
{
printf("输入错误,请再次输入!\n");
}
else
{
for (i = n; i < l->count; i++)
{
strcpy(l->r[i].name, l->r[i + 1].name);
l->r[i].number = l->r[i + 1].number ;
l->r[i].sort = l->r[i + 1].sort ;
}
l->count--;
printf("删除成功!\n");
flag = 0;
}
}
}
void print_info(Student* l, int i)//输出学生信息
{
printf("学号:%d\n", l->r[i].number);
printf("\t 姓名:%s\n", l->r[i].name);
printf("\t 成绩:%d\n", l->r[i].sort);
}
int change(Student* l)//修改学生信息
{
int n, pos, x,i,w, flag;
char name[20];
printf("请选择查找该学生的方式:1.学号 2.姓名\n");
printf("请输入你的选择:");
scanf("%d", &n);
fflush(stdin);
switch (n)
{
case 1:
printf("请输入你要查找的学号:");
scanf("%d", &w);
for (i = 1; i <= l->count; i++)
{
if (l->r[i].number == w)
break;
}
pos = i;
break;
case 2:
printf("请输入你要查找的姓名:");
scanf("%s", name);
for (i = 1; i <= l->count; i++)
{
if (strcmp(l->r[i].name , name)==0)
break;
}
pos = i;
break;
default:
printf("输入错误!\n");
return 0;
}
printf("查找成功!\n");
printf("学生信息为:");
print_info(l, pos);
printf("请选择要修改的信息:1.学号 2.姓名 3.成绩\n");
scanf("%d", &x);
fflush(stdin);
switch (x)
{
case 1:
printf("请输入修改后的学号:");
scanf("%d", &l->r[pos].number);
for (int i = 1; i < pos; i++)
{
if (l->r[pos].number == l->r[i].number)
flag = 0;
}
for (int i = pos + 1; i <= l->count; i++)
{
if (l->r[pos].number == l->r[i].number)
flag = 0;
}
if (flag == 0)
printf("更改失败,此学号存在!\n");
else
{
printf("修改成功!\n");
printf("学生信息为:");
print_info(l, pos);
}
break;
case 2:
printf("请输入修改后的姓名:");
scanf("%s", l->r[pos].name);
printf("修改成功!\n");
printf("学生信息为:");
print_info(l, pos);
break;
case 3:
printf("请输入修改后的成绩:");
scanf("%d", &(l->r[pos].sort));
printf("修改成功!\n");
printf("学生信息为:");
print_info(l, pos);
break;
default:
printf("输入错误!\n");
break;
}
return 0;
}
int Binsrch(Student l)//折半查找(按学号查找)
{
int number;
printf("请输入查找的学号:");
scanf("%d", &number);
fflush(stdin);
int low = 1, hight = l.count , mid;
while (low <= hight)
{
mid = (low + hight) / 2;
if (l.r[mid].number == number)
return (mid);
else if (l.r[mid].number < number)
low = mid + 1;
else
hight = mid - 1;
}
return 0;
}
int Binsrch_(Student l)查找(按姓名查找)
{
int i, flag,w=0,h=0;//flag作为查找的判断标志
char name[20];
printf("请输入查找的姓名:");
scanf("%s", name);
fflush(stdin);
for (i = 1; i <= l.count; i++)
{
h++;
if (strcmp(l.r[i].name, name) == 0)
{
printf("查找成功!\n");
printf("学生信息为:");
print_info(&l, i);
flag = 0;
w = 1;
break;
}
}
return w;
}
int Search(Student l)//查找学生信息
{
printf("-----------------------------\n");
int i,n,number,flag=1;//flag作为是否继续查找的标志
int pos,w;
printf("请选择查找学生的方式:\n\t1.学号查找\n\t2.姓名查找\n");
printf("请输入你的选择:");
scanf("%d", &n);
fflush(stdin);
while (flag)
{
switch (n)
{
case 1:
pos=Binsrch(l);
if (pos == 0)
{
printf("查找失败!请确定是否再次查找!\n");
printf("请输入你的选择:1.是 2.否");
scanf("%d",&w);
fflush(stdin);
if (w == 1)
flag = 1;
else
flag = 0;
}
else
{
printf("查找成功!\n");
printf("学生信息为:");
print_info(&l,pos);
flag = 0;
}
break;
case 2: {
pos = Binsrch_(l);
if (pos == 1)
flag = 0;
else
{
printf("查找失败!请确定是否再次查找!\n");
printf("请输入你的选择:1.是 2.否");
scanf("%d", &w);
fflush(stdin);
if (w == 1)
flag = 1;
else
flag = 0;
}
}break;
default:break;
}
}
return 0;
}
int Ins_change(Student* l)//指定插入学生信息位置
{
int n, i,flag=1,flag_=1;
Student New;
printf("-----------------------------\n");
printf("请输入插入学生信息的位置:");
scanf("%d", &n);
if (n > l->count || n < 1)
{
printf("输入失败!\n");
flag = 1;
}
else
{
printf("请输入你想加入学生的信息:");
while (flag_)
{
printf("\n\t学生学号:");
scanf("%d", &New.r[1].number);
fflush(stdin);
for (int i = 1; i <= l->count; ++i)
{
if (l->r[i].number == New.r[1].number)
{
printf("学号已存在,请重新输入!\n");
flag_ = 1;
break;
}
if (i == l->count)
flag_ = 0;
}
}
printf("\t学生姓名:");
scanf("%s", New.r[1].name);
fflush(stdin);
printf("\t学生成绩:");
scanf("%d", &New.r[1].sort);
fflush(stdin);
for (int i = l->count; i >= n; --i)
{
l->r[i + 1] = l->r[i];
}
l->r[n].number = New.r[1].number;
strcpy(l->r[n].name, New.r[1].name);
l->r[n].sort = New.r[1].sort;
l->count++;
printf("插入成功!\n");
}
printf("-----------------------------\n");
return 0;
}
void count(Student l)//统计学生信息
{
printf("\n\t统计学生信息\n");
printf("************************************\n");
printf("该系统一共收录了%d个学生!\n", l.count);
int i;
float average,sum = 0.00;
for (i = 1; i < l.count; i++)
{
sum += l.r[i].sort;
}
average = sum / l.count;
printf("录入的学生平均成绩为:%.2f", average);
printf("************************************\n");
}
void Show(Student l)//显示全部学生信息
{
printf("\n\t显示全部学生信息\n");
printf("************************************\n");
printf("该系统一共收录了%d个学生!\n", l.count);
int i;
printf("学号\t姓名\t成绩\n");
for (i = 1; i <= l.count; i++)
{
printf("%d\t%s\t%d\n", l.r[i].number, l.r[i].name, l.r[i].sort);
}
printf("\n************************************\n");
}
int End()//结束学生系统
{
printf("************************************\n");
printf("退出学生系统成功!");
return 0;
}
void sort(Student* l)//按学生姓名进行排序
{
int i, j;
for (i = 1; i <= l->count; i++)
{
for (j = 1; j <= l->count - i; j++)
{
if (l->r[j].sort > l->r[j + 1].sort)
{
// 交换学生信息
int temp_number = l->r[j].number;
int temp_sort = l->r[j].sort;
char temp_name[20];
strcpy(temp_name, l->r[j].name);
strcpy(l->r[j].name, l->r[j + 1].name);
l->r[j].number = l->r[j + 1].number;
l->r[j].sort = l->r[j + 1].sort;
strcpy(l->r[j + 1].name, temp_name);
l->r[j + 1].number = temp_number;
l->r[j + 1].sort = temp_sort;
}
}
}
printf("排序完成!\n");
// 输出排序后的学生信息
printf("排序后的学生信息:\n");
for (i = 1; i <= l->count; i++)
{
printf("学号:%d\n", l->r[i].number);
printf("\t 姓名:%s\n", l->r[i].name);
printf("\t 成绩:%d\n", l->r[i].sort);
}
}
void choice()
{
int n,flag=1;
Student l;
while (flag)
{
printf("请输入你选择的功能:");
scanf("%d", &n);
switch (n)
{
case 1:Ins(&l); break;
case 2:remove(&l); break;
case 3:change(&l); break;
case 4:Search(l); break;
case 5:count(l); break;
case 6:Ins_change(&l); break;
case 7:Show(l); break;
case 8:sort(&l); break;
case 0:End(); flag = 0; break;
default:break;
}
}
}
int main()
{
DisplayMenu();
choice();
return 0;
}
4、运行截图展示(部分)
最后
完成这个系统的过程确实需要花费大量时间和精力,涉及到大量的代码编写和逻辑设计。感谢您的辛勤付出和分享。如果您觉得这个系统对您有帮助,欢迎点赞、收藏,留言反馈。如果您有任何问题或需要进一步帮助,也欢迎私信我,我会尽力回复您的。感谢您的支持和理解!