« 呵呵, 我上報了耶! | 首頁 | VB程式: Big5 中文筆劃換算 »

2006年03月23日

商數餘數在日常生活中的應用

基本邏輯:

x ÷ 進位值 = y (商數, 進位後的量) … z (餘數, 原單位的量)

28 小時, 8 小時為一日: 28 ÷ 8 = 3(天) … 4(小時)

27 件, 12 件為一打: 27 ÷ 12 = 2 (打) … 3 (件)

36 兩, 16 兩為一斤: 36 ÷ 16 = 2 (斤) … 4 (兩)

以 Excel 運算:

某人累計請假 3 天 28 小時, 每日工時 8 小時, 請問該員總共請假幾天幾小時?

令 A1 = 3, B1 = 28, 答案置於 A2 (天) 與 B2 (小時)

A2 = A1 + INT( B1 / 8 )
B2 = MOD( B1, 8 )

答案為: 6 天 4 小時

 

某人家庭代工完成 12 打 27 雙成品, 請問該員總共完成幾打幾雙?

令 A1 = 12, B1 = 27, 答案置於 A2 (打) 與 B2 (雙)

A2 = A1 + INT( B1 / 12 )
B2 = MOD( B1, 12 )

答案為: 14 打 3 雙

函數說明:

INT() 傳回無條件捨去後的整數值
MOD 傳回兩數相除之後的餘數


同理可應用於時間運算, 以 VB6 為例:

物件說明:

第一行可輸入的物件為:
Text1(0) = 小時 Text1(1) = 分 Text1(2) = 秒

第二行可輸入的物件為:
Text2(0) = 小時 Text2(1) = 分 Text2(2) = 秒

第三行為加總後輸出的物件:
Text3(0) = 小時 Text3(1) = 分 Text3(2) = 秒

程式碼:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub Action()

    intSeconds = CInt(Text1(2)) + CInt(Text2(2))
    intMinutes = CInt(Text1(1)) + CInt(Text2(1)) + Fix(intSeconds / 60)
    intHours = CInt(Text1(0)) + CInt(Text2(0)) + Fix(intMinutes / 60)
    
    Text3(0) = intHours
    Text3(1) = intMinutes Mod 60
    Text3(2) = intSeconds Mod 60

End Sub

Function fn_chkData(objValue) As Boolean

    If objValue > "" And IsNumeric(objValue) Then
        fn_chkData = True
    Else
        fn_chkData = False
    End If

End Function

Private Sub Text1_Change(Index As Integer)

    If fn_chkData(Text1(Index).Text) Then
        Call Action
    End If
    
End Sub

Private Sub Text2_Change(Index As Integer)

    If fn_chkData(Text2(Index).Text) Then
        Call Action
    End If

End Sub

程式說明:

01 ~ 11 主要運算邏輯
CInt() 將字串轉為整數型態
Fix() 無條件捨棄小數點, 僅取得整數部份
Mod 取兩數相除的餘數
13 ~ 21 簡單的防呆措施, 避免輸入的資料無法運算時, 程式發生錯誤而停止
IsNumeric() 判斷資料是否為數值型態
23 ~ 37 使用者於 Text1 與 Text2 輸入資料時, 若輸入的資料為數值資料, 則直接執行 Action() 主要運算程序, 運算結果將立刻呈現於 Text3 欄位中.

Posted by Jamyy at 2006年03月23日 09:32

Trackback Pings

TrackBack URL for this entry:
http://cha.homeip.net/cgi-bin/mt/mt-tb.cgi/182