C++课程设计报告Word文档格式.docx
- 文档编号:20516353
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:20
- 大小:227.24KB
C++课程设计报告Word文档格式.docx
《C++课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
图1整体功能模块图
二、概要设计:
1、课堂签到:
进入课堂签到界面时,可以先随机选择点名,也可以以随机点名的那名同学为基础,选择和他(她)同寝室的或者同班的进行点名,还可以对整个大班进行全员点名。
该功能也包含了历史未到标记及其相应的记录未到和取消记录。
2、成绩记录:
可以显示出所以学生信息,也可以按照顺序一个个显示,还可以按照学号或者姓名或者班级进行查找,最后录入学生的平时成绩进行加分。
3、学生人员管理:
可以对新加入的新同学进行添加,然后更新出添加后的学生相应信息。
4、学生行为评价:
可以对全部学生信息进行查询,也可以按成绩查询,还可以按课堂未到查询,还可以按照学号或者姓名或者性别或者班级或者寝室进行查询。
5、系统以菜单方式工作。
(所谓菜单指用户可以自由选择所要执行的功能。
老师可以通过以上功能对学生进行课堂点名、成绩录入、学生人员管理、学生行为评价),除了要实现上述的基本功能之外,本系统还应该在细节上下工夫,使用户使用方便,在使用的过程中保持一个愉快的心情。
学生考勤管理系统有广大的用户群,这其中有老师、有教务处主任、有公司管理人员,也可以供给一般用户使用。
总之该系统可以满足用户需求,实现对其管理的人员的考勤工作。
三、详细设计:
1、学生点名功能模块:
课堂签到界面,可实现随机点名,按同寝室人员点名,按同班级人员点名,按全体人员点名(防止同寝人员或者同班人员代替签到)和按历史未到人员点名;
图2学生点名功能模块设计图
2、学生成绩录入模块:
成绩录入界面,通过按键实现学生成绩录入;
并设置查询按钮,方便指定条件学生查找录入,输入一个学号或姓名或班级号进行查找录入;
图3学生成绩录入功能模块设计图
3、学生信息录入删除模块:
学生人员管理界面,包括学生学号、姓名、性别、班级、专业、寝室等主要信息的录入和删除;
4、学生信息查询模块:
学生日常表现界面,显示学生及相关信息,并能通过成绩排序、课堂未到排序,并且输入一个学号或姓名或性别或班级号或寝室号进行查询,有序输出学生信息。
图4学生信息查询功能模块设计图
四、调试分析:
程序编写完成后,我进行了程序调试。
调试过程中,出现了以下问题:
当录入学生基本信息时,出现了无法退出录入函数的情况,主要原因是输入函数中while循环语句没有设置跳出循环的条件。
除此之外,修改某学生基本信息时,如果没有该学生的基本信息,系统没有提示用户不存在该学生的信息,也没有建议用户重新输入要修改的学生姓名。
由此我发现了该系统修改学生基本信息的不足。
于是,我对修改函数进行了修改与完善。
在该函数中,我设置了if语句用来判断系统中是否存有用户要修改的学生缺课信息。
如果没有,则提示用户没有该学生的缺课信息,用户可以选择继续输入要修改的学生姓名或者退出修改环节,可以在循环语句中改变循环进行的条件从而终止循环。
至于在修改后显示该学生的缺课信息,运行时发现系统并没有做到这一点,对源代码检查之后发现是修改函数中显示函数的调用出了点问题,显示函数的实参有误,应该把要修改缺课信息的学生所在的信息类对象作为实参,然后用显示函数的形参引用实参对象,通过对象调用信息类的成员函数,从而实现显示功能。
至于该系统的查询功能的实现,在调试时发现还有欠缺,当随便输入一个学生姓名时,系统没有显示该学生的缺课信息,也没有提示系统没有找到该学生的有关信息,经过在查询函数while循环中加入一个if条件语句后,系统实现了提示用户的功能,如果系统中没有你要查询的学生缺课信息,系统将会提示用户,用户可以继续输入要查询的学生姓名也可以通过按系统设置的退出键选择退出查询环节。
至于两个统计功能至今没有完善,主要是特定时间学生缺课次数和课程的缺课人次的统计问题尚待解决,现如今只完成了一两条学生缺课信息的统计。
主要问题是特定时间这个前提条件对我造成了一定的障碍。
对系统中存储的信息进行查找和统计运用对象指针比较方便,但我没有使用,也算有点遗憾。
在调试过程中我出现的最严重的问题是函数形参引用对象数组,结果系统提示将近几十个错误,在我把函数形参改为对象数组后,错误一下减少了很多。
还有比较突出的问题是整个程序不知哪掉了个}号系统会提示有错,但就不懂那专业术语啥意思。
还有就是我以为派生类公有继承的基类的保护成员在派生类内为公有成员,可编译时才发现是不对的。
通过认真调试,我发现我有了收获。
五、用户使用说明:
点击相应按键使用相应的功能,严格按照要求使用。
六、遇到的难点及解决办法:
这次的课设,我写的程序也没有什么独到之处,我觉得唯一可以从我的程序可以看出的是数组用得比较多,反正是没啥特色,不仅如此,还写得功能不全,实在是惭愧。
现在在这里也只能说说它的不足之处了。
类层次不够清晰,纵观整个程序可以发现四个类之间的关系不甚恰当,我有这个感觉,但我不知如何改进。
函数参数设定不够完美,整个程序中对指针的运用比较少。
对于指针的巧妙运用把握得不够。
还有就是容易missing;
或者是},这都是些应该改掉的毛病。
除此以外,我对于怎样用文件保存数据还没深入了解,但我将数据保存到文件后又因文件打不开而无法访问文件中的数据,对于动态链表,我不是很清晰,也就是说无法做到熟稔运用。
在调试过程中我发现在主函数中把字符数组名name赋值给字符指针p即p=name;
然后用cout<
<
p;
语句可以输出字符数组里全部的内容,但利用函数返回指针值却不能做到这一点,在我思考一番后终于明白了,这与内存中的地址值有关。
具体为什么我是解释不清了
在调用系统的显示功能时,如果在getname()函数前加一个*号输出的只是一个字符,不加反而能输出所有字符。
getname()函数的返回值为指针类型,但前面说过利用函数返回指针类型的值并不能输出字符数组中所有的字符,为什么这里又可以呢?
老天,这是为什么?
我不知道这一知识,这也算我的程序的不足之处吧!
对于两个统计函数的功能不全,我感到无能为力,我为了这两函数苦思了两天,硬是没凑合来。
到后来,脑子里都乱了,运行时屏幕上尽是些乱七八糟的东西。
老师帮我看看,看有没有什么简单的方法一下搞定它。
结果不是很好,但过程够了就行。
这也是自欺欺人的看法,让我再一次自责吧。
七、主要窗口界面:
学生日常表现功能模块:
成绩录入功能模块:
课堂查到功能模块:
学生管理功能模块:
八、源程序:
//txt文本存入数组
char
la[99][20],lb[99][20],lc[99][20],ld[99][20],le[99][20],lf[99][20],lg[99][20],li[99][20],lj[99][20];
intlh[99];
BOOLcheck:
:
OnInitDialog()
{
CDialog:
OnInitDialog();
FILE*fp;
inttmp=0;
fp=fopen("
list.txt"
"
r+"
);
while(tmp<
99)
{
fscanf(fp,"
%s"
&
la[tmp]);
lb[tmp]);
lc[tmp]);
ld[tmp]);
le[tmp]);
lf[tmp]);
lg[tmp]);
%d"
lh[tmp]);
li[tmp]);
fscanf(fp,"
lj[tmp]);
if(fp==NULL)
break;
tmp++;
}
//TODO:
Addextrainitializationhere
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
}
voidcheck:
OnSelchangeList1()//课堂查到显示框关联编辑框
intt=m_checklist.GetCurSel();
if(t<
0)
return;
else
m_checknumber=lb[t];
m_checksex=lc[t];
m_checkname=ld[t];
m_checkproject=le[t];
m_checkclass=lf[t];
m_checkdormitory=lg[t];
UpdateData(false);
}
//TODO:
Addyourcontrolnotificationhandlercodehere
OnRandom()
inta=rand()%90;
if(a<
0||a>
90)
m_checknumber=lb[a];
m_checksex=lc[a];
m_checkname=ld[a];
m_checkproject=le[a];
m_checkclass=lf[a];
m_checkdormitory=lg[a];
Onmark()//标记未到
intp=0;
for(p;
p<
90;
p++)
if(lb[p]==m_checknumber)
{
FILE*file=fopen("
"
r"
charbuff[9999];
charnew_buff[9999];
inti=0;
while(fgets(buff,9999,file)!
=NULL)
chara[10],b[10],c[10],d[10],e[10],f[10],g[10],I[10],j[10];
inth;
sscanf(buff,"
%s%s%s%s%s%s%s%d%s%s\n"
a,b,c,d,e,f,g,&
h,I,j);
if(strcmp(b,m_checknumber)==0)
h=h+1;
//未到次数加1
sprintf(new_buff+i,"
a,b,c,d,e,f,g,h,I,j);
i=strlen(new_buff);
fclose(file);
FILE*file2=fopen("
w"
fwrite(new_buff,sizeof(char),strlen(new_buff),file2);
fclose(file2);
AfxMessageBox("
标记成功!
"
voidperformance:
OnButton7()//按照相关条件查询显示
m_performancelist.ResetContent();
CStringa,b,c,d,e,f,g,h,str;
inti;
GetDlgItem(IDC_EDIT3)->
GetWindowText(str);
m_performancelist.AddString("
id学号姓名性别专业班级
寝室"
for(i=0;
i<
99;
i++)
if(qb[i]==str||qd[i]==str||qf[i]==str||qc[i]==str||qg[i]==str){
a=qb[i];
b=qc[i];
c=qd[i];
d=qe[i];
e=qf[i];
f=qg[i];
g=qh[i];
h=qa[i];
if(a!
="
&
b!
c!
d!
e!
f!
)
m_performancelist.AddString(h+"
"
+a+"
+c+"
+b+"
+d+"
+e+"
+f);
voidstudent:
OnButton10()//学生信息修改
aa[99][20],ab[99][20],ac[99][20],ad[99][20],ae[99][20],af[99][20],ag[99][20],ah[99][
20],ai[99][20],aj[99][20];
while(!
feof(fp))
fscanf(fp,"
aa[tmp]);
ab[tmp]);
ac[tmp]);
ad[tmp]);
ae[tmp]);
af[tmp]);
ag[tmp]);
ah[tmp]);
ai[tmp]);
aj[tmp]);
tmp++;
}
fclose(fp);
w+"
fputs("
fp);
CFileFile;
intt=0;
CStdioFilemyFile;
//信息重新写入txt
CFileExceptionfileException;
char*pszFileName="
;
CStringstri;
if(myFile.Open(pszFileName,CFile:
typeText|CFile:
modeCreate|CFile:
modeRe
adWrite|CFile:
modeNoTruncate),&
fileException)
GetDlgItem(IDC_EDIT8)->
GetWindowText(stri);
while(t<
tmp-1)
if(aa[t]!
=stri){
myFile.SeekToEnd();
myFile.WriteString(aa[t]);
myFile.WriteString("
myFile.WriteString(ab[t]);
myFile.WriteString(ac[t]);
myFile.WriteString(ad[t]);
myFile.WriteString(ae[t]);
myFile.WriteString(af[t]);
myFile.WriteString(ag[t]);
myFile.WriteString(ah[t]);
myFile.WriteString(ai[t]);
myFile.WriteString(aj[t]);
myFile.WriteString("
\n"
}
t++;
}
myFile.Close();
CStringstr;
//修改后的信息写入txt
fp=fopen("
a+"
fseek(fp,0L,SEEK_END);
GetDlgItem(IDC_EDIT8)->
fwrite(str.GetBuffer(0),1,str.GetLength(),fp);
fputs("
GetDlgItem(IDC_EDIT2)->
fwrite(str.GetBuffer(0),1,str.GetLength(),fp);
GetDlgItem(IDC_EDIT4)->
GetDlgItem(IDC_EDIT3)->
GetDlgItem(IDC_EDIT5)->
GetDlgItem(IDC_EDIT6)->
GetDlgItem(IDC_EDIT7)->
000"
\r\n"
fclose(fp);
AfxMessageBox("
修改成功!
九、总结:
学生日常行为管理系统要求至少要有四个类,在起初,对于定义哪四个类我是不清楚的,通过仔细的研读问题描叙终于在脑海里确定了这四个类。
既然是学生考勤管理系统,那由学生缺课信息中的日期我想到了时间类,这是一个很简单的类。
从系统的几大功能我又想到了系统的基础就是缺课学生的缺课信息,于是我又想到了一个信息类,还有两个类是根据两个统计功能想到的,在现在看来似乎有些不妥。
通过这次的课程设计我明白了学习程序设计语言必须要勤做实验,通过实验总结经验。
平时遇到的一些小问题一定要重视,越是基础的知识越要理解透彻。
比如指针与数组方面的知识,一旦没有弄清楚,在设计程序时就会吃亏。
这次的课设中,我遇到了很多的问题,有的通过思考或查看书本解决了,有的还留在脑子里,只有通过孜孜不倦的求索我们才会有进步,不懂得思考就不能真正的掌握一门知识。
这次的实验给以了我警示,它让我明白我所掌握的知识还很欠缺,对于继承与派生这一章的知识,我以为自己勉强掌握了,这次实验后我发现我掌握得还不够。
基类的保护成员公有继承到派生类,类外是否可以通过对象来访问呢,原先我认为是可以的,经过这次程序设计,我知道我错了。
总之,我觉得做学问不应该马虎,对于所学一定要有深入的理解,这也是我这次课设得到的启示。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 报告