一、 求最大值、最小值 思路:
在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该二、数据排序
例4:已知两个数x和y,比较它们的大小,使得x大于y。 (1) If x 例1: 输入三个数,打印输出其中最大的数。 将三个数依次输入到变量A、B、C中,设变量MAX存放最大数。其算法如下: 1) 输入A、B、C。 2) A与B中大的一个放入MAX中。 3) 把C与MAX中大的一个放入MAX中。 4) 输出MAX,MAX即为最大数。 写出程序代码: 例2: 输入10个数,打印输出其中最大的数。 算法设计如下: (1)输入1个数,存入变量A中,将记录数据个数的变量N赋值为1,即N=1 (2)将A存入表示最大值的变量Max中,即Max=A (3)再输入一个值给A,如果A>Max 则 Max=A, 否则Max不变 (4)让记录数据个数的变量增加1,即N=N+1 (5)判断N是否小于10,若成立则转到第(3)步执行,否则转到第(6)步。 (6)打印输出max 写出程序代码: 例3:随机产生10个100~200之间的数,求最大值。 Private Sub Command1_Click() Max = 100 For i = 1 To 10 x = Int(Rnd * 101 + 100) Print x; If x > Max Then Max = x Next i Print Print \"最大值=\"; Max End Sub x=y y=t End If (2)If x (1) 用一个IF语句和一个嵌套的IF语句实现: If x If x 编写一个函数reverseDight(By Val num as Integer)。该函数将整数num的每个位上的数字逆序排列后返回。 dim a as string , b as string, s as string b = cstr(num) For i = 1 To Len(b) s = Mid(b, i, 1) a = s & a Next i reverseDight = cint (a) 1 x < yFT x 与y交换 x >yy < zF x >y>zT y 与z交换 z为最小数x< yFT x 与y交换 使得x >y VB程序设计归类 1.选择法排序(升序) 基本思想: 1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置; 2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置; 3)依次类推,选择了n-1次后,这个数列已按升序排列。 程序代码如下: For i = 1 To n - 1 imin = i For j = i + 1 To n If a(imin) > a(j) Then imin = j Next j temp = a(i) a(i) = a(imin) a(imin) = temp Next I 例 由计算机产生10个0~100之间的随机整数,使用选择法排序,将这些数按递增的顺序排列。(纠正课本错误) Dim a(1 To 10) As Integer For i = 1 To 10 a(i) = Int(Rnd * 100) + 1 Print a(i); Next i For i = 1 To 9imin = iFor j = To 10i + 1If a(j) < a(imin) Then imin = jend ifNext jt = a(i)a(i) = a(imin)a(imin) = tNext i 2.冒泡法排序(升序) 基本思想:(将相邻两个数比较,小的调到前头) 1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次 两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”; 2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后 得次大的数; 3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。 程序段如下 For i = 1 To n - 1 For j = 1 To n-i If a(j) > a(j+1) Then temp=a(j): a(j)=a(j+1): a(j+1)=temp End if Next j Next i 3.合并法排序(将两个有序数组A、B合并成另一个有序的数组C,升序) 基本思想: 1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组; 2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比 较过程,直到某个数组被先排完; 3)将另一个数组剩余元素抄入C数组,合并排序完成。 程序段如下: Do While ia <= UBound(A) And ib <= UBound(B) '当A和B数组均未比较完 If A(ia) < B(ib) Then C(ic) = A(ia): ia = ia + 1 Else C(ic) = B(ib): ib = ib + 1 End If ic = ic + 1 Loop Do While ia <= UBound(A) 'A数组中的剩余元素抄入C数组 C(ic) = A(ia) ia = ia + 1: ic = ic + 1 Loop Do While ib <= UBound(B) 'B数组中的剩余元素抄入C数组 C(ic) = B(ib) ib = ib + 1: ic = ic + 1 Loop 2 VB程序设计归类 Print N; \" 不是素数\" End If 三、 累加和连乘 :例6: 1~100的5或7的倍数的和 Sum = 0 For i = 1 To 100 If i Mod 5 = 0 Or i Mod 7 = 0 Then Sum = Sum + i End If Next i 例9:求100以内素数的代码 For m = 2 To 100 For i = 2 To m - 1 If (m Mod i) = 0 Then Exit For Next i Print m Next m Print Sum 例7:求3~10的乘积 t = 1 For i =3 To 10 t = t * i Next i Print t 五、 求最大公约数和最小公倍数 分析:求最大公约数的算法思想: (1)对于已知两数m,n,使得m>n; (2) m除以n得余数r; (3)若r=0,则n为最大公约数结束;否则执行(4); (4)m←n,n←r,再重复执行(2)。 1. 辗转相减法: 以m=14,n=6为例,求最大公约数 四、 求素数 算法思路: 素数指除了能被1和自身外,不能被其他整数整除的自然数。判断整数N是不是素数的基 本方法是:将N分别除以2,3,…,N-1,若都不能整除,则N为素数。因为N=Sqr(N)*Sqr(N),所以,当N能被大于等于Sqr(N)的整数整除时,一定存在一个小于等于Sqr(N)的整数,使N能被它整除,因此只要判断N能否被2,3,…,Sqr(N)整除即可。 例8:判断一个数是否为素数 Dim N %, I%, K% N = Val(InputBox(\"N=?\")) K= Int(Sqr(N)) For I = 2 To K If N Mod I = 0 Then Exit For Next I If I>K Then Print N; \" 是素数\" Else Do While m <> n m n If m > n Then 14 6 m = m – n 8 6 Else 2 6 n = n – m 2 4 End If 2 2 Loop 3 VB程序设计归类 2. 辗转相除法: If m < n Then t = m: m = n: n = t r=m mod n Do While (r <> 0) m n r m=n 14 6 2 n=r 6 2 0 r= m mod n Loop MsgBox “最大公约数=” & n 3. 最小公倍数=最大公约数/两数之积 六、有规律的输出 1. 试编写打印下面图案的源程序。 * * * * * * * * * * * * * * * 【参考答案】 程序代码设计 Private Sub Command1_Click() For i = 1 To 5 Form1.Print Tab(5 + i); For j = i To 5 Form1.Print \"*\"; Next j Form1.Print Next i End Sub 程序运行结果如图所示: 2. 试编写打印下面图案的源程序。 * * * * * * * * * * * * * * * * * * * * * * * * * 【参考答案】 程序代码设计 Private Sub Command1_Click() For i = 1 To 4 Form1.Print Tab(10 - i); For j = 1 To 2 * i - 1 Form1.Print \"*\"; Next j Form1.Print Next i For k = 3 To 1 Step -1 Form1.Print Tab(10 - k); For j = 1 To 2 * k - 1 Form1.Print \"*\"; Next j Form1.Print 3. 点击command1在弹出来的inputbox输入行数(偶数),输入2就会输出阵列: * * 输入4就会输出阵列: * *** *** * 如输入8就会输出阵列: 4 VB程序设计归类 * *** ***** ******* ******* ***** *** * 第一行的*前空19个空格 参考代码: Private Sub Command1_Click() Dim n, m As Integer n = Val(InputBox(\"请输入小于20的偶数\")) If n Mod 2 <> 0 Or n > 20 Then MsgBox \"输入有误\": Exit Sub For i = 1 To n '循环几行 m = n / 2 - Abs(n / 2 - i) '双金字塔规律 If i >= Int(n / 2) + 1 Then m = m + 1 '按照你的要求,使中间两行*号一样 Print Space(20 - m); '第一行输入19个空格 For j = 1 To m * 2 - 1 Step 1 '输入*号 Print \"*\"; Next j Print Next i End Sub 七、其他: 综合应用-试凑法 例4.19 百元买百鸡。假定小鸡每只5角,公鸡每只2元,母鸡每只3元,编程求解购鸡方案。 分析: (1) 设母鸡、公鸡、小鸡各为x、y、z,列出方程为: x+y+z= 100 3x+2y+0.5z = 100 三个未知数,两个方程,此题求若干个整数解。 (2) 计算机求解此类问题,采用试凑法(也称穷举法)来实现,即将可能出现的各种情况一一罗列测试,判断是否满足条件,采用循环结构来实现。 综合应用-递推法 递推(迭代)法基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次都从旧值的基础上递推出新值,并由新值代替旧值。 例4.20 小猴有桃若干,第一天吃掉一半多一个;第二天吃剩下桃子的一半多一个;以后每天都吃尚存桃子的一半多一个,到第7天只剩一个,问小猴原有桃多少? 分析:用后一天的数推出前一天的桃子数。设第n天的桃子为xn,是前一天的桃子的二分之一减去1。 1 即:xn2xn11也就是:xn1(xn1)2几种循环语句的比较: For....to Do while/until.... Do .... Next Loop Loop While/until... 循环类型 当型循环 当型循环 直到循环 循环控制 循环变量大于条件成立/不成立条件成立/不成立条件 或小于终值 执行循环 执行循环 循环变量 在FOR语句 初值 行中 在DO之前 在DO之前 使循环结束 For语句中无需专门语句 必须用专门语句 必须使用专门语句 使用场合 循环次数容易循环/结束控制条循环/结束控制条确定 件易给出 件易给出 5 因篇幅问题不能全部显示,请点此查看更多更全内容