#include <stdio.h>/*标准输入/输出函数库*/
#include <stdlib.h>/*标准函数库*/
#include <string.h>/* 字符串函数库*/
#define TITLE "学生成绩管理系统" /*标题文字*/
#define MAX 10
#define MENU_MAIN_COUNT 8 /*主菜单的选项个数 */
#define MENU_SEARCH_COUNT 4 /*查询子菜单的选项个数 */
#define MENU_CALC_COUNT 3 /*计算子菜单的选项个数 */
//数据结构定义
typedef struct student{
char name[MAX]; /*姓名 */
char num[MAX]; /*学号 */
char sex[MAX]; /*性别*/
int chinese; /*语文成绩*/
int mathematic; /*数学成绩*/
int english; /*英语成绩*/
int computer; /*计算机成绩*/
struct student *next; /*指向下一个学生的指针*/
}stu;
stu*head = NULL;/*student 结构体链表的头节点*/
//函数及变量声明
//1.主要处理函数声明
void input_record(); /*输入学生成绩的处理*/
void show_record(); /*显示学生成绩的处理*/
void search_record(); /*查询学生成绩的处理*/
void update_record(); /*更新学生成绩*/
void delete_record(); /*删除学生成绩*/
void calculate(); /*计算学生成绩*/
void save_to_file(); /*保存到文件的处理*/
void exit_system(); /*退出系统*/
//2.查询子函数声明
void search_by_id(); /*通过学号检索学生的处理*/
void search_by_name(); /*通过姓名检索学生的处理*/
void search_by_sex(); /*通过性别检索学生的处理*/
void search_exit(); /*退出子菜单,返回上级菜单*/
//3.计算子函数声明
void calc_total(); /*计算总成绩的处理*/
void calc_average(); /* 计算平均成绩的处理*/
void calc_exit(); /*退出子菜单,返回上级菜单 */
//4.辅助函数声明
void create_stu_by_input(stu* pNewStu); /*通过输入为student赋值*/
stu* get_last_student(stu* p); /* 找到最后一个学生的记录*/
void clear_record(stu* p); /* 清空所有记录*/
//5.显示控制函数声明
void print_menu_main(); /*显示主菜单*/
void print_menu_title(char* title); /*显示菜单的标题*/
void print_table_head(); /*显示学生记录的表格的头部*/
void print_table_row(stu* p); /*显示一条学生记录*/
void print_table_buttom(); /*显示学生记录的表格的底部*/
void print_table_head_total(); /*显示总分表格的头部*/
void print_table_row_total(stu* p); /*显示一个学生的总分*/
void print_table_buttom_total(); /*显示总分表格的底部*/
void print_table_head_avg(); /*显示平均分表格的头部*/
void print_table_row_avg(stu* p); /*显示一个学生的平均分*/
void print_table_buttom_avg(); /*显示平均分表格的底部*/
//6.全局变量声明
//(1)字符串组menu_main中存储的是主菜单要显示的字符.
char menu_main[] =
"|\n"
"| 1 输入学生成绩\n"
"| 2 显示学生成绩\n"
"| 3 查询学生成绩\n"
"| 4 更新学生成绩\n"
"| 5 删除学生成绩\n"
"| 6 计算学生成绩\n"
"| 7 保存文件\n"
"| 8 退出系统\n"
"|\n";
//(2)函数指针数组menu_main_func存储的是主菜单项中8个功能函数的地址 分别对应1~8菜单项.
void (* menu_main_func[]) () =
{
input_record,
show_record,
search_record,
update_record,
delete_record,
calculate,
save_to_file,
exit_system
};
char menu_search[] =
"|\n"
"| 1 按照学号查询\n"
"| 2 按照姓名查询\n"
"| 3 按照性别查询\n"
"| 4 返回上级菜单\n"
"|\n";
void (* menu_search_func[]) () =
{
search_by_id,
search_by_name,
search_by_sex,
search_exit
};
//(5)字符数组menu_main中存储的是子菜单要显示的字符.
char menu_calc[]=
"|\n"
"| 1 计算总成绩\n"
"| 2 计算平均分\n"
"| 3 返回上级菜单\n"
"|\n";
void (* menu_calc_func[]) () =
{
calc_total,
calc_average,
calc_exit
};
//main函数
//主函数调用函数print_menu_main(),显示主菜单,等待用户输入.
void main()
{
print_menu_main(); /*显示主菜单等待用户输入*/
}
void input_record()
{
char continue_input = 'N';
stu* pLastStu = NULL;
stu* pNewStu =(stu *)malloc(sizeof(stu)); /*创建一个stu*/
pNewStu->next = NULL;
create_stu_by_input(pNewStu); /*让用户为创建的stu赋值*/
if (head == NULL) /*一个都没有*/
{
head = pNewStu;
}
else
{
pLastStu = get_last_student(head);/*找到最后一个*/
pLastStu->next = pNewStu;
}
printf("继续输入学生成绩?(Y继续,N返回菜单)");
getchar();
continue_input = getchar();
if (continue_input=='n' || continue_input=='N')
{
print_menu_main();/*不继续输入,将显示主菜单*/
}
else
{
input_record();/*再次调用这个函数输入新的学生成绩*/
}
}
void show_record()
{
stu* p = head;
print_table_head();/*显示学生成绩的表格的表格头*/
/*逐条显示学生记录*/
while(p != NULL)
{
print_table_row(p);/*显示一个学生信息*/
p = p->next;
}
print_table_buttom();/*显示表格尾*/
printf("按任意键返回菜单..\n");
getchar();
getchar();
print_menu_main();
}
//3.查询学生成绩函数
void search_record()
{
int selected = 0;
system("cls ");
print_menu_title("查询学生成绩");
printf(menu_search);
printf("===================================================\n");
while (!(selected >= 1 && selected <= MENU_SEARCH_COUNT))
{
printf(">请选择:");
scanf("%d",&selected);
if (selected >= 1 && selected <= MENU_SEARCH_COUNT)
{
break;
}
printf("\n>输入错误!(请选择1 - %d)\n",MENU_SEARCH_COUNT);
}
menu_search_func[selected-1] ();/*调用用户选择项所对应的函数*/
}
void search_by_id()
{
char id[MAX];
char continue_input = 'N';
stu* p = head;
int isfound = 0;
printf(">请输入学生学号:");
scanf("%s", id);
printf("\n>查找[%s]...\n",id);
print_table_head();
while (p !=NULL)
{
if(strcmp(p->num,id) == 0)
{
print_table_row(p);
isfound =1;
break;
}
p =p->next;
}
if (!isfound)
printf("\n没有找到结果!\n");
print_table_buttom();
printf("继续查找?(Y继续,N返回)");
getchar();
continue_input = getchar();
if(continue_input == 'Y' || continue_input =='y')
{
search_by_id(); /* 继续调用这个函数来查找*/
}
else
{
search_record(); /*重新显示查询子菜单,即返回菜单*/
}
}
void search_by_name()
{
char name[MAX];
char continue_input = 'N';
stu* p = head;
int isfound = 0;
printf(">请输入学生姓名:");
scanf("%s",name);
printf("\n>查找[%s]...\n",name);
print_table_head();
while (p != NULL)
{
if(strcmp(p->name,name) == 0)
{
print_table_row(p);
isfound = 1;
}
p = p->next;
}
if (!isfound)
printf("\n没有找到结果!\n");
print_table_buttom();
printf("继续查找?(Y继续,N返回)");
getchar();
continue_input = getchar();
if(continue_input == 'Y' || continue_input =='y')
{
search_by_name();
}
else
{
search_record();
}
}
void search_by_sex()
{
char sex[MAX];
char continue_input = 'N';
stu* p = head;
int isfound = 0;
printf(">请输入学生性别:");
scanf("%s",sex);
printf("\n>查找[%s]...\n",sex);
print_table_head();
while (p != NULL)
{
if(strcmp(p->sex,sex) == 0)
{
print_table_row(p);
isfound = 1;
}
p = p->next;
}
if (!isfound)
printf("\n没有找到结果!\n");
print_table_buttom();
printf("继续查找?(Y继续,N返回)");
getchar();
continue_input = getchar();
if(continue_input == 'Y' || continue_input =='y')
{
search_by_sex();
}
else
{
search_record();
}
}
void search_exit()
{
print_menu_main();
}
void update_record()
{
stu* p = head;
char id[MAX];
char continue_input = 'N';
printf(">请输入要更新的学生学号:");
scanf("%s",id);
while (p != NULL)
{
if(strcmp(p->num,id) == 0)
{
break;
}
p = p->next;
}
if (p == NULL)
{
printf("没有学号是[%s]的学生.",id);
}
else
{
create_stu_by_input(p);
}
printf("继续更新?(Y继续,N返回菜单)");
getchar();
continue_input = getchar();
if(continue_input == 'n' || continue_input =='N')
{
print_menu_main();
}
else
{
update_record();
}
}
void delete_record()
{
stu* p = head;
stu* pPre = NULL;
char id[MAX];
char continue_input = 'N';
printf(">请输入要删除的学生学号:");
scanf("%s",id);
while (p != NULL)
{
if(strcmp(p->num,id) == 0)
{
break;
}
p = p->next;
}
if (p == NULL)
{
printf("没有学号是[%s]的学生.",id);
}
else
{
printf("确定要删除学号为[%s]姓名为[%s]的学生吗?(Y 确定,N 取消)",p->num,p->name);
getchar();
continue_input = getchar();
if(continue_input == 'Y' || continue_input =='y')
{
pPre = head;
if(pPre == p)
{
head = p->next;
free(p);
}
else
{
while (pPre !=NULL)
{
if(pPre->next == p)
{
pPre->next = p->next;
free(p);
break;
}
pPre = pPre->next;
}
}
printf(">删除成功!\n");
}
}
printf("继续删除吗?(Y继续,N返回菜单)");
getchar();
continue_input = getchar();
if(continue_input == 'n' || continue_input =='N')
{
print_menu_main();
}
else
{
delete_record();
}
}
void calculate()
{
int selected = 0;
system("cls");
print_menu_title("计算学生成绩");
printf(menu_calc);
printf("===================================================\n");
while (!(selected >= 1 && selected <= MENU_CALC_COUNT))
{
printf(">请选择:");
scanf("%d",&selected);
if (selected >= 1 && selected <= MENU_CALC_COUNT)
{
break;
}
printf("\n>输入错误!(请选择1 - %d)\n",MENU_CALC_COUNT);
}
menu_calc_func[selected-1] ();/*调用用户选择项所对应的函数*/
}
void calc_total()
{
stu* p = head;
print_table_head_total();
while (p != NULL)
{
print_table_row_total(p);
p = p->next;
}
print_table_buttom_total();
printf("按任意键返回菜单..\n");
getchar();
getchar();
calculate();
}
void calc_average()
{
stu* p = head;
print_table_head_avg();
while (p != NULL)
{
print_table_row_avg(p);
p = p->next;
}
print_table_buttom_avg();
printf("按任意键返回菜单..\n");
getchar();
getchar();
calculate();
}
void calc_exit()
{
print_menu_main();
}
void save_to_file()
{
FILE *fp;
char file[100];
stu* p = head;
printf("请输入文件名:");
scanf("%s",file);
fp=fopen(file,"w");
while(p != NULL)
{
fprintf(fp,"%s,%s,%s,%d,%d,%d,%d\n",p->num,p->name,p->sex,p->chinese,p->mathematic,p->english,p->computer);
p=p->next;
}
fclose(fp);
printf("保存成功!\n按任意键返回菜单..\n");
getchar();
getchar();
print_menu_main();
}
void exit_system()
{
clear_record(head);/*释放整个链表*/
exit(0);
}
void print_menu_main()
{
int selected = 0; /*用户选择的菜单项*/
system("cls"); /*清屏*/
print_menu_title(TITLE); /*显示标题*/
printf(menu_main); /*显示菜单字符*/
printf("===================================================\n");/* 如果用户没有选择或者选择错误,循环等待*/
while (!(selected >= 1 && selected <= MENU_MAIN_COUNT))
{
printf(">请选择:");
scanf("%d",&selected);
if (selected >= 1 && selected <= MENU_MAIN_COUNT)
{
break;
}
printf("\n>输入错误!(注请选择1 - %d)\n",MENU_MAIN_COUNT);
/*调用用户选择菜单项对应的函数指针数组中的函数*/
menu_calc_func[selected-1] ();
}
}
void create_stu_by_input(stu* pNewStu)
{
printf(">请输入学生信息(注:最大长度是10个字符):\n");
printf("学号:");
scanf("%s",pNewStu->num);
printf("姓名:");
scanf("%s",pNewStu->name);
printf("性别:");
scanf("%s",pNewStu->sex);
printf(">请输入%s的成绩(注:成绩范围0-100):\n",pNewStu->name);
printf("语文:");
scanf("%d",&(pNewStu->chinese));
printf("数学:");
scanf("%d",&(pNewStu->mathematic));
printf("英语:");
scanf("%d",&(pNewStu->english));
printf("计算机:");
scanf("%d",&(pNewStu->computer));
fflush(stdin)
}
stu* get_last_student(stu* p)
{
if (p->next == NULL)
{
return p;
}
else
{
return get_last_student(p->next);
}
}
void clear_record(stu* p)
{
if (p == NULL)
{
return;
}
/* 如果student结构体的next指针是空则表示没有下一条数据,删除该节点*/
if (p->next == NULL)
{
free(p);
}
/* 如果student结构体的next指针不为空,*/
else
{
clear_record(p->next);
/* 再次调用本函数,student结构体的next指 向的节点作为参数*/
free(p); /*删除当前节点*/
p = NULL; /*将指针置空*/
}
}
void print_menu_title(char* title)
{
printf("===================================================\n");
printf("| %s\n",title);
printf("---------------------------------------------------\n");
}
void print_table_head()
{
printf("+----------+----------+----------+----+----+----+------+\n");
printf("| 学号 | 姓名 | 性别 |语文|数学|英语|计算机|\n");
printf("+----------+----------+----------+----+----+----+------+\n");
}
void print_table_head_total()
{
printf("+----------+----------+----------+----+----+----+------+------+\n");
printf("| 学号 | 姓名 | 性别 |语文|数学|英语|计算机|总成绩|\n");
printf("+----------+----------+----------+----+----+----+------+------+\n");
}
void print_table_head_avg()
{
printf("+----------+----------+----------+----+----+----+------+------+------+\n");
printf("| 学号 | 姓名 | 性别 |语文|数学|英语|计算机|平均成绩|\n");
printf("+----------+----------+----------+----+----+----+------+------+------+\n");
}
void print_table_row(stu* p)
{
printf("|%10s|%10s|%10s|%4d|%4d|%4d|%6d|\n",
p->num,p->name,p->sex,p->chinese,p->mathematic,p->english,p->computer);
}
void print_table_row_total(stu* p)
{
int t = p->chinese+p->mathematic+p->english+p->computer;
printf("|%10s|%10s|%10s|%4d|%4d|%4d|%6d|%6d|\n",
p->num,p->name,p->sex,p->chinese,p->mathematic,p->english,p->computer,t);
}
void print_table_row_avg(stu* p)
{
float a = ((float)(p->chinese+p->mathematic+p->english+p->computer)) /(float)4.0;
printf("|%10s|%10s|%10s|%4d|%4d|%4d|%6d|%8.1f|\n",
p->num,p->name,p->sex,p->chinese,p->mathematic,p->english,p->computer,a);
}
void print_table_buttom()
{
printf("+----------+----------+----------+----+----+----+------+\n");
}
void print_table_buttom_total()
{
printf("+----------+----------+----------+----+----+----+------+------+\n");
}
void print_table_buttom_avg()
{
printf("+----------+----------+----------+----+----+----+------+------+ \n");
}
温馨提示:答案为网友推荐,仅供参考