VB课程设计.docx
《VB课程设计.docx》由会员分享,可在线阅读,更多相关《VB课程设计.docx(11页珍藏版)》请在冰豆网上搜索。
VB课程设计
课程设计
2011年7月10日
课程设计任务书
学院:
机电工程学院专业:
机械电子班级:
94060110
一、课程设计时间
2011年6月27~7月1日(第17周),共计1周,20学时。
二、课程设计内容
一个文本文件(file11_数据统计.txt)存储了若干位同学的数学成绩,文件中每行的内容按照顺序为:
学号,班级,数学成绩,姓名。
请完成一下问题:
①将文件中的内容全部显示在窗体上,并统计总人数。
②统计数学成绩的平均分。
③统计各个班级的平均分。
三、课程设计要求
程序质量:
✧贯彻事件驱动的程序设计思想。
✧用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
✧用户界面中的菜单至少应包括“打印全部,并统计人数”、“计算总平均分”、“计算各个班的平均分”、“退出”4项。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
✧课程结束后,上交课程设计说明书和源程序。
课程设计说明书的内容参见提供的模板。
四、指导教师和学生签字
指导教师:
________学生签名:
五、成绩
六、教师评语
需求分析
一个文本文件(file11_数据统计.txt)存储了若干位同学的数学成绩,文件中每行的内容按照顺序为:
学号,班级,数学成绩,姓名。
要求:
①能够将文件中的内容全部显示在窗体上,并统计总人数。
②能够统计数学成绩的平均分。
③能够统计各个班级的平均分。
设计分析
(1)基本原理:
用Open语句打开文本文件,用EOF函数读取文件中的内容导入的自定义类型动态数组中,将文件中的内容全部显示在窗体上并用选择和循环结构进行数据统计。
(2)总体设计:
(3)详细设计:
技术要点
1文本文件的读取与导入的代码如下
利用open语句打开文件,再用input和lineinput读出文件中的数据
PrivateSubCommand1_Click()
Open"file11.txt"ForInputAs#1'打开文件,用于读取数据
DimCountAsInteger
DoWhileNotEOF
(1)'判断一号文件是否结束,若不结束则继续
LineInput#1,inputdata'从文件中读出一行
Text1.Text=Text1.Text+inputdata+vbCrLf'文本框显示结果
Count=Count+1
Loop
Text2.Text=Count
Close#1'关闭文件
EndSub
2自定义类型动态数组
运用了了两个自定义类型动态数组,可以对大量数据进行处理,而不仅限于题目所给的有限个数据
自定义类型变量的定义程序如下:
PrivateTypestudType'自定义类型变量的声明
aclassAsString'定义数据类型
ascoreAsInteger
EndType
PrivateTypestudtype1
bclassAsString
bscoreAsInteger
EndType
自定义类型动态数组程序如下:
Open"file11.txt"ForInputAs#1
DimCountAsInteger,SumAsInteger,AverageAsSingle
Dimstud()AsstudType
Dimstud1()Asstudtype1'定义两个动态数组
DoWhileNotEOF
(1)'统计学生数
Input#1,No,Nam,Class,Score
Count=Count+1
Loop
n=Count
ReDimstud(n-1)'根据统计确定数组下标
Close#1
Open"file11.txt"ForInputAs#1
DoWhileNotEOF
(1)
Input#1,No,Nam,Class,Score
Withstud(i)'将每名学生的班级和分数导入数组
.aclass=Class
.ascore=Score
EndWith
i=i+1
Loop
Close#1
3算法
本题关键在于计算各个班级的平均分时如何从全部班级中把不同的班级挑选出来。
在这里,我先将这组数中班级数相同的只保留一个,其他的都强行赋为0值,例如将数组(3,2,6,3,6,5,9,2,8,1,6)可变为(3,2,6,0,0,5,9,0,8,1,0).然后再利用原数组与变换后的数组进行比较,这样就可以将相同班级的同学选出来进行求平均值。
程序段如下:
n=UBound(stud)
Fori=0Ton-1
Ifstud(i).aclass=0ThenGoTonotm
Forj=i+1Ton'将班级号相同的只班留一个,其他赋0值
Ifstud(j).aclass=stud(i).aclassThenstud(j).aclass=0
Else
stud(i).aclass=stud(i).aclass
EndIf
Nextj
notm:
Nexti
ReDimstud1(n)Asstudtype1
i=0
Open"file11.txt"ForInputAs#1'重新打开文件将数据导入另一个动态数组中
DoWhileNotEOF
(1)
Input#1,No,Nam,Class,Score
Withstud1(i)
.bclass=Class
.bscore=Score
EndWith
i=i+1
Loop
Close#1
Count=0
Score=0
Forj=0Ton
Fori=0Ton
Ifstud(j).aclass=stud1(i).bclassThen'通过比较两个数组计算各班平均成绩
Count=Count+1
Score=Score+stud1(i).bscore
EndIf
Nexti
主界面截图
总结
这次课设我的题目是数据统计,通过这次课设让我对顺序文件的打开读取等语句和函数以及自定类型动态数组的应用更加熟练,并且对编程有了更加深刻的理解。
在课设过程中,我遇到了重重困难,例如:
如何把不同的班级从全部班级中挑选出来的算法。
在参考别的同学的基础上,我有总结出了与他们不同的算法,使得程序更加简洁明了,运行更加流畅,完美的解决了题目中所要求的问题。
完整的源程序
Form1
PublicNo$,Nam$,Class$,Score%
PrivateTypestudType
aclassAsString
ascoreAsInteger
EndType
PrivateTypestudtype1
bclassAsString
bscoreAsInteger
EndType
PrivateSubCommand1_Click()
Open"file11.txt"ForInputAs#1
DimCountAsInteger
DoWhileNotEOF
(1)
LineInput#1,inputdata
Text1.Text=Text1.Text+inputdata+vbCrLf
Count=Count+1
Loop
Text2.Text=Count
Close#1
EndSub
PrivateSubCommand2_Click()
Open"file11.txt"ForInputAs#1
DimCountAsInteger,SumAsLong,AverageAsSingle
DoWhileNotEOF
(1)
Input#1,No,Nam,Class,Score
Count=Count+1
Sum=Sum+Score
Loop
Close#1
Average=Sum/Count
Text3.Text=Average
EndSub
PrivateSubCommand3_Click()
Open"file11.txt"ForInputAs#1
DimCountAsInteger,SumAsInteger,AverageAsSingle
Dimstud()AsstudType
Dimstud1()Asstudtype1
DoWhileNotEOF
(1)'统计班级数,定义动态数组
Input#1,No,Nam,Class,Score
Count=Count+1
Loop
n=Count
ReDimstud(n-1)
Close#1
Open"file11.txt"ForInputAs#1
DoWhileNotEOF
(1)
Input#1,No,Nam,Class,Score
Withstud(i)
.aclass=Class
.ascore=Score
EndWith
i=i+1
Loop
Close#1
n=UBound(stud)
Fori=0Ton-1
Ifstud(i).aclass=0ThenGoTonotm
Forj=i+1Ton
Ifstud(j).aclass=stud(i).aclassThen
stud(j).aclass=0
Else
stud(i).aclass=stud(i).aclass
EndIf
Nextj
notm:
Nexti
ReDimstud1(n)Asstudtype1
i=0
Open"file11.txt"ForInputAs#1
DoWhileNotEOF
(1)
Input#1,No,Nam,Class,Score
Withstud1(i)
.bclass=Class
.bscore=Score
EndWith
i=i+1
Loop
Close#1
Count=0
Score=0
Forj=0TonFori=0Ton
Ifstud(j).aclass=stud1(i).bclassThen
Count=Count+1
Score=Score+stud1(i).bscore
EndIf
Nexti
Ifstud(j).aclass<>0Then
Average=Score/Count
Text4.Text=Text4.Text&stud(j).aclass&"班的平均分为:
"&Format(Average,"0.00")&vbCrLf
Else
j=j+1
EndIf
Count=0
Score=0
Nextj
EndSub
PrivateSubCommand4_Click()
i=MsgBox("确定退出?
",1,"警告")
Ifi=1Then
End
EndIf
Text2.SetFocus
EndSub
PrivateSubCommand5_Click()
Text1.Text=""
Text2.Text=""
Text3.Text=""
Text4.Text=""
EndSub
参考文献
[1]龚沛曾杨志强陆慰民.《VisualBasic程序设计教程》.北京:
高等教育出版社,2007年3月第3版