2015年6月26日 星期五

資處程式 6/26 甄選(第5題)

解題參考:
'第5題 撲克牌(23點),A2~9TJQK分別代表1~13點,但A可換成10點,>23爆
 Dim line() = Split(TextBox1.Text, vbNewLine)
Dim n As Integer = Val(line(0))
 For i = 1 To n
   Label1.Text &= vbCrLf
   Dim line1 = line(i)
   Dim m = line1.Length
   Dim j As Integer
   Dim sum = 0, ace = 0
   For j = 2 To m Step 2
     Dim c = Mid(line1, j, 1)
     Select Case c
       Case "2" To "9" : sum += Val(c)
       Case "A"
         sum += 1   '先以 1 點計
         ace += 1   'Ace的張數
       Case "T" : sum += 10
       Case "J" : sum += 11
       Case "Q" : sum += 12
       Case "K" : sum += 13
     End Select
   Next
   If (sum > 23) Then      'Ace算1點 也爆了
      Label1.Text &= "F"
   Else
      While (ace > 0 And sum < 15) '有Ace而且換10點不會爆,就換1張
         sum += 9
         ace -= 1
      End While
      Label1.Text &= sum
   End If
 Next i
---------第5題 資料---
5
HTDJSACA    Ans: 23
DJCQH3         Ans: F
HADAC2SA   Ans: 23
H9SACJ          Ans: 21
SADKCTH2   Ans: F

資處程式 6/26 甄選(第4題)

'第4題 K進位轉十(補充k:2~9),給數字 k 及 一k進位的字串 ,算出十進位


 Dim line() = Split(TextBox1.Text, vbNewLine)
 Dim n As Integer = Val(line(0))
 For i = 1 To n
   Label1.Text &= vbCrLf
   Dim k = Val(line(i * 2 - 1))
   Dim line1 = line(i * 2)
   Dim m = line1.Length
   Dim j As Integer
   Dim p = 1, sum = 0
   For j = m To 1 Step -1
     Dim c = Mid(line1, j, 1)
     If c <> "0" Then sum += (Val(c) * p)
     p *= k
   Next
   Label1.Text &= sum
 Next i
---------第4題 資料---
5
2 1010101   Ans: 85
3 121201    Ans: 451
4 230230    Ans: 2860
5 43201     Ans: 2926
8 760530    Ans: 254296

資處程式 6/26 甄選(第3題)

參考程式碼
' 第3題 字串處理,一字串中只有大寫字母、數字並包含1個運算符號(+-*)之一,
'                 符號左右的數字範圍為 1~999
 Dim line() = Split(TextBox1.Text, vbNewLine)
 Dim n As Integer = Val(line(0))
 For i = 1 To n
   Label1.Text &= vbCrLf
   Dim line1 As String = line(i)
   Dim m = line1.Length
   Dim j As Integer
   Dim num1 As String = "", num2 As String = "", op As String = ""
  '將0~9串接至 Num1 ,直到出現 運算子 + - *
   For j = 1 To m
   Dim c = Mid(line1, j, 1)
     If c >= "0" And c <= "9" Then
        num1 += c    '數字串接至 num1
     ElseIf c = "+" Or c = "-" Or c = "*" Then
        op = c
        Exit For
     End If
   Next
   Dim k = j  ' 運算子出現的位置,從右邊1格開始往後,串接 Num2
   For j = k + 1 To m
      Dim c = Mid(line1, j, 1)
      If c >= "0" And c <= "9" Then
         num2 += c    '數字串接至 num2
      End If
   Next
  '依 op 符號來計算
   Dim sum As Integer = num1
   If op = "+" Then
      sum += num2
   ElseIf op = "-" Then
      sum -= num2
   Else
      sum *= num2
   End If
   Label1.Text &= num1 & op & num2 & " = " & sum
Next i
---------第3題 資料---
5
1A3CF+HK42M6   Ans: 13+426 = 439
X56J0O*2I3            Ans: 560*23 = 12880
X56J0O-7P2I3   Ans: 560-723 = -163
K2J5K+L6D7F8JD   Ans: 25+678 = 703
O1I2*EJ4FI5RL6K   Ans: 12*456 = 5472

資處程式 6/26 甄選(第1題及第2題)

第1題:身份證檢查-1
    N組輸入,每一組一行,為身份證的前9碼,最後少一碼為檢查碼,請輸出n行,各1數字為「檢查碼」
  範例:T11266383
