当前位置:文档之家› 数组的综合应用例子

数组的综合应用例子

数组的综合应用例子数组的综合应用为了加深对数组的理解,下面结合一些常用算法的编程来更加深入地学习和使用数组。

由于一维数组和二维数组是程序设计中最常用的数组形式,因此这里的举例均为一维和二维数组。

1.数组元素的输入和输出[例5-12] 由用户输入5个数组元素的值并把它们输出在窗体上。

Option ExplicitPrivate Sub Command1_Click()Dim a(1 To 5) As Integer, i As IntegerFor i=1 To 5a(i)=InputBox("请输入第" & Str(i) & "个元素")NextFor i=1 To 5Print "a (";i; ")="; a(i)NextEnd Sub程序运行后,单击命令按钮,执行事件过程Command1_Click。

若输入5个值10,20,30,40,50,则窗体上显示的输出结果是:a(1)=10a(2)=20a(3)=30a(4)=40a(5)=50程序中声明了一个具有5个元素的一维整型数组,分别用循环语句输入、输出数组元素的值。

在循环体内,数组元素用循环控制变量i作下标,i值的不同就表示数组元素的不同。

在程序中引用数组元素时,其下标可以使用表达式。

只要表达式的结果不超出数组定义的上界和下界范围,下标表达式就是合法的。

例如本例中,若i=2,则:a(i+1)的值为30;a(a(i+3)\10)的值为50。

下标表达式的值还可以是实数,此时VB将自动对其进行四舍五入取整。

例如:a(1+0.4)的值是10;a(2+0.5)的值30。

2.数组元素插入删除算法说明:数组中元素的插入和删除一般是在已固定序列的数组中插入或删除一个元素,使得插入或删除操作后的数组还是有序的。

基本思路:首先要找到插入位置或要删除的元素,然后以此位置为基准对后续元素进行移位。

[例5-12]数组元素的插入。

把14插入到有序数列1,4,7,10,13,16,19,22,25,28中,如图5-10所示。

图5-10数组元素的插入代码如下:Private Sub Command1_Click()Dim a(10) As IntegerDim i As Integer,k As IntegerFor i = 0 To 9 '生成数组a(i) = i * 3 + 1Print a(i);Next iPrintPrint "插入14"For k = 0 To 9 '查找插入14在数组中的位置If 14 < a(k) Then Exit ForNext kFor i = 9 To k Step -1 '从最后元素开始逐个后移,腾出位置a(i + 1) = a(i)Next ia(k) = 14 '插入数14For i = 0 To 10Print a(i);Next iPrintEnd Sub[例5-13]数组元素的删除。

把有序数列1,4,7,10,13,16,19,22,25,28中元素13删除,如图5-11所示。

图5-11数组元素的删除代码如下:Dim a() as integerFor i = 1 To 10 '生成数组ReDim a(1 to i)a(i) = (i-1) * 3 + 1Print a(i);Next iPrintPrint "删除13"For k = 1 To 10 '查找13在数组中的位置If a(k) = 13 Then Exit ForNext kFor i = k + 1 To 10 '从13所在位置的下一个元素开始逐个前移a(i - 1) = a(i)Next iRedim preserve a(1 to 9)For i = 1 To 9Print a(i);Next iPrint3.求素数素数是除了1和它本身之外再不能被其他数整除的自然数。

由于找不到一个通项公式来表示所有的素数,所以对于数学家来说,素数一直是一个未解之谜,几百年来不知吸引了世界上多少优秀的数学家。

尽管他们苦心钻研,呕心沥血,但至今仍然未见分晓。

自从有了计算机之后,人们借助于计算机的威力,已经找到了以内的所有素数。

求素数的方法有很多种,最简单的方法是根据素数的定义来求。

对于一个自然数N,用大于1小于N的各个自然数都去除一下N,如果都除不尽,则N为素数,否则N为合数。

但是,如果用素数定义的方法来编制计算机程序,它的效率一定是非常低的,其中有许多地方都值得改进。

1)对于一个自然数N,只要能被一个非1非自身的数整除,它就肯定不是素数,所以不必再用其他的数去除。

2)对于N来说,只需用小于N的素数去除就可以了。

例如,如果N能被15整除,实际上就能被3和5整除,如果N不能被3和5整除,那么N也决不会被15整除。

3)对于N来说,不必用从2到N-1的所有素数去除,只需用小于等于的所有素数去除就可以了。

