C语言学生成绩管理系统
2023-04-18 15:48:29 时间
学习完C语言基础知识点,现在来用单链表、函数、指针的相关知识写一个简单版学生成绩管理系统,主要实现增删改查的基本功能。
主界面:(自己设计)
void main()
{
system("cls");
printf("
");
printf(" ===========================================
");
printf(" | |
");
printf(" | 欢迎来到学生成绩管理系统 |
");
printf(" | |
");
printf(" |=========================================|
");
printf(" | 请选择要操作的命令 |
");
printf(" |-----------------------------------------|
");
printf(" | |
");
printf(" | 1.录入学生信息 |
");
printf(" | 2.显示学生信息 |
");
printf(" | 3.增加学生信息 |
");
printf(" | 4.删除学生信息 |
");
printf(" | 5.修改学生信息 |
");
printf(" | 6.查找学生信息 |
");
printf(" | 7.按总分排序 |
");
printf(" | |
");
printf(" ===========================================
");
int Item;//保存操作命令
pnode phead=NULL;//定义一个指针
while(1)
{
printf("请选择操作命令:");
scanf("%d",&Item);
system("cls");//清屏
switch(Item)
{
case 1://录入学生信息
{
phead=Input();
}
break;
case 2://显示学生信息
{
Show(phead);
}
break;
case 3://增加学生信息
{
Add(phead);
}
break;
case 4://删除学生信息
{
Delete(phead);
}
break;
case 5://修改学生信息
{
Change(phead);
}
break;
case 6://查找学生信息
{
Search(phead);
}
break;
case 7://总分排序
{
Sort(phead);
Show(phead);
}
break;
default:
break;
}
}
system("pause");
}
1.定义一个学生结构和一个结点结构,用于存储信息。
学生结构:
//学生结构
struct Student
{
char Name[10];
int Num;
float Computer;
float Math;
float English;
float Total;
float Ave;
};
结点结构:
//结点
typedef struct Node
{
struct Student st;//数据域
struct node *pnext;//指针域
}node, *pnode;//*node等价于struct Student st,pnode等价于struct Node *pNext
2.定义一些函数来处理学生信息。
函数模块:
//函数
pnode Input();//录入学生信息
void Show(pnode phead);//显示学生信息
void Add(pnode phead);//增加学生信息
void Delete(pnode phead);//删除学生信息
void Change(pnode phead);//修改学生信息
void Search(pnode phead);//查找学生信息
void Sort(pnode phead);//总分排序
1)录入学生信息pnode Input()
//录入学生信息
pnode Input()
{
int num;//学生的人数
node stu;//学生结构
pnode phead=(pnode)malloc(sizeof(node));//定义一个头结点并且为头结点分配内存
//判断内存是否为空
if(NULL==phead)
{
printf("内存分配失败,程序终止!
");
exit(-1);
}
pnode ptail=phead;//定义一个指向头结点的指针
ptail->pnext=NULL;//清空指针域
printf("请输入学生的人数:");
scanf("%d",&num);
int i;
for(i=0;i<num;i++)
{
printf("请输入第%d个学生的姓名:",i+1);
scanf("%s",stu.st.Name);
printf("请输入第%d个学生的学号:",i+1);
scanf("%d",&stu.st.Num);
printf("请输入第%d个学生的计算机成绩:",i+1);
scanf("%f",&stu.st.Computer);
printf("请输入第%d个学生的高数成绩:",i+1);
scanf("%f",&stu.st.Math);
printf("请输入第%d个学生的大英成绩:",i+1);
scanf("%f",&stu.st.English);
//计算总分
stu.st.Total=stu.st.Computer+stu.st.Math+stu.st.English;
//计算平均分
stu.st.Ave=stu.st.Total/3.0f;
//为新节点分配内存
pnode pnew=(pnode)malloc(sizeof(node));
//判断内存是否为空
if(NULL==pnew)
{
printf("内存分配失败,程序终止!
");
exit(-1);
}
pnew->st=stu.st;//初始化结点的数据域
ptail->pnext=pnew;//将新结点挂到老结点后
pnew->pnext=NULL;//清空新结点的指针域
ptail=pnew;//将ptail移到新结点上
}
return phead;
}
2)显示学生信息void Show(pnode phead)
//显示学生信息
void Show(pnode phead)
{
//定义一个指针用于遍历学生信息
pnode p=phead->pnext;
printf("姓名 学号 计算机 高数 大英 总分 平均分
");
while(NULL!=p)
{
printf("%s %d %g %g %g %g %g
",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
p=p->pnext;
}
}
3)增加学生信息void Add(pnode phead)
//增加学生信息
void Add(pnode phead)
{
pnode p=phead;
int i=0;
struct Student stu;//学生结构体
int loc;//插入结点的位置
printf("请输入插入学生的位置:");
scanf("%d",&loc);
while(NULL!=p&&i<loc-1)
{
p=p->pnext;
i++;
}
if(NULL==p||i>loc)
{
printf("插入结点的位置不存在!
");
return;
}
printf("你将在第%d个学生后面插入一个学生
",loc-1);
printf("请输入第%d个学生的姓名:",loc);
scanf("%s",stu.Name);
printf("请输入第%d个学生的学号:",loc);
scanf("%d",&stu.Num);
printf("请输入第%d个学生的计算机成绩:",loc);
scanf("%f",&stu.Computer);
printf("请输入第%d个学生的高数成绩:",loc);
scanf("%f",&stu.Math);
printf("请输入第%d个学生的大英成绩:",loc);
scanf("%f",&stu.English);
stu.Total=stu.Computer+stu.Math+stu.English;//计算总分
stu.Ave=stu.Total/3.0f;//计算平均分
pnode pnew=(pnode)malloc(sizeof(node));
if(NULL==pnew)
{
printf("动态内存分配失败,程序终止!
");
exit(-1);
}
pnew->st=stu;
pnode q=p->pnext;
p->pnext=pnew;
pnew->pnext=q;
}
4)删除学生信息void Delete(pnode phead)
//删除学生信息
void Delete(pnode pHead)
{
pnode p = pHead;
int i = 0;
int loc;
printf("请输入你需要删除的学生的编号:");
scanf("%d",&loc);
while(NULL!=p->pnext&&i<loc-1)
{
p=p->pnext;
i++;
}
if(NULL==p->pnext||i>loc-1)
{
printf("没找到需要删除的学生的编号!
");
return;
}
pnode q=p->pnext;
p->pnext=q->pnext;
free(q);
q==NULL;
printf("你已经成功删除了第%d个学生的信息!
",loc);
}
5)修改学生信息void Change(pnode phead)
//修改学生信息
void Change(pnode phead)
{
char Name[10];
printf("请输入你需要修改的学生的姓名:");
scanf("%s",&Name);
pnode p=phead->pnext;//定义一个指针用于遍历学生信息
while(NULL!=p)
{
if(0==strcmp(Name,p->st.Name))
{
printf("姓名 学号 计算机 高数 大英 总分 平均分
");
printf("修改前的学生信息!
");
printf("%s %d %g %g %g %g %g
",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
system("pause");
system("cls");//清屏
printf("请输入新的学生姓名:");
scanf("%s",p->st.Name);
printf("请输入新的学生学号:");
scanf("%d",&p->st.Num);
printf("请输入新的学生的计算机成绩:");
scanf("%f",&p->st.Computer);
printf("请输入新的学生的高数成绩:");
scanf("%f",&p->st.Math);
printf("请输入新的学生的大英成绩:");
scanf("%f",&p->st.English);
p->st.Total=p->st.Computer+p->st.Math+p->st.English;//计算总分
p->st.Ave=p->st.Total/3.0f;//计算平均分
break;
}
p=p->pnext;
}
}
6)查找学生信息void Search(pnode phead)
//查找学生信息
void Search(pnode pHead)
{
char Name[10];
printf("请输入你需要查找的学生的姓名:");
scanf("%s",Name);
pnode p=pHead->pnext;
printf("姓名 学号 计算机 高数 大英 总分 平均分
");
while(NULL!=p)
{
if(0==strcmp(Name,p->st.Name))
{
printf("%s %d %g %g %g %g %g
",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
}
p=p->pnext;
}
}
7)按总分排序void Sort(pnode phead)
//总分排序
void Sort(pnode phead)
{
pnode p, q;//定义两个指针
node temp;
for(p=phead->pnext;NULL!=p;p=p->pnext)
{
for(q=p->pnext;NULL!=q;q=q->pnext)
{
if(p->st.Total<q->st.Total)//当前一个学生的总分小于后一个学生的总分时
{
temp.st=p->st;//交换学生的位置
p->st=q->st;
q->st=temp.st;
}
}
}
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//学生结构体
struct Student
{
char Name[10];
int Num;
float Computer;
float Math;
float English;
float Total;
float Ave;
};
//结点
typedef struct Node
{
struct Student st;//数据域
struct node *pnext;//指针域
}node, *pnode;//*node等价于struct Student st,pnode等价于struct Node *pNext
//函数
pnode Input();//录入学生信息
void Show(pnode phead);//显示学生信息
void Add(pnode phead);//增加学生信息
void Delete(pnode phead);//删除学生信息
void Change(pnode phead);//修改学生信息
void Search(pnode phead);//查找学生信息
void Sort(pnode phead);//总分排序
void main()
{
system("cls");
printf("
");
printf(" ============================================
");
printf(" | |
");
printf(" | 欢迎来到学生成绩管理系统 |
");
printf(" | |
");
printf(" |==========================================|
");
printf(" | 请选择要操作的命令 |
");
printf(" |------------------------------------------|
");
printf(" | |
");
printf(" | 1.录入学生信息 |
");
printf(" | 2.显示学生信息 |
");
printf(" | 3.增加学生信息 |
");
printf(" | 4.删除学生信息 |
");
printf(" | 5.修改学生信息 |
");
printf(" | 6.查找学生信息 |
");
printf(" | 7.按总分排序 |
");
printf(" | |
");
printf(" ============================================
");
int Item;//保存操作命令
pnode phead=NULL;//定义一个指针
while(1)
{
printf("请选择操作命令:");
scanf("%d",&Item);
system("cls");//清屏
switch(Item)
{
case 1://录入学生信息
{
phead=Input();
}
break;
case 2://显示学生信息
{
Show(phead);
}
break;
case 3://增加学生信息
{
Add(phead);
}
break;
case 4://删除学生信息
{
Delete(phead);
}
break;
case 5://修改学生信息
{
Change(phead);
}
break;
case 6://查找学生信息
{
Search(phead);
}
break;
case 7://总分排序
{
Sort(phead);
Show(phead);
}
break;
default:
break;
}
}
system("pause");
}
//录入学生信息
pnode Input()
{
int num;//学生的人数
node stu;//学生结构
pnode phead=(pnode)malloc(sizeof(node));//定义一个头结点并且为头结点分配内存
//判断内存是否为空
if(NULL==phead)
{
printf("内存分配失败,程序终止!
");
exit(-1);
}
pnode ptail=phead;//定义一个指向头结点的指针
ptail->pnext=NULL;//清空指针域
printf("请输入学生的人数:");
scanf("%d",&num);
int i;
for(i=0;i<num;i++)
{
printf("请输入第%d个学生的姓名:",i+1);
scanf("%s",stu.st.Name);
printf("请输入第%d个学生的学号:",i+1);
scanf("%d",&stu.st.Num);
printf("请输入第%d个学生的计算机成绩:",i+1);
scanf("%f",&stu.st.Computer);
printf("请输入第%d个学生的高数成绩:",i+1);
scanf("%f",&stu.st.Math);
printf("请输入第%d个学生的大英成绩:",i+1);
scanf("%f",&stu.st.English);
stu.st.Total=stu.st.Computer+stu.st.Math+stu.st.English;//计算总分
stu.st.Ave=stu.st.Total/3.0f;//计算平均分
pnode pnew=(pnode)malloc(sizeof(node));//为新节点分配内存
//判断内存是否为空
if(NULL==pnew)
{
printf("内存分配失败,程序终止!
");
exit(-1);
}
pnew->st=stu.st;//初始化结点的数据域
ptail->pnext=pnew;//将新结点挂到老结点后
pnew->pnext=NULL;//清空新结点的指针域
ptail=pnew;//将ptail移到新结点上
}
return phead;
}
//显示学生信息
void Show(pnode phead)
{
//定义一个指针用于遍历学生信息
pnode p=phead->pnext;
printf("姓名 学号 计算机 高数 大英 总分 平均分
");
while(NULL!=p)
{
printf("%s %d %g %g %g %g %g
",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
p=p->pnext;
}
}
//增加学生信息
void Add(pnode phead)
{
pnode p=phead;
int i=0;
struct Student stu;//学生结构体
int loc;//插入结点的位置
printf("请输入插入学生的位置:");
scanf("%d",&loc);
while(NULL!=p&&i<loc-1)
{
p=p->pnext;
i++;
}
if(NULL==p||i>loc)
{
printf("插入结点的位置不存在!
");
return;
}
printf("你将在第%d个学生后面插入一个学生
",loc-1);
printf("请输入第%d个学生的姓名:",loc);
scanf("%s",stu.Name);
printf("请输入第%d个学生的学号:",loc);
scanf("%d",&stu.Num);
printf("请输入第%d个学生的计算机成绩:",loc);
scanf("%f",&stu.Computer);
printf("请输入第%d个学生的高数成绩:",loc);
scanf("%f",&stu.Math);
printf("请输入第%d个学生的大英成绩:",loc);
scanf("%f",&stu.English);
stu.Total=stu.Computer+stu.Math+stu.English;//计算总分
stu.Ave=stu.Total/3.0f;//计算平均分
pnode pnew=(pnode)malloc(sizeof(node));
if(NULL==pnew)
{
printf("动态内存分配失败,程序终止!
");
exit(-1);
}
pnew->st=stu;
pnode q=p->pnext;
p->pnext=pnew;
pnew->pnext=q;
}
//删除学生信息
void Delete(pnode pHead)
{
pnode p = pHead;
int i = 0;
int loc;
printf("请输入你需要删除的学生的编号:");
scanf("%d",&loc);
while(NULL!=p->pnext&&i<loc-1)
{
p=p->pnext;
i++;
}
if(NULL==p->pnext||i>loc-1)
{
printf("没找到需要删除的学生的编号!
");
return;
}
pnode q=p->pnext;
p->pnext=q->pnext;
free(q);
q==NULL;
printf("你已经成功删除了第%d个学生的信息!
",loc);
}
//修改学生信息
void Change(pnode phead)
{
char Name[10];
printf("请输入你需要修改的学生的姓名:");
scanf("%s",&Name);
pnode p=phead->pnext;//定义一个指针用于遍历学生信息
while(NULL!=p)
{
if(0==strcmp(Name,p->st.Name))
{
printf("姓名 学号 计算机 高数 大英 总分 平均分
");
printf("修改前的学生信息!
");
printf("%s %d %g %g %g %g %g
",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
system("pause");
system("cls");//清屏
printf("请输入新的学生姓名:");
scanf("%s",p->st.Name);
printf("请输入新的学生学号:");
scanf("%d",&p->st.Num);
printf("请输入新的学生的计算机成绩:");
scanf("%f",&p->st.Computer);
printf("请输入新的学生的高数成绩:");
scanf("%f",&p->st.Math);
printf("请输入新的学生的大英成绩:");
scanf("%f",&p->st.English);
p->st.Total=p->st.Computer+p->st.Math+p->st.English;//计算总分
p->st.Ave=p->st.Total/3.0f;//计算平均分
break;
}
p=p->pnext;
}
}
//查找学生信息
void Search(pnode pHead)
{
char Name[10];
printf("请输入你需要查找的学生的姓名:");
scanf("%s",Name);
pnode p=pHead->pnext;
printf("姓名 学号 计算机 高数 大英 总分 平均分
");
while(NULL!=p)
{
if(0==strcmp(Name,p->st.Name))
{
printf("%s %d %g %g %g %g %g
",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);
}
p=p->pnext;
}
}
//总分排序
void Sort(pnode phead)
{
pnode p, q;//定义两个指针
node temp;
for(p=phead->pnext;NULL!=p;p=p->pnext)
{
for(q=p->pnext;NULL!=q;q=q->pnext)
{
if(p->st.Total<q->st.Total)//当前一个学生的总分小于后一个学生的总分时
{
temp.st=p->st;//交换学生的位置
p->st=q->st;
q->st=temp.st;
}
}
}
}
仅用于本人学习记录,路过的小伙伴有任何问题欢迎评论!
相关文章
- 【HTML | CSS | JAVASCRIPT】耗时一下午,整理出了一个精美的响应式登陆注册表单(附源码)
- 摸鱼时间,画个吃豆人玩一下
- 【小程序开发】uniapp引入iconfont图标及使用方式
- SpringMVC的文件上传
- 【TypeScript】TS 看这一篇就够了
- 2023 年前端十大 Web 发展趋势
- echarts入门教程(超级详细带案例)
- 使用小程序实现AI动漫脸特效
- 37.JavaScript对象与JSON格式的转换,JSON.stringify、JSON.parse方法的使用方法和注意事项
- 【 uniapp - 黑马优购 | 加入购物车】如何配置 vuex、加入购物车功能并持久化
- 2023跨年烟花(浪漫烟花+美妙音乐+雪花飘飘)含前端源码直接下载---系列最终篇
- 前端经典面试500题【上】
- 2023年前端开发趋势未来可期
- Sublime Text 4 (Build 4143) 注册方法STEP BY STEP
- 【JavaScript】JavaScript基本使用方法
- Java IO流 - 字节流的使用详细介绍
- 开箱即用,这些 Vue3 后台管理系统模板绝对让你爽歪歪!
- 【免费】多种方法手把手教你如何将自己做的网页做成网络链接(直接访问)
- 2023前端面试题整理总结~
- 【windows Server 2019系列】 构建IIS服务器