#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define COURSENUM 20 /*科目数量的最大值*/
struct student
{
int number; /*定义每个学生的学号变量*/
char name[20]; /*定义每个学生的姓名变量*/
int score[COURSENUM]; /*定义每个学生m门成绩的变量*/
int sum; /*定义每个学生的总成绩变量*/
float aver; /*定义每个学生的平均成绩变量*/
struct student *next; /*指针的链域*/
};
typedef struct student STU; /*给struct student定义一个新名字 STU*/
int Menu(void); /*函数声明:输出菜单的函数*/
int Ascending(int a,int b); /*函数声明:决定数据是否按升序排列(a<b为真)*/
int Descending(int a,int b); /*函数声明:决定数据是否按降序排列(a>b为真)*/
void IntSwap(int *pt1,int *pt2); /*函数声明:整型数据交换*/
void CharSwap(char *pe1,char *pt2); /*函数声明:字符型数据交换*/
void FloatSwap(float *pt1,float *pt2); /*函数声明:实型数据交换*/
STU *AppendNode(STU *head,const int m); /*函数声明:创建新的节点*/
STU *DeleteNode(STU *head,int nodeNum); /*函数声明:找到要删除的节点并删除*/
STU *ModifyNode(STU *head,int nodeNum,const int m); /*函数声明:找到要修改的数据对应的节点*/
STU *SearchNode(STU*head,int nodeNum); /*函数声明:找到某个节点*/
STU *AppendScore(STU *head,const int m); /*函数声明:输入学生的成绩*/
void TotalScore(STU *head,const int m); /*函数声明:计算学生的平均成绩*/
void PrintScore(STU *head,const int m); /*函数声明:输出学生成绩*/
STU *DeleteScore(STU*head,const int m); /*函数声明:删除学生成绩*/
void ModifyScore(STU*head,const int m); /*函数声明:修改学生成绩*/
void SortScore(STU*head,const int m,int (*compare)(int a,int b)); /*函数声明:对学生成绩进行排序*/
void SearchScore(STU *head,const int m); /*函数声明:查找学生成绩*/
void DeleteMemory(STU *head); /*函数声明:释放内存*/
void caculator(void); /*函数说明:一款计算器*/
int main()
{
int ch; /*用户选择的数字*/
int m; /*科目的数量*/
STU *head=NULL; /*定义一个头指针并置空*/
printf("以下为学生成绩管理程序的示例。我们将会为您展示菜单供您选择\n\n");
printf("please input course number(m<20):\t");
/*提示输入科目数量*/
scanf("%d",&m);
/*程序开始进行*/
while (1)
{
printf("请您在菜单中选择选项");
ch=Menu();
/*调用函数显示菜单并返回用户的选择值*/
switch(ch)
{
case 1:head=AppendScore(head,m); /*调用成绩输入函数*/
TotalScore(head,m); /*调用函数计算学生成绩的平均值*/
break;
case 2:PrintScore(head,m); /*调用成绩显示函数*/
break;
case 3:head=DeleteScore(head,m); /*调用成绩删除函数*/
printf("\nAfter deleted");
PrintScore(head,m); /*成绩删除后显示结果*/
break;
case 4:ModifyScore(head,m); /*调用成绩修改函数*/
TotalScore(head,m); /*修改完后重新计算成绩平均值*/
printf("\nafter modified\n");
PrintScore(head,m); /*输出修改后结果*/
break;
case 5:SearchScore(head,m); /*调用修改成绩的函数*/
break;
case 6:SortScore(head,m,Descending); /*调用排序函数,使成绩降序排列*/
printf("\nsorted in descending order by sum\n");
PrintScore(head,m); /*输出排序结果*/
break;
case 7:SortScore(head,m,Ascending); /*调用排序函数,使成绩升序排列*/
printf("\nsorted in ascending order by sum\n");
PrintScore(head,m); /*输出排序结果*/
break;
case 8:printf("欢迎使用简易计算器\n");
caculator(); /*调用计算器*/
printf("计算器使用结束,谢谢使用\n\n");
break;
case 0:exit(0); /*程序结束*/
DeleteMemory(head); /*释放所有已经分配的内存*/
printf("end of the program"); /*提示程序结束*/
break;
default:printf("Input error!"); /*当用户输入数字不合规格时,提示输入错误*/
break;
}
}
system("PAUSE");
return 0;
}
/*
下面自定义一个函数:
函数功能:显示菜单
函数参数:无
函数返回值:用户输入的参数
*/
int Menu(void)
{
int ch; /*定义一个变量,使用户输入的参数存于其中*/
printf("\nmanagement for students's scores\n"); /*提示这是学生成绩管理软件*/
/*输出所有可能选择项目*/
printf("1.append record\n");
printf("2.list record\n");
printf("3.delete record\n");
printf("4.modify record\n");
printf("5.search record\n");
printf("6.sort score in descending order by sum\n");
printf("7.sort score in aescending order by sum\n");
printf("0.exit \n");
printf("8.如您在看成绩时需要计算,可选择此项为您提供一个简易计算器\n");
printf("please input your choice:"); /*提示让用户选择*/
scanf(" %d",&ch); /*%d签加一个空格,使存于缓存区的回车读入*/
return ch; /*返回用户选择的值*/
}
/*
下面定义一个函数:
函数功能:向链表中添加学生的学号,姓名和成绩的信息。
函数参数:1.结构体指针head,指向存储学生信息的结构体数组的首地址
2.整型变量m,表示考试科目数量
返回参数:无
*/
STU *AppendScore(STU *head,const int m)
{
int i=0;
char c; /*定义一个字符变量,存储后面用户的选择项目*/
do /*开始循环添加数据,直到用户输入全部数据并自主叫停*/
{
head=AppendNode(head,m);
/*申请新节点并添加在链表末尾*/
printf("Do you want to append a new node(N/Y)?");
/*询问用户是否已经完成输入,并让他选择*/
scanf(" %c",&c);
/*%c前加一个空格,使缓冲区的回车被读入*/
i++;
} while(c=='Y'||c=='y');
printf("%d new nodes have been apended!\n",i); /*提示输入已经完成*/
return head;
}
/*
下面自定义一个函数:
函数功能: 删除一个指定学号的学生记录
函数参数:1.结构体指针head,指向存储学生信息的链表首地址
2.整型变量m,代表考试科目
函数的返回值:删除学生记录后的链表的头指针
*/
STU *DeleteScore(STU *head,const int m)
{
int i=0;
int nodeNum; /*定义一个nodeNum变量,用于存储需要修改的学号*/
char c; /*定义一个字符变量,存储后面用户的选择项目*/
do
{
printf("please input the number you want to delete");
/*提示输入想要删除的学生的学号*/
scanf(" %d",&nodeNum);/*留空,读入缓冲区中的回车*/
head=DeleteNode(head,nodeNum); /*删除学号为nodeNum的学生信息*/
/*调用printscore函数*/
PrintScore(head,m); /*输出删除后的学生信息*/
printf("do you want to delete a node?(N/Y)"); /*提示让选择是否继续删除节点*/
scanf(" %c",&c);
/*%c前加入一空格,使缓冲区的回车被读入*/
i++;
} while (c=='Y'||c=='y');/*判断是否终止循环*/
printf("%d nodes have been deleted\n ",i); /*提示要求节点已经被删除*/
return head; /*返回新链表的头指针*/
}
/*
以下自定义一个函数:
函数功能:修改一个指定学号的学生的记录
函数参数:1.结构体指针head,指向寻出学生信息的链表的首地址
2.整型变量m,表示考试科目
函数返回值:修改学生记录后的链表的头指针
*/
void ModifyScore(STU *head,const int m)
{
int i=0;
int nodeNum;
char c; /*定义字符变量用于存储用户的对循环的要求*/
/*循环修改学生成绩直到用户提示结束*/
do
{
printf("please input the number you w
C语言大作业 菜单驱动的学生成绩管理系统
4星 · 超过85%的资源 需积分: 50 11 浏览量
2013-04-12
19:45:44
上传
评论 17
收藏 54KB RAR 举报
baobao921101
- 粉丝: 3
- 资源: 5
最新资源
- HandTrackingModule.py
- Python基于卷积神经网络的鸟类识别项目源代码,ipynb文件
- 批量将py编译为pyd文件.atbx
- Python项目-学生管理系统
- 图像处理基于matlab图像RGB三色合成分离【含Matlab源码第1发】
- verilog HDL硬件语法设计包括算术运算三人表决器Verilog的阻塞和非阻塞赋值源码例程quartus13.1工程合集
- 【文章话题分类论文】OpenAlex Topic Classification Whitepaper
- linux学习常用命令
- 功率拓扑快速参考指南-ti,TI官方出品
- 开源2023电赛国赛运动目标控制(E题)视觉部分
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