身份證第1碼:英文代號以下表轉換成數字
      A=10 台北市     G=16 宜蘭縣     M=21 南投縣     S=26 高雄縣     Y=31 陽明山
      B=11 台中市     H=17 桃園縣     N=22 彰化縣     T=27 屏東縣     Z=33 連江縣
      C=12 基隆市     I=34 嘉義市*    O=35 新竹市*    U=28 花蓮縣
      D=13 台南市     J=18 新竹縣     P=23 雲林縣     V=29 台東縣
      E=14 高雄市     K=19 苗栗縣     Q=24 嘉義縣     W=32 金門縣*
      F=15 台北縣     L=20 台中縣     R=25 台南縣     X=30 澎湖縣
T轉成27 則和 sum = 2*1 + 7*9 接著8個數字各乘8~1 { 1*8+1*7+2*6+6*5+6*4+3*3+8*2+3*1}
所以 sum = 2*1 + 7*9 + 1*8+1*7+2*6+6*5+6*4+3*3+8*2+3*1 = 174 ,檢查碼即 sum10的餘數 6

第2題:身份證檢查-2
 身份證的驗證規則與第1題同,但所輸入的資料少了第1碼英文字,請問有哪幾個英文字可能是對的
 範例:112663836sum = a*1+b*9 + 1*8+1*7+2*6+6*5+6*4+3*3+8*2+3*1+6 sum會被10整除
   (a+9b+115) 若代入27a=2,b=7 sum=180是對的,則T可以
    又若代入G(16)1+6*9+115 = 170亦可   ,也就是 a分別以1、2、3代入試即可得出


參考解答:
' 第1題 身份證檢查-1 ,少最後1碼(檢查碼),請算出檢查碼
 Dim 英to數() = {10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,32}
 Dim line() = Split(TextBox1.Text, vbNewLine)
 Dim n As Integer = Val(line(0))
 For i = 1 To n
    Label1.Text &= vbCrLf
    Dim pid As String = line(i)
    Dim num = 英to數(Asc(pid) - 65)  '第1個字,查 英to數()陣列 A->10 , B->11 ... Z->32
    Dim sum = (num \ 10) + (num Mod 10) * 9
    For j = 2 To 9
      sum += (Asc(Mid(pid, j, 1)) - 48) * (10 - j)
    Next j
    Label1.Text &= (10 - sum Mod 10)
Next i
---------第1題 資料---
5
T11266383   Ans: 6
M12345678   Ans: 9
Y12345678   Ans: 8
A22334455   Ans: 3
R10234567   Ans: 8

' 第2題 身份證檢查-2 ,少了第1碼(英文字),請算出可能的英文字母
  Dim 數to英 As String = "ABCDEFGHJKLMNPQRSTUVXYWZIO"
  Dim line() = Split(TextBox1.Text, vbNewLine)
  Dim n As Integer = Val(line(0))
  For i = 1 To n
    Label1.Text &= vbCrLf
    Dim pid As String = line(i)
    For a = 1 To 3
      Dim sum = a
      For j = 1 To 8
        sum += (Asc(Mid(pid, j, 1)) - 48) * (9 - j)
      Next j
      sum += Asc(Mid(pid, 9, 1)) - 48
      Dim ans = a * 10 + sum Mod 10 - 9
      If ans <= 35 Then Label1.Text &= Mid(數to英, ans, 1)
    Next a
  Next i
---------第2題 資料---
5
112663836   Ans: GT
108881111   Ans: GT
123456788   Ans: KLY
223344556   Ans: DQO
102345678   Ans: ER

2015年6月25日 星期四

P1D 6/26小考解說

一、
01題:12+8 = 20   { + 加 }
02題:12-8 = 4    { - 減 }
03題:12*8 = 96   { * 乘 }
04題:12/8 = 1.5   { / 除,可能會有小數 }
05題:-12^2 = -144    { ^ 次方,優先序在 - 之前,所以先算出144再加負號 }
06題:121^0.5 = 11    { 0.5次方即開平方,但只取正根 }
07題:21\4 = 5    { \ 整除求 商 ,  21÷4 = 5餘1}  
08題:31Mod4 = 3  { Mod 整除求 餘 ,  31÷4  = 7餘3 }
09題:31.5\6.5 = 5 { \ 整除求 商左右先算出4捨6入的整數再除,即32÷6}
10題:31.5Mod6.5 = 5.5  { 找出最大的 a 使 31.5 - a*6.5 >=0 ,得a=4,求31.5 - 4*6.5即是}
  { 關係運算需在算術運算之後,  為真 True、為假 False }
{算術的優先序:括號先、 ^ 、 * , / 、\ 、 Mod 、 + , -  }
11題:13<4 = False    { <小於, 13<4為假 }
12題:3=3 = True     { =等於, 3=3為真 }
13題:6<>6 = False    { <>不等於, 6<>6 為假 }
14題:3>=5 = False   { >= 大於或等於, 3>=5 為假 }
15題:3<=5 = True  { <= 小於或等於, 3<=5 為真 }
 { 邏輯運算需在關係運算後,又先Not、再And、最後才 Or }
 { Not 真假相反、And(且)左右皆真才真、 Or(或)左右一真即真 }
