PDA

View Full Version : سوال: مقدارهاي بازگشتي يک تابع



MohammadGh2011
چهارشنبه 31 خرداد 1391, 14:55 عصر
سلام عليکم
سوالم اينه که چه طور ميشه ما يک تابع بنويسيم که دوتا مقدار رو بر گردونه براي مثال کدزير مقدار کوچک ترين و بزرگترين عدد رو بين ده عدد محاسبه ميکنه اين رو چه طور به صورت يک تابع بنويسم که تو اون يک تابع هم مقدار Max رو برگردونه و هم مقدار Min رو؟
اصلا يه همچين چيزي امکان داره که يک تابع دوتامقدار رو برگردونه؟!

Dim a As Integer, max As Integer, min As Integer
Dim c As Integer, d As Long
c = InputBox("Number 1")
max = c
min = c
For d = 2 To 10
c = InputBox("Number " & d)
If c > max Then max = c
If c < min Then min = c
Next d
MsgBox ("max = " & max)
MsgBox ("min = " & min)

just4froum
چهارشنبه 31 خرداد 1391, 15:06 عصر
امکان نداره که یه تابع دو مقدار را برگرداند ولی می توان دو متغیر را به (تابع / ساب روتین) فرستاد و تابع آن دو متغیر را مقدار دهی کند مانند:

Private Sub Form_Load()
Dim x As Long, y As Long
Call Just4froum(x, y)
MsgBox x
MsgBox y
End Sub

Private Sub Just4froum(FV As Long, SV As Long)
FV = 10
SV = 15
End Sub

محسن واژدی
چهارشنبه 31 خرداد 1391, 16:04 عصر
سلام علیکم
در تکمیل توضیحات جناب Just4froum، میتوانیم نتیجه تابع را در توسط یک نوع کاربر هم برگردانیم که در اینصورت میتوانیم بگوییم تابع میتواند بیشتر از یک مقدار را برگرداند، مشابه کد زیر:

Private Type HMSRet
hmsHour As Integer
hmsMin As Integer
hmsSec As Integer
End Type

Private Function GetHMS() As HMSRet
GetHMS.hmsHour = Hour(Now)
GetHMS.hmsMin = Minute(Now)
GetHMS.hmsSec = Second(Now)
End Function

Private Sub Command1_Click()
Dim HMS As HMSRet
HMS = GetHMS
MsgBox ("H : " & HMS.hmsHour & vbCrLf & "M : " & HMS.hmsMin & vbCrLf & "S : " & HMS.hmsSec)
End Sub


البته اگر فقط یکی دو مقدار مقدار ساده است به همان صورتی که جناب Just4froum اشاره نمودند عمل کنیم بهتر است، پس اگر بخواهیم نمونه کد بالا به این صورت ویرایش کنیم میشود:

Private Sub GetHMS(iHour%, iMin%, iSec%)
iHour% = Hour(Now)
iMin% = Minute(Now)
iSec% = Second(Now)
End Sub

Private Sub Command1_Click()
Dim iHour%, iMin%, iSec%
Call GetHMS(iHour%, iMin%, iSec%)
MsgBox ("H : " & iHour & vbCrLf & "M : " & iMin & vbCrLf & "S : " & iSec)
End Sub


البته کد بالا تنها برای توضیح موضوع بود وگرنه برای گرفتن مقادیر زمان نیازی به نوشتن یک تابع نیست

موفق باشید

Veteran
چهارشنبه 31 خرداد 1391, 16:11 عصر
:متفکر: سوالت جالب بود.
دوستان چک کنن.
Dim a As Integer, max As Integer, min As Integer
Dim c As Integer, d As Long
Dim tf As Boolean
Private Sub Command1_Click()
Dim Number
Dim Maax
Dim Miin
Number = Checker(0, 1, 5, 32, 99)
''' 1
MsgBox Number
'''2
For i = 1 To Len(Number)
h = Mid(Number, i, 1)
If h = "," Then
Miin = (Left(Number, i - 1))
Maax = Right(Number, i - 1)
End If
Next
MsgBox ("max = " & Maax)
MsgBox ("min = " & Miin)
End Sub
Function Checker(ParamArray Numbers())
For i = LBound(Numbers) To UBound(Numbers)
If tf = False Then
c = Numbers(i)
max = c
min = c
tf = True
Else
c = Numbers(i)
End If
If c > max Then max = c
If c < min Then min = c
Checker = min & "," & max
Next
End Function

ویرایش شد.

MohammadGh2011
چهارشنبه 31 خرداد 1391, 16:46 عصر
سلام ممنون
ولي کد خودم رو در پست اول رو به همين روش بنويسيد لطفا
البته جناب Veteran لطف کردند و نوشتن ولي از يه دستورهايي استفاده کردند که نامفهوم و شلوغه .

ببينيد مثلا همون Max وMin رو بخوايم بنويسيم بايد اينطور بنويسيم:

Public Function mm(x As Integer, y As Integer, z As Integer, w As Integer)
'دستورات
.
.
.
اينجا در آخر چه کار کنيم
mm=min کنيم
يا mm=max؟؟؟
من اينجا مشکل دارم.
End Function

