vb第七章《控制結構》課後編程題求指正

 1、首先判斷給出的3條邊能否構成三角形,如可以,計算並輸出其面積,否則重新輸入。當輸入-1時結束程序

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焦點(不知道這樣描述是否準確)

網上有人用

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%.

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、打印九九乘法表

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爲素數

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、打印如下的數字金字塔:

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函數不能理解放在這裏的意義)

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,求最大公因子。

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之間的所有的完全數。

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開始(儘管我不理解這個奇怪的習慣???)也就是改用以下代碼片段

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

8、編程打印如下的乘積表:

 

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.編寫程序,輸入一個兩位的正整數,把具有這種特徵的每一對兩位正整數都找出來。

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橫掃課後編程題有沒有。。做完才發現自己根本沒有用上另外兩個循環/捂臉

終於結果了拖欠許久的第七章課後題。開始新一章數組。啊哈哈哈哈開心(ˉ▽ ̄~) ~~辭舊迎新嘛

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章