الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل من الممكن جعل المستخدم يحدد المعادلة الحسابية في البرنامج ؟

بدأه M.A.A.H في 18 يناير 2009 · 10 رد · 1,121 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

سؤالي هو عندي برنامج في مربعين نص وزر ... واللي ابي اسويه اني اجعل المستخدم يدخل العملية الحسابية في مربع النص الاول ويظهر الناتج في مربع النص الثاني بعد ضغط الزر مثلا :

المستخدم ادخل في العملية الحسابية1: 5+2+4

وبعد ضغط زر تشغيل العملية

يعطيني في ناتج العملية : 11

اللي ابي اوصله اني ما ابي اقيد المستخدم في ادخال الارقام يعني ممكن يكتب : 4+2+5+5+8*3-2 وعند ضغط الزر يعطيني الناتج

هل من الممكن اني اسوي هذه الطريقه لاني حاولت بجميع الوسائل بس ما ضبطة معي

post-43549-1232305663_thumb.jpg

#2

مرحباً أخي الكريم .

جرب التالي,أرجو أن يكون ماتريده :

 

[color= #000000; font-weight: bold;]Public [color= #000000; font-weight: bold;]Class Form1

 

    [color= #000000; font-weight: bold;]Private Sub Button1_Click[color= #009900;](ByVal Sender [color= #b1b100;]As [color= #990000;]System[color= #339933;].Object[color= #339933;], [color= #990000;]_

    ByVal E [color= #b1b100;]As [color= #990000;]System[color= #339933;].EventArgs[color= #009900;]) Handles Button1[color= #339933;].Click

        TextBox2[color= #339933;].Text [color= #339933;]= Calculate[color= #009900;](TextBox1[color= #339933;].Text[color= #009900;])

    [color= #990000;]End Sub

 

    [color= #000000; font-weight: bold;]Private [color= #000000; font-weight: bold;]Function Calculate[color= #009900;](ByVal OPSUM [color= #b1b100;]As String[color= #009900;]) [color= #b1b100;]As String

        Dim Input [color= #b1b100;]As String [color= #339933;]= OPSUM[color= #339933;].Replace[color= #009900;]([color= #0000ff;]" "[color= #339933;], Nothing[color= #009900;])

        Dim LSTOP [color= #b1b100;]As [color= #000000; font-weight: bold;]New [color= #990000;]List[color= #009900;](Of Char[color= #009900;])

        Dim Numbers [color= #b1b100;]As [color= #000000; font-weight: bold;]New [color= #990000;]List[color= #009900;](Of Double[color= #009900;])

        Dim LastIndex [color= #b1b100;]As Integer [color= #339933;]= [color= #cc66cc;]0

        [color= #b1b100;]For InD [color= #b1b100;]As Integer [color= #339933;]= [color= #cc66cc;]0 To Input[color= #339933;].Length [color= #339933;]- [color= #cc66cc;]1

            Dim OPR [color= #b1b100;]As Char [color= #339933;]= Input[color= #009900;](InD[color= #009900;])

            [color= #b1b100;]If OPR [color= #339933;]= [color= #0000ff;]"+" Or OPR [color= #339933;]= [color= #0000ff;]"-" Or OPR [color= #339933;]= [color= #0000ff;]"*" Or OPR [color= #339933;]= [color= #0000ff;]"/" Then

                Numbers[color= #339933;].Add[color= #009900;](Input[color= #339933;].Substring[color= #009900;](LastIndex[color= #339933;], InD [color= #339933;]- LastIndex[color= #009900;])[color= #009900;])

                LastIndex [color= #339933;]= [color= #009900;](InD [color= #339933;]+ [color= #cc66cc;]1[color= #009900;])

                LSTOP[color= #339933;].Add[color= #009900;](OPR[color= #009900;])

            [color= #b1b100;]ElseIf InD [color= #339933;]= [color= #009900;](Input[color= #339933;].Length [color= #339933;]- [color= #cc66cc;]1[color= #009900;]) Then

                Numbers[color= #339933;].Add[color= #009900;](Input[color= #339933;].Substring[color= #009900;](LastIndex[color= #009900;])[color= #009900;])

            [color= #990000;]End [color= #b1b100;]If

        [color= #990000;]Next

        Dim Total [color= #b1b100;]As Double [color= #339933;]= Numbers[color= #009900;]([color= #cc66cc;]0[color= #009900;])

        [color= #b1b100;]For I [color= #b1b100;]As Integer [color= #339933;]= [color= #cc66cc;]1 To Numbers[color= #339933;].[color= #990000;]Count [color= #339933;]- [color= #cc66cc;]1

            Select [color= #b1b100;]Case LSTOP[color= #009900;](I [color= #339933;]- [color= #cc66cc;]1[color= #009900;])

                [color= #b1b100;]Case [color= #0000ff;]"+"

                    Total [color= #339933;]+= Double[color= #339933;].Parse[color= #009900;](Numbers[color= #009900;](I[color= #009900;])[color= #009900;])

                [color= #b1b100;]Case [color= #0000ff;]"-"

                    Total [color= #339933;]-= Double[color= #339933;].Parse[color= #009900;](Numbers[color= #009900;](I[color= #009900;])[color= #009900;])

                [color= #b1b100;]Case [color= #0000ff;]"*"

                    Total [color= #339933;]*= Double[color= #339933;].Parse[color= #009900;](Numbers[color= #009900;](I[color= #009900;])[color= #009900;])

                [color= #b1b100;]Case [color= #0000ff;]"/"

                    Total [color= #339933;]/= Double[color= #339933;].Parse[color= #009900;](Numbers[color= #009900;](I[color= #009900;])[color= #009900;])

            [color= #990000;]End Select

        [color= #990000;]Next

        [color= #b1b100;]Return Total[color= #339933;].ToString

    [color= #990000;]End [color= #000000; font-weight: bold;]Function

 

[color= #990000;]End [color= #000000; font-weight: bold;]Class

بالتوفيق

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#3

الف شكر اخي بشار واعذرني اذا ما رديت عليك من اول بس كانت عندي ظروف وما قدرت اخش النت ....

مشاء الله عليك اغلب المواضيع في المنتدى وتكون اول واحد من يرد على المشاكل الله يجزيك خير على كل عمل تقوم فيه ....

طبعا انا جربت الكود قبل شوي وضبط معاي بس فيه مشكله واحده وهي الاولويه في الحساب مثلا :

2+5*5+2= 37 حسب البرنامج

ولكن في الحسابات الواقعية يكون 29 لان الضرب والقسمة يسبق الجمع والطرح

انا باحاول اني اعدل في الكود إن شاء الله تضبط معي

مره ثانيه الف الف شكر على ردك واعذرني على التأخير

#4

هناك موضوع برمجي (متقدم نوعاً ما) يخدم هذه المسألة اسمه Tokenizing أو Lexical Analysis يستخدم لترجمة النصوص إلى أوامر برمجية. يستخدم في مثل هذه الحالات و في الكومبايلر و ما شابه.

#5

مشكور على ردك اخي system ... وعملت بحث عن الموضوع وطلعت لي بعض المواضيع المتعلقه بهذا بس صراحه اول ما شفتها وبدأت اقرا فيها حسيت اني لازم اتعلم لغه جديده عشان افهما معقده شوي :mad:

حبيت اسأل بخصوص كود بشار بعض الاشياء مثل ايش الفرق بين

		
Dim LSTOP As New List(Of Char)
Dim Numbers As New List(Of Double)

وهذه المصفوفات 
Dim LSTOP() As Char 
Dim Numbers() As  Double


وشي الثاني ايش تعني 
 Double.Parse

في هذا السطر 
Total += Double.Parse(Numbers(I))

يعني فقط اختلاف في الكود او لها فائده اكبر من
Total += Numbers(I)

اعرف اني كثرت الاسئله بس ياريت تتحملوني لاني من النوع اللي احب افهم الكود وليس فقط نسخ ولصق

#6

مرحباً أخي الكريم .

اكثر قدر ماتشاء من الأسئلة فمبتغانا هو أن نوصل الفكرة وليس عرضها فقط :P .

بالنسبة للسؤالك الأول قمت بإستخدام List(Of لكي أوفر على نفسي وعلى من سيستخدم هذا الـ Code من الوقت والإختصار في إستخدامات اخرى :

المقصود, أنك لن تحتاج لإعداد أو إعادة تحجيم مايسمى بالـ List وهي عبارة عن مجموعة من عناصر يحدد نوعها بعد الكلمة Of, مالفائدة من الـ List ؟

1 - كما ذكرت عن التقيّيد بالحجم, فمن المعروف أنه عند استخدام مصفوفة يجب أن نحدد أو نعيد إعادة تحديد طولها أو إعادة تصريحها بالدالة ReDim, أمثلة :

Dim OPR(5) As String

______إعادة تصريح_______

ReDim OPR(10 )

____إعادة تحديد الطول_____

Array.Resize( OPR, 10 )

_____________________

2 - إمكانية الحذف من الـ List بدون أي عوائق أو حتى كتابة عملية لذلك, فكل ماعليك استخدامه هو ( RemoveAt ), أما في الـ Array فعليك عمل عملية تساعدك على هذا الشيء, مثال :

 

[color= #000000; font-weight: bold;]Private [color= #000000; font-weight: bold;]Function ResizeArray[color= #009900;]( Byref SomeArray [color= #b1b100;]As [color= #990000;]Array[color= #339933;], Byval Index [color= #b1b100;]As Integer [color= #009900;]) [color= #b1b100;]As Boolean

Try

Dim NArray[color= #009900;]( UBound[color= #009900;]( SomeArray [color= #009900;]) [color= #cc66cc;]-1 [color= #009900;])

Dim NCount [color= #b1b100;]As Integer [color= #339933;]= [color= #cc66cc;]0

[color= #b1b100;]For I [color= #b1b100;]As Integer [color= #339933;]= [color= #cc66cc;]0 To UBound[color= #009900;]( SomeArray [color= #009900;])

[color= #b1b100;]If Not [color= #009900;]( I [color= #339933;]= Index [color= #009900;]) Then

NArray[color= #009900;]( NCount [color= #009900;]) [color= #339933;]= SomeArray[color= #009900;]( I [color= #009900;])

NCount [color= #339933;]+= [color= #cc66cc;]1

[color= #990000;]End [color= #b1b100;]If

[color= #990000;]Next

SomeArray [color= #339933;]= NArray

[color= #b1b100;]Return [color= #000000; font-weight: bold;]True

Catch

[color= #b1b100;]Return [color= #000000; font-weight: bold;]False

[color= #990000;]End Try

[color= #990000;]End [color= #000000; font-weight: bold;]Function

3 - دعم الـ List للعملية ذات المرجع ( مصفوفة من نوع ما ) وهي .ToArray والتي تدخل كل من عناصرها داخل مصفوفة لتعيدها عبر ذلك المرجع, مثال :

 

Dim LSTOPR [color= #b1b100;]As [color= #000000; font-weight: bold;]New [color= #990000;]List[color= #009900;]( Of String [color= #009900;])

Dim OPR[color= #009900;]([color= #009900;]) [color= #b1b100;]As String [color= #339933;]= LSTOPR[color= #339933;].ToArray

هناك الكثير من الأسباب التي تجعل تستخدم هذا النوع من الصفوف والأهم هو دعم العملية ( Contains )=( يحوي) ذات مرجع منطقي ( Boolean ) التي تعيد احدا القيمتين ( False ) أو ( True ) .

بالنسبة لسؤال المشكلة التي تكلمت عنها وهي ( إجراء العملية الحسابية للمعطيات ) فعليك عمل شرط أخر وهو على سبيل المثال ( قوسين الحصر ) لحساب المعادلة الموجودة داخلهما ومن ثم استبدالهم بالقيمة المكاقئة .

بالنسبة للـ Double.Parse فهي عملية ذات مرجع من نوع Double لتحويل المعطيات من اي Object الى Double, يمكنك أيضاً استخدام Double.TryParse التي هي عملية ذات مرجع منطقي, تستخدم للتأكد من القيمة ( هل القيمة أو الكائن من نوع صحيح اي على هيئة صحيحة ؟ ام لا )و مثال :

 

Dim Value [color= #b1b100;]As Double [color= #339933;]= [color= #cc66cc;]0

[color= #b1b100;]If Double[color= #339933;].TryParse[color= #009900;]( [color= #0000ff;]"1502.5"[color= #339933;], Value [color= #009900;]) Then

MsgBox[color= #009900;]( Value[color= #339933;].ToString [color= #339933;]& [color= #0000ff;]" was in a correct format" [color= #009900;])

[color= #b1b100;]Else

MsgBox[color= #009900;]( Value[color= #339933;].ToString [color= #339933;]& [color= #0000ff;]" wasn't in a correct format" [color= #009900;])

[color= #990000;]End [color= #b1b100;]If

ماهي الأخطاء التي تمنع هذه العملية من إرجاع القيمة True اي التي تمنعها من تحويل القيمة المرجعية ؟

إذا حاولنا مثلاً ( "123SDA" ) ستُرجع False .

 

Dim Value [color= #b1b100;]As Double [color= #339933;]= [color= #cc66cc;]0

[color= #b1b100;]If Double[color= #339933;].TryParse[color= #009900;]( [color= #0000ff;]"150ASD"[color= #339933;], Value [color= #009900;]) Then

MsgBox[color= #009900;]( Value[color= #339933;].ToString [color= #339933;]& [color= #0000ff;]" was in a correct format" [color= #009900;])

[color= #b1b100;]Else

MsgBox[color= #009900;]( Value[color= #339933;].ToString [color= #339933;]& [color= #0000ff;]" wasn't in a correct format" [color= #009900;])

[color= #990000;]End [color= #b1b100;]If

ذكر في مثالك ( ( Total += Numbers( I ) نعم يمكنك استخدام هذا, لكن استخدمت الـ Double.Parse لتعريفك بهذه العملية ( ليس الا ) .

بالتوفيق .

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 21 يناير 2009 في 22:47

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#7

الف الف شكر يا الغالي والله انك مبدع

والله من هذه الاكواد تعلمت اكثر من شي كنت اجهلها ..... مشاء الله عليك الله يزيدك من علمه

#8
M.A.A.H كتب:
الف الف شكر يا الغالي والله انك مبدع

لا شكر على واجب :) .

M.A.A.H كتب:
والله من هذه الاكواد تعلمت اكثر من شي كنت اجهلها ..... مشاء الله عليك الله يزيدك من علمه

أمل ذلك, ونسأل الله أن يزيدنا ( جميعاً ) من علمه :) .

بالتوفيق .

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#9
System Down كتب:
هناك موضوع برمجي (متقدم نوعاً ما) يخدم هذه المسألة اسمه Tokenizing أو Lexical Analysis يستخدم لترجمة النصوص إلى أوامر برمجية. يستخدم في مثل هذه الحالات و في الكومبايلر و ما شابه.

هل هذا ماتقصده أخي الكريم System Down ?

Imports System.Reflection
Imports System.CodeDom.Compiler
Imports Microsoft.VisualBasic
Imports System.IO

Public Class Form1

	' استبدل معامل الخدث التالي بالمعامل الذي تريده أن يقوم بالحدث
	Private Sub Button1_Click(ByVal sender As System.Object, _
	ByVal e As System.EventArgs) Handles Button1.Click
		Dim CodeCompiler As ICodeCompiler = New VBCodeProvider().CreateCompiler
		Dim CompilerParameters As New CompilerParameters
		CompilerParameters.ReferencedAssemblies.Add("System.dll")
		CompilerParameters.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
		CompilerParameters.GenerateInMemory = True
		' هنا استبدل القيمة المضمنة بين الإشارات بإسم صندوق النص الذي تريد حساب قيمة مدخلاته
		Dim Code As String = GetClassString("2+(5*5)+2")
		Dim CompileResults As CompilerResults = CodeCompiler.CompileAssemblyFromSource(CompilerParameters, Code)
		If CompileResults.Errors.HasErrors Then
			MsgBox("Error: Line>" & CompileResults.Errors(0).Line.ToString & ", " & CompileResults.Errors(0).ErrorText)
			Exit Sub
		End If
		Dim Assembly As System.Reflection.Assembly = CompileResults.CompiledAssembly
		' اسم الفضاء الذي يوصل المجمع الى الصف
		Dim TheClass As Object = Assembly.CreateInstance("Calc.Calculation")
		If TheClass Is Nothing Then
			MessageBox.Show("غير قادر على معالجة الصف, تأكد من اسم الفضاء", "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Exit Sub
		End If
		Try
			' تعريف كائن يرث نوع العملية التي سنحاول الوصول اليها
			Dim Result As Object = TheClass.GetType.InvokeMember("Sun", _
			BindingFlags.InvokeMethod, Nothing, TheClass, Nothing)
			' استبدل السطر التالي بما تريد, وبمعنى أخر في المكان الذي تريد عرض القيمة فيه
			MessageBox.Show(Result.ToString())
		Catch ex As Exception
			MessageBox.Show("خطأ :" & ex.Message)
		End Try
	End Sub

	Private Function GetClassString(ByVal Value As String) As String
		' هذه العملية, هي عملية شكلية يمكنك التعديل أو إضافة عمليات أخرى
		' كما ترى في الكود السابق أن العملية تستدعى حسب أسمهاو مرجعها وهذا مايهمك من ذلك السطر 
		Dim CL As String = "Imports Microsoft.VisualBasic" & Chr(13) & _
		"Imports System" & Chr(13) & "Namespace Calc" & Chr(13) & "Public Class Calculation" & Chr(13) & _
		"Public Function Sun() As String" & Chr(13) & "Return (" & Value & ")" & Chr(13) & _
		"End Function" & Chr(13) & "End Class" & Chr(13) & "End Namespace"
		Return CL
	End Function

	' بالتوفيق :P

End Class

فعلاً, كان يجب عليّ كتابته من الأول, لكني أعتقد أن بعض الأخوة سوف يجدونه صعب الفهم كـ Code, لكنه أسهل مما تتصورون !! :D .

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 22 يناير 2009 في 13:42

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#10

نعم و لو أن هذا الكود متقدم نوعاً ما على تقييم معادلة حسابية بسيطة :)

#11

Google

Calculator.zip @ Simple Calculator in C#

USPExpress Math Parser

CodeProject: Calc - Parsing It Is Easy

راقب أفكارك ... لأنها تصبح كلمات

راقب كلماتك ... لأنها تصبح أفعالاً

راقب أفعالك ... لأنها تصبح عادات

راقب عاداتك ... لأنها تصبح شخصيتك

راقب شخصيتك ... لأنها تصبح مصيرك

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…