C语言实训报告学分管理系统解析.docx
《C语言实训报告学分管理系统解析.docx》由会员分享,可在线阅读,更多相关《C语言实训报告学分管理系统解析.docx(31页珍藏版)》请在冰豆网上搜索。
C语言实训报告学分管理系统解析
HUBEIUNIVERSITYOFAUTOMOTIVETECHNOLOGY
C语言程序设计
实训报告
实训题目:
学分管理程序
专业:
计算机科学与技术
班级:
K1273-5
姓名:
涂瑞
成绩:
完成日期:
2014年7月8日
指导教师:
张吴波
1.实训题目与要求…………………………………………………3
2.系统设计…………………………………………………………4
3.程序测试与运行结果……………………………………………7
4.实训总结…………………………………………………………10
5.程序源代码………………………………………………………12
1.实训题目与要求
学分管理程序
问题描述:
请设计一个学生的学分管理程序,以方便教务部门对学生已完成学分的管理。
假设每位学生必须完成基础课50学分、专业课50学分、选修课24学分、人文类课程8个学分、实验性课程20学分才能毕业。
因此在管理学分时,要考虑每个学分所属于的课程类别。
其中各类别的课程所完成的学分最多不会超过100分。
该程序应该具有以下功能:
(1)能从键盘输入某位学生的信息(不包含学分)。
(2)给定学号,显示该学生的所完成的学分。
(3)给定学号,能修改该学生所完成的学分。
(4)给定学号,将学生从程序中删除。
(5)能显示已完成学分可以毕业的学生。
题目要求:
(1)按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。
(2)学分信息应该包括学生信息(学号、姓名、班级、入学时间)、基础课学分、专业课学分、选修课学分、人文类课程学分、实验性课程学分。
(3)为程序设计windows窗口,在该窗口上以按钮的形式为用户提供“菜单”,通过点击各个功能项对应的按钮完成操作。
输入要求:
(1)用户可以根据需求,选定相应的操作项目。
进入每个操作后,通过窗口的文本框,从键盘输入相应的信息。
程序根据用户输入的信息完成相应的处理,实现要求的功能。
(2)能对输入的数据进行简单的校验,例如,学生的学分是[0,100]范围内的数,入学时间必须是合法的日期,学号是唯一的(一个学号对应一个学生的学分信息)。
输出要求:
(1)应用程序运行后,要在屏幕上显示一个按钮形式的“菜单”。
(2)要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式以及结束方式等。
(3)在程序完成处理后,要清楚地给出程序的处理结果。
例如,在给定学号修改学生学分时,如果该学生不存在,要提示不能修改,如果修改成功要提示修改成功。
实现要求:
(1)在程序中使用链表存储学生的学分信息。
(2)采用模块化程序设计的方法,将程序中的各项功能用函数实现。
提示:
(1)使用结构体表示学生的学分信息,一个结点保存一条学分信息。
扩展功能:
(1)提供一些统计功能。
例如统计每个班学生已完成学分可以毕业人数。
统计每类别课程的平均学分等。
(2)学生的学分信息从文件读入。
(3)将学生的学分信息保存到文件中。
2.系统设计
Windows编程与Dos的区别:
函数家族
【函数介绍】
1.voidcreate(HWNDhwnd,LPARAMlParam);
注册窗口函数
2.ShowWindow(hWnd,nShowCmd);
显示窗口
3.voidcommand();
命令消息
4.UpdateWindow(hWnd);
更新窗口
5.voidinitstudent();
初始化链表
6.voidbaocun();
保存
7.voidshowall();
显示所有学生信息
8.voidcleartext();
清空文本框
9.voidclearcache();
清空缓存
10.voidshowbiye();
显示可以毕业的学生
11.voiddeletestudent();
删除学生
12.voidseexuefen();
查询学分
13.voidxiugaixuefen();
修改学分
3.程序测试与运行结果
运行界面:
保存界面:
显示所有学生信息界面:
查询学分界面:
修改学分界面:
删除学生界面:
4.实训总结
对这个系统需求分析,学分管理系统需要有保存学生信息、删除学生信息、查询学分、修改学分、显示所有学生信息、显示可以毕业的学生等基本功能。
在实训中,我将各种功能模块化,以便进行设计。
具体模块如下:
保存信息模块、删除信息模块、输入信息模块、显示信息模块、清空文本框模块。
然后根据各模块分别设计程序。
万事开头难,在本次实训过程中,刚开始写这个程序的时候感觉很吃力,用了结构体,但却不知道自己要编写的函数怎样和结构体联系起来,弄了很久,总是有错误,去问其他同学,他们也不知道,后来苦思冥想了几个小时,才发现是变量类型不同,结构体中定义的变量都是int型或long型,而win程序从文本框中获取的内容是字符串型的,变量类型不同,所以无法直接赋值,导致编译错误。
后来我用atoi函数把字符串转换为整型之后再赋值,就成功了。
整个程序中,我最先编的函数是保存函数,编这个函数时,我启用了指针followp来进行挂链,挂链语句为followp->next=newstudent,其实这个比较简单,难点在于对学生信息的限制条件,比如对入学时间的限制,对学分范围的限制等等,这些都要编在程序中,这就需要在合理的位置使用if语句进行判断,由于限制条件比较多,就要使用多个if语句来判断,甚至是if里面再if,多个if语句嵌套判断,最后终于成功了。
再程序的整体设计中,我还定义了一个全局变量assistp,为了其他功能便于实现,我让assistp始终指着头结点的下一个结点,但在判断学号是否重复的过程中,我使用了assistp来查找学号,所以当保存功能结束时,assistp已经不再指着headp的下一个结点,所以在保存功能结束前,一定要让assistp归位,所以应再加一句assistp=headp->next,这样assistp在其他功能中使用时也不会出错,保持了程序的健壮性和稳定性。
很多时候,程序一编译,就会出现很多错误,心里非常凌乱,但是当自己把一个个错误改过来以后,会常常的舒一口气,然而,到连接时,十有八九会出问题,一般是逻辑上的问题,由于是需要前后改动程序的,所以会出现语句的出现先后问题,这时,就需要冷静,静下心年来,慢慢思考。
有时候一个小小的错误会消耗我几个小时时间,甚至是好几天,百思不得其解,然而,有时也会过一会儿就会理解。
有时候,当自己看着一个程序,不知道错在哪里的时候,别人一眼就看出来问题的所在。
这就是当局者迷,旁观者清吧。
这一次编写实训题目的程序又让我感受到学程序可以锻炼缜密的思维。
因为以前编写的程序代码都比较少,出现一些错误都是很容易被检查出来的,但是这次实训却是几百行的语句,而且是Windows编程,更是难以检查,似乎也没有经验告诉你该怎么去检查,那一刹那感觉到很急,但又不知如何是好,可是又不轻易的向老师询问,因为好像蛮简单,总相信自己能够检查出来,结果花了大量的时间。
这次实训也让我明白了:
不在乎你的基础怎么样,只要多练习,必能做到勤能补拙,编出一个自己满意的界面,一个满意的程序出来的。
有时候程序会检测出一大堆错误。
有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的,不是我所期望的。
开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。
程序的调试是一个技巧性很强的工作,对于初学者来说,尽快掌握程序调试方法是非常重要的。
5.程序源代码
#include
LRESULTWINAPIWinProc(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam);//函数声明
voidinitstudent();//初始化
voidbaocun();//保存
voidshowall();//显示所有学生信息
voidcleartext();//清空文本框
voidclearcache();//清空缓存
voidshowbiye();//显示可以毕业的学生
voiddeletestudent();//删除学生
voidseexuefen();//查询学分
voidxiugaixuefen();//修改学分
RECTrect1;
RECTrect2;
RECTrect3;
RECTrect4;
RECTrect5;
RECTrect6;
RECTrect7;
RECTrect8;
RECTrect9;
RECTrect10;
RECTrect11;
RECTrect12;
HDChDC;
HWNDhWnd;
PAINTSTRUCTpaint;
staticcharstr1[20],str2[20],str3[100],str4[20],str5[20],str6[20],str7[20],str8[20],str9[20],str10[100],str11[20],str13[20],str12[10000],str14[10000];
structstudent
{
longxuehao;
charname[20];
charbanji[20];
intyear;
intmonth;
intdate;
intjichu;
intzhuanye;
intxuanxiu;
intrenwen;
intshiyan;
student*next;
};
structstudent*headp,*followp,*assistp;
voidinitstudent()//初始化
{
headp=newstudent;
headp->next=NULL;
followp=headp;
assistp=headp->next;
}
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd)
{
char*cName="myWindow";//定义个字符指针表示窗口类的名字
WNDCLASSwc;//定义变量
MSGMsg;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);;//设置窗口背景为白色
wc.hCursor=NULL;//窗口的光标不设置
wc.hIcon=NULL;//窗口图标设置
wc.hInstance=hInstance;//当前程序的句柄,hInstance是由主函数传递
wc.lpfnWndProc=WinProc;//窗口处理过程的窗口函数。
wc.lpszClassName=(LPSTR)cName;//窗口类的名字。
wc.lpszMenuName=NULL;//目录名,不设置
wc.style=CS_HREDRAW|CS_VREDRAW;//窗口类的风格
RegisterClass(&wc);//在系统中注册窗口
hWnd=CreateWindow(cName,TEXT("学分管理系统"),WS_OVERLAPPEDWINDOW,25,25,1330,690,
NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,nShowCmd);//显示窗口
UpdateWindow(hWnd);//更新窗口
initstudent();
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);//翻译消息
DispatchMessage(&Msg);//分派消息
}
returnMsg.message;//程序结束后返回消息
}
LRESULTWINAPIWinProc(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam)
{//处理消息过程
staticHWNDbtnHwnd;
staticHWNDinputHwnd1;
staticHWNDinputHwnd2;
staticHWNDinputHwnd3;
staticHWNDinputHwnd4;
staticHWNDinputHwnd5;
staticHWNDinputHwnd6;
staticHWNDinputHwnd7;
staticHWNDinputHwnd8;
staticHWNDinputHwnd9;
staticHWNDinputHwnd10;
staticHWNDinputHwnd11;
staticHWNDinputHwnd12;
staticHWNDhwndbutton13;
staticHWNDhwndbutton14;
staticHWNDhwndbutton15;
staticHWNDhwndbutton16;
staticHWNDhwndbutton17;
staticHWNDhwndbutton18;
staticHWNDhwndbutton19;
switch(Msg)//对消息进行判断
{
caseWM_PAINT:
hDC=BeginPaint(hWnd,&paint);//获取设备上下文
rect1.top=20;//设置矩形框的属性
rect1.right=120;
rect1.bottom=40;
rect1.left=20;
rect2.top=20;//设置矩形框的属性
rect2.right=580;
rect2.bottom=40;
rect2.left=480;
rect3.top=20;//设置矩形框的属性
rect3.right=1040;
rect3.bottom=40;
rect3.left=940;
rect4.top=70;//设置矩形框的属性
rect4.right=120;
rect4.bottom=90;
rect4.left=20;
rect5.top=70;//设置矩形框的属性
rect5.right=620;
rect5.bottom=90;
rect5.left=480;
rect6.top=70;//设置矩形框的属性
rect6.right=1040;
rect6.bottom=90;
rect6.left=940;
rect7.top=120;//设置矩形框的属性
rect7.right=160;
rect7.bottom=140;
rect7.left=20;
rect8.top=120;//设置矩形框的属性
rect8.right=620;
rect8.bottom=140;
rect8.left=480;
rect9.top=120;//设置矩形框的属性
rect9.right=1060;
rect9.bottom=140;
rect9.left=940;
rect10.top=70;//设置矩形框的属性
rect10.right=190;
rect10.bottom=90;
rect10.left=170;
rect11.top=70;//设置矩形框的属性
rect11.right=270;
rect11.bottom=90;
rect11.left=250;
rect12.top=70;//设置矩形框的属性
rect12.right=350;
rect12.bottom=90;
rect12.left=330;
DrawText(hDC,"姓名:
",-1,&rect1,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
DrawText(hDC,"班级:
",-1,&rect2,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
DrawText(hDC,"学号:
",-1,&rect3,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
DrawText(hDC,"入学时间:
",-1,&rect4,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
DrawText(hDC,"基础课学分:
",-1,&rect5,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
DrawText(hDC,"专业课学分:
",-1,&rect6,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
DrawText(hDC,"选修课学分:
",-1,&rect7,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
DrawText(hDC,"人文类课程学分:
",-1,&rect8,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
DrawText(hDC,"实验类课程学分:
",-1,&rect9,DT_SINGLELINE|DT_LEFT|DT_VCENTER);
DrawText(hDC,"年",-1,&rect10,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
DrawText(hDC,"月",-1,&rect11,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
DrawText(hDC,"日",-1,&rect12,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hWnd,&paint);
return0;
caseWM_CREATE:
//响应窗口的创建事件
inputHwnd1=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,110,20,240,20,hWnd,(HMENU)1,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd2=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,600,20,240,20,hWnd,(HMENU)2,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd3=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,1060,20,240,20,hWnd,(HMENU)3,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd4=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_RIGHT|ES_MULTILINE,110,70,60,20,hWnd,(HMENU)4,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd5=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,600,70,240,20,hWnd,(HMENU)5,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd6=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,1060,70,240,20,hWnd,(HMENU)6,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd7=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,110,120,240,20,hWnd,(HMENU)7,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd8=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,600,120,240,20,hWnd,(HMENU)8,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd9=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,1060,120,240,20,hWnd,(HMENU)9,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd10=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER|ES_LEFT|ES_MULTILINE,20,180,1280,400,hWnd,(HMENU)10,((LPCREATESTRUCT)lParam)->hInstance,NULL);
inputHwnd11=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_BORDER