請思考一個問題,凡參賽選手,為何大家都能完成題目,然而冠軍是你不是他?
想要高人一等,一招一式,舉手抬足均要拳拳到位,否則你與一般選手並無兩樣。

比賽時須注意重點順序如下:
1)功能須完整。(佔比例較高者,優先完成)
2)防呆設計。
3)介面須容易操作。(美觀其次)
4)修飾程式碼,提升演算法執行時間與記憶體使用效率。
5)註解、程式碼可讀性。

【除錯方式】
寫程式在開發時,任何人都會碰上程式除錯階段,尤其在比賽階段,明
明就只差那臨門一腳,但時間慢慢逼近,有可能這個程式小 bug,就是你
能不能上榜的關鍵,時間越靠近,選手心情會越緊張,越不容易察覺錯誤,
因此迅速找出錯誤所在,就變成非常重要的一環,以下介紹三種除錯方式
供參考。

1)輸出變數方式
在 form 的版面上,放置臨時暫用的標籤 (label),在你覺得錯誤的地方,
令 label.text 顯示重要的變數內容,是否為你想要的。

2)顯示變數內容有可能會因電腦執行速度過快(尤其是迴圈內執行標籤顯示),
而無法目睹變數的內容,此時可考慮使用檔案方式,把內容一次一次寫入
檔案,待程式結束後,開啟檔案觀察。

3)vb.net 是一個很好用的開發介面,使用者可以藉由 vb.net 的 IDE 介面,
設定中斷點、單步執行或條件觸發中斷,是一種非常方便又多數人使用的
方法。


4)使用 Debug.Print() 指令可以在輸出視窗看到想觀察的變數內容。

或是中斷程式後,在下方子功能視窗內選取輸出視窗


【防呆方式】
比賽時有時會輸入一些意外的訊息,這是要考驗選手的程式經驗與心思細膩度,以下有幾種方式處理供參考。

1)鍵盤鎖定輸入資料的長度。(例如資料為 0 ~ 100,則長度最長為 3)


步驟一、
點選要限制的輸入方塊。

步驟二、
找到元件屬性視窗。(可以從功能表【檢視】找到)(快速鍵 F4)


步驟三、
修改 MaxLength 屬性。

2)鍵盤鎖定能輸入的字元,通常輸入資料為整數,則下列程式碼可鎖定輸入字元。

步驟一、
點擊輸入方塊盒兩下,進入編碼模式。
或是找到方案總管(可以從功能表【檢視】找到)(快速鍵 Ctrl-Alt-L)


步驟二、
在方案總管內,找到 Form1名稱,並點擊下面的proc 進入編碼視窗



步驟三、在程式碼區的元件欄找到 Textbox1 (假設輸入盒名稱為 Textbox1),並在事件欄找到 KeyPress 事件。
然後會自動產生事件驅動的函數編碼區,鍵入下列程式碼就會有相對應的功能。


【鎖定 0 ~ 9 數字鍵及退回鍵
e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = Chr(8))

【鎖定 0 ~ 9 數字鍵、退回鍵、小數點負號
e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = Chr(8) Or e.KeyChar ="." Or e.KeyChar ="-")

【鎖定 0 ~ 9 數字鍵、退回鍵、大寫英文字母
e.Handled = Not (Char.IsDigit(e.KeyChar)Or e.KeyChar = Chr(8) Or Char.IsUpper(e.KeyChar))

【鎖定 0 ~ 9 數字鍵、退回鍵、小寫英文字母
e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = Chr(8) Or Char.IsLower(e.KeyChar))

【鎖定 0 ~ 9 數字鍵、退回鍵、空白鍵,並且按下 Enter 可以自動執行 Button1_Click 程式】
e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = Chr(8) Or e.KeyChar = " ")
If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Return) Then
    Button1_Click(sender, e)
End If


更多的 Char 用法在Microsoft 技術文件

3)數字範圍鎖定。(例如輸入成績,只能 0 至 100)

步驟一、
切換到程式碼區,找到程式執行區域(通常是按鈕按了以後執行)