16題:13>4 And 5>4 = True    { 先算關係 → True And True :左右皆真}
17題:13<4 Or 5>4 = True  {  → False  Or  True :一真即真}
18題:3>=4 Or 5<=3 = False  {  → False  Or  False:無真所以為假}
19題:Not (-2^3 <= 16/2) =  False {  → Not ( -8 <= 8 ) → Not ( True ):真 的相反為 假}
20題:59.7 Mod 32.5/2 =  10.95 {  先/再mod → 59.7 Mod 16.25 → 59.7 - 3*16.25}
21題:3+35 Mod 30\50/8 = 3 {  先/ , \ , mod最後才+ → 3+ 35 Mod 30 \6.25→3+35 Mod 5→3+0 }
22題:"919" > "920"+"3-5"= False  { 字串相加為串接 → "919" > "920+3-5" ,第1字同比第2字}
{字串的比較是比內碼、中文字>英文小寫>英文大寫>數字}
23題:"312"+4&3 = 3163   { &為將2資料串接為字串,但優先序在 + 之後 , 又}
 { 若有一數字與一字串相加會轉成數字相加,故→ "312"+4等於316,316 & 3等於 3163}
24題:7*5<3^2 +2 Or "Ab">"aB" = False  {  →35<11 Or "Ab">"aB" → False Or False}
二、
第1 題
Dim A,S
For A=11 to 123 Step 3
   S=S+A                                  ' 迴圈內 A變化為 11,14,17,....,122
Next A                                     ' 當 A=125>123結束,不的加至 S
Debug.print("S= " & S & "A= " & A) { 印出 S= [S值]  A=  [A值] } 
' 以上 11 ~ 122 項數共有 (122-11)÷3 +1 = 38
' 和 S = (11+122)÷2×項數 = 133÷2×38 = 2527
應印出:  S=2527 A=125 

第2題
Dim A,S
For A=123 to12 Step -3
     S=S+A                            ' 迴圈內 A變化為 123,120,117,....,12
Next A                                 ' 當 A=9 <12 結束,不的加至 S
 Debug.print("S= " & S & "A= " & A)
' 以上 123 ~ 12 項數共有 (123-12)÷3 +1 = 38
' 和 S = (123+12)÷2×項數 = 135÷2×38 = 2565
應印出:  S=2565 A=9 

第3題
Dim A,S,C
For A = 11 to111               '增加值預設為1
  If A mod 9 = 1 Then        ' 迴圈內11~111只有符合的以會執行IF內指令
    S= S+A                         ' 符合的 A有 19、28、…、109 皆加入 S
    C=C+1                          ' 每一個 C+1 ,即是算項數 
  End If
Next A
Debug.print("S= " & S & "C= " & C)
應印出:  S=704 C=11 

第4題
Dim A,S,C
For A=200 to100 Step 5  '增加值為正時 > 終值即結束,跳至 Next的下一指令
  If A mod 17 =0 Then
  S=S+A
  C=C+1
Next A
 Debug.print("S= " & S & "C = " & C)
應印出:  S=0 C=0           '註:但A已設為 200 哦

2015年6月23日 星期二

2015年6月20日 星期六

Z2A VB選手訓練題單

(01) 100-3-1 身份證 ,三題類似 參考檔案「100-M3 下載
(02) 101-3-1 身份證 ,參考檔案「101-M3 下載
(03) 102-4-1 身份證

(04) 100-1-1及-2 字串處理, 參考檔案「100-M1 下載
(05) 101-1-1及-2 字串處理(計算字數) , 參考檔案「101-M1 下載
(06) 102-1-1及-2 字串處理 , 參考檔案「102-M1 下載

(07) 100-3-2 漢明碼 ,參考檔案同(1) 「100-M3 下載
(08) 101-3-2 編碼     ,參考檔案「101-M3 下載

(09) 101-4-1 進制轉換        ,參考檔案「 101-M4 下載
(10) 101-4-2 撲克牌21點    ,參考檔案「 101-M4 下載 」

(11) 100-4-2 找零錢 ,參考檔案「 100-M4 下載
(12) 102-3-1 質因數、最大公因數,參考檔案「 102-M3 _下載

(13) 100-4-1 撲克牌-富豪牌型,參考檔案 同(11) 「 100-M4 下載 
(14) 102-4-2 撲克牌-(10)+(13)綜合
(15) 100-2-1 二維陣列的應用 ,參考檔案 「 100-M2 下載 」

練習依順序,愈前面的出題機率愈高




2015年6月18日 星期四