ریشه معادله درجه2 درvb(فوری فردا امتحان دارم)

zialem

Member
درخواست کد تعیین ریشه های یک معادله درجه دو برای ویژوال بیسیک(خیلی فوری فردا امتحان دارم)

سلام
دوستان من یه برنامه خودم نوشتم که چند تا ایراد داره:
یکی اینکه وقتی ضریب x^2 برابر صفر میشه (هیچی ورودی نداریم) چون مخرج کسر صفر می شه برنامه ایراد می گیره (Run-time eror) یعنی وقتی تابع درجه یک می شه .میشه بگید کجا رو باید عوض کنم؟؟؟
کد:
Private Sub Command1_Click()
Dim a, b, c As Integer
a = Val(txt1)
b = Val(txt2)
c = Val(txt3)
Dim d As String
d = b ^ 2 - (4 * a * c)
If d < 0 Then
txt4 = "No Answer"
txt5 = "No Answer"
ElseIf d = 0 Then
txt4 = -b / (2 * a)
txt5 = -b / (2 * a)
ElseIf d > 0 Then
txt4 = ((-b) + Sqr(d)) / (2 * a)
txt5 = ((-b) - Sqr(d)) / (2 * a)
End If
End Sub
یه مشکل دیگه هم هست وقتی جای عدد ،حرف وارد می کنم باز هم جواب می ده ،می شه بگید چه طور می تونم کاری کنم که وقتی جای عدد حرف وارد می شه یه پیغام ظاهر بشه.

این هم شکل صفحه ای که من طراحی کردم
 

Peace Dove

Well-Known Member
یکی اینکه وقتی ضریب x^2 برابر صفر میشه (هیچی ورودی نداریم) چون مخرج کسر صفر می شه برنامه ایراد می گیره (Run-time eror) یعنی وقتی تابع درجه یک می شه .میشه بگید کجا رو باید عوض کن
ببينم مگه ما ضريبه 0 هم داريم؟! نداريم.وقتي ورودي نداريم يعني يك يا خودت بايد عدد يك رو وارد كني يا به برنامه بقبولوني كه وقتي تكس باكس اول خالي بود عدد يك بذاره.

براي اينكه فقط عدد وارد بشه واگر حرف هم وارد شد پيغام بده بايد از كد اسكي استفاده كني .من الان يادم نيست از چند تا چنده ولي برو پيدا كن مثلا از فلان كد تا فلان كد را قبول كن در غير اين صورت پيغام بده قبول نيست.
موفق باشي
سامان
 
آخرین ویرایش:

the_king

مدیرکل انجمن
اصل الگوریتم رو درست نوشتید، فقط چند تا اشتباه در پیاده سازی دارید :
مورد اول :
در زبان ویژوال بیسیک تعریف پیاپی چند متغیر شامل فاکتور گیری نوع آن نمی شود، مثلا در کد زیر نوع داده a با نوع
متغیر b یکسان نخواهد بود (نوع پیشفرض در ویژوال بیسیک Variant است) :
کد:
Dim [B]a[/B], [B]b[/B] as Integer
مورد دوم :
نوع متغیر d را اشتباها String تعریف کرده بودید که برای محاسبه دلتا مناسب نیست، من از Double استفاده می کنم
که اعداد اعشاری را با دقت بالا محاسبه می نماید.

برای تشخیص درستی عدد داخل TextBox ها می توانیم از تابع IsNumeric استفاده کنیم.
اگر این تابع مقدار False را برگرداند یعنی پارامتر ورودی آن یک عبارت عددی معتبر نیست.
من برای سادگی کار کاربر، پس از تشخیص خطا در متن TextBox ها، Focus را به آن بر می گردانم تا کاربر آنرا اصلاح کند.

کد:
Private Sub Command1_Click()
    Dim a As Double, b As Double, c As Double, d As Double
    If [B]IsNumeric[/B](Txt1) = False Then
        MsgBox "a is not a valid number", vbExclamation
        Txt1.SetFocus
    ElseIf [B]IsNumeric[/B](Txt2) = False Then
        MsgBox "b is not a valid number", vbExclamation
        Txt2.SetFocus
    ElseIf [B]IsNumeric[/B](Txt3) = False Then
        MsgBox "c is not a valid number", vbExclamation
        Txt3.SetFocus
    Else
        a = Val(Txt1)
        b = Val(Txt2)
        c = Val(Txt3)
        d = b ^ 2 - (4 * a * c)
        If d < 0 Then
            Txt4 = "No Answer"
            Txt5 = "No Answer"
        ElseIf d = 0 Then
            Txt4 = -b / (2 * a)
            Txt5 = -b / (2 * a)
        ElseIf d > 0 Then
            Txt4 = ((-b) + Sqr(d)) / (2 * a)
            Txt5 = ((-b) - Sqr(d)) / (2 * a)
        End If
    End If
End Sub
 

zialem

Member
the_king و samanvb جان
واقعا ممنون که راهنماییم کردید.دستتون درد نکنه.:oops:

the_king جان
الان این کدی که شما دادید کار میکنه و عالیه.اما نمیدونم چرا وقتی b رو یه عدد چند رقمی یا بزرگتر میدم باز هم همون ارور قبلی رو میده.می شه بگید ایندفعه اشکال از کجاست؟؟؟؟

باز هم از شما ممنونم.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
نکنه هنوز نوع متغیر a را Integer در نظر گرفته اید؟ اگه دقت کرده باشید من از Double استفاده کرده ام.
نوع داده ای Integer می تونه یک عدد صحیح (فاقد اعشار) مابین عدد منفی 32768- و عدد مثبت 32767 رو ذخیره کنه
و قادر به ذخیره سازی اعداد خارج از این بازه نیست.
طبیعی است که یک عدد 6 رقمی در یک متغیر از نوع Integer جا نمی شود و پیغام خطا می دهد.

از نوع داده Double استفاده کنید بهتره، اگه در استفاده از نوع داده های فاقد اعشار تاکید دارید از نوع Long به جای
Integer استفاده کنید که اعداد مثبت کوچکتر یا مساوی 2147483648 را می تواند ذخیره کند.
 

zialem

Member
نه دوست من
من هم از متغیر Double استفاده کردم . اما جواب نداد.یعنی وقتی جای b یه عدد بزرگ می ذارم ارور می ده چون می خواد توان 2ش رو حساب کنه. میگم شاید از واحد محاسبه و منطق CPU باشه، چون ابر کامپیوتر که نیست بتونه این عدد بزرگ رو حساب کنه؟؟؟:neutral:

ولش کن دوست من ،
می شه یکم درباره کد زیر توضیح بدید که چه کار می کنه:
کد:
    If IsNumeric(Txt1) = False Then
        MsgBox "a is not a valid number", vbExclamation
        [COLOR=DarkOrange]Txt1.SetFocus[/COLOR]
منظورم همون رنگی است.
باز هم از زحماتتون تشکر می کنم .امیدوارم بتونم جبران کنم.:roll:
 
آخرین ویرایش:

saalek110

Well-Known Member
با اجازه استاد king :
من 5 تکست باکس و یک باتون به فرم افزودم و کد king عزیز را به شکل زیر در آوردم. فقط نام تکست باکس ها را با نام ابزارها یکی کردم.

کد:
Option Explicit
Private Sub Command1_Click()
Dim a As Double, b As Double, c As Double, d As Double
    If IsNumeric(Text1.Text) = False Then
        MsgBox "a is not a valid number", vbExclamation
        Text1.SetFocus
    ElseIf IsNumeric(Text2.Text) = False Then
        MsgBox "b is not a valid number", vbExclamation
        Text2.SetFocus
    ElseIf IsNumeric(Text3.Text) = False Then
        MsgBox "c is not a valid number", vbExclamation
        Text3.SetFocus
    Else
        a = Val(Text1.Text)
        b = Val(Text2.Text)
        c = Val(Text3.Text)
        d = b ^ 2 - (4 * a * c)
        If d < 0 Then
            Text4.Text = "No Answer"
            Text5.Text = "No Answer"
        ElseIf d = 0 Then
            Text4.Text = -b / (2 * a)
            Text5.Text = -b / (2 * a)
        ElseIf d > 0 Then
            Text4.Text = ((-b) + Sqr(d)) / (2 * a)
            Text5.Text = ((-b) - Sqr(d)) / (2 * a)
        End If
    End If
End Sub
هیچ خطایی با اعداد بزرگ نداد.
b2-4ac
باید مثبت باشد. تا no answer ندهد. البته این ربطی به خطا دادن برنامه ندارد. منظورم منطق برنامه است.
دوازده رقمی گرفتم جواب را نشان داد.
------------------------------
در کد بالا این کد:
کد:
Text1.SetFocus
باعث می شود فوکوس برود به تکست باکس شماره یک. یعنی چون کاربر اشتباها به جای عدد حروف وارد کرده ابتدا با MsgBox پیامی به او داده می شود و بعد دوباره فوکوس به همان تکست باکس برگردانده می شود. یعنی آماده تایپ مجدد می شود.
برای امتحان من این خط را کامنت کردم. یعنی دیگر اجرا نشود. بعد در تکست باکس شماره یک آمدم حرف وارد کردم که پیام آمد ولی بعدش هنوز فوکوس روی باتون بود . چون آخرین ابزاری بود که استفاده شده بود.
 

mohammad_mfs

New Member
ايراد اين چيست؟

چه كار كنم وقتي يك عدد كسري از كاربر ميگيره اول اون رو از كسر در نمي آورد
تازه همه چيش درسته جز وقتي كه درج يك مي شود يعني وقتي يك ريشه دارد
مثلا: -1,-1,-1/4
اين رو امتحان كن اشتباح در مي آيد
جوابش بايد بشه:
يك ريشه دارد و جوابش 0.5-
 

پیوست ها

  • 1.9 کیلوبایت بازدیدها: 13
آخرین ویرایش:

mohammad_mfs

New Member
منظورت چیه؟ برنامه که کار می کند. از چه نظر می گویید؟
چه كار كنم وقتي يك عدد كسري از كاربر ميگيره اول اون رو از كسر در نمي آورد
تازه همه چيش درسته جز وقتي كه درج يك مي شود يعني وقتي يك ريشه دارد
مثلا: -1,-1,-1/4
اين رو امتحان كن اشتباح در مي آيد
جوابش بايد بشه:
يك ريشه دارد و جوابش 0.5-
 

saalek110

Well-Known Member
من اعداد -1 و -1 و -0.25 را دادم جواب -0.5 در آمد.
کسر که معنی ندارد باید اعشار بدهید. مگر اینکه برنامه ای برای تبدیل کسر به اعشار به برنامه اضافه کنید.
 

mohammad_mfs

New Member
من اعداد -1 و -1 و -0.25 را دادم جواب -0.5 در آمد.
کسر که معنی ندارد باید اعشار بدهید. مگر اینکه برنامه ای برای تبدیل کسر به اعشار به برنامه اضافه کنید.
]'چگونه اضافه كنم
كه وقتي كاربر عدد كسري را مي دهد ابتدا به اعشار آن را تبديل كرده و بعد بر روي آن عمليات انجام دهد
 

mrahmati5

New Member
با اجازه
داشتم یه چرخی توسایت میزدم این پستو دیدم
راحت ترین کار اینه
اول یه باتن میسازی بعد:[BASS]
Private Sub Command1_Click()
Dim a, b, c, d As Long
a = InputBox("Enter a")
b = InputBox("Enter b")
c = InputBox("Enter c")
d = (b ^ 2) - (4 * a * c)
If d > 0 Then
Print ((-b) + Sqr(d)) / (2 * a); "and"; ((-b) - Sqr(d)) / (2 * a)
End If
If d = 0 Then
Print (-b) / (2 * a)
End If
If d < 0 Then
Print "Not Root"
End If
End Sub[/BASS]
 

جدیدترین ارسال ها

بالا