步驟二、
假設 TextBox1 要限制 0 ~ 1000000,則程式碼如下:
Dim n As Integer = Val(TextBox1.Text)
If (n > 1000000) Then
    MsgBox("n 超出範圍 0 <= n <= 1000000,請重新輸入。")
    Exit Sub
End If




4)介面排列,請善用功能表的 格式、對齊與間距工具。
可以直接使用快速鍵(須預先選好要調整的元件)。


選好元件以後,就可以使用快速鍵。


也可以使用功能表(效果同上)






5)每一題的介面相同時,可以用複製的方式,將已經設計好的介面,複製到新專案。
步驟一、
設計好的專案介面,點選 form 任意空白處,按下 Ctrl - A (全選)


步驟二、
按下 Ctrl - C (複製)

步驟三、
關閉方案

步驟四、
開啟新專案

步驟五、
點選 form 任意空白處,按下 Ctrl - V (貼上)


動態產生物件方式:
比賽時,常會碰到輸入盒或按鈕是依據當時輸入的資料決定的,例如下面畫面當 Textbox1 輸入不同值時所產生的畫面

Const N As Integer = 9
Const X1 As Integer = 16
Const Y1 As Integer = 69
Const DX As Integer = 42
Const DY As Integer = 42
Const TBWH As Integer = 36
Public TB(N, N) As TextBox

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim x As Integer, y As Integer
For y = 0 To N - 1
    For x = 0 To N - 1
        TB(y, x) = New TextBox
        TB(y, x).Size = New System.Drawing.Size(TBWH, TBWH)
        TB(y, x).Text = ""
        TB(y, x).Location = New Point(X1 + x * DX, Y1 + y * DY)
        Controls.Add(TB(y, x))
        TB(y, x).MaxLength = 1
        TB(y, x).TabIndex = y * N + x
        AddHandler TB(y, x).KeyPress, AddressOf TBkeyPress
Next
Next
End Sub

'限制輸入內容
Public Sub TBkeyPress(sender As Object, e As KeyPressEventArgs)
    Dim tbt As TextBox = CType(sender, TextBox),  x As Integer, y As Integer
    e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = Chr(8))
    x = tbt.TabIndex Mod N '取得物件二維註標 x 值
    y = tbt.TabIndex \ N '取得物件二維註標 y 值
    'x = (tbt.Left - X1) / DX : y = (tbt.Top - Y1) / DY '使用位置來判定註標也可以
    tbt.Text = "Hello" '相當於設定 TB(y, x)
End Sub

讀取檔案的方式
有時候,讀檔案必須指定絕對路徑,但是當系統移植至其他環境時,該絕對路徑已經不存在,
因此,常常需要相對路徑,而相對的路徑是系統執行檔的位置路徑,以下介紹如何以絕對路徑
與相對路徑並存的設定。

Dim path As String = ""
'當 TextBox1.Text 第 1 個字不是 $ 時,就以絕對路競存取,否則前面會加上系統執行的路徑
If (TextBox1.Text.Substring(0, 1) = "$") Then
   path = Application.StartupPath & "\..\..\..\" & TextBox1.Text.Substring(1)
Else
   path = TextBox1.Text
End If
If (Not System.IO.File.Exists(path)) Then
   MsgBox("檔案 " & path & " 不存在.")
   Return
End If
FileOpen(1, path, OpenMode.Input)


以下是以 Dialog 開啟檔案
Dim myStream As IO.Stream = Nothing
Dim openFileDialog1 As New OpenFileDialog()
openFileDialog1.InitialDirectory = Application.StartupPath & "\..\..\..\"
openFileDialog1.Filter = "txt files (*.in)|*.txt|All files (*.txt)|*.*"
openFileDialog1.FilterIndex = 2
openFileDialog1.RestoreDirectory = True
If openFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then '開啟檔案對話框
   Try
        If (myStream Is Nothing) Then
             FileOpen(1, openFileDialog1.FileName, OpenMode.Input) '取得的檔名在 openFileDialog1.FileName
             Input(1, TextBox1.Text)
        End If
   Catch Ex As Exception
        MessageBox.Show("無法讀取資料" & Ex.Message)
   Finally
        If (myStream IsNot Nothing) Then
             myStream.Close()
        End If
   End Try
End If