学号姓名英语VB数学
1我自己969899
2李某919667
3王某756768
4赵某686777
(二)将本学期的N门课程及其学分(16学时为1个学分)输入到另一个数据文件(文件类型同上题)中,建议按如下形式存放:
编号课程名称课程学分
1英语5.0
2VB程序3.5
3数学4.5
(三)请编写一个简单的学生成绩管理程序,要求完成以下功能:
1)根据以上两文件内容分别计算每个学生N门课的加权平均分(保留两位小数,四舍五入),按平均分排列名次,平均分相同则名次并列,如第1,2,2,4,5,5,7……名。
用VB创建一个数据文件,存放班级的成绩表,建议按以下形式存放。
学号姓名英语VB数学平均成绩名次
1我自己96989980.52
2李某91966778.23
3王某75676888.81
4赵某68677768.54
2)分别统计全班每门课的平均分,并计算各分数段(60分以下;60---69;70---79;80---89;90分以上)的学生人数。
用创建一个新的数据文件,在该文件中存放数据的格式如下:
范围英语VB………………
>=9035………………
80—901012………………
……………………………………………
3)打印每名学生成绩条(并将结果存放到用VB创建的一个新的数据文件中)。
4)打印所有存在不及格课程学生的名单(含学号,不及格课程名称,课程的学分及成绩)。
5)打印优等生名单(含学号,N门课程成绩,平均分,名次)。
优等生条件:
A)平均分>=90
B)名次在全班位于前三名
C)平均分>=85,并且有二门课的成绩都>=95
三.系统设计流程图
四分析设计与说明:
(一):
首先,在记事本上输入两份文件,即学生成绩表和课程学分表
(二):
存放学生的一些基本信息,如姓名,学号,成绩等,这就要在VB中通过自定义类型来解决.
(三):
在标准模块中定义了学生的学号、姓名、各科的成绩和课程的名称和它对应的学分。
(四):
加权平均分用了双循环,排名用了数组的选择法,多循环等,每门课的平均分声明了两个数组加上双循环,求各分数段的学生人数是定义一个二维数组,读取相应的原始文件,每个学生的成绩是结合平均分和班级名次代码求的,求优等生名单时定义一个逻辑字符并用选择语句求的。
五.系统分析与实现过:
(一)部分过程(函数)的源程序清单;
程序调试过程中遇到的问题及解决办法
由于每项信息的意义不同,数据类型也不同,但还要同时作为一个整体来描述和处理,这种情况在VB中通过自定义类型来解决。
在练习中将自定义过程放在模块中实现。
VB中自定义类型通过Type语句来实现,形式如下:
Type自定义类型名
元素名1As数据类型名
…………
元素名2As数据类型名
EndType
此次实习中定义的自定义过程如下:
Typexscjb
xhAsString*3
xmAsString*4
cj(1To4)AsSingle
averAsSingle
rankAsSingle
EndType
Typescore
bhAsString
kcAsString
xfAsInteger
EndType
Functionspace1(ByValsssAsString)
Dimx%
x=InStr(sss,"")
DoWhilex>0
sss=Replace(sss,"","")
x=InStr(sss,"")
Loop
space1=sss
EndFunction
(二):
将两份txt文件中的内容读到程序中,一份是学生成绩表,一份是各个学科的学分。
此次过程中用到input,其中要注意到两点:
1.要实现数据读入,输出,用lineinput时应采用循环结构,即边读边打印。
2.对数据处理,要注意数据类型。
学生成绩表的读入:
PrivateSubinformation_Click()
Dimst$(),stri$
Open"D:
\MyDocuments\课设\学生成绩.txt"ForInputAs#1
n=0
LineInput#1,str1
Printstr1
DoWhileNotEOF
(1)
n=n+1
ReDimPreservestu(n)
LineInput#1,str1
str1=Trim(str1):
str1=space1(str1)
st=Split(str1,"")
stu(n).xh=st(0):
stu(n).xm=st
(1)
stu(n).cj
(1)=st
(2):
stu(n).cj
(2)=st(3)
stu(n).cj(3)=st(4):
stu(n).cj(4)=st(5)
PrintSpace
(1);stu(n).xh;Space(4);stu(n).xm;
PrintSpace(3);stu(n).cj
(1);Space(3);stu(n).cj
(2);
PrintSpace(3);stu(n).cj(3);Space(3);stu(n).cj(4)
Loop
Close#1
EndSub
学分的打印:
PrivateSubsubject_Click()
Cls
Open"D:
\MyDocuments\课设\学分.txt"ForInputAs#2
Dimn%,i%
n=5
Fori=1Ton
LineInput#2,str1:
Printstr1“循环结构打印”
Nexti
Close#2
EndSub
在分割字符串之前先定义了一个函数过程space1,此过程的作用是将两个字符串之间的多个空格都改为一个。
此过程的思想是在一行中查找两个空格,然后用一个空格将两个空格替换。
循环若干次后变可以将多个空格改为一个空格,以便于下一步进行。
程序代码如下:
PublicFunctionspace1(ByValsssAsString)'自定义函数过程
Dimx%
x=InStr(sss,"")'查找两个空格
DoWhilex>0'找到两个空格
sss=Replace(sss,"","")'用一个空格取代两个空格
x=InStr(sss,"")'继续查找两个空格
Loop
space1=sss'函数返回值
EndFunction
成绩表和课程学分显示结果
(三)计算加权分,此时需要将四门课学分读入,用一个动态数组将各科的学分存储在其中。
学分的读入:
PrivateSub加权average_Click()
Cls
Dimst$(),stri$,cd$()
Open"D:
\MyDocuments\课设\学分.txt"ForInputAs#2
n=0
DoWhileNotEOF
(2)
n=n+1
ReDimPreservesb(n)
LineInput#2,str2
str2=Trim(str2):
str2=space1(str2)
cd=Split(str2,"")
sb(n).bh=cd(0)
sb(n).kc=cd
(1)
sb(n).xf=Val(cd
(2))注意此时应将字符型数据转化为数值型
Loop
求加权平均分:
Open"D:
\MyDocuments\课设\学生成绩.txt"ForInputAs#1
LineInput#1,str1
Printstr1&"平均分"
n=0
DoWhileNotEOF
(1)
n=n+1
ReDimPreservestu(n)
LineInput#1,str1
str1=Trim(str1):
str1=space1(str1)
st=Split(str1,"")
stu(n).xh=st(0):
stu(n).xm=st
(1)
stu(n).cj
(1)=st
(2):
stu(n).cj
(2)=st(3)
stu(n).cj(3)=st(4):
stu(n).cj(4)=st(5)
stu(n).aver=(stu(n).cj
(1)*sb
(1).xf+stu(n).cj
(2)*sb
(2).xf+stu(n).cj(3)*sb(3).xf+stu(n).cj(4)*sb(4).xf)/(sb
(1).xf+sb
(2).xf+sb(3).xf+sb(4).xf)
PrintSpace
(1);stu(n).xh;Space(4);stu(n).xm;
PrintSpace(3);stu(n).cj
(1);Space(3);stu(n).cj
(2);
PrintSpace(3);stu(n).cj(3);Space(3);stu(n).cj(4);Space(4);Format(stu(n).aver,"00.00")
Loop
加权平均分运行结果
(四)计算排名
1.利用算出来的加权平均分来排名
2.将每个人的名次构成一个数组
PrivateSubrank_Click()
Cls
Dimst$(),stri$,cd$(),i%,j%,k%
Dimrank()AsInteger
Open"D:
\MyDocuments\课设\学分.txt"ForInputAs#2
n=0
DoWhileNotEOF
(2)
n=n+1
ReDimPreservesb(n)
LineInput#2,str2
str2=Trim(str2):
str2=space1(str2)
cd=Split(str2,"")