@קומפיונט אמר בתרגיל: עיגול מספר לפי מערך מפתחות:
יש לי מערך של מפתחות, לדוג 100 200 300 ... ואני רוצה שהמשתמש יזין מספר כלשהו הוא יעוגל למספר המפתח הקרוב ביותר.
יש לי כמה דרכים לעשות את זה, אבל אני מחפש את הדרך הכי קצרה ויעילה.
אולי יש למשהו דרך יצירתית לעשות את זה?
יש לציין שהפתרון שלי הוא רק בשפות של NET., אבל בטוח יש דרכים יצירתיות גם בשפות אחרות. אז אתם גם מוזמנים לנסות (כמובן בלי גוגל).
בלי לחפש...
הפתרון כאן הוא ב VBA.
אני מניח שכל המערך הוא עם ערכי INT בלבד,
וגודל המערך ידוע, אך גודלו יכול להיות LONG.
והדרך הכי יעילה מבחינתי, זה לקודד לבד... כך כל פעולה ידועה,
והכי קצרה - לכתוב את זה כפונקציה:)
נ.ב. יכול להיות שיש עוד דרכים יותר טובות - לא בדקתי את הקודים בשרשור.
וגם - יש משהו מעצבן בVBA, שבחלק מהיישומים (לדוגמה, אצלי) א"א לדעת את גבולות המערך למרות שיש פונקציה ייעודית לזה (LowerBound, ו UpperBound) וכש"כ לא את גודל המערך, לכן הוספתי פרמטרים של גבולות המערך.
Option Explicit
Public Function Round(ByRef Value As Integer, ByRef Arr() As Integer, ByRef Length As Long, Optional ByRef LowerBound As Long = 0) As Integer
Dim i As Long
Dim lower As Integer, upper As Integer
If Value = Arr(LowerBound) Then
Round = Value
Exit Function
ElseIf Arr(LowerBound) > Value And Arr(LowerBound) < 32767 Then ' limit intreger == 32767
upper = Arr(LowerBound)
ElseIf Arr(LowerBound) < Value And Arr(LowerBound) > lower Then
upper = 32767
lower = Arr(LowerBound)
End If
For i = LowerBound + 1 To LowerBound + Length - 1
If Value = Arr(i) Then
Round = Value
Exit Function
ElseIf Arr(i) > Value And Arr(i) < upper Then
upper = Arr(i)
ElseIf Arr(i) < Value And Arr(i) > lower Then
lower = Arr(i)
End If
'Debug.Print "arr(i) " & Arr(i) & " lower " & lower & " upper " & upper
Next i
If upper - Value <= Value - lower Then Round = upper Else Round = lower
End Function
Sub בדיקה()
Dim AA(1 To 5) As Integer
AA(1) = 4
AA(2) = 12
AA(3) = 2
AA(4) = 22
AA(5) = 80
MsgBox Round(CInt(InputBox("")), AA, 5, 1)
End Sub