View Full Version : سوال: چرا پیغام over flow می دهد ؟؟
  
h_b_h_91
دوشنبه 14 مرداد 1387, 20: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
سه شنبه 15 مرداد 1387, 00:14 صبح
بهتره متغیرهاتونو از نوع Long تعریف کنید
 
موفق باشید
h_b_h_91
سه شنبه 15 مرداد 1387, 09:32 صبح
بهتره متغیرهاتونو از نوع Long تعریف کنید
 
موفق باشید
اگه متغییر هامو از نوع long تعریف کنم که همون اول وقتی عدد بیشتر از 10 رقم تایپ می شه پیغام Over flow می ده برای روشن شدن موضوع لطفا برنامه رو که ضمیمه کردم مشاهده کنید!!!!!! !:متفکر:
h_b_h_91
سه شنبه 15 مرداد 1387, 15:25 عصر
لطفا دیگه نگین که مسئلرو پیچیده کردم این دفعه دیگه کل برنامه رو براتون گذاشتم پس کمک کنید ..
ASKaffash
سه شنبه 15 مرداد 1387, 18:04 عصر
لطفا دیگه نگین که مسئلرو پیچیده کردم این دفعه دیگه کل برنامه رو براتون گذاشتم پس کمک کنید ..
 
سلام
برنامه را اجرا کردم مشکل اصلی در متغیر K است که به سرعت زیاد میشود :
  k = k * 10
  k = k + n
k یک متغیر اعشاری بزرگ شده است در این الگوریتم میخواهی چکارکنی ؟ چون این عدد در هیچ رنج اعداد صحیح نمی گنجد باید الگوریتم را تغییر دهید
h_b_h_91
چهارشنبه 16 مرداد 1387, 18: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, 19:14 عصر
سلام
دوست عزیز
اگر یک Break Piont روی متغیر K قرار دهید و مقدار ذخیره شده در آن را نگاه کنید متوجه میشوید که در جال رشد است و اعشاری میشود که نتیجه خطا را شما در قسمت mod می بینید . درضمن مگر با تغییر نام یک متغیر از K به X شکل مشکل عوض میشود ؟ لطفا کاری که گفتم انجام بده خودت می بینی
Mbt925
چهارشنبه 16 مرداد 1387, 19: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, 12: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, 13:19 عصر
با اجازه MBT925
err.number شماره خطايي ست كه رخ داده.
در اين تابع زماني كه خطا حاصل از دستورات ماقبل اين دستور (بعد از on error) رخ مي دهد با err.number متوجه آن مي شويم
يعني شماره خطا در err.number قرار دارد پس اگر خطا يي به وجود آمد متغير ها را از هم كم كرده (خنثي سازي عملي كه موجب خطا شده) و شماره خطا را clear مي كنيم تا در اجراي بعد مجدد تا err.number  صفر باشد.
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.