VB程序设计语言 主讲教师:王 杨
数组算法 最值 排序 查找
作 业 西南石油大学有15个院系进行合唱比赛,总共邀请了13名评委打分。打分规章是去掉一个最高分,去掉一个最低分,剩下求平均分,要求: 作 业 西南石油大学有15个院系进行合唱比赛,总共邀请了13名评委打分。打分规章是去掉一个最高分,去掉一个最低分,剩下求平均分,要求: 13个评委打分使用文本框控件数组,其余界面自行设计 根据评委打分计算出每个学院的最后成绩并将名次和成绩输出在窗体上 输入任意一个学院的名字查询其得分
思 考 如果每个院系信息还包括学院编号、指导教师、歌曲名称信息。查询时候要求输入学院编号则输出该院系所有信息,应该怎么办?
引例 输入5个学生的学号、姓名和3门课的成绩,计算每个学生的总分和平均分,在窗体上显示学生的总分和平均分。 学号 姓名 成绩1 成绩2 成绩3 总分 平均分 001 Li 89 88 87 264 002 Liu 90 91 92 273 003 Qiu 78 79 80 228 004 Xie 85 86 84 255 005 Mao 64 65 63 195
自定义数据类型 Type student no As String * 3 name As String * 8 学号 姓名 成绩1 成绩2 成绩3 总分 平均分 001 Li 89 88 87 264 Type student no As String * 3 name As String * 8 mark(1 to 3) As integer total as integer aver As Integer End Type a.aver 88 a.total 264 a.mark(3) 87 a.mark(2) a.mark(1) 89 a.name "Li" a.no 001 Type 自定义类型名 元素名1[(下标)] As 类型名 … [元素名2[(下标)] As 类型名] End Type Dim a As Student
Type 自定义类型名 元素名1[(下标)] As 类型名 … [元素名2[(下标)] As 类型名] End Type 自定义数据类型定义位置 1、标准模块中定义,默认为Public 2、窗体层定义,需要加上Private
a(1).aver 88 a(1).total 264 a(1).mark(3) 87 a(1).mark(2) a(1).mark(1) 89 a(1).name "Li" a(1).no 001 Type student no As String * 3 name As String * 8 mark(1 to 3) As integer aver As Integer End Type Dim a(1 To 5) As Student For i=1 to 5 a(i).no=Inputbox(“姓名”) a(i).name=inputbox(“姓名”) a(i).mark(1)=inputbox(“成绩1”) a(i).mark(2)=inputbox(“成绩2”) a(i).mark(3)=inpuxbox(“成绩3”) a(i).aver= (a(i).mark(1)+ a(i).mark(2)+ a(i).mark(3))/3 Next i
思考题 使用自定义类型数组,输入5个学生的学号、姓名 和4门课的成绩,计算每个学生的总分和平均分。 并按平均成绩从高到低输出每个学生的学号、姓 名、每门课的成绩,总分和平均分。
引例 计算(n!+m!)/(n+m)! w = (f(n)+f(m))/f(m+n) w=(a+b)/c Private Funciton f(y as integer) f = t End function n=val(inputbox(“输入数据n”)) m=val(inputbox(“输入数据m”)) a = 1 :b=1:c=1 For i = 1 to n a=a*i Next I For i = 1 to m b=b*i For i = 1 to n+m c=c*i Privat sub cmd1_click( ) n= val(inputbox(“输入n”)) m= val(inputbox(“输入m”)) w1 = f(n) w2 = f(m) w3 = f(m+n) w = (w1+w2)/w3 print w End sub t= 1 For i= 1 to y t=t*i Next i w = (f(n)+f(m))/f(m+n) w=(a+b)/c
【例】1!+2!+…+10! Private Sub Command1_Click() dim i as integer for i = 1 to 10 s=s+f(i) next i End Sub Private function f (n as integer) f = 1 for i = 1 to n f=f*i next i End function
【举例】计算多边形的面积 变量=函数过程名([实参表]) Function area(x!,y!,z!) As Single Dim c! End Function Dim c! c=1/2*(x+y+z) area=sqr(c*(c-x)*(c-y)*(c-z)) Private Sub Form_Click() Dim a!,b!,c!,d!,e!,f!g,! a=11:b=12:c=13:d=14:e=15:f=16:g=17 End Sub S1=area( a, b , c) S2=area( c, d , e) S3=area( e, f , g) 变量=函数过程名([实参表])
Function 格式 窗体通用处 标准模块 手动写过程 工具菜单 [Private|Public][Static] Function 函数过程名 ([形参表]) [As 类型] …… [Exit function] ……. 函数过程名=表达式 End Function 窗体通用处 标准模块 手动写过程 工具菜单
不计算某个结果 计算多个结果 【思路】一元二次方程的一般式为 它的两个根可以由 Sub quad( ) , y1, y2 思考:已知a,b,c;计算任意一元二次方程的两个实根 【思路】一元二次方程的一般式为 它的两个根可以由 Sub quad( ) End Sub a!, b!, c! , y1, y2 y1 = (-b + Sqr(b * b - 4 * a * c)) / (2 * a) y2 = (-b - Sqr(b * b - 4 * a * c)) / (2 * a) Sub Command1_Click() dim x!,y!,z! x=2:y=8:z=4 Call quad(x, y, z ) root1 = x1: root2 = x2 End Sub 不计算某个结果 计算多个结果 ,x1!, x2! , x1, x2
Sub 子过程 Call test (a,b) Test a,b 子过程名没有返回值 在子过程体内不能给子过程名赋值 [Private|Public][Static] Sub 子程序过程名 [(形参表)] …… [Exit Sub] End Sub 子过程名没有返回值 在子过程体内不能给子过程名赋值 子过程的调用是一个独立的语句 Call test (a,b) Test a,b
函数过程和子过程 区别 函数过程名有值,有类型,在函数体内至少赋值一次 子过程名无值,无类型,在子过程体内不能对子过程名赋值 调用时,子过程调用是一句独立的语句 函数过程不能作为单独的语句加以调用,必须是表达式运算 当过程有一个函数值,使用函数过程较直观 若过程无返回值,或有多个返回值,使用子过程较直观
程序运行流程: Private Sub Command1_Click() Dim f1#, f2# f1 = jishu1(2#, 0.000001) Call jishu2(f2, 2#, 0.000001) Print "f1="; f1, "f2 = "; f2 End Sub Function jishu1(x!, a#) As Doubl … jishu1=表达式 End Function 找函数名调用jishu1 ② ① 函数名带了值返回 ③ ④ Sub jishu2(s#, x!, a#) … s=表达式 End Sub 找子过程名调用jishu2 ⑥ ⑤ ⑦ ⑧
问 题 实参可以是? 参数能否是数组?
数组参数传递 调用tim,求 和 Function tim(a() As Integer) Dim t#, i% t = 1 For i = Lbound(a) To Ubound(a) t = t * a(i) Next i tim = t End Function Sub Command1_Click() Dim a%(1 To 5),b%(3 To 8) 给数组赋值 t1# = tim(a()) t2 # = tim(b()) Print t1, t2 End Sub
加分作业 编写过程,界面自行设计。单击命令按钮时,对任意数组进行升序排序。
加分作业 编写程序,打印100-200之间的所有素数 每行输出5个素数 利用Function过程判断每个数是否为素数,是返回1,不是返回0