博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
菜鸟修炼C语言小设计之——学生成绩管理系统
阅读量:7048 次
发布时间:2019-06-28

本文共 10272 字,大约阅读时间需要 34 分钟。

一、本设计涉及的重要C语言知识有:

    1.单链表的各种操作

2.文件流的操作

3.单链表的排序

二、本设计主要以下几个模块组成

1.学生成绩添加模块

2.学生成绩删除模块

3.学生成绩修改模块

4.学生成绩检索模块

5.学生成绩显示模块(包括成绩排序)

6.学生成绩保存模块

效果图:

本设计大概5、6百行代码左右,通过这个设计,本人感觉C语言熟练了很多,

希望能对像我一样的C语言菜鸟同学会有点帮助,废话少说,咱们上代码!

三、程序代码

1.main.c
这个文件内主要完成主菜单的跳转和接受用户信息完成到各个模块的跳转。
#include 
#include "students.h"int select_menu(void);void hand_menu(int cmd, int *flag);void quit(); int main(int argc, char *argv[]){ int cmd; int flag = 0; while(1){ cmd = select_menu(); hand_menu(cmd, &flag); }}int select_menu(void){ int select = 0; printf("**************************************************************\n\n"); printf(" 学生管理系统 \n"); printf(" 1:添加学生信息 2:删除学生信息\n"); printf(" 3:修改学生信息 4:查询学生信息\n"); printf(" 5:查看学生信息 6:保存\n"); printf(" 0:退出\n\n"); printf("**************************************************************\n"); printf("请选择:"); select=getch(); while(select<'0'||select>'6'){ printf("\n输入错误,请重新选择:"); select=getch(); } return select;}void hand_menu(int cmd, int *flag){ static STU *stu_head = NULL; if(*flag == 0){ stu_head = init_student(stu_head); *flag = 1; } switch(cmd){ case '0': save_student(stu_head); quit(); break; case '1': system("cls"); stu_head = add_student(stu_head); system("cls"); break; case '2': system("cls"); stu_head = del_student(stu_head); system("cls"); break; case '3': system("cls"); modify_student(stu_head); system("cls"); break; case '4': system("cls"); search_student(stu_head); system("cls"); break; case '5': system("cls"); stu_head = display_student(stu_head); system("cls"); break; case '6': system("cls"); save_student(stu_head); system("cls"); break; default: break; }}void quit(){ printf("\n感谢使用学生管理系统!\n"); exit(0);}

2.students.h

这个文件主要包含students.c文件函数操作所需的定义。
#ifndef _STUDENTS_H_#define _STUDENTS_H_typedef struct st{	unsigned long ID;	char name[10]; 	float chinese;	float math; 	float english; 	double all_sub; 	float average;	struct st* next;}STU;#define ASK_STU(p) do{p=(STU *)malloc(sizeof(STU));\				if(p==NULL){printf("malloc memory failed!\n");exit(1);}\				}while(0)				STU *search_by_nb(STU *stu_head, unsigned long nb);STU *search_by_name(STU *stu_head, char name[]);STU *select_sort(STU *g, char flag);STU *add_student(STU *stu_head);STU *del_all(STU *stu_head);STU *del_one(STU *stu_head, int flag);STU *del_student(STU *stu_head);void modify_student(STU *stu_head);STU *display_student(STU *stu_head);STU *search_by_name(STU *stu_head, char name[]);STU *search_by_nb(STU *stu_head, unsigned long nb);#endif

3.store.h

