【vb第八章《数组》课后习题 求指正】

1、从键盘上输入10个整数,并放入一个一维数组中,然后将其前5个元素与后5个元素对换,即:第1个元素与第10个元素互换,第2个元素与第9个元素互换……第10个元素与第1个元素互换。分别输出数组原来各元素的值和对换后各元素的值。

蛮简单的题,po一下交换元素的代码段吧。我的解法:

For i = 0 To 9
  Print a(i);
Next i
Print
For i = 0 To 9
  For j = 9 To 0 Step -1
    If i + j = 9 Then
     t = a(i)
     a(i) = a(j)
     a(j) = t
     swit = swit + 1
    End If
    If swit = 5 Then Exit For
  Next j
Next i

因为不怎么过脑子,mong用0到9做了。但是这里需要引入一个swit,即交换5次后跳出循环。否则i=0,j=9交换一次,而后i=9,j=0又交换一次,恭喜达成白费功夫成就。

相比之下,如果用i=0 to 4,j= 5 to 9来做的话就不需要考虑这么多了,一定是脑袋瓦特了。。。

2、有一个n*m的矩阵,编写程序,找出其中最大的那个元素所在的行和列,并输出其值及行号和列号。

Option Explicit
Dim a() As Integer
Dim n As Integer, m As Integer, i As Integer, j As Integer
Dim t As Integer, c As Integer, b As Integer

Private Sub Form_click()
n = InputBox("输入你矩阵的行数:")
m = InputBox("然后是你矩阵的列数:")
ReDim a(n, m) As Integer '定义一个以变量为上界的数组须在过程中使用redim定义

For i = 1 To n '因为本题数组以1开始会比较方便,但因无法使用option base 1 和1 to n,只能不给数组的0行0列赋值
  For j = 1 To m
    a(i, j) = InputBox("请输入数组第" & i & "行第" & j & "列元素值") 'inputbox里用&连接字符串和变量
    a(i, j) = Val(a(i, j))
  Next j
Next i

t = a(1, 1)
For i = 1 To n
  For j = 1 To m
    If a(i, j) > t Then
    t = a(i, j)
    c = i
    b = j
    End If
  Next
Next

Print "你给我的矩阵是:"
For i = 1 To n
 For j = 1 To m
   Print a(i, j);
 Next j
Print '与上两行的分好一起控制好换行,保证输出的是矩阵
Next i

Print "你矩阵中最大的数字是"; t; "它位于第"; c; "行 "; "第"; b; "列"
End Sub

养成定义变量以后赋初值的习惯。(如果改用如上篇博客所说从0开始循环,需要给c和d赋以1的初值。否则当第一个数是最大数时,就会打印出“它位于第0行第0列”。)因为没有数比a(0,0)更大,也就不会执行if语句里面的c=i+1了。习惯的话,主要是vb是不要求赋初值但其他语言比如c就要求赋值。所以像定义一样可能会麻烦一点但还是做一下比较好。(● ̄(エ) ̄●)

注释里的“无法使用……”这里不知道是什么毛病。反正用了它就提示出错。我摔!

定义一个以变量为上界的数组须在过程中使用redim定义,且这个redim语句必须放在所使用的变量赋值语句之后

可读性很重要可读性很重要可读性很重要!!!这里29—35行输出矩阵本身不是题目要求但为了检验程序正误,还是必要的

3、有如下人员名册:
姓名     性别   年龄 文件程序   籍贯
张得功   男     24   大学本科   河北
……
编写一个程序,对该名册进行检索。程序运行后,只要在键盘上输入一个人名,就可以在屏幕上显示出这个人的情况。要求: 
(1)使用动态数组,输入的人数可以根据实际情况改变。
(2)当检索名册中不存在的人名时,输出相应的信息。  
(3)每次检索结束后,询问是否继续检索,根据输入的信息确定是否结束程序。

Option Explicit
Dim i As Integer, j As Integer, swit As Integer
Dim p As Integer, n As String, t As Integer, con As Integer
Dim arr


Private Sub form_click()
p = InputBox("该名册的人数")
ReDim arr(1 To p, 1 To 5) As String
For i = 1 To p
arr(i, 1) = InputBox("输入第" & i & "个人的姓名")
 For j = 2 To 5
  arr(i, j) = InputBox("输入" & arr(i, 1) & "的身份信息")
 Next j
Next i
Print "姓名     性别     年龄       文化程度     籍贯"
again:
swit = 0
n$ = InputBox("检索人名:")
For i = 1 To p
 For j = 1 To 5
  If arr(i, j) = n$ Then
   For t = 1 To 5
   Print arr(i, t); Spc(8);
   Next t
   swit = 1
  End If
 Next j
Print
Next i

If swit = 0 Then MsgBox ("本名册里没有你要的人,你走吧")
con = MsgBox("是否继续检索?", 36)
If con = 6 Then GoTo again
If con = 7 Then End
End Sub

 我承认msgbox我去翻前面书了。。。/crying……

我的做法在输入名册的时候比较废柴,必须一个个数着信息输入。但是答案这样做就很nice:

Dim arr(), s
    s = Array("姓名", "性别", "年龄", "文化程度", "籍贯")
    n = InputBox("请输入人数")
    n = Val(n)
    ReDim arr(n, 5)
    Print
    For i = 1 To n
        For j = 1 To 5
            arr(i, j) = InputBox("请输入第" & i & " 个人的" & s(j))
        Next j
    Next i

除储存名册的数组以外再做一个输入时提示用的数组,避免对输入者造成困扰。啊我现在就很困扰orz  

4、某单位开运动会,共有10人参加男子100米短跑,运动员和成绩如下: 
  207号   14.5秒       077号   15.1秒       156号   14.2秒       231号   14.7秒       453号   15.2秒  

  276号   13.9秒       096号   15.7秒       122号   13.7秒       339号   14.9秒       302号   14.5秒

 编写程序,按成绩排出名次,并按如下格式输出:
     名次        运动员       成绩
      1          ......       ....
      2          ......       ....
      3          ......       ....
      ..         ......       ....
      10         ......       .... 

第一个WA:想用冒泡排序做这题,应该是排序的部分错了。有空找一下错哪了。。。

Option Explicit
Dim p(9, 1)
Dim i As Integer, j As Integer, t As String, x As Integer, m As Integer

Private Sub Form_click()
For i = 0 To 9 '输入数据
 For j = 0 To 1
  If j = 0 Then
  t = "依次输入运动员序号:"
  Else
   t = "输入这个运动员的成绩(单位:s):"
  End If
  p(i, j) = InputBox(t)
 Next j
Next i

For i = 9 To 2 Step -1 '冒泡排序
  For j = 0 To i - 1
   If p(j, 1) > p(j + 1, 1) Then
    For m = 0 To 1
     x = p(j, m)
     p(j, m) = p(j + 1, m)
     p(j + 1, m) = x
    Next m
   End If
  Next j
Next i

Print "名次   运动员号   成绩(单位:s)"
For i = 0 To 9
Print i + 1; Tab(10);
 For j = 0 To 1
   Print p(i, j); Tab(20);
 Next j
Print
Next i
  
End Sub

 第二次尝试,推翻前面的代码用答案的思路写一遍···:

Option Explicit
Dim m, n
Dim i As Integer, j As Integer, t

Private Sub Form_click()
m = Array("207号", "077号", "156号", "231号", "453号", "276号", "096号", "122号", "339号", "302号")
n = Array(14.5, 15.1, 14.2, 14.7, 15.2, 13.9, 15.7, 13.7, 14.9, 14.5)
Print "名次  运动员  成绩(单位:s)"
For i = 0 To 8
  For j = i + 1 To 9
   If n(i) > n(j) Then
    t = n(i)
    n(i) = n(j)
    n(j) = t
    t = m(i)
    m(i) = m(j)
    m(j) = t
   End If
  Next j
Print i + 1; Tab(8); m(i); Tab(16); n(i)
Next i
Print 10; Tab(8); m(9); Tab(16); n(9)
End Sub

第二次还是wa。。因为漏了倒数第二行的循环外输出。即:由于i的取值问题,第十名运动员的成绩给吞了,手动补上。这题掌握得很有限,下学期学了这块再回来二刷

5、编写程序,输出“杨辉三角形”。
杨辉三角形每一行是(x+y)的n次方的展开式的各项系数。例如第一行系数是1;第二行1,1;第三行1,2,1…… 一般形式是
1
1  1
1  2  1
1  3  3    1
1  4  6    4    1
1  5  10  10  5  1

分析上面的形式,可以找出其规律:对角线和每行的第1列均为1,其余各项是它的上一行中前一个元素和上一行的同一列元素之和。例如第4行第3列的值为3,它是第3行第2列与第3列元素值之和,可以一般地表示为:
          a(i,j)=a(i-1,j-1)+a(i-1,j)
请编写程序输出n=10的杨辉三角形(共11行)

Option Explicit
Dim a(10, 10)
Dim i As Integer, j As Integer

Private Sub Form_click()
For i = 0 To 10
 For j = 0 To i '若使用 0 to 10 这里会越界,因为下面的j-1
  If j = 0 Or i = j Then
   a(i, j) = 1
  Else
   a(i, j) = a(i - 1, j - 1) + a(i - 1, j)
  End If
 Next j
Next i

For i = 0 To 10
 For j = 0 To 10
  Print a(i, j);
 Next j
Print
Next i
End Sub

这题主要是杨辉三角的规律吧,既然题目都给出来了就没什么难点了,注意一下j应该选用0 to i

最后总结一下数组的题,可以写坐标出来找规律,比如杨辉三角这题如果没有给出规律的话。

原来vb也是可以对常量实现定义的同时赋值的,但好像只限于常量?(╯▽╰)好吧易于修改程序么。。可是不会影响可读性吗

Const n = 3 '定义一个常量n并赋值

 如果对数组数据没有要求,直接用随机数赋值会比inputbox输入更快:

    For i = 1 To n
        For j = 1 To m
            a(i, j) = Int(Rnd * 90) + 10
        Next j
    Next i

输出的东西比较多的时候注意换行print的使用,保证运行后可读性

'需要调用array函数,定义不可用“dim a()或a(n)”,应使用dim a;调用array函数时,也不可用“a()或a(n)=”,应使用“a=array()”

猜你喜欢

转载自blog.csdn.net/weixin_44559752/article/details/86772148
今日推荐