25-09-12, 08:50 PM
(آخر تعديل لهذه المشاركة : 19-04-13, 10:05 PM {2} بواسطة Abou Abdellah.)
السلام عليكم و رحمة الله و بركاته
اليوم أقدم لكم Class من برمجتي 100% لتحويلات الأنظمة العددية،
فالنبدأ بالشرح مباشرتاً:
الكلاس به 15 دالة منهم دالتين أساسيتين و البقية تعتمد على تلك الدالتين
قبل البدء أبحث في موقع You Tube عن فيديو بعنوان
Number System - Base System - 1 of 2
لمعرفة طريقة التحويل على الورق التي سوف نحولها إلى كود برمجي
لم أضع الرابط مباشرتاً لأنه يظهر في هيئة *******
الدالة الأولى:BaseToDecimal
الكود:
طبعاً أنت تقول الآن في ذهنك "ألم يقل شرح :confused: " فأقول لك لو أنتظرت قليلاً لما قلت ذلك
طبعاً كما نعلم أن القواعد العددية لا يمكن أن تقل عن 2 و ذلك هو عمل السطر الأول
ملاحظة: عند حدوث أي خطأ في أي دالة الدالة تعود الدالة بـ0 لذلك تلك الدالة و بقية الدوال موضوعة بين Try و Catch و End Try
ثم بعد ذلك ننشئ مصفوفة رقمية لتحتوي على قيم الأسس
ثم نعبئها بالقيم عن طريق الكود التالي
ثم نضع الحلقة التكرارية For و لا أعتقد أنها تحتاج إلى شرح لكن سأشرحها للمبتدئين
الحلقة التكرارية For هي لتكرار أمر معين عدة مرات و صيغتها كالتالي:
و الآن إلى ما بداخل الحلقة التكرارية For
طبعاً كما رأينا في شرح الفيديو فالأسس يبدأ وضعها من اليمين لليسار لذلك أستخدمت الدالة StrReverse ثم بعد ذلك يتم أستبدال كل حرف بالرقم الذي يواجهه ليتم ضربه في الأس و تستخدم الدالة Math.Abs للعودة بالقيمة الموجبة لرقم
الدالة الثانية: DecimalToBase
الكود:
أول سطرين كما هو الحال في الدالة السابقة
بعد ذلك نضع متغير تحمل القيمة الموجبة للرقم المدخل ثم متغير يحمل قيمة القاعدة ثم متغير لجلب باقي القسمة ثم متغير لتحويل الأرقام الأكبر من 10 إلى الحروف التي تمثلها ثم متغير للنتيجة النهائية ثم أستخدام الحلقة التكرارية Do Until و أعتقد أنها لا تحتاج إلى شرح لأن أسمها يوضح شرحها
يستخدم الكود التالي لجلب باقي القسمة
ثم يتم تحويل الأرقام إلى الحروف التي تمثلها
ثم تم أستخدام الدالة Math.Truncate لجلب الرقم بدون كسور ثم إضافة الحرف\الرقم إلى متغير النتيجة النهائية و كما لاحظت في الفيديو السابق أنه يأخذ الأرقام من الأسفل إلى الأعلى لذلك تم أستخدام الدالة StrReverse
الدالة الثالثة: BaseToBase
الكود:
أول سطرين كما هو الحال في الدالتين السابقتين
ثم يحول الرقم من النظام الحالي إلى النظام العشري و من ثم إلى النظام المطلوب التحويل إليه
الدالة الرابعة، ......، الدالة الخامسة عشر:
ليس بهم أفكار جديدة فكلها معتمدة بشكلٍ كلي على أول ثلاث دوال
أما بخصوص الكود المكتوب قبل كل دالة
فهو لوضع شرح للدالة عند كتابتها في محرر كواد الـVB.Net و يكتب بين summary شرح الدالة عموماً و بين param name="name" يتم كتابة وصف البراميتر أما بخصوص returns و remarks فلا أعلم
[FONT=&]
[/FONT][FONT=&]يوجد بالمرفقات الكلاس كاملاً(الـ15 دالة) و مثال عن أستخدامهم[/FONT][FONT=&]
[/FONT][FONT=&]و في النهاية أتمنى من الله أن أكود قد وفقت في شرحي[/FONT][FONT=&]
و لا أنتظر منكم سوى الدعوة الصالحة
و السلام عليكم و رحمة الله و بركاته[/FONT]
فالنبدأ بالشرح مباشرتاً:
الكلاس به 15 دالة منهم دالتين أساسيتين و البقية تعتمد على تلك الدالتين
قبل البدء أبحث في موقع You Tube عن فيديو بعنوان
Number System - Base System - 1 of 2
لمعرفة طريقة التحويل على الورق التي سوف نحولها إلى كود برمجي
لم أضع الرابط مباشرتاً لأنه يظهر في هيئة *******
الدالة الأولى:BaseToDecimal
الكود:
PHP كود :
''' <summary>
''' Converts (number) from (currentBase) to Base 10
''' </summary>
''' <param name="number">The number that you want to convert it Base</param>
''' <param name="currentBase">The current Base for (number)</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function BaseToDecimal(ByVal number As String, ByVal currentBase As UShort) As ULong
If currentBase < 2 Then Return 0 : Exit Function
Try
Dim _OS As Integer() = New Integer() {}
For I As Integer = 0 To number.Length - 1
ReDim Preserve _OS(I)
_OS(I) = (currentBase ^ I)
Next
Dim OverAllRes As ULong
OverAllRes = 0
For X As Integer = 0 To number.Length - 1
Dim CharConv As String
CharConv = number
If CharConv.Substring(0, 1) = "-" Then CharConv = Strings.Right(CharConv, CharConv.Length - 1)
CharConv = StrReverse(CharConv)
CharConv = CharConv.Substring(X, 1)
If currentBase > 9 Then
Select Case CharConv.ToUpper
Case "A"
CharConv = "10"
Case "B"
CharConv = "11"
Case "C"
CharConv = "12"
Case "D"
CharConv = "13"
Case "E"
CharConv = "14"
Case "F"
CharConv = "15"
Case "G"
CharConv = "16"
Case "H"
CharConv = "17"
Case "I"
CharConv = "18"
Case "J"
CharConv = "19"
Case "K"
CharConv = "20"
Case "L"
CharConv = "21"
Case "M"
CharConv = "22"
Case "N"
CharConv = "23"
Case "O"
CharConv = "24"
Case "P"
CharConv = "25"
Case "Q"
CharConv = "26"
Case "R"
CharConv = "27"
Case "S"
CharConv = "28"
Case "T"
CharConv = "29"
Case "U"
CharConv = "30"
Case "V"
CharConv = "31"
Case "W"
CharConv = "32"
Case "X"
CharConv = "33"
Case "Y"
CharConv = "34"
Case "Z"
CharConv = "35"
End Select
End If
CharConv = CInt(CInt(CharConv) * _OS(X))
OverAllRes += CDec(CharConv)
Next
BaseToDecimal = Math.Abs(OverAllRes)
Return BaseToDecimal
Catch
Return 0 : Exit Function
End Try
End Function
'Programmed by Aly El-Haddad
طبعاً كما نعلم أن القواعد العددية لا يمكن أن تقل عن 2 و ذلك هو عمل السطر الأول
ملاحظة: عند حدوث أي خطأ في أي دالة الدالة تعود الدالة بـ0 لذلك تلك الدالة و بقية الدوال موضوعة بين Try و Catch و End Try
ثم بعد ذلك ننشئ مصفوفة رقمية لتحتوي على قيم الأسس
PHP كود :
Dim _OS As Integer() = New Integer() {}
PHP كود :
For I As Integer = 0 To number.Length - 1
ReDim Preserve _OS(I)
_OS(I) = (currentBase ^ I)
Next
الحلقة التكرارية For هي لتكرار أمر معين عدة مرات و صيغتها كالتالي:
PHP كود :
For [Variable] As [NumericDataType] = [StartFrom] To [FinishAt] Step 1
'Your code
Next
و الآن إلى ما بداخل الحلقة التكرارية For
طبعاً كما رأينا في شرح الفيديو فالأسس يبدأ وضعها من اليمين لليسار لذلك أستخدمت الدالة StrReverse ثم بعد ذلك يتم أستبدال كل حرف بالرقم الذي يواجهه ليتم ضربه في الأس و تستخدم الدالة Math.Abs للعودة بالقيمة الموجبة لرقم
الدالة الثانية: DecimalToBase
الكود:
PHP كود :
''' <summary>
''' Converts (number) from Base 10 to (targetBase)
''' </summary>
''' <param name="number">The number that you want to convert it Base</param>
''' <param name="targetBase">The Base that you want to convert to</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function DecimalToBase(ByVal number As ULong, ByVal targetBase As UShort) As String
If targetBase < 2 Then Return 0 : Exit Function
Try
Dim VN As ULong
VN = Math.Abs(number)
Dim B As UShort = targetBase
Dim R As Decimal
Dim SOP As String
Dim OverAll As String = String.Empty
Do Until VN < 1
R = VN / B
R = Decimal.Subtract(R, Math.Truncate(R))
R = CULng(R * B)
If B > 9 Then
Select Case R
Case 10
SOP = "A"
Case 11
SOP = "B"
Case 12
SOP = "C"
Case 13
SOP = "D"
Case 14
SOP = "E"
Case 15
SOP = "F"
Case 16
SOP = "G"
Case 17
SOP = "H"
Case 18
SOP = "I"
Case 19
SOP = "J"
Case 20
SOP = "K"
Case 21
SOP = "L"
Case 22
SOP = "M"
Case 23
SOP = "N"
Case 24
SOP = "O"
Case 25
SOP = "P"
Case 26
SOP = "Q"
Case 27
SOP = "SOP"
Case 28
SOP = "S"
Case 29
SOP = "T"
Case 30
SOP = "U"
Case 31
SOP = "V"
Case 32
SOP = "W"
Case 33
SOP = "X"
Case 34
SOP = "Y"
Case 35
SOP = "Z"
Case Else
SOP = R
End Select
Else
SOP = R
End If
VN = Math.Truncate(VN / B)
OverAll &= SOP
Loop
OverAll = StrReverse(OverAll)
DecimalToBase = OverAll
Return DecimalToBase
OverAll = String.Empty
VN = Nothing
Catch
Return 0 : Exit Function
End Try
End Function
'Programmed by Aly El-Haddad
بعد ذلك نضع متغير تحمل القيمة الموجبة للرقم المدخل ثم متغير يحمل قيمة القاعدة ثم متغير لجلب باقي القسمة ثم متغير لتحويل الأرقام الأكبر من 10 إلى الحروف التي تمثلها ثم متغير للنتيجة النهائية ثم أستخدام الحلقة التكرارية Do Until و أعتقد أنها لا تحتاج إلى شرح لأن أسمها يوضح شرحها
يستخدم الكود التالي لجلب باقي القسمة
PHP كود :
R = VN / B
R = Decimal.Subtract(R, Math.Truncate(R))
R = CULng(R * B)
ثم تم أستخدام الدالة Math.Truncate لجلب الرقم بدون كسور ثم إضافة الحرف\الرقم إلى متغير النتيجة النهائية و كما لاحظت في الفيديو السابق أنه يأخذ الأرقام من الأسفل إلى الأعلى لذلك تم أستخدام الدالة StrReverse
الدالة الثالثة: BaseToBase
الكود:
PHP كود :
''' <summary>
''' Converts (number) from (currentBase) to (targetBase)
''' </summary>
''' <param name="number">The number that you want to convert it Base</param>
''' <param name="currentBase">The current Base for (number)</param>
''' <param name="targetBase">The Base that you want to convert to</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function BaseToBase(ByVal number As String, ByVal currentBase As UShort, ByVal targetBase As UShort) As String
If currentBase < 2 Then Return 0 : Exit Function
If targetBase < 2 Then Return 0 : Exit Function
number = BaseToDecimal(number, currentBase)
number = DecimalToBase(number, targetBase)
Return number
End Function
'Programmed by Aly El-Haddad
أول سطرين كما هو الحال في الدالتين السابقتين
ثم يحول الرقم من النظام الحالي إلى النظام العشري و من ثم إلى النظام المطلوب التحويل إليه
الدالة الرابعة، ......، الدالة الخامسة عشر:
ليس بهم أفكار جديدة فكلها معتمدة بشكلٍ كلي على أول ثلاث دوال
أما بخصوص الكود المكتوب قبل كل دالة
PHP كود :
''' <summary>
''' Converts (number) from (currentBase) to (targetBase)
''' </summary>
''' <param name="number">The number that you want to convert it Base</param>
''' <param name="currentBase">The current Base for (number)</param>
''' <param name="targetBase">The Base that you want to convert to</param>
''' <returns></returns>
''' <remarks></remarks>
[FONT=&]
[/FONT][FONT=&]يوجد بالمرفقات الكلاس كاملاً(الـ15 دالة) و مثال عن أستخدامهم[/FONT][FONT=&]
[/FONT][FONT=&]و في النهاية أتمنى من الله أن أكود قد وفقت في شرحي[/FONT][FONT=&]
و لا أنتظر منكم سوى الدعوة الصالحة
و السلام عليكم و رحمة الله و بركاته[/FONT]