学生成绩管理C实现

来源:互联网 发布:程序员壁纸高清 编辑:程序博客网 时间:2024/04/18 20:53

对学生的基本信息及成绩的管理,有增删查找修改保存的功能。

具体的通过代码和图形进行实现。

系统总体框图


具体代码如下:

#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;/* 声明主要处理函数 */void input_record();/* 输入学生成绩的处理 */void show_record();/* 显示学生成绩的处理 */void search_record();   /* 查询学生的成绩处理 */void update_record();/* 更新学生成绩 */void delete_record();/* 删除学生成绩 */void calculate();/* 计算学生成绩 */void save_to_file();/* 保存到文件的处理 */void exit_system();     /* 退出系统 *//* 声明查询子函数 */ void search_by_id();   /* 通过学号检索学生的处理 */void search_by_name();/* 通过姓名检索学生的处理 */void search_by_sex();/* 通过性别检索学生的处理 */void search_exit();/* 退出子菜单,返回上级菜单 *//* 计算子函数声明 */void calc_total();/* 计算总成绩的处理 */void calc_average();    /* 计算平均成绩的处理 */void calc_exit();/* 退出子菜单,返回上级菜单 *//* 辅助函数申明 */void create_stu_by_input(stu* pNewStu);/* 通过输入为student赋值 */stu* get_last_student(stu *p);/* 找到最后一个学生的记录 */void clear_record();/* 清空所有记录 *//* 显示控制函数申明 */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();/* 显示平均分表格的底部 *//* 全局变量声明 *//* 主菜单显示的字符 */char menu_main[]= "|\n""|1 输入学生成绩\n""|2 显示学生成绩\n""|3 查询学生成绩\n""|4 更新学生成绩\n""|5 删除学生成绩\n""|6 计算学生成绩\n""|7 保存文件\n""|8 退出系统\n""|\n";/* 函数指针数组用来存储菜单项中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";/* 函数指针数组存储的是查询子菜单所对应的4个功能函数的地址 */void (*menu_search_func[])()={search_by_id,search_by_name,search_by_sex,search_exit};/* 字符数组中存储的是子菜单要显示的字符 */char menu_calc[]="|\n""|1 计算总成绩\n""|2 计算平均分\n""|3 返回上级菜单\n""|\n";/* 函数指针数组存储的计算子菜单项中的地址 */void (* menu_calc_func[])()={calc_total,calc_average,calc_exit};/* main函数 */void main(){/* 显示主菜单等待用户输入 */print_menu_main();}/* 主处理函数 */void input_record(){char continue_input = 'N';stu *pLastStu = NULL;stu * pNewStu = (stu *)malloc(sizeof(stu));pNewStu->next = NULL;create_stu_by_input(pNewStu);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();}/* 查询学生成绩函数 */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("%a",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_main_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));}/*取得链表最后一个值函数 */stu* get_last_student(stu *p){if (p->next == NULL){return p;} else{return get_last_student(p->next);}}/* 删除student结构链表的函数 */void clear_record(stu* p){if (p == NULL){return;}if (p->next == NULL){free(p);}else{clear_record(p->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");}
实现的效果如图所示:

主菜单


输入 学生信息


显示


查询


删除


计算功能


保存






0 0
原创粉丝点击