اغلب در هنگام نوشتن برنامهها با مواردی برخورد می کنیم که مجبور میشویم مجموعهای از مراحل را بارها و بارها اجرا کنیم.
در این موارد، احتمالاً بازنویسی چندین دستور مشابه، منطقی نخواهد بود. آن وقت است که از زیربرنامه ها استفاده می کنیم.
یک زیر برنامه، بخشی از کدهای نوشته شده از یک برنامه بزرگتر است که معمولاً کار خاصی را انجام می دهد و می تواند از هر جایی در برنامه فراخوانی شود.
زیربرنامه ها با نامی که پس از کلمه کلیدی Sub قرار می گیرد شناسایی می شوند و با کلمه کلیدی EndSub به پایان می رسند.
به عنوان مثال، در ادامه زیربرنامه ای به نام PrintTime را می بینید که کار چاپ زمان جاری در TextWindow را انجام می دهد:
Sub PrintTime
TextWindow.WriteLine(Clock.Time)
EndSub
حال برنامه ای را می نویسیم که در داخل خود، دو بار برنامه فوق را فراخوانی کرده است:
()PrintTime
TextWindow.Write(“Enter your name: “)
()name = TextWindow.Read
TextWindow.Write(name + “, the time now is: “)
()PrintTime
Sub PrintTime
TextWindow.WriteLine(Clock.Time)
EndSub
شکل ۱-۹ : فراخوانی یک زیربرنامه ساده
شما با فراخوانی ()SubroutineName یک زیربرنامه را اجرا می کنید.
وجود نشانههای پرانتز “()” ضروری هستند تا به رایانه بگویید که میخواهید یک برنامه فرعی را اجرا کنید.
مزایای استفاده از زیربرنامه ها
همانطور که در بالا دیدیم، زیربرنامه ها به کاهش مقدار کد نوشته شده توسط برنامه نویس، کمک می کند.
بعد از نوشتن زیربرنامه PrintTime ، می توانیم آن را از هر جایی در برنامه خود فراخوانی کرده و زمان فعلی را چاپ کنیم.
توجه: به یاد داشته باشید، فقط می توانید یک زیرروال (زیربرنامه) SmallBasic را از داخل همان برنامه فراخوانی کنید. شما نمی توانید یک زیربرنامه را از داخل یک برنامه دیگر فراخوانی کنید.
علاوه بر این، برنامه های فرعی (زیربرنامه ها) می توانند به تجزیه مسائل پیچیده به قطعات ساده تر کمک کنند.
فرض کنید یک معادله مختلط برای حل دارید، می توانید چندین زیر روال بنویسید که قطعات کوچکتری از معادله مختلط را حل می کند. سپس می توانید نتایج را کنار هم قرار دهید تا جواب معادله مختلط اصلی را بدست آورید.
زیربرنامه ها همچنین می توانند به بهبود خوانایی یک برنامه کمک کنند. به عبارت دیگر، اگر برای بخشهایی که معمولاً اجرا میشوند، زیرروالهایی با نام خوب داشته باشید، خواندن و درک برنامهتان آسان میشود.
اگر می خواهید برنامه شخص دیگری را درک کنید یا اگر می خواهید برنامه شما توسط دیگران درک شود، انتخاب نام مناسب برای آن بسیار مهم است.
گاهی اوقات، حتی زمانی که می خواهید برنامه خود را بعد از مدتی بازخوانی کنید، این موضوع بسیار مفید می باشد.
استفاده از متغیرها در زیربرنامه ها
شما می توانید از داخل یک زیربرنامه به هر متغیری که در برنامه دارید دسترسی داشته باشید و از آن استفاده کنید.
به عنوان مثال، برنامه زیر دو عدد را دریافت کرده و عدد بزرگتر را چاپ می کند. توجه داشته باشید که متغیر max هم در داخل و هم در خارج از زیربرنامه استفاده می شود.
TextWindow.Write(“Enter first number: “)
()num1 = TextWindow.ReadNumber
TextWindow.Write(“Enter second number: “)
()num2 = TextWindow.ReadNumber
()FindMax
TextWindow.WriteLine(“Maximum number is: ” + max)
Sub FindMax
If (num1 > num2) Then
max = num1
Else
max = num2
EndIf
EndSub
خروجی این برنامه به شکل زیر است:
شکل ۲-۹ : بازگرداندن عدد بزرگتر از بین دو عدد توسط زیربرنامه
بیایید به مثال دیگری نگاه کنیم که استفاده از زیربرنامه را نشان می دهد.
این بار از یک برنامه گرافیکی استفاده می کنیم که مختصات نقاط مختلفی را محاسبه و در متغیرهای x و y ذخیره می کند.
سپس زیربرنامه DrawCircleUsingCenter را فراخوانی کرده که مسئول رسم دایره ای است که مختصات مرکز آن x و y می باشد.
در اینجا قالب کلی برای نوشتن یک برنامه استاندارد آمده است.
پیروی از این قالب باعث می شود که برنامه ها به درستی کار کنند و همچنین برای برنامه نویسان دیگر (و حتی مراجعات بعدی خودتان به برنامه) به راحتی قابل درک و پیگیری باشد.
در این قالب:
– متغیرها در بالای برنامه قرار می گیرند.
– سپس برنامه اصلی نوشته می شود.
– و در ادامه برنامه های فرعی (زیربرنامه ها) آورده می شوند.
فراخوانی زیربرنامه ها در داخل حلقه ها
گاهی اوقات زیر روال ها در داخل یک حلقه فراخوانی می شوند، در این مدت آنها مجموعه ای از دستورات یکسان را اما با مقادیر متفاوت در یک یا چند متغیر اجرا می کنند.
به عنوان مثال، زیربرنامه ای به نام PrimeCheck در برنامه زیر وجود دارد که تعیین می کند آیا یک عدد اول است یا خیر.
در اینجا به کاربر اجازه میدهید مقداری را وارد کند و سپس با استفاده از این زیر روال میتوانید بگویید که آیااین عدد اول است یا نه:
TextWindow.Write(“Enter a number: “)
()i = TextWindow.ReadNumber
“isPrime = “True
()PrimeCheck
If (isPrime = “True”) Then
TextWindow.WriteLine(i + ” is a prime number”)
Else
TextWindow.WriteLine(i + ” is not a prime number”)
EndIf
Sub PrimeCheck
For j = 2 To Math.SquareRoot(i)
If (Math.Remainder(i, j) = 0) Then
isPrime = “False”
Goto EndLoop
EndIf
Endfor
:EndLoop
EndSub
در مثال فوق، زیربرنامه PrimeCheck مقدار i را گرفته و آن را بر اعداد کوچکتر تقسیم کند.
اگر باقیمانده هر کدام از این تقسیم ها صفر شود، نتیجه خواهیم گرفت که i بر عددی بخش پذیر است و در نتیجه یک عدد اول نیست و در این مرحله زیربرنامه مقدار isPrime را روی “False” تنظیم کرده و خارج می شود.
اگر عدد بر اعداد کوچکتر غیرقابل تقسیم بود، مقدار isPrime به صورت “True” باقی می ماند.
شکل ۴-۹ : چک کردن اول بودن یک عدد
اکنون که زیربرنامهای دارید که میتواند تست اول بودن یک عدد را برای ما انجام دهد، ممکن است بخواهید از آن برای فهرست کردن همه اعداد اول کوچکتر از یک عدد (مثلاً ۱۰۰) استفاده کنید.
انجام این کار ساده است و در ادامه نشان داده شده است. برنامه زیر تمام اعداد اول کوچکتر از ۱۰۰ را در خروجی چاپ می کند:
For i = 3 To 100
“isPrime = “True
()PrimeCheck
If (isPrime = “True”) Then
TextWindow.WriteLine(i)
EndIf
EndFor
Sub PrimeCheck
For j = 2 To Math.SquareRoot(i)
If (Math.Remainder(i, j) = 0) Then
“isPrime = “False
Goto EndLoop
EndIf
Endfor
:EndLoop
EndSub
در برنامه بالا هر بار که حلقه اجرا می شود مقدار i تغییر می کند.
در داخل حلقه، فراخوانی زیربرنامه PrimeCheck انجام می شود که مشخص می کند که آیا i یک عدد اول است یا خیر و نتیجه در متغیر isPrime ذخیره می شود.
در هر بار از اجرای زیربرنامه، اگر معلوم شود که i عدد اول است، چاپ می شود.
از آنجایی که حلقه از ۳ شروع می شود و تا ۱۰۰ ادامه می یابد، لیستی از تمام اعداد اول که بین ۳ تا ۱۰۰ هستند را در خروجی خواهیم دید.