Veteran
چهارشنبه 31 خرداد 1391, 17:10 عصر
ببینین تابع شما الان
4 تا پارامتر داره
mm(x As Integer, y As Integer, z As Integer, w As Integer)
بیشتر 4 تا نمیشه عدد زد
یعنی این الان ارور میده
mm(1,2,3,4,5)
ما اومدیم تابع رو به صورتی نوشتیم که بتونین n تا عدد بزنید

Function Checker(ParamArray Numbers())
For i = LBound(Numbers) To UBound(Numbers)
If tf = False Then
c = Numbers(i)
max = c
min = c
tf = True
Else
c = Numbers(i)
End If
If c > max Then max = c
If c < min Then min = c
Checker = min & "," & max
Next
End Function

checker(1,2,3)
checker(13,5,7,8)
checker(1,4,6,8,3,2,67,8,99)
بالاهایی ها ارور نمیدن
.
حالا توی تابع توی حلقه مقادیر رو از تابع میخونیم.
توی حلقه از ی شرط استفاده کردیم که میاد اولین عدد روی میخونه میریزه توی c
در واقع شرط توی حلقه اینکارو میکنه
c = InputBox("Number 1")
max = c
min = c

بعد میاد حساب میکنه max , min و برگشت داده میشه توی تابع
حالا من 2 روش نشون دادم نتیجه رو
یکی به صورت
max,min
یکی جدا جدا

Number = Checker(0, 1, 5, 32, 99)
''' 1
MsgBox Number
'''2
For i = 1 To Len(Number)
h = Mid(Number, i, 1)
If h = "," Then
Miin = (Left(Number, i - 1))
Maax = Right(Number, i - 1)
End If
Next
MsgBox ("max = " & max)
MsgBox ("min = " & min)


نتیجه رو ریختیم توی ی متغیر.
بعد برای روش اول متغیر رو پیغام دادیم
روش دوم
اینکه بیایم max و min رو از هم جدا کنیم.
چیزی که این وسط معلومه اینکه
یک علامت " , " وسط این 2 عبارت هست
که سمت چپی min هست و عبارت سمت راست max
ما باید بیایم ببینیم که این " , " در کجای عبارت قرار داره
واسه همین اومدیم

For i = 1 To Len(Number)
h = Mid(Number, i, 1)
If h = "," Then
Miin = (Left(Number, i - 1))
Maax = Right(Number, i - 1)
End If
Next


نتیجه رو پیمایش کردیم 1 دونه 1 دوه رفتیم بالا
و حرف به حرف جدا کردیم ریختیم توی متغیر h
اگه h برابر با " ' " بود بعد مقدار شمارنده حلقه میشه مکانی که علامت " ' " توی نتیجه هست.
مثلا اگه شرط برقرار بود و مثلا i=4
یعنی علامت " ' " چهارمین کاراکتر در عبارت هست
حالا ما باید بیایم با تابع left و right جدا کنیم.
این تابع ها 2 پارامتر میگیرند
left (عبارت,تعداد کاراکتری که قراره جدا بشه)
حالاشرط بر قراره میایم از سمت چپ به مقدار i-1 جدا میکنیم
ه مقدار شمارنده حلقه هست که اگه شرط برقرار باشه میگه مثلا در مکان 5 " ' "وجود داره
میایم با تابع left از نتیجه تا i-1 جدا میکنیم چون نمیخوام خود کاراکتر " ' " هم بیوفته میگیم i -1
بعد میریزیم توی متغیر min
همینطور برای max :لبخند::لبخند:

ASedJavad
چهارشنبه 31 خرداد 1391, 17:14 عصر
سلام

همونجوری که دوستان فرمودن چند تا راه داریم

1- استفاده از متغیرهای عمومی
2- استفاده از نوع داده کابر به عنوان خروجی تابع
3-استفاده از آرایه به عنوان خروجی
4- فرستادن دو آرگومان اضافی به تابع جهت ماکس و مین
5- خروجی تابع یه رشته باشه مثل "125,14"
6- مثلا اگه اعدادتون از 999 بیشتر نیستن، خروجیتون یه عدد شش رقمی (یا 4 و 5 رقمی) باشه، سه رقم اول برا ماکس و سه رقم دوم برا مین

البته راههای دیگه هم هست
مثلا یه کلاس تعریف کنید با دو تا پراپرتی

Veteran
چهارشنبه 31 خرداد 1391, 17:36 عصر
Public Function mm(x As Integer, y As Integer, z As Integer, w As Integer)
Dim Arr(1 To 4)
Arr(1) = x
Arr(2) = y
Arr(3) = z
Arr(4) = w
'' moratab sazi hobabi
For i = 1 To 4
For j = 1 To 4
If Arr(i) < Arr(j) Then
k = Arr(i)
Arr(i) = Arr(j)
Arr(j) = k
End If
Next: Next
mm = "Min: " & Arr(1) & " Max: " & Arr(4)

End Function

Private Sub Form_Load()
MsgBox mm(3, 7, 2, 8)
End Sub