#ifndef _STORE_H_#define _STORE_H_void save_student(STU *stu_head);STU *init_student(STU *stu_head);#endif
4.students.c
这个文件是本设计的核心部分,包括各个模块的实现函数,
包括添加,删除,修改,查找,显示学生信息这几个模块的实现。
#include 
#include "students.h" STU *select_sort(STU *g, char flag) { STU *p,*q,*t,*s,*h; h=(STU *)malloc(sizeof(STU)); h->next=g; p=h; while(p->next->next!=NULL) { for(s=p,q=p->next;q->next!=NULL;q=q->next) { if(flag == '1') if(q->next->ID
next->ID) s=q; if(flag == '2') if(q->next->chinese
next->chinese) s=q; if(flag == '3') if(q->next->math
next->math) s=q; if(flag == '4') if(q->next->english
next->english) s=q; if(flag == '5') if(q->next->average
next->average) s=q; } if(s!=q) { t=s->next; s->next=t->next; t->next=p->next; p->next=t; } p=p->next; } g=h->next; free(h); return g;} STU *add_student(STU *stu_head){ STU *stu; STU *head = stu_head; STU *node = stu_head; STU *node_fd; int sel; ASK_STU(stu); stu->next = NULL; printf("请输入学生学号:"); scanf("%d", &stu->ID); while(search_by_nb(node, stu->ID)){ printf("已经存在该学号!请重新输入一个学号:"); scanf("%d", &stu->ID); } printf("请输入学生名字:"); scanf("%s", stu->name); printf("请输入该学生英语成绩:"); scanf("%f", &stu->english); while(stu->english < 0.0 || stu->english > 100.0){ printf("输入错误,请重新输入英语成绩:"); scanf("%f", &stu->english); } printf("请输入该学生数学成绩:"); scanf("%f", &stu->math); while(stu->math < 0.0 || stu->math > 100.0){ printf("输入错误,请重新输入数学成绩:"); scanf("%f", &stu->math); } printf("请输入该学生语文成绩:"); scanf("%f", &stu->chinese); while(stu->chinese < 0.0 || stu->chinese > 100.0){ printf("输入错误,请重新输入数学成绩:"); scanf("%f", &stu->chinese); } stu->all_sub = stu->chinese+stu->math+stu->english; stu->average = stu->all_sub/3; if(!head){ head = stu; return head; } while(node->next) node = node->next; node->next = stu; head = select_sort(head, '1'); return head; }STU *del_all(STU *stu_head){ if(!stu_head) return NULL; del_all(stu_head->next); free(stu_head); stu_head = NULL; return NULL;}STU *del_one(STU *stu_head, int flag){ STU *node = stu_head; STU *head = stu_head; STU *pre; char name[10]; unsigned long ID; if(head = NULL){ printf("没有任何学生信息!\n"); return head; } if(flag == '2'){ printf("请输入要删除的学生姓名:"); scanf("%s", name); if(!strcmp(node->name, name)){ free(node); head = node->next; printf("成功删除!按任意键返回。\n"); getch(); return head; } while(node){ if(!strcmp(node->name, name)){ pre->next = node->next; free(node); printf("成功删除!按任意键返回。\n"); getch(); return head; } pre = node; node = node->next; } printf("没有找到该学生信息!\n"); return head; } if(flag == '3'){ printf("请输入要删除的学生学号:"); scanf("%d", &ID); if(node->ID == ID){ free(node); head = node->next; printf("成功删除!按任意键返回。\n"); getch(); return head; } while(node){ if(!strcmp(node->name, name)){ pre->next = node->next; free(node); printf("成功删除!按任意键返回。\n"); getch(); return head; } pre = node; node = node->next; } printf("没有找到该学生信息!按任意键返回\n"); getch(); return head; } }STU *del_student(STU *stu_head){ int sel; STU *head = stu_head; printf("1:删除全部 2:按名字删除 3:按学号删除 0:返回\n"); printf("请选择:\n"); sel = getch(); while(sel<'0'||sel>'3'){ printf("输入错误,请重新选择:\n"); sel = getch(); } if(sel == '0') return head; if(!head){ printf("没有任何学生信息!按任意键返回.\n"); getch(); return head; } if(sel == '1'){ head = del_all(head); printf("删除成功!按任意键返回."); getch(); return head; } if(sel == '2'||sel =='3'){ head = del_one(head, sel); return head; } }void modify_student(STU *stu_head){ STU *head = stu_head; STU *node_fd; int sel; char name[10]; unsigned long nb; recyc3: printf("1:修改指定学号的学生信息 2:修改指定姓名的学生信息 0:返回\n请选择:\n"); sel = getch(); while(sel < '0'|| sel>'2'){ printf("输入错误!请重新选择:\n"); sel = getch(); } if(sel == '1'||sel=='2'){ if(sel == '1'){ printf("请输入要修改的学生学号:"); scanf("%d", &nb); node_fd = search_by_nb(head, nb); } if(sel == '2'){ printf("请输入要修改的学生姓名:"); scanf("%s", name); node_fd = search_by_name(head, name); } if(node_fd){ printf("请输入该学生英语成绩:"); scanf("%f", &node_fd->english); while(node_fd->english < 0.0 || node_fd->english > 100.0){ printf("输入错误,请重新输入英语成绩:"); scanf("%f", &node_fd->english); } printf("请输入该学生数学成绩:"); scanf("%f", &node_fd->math); while(node_fd->math < 0.0 || node_fd->math > 100.0){ printf("输入错误,请重新输入数学成绩:"); scanf("%f", &node_fd->math); } printf("请输入该学生语文成绩:"); scanf("%f", &node_fd->chinese); while(node_fd->chinese < 0.0 || node_fd->chinese > 100.0){ printf("输入错误,请重新输入数学成绩:"); scanf("%f", &node_fd->chinese); } node_fd->all_sub = node_fd->chinese+node_fd->math+node_fd->english; node_fd->average = node_fd->all_sub/3; printf("修改成功!\n"); goto recyc3; } else{ printf("没有该学生信息!\n"); goto recyc3; } }}STU *display_student(STU *stu_head){ int sel; STU *head = stu_head; STU *node = stu_head; if(node == NULL){ printf("没有任何学生信息,按任意键返回"); getch(); return head; }recyc: printf("学号 姓名 语文 数学 英文 平均分 总分\n"); while(node){ printf("%d %s %0.1f %0.1f %0.1f %0.1f %0.1f\n", node->ID, node->name,\ node->chinese, node->math, node->english, node->average, node->all_sub); node=node->next; } printf("排序方式: 1:按学号排序 2:按语文成绩排序 3:按数学成绩排序\n 4:按英文成绩排序 5:按总分排序 0:返回\n请选择:"); sel = getch(); while(sel < '0'|| sel>'5'){ printf("输入错误!请重新选择:"); sel = getch(); } if(sel == '0') return head; head = node = select_sort(head, sel); system("cls"); goto recyc; return head;}STU *search_by_name(STU *stu_head, char name[]){ STU *node = stu_head; if(!node) return NULL; while(node){ if(!strcmp(node->name, name)) return node; node=node->next; } return NULL;}STU *search_by_nb(STU *stu_head, unsigned long nb){ STU *node = stu_head; if(!node) return NULL; while(node){ if(node->ID == nb) return node; node=node->next; } return NULL;}void search_student(STU *stu_head){ STU *head = stu_head; STU *node; int sel = 0; char name[10]; unsigned long ID; recyc2: printf("1:按姓名查找 2:按学号查找 0:返回\n请选择:"); sel = getch(); while(sel<'0' || sel>'2'){ printf("\n输入错误,请重新选择:"); sel = getch(); } if(sel == '0') return; if(sel == '1'||sel=='2'){ if(sel == '1'){ printf("\n请输入你要查找的学生姓名:"); scanf("%s", name); node = search_by_name(head, name); } else{ printf("\n请输入你要查找的学生学号:"); scanf("%d", &ID); node = search_by_nb(head, ID); } if(node){ printf("学号 姓名 语文 数学 英文 平均分 总分\n"); printf("%d %s %0.1f %0.1f %0.1f %0.1f %0.1f\n", node->ID, node->name,\ node->chinese, node->math, node->english, node->average, node->all_sub); goto recyc2; } else{ printf("没有找到该学生信息!\n"); goto recyc2; } }}
5.store.c
这个文件包含程序启动时读取文件内的学生成绩信息,
和需要保存时或者退出时向文件保存学生成绩信息的操作。
#include 
#include
#include "students.h"#define FILE_NAME "students"void save_student(STU *stu_head){ STU *node = stu_head; FILE *fp; fp = fopen(FILE_NAME, "w+"); while(node){ fprintf(fp, "%ld %s %0.1f %0.1f %0.1f %0.1lf %0.1f\n", node->ID, node->name,\ node->chinese, node->math, node->english, node->all_sub, node->average); node=node->next; } fclose(fp); printf("保存成功!按任意键返回。\n"); getch();}STU *init_student(STU *stu_head){ STU *node = stu_head; STU *head = stu_head; STU *new_node; int i; FILE *fp; char name[10]; int num; ASK_STU(new_node); new_node->next=NULL; fp = fopen(FILE_NAME, "r+"); rewind(fp); while((i = fscanf(fp, "%ld%s%f%f%f%lf%f\n", &new_node->ID, new_node->name,\ &new_node->chinese, &new_node->math, &new_node->english, &new_node->all_sub, &new_node->average)) == 7){ if(!head) head = node = new_node; else{ while(node->next) node = node->next; node->next = new_node; } ASK_STU(new_node); new_node->next = NULL; } fclose(fp); return head;}