这一点可以用反证法来证明:如果N是合数,则一定存在大于1小于N的整数d1和d2,使得N=d1×d2。

如果d1和d2均大于,则有:N=d1×d2>×=N。

而这是不可能的,所以,d1和d2中必有一个小于或等于。

第二种求素数的方法是用筛法求素数。

此法称厄拉多塞筛法。

厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2~N的各数写在纸上,并在在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数是5,将它画圈,并划去5的其他倍数……,依次类推,直到所有小于或等于N的各数都画了圈或划去为止。

这时,表中画了圈的以及未划去的那些数正好就是小于N的素数。

这种方法很像一面筛子,把满足条件的数留下来,把不满足条件的数筛掉。

在计算机中,筛法可以用给数组单元置零的方法来实现。

具体来说就是:首先声明一个数组a(i),i=1,2,3,…,同时,令所有的数组元素都等于下标值,即a (i)=i,以生成1~N的自然数。

并根据以上做法,令i不是素数的元素a(i)=0(即划去该数)。

输出结果时,只要判断a(i)是否等于零即可。

筛法是计算机程序设计中常用的算法之一。

第三种方法是用6N±1法求素数。

任何一个自然数,总可以表示成为如下的形式之一:6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,…)显然,当N≥1时,6N,6N+2,6N+3,6N+4都不是素数,只有形如6N+1和6N+5的自然数有可能是素数。

所以,除了2和3之外,所有的素数都可以表示成6N±1的形式(N为自然数)。

根据上述分析,我们可以构造另一面筛子,只对形如6 N±1的自然数进行筛选,这样就可以大大减少筛选的次数,从而进一步提高程序的运行效率和速度。

在程序上,我们可以用一个二重循环实现这一点,外循环i按3的倍数递增,内循环j为0~1的循环,则2(i+j)-1恰好就是形如6N±1的自然数。

[例5-14]用素数定义求N以内的素数。

在窗体上放置txtN和txtP两个文本框、一个标签、两个选项按钮、一个名为cmdStart的命令按钮,txtN用于N,txtP用于输出结果。

txtP的MultiLine属性设为True,Scrollbar设为Horizontal。

按钮的Click事件代码如下:Option ExplicitPrivate Sub cmdStart_Click()Dim i As Long, j As Long, k As LongDim NonP As BooleanDim PrimeNumber() As Long '存放素数k = 0ReDim PrimeNumber(0)PrimeNumber(0) = 2 '2是最小素数For i = 3 To txtNNonP = FalseFor j = 2 To Sqr(i)If i Mod j = 0 Then '判断i是否可被j整除NonP = TrueExit ForEnd IfNext jIf Not NonP Thenk = k + 1ReDim Preserve PrimeNumber(k)PrimeNumber(k) = iEnd IfNext itxtP = "" '清空显示结果文本框For i = 0 To UBound(PrimeNumber) '显示结果,每行3个If (i + 1) Mod 3 = 0 ThentxtP = txtP & PrimeNumber(i) & vbCrLfElsetxtP = txtP & PrimeNumber(i) & vbTabEnd IfNext iEnd Sub程序中vbCrLf和vbTab是VB内置常量,分别代表回车换行和Tab。

图5-12是求10000以内素数的运行结果。

图5-12定义法求素数[例5-15]用筛法求N以内的素数。

窗体设计同[例5-14],程序清单如下:Option ExplicitPrivate Sub cmdStart_Click()Dim i As Long, j As Long, k As LongDim PrimeNumber() As LongReDim PrimeNumber(1 To txtN)For i = 1 To txtN '生成1~N的自然数PrimeNumber(i) = iNext iPrimeNumber(1) = 0 '1不是素数For i = 2 To Sqr(txtN)If PrimeNumber(i) <> 0 ThenFor j = i + 1 To txtNIf PrimeNumber(j) <> 0 And j Mod i = 0 ThenPrimeNumber(j) = 0 '划去素数的倍数End IfNext jEnd IfNext itxtP = ""k = 0For i = 1 To UBound(PrimeNumber)If PrimeNumber(i) <> 0 Then '非0的是素数k = k + 1If k Mod 3 = 0 ThentxtP = txtP & PrimeNumber(i) & vbCrLfElsetxtP = txtP & PrimeNumber(i) & vbTabEnd IfEnd IfNext iEnd Sub求10000以内素数的运行结果如图5-13所示。

相关主题