c语言大作业课程设计报告-学生管理系统(28页).doc
-c语言大作业课程设计报告-学生管理系统-第 28 页 C语言课程设计报告设计题目:学生管理系统专 业: 班 级: 姓 名: 学 号:提交时间: 完成方式:(单选)自我评分:(单选)独立完成 优秀参考他人工作的基础上完成 良好在他人的帮助下完成 中等完整拷贝他人成果 及格 不及格设计任务:C语言课程设计任务书5题目:学生管理系统设计功能:学生管理系统设计,每个学生是一条记录,包括姓名、学号、性别、出生年月、专业、年级、班级、家庭住址、宿舍号码等。系统要求实现以下功能:1、 输入功能:录入学生信息(包括学生学号、姓名、性别、出生年月、专业等);2、 显示功能:完成学生记录的显示;3、 查找功能:完成按学号或姓名查找学生的相关记录,并显示。分布实施:1、 初步完成总体设计,搭好框架,确定人机对话界面,确定函数个数;2、 建立一个文件,将每位学生的信息写入文件中(人数利用宏定义设定)并显示与屏幕上;3、 完成上述显示,查找(姓名、性别等),修改等功能;4、 进一步要求,修改记录设置密码操作。要求:1、 用C语言实现程序设计;2、 利用结构体数组实现学生信息的数据结构设计;3、 系统各个功能模块要求用函数的形式实现;界面良好(良好的人机交互),程序必须加必要的注释。课程设计实验报告要求:1、预习报告:题目、课程设计任务、数据结构、程序的总体设计(算法)、模块划分;2、实验总报告:流程图、主要源程序代码(需打印)、测试情况及调试中的问题与解决方案、小结等。一总体设计1.程序的总体设计本次课程设计,主要通过main函数调用welcome( ),mainmenu( )和close( )函数实现。在mainmenu( )函数中,又嵌套了五个函数模块,create( )、search( )、change( )、del( )、printall( ),分别实现新建学生信息、查找学生信息、修改学生信息、显示所有信息的功能。在search ( )中,又调用了search_num( )和search_name( )两个函数,分别代表用学号查找和用姓名查找两种查找方式。另外,open( )函数用于获得文件的头指针,delay( )延时函数用于welcome( )中界面的动态显示。2.数据结构本次课程设计中用到的数据结构类型是单链表,链表的结点储存学生的信息,用结构体储存学生信息。typedef struct student/定义结构体变量,用于储存学生的信息char num12;/学号,最多输入12个字符;char name10;/姓名,最多输入10个字符(5个汉字);char sex4;/性别,最多输入4个字符(2个汉字);char birthday12;/出生年月日,最多输入12个字符;char grade8;/年级,最多输入8个字符;char major20;/专业,最多输入20个字符;char tel15;/手机号码,最多输入15个字符;char wechat15;/微信号,最多输入15个字符;struct student *next;/用于存放链表下一个结点的地址,即下一个学生信息的地址 student;/结构体类型为student型3.函数原型声明的说明l delay( )函数输入参数:unsigned int 延长的时间输出参数:无返 回 值:无功能描述:调用delay( )函数实现延时效果,从而实现字符动态显示在界面中,或字符在界面中停留一段时间再消失。l create( )函数输入参数:无输出参数:无返 回 值:无功能描述:调用create( )函数,能够新建学生信息,并将新建的信息储存到一个文件名为“学生管理系统信息.txt”的文本文件中。l open( )函数输入参数:无输出参数:student *fphead返 回 值:fphead 即返回文件的链头指针功能描述:打开文件,将文件“学生管理系统信息.txt”里面的数据载入链表,并将链表的头指针fphead返回l search_num( )函数输入参数:student *fphead 链头指针输出参数:无返 回 值:无功能描述:按学号查找学生的信息并将信息打印于屏幕l search_name( )函数输入参数:student *fphead 链头指针输出参数:无返 回 值:无功能描述:按姓名查找学生信息并将信息打印于屏幕l search( )函数输入参数:无输出参数:无返 回 值:无功能描述:提供学号和姓名两种查询方式给用户选择,若选择按学号查询,则调用search_num( )函数;若选择按姓名查询,则调用search_name( )函数l change ( ) 函数输入参数:student *fphead 链头指针输出参数:无返 回 值:无功能描述:输入原来修改的密码方可执行此操作输入要修改的姓名,学生信息会打印在屏幕并提供8种选择,输入数字可以做相应信息的修改,并将修改的新信息替换原来的信息储存到文本文件“学生管理系统信息.txt”中l del( )函数输入参数:无输出参数:无返 回 值:无功能描述:输入某个学生的名字将参数该学生的信息并显示删除成功l printall( )函数输入参数:无输出参数:无返 回 值:无功能描述:将所有学生的信息以表格的形式打印到屏幕上l welcome( )函数输入参数:无输出函数:无返 回 值:无功能描述:登录界面将“welcome”以不同颜色显示,随后显示开发者信息并要求输入学号、输入密码以及修改密码l close( )函数输入参数:无输出参数:无返 回 值:无功能描述:退出学生管理系统l mainmenu( )函数输入参数:无输出参数:无返 回 值:无功能实现:显示主菜单,并根据用户的选择调用以上不同的函数模块以实现新建学生信息、查询学生信息、修改学生信息、删除学生信息、显示所有信息、退出管理系统等不同的功能,是整个学生管理系统 的核心部分以下是调用到的库函数l getch( )输入参数:无输出参数:char 字符类型返 回 值:char 字符类型功能描述:有键盘输入一个字符l fopen( )函数输入参数:文件名,使用文件方式输出参数:FILE *fp 文件的地址返 回 值:FILE *fp 文件的地址功能实现:使用文件方式为wb,则以只写的方式打开文件,若文件不存在,则建立一个新文件;使用文件方式为ab,则以追加的方式打开文件,即向文件的末尾添加数据,若文件不存在,则出错l fwrite( )函数输入参数:student *p, sizeof(student),int ,FILE*fp输出函数:无返 回 值:无功能描述:向指定文件写一个数据块,将新建的信息写入到指定文件中l fclose( )函数输入参数:FILE *fp 文件地址输出函数:无返 回 值:无功能描述:把fp指定的文件关闭,再次调用fopen 函数之前fp不再指向该文件l feof( )函数输入参数:FIEL *fp 输出参数:真值0或1返 回 值:真值0或1功能描述:检查到文件读写位置标志是否移动到文件末尾,即磁盘文件是否结束l fread( )函数输入参数:student *p, sizeof(student),int , FILE*fp输出参数:无返 回 值:无功能描述:从指定文件中读一个数据块l strcmp( )函数输入参数:两个字符数组输出参数:真值0或1 返 回 值:真值0或1功能描述:若两个字符串一样,返回真值1;若不同,返回真值0l GetStdHandle( )函数输入参数:STD_OUTPUT_HANDLE输出参数:HANDLE handle返 回 值:HANDLE handle功能描述:获取控制台句柄l SetConsoleTextAttribute( )函数输入参数:HANDLE handle,FOREGROUND_颜色输出函数:无返 回 值:无功能描述:改变字体颜色4.流程图主流程图 退出系统界面 学生管理系统主菜单新建信息模块查询信息模块修改信息模块删除信息模块显示信息模块退出系统模块按学号查询按姓名查询 登录界面二详细设计1各个模块的流程图新建信息模块开始 按输入数据数据数据是否继续输入将数据写进文本按任何键回主菜单 否 是查询信息模块开始输入要查询的方式 读取数据输出“还未建立信息”文件不存在是否找到信息是否找到信息输出数据输出数据是是否否无此信息无此信息按任何键回主菜单文件存在输入要查询的姓名修改信息模块是否继续修改信息开始 读取数据输出“还未建立信息”输入要修改的姓名是否找到信息否无此信息打印信息是 输入数据将数据写进文本,并输出“修改成功”按任何键回主菜单文件不存在 文件存在 文件存在是否删除信息模块开始 读取数据文件不存在输出“还未建立信息”文件存在输入要删除的姓名是否找到信息否无此信息删除数据输出“删除成功”按任何键回主菜单 是显示信息模块开始 读取数据输出“还未建立信息”文件存在文件不存在打印数据按任何键回主菜单退出系统模块开始是否退出系统否返回主菜单延迟2秒后退出程序2.全局变量的说明本次课程设计中定义了全局变量 unsigned int Num,Code 在welcome( )函数中用到这两个变量,在change( )函数中修改信息的时候也用到输入密码,因此定义了全局变量3.宏定义说明本次课程设计中用到的宏定义有#define LEN sizeof(student)/宏定义LEN为结构体的大小以便对student类型的长度的引用三测试及调试1.主要测试方案程序运行到对应模块时,输入正确与非正确的数据,看看有什么效果,分析与预期效果的差异及原因,再做进一步的修改。2.存在的问题及解决的方案问题一:如何实现获得一个字符后程序就能直接运行而不用按回车。解决方案:通过查阅网上资料才知道getch()函数就能实现这个功能,但要增加conio.h这个头文件问题二:如何建立一个新的文件保存数据解决方案:通过查阅C程序设计知道,定义FILE *fp,fp=fopen(“文件名”,”wb”)可以新建原来没有的文件并将数据储存到文件中。问题三:seach()函数中,原来是int a,若输入一个非数值字符,就回进入一个死循环。解决方案:将int a 改为char a问题四:如何将屏幕清空解决方案:上网查阅资料,发现用system(“cls”)即可,但要增加stdlib.h这个头文件问题五:显示的东西太多,界面长度不够解决方案:使用system(“mode con cols= 130 lines=40”)改变界面大小,要增加windows.h头文件问题六:如何改变字体颜色解决方案:一个是用system(“color *” )改变,这个可以同时改变字体和背景的颜色,另外一个是HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); /获取控制台句柄SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); / 设置为绿3.程序运行截图与分析l 欢迎界面,有welcome不同颜色的动态显示。l 登录界面,设置输入学号密码以及修改密码的功能l 主菜单几面,有六个模块可以选择。l 选择模块1,进入以下界面l 新建学生信息的过程l 选择N/n退出新建信息的界面回到主菜单l 选择查询模块进入以下界面,供学号还有姓名两种查询模式l 输入信息与刚新建信息部匹配的情况l 查询到的信息打印与屏幕l 选择修改信息模块进入以下界面,需要输入密码l 对应信息会打印于屏幕,提供八种修改的内容l 不修改其他信息,按0,并显示修改成功l 选择删除信息模块进入以下界面l 选择显示所有信息模块,将所有信息显示在屏幕上l 选择退出系统模块,会提示是否要退出系统l 退出系统的界面四小结本次C语言课程设计是对上学期的C程序设计和对这学期的数据结构的综合运用,是一次难得的实践机会,也是一次巨大的挑战。由于学到的东西在之前没有实际操作过,所以运用起来也比较困难,因此要不断的复习前面的知识,并通过上网查阅资料,来让自己知道要怎么写出一个完整的程序。所以也是一个温故而知新的过程。在这次课程设计中,处理除了实现任务书的要求外,我还有所改进和创新,比如改变字体的颜色等,运行结果与自己的预期基本相符。通过这次课程设计,让我更加明白,学到的知识如果没有实践,那是永远学不会的,特别是编程这种东西,所以在今后,一定要多动手操作。另一方面,我也学会了独立解决问题以及如何利用好百度找到自己想要的信息。最后,我要感谢高学老师,能够完成本次课程设计,离不开您给我们铺垫的C语言基础! 附件源程序#include<stdio.h> /本次设计所用到的头文件#include<stdlib.h>#include<string.h> /strcmp等函数#include<Windows.h> /包含windows常用数据结构,宏和其他数据类型#include<conio.h> /包含控制台的键盘输入输出操作typedef struct student/定义结构体变量,用于储存学生的信息char num12;/学号char name10;/姓名char sex4;/性别char birthday12;/出生年月日char grade8;/年级char major20;/专业char tel15;/手机号码char wechat15;/微信号struct student *next;/下一个数据的地址student;/结构体类型为student型#define LEN sizeof(student)/宏定义LEN为结构体的大小unsigned int Num,code;/定义全局变量,以便在各个函数中引用/登录时输入学号,密码void delay(unsigned int t) /定义延时函数,t/ms,主要用于登陆界面信息的显示中unsigned int i;unsigned int j;for(i=0;i<t;i+)for(j=0;j<114100;j+);void create()/新建学生信息(get)FILE *fp;student *head;/头结点student *p,*q;/p为新建立信息的结点head=NULL;p=q=(student *)malloc(LEN);int n=0;char a='x'system("cls");while(a!='n'&&a!='N')printf("nn-学 生 管 理 系 统-nnnn");printf("nn 是否要新建学生信息(Y/N)?:");printf("%c",a=getch();while(a!='n'&&a!='N'&&a!='y'&&a!='Y')printf("n输入错误,请重新输入:");printf("%c",a=getch();if(a='n'|a='N')printf("n");system("pause");elsefp=fopen("学生管理系统信息.txt","ab");/只写,为了输出数据,打开一个二进制文件,若制定的文件不存在,则建立新文件printf("nnn");printf("n 请输入学号(12位数)并按回车键:");scanf("%s",(*p).num);printf("n 请输入姓名(如李华)并按回车键:");scanf("%s",(*p).name);printf("n 请输入性别(男或女)并按回车键:");scanf("%s",(*p).sex);while(strcmp(*p).sex,"男")!=0&&strcmp(*p).sex,"女")!=0)printf("n 输入错误,请重新输入!");scanf("%s",(*p).sex);printf("n 请输入出生年月日(如1995-02-30)并按回车键:");scanf("%s",(*p).birthday);printf("n 请输入年级(如2013级)并按回车键:");scanf("%s",(*p).grade);printf("n 请输入专业(如电子信息类)并按回车键:");scanf("%s",(*p).major);printf("n 请输入手机号码(如18819477000)并按回车键:");scanf("%s",(*p).tel);printf("n 请输入微信号(如XLFD10086)并按回车键:");scanf("%s",(*p).wechat);printf("nnn 成功建立学生信息 +");delay(4000);fwrite(p,LEN,1,fp);/将数据写入文件fclose(fp);n=n+1;if(n=1)head=p;else (*q).next=p;/单链表的链头增加新结点q=p;p=(student *)malloc(LEN);/指针q指向原来指针p指向的信息,重新给指针p分配空间,以新建新的信息system("cls");(*q).next=NULL;student * open(void)/函数返回值为结构体类型studentFILE *fp;student *p=NULL,*q=NULL,*temp=NULL,*fphead=NULL;fp=fopen("学生管理系统信息.txt","rb");/只读方式打开二进制文件fphead=(student *)malloc(LEN);/分配空间temp=q=fphead;while(!feof(fp)/如果未遇到输入文件的结束标志,循环读取,载入链表p=(student *)malloc(LEN);temp=q;(*q).next=p;q=p;fread(p,LEN,1,fp);/从指定文件中读入相关信息(*temp).next=NULL;fclose(fp);return(fphead);/返回链头指针void search_num(student * fphead)student *p;int a=0;char searchnum13;system("cls");printf("nn-学 生 管 理 系 统-nnnn");printf("nn");printf(" 请输入要查找的学生学号并按回车键:");scanf("%s",searchnum);/输入要查询的学号for(p=(*fphead).next;p!=NULL;p=(*p).next)if(strcmp(*p).num,searchnum)=0)/查找到要查找的学号,打印信息printf("nnn");printf(" *n");printf(" | 学号 | 姓名 | 性别 | 出生日期 | 年级 | 专业 | 手机号码 | 微信号 |n"); printf(" *n");printf(" | %-12s | %-10s | %2s | %-10s | %-6s | %-16s | %-11s | %-10s |n",(*p).num,(*p).name,(*p).sex,(*p).birthday,(*p).grade,(*p).major,(*p).tel,(*p).wechat);printf(" *n");a=1;system("pause");if(!a)printf("无此学生信息!n");system("pause");void search_name(student * fphead)student *p;int a=0;char searchname10;system("cls");printf("nn-学 生 管 理 系 统-nnnn"); printf("nn");printf(" 请输入要查找的学生姓名并按回车键:");scanf("%s",searchname);/输入要查询的姓名for(p=(*fphead).next;p!=NULL;p=(*p).next)if(strcmp(*p).name,searchname)=0)/查找到要查找的学号,打印信息printf("nn");printf(" *n");printf(" | 学号 | 姓名 | 性别 | 出生日期 | 年级 | 专业 | 手机号码 | 微信号 |n"); printf(" *n");printf(" | %-12s | %-10s | %2s | %-10s | %-6s | %-16s | %-11s | %-10s |n",(*p).num,(*p).name,(*p).sex,(*p).birthday,(*p).grade,(*p).major,(*p).tel,(*p).wechat);printf(" *n");a=1;system("pause");if(!a)printf("无此学生信息!n");system("pause");void search()FILE *fp;student *fphead;if(fp=fopen("学生管理系统信息.txt","rb")!=NULL)/只读的形式打开二进制文件,若制定的文件不存在,出错system("cls");int b=1;while(b)printf("nn-学 生 管 理 系 统-nnnn");printf("nnn 请选择你要查询的方式:n(0-按学号查询,1-按姓名查询)+ ");char a;a=getch();switch(a)case '0':/按学号查询fphead=open();/链表头指针search_num(fphead);b=0;system("cls");break;case '1':/按姓名查询fphead=open();search_name(fphead);b=0;system("cls");break;default:printf("输入错误!n");system("pause");system("cls");elseprintf(" 未建立学生信息,此操作无法进行!n");system("pause");void change(student *fphead)FILE *fp;student *p,*q;int d=0;char changename10;system("cls");printf("nn-学 生 管 理 系 统-nnnn");printf("nn");printf(" 请输入要修改的姓名:");scanf("%s",changename);for(p=(*fphead).next;p!=NULL;p=(*p).next)if(strcmp(*p).name,changename)=0)/先打印出原来的信息printf("nn *n");printf(" | 学号 | 姓名 | 性别 | 出生日期 | 年级 | 专业 | 手机号码 | 微信号 |n"); printf(" *n");printf(" | %-12s | %-10s | %2s | %-10s | %-6s | %-16s | %-11s | %-10s |n",(*p).num,(*p).name,(*p).sex,(*p).birthday,(*p).grade,(*p).major,(*p).tel,(*p).wechat);printf(" *n");int e;int f=1;while(f)printf("nnn 【1】学号 【2】姓名 【3】性别 【4】出生日期n"); printf(" 【5】年级 【6】专业 【7】手机号码【8】微信号n");printf("n 请输入要修改的信息的序号:");scanf("%d",&e);switch(e) case 1:printf(" 请输入新的学号(12位数)并按回车:");scanf("%s",(*p).num);break;case 2:printf(" 请输入新的姓名(如李华)并按回车:");scanf("%s",(*p).name);break;case 3:printf(" 请输入新的性别(男或女)并按回车:");scanf("%s",(*p).sex);while(strcmp(*p).sex,"男")!=0&&strcmp(*p).sex,"女")!=0)printf(" 输入错误,请重新输入性别:");scanf("%s",(*p).sex);break;case 4:printf(" 请输入新的出生日期(如1995-02-30)并按回车:");scanf("%s",(*p).birthday);break;case 5:printf(" 请输入新的年级(如2013级)并按回车:");scanf("%s",(*p).grade);break;case 6:printf(" 请输入新的专业(如电子信息类)并按回车:");scanf("%s",(*p).major);break;case 7:printf(" 请输入新的手机号码(如18819477000)并按回车:");scanf("%s",(*p).tel);break;case 8:printf(" 请输入新的微信号(如XLFD10086)并按回车:");scanf("%s",(*p).wechat);break;printf("n 是否还要修改其他信息?【1】是【0】否");scanf("%d",&f);fp=fopen("学生管理系统信息.txt","wb");/只写,为了输出数据,打开一个二进制文件q=(*fphead).next;while(q!=NULL)fwrite(q,LEN,1,fp);if(*q).next!=NULL)q=(*q).next;elseq=NULL;fclose(fp); printf("nn 修改成功 + ");system("pause");system("cls");d=1;if(d!=1)printf("n 无此学生信息!n");system("pause");void del()/删除学生信息FILE *fp;student *fphead;if(fp=fopen("学生管理系统信息.txt","rb")!=NULL)