四、总结

菜鸟修炼C语言基础部分到此告一段落了,通过这段时间的修炼对C语言有了更加深入的理解,
能够熟练运用指针、数组、结构体和链表进行代码的编写了。
如果以后有时间,可能会修炼一下C算法,下一段时间我会修炼C++。
希望能对像我一样的C语言菜鸟能提供到帮助,大家共同努力,共同奋斗!

转载于:https://www.cnblogs.com/key000/archive/2011/11/12/4084760.html

你可能感兴趣的文章
atitit.Sealink2000国际海运信息管理系统
查看>>
android面试总结01 activity生命周期
查看>>
Java 实现策略(Strategy)模式
查看>>
Python文本爬虫实战
查看>>
leetcode:Gray Code
查看>>
IDEA+PHP+XDebug调试配置
查看>>
javascript学习笔记(一)-廖雪峰教程
查看>>
iOS~判断应用是否有定位权限
查看>>
做接口测试需要哪些技能
查看>>
Nginx(十)-- 进程模型及工作原理
查看>>
辛星浅析一次ajax的实现过程
查看>>
静态网页怎样实现动态交互?-JavaScript
查看>>
JAVA IO操作:数据操作流:DataOutputStream和DataInputStream
查看>>
[Angular HTML] Overwrite input value, String.fromCharCode & input.selectionStart
查看>>
海思hi3716c机顶盒接usb摄像头和usb无线耳机时,无线耳机有时没有声音
查看>>
word2vec原理(二) 基于Hierarchical Softmax的模型
查看>>
C++中的RAII机制
查看>>
monaco editor + vue的配置
查看>>
Jenkins
查看>>
P1151 子数整数
查看>>