第一次写博客,加油,后面写出更好的!
题目如下:
设置一个学生成绩管理系统,基本实现学生成绩的输入,统计,查找,删除
1.用学到的C语言,实现一个学生成绩管理系统。
2.加强对链表的熟练操作。
3.加强对结构体的应用
系统以菜单方式工作,能够提供以下功能:
0.录入学生信息功能 ―――开辟节点,存入学生信息,头插法将节点添加到链表中
1.浏览学生信息功能 ―――遍历链表,判断学生信息头节点是否为空,如果为空代表无任何信息,当不为空时打印信息,然后指向下一个节点
2.查找学生信息功能 ―――遍历(搜索)链表,找到相关节点数据,逐个匹配,一致时打印结果。
具体描述:输入要查找的学生姓名,if语句进行判断匹配,一致时输出学生信息,不匹配时,p指向下一个节点,单链表继续,直到单链表结束(用到了while循环)。
3.修改学生信息功能 ―――遍历(搜索)链表,找到相关节点数据,逐个匹配,一致时进行修改。
具体描述:输入要修改的学生学号,if语句进行判断匹配,一致时进行修改,不匹配时,p指向下一个节点,单链表继续,直到单链表结束(用到了while循环)
4.删除学生信息功能 ―――遍历(搜索)链表,找到相关节点数据,逐个匹配,一致时进行删除。
具体描述:输入要删除的学生学号,if语句进行判断匹配,一致时进行删除,不匹配时,p指向下一个节点,单链表继续,直到单链表结束(用到了while循环)
1.按照系统提示录入学生的学号、姓名、语文成绩、高数成绩、英语成绩。
2.用户浏览学生信息时,可以知晓学生的学号、姓名、语文成绩、高数成绩、英语成绩、各科成绩的总分。
3.用户查找学生信息时,要输入学生的姓名
4.用户修改学生信息时和删除学生时,要输入学生的学号
(1)界面美观,给用户以视觉上的享受。
(2)菜单里的功能给予编号,排列清晰,便于用户选择
(3)当用户录入的学生信息有多余和出错时,用户可以选择修改和删除功能。
图4-1
(1)界面和选择菜单项
(2)录入学生信息
(3)打印学生信息
(4)查找学生信息
(5)修改学生信息
(6)删除学生信息
(7)系统介绍和注意
图4-3
图4-4
该系统包含的库函数具体有:
#include
#include
#include
#include
定义学生的结构体,链表节点结构体
typedef struct _student//typedef取别名 struct关键字 Stu结构体的名称
{
int num;//学号
char name[20];//姓名
int chinese;// 语文
int hMath;//高数
int english;//英语
int total;//总数
} student;//student学生结构体类型 把结构的别名取做student
/*链表:数据结构。相当于一列火车,有头结点,尾结点 。链表由许多的节点组成,就好比一列车厢
。结点:数据域(存储数据)和指针域(指向下一个节点)*/
typedef struct _Node
{
student stu; //数据域,用于存储数据 ,学生信息
struct _Node* next;//指针,可以用来访问节点数据,遍历,指向下一个节点的指针
}Node;
//定义一个链表
Node* g_pHead=NULL;//链表的头结点
void menu(); //菜单
void keyDown();//选择菜单项
void Inputstudent();//录入信息
void PrintStudent();//打印信息
void FinfStudent();//查找学生信息
void ChangeStudent();//修改
void DeleteStudent();//删除
void help();//系统介绍
int main()
{
while(1)
{
menu();
keyDown();
system("pause");
system("cls");//清屏
}
system("pause");
return 0;
}
界面
void menu()
{
printf("\n");
printf("\t\t\t 欢迎使用学生成绩管理系统,祝您使用愉快! \t\t\t\n\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");
printf("\t★\t\t\t*****************************************************\t\t\t\t★\n\n");
printf("\t★\t\t\t\t 【学 生 成 绩 管 理 系 统】 \t\t\t\t\t\t★\n\n");
printf("\t★\t\t\t 制作者:段玥倩 专业:软件工程 学号:200207401\t\t\t\t\t★\n\n");
printf("\t★\t\t\t*****************************************************\t\t\t\t★\n\n");
printf("\t★\t\t\t*********************系统功能菜单************************* \t\t\t★\n");
printf("\t★\t\t\t --------------------------------------------- \t\t\t★ \n");
printf("\t★\t\t\t | 0.录入学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 1.浏览学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 2.查询学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 3.修改学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 4.删除学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 5.该系统介绍和注意 | \t\t\t★\n");
printf("\t★\t\t\t | 6.退出系统 | \t\t\t★\n");
printf("\t★\t\t\t --------------------------------------------- \t\t\t★\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");
printf("\t\t\t\t请选择系统功能菜单编号:");
}
选择菜单项
void keyDown()
{
int choice=0;
scanf("%d",&choice);
switch(choice)
{
case 0:
printf("----------------[录入学生信息]-------------------------\n");
Inputstudent();
break; //跳转
case 1:
printf("----------------[浏览学生信息]-------------------------\n");
PrintStudent();
break; //跳转
case 2:
printf("----------------[查询学生信息]-------------------------\n");
FinfStudent();
break;
case 3:
printf("----------------[修改学生信息 ]-------------------------\n");
ChangeStudent();
break;
case 4:
printf("----------------[按学号删除信息]-------------------------\n");
DeleteStudent();
break;
case 5:
printf("----------------[系统介绍和注意]-------------------------\n");
help();
break;
case 6:
printf("正常退出!\n");
system("pause");//防止闪屏
exit(0);//直接退出
break;
default:
printf("选择错误,重新输入,请在0-6之间选择\n");
system("pause");//防止闪屏
break;
}
}
void Inputstudent()
{
system("cls");
//开辟一个节点,分配内存
Node* p = (Node*)malloc(sizeof(Node)); //malloc函数定义在头文件
p->next = NULL;//指针下一个指向空
p->stu.total = 0;
printf("请输入学生的学号:\n");
scanf("%d",&p->stu.num);
printf("请输入学生的姓名:\n");
scanf("%s",p->stu.name);
printf("请输入语文成绩:\n");
scanf("%d",&p->stu.chinese );
p->stu.total += p->stu.chinese;
printf("请输入高数成绩:\n");
scanf("%d",&p->stu.hMath);
p->stu.total += p->stu.hMath;
printf("请输入英语成绩: \n");
scanf("%d",&p->stu.english);
p->stu.total +=p->stu.english;
//将节点添加到链表中
if(g_pHead == NULL)
{
g_pHead=p;
}
else
{
p->next = g_pHead;
g_pHead = p;//头插法
}
printf("学生信息录入成功。\n");
system("pause");//暂停
system("cls");//清屏
}
void PrintStudent()
{
system("cls");
//遍历链表
Node* p = g_pHead;
if(p==NULL){
printf("系统中无该学生信息,请录入后再查看。\n");
}
else{
printf("*********************************************************************************\n");
printf("*\t\t\t欢迎使用高校学生成绩管理系统 \t\t\t*\n");
printf("*********************************************************************************\n");
printf("* \t学号\t* \t姓名\t* \t语文\t* \t高数\t* \t英语\t \t总分\t*\n");
printf("-------------------------------------------------------------------------------------------------\n");
while(p != NULL)
{
printf("* \t%d\t* \t%s\t* \t%d\t* \t%d\t* \t%d\t* \t%d\t*\n"
,p->stu.num,p->stu.name,p->stu.chinese,p->stu.hMath,p->stu.english,p->stu.total);
p = p->next;//下一个节点
}
}
system("pause");
system("cls");
}
void FinfStudent()
{
system("cls");
char name[20];
printf("\n\n");
printf("\t\t\t----------------------------\n");
printf("\t\t\t| 正在查找学生 |\n");
printf("\t\t\t----------------------------\n");
printf("请输入查找学生的姓名:");
scanf("%s",name);
//遍历链表查找,查找后进行信息显示
Node* p = g_pHead;
//对表头及进行展示一次
int isShowHead = 0;//0为假,1为真
//记录是否找到该学生
int isFindStu = 0;
while(p != NULL)
{
if( !strcmp(p->stu.name , name) ) //对比姓名,是否一致
{
if(!isShowHead)
{
printf("*********************************************************************************\n");
printf("* \t学号\t* \t姓名\t* \t语文\t* \t高数\t* \t英语\t \t总分\t*\n");
printf("-------------------------------------------------------------------------------------------------\n");
isShowHead = 1;
}
printf("* \t%d\t* \t%s\t* \t%d\t* \t%d\t* \t%d\t* \t%d\t*\n"
,p->stu.num,p->stu.name,p->stu.chinese,p->stu.hMath,p->stu.english,p->stu.total);
isFindStu = 1;
}
p = p->next ;
}
if(!isFindStu){
printf("输入有误,系统暂无学生信息。\n\n");
}
system("pause");
system("cls");
}
void ChangeStudent()
{
system("cls");
int num;
printf("请输入要修改学生的学号:");
scanf("%d",&num);
//遍历链表
Node* p = g_pHead;
//对表头进行展示一次
int isShowHead = 0;//
//记录是否找到该学生
int isFindStu = 0;
while(p!=NULL)
{
if(num == p->stu.num )
{
if(!isShowHead)
{
printf("*********************************************************************************\n");
printf("* \t学号\t* \t姓名\t* \t语文\t* \t高数\t* \t英语\t \t总分\t*\n");
printf("-------------------------------------------------------------------------------------------------\n");
isShowHead = 1;
}
printf("* \t%d\t* \t%s\t* \t%d\t* \t%d\t* \t%d\t* \t%d\t*\n"
,p->stu.num,p->stu.name,p->stu.chinese,p->stu.hMath,p->stu.english,p->stu.total);
//修改学生信息
p->stu.total = 0;
printf("请输入要修改学生的学号:\n");
scanf("%d",&p->stu.num);
printf("请输入要修改学生的姓名:\n");
scanf("%s",p->stu.name);
printf("请输入要修改语文成绩:\n");
scanf("%d",&p->stu.chinese );
p->stu.total += p->stu.chinese;
printf("请输入要修改高数成绩:\n");
scanf("%d",&p->stu.hMath);
p->stu.total += p->stu.hMath;
printf("请输入要修改英语成绩: \n");
scanf("%d",&p->stu.english);
p->stu.total +=p->stu.english;
isFindStu = true;
printf("学生信息修改成功。\n\n");
}
p = p->next;
}
if(!isFindStu){
printf("学号输出有误,系统没有该学生信息,无法修改。\n\n");
}
system("pause");
system("cls");
}
void DeleteStudent()
{
system("cls");
int num;
printf("请输入删除学生的学号:");
scanf("%d",&num);
//遍历链表
Node* p = g_pHead;
//记录前一个节点,删除时方便操作
Node* beforeNode = g_pHead;
//对表头进行展示一次
int isShowHead = 0;//
//记录是否找到该学生
int isFindStu = 0;
while(p!=NULL)
{
if(num == p->stu.num )
{
if(!isShowHead)
{
printf("*********************************************************************************\n");
printf("* \t学号\t* \t姓名\t* \t语文\t* \t高数\t* \t英语\t \t总分\t*\n");
printf("-------------------------------------------------------------------------------------------------\n");
isShowHead = 1;
}
printf("* \t%d\t* \t%s\t* \t%d\t* \t%d\t* \t%d\t* \t%d\t*\n"
,p->stu.num,p->stu.name,p->stu.chinese,p->stu.hMath,p->stu.english,p->stu.total);
isFindStu = 1;
//删除节点为头节点
if(p == g_pHead)
{
g_pHead = p->next ;
}
//删除节点为尾节点
else if (p->next == NULL)
{
p->next = NULL;
}
//删除节点为中间节点
else{
beforeNode->next = p->next ;
}
printf("删除成功。\n\n");
}
beforeNode = p;
p = p->next ;
}
if(!isFindStu){
printf("学号输入有误,系统没有该学生信息,无法删除操作。\n\n");
}
system("pause");
system("cls");
}
void help()
{
printf("\n 欢迎使用系统帮助!\n");
printf("\n1.初次进入系统后,请先录入学生信息;\n");
printf("\n2.按照菜单提示键入数字代号;\n");
printf("\n3.成绩录入时必须是整数;\n");
printf("\n4.谢谢您的使用!\n");
}
对于初次使用的用户可先输入数字5,查看该系统的介绍和注意事项
《C Primer Plus》(第6版)中文版
这个系统还有许多缺陷,
(1).录入学生信息时,只能是录入完一个后返回菜单再录入下一个,过程太繁琐
(2).录入的学生信息中缺少成绩排序功能
(3).录入的成绩只能为整数
开始呢是无从下爪,到做出来之后,这个过程是遇到问题,解决问题。学习其他人的经验,然后总结自己的思路。所以往后的学习也是不断发现问题,从而解决它。
#include
#include
#include
#include
//定义学生的结构
typedef struct _student//typedef取别名 struct关键字 Stu结构体的名称
{
int num;//学号
char name[20];//姓名
int chinese;// 语文
int hMath;//高数
int english;//英语
int total;//总数
}student;//student学生结构体类型 把结构的别名取做student
typedef struct _Node
{
student stu; //数据域,用于存储数据 ,学生信息
struct _Node* next;//指针
}Node;
//定义一个链表
Node* g_pHead=NULL;//链表的头结点
void menu(); //菜单
void keyDown();//选择菜单项
void Inputstudent();//录入信息
void PrintStudent();//打印信息
void FinfStudent();//查找学生信息
void ChangeStudent();//修改
void DeleteStudent();//删除
void help();//系统介绍
//主函数
int main()
{
while(1)
{
menu();
keyDown();
system("pause");
system("cls");//清屏
}
system("pause");
return 0;
}
//界面
void menu()
{
printf("\n");
printf("\t\t\t 欢迎使用学生成绩管理系统,祝您使用愉快! \t\t\t\n\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");
printf("\t★\t\t\t*****************************************************\t\t\t\t★\n\n");
printf("\t★\t\t\t\t 【学 生 成 绩 管 理 系 统】 \t\t\t\t\t\t★\n\n");
printf("\t★\t\t\t 制作者:段玥倩 专业:软件工程 学号:200207401\t\t\t\t\t★\n\n");
printf("\t★\t\t\t*****************************************************\t\t\t\t★\n\n");
printf("\t★\t\t\t*********************系统功能菜单************************* \t\t\t★\n");
printf("\t★\t\t\t --------------------------------------------- \t\t\t★ \n");
printf("\t★\t\t\t | 0.录入学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 1.浏览学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 2.查询学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 3.修改学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 4.删除学生信息 | \t\t\t★\n");
printf("\t★\t\t\t | 5.该系统介绍和注意 | \t\t\t★\n");
printf("\t★\t\t\t | 6.退出系统 | \t\t\t★\n");
printf("\t★\t\t\t --------------------------------------------- \t\t\t★\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");
printf("\t\t\t\t请选择系统功能菜单编号:");
}
void keyDown()//选择菜单项
{
int choice=0;
scanf("%d",&choice);
switch(choice)
{
case 0:
printf("----------------[录入学生信息]-------------------------\n");
Inputstudent();
break; //跳转
case 1:
printf("----------------[浏览学生信息]-------------------------\n");
PrintStudent();
break; //跳转
case 2:
printf("----------------[查询学生信息]-------------------------\n");
FinfStudent();
break;
case 3:
printf("----------------[修改学生信息 ]-------------------------\n");
ChangeStudent();
break;
case 4:
printf("----------------[按学号删除信息]-------------------------\n");
DeleteStudent();
break;
case 5:
printf("----------------[系统介绍和注意]-------------------------\n");
help();
break;
case 6:
printf("正常退出!\n");
system("pause");//防止闪屏
exit(0);//直接退出
break;
default:
printf("选择错误,重新输入,请在0-6之间选择\n");
system("pause");//防止闪屏
break;
}
}
//录入学生信息
void Inputstudent()
{
system("cls");
//开辟一个节点,分配内存
Node* p = (Node*)malloc(sizeof(Node)); //malloc函数定义在头文件
p->next = NULL;//指针下一个指向空
p->stu.total = 0;
printf("请输入学生的学号:\n");
scanf("%d",&p->stu.num);
printf("请输入学生的姓名:\n");
scanf("%s",p->stu.name);
printf("请输入语文成绩:\n");
scanf("%d",&p->stu.chinese );
p->stu.total += p->stu.chinese;
printf("请输入高数成绩:\n");
scanf("%d",&p->stu.hMath);
p->stu.total += p->stu.hMath;
printf("请输入英语成绩: \n");
scanf("%d",&p->stu.english);
p->stu.total +=p->stu.english;
>
//将节点添加到链表中
if(g_pHead == NULL)
{
g_pHead=p;
}
else
{
p->next = g_pHead;
g_pHead = p;//头插法
}
printf("学生信息录入成功。\n");
system("pause");//暂停
system("cls");//清屏
}
//打印学生信息
void PrintStudent()
{
system("cls");
//遍历链表
Node* p = g_pHead;
if(p==NULL){
printf("系统中无该学生信息,请录入后再查看。\n");
}
else{
printf("*********************************************************************************\n");
printf("*\t\t\t欢迎使用高校学生成绩管理系统 \t\t\t*\n");
printf("*********************************************************************************\n");
printf("* \t学号\t* \t姓名\t* \t语文\t* \t高数\t* \t英语\t \t总分\t*\n");
printf("------------------------------------------------------------------------------------------->------\n");
while(p != NULL)
{
printf("* \t%d\t* \t%s\t* \t%d\t* \t%d\t* \t%d\t* \t%d\t*\n"
,p->stu.num,p->stu.name,p->stu.chinese,p->stu.hMath,p->stu.english,p->stu.total);
p = p->next;//下一个节点
}
}
system("pause");
system("cls");
}
//查找学生信息
void FinfStudent()
{
system("cls");
char name[20];
printf("\n\n");
printf("\t\t\t----------------------------\n");
printf("\t\t\t| 正在查看学生 |\n");
printf("\t\t\t----------------------------\n");
printf("请输入查找学生的姓名:");
scanf("%s",name);
//遍历链表查找,查找后进行信息显示
Node* p = g_pHead;
//对表头及进行展示一次
int isShowHead = 0;//0为假,1为真
//记录是否找到该学生
int isFindStu = 0;
while(p != NULL)
{
if( !strcmp(p->stu.name , name) ) //对比姓名,是否一致
{
if(!isShowHead)
{
printf("*********************************************************************************\n");
printf("* \t学号\t* \t姓名\t* \t语文\t* \t高数\t* \t英语\t \t总分\t*\n");
printf("-------------------------------------------------------------------------------------------------\n");
isShowHead = 1;
}
printf("* \t%d\t* \t%s\t* \t%d\t* \t%d\t* \t%d\t* \t%d\t*\n"
,p->stu.num,p->stu.name,p->stu.chinese,p->stu.hMath,p->stu.english,p->stu.total);
>
> isFindStu = 1;
> }
p = p->next ;
}
if(!isFindStu){
printf("输入有误,系统暂无学生信息。\n\n");
}
system("pause");
system("cls");
}
//修改学生信息
void ChangeStudent()
{
int num;
printf("请输入要修改学生的学号:");
scanf("%d",&num);
//遍历链表
Node* p = g_pHead;
//对表头进行展示一次
int isShowHead = 0;//
//记录是否找到该学生
int isFindStu = 0;
while(p!=NULL)
{
if(num == p->stu.num )
{
if(!isShowHead)
{
printf("*********************************************************************************\n");
printf("* \t学号\t* \t姓名\t* \t语文\t* \t高数\t* \t英语\t \t总分\t*\n");
printf("-------------------------------------------------------------------------------------------------\n");
isShowHead = 1;
}
printf("* \t%d\t* \t%s\t* \t%d\t* \t%d\t* \t%d\t* \t%d\t*\n"
,p->stu.num,p->stu.name,p->stu.chinese,p->stu.hMath,p->stu.english,p->stu.total);
//修改学生信息
p->stu.total = 0;
printf("请输入要修改学生的学号:\n");
scanf("%d",&p->stu.num);
printf("请输入要修改学生的姓名:\n");
scanf("%s",p->stu.name);
printf("请输入要修改语文成绩:\n");
scanf("%d",&p->stu.chinese );
p->stu.total += p->stu.chinese;
printf("请输入要修改高数成绩:\n");
scanf("%d",&p->stu.hMath);
p->stu.total += p->stu.hMath;
printf("请输入要修改英语成绩: \n");
scanf("%d",&p->stu.english);
p->stu.total +=p->stu.english;
isFindStu = true;
printf("学生信息修改成功。\n\n");
}
p = p->next;
}
if(!isFindStu){
printf("学号输出有误,系统没有该学生信息,无法修改。\n\n");
}
system("pause");
system("cls");
}
//删除学生信息
void DeleteStudent()
{
system("cls");
int num;
printf("请输入删除学生的学号:");
scanf("%d",&num);
//遍历链表
Node* p = g_pHead;
//记录前一个节点,删除时方便操作
Node* beforeNode = g_pHead;
//对表头进行展示一次
int isShowHead = 0;//
//记录是否找到该学生
int isFindStu = 0;
while(p!=NULL)
{
if(num == p->stu.num )
{
if(!isShowHead)
{
printf("*********************************************************************************\n");
printf("* \t学号\t* \t姓名\t* \t语文\t* \t高数\t* \t英语\t \t总分\t*\n");
printf("-------------------------------------------------------------------------------------------------\n");
isShowHead = 1;
}
printf("* \t%d\t* \t%s\t* \t%d\t* \t%d\t* \t%d\t* \t%d\t*\n"
,p->stu.num,p->stu.name,p->stu.chinese,p->stu.hMath,p->stu.english,p->stu.total);
isFindStu = 1;
//删除节点为头节点
if(p == g_pHead)
{
g_pHead = p->next ;
}
//删除节点为尾节点
else if (p->next == NULL)
{
p=beforeNode;
p->next = NULL;
}
//删除节点为中间节点
else{
beforeNode->next = p->next ;
}
printf("删除成功。\n\n");
}
beforeNode = p;
p = p->next ;
}
if(!isFindStu){
printf("学号输入有误,系统没有该学生信息,无法删除操作。\n\n");
}
system("pause");
system("cls");
}
//系统介绍
void help()
{
printf("\n 欢迎使用系统帮助!\n");
printf("\n1.初次进入系统后,请先录入学生信息;\n");
printf("\n2.按照菜单提示键入数字代号;\n");
printf("\n3.成绩录入时必须是整数;\n");
printf("\n4.谢谢您的使用!\n");
}