您的位置:首页 > 编程语言 > VB

vb第七章《控制结构》课后编程题求指正

2019-02-04 14:28 295 查看

 1、首先判断给出的3条边能否构成三角形,如可以,计算并输出其面积,否则重新输入。当输入-1时结束程序

[code]Private Sub Form_click()
again:
a! = InputBox("三角形第一边长(单位:cm,下同)")
b! = InputBox("第二边长")
c! = InputBox("第三")

While a = -1 Or b = -1 Or c = -1 '输入-1时退出程序
End
Wend

If a + b > c And a + c > b And b + c > a Then
p = (a + b + c) / 2
s = Sqr(p * (p - a) * (p - b) * (p - c)) '已知三边计算面积用海伦公式
MsgBox ("这家伙的面积是:" & s & "平方厘米")
Else
MsgBox ("如果你是诚心诚意地想要计算输入正确三边")
GoTo again '用控制转移语句返回重新输入
End If

End Sub

特别傻的一题。应该说我错的地方特别傻:三边用符号型$定义、把while语句放在if后面/捂脸

这里print要想用在form_load,应该在load事件下加一行语句:show,因为在form加载的过程中,form是没有焦点的,故无法打印,这里show就是在load事件的时候富裕from焦点(不知道这样描述是否准确)

网上有人用

[code]if a<=0 or b<=0 or c<= 0 then
msgbox ("您输入了小于或为0的参数,包括(-1),程序结束")
end
end if

结束程序,但如果有边长小于零本身构不成三角形会被判错,而题目没有要求输入除了-1以外的数字结束程序。私以为自己的做法比较好?

2、税务部门征收所得税.规定如下:(1)收入在200元以内免征.
(1)收入在200元以内免征;
(2)收入在200~400元内,超过200元的部分纳税3%;
(3) 收入超过400元的部分,纳税4%;
(4)当收入达5000元或超过时,将4%税金改为5%.

[code]Option Explicit
Dim a As Single, s As Integer
Private Sub Form_click()
a = InputBox("告诉我你的月收入:(单位:元)", "需要交纳的税款计算")
Select Case a
Case Is <= 200
Print "免征"
Case 200 To 400
s = (a - 200) * 0.03
MsgBox ("你需要交纳:" & s & "元税款")
Case 400 To 5000
s = (a - 400) * 0.04 + (a - 200) * 0.03
Print "你需要交纳", s, "元税款"
Case Is >= 5000
s = (a - 5000) * 0.05 + (a - 400) * 0.04 + (a - 200) * 0.03
Print "你需要交纳", s, "元税款"
End Select

End Sub

这边用select case解分段函数应该是最方便的吧? 

3、打印九九乘法表

[code]Option Explicit
Dim x As Integer, i As Integer, j As Integer

Private Sub Form_click()
Print Tab(20); "九九乘法表鸭"
Print
Print Space$(1); "*";

For x = 1 To 9
Print Tab(x * 5); x;
Next

Print

For i = 1 To 9
Print i;
For j = 1 To i
Print Tab(j * 5); i * j;
Next j '为了可读性,next后面还是要跟循环的变量
Print
Next i

End Sub

题本身不难,主要是格式。我对前面几章基础没有掌握好,一些print有关的函数居然不会用···

print+要打印的内容+即可不换行输出,但在需要换行时应添加print(另外“;”或空格都是紧凑输出格式而“,”不是。spc(n)是n个字符间隔,space$(n)则是n个空格间隔

print ""里字符外空格没有任何意义,仅当空格在字符内时才会输出 如:print "帅  帅"

4、输出100—300间所有素数

将n被2—根号n间的所有整数除,如果都除不尽则n为素数

[code]Option Explicit
Dim swit As Integer, n As Integer, k As single, i As single, d As Integer

Private Sub Form_click()

For n = 101 To 300 Step 2 '排除2的倍数,减少运算量
swit = 0 '定义一个常量来控制输出
k = Sqr(n)
For i = 2 To k
If n Mod i = 0 Then swit = 1
Next i

If swit = 0 Then
Print n;
d = d + 1 '以及一个d控制换行,使结果便于阅读
If d Mod 5 = 0 Then Print '单行的if语句不需要end if
End If

Next n

End Sub

几个注释是比较主要的解题思路吧。尤其是定义一个量来控制循环中的输出

答案用的是while语句(while i<=k and swit=0)来做循环主体,在确认一个n不是素数以后就停止除法运算了,运算量就比较小;还在第八行用的是k=int(sqr(n)),有些不明白。能理解其中一点也是减少计算机的工作,定义为integer减少储存量。但不是说应该用2到根号n来除吗。。。

5、打印如下的数字金字塔:

[code]Option Explicit
Dim n As Integer, i As Integer, j As Integer

Private Sub Form_click()
For n = 1 To 9
Print Spc(27 - 3 * n); '这里注意数字前面有一个符号位后面一个空格所以一个数字站位数为3
For i = 1 To n
Print i;
Next i
For j = i - 2 To 1 Step -1 '因为漏了这个step-1各种找错误找答案找了半个多小时。。。
If j > 0 Then Print j;
Next j
Print
Next n

End Sub

space$和spc()的区别在于spc()只能用于print方法而space$可以用于任何地方

所以这题用space$和spc()输出结果都一样。

以及为什么第十行j的取值应该从i-2开始而不是i-1?

特别注意一下print spc()语句和换行语句print的位置(分别在i的循环前后)

附上给我灵感的一块代码,向原作者致以真诚的谢意。(有个trim函数不能理解放在这里的意义)

[code]Private Sub Form_DblClick()
For i = 1 To 9 '外层循环,用于控制打印行数
For T = 1 To i '内层循环,用于控制每行的打印列数
Print Tab(10 - i); '定位首个打印字符的位置。这里可以使用spc(10-i),可以获得相同的效果
Next
For j = 1 To i '打印字符
Print Trim(j); '听说trim函数是去除字符左右端空格的函数,但不是很能理解这里用这个的意义
Next
For k = j - 2 To 1 Step -1 '打印另一组字符
Print Trim(k);
Next
Print '换行
Next
End Sub

6、从键盘上输入两个正整数M和N,求最大公因子。

[code]Option Explicit
Dim M As Integer, N As Integer, min As Integer, i As Integer, a As Integer

Private Sub Form_click()
M = InputBox("输入第一个正整数M:")
N = InputBox("给我你的第二个正整数N:")
min = IIf(M < N, M, N) '取两数中较小的那个
Print "M、N它俩的最大公因数是:";
For i = 1 To min
If M Mod i = 0 And N Mod i = 0 Then a = i
Next i
Print a
End Sub

这题不难,有点疑惑min不是系统保留字吗?mong试了一下居然可以用???什么鬼。

注释那行取二者中较小值。这个"iif函数"应该就是c里面的"?:"

7、如果一个数的因子之和等于这个数的本身,则称这样的数为“完全数”。例如,整数28的因子为1,2,4,7,14,其和1+2+4+7+14=28,因此28是一个完全数,编写一个程序,从键盘上输入整数M和N,求出M和N之间的所有的完全数。

[code]Option Explicit
Dim N As Integer
Dim M As Integer
Dim sum As Integer
Dim i As Integer
Dim x As Integer

Private Sub Form_click()

M = InputBox("输入你要测试的范围M~N,首先是下限M:")
N = InputBox("上限N:")
Print "M~N之间的完全数有:";
Print
For x = M To N
sum = 0
For i = 1 To x
If x Mod i = 0 And i<>x Then '这里i不能等于x,因为x本身不是x的因子
sum = sum + i
End If
Next
If sum = x Then
Print x
End If
Next

End Sub

这题蛮有意思的。注意两个点:1、sum=0应该放在x的循环内部,即每次开始一个新的x就清零sum 2、i不能等于x,因为一个数的因子包括1但不包括这个数本身。如果这里缺少了这个条件就不存在sum=x的数了。

然后循环尽量从0开始,因为数组都是从0开始(尽管我不理解这个奇怪的习惯???)也就是改用以下代码片段

[code]For i = 0 To x
If x Mod (i + 1) = 0 And x <> i + 1 Then
sum = sum + i + 1
End If
Next

8、编程打印如下的乘积表:

 

[code]Option Explicit
Dim a As Integer, b As Integer

Private Sub Form_Click()
Print " *";
For a = 0 To 12 Step 3
If a <> 0 Then
Print Tab(3 * a); a;
End If
Next a
Print
For b = 15 To 18
Print b;
For a = 0 To 12 Step 3
If a * b <> 0 Then
Print Tab(3 * a); a * b;
End If
Next
Print
Next

End Sub

这题也主要还是输出时数据对齐的问题。同一行出现了一到三位数,就不能用spc或者space$了。用tab来实现输出数据的对齐是最合适的

9、一个两位的正整数,如将它的个位数字与十位数字对调,则产生另一个正整数,我们把后者叫做前者的对调数。如给定一个两位的正整数,请找到另一个两位的正整数,值得这两个整数之和等于他们各自的对调数之和,例如,12+32=21+23.编写程序,输入一个两位的正整数,把具有这种特征的每一对两位正整数都找出来。

[code]Option Explicit
Dim a As Integer, b As Integer, q As Integer, w As Integer
Dim x As Integer, y As Integer, p As Integer, o As Integer

Private Sub Form_click()

For a = 10 To 99
q = a \ 10
w = a Mod 10
b = w * 10 + q

For x = 10 To 99
p = x \ 10
o = x Mod 10
y = o * 10 + p

If a + x = b + y Then
Print a; "与"; x; "可以这样玩:"; a; "+"; x; "="; b; "+"; y
End If

Next x

Next a

End Sub

这题也蛮好玩的。本来想用字符型变量来循环,两个字符型直接相加组成对调数。结果字符型变量不能用for循环。。。对不起我应该好好看前面几个基础章节的。。。orz

这章其实还有while-wend循环,do-loop循环。可是for循环太好用了有没有。。加个if横扫课后编程题有没有。。做完才发现自己根本没有用上另外两个循环/捂脸

终于结果了拖欠许久的第七章课后题。开始新一章数组。啊哈哈哈哈开心(ˉ▽ ̄~) ~~辞旧迎新嘛

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: