PDA

View Full Version : سوال: چرا پیغام over flow می دهد ؟؟



h_b_h_91
دوشنبه 14 مرداد 1387, 19:32 عصر
سلام
کد زیر رو براتون می ذارم اگه می شه بگین چرا در قسمتی که می خوات mod حساب کنه برای اعداد بیشتر از 10 رقم پیغام سرزیری می ده؟؟ مگه برای این دستور چه متغییری لازمه ؟؟؟




Private Sub Command1_Click
y = Text1.Text
c = Len(y)
x = 0
For i = 1 To c
a = Mid(y, i, 1)
m = Val(a)
x = x * 10
x = x + m
Next i
div = CStr(x/2
d = Len(div)
k = 0
For j = 1 To d
u = Mid(div, j, 1)
n = Val(u)
k = k * 10
k = k + n
Next j
b = CStr(x mod k)
ln = Len(b)
r = 0
For e = 1 To ln
w = Mid(b, e, 1)
p = Val(w)
r = r * 10
r = r + p
Next e


Print r
End Sub




ممکنه که از b به بعد هم لازم نباشه .:متفکر:
برای روشن شدن موضوع خود برنامه رو هم ضمیمه می کنم البته اعداد بیشتراز 10 رقم را تایپ کنید .

Pr0grammer
دوشنبه 14 مرداد 1387, 23:14 عصر
بهتره متغیرهاتونو از نوع Long تعریف کنید

موفق باشید

h_b_h_91
سه شنبه 15 مرداد 1387, 08:32 صبح
بهتره متغیرهاتونو از نوع Long تعریف کنید

موفق باشید
اگه متغییر هامو از نوع long تعریف کنم که همون اول وقتی عدد بیشتر از 10 رقم تایپ می شه پیغام Over flow می ده برای روشن شدن موضوع لطفا برنامه رو که ضمیمه کردم مشاهده کنید!!!!!! !:متفکر:

h_b_h_91
سه شنبه 15 مرداد 1387, 14:25 عصر
لطفا دیگه نگین که مسئلرو پیچیده کردم این دفعه دیگه کل برنامه رو براتون گذاشتم پس کمک کنید ..

ASKaffash
سه شنبه 15 مرداد 1387, 17:04 عصر
لطفا دیگه نگین که مسئلرو پیچیده کردم این دفعه دیگه کل برنامه رو براتون گذاشتم پس کمک کنید ..

سلام
برنامه را اجرا کردم مشکل اصلی در متغیر K است که به سرعت زیاد میشود :


k = k * 10
k = k + n

k یک متغیر اعشاری بزرگ شده است در این الگوریتم میخواهی چکارکنی ؟ چون این عدد در هیچ رنج اعداد صحیح نمی گنجد باید الگوریتم را تغییر دهید

h_b_h_91
چهارشنبه 16 مرداد 1387, 17:34 عصر
سلام
برنامه را اجرا کردم مشکل اصلی در متغیر K است که به سرعت زیاد میشود :


k = k * 10
k = k + n

k یک متغیر اعشاری بزرگ شده است در این الگوریتم میخواهی چکارکنی ؟ چون این عدد در هیچ رنج اعداد صحیح نمی گنجد باید الگوریتم را تغییر دهید

به نظر من هیچ ربطی به k نداره چون می تونینم بی خیال k شیم و کد رو به شکل زیر تغییر بدیم هر چی هست زیر سر mod است



dim y as string
Private Sub Command1_Click
y = Text1.Text
c = Len(y)
x = 0
For i = 1 To c
a = Mid(y, i, 1)
m = Val(a)
x = x * 10
x = x + m
Next i
b = x mod 100
Print b
End Sub

ASKaffash
چهارشنبه 16 مرداد 1387, 18:14 عصر
سلام
دوست عزیز
اگر یک Break Piont روی متغیر K قرار دهید و مقدار ذخیره شده در آن را نگاه کنید متوجه میشوید که در جال رشد است و اعشاری میشود که نتیجه خطا را شما در قسمت mod می بینید . درضمن مگر با تغییر نام یک متغیر از K به X شکل مشکل عوض میشود ؟ لطفا کاری که گفتم انجام بده خودت می بینی

Mbt925
چهارشنبه 16 مرداد 1387, 18:34 عصر
برای نوشتن یه برنامه باید الگوریتم داشت.
برای حل مشکلاتش هم باید فکر کرد.

برنامه ای که توش حتی نوع متغیر ها مشخص نشده، مشخصه که اصولی نوشته نشده.

برای حل این مشکل باید کمی بهینه سازی به کار برد.
وقتی برای باقیمانده ی دو عدد بزرگ به مشکل بر میخوریم مجبورین کوچیکشون کنیم.

برای سادگی کار از یه روش ساده استفاده کردم ولی میشه روش های خیلی قشنگ تر و بهینه تری هم بکار برد.

تابع زیر رو برای محاسبه Mod تعریف کنید:
این تابع تا وقتی که بتونه محاسبه رو انجام بده، عدد رو کوچیک می کنه.





Private Function ModeX(Num1 As Double, Num2 As Double) As Double
On Error Resume Next

If Num1 < Num2 Then
ModeX = Num1
Exit Function
End If

Do While True
ModeX = Num1 Mod Num2

If Err.Number > 0 Then
Num1 = Num1 - Num2
Err.Clear
Else
Exit Do
End If
Loop

End Function




و خطی مربوط به محاسبه ی باقیمانده رو به صورت زیر تغییر بدید:



b = CStr(ModeX(CDbl(x), CDbl(k)))


در ضمن یادتون نره که نوع متغیر هاتون رو مشخص کنید.

h_b_h_91
شنبه 26 مرداد 1387, 11:44 صبح
برای نوشتن یه برنامه باید الگوریتم داشت.
برای حل مشکلاتش هم باید فکر کرد.

برنامه ای که توش حتی نوع متغیر ها مشخص نشده، مشخصه که اصولی نوشته نشده.

برای حل این مشکل باید کمی بهینه سازی به کار برد.
وقتی برای باقیمانده ی دو عدد بزرگ به مشکل بر میخوریم مجبورین کوچیکشون کنیم.

برای سادگی کار از یه روش ساده استفاده کردم ولی میشه روش های خیلی قشنگ تر و بهینه تری هم بکار برد.

تابع زیر رو برای محاسبه Mod تعریف کنید:
این تابع تا وقتی که بتونه محاسبه رو انجام بده، عدد رو کوچیک می کنه.





Private Function ModeX(Num1 As Double, Num2 As Double) As Double
On Error Resume Next


If Num1 < Num2 Then
ModeX = Num1
Exit Function
End If


Do While True
ModeX = Num1 Mod Num2


If Err.Number > 0 Then
Num1 = Num1 - Num2
Err.Clear
Else
Exit Do
End If
Loop


End Function





و خطی مربوط به محاسبه ی باقیمانده رو به صورت زیر تغییر بدید:





b = CStr(ModeX(CDbl(x), CDbl(k)))



در ضمن یادتون نره که نوع متغیر هاتون رو مشخص کنید.




سلام ببخشید که دیر جواب دادم سرم خیلی شلوغ بود :خجالت: . از کمکتون خیلی ممنونم .:لبخند: اما یه سوال دارم و اونم اینه که Err. number یعنی چی ؟؟؟

xxxxx_xxxxx
شنبه 26 مرداد 1387, 12:19 عصر
با اجازه MBT925
err.number شماره خطايي ست كه رخ داده.
در اين تابع زماني كه خطا حاصل از دستورات ماقبل اين دستور (بعد از on error) رخ مي دهد با err.number متوجه آن مي شويم
يعني شماره خطا در err.number قرار دارد پس اگر خطا يي به وجود آمد متغير ها را از هم كم كرده (خنثي سازي عملي كه موجب خطا شده) و شماره خطا را clear مي كنيم تا در اجراي بعد مجدد تا err.number صفر باشد.