بخش اول آموزش برنامه‌نویسی را به الگوریتم‌نویسی اختصاص داده‌ایم، در صورتی که با الگوریتم نویسی آشنایی دارید مستقیماً به بخش دوم بروید.
الگوریتم روش حل مسئله به صورت قدم به قدم است. اگر شما بتوانید یک مسئله را به صورت قدم به قدم حل کنید می توانید برنامه‌نویسی کنید. برای مثال دستور پخت یک غذا را در نظر بگیرید، این دستور یک الگوریتم است که به آشپز می گوید که چگونه غذا را تهیه کند. اگر شما دستور پخت غذا با جزئیات کامل را داشته باشید می توانید آن غذا را بپزید! البته متأسفانه در اغلب دستورات آشپزی فقط به شرح مختصری از روش پختن غذا اشاره می شود و جزئیات مهم موجود نیست! برنامه نویسی نیز به همین شکل است. اگر شما الگوریتم لازم را داشته باشید می توانید برنامه آن را با هر زبانی که دوست دارید پیاده کنید.

این بخش طولانی است، برای یادگیری بهتر پیشنهاد میکنم مطالب را بخش به بخش و با فاصله زمانی در چند روز مطالب را مطالعه نمایید و قبل از ادامه مطالعه بخش بعدی حتماً بخشهای قبلی را درک کرده باشید.

در این بخش تأکید بر یادگیری الگوریتم نویسی است. به نظر من برای یادگیری برنامه نویسی خوب است ابتدا الگوریتم نویسی را بیاموزیم و وارد جزئیات یادگیری یک زبان نشویم. برای نوشتن الگوریتم از یک شبه زبان استفاده خواهیم نمود. این شبه زبان در واقع هیچ زبان برنامه نویسی خاصی نیست اما نهایتاً وقتی شما الگوریتم نویسی با آن را آموختید، می توانید به راحتی آنها را در هر زبان برنامه نویسی پیاده کنید. شبه زبانی که در اینجا بیان خواهد شد بسیار شبیه به فرترن است.

الگوریتم:

در واقع الگوریتم، روند حل مسئله به صورت قدم به قدم است. هر قدم یک دستور کامپیوتر است. پس ابتدا لازم است دستورات قابل فهم کامپیوتر را بیاموزید سپس این دستورات را کنار هم چیده و مسئله را حل کنید. در این بخش دستورات کامپیوتر و نحوه نوشتن آن را خواهید آموخت. دستورات ارائه شده در این بخش شبیه به زبانهای برنامه نویسی کامپیوتر است. آن را شبه‌زبان می نامیم.  پس از یادگیری نوشتن الگوریتم با شبه زبان به سادگی می توانید آن را در هر زبان برنامه نویسی دیگری پیاده سازی نمایید. اصولاً ساختار زبانهای برنامه نویسی تا حدود زیادی شبیه به هم است. شبه زبان نیز به این ساختار مشترک بین زبانها نزدیک است.

ساختار برنامه:

هر برنامه کامپیوتر یک شروع و پایان مشخص دارد. در شبه زبان شروع برنامه را با دستور Program و پایان آن را با دستور End یا End Program نمایش می دهیم. دستورات بین شروع و پایان به ترتیب اجرا خواهند شد. لازم است هر برنامه یک اسم مشخص داشته باشد. نام برنامه پس از دستور Program نوشته میشود. همیشه سعی کنید که نام برنامه و فایل را چنان انتخاب کنید که بدون باز کردن و مطالعه آن بتوانید بفهمید که چه کاری انجام می دهد.
در شبه زبان سه قانون زیر را برای همه نامگذاریها رعایت کنید:

  1. نام بایستی با یک حرف شروع شود.
  2. نام بایستی فقط شامل حروف کوچک (a..z)، حروف بزرگ (A..Z) و اعداد باشد. (استفاده از _ نیز مجاز است، اما پیشنهاد نمی شود!)
  3. همیشه نام ها را به یک شکل و با یک ترکیب مشخص بنویسید.

در شبه زبان حروف کوچک و بزرگ با هم تفاوتی ندارند، اما مطابق قانون سوم شما همیشه یک نام را به یک شکل بنویسید. در ضمن تعداد حروف و اعداد استفاده شده محدود نیست، بنابراین پیشنهاد میکنم برای خوانایی بیشتر برنامه نامها را با دقت انتخاب کنید و نگران طولانی بودن آنها نباشید.
تا کنون ساختار برنامه ما به شکل زیر است:


هنوز این برنامه کاری انجام نمی دهد!

نوشتن توضیحات:

توضیحات دستورات اجرایی نیستند و فقط برای خوانایی بیشتر ممکن است به برنامه اضافه شوند. برای نوشتن توضیحات مختلف در برنامه لازم است قبل از شروع توضیحات علامت ! قرار گیرد، تمامی نوشته های بعد از این علامت تا پایان خط به عنوان توضیحات برنامه در نظر گرفته خواهد شد. استفاده از کاراکترهای غیر انگلیسی برای نوشتن توضیحات مجاز نیست!

تعریف متغیر:

برای نگهداری اعداد لازم است در حافظه کامپیوتر جایی در نظر گرفته شود. برای در نظر گرفتن جایی در حافظه، متغیرها را تعریف میکنیم. نام متغیر که از قوانین نامگذاری پیروی می کند، آدرس این محل از حافظه است. در شبه زبان برای تعریف متغیر لازم است ابتدا نوع آن و سپس نام آن را نوشت. فعلاً دو نوع متغیر صحیح و اعشاری را در نظر بگیرید. متغیر صحیح (Integer) برای نگهداری اعداد صحیح کاربرد دارد (برای مثال برای نگهداری مقدار یک شمارنده) و متغیرهای اعشاری (Real) برای نگهداری اعداد اعشاری به کار می رود. برای مثال فرض کنید که نیاز داریم در یک برنامه دو مقدار اعشاری و یک مقدار صحیح را نگهداری و روی آنها محاسبات انجام دهیم، در این صورت دو متغیر اعشاری a و b و یک متغیر صحیح c را به شکل زیر تعریف می کنیم. البته لزومی ندارد که نام متغیرها تک حرفی باشد و در واقع هرچه نام متغیر به وظیفه یا محتوایش نزدیکتر باشد بهتر است.


بعد از نوشتن نوع متغیر برای خوانایی بیشتر از :: استفاده می کنیم. وجود فاصله بین نوشته ها فقط برای خوانایی بیشتر است. همیشه الزامی است قبل از استفاده از هر متغیری آن را به تعریف نمایید. بجز در برخی دستورات مانند Read و Do، قبل از استفاده از هر متغیری نیز لازم است مقداری به آن اختصاص داده شود. این موارد را هنگام معرفی این دستورات مجدداً ذکر خواهیم نمود.

دستورات خواندن از صفحه کلید و چاپ روی مونیتور:

در شبه زبان برای دریافت مقدار یک متغیر از ورودی کامپیوتر (صفحه کلید) از دستور Read استفاده می کنیم. در این مورد نیازی نیست که متغیر از قبل مقداری داشته باشد. برای مثال اگر می خواهیم مقدار متغیر a ،b و c را از ورودی دریافت کنیم به شکل زیر می نویسیم:



یا

در شبه زبان برای چاپ مقدار یک متغیر یا یک نوشته در خروجی کامپیوتر (صفحه نمایش) از دستور print استفاده میکنیم. مثلاً برای چاپ مقدار a از دستور زیر استفاده می کنیم


برای چاپ یک عبارت در خروجی، کل عبارت را بین “ ” قرار خواهیم داد. برای مثال برای نمایش عبارت Hi programmers روی صفحه نمایش به شکل زیر عمل خواهیم نمود:

مثال: الگوریتمی بنویسید که دو عدد را از ورودی گرفته و حاصل جمع آنها را چاپ کند.


اجرای مثال فوق به شکل زیر خواهد بود (اعداد نمایش داده شده با قرمز ورودی کاربر است):

please enter 2 numbers:
  3.5
  4.5
Sum = 8.0

برای افزایش خوانایی برنامه دستورات را به صورت دندانه دار می نویسیم، به برنامه مثال بالا توجه نمایید، همه دستورات بین Program و End یک Tab (چند فاصله خالی) جلوتر نوشته شده اند و دقیقاً مشخص است که شروع و پایان برنامه کجاست.

دستور تصمیم گیری (دستور شرطی):

علت باهوش به نظر رسیدن کامپیوتر و تفاوت اصلی آن با ماشین حساب امکان تصمیم گیری بر اساس عبارتهای شرطی است. دستور زیر می تواند یک عبارت شرطی را بررسی کند، اگر مقدار یک عبارت شرطی صحیح بود دستورات بعد از then انجام خواهد شد و اگر نه دستورات بعد از else انجام خواهد شد.


دستورات داخل بخش then و Else به صورت دندانه دار نوشته می شود. در پایان دستور End if الزامی است. گاهی ممکن است به بخش Else نیازی نباشد که آن را نخواهیم نوشت. برای درک بهتر مثال زیر را ببینید: مثال: برنامه ای بنویسید که حقوق یک کارمند را از ورودی دریافت کرده و مالیات آن را محاسبه نماید و در خروجی چاپ کند. اگر حقوق بالای 150000 بود 10% آنرا به عنوان مالیات در نظر بگیرد و در غیر اینصورت 5% را به عنوان مالیات در نظر بگیرد.

دستورات شرطی چندگانه:

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


مثال: الگوریتمی بنویسید که نمره یک دانش آموز را از ورودی دریافت کرده و متناسب با آن او را تشویق کند! اگر 20 بود بنویسد Excellent، 18 و بالاتر بنویسد Very Good، بالاتر از 16 بنویسد Good، بالاتر مساوی از 14 بنویسد Not Bad، بالاترمساوی از 10 بنویسد Just Passed! و پایین تر از 10 بنویسد You are Failed!


همانطور که در مثال بالا مشاهده نمودید، شرط یک عبارت منطقی است و می تواند ترکیبی از عبارتهای شرطی کوچکتر باشد که با استفاده از پرانتز و AND و OR ایجاد می گردد. در خصوص ترکیب عبارتهای منطقی در آینده صحبت خواهیم نمود.
استفاده دستورات شرطی به صورت تو در تو:
گاهی لازم است که چند دستور شرطی را به صورت تودرتو استفاده نماییم. مثال بعد روش انجام این کار را نشان می دهد.
مثال: برنامه ای بنویسید که سه مقدار را از ورودی گرفته و تشخیص دهد که آیا می توان با این سه اندازه یک مثلث رسم نمود یا نه؟

به دندانه دار نوشتن برنامه ها توجه نمایید. دندانه دار نوشتن باعث افزایش خوانایی و حرفه ای تر شدن آن خواهد بود.

دستور پرش :

استفاده از این دستور در برنامه نویسی مجاز نیست (حتی در شبه زبان) و تا حد امکان از آن دوری کنید. در این متن این دستور را برای توضیح بهتر نحوه کارکرد سایر دستورات استفاده خواهیم نمود. دستور Goto باعث پریدن اجرای برنامه به جای خاصی در برنامه با یک عنوان مشخص خواهد شد و عملاً ترتیب اجرای برنامه را تغییر می دهد. در شبه زبان قبل از نوشتن عنوان * قرار می دهیم تا کاملاً از سایر دستورات متمایز باشد. قوانین نامگذاری عنوان نیز مانند سایر نامها است. مثال: الگوریتمی بنویسید که اعداد 1 تا 10 را چاپ کند.



مثال: الگوریتمی بنویسید که اعداد 100 تا 80 را با فاصله 2 چاپ کند.

دستور حلقه مشخص:

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



ما قبلاً دستور Goto را برای تشریح روش کار حلقه Do تعریف نمودیم و گفتیم تا حد امکان آن را استفاده نکنید. دستور Goto به خوبی می تواند روش کار حلقه تکرار را توضیح دهد. معادل دستور Do بالا با استفاده از دستور Goto به شکل زیر است:

i=nStart
* label1:
دستورات داخل حلقه
i=inStep
If (i<=nEnd) then
Goto lable1
EndIf
view rawgoto_Do.f90 hosted with ❤ by GitHub

در حلقه تکرار مشخص دستورات داخل حلقه به تعداد مشخصی تکرار خواهد شد و تعداد این تکرار به وسیله مقادیر عددی nStart، nEnd و nStep تعیین می شود. بایستی به جای این سه متغیر، اعداد یا متغیرهای عددی integer استفاده شود و در صورت استفاده از متغیر، لازم است مقدار این متغیرها در حین اجرای حلقه ثابت باشد. هنگام شروع حلقه متغیر شمارنده حلقه مقدار nStart را خواهد داشت. در هر تکرار مقدار nStep (می تواند منفی نیز باشد) به شمارنده اضافه خواهد شد و حلقه تا زمانی که مقدار شمارنده به nEnd نرسیده باشد تکرار خواهد شد. اگر در نوشتن دستور حلقه مقداری برای مشخص نمودن قدمها (nStep) مشخص نشده باشد مقدار پیش فرض یک استفاده خوهد شد. استفاده از متغیر شمارنده حلقه در دستورات داخل حلقه مجاز است اما تغییر مقدار آن مجاز نیست. برای درک بهتر، روش استفاده از حلقه تکرار مشخص، کاربرد آن را با چند مثال نشان خواهیم داد. مثال: الگوریتمی بنویسید که اعداد 1 تا 10 را چاپ کند.

Program Print1to10
Integre::i
Do i=1,10
Print i
End do
End Program
view rawPrint1to10Do.f90 hosted with ❤ by GitHub


مثال: الگوریتمی بنویسید که اعداد 100 تا 80 را با فاصله 2 چاپ کند.

Program Print100to80Step2
Integer:: i
Do i=100,80,2
Print i
End do
End Program

مثال: الگوریتمی بنویسید که عددی را از ورودی بخواند و اعداد زوج بین 0 تا آن عدد را در خروجی چاپ کند.

Program Print1toN
Integer:: n
Read n
Do i=0,n,2
Print i
End do
End Program
view rawPrint1toN.f90 hosted with ❤ by GitHub

دستور حلقه شرطی:

حلقه شرطی تا زمانی که عبارت شرطی آن صحیح باشد تکرار خواهد شد. در هر بار تکرار عبارت شرطی بررسی می کند و در صورت صحیح بودن آن دستورات داخل حلقه اجرا خواهد شد. ساختار حلقه شرطی به شرح زیر است:

Do While (عبارت شرطی)
دستورات داخل حلقه
End do
view rawDoWhile.f90 hosted with ❤ by GitHub

برای شروع حلقه لازم است که عبارت شرطی قبل از شروع حلقه (اولین ارزیابی عبارت شرطی) صحیح باشد. در حلقه شرطی شمارنده وجود ندارد مثال: برنامه ای بنویسید که جمع اعداد ورودی را زمانی که عدد 999 وارد شد چاپ کند (فعلاً اعداد را صحیح در نظر بگیرید، علت را به زودی برایتان توضیح خواهم داد).

Program SumTill999
Integer:: sum, a
sum=0
a=0
Do While (a!=999)
sum=sum+a
Read a
End do
Print sum
End Program
view rawSumTill999.f90 hosted with ❤ by GitHub

آرایه:

آرایه مجموعه از متغیرها با نوع مشابه است. قبلاً با انواعی از آرایه ها مانند بردارها و ماتریسها آشنا شده اید. بردار یک آرایه یک بعدی است. ماتریس آرایه دو بعدی است. نوع متغیرها در آنها اعداد صحیح است. استفاده از آرایه پایه برنامه نویسی پرسرعت مهندسی است. برای تعریف یک آرایه از ساختار زیر استفاده خواهیم نمود:

نوع آرایه , dimension(تعداد اعضاء ,تعداد اعضاء,…) ::نام آرایه

برای تعریف بردار A با سه عضو (بردار در فضای سه بعدی) نیاز داریم آرایه ای شامل سه عضو را تعریف نماییم و به شکل زیر عمل می کنیم:

Real, dimension(3)::A
view rawarrayA.f90 hosted with ❤ by GitHub

برای تعریف ماتریس B که در جهت x دارای سه عضو و در جهت y دارای چهار عضو است از یک آرایه دو بعدی استفاده خواهیم نمود:

Real, dimension(3,4)::B
view rawarrayB.f90 hosted with ❤ by GitHub


به همین ترتیب می توانید آرایه های مختلف را تعریف نمایید.
برای دسترسی به اعضاء مختلف آرایه کافی است که اندیس مربوط به آن را وارد نمایید، مثلاً برای دسترسی به A1 خواهیم نوشت A(1) و برای دسترسی به B23 خواهیم نوشت B(2,3) . دسترسی به آرایه ها بایستی با توجه به قرارگیری آنها در حافظه باشد تا سرعت محاسبات بالاتر برود. در این خصوص در مبحث آرایه فرترن صحبت خواهیم نمود.
الگوریتمی بنویسید که دو بردار سه بعدی را از ورودی گرفته جمع آنها را نمایش دهد.

Program Add2Vector3DSimpleExample
Real,dimension(3)::A,B,C
Integer::i
Do i=1,3
Print ‘Please enter A(‘, i , ‘)’
Read A(i)
Print ‘Please enter B(‘, i , ‘)’
Read B(i)
C(i)=A(i)+B(i)
Print ‘C(‘,i,’)=’, C(i)
End do
End Program

مثال بالا را به گونه ای بنویسید که ابتدا بردار A و پس از آن بردار B را از ورودی دریافت نمود و حاصل جمع آنها را چاپ نماید.

Program Add2Vector3D
Real,dimension(3)::A,B,C
Integer::i
Do i=1,3
Print Please enter A(, i , )
Read A(i)
End do
Do i=1,3
Print Please enter B(, i , )
Read B(i)
End do
Do i=1,3
C(i)=A(i)+B(i)
End Do
Do i=1,3
Print C(,i,)=, C(i)
End do
End Program
view rawAdd2Vector3D.f90 hosted with ❤ by GitHub


دستور Read می تواند به صورت خودکار تمامی اعضاء یک آرایه را از ورودی دریافت نماید. به همین ترتیب دستور Print می تواند به صورت خودکار تمامی آعضاء آرایه را به ترتیب نمایش دهد. مثال بالا را با استفاده از این امکانات خواهیم نوشت:

Program AddVector3D
Real,dimension(3)::A,B,C
Integer::i
Print Please enter A1,A2,A3
Read A
Print Please enter B1,B2,B3
Read B
Do i=1,3
C(i)=A(i)+B(i)
End Do
Print C=, C
End Program
view rawAddVector3D.f90 hosted with ❤ by GitHub

مثال: الگوریتمی بنویسید که ضرب خارجی دو بردار را محاسبه نماید.

Program MulVector3D
Real,dimension(3)::A,B,C
Integer::i
Print ‘Please enter A1,A2,A3’
Read A
Print ‘Please enter B1,B2,B3’
Read B
C(1)=A(2)*B(3)A(3)*B(2)
C(2)=A(3)*B(1)A(1)*B(3)
C(3)=A(1)*B(2)A(2)*B(1)
Print ‘C=’, C
End Program
view rawMulVector3D.f90 hosted with ❤ by GitHub

تابع:

شما قبلاً با توابعی مانند sin(x) و cos(x) آشنا شده اید. یک تابع می تواند یک یا چند ورودی داشته باشد اما همیشه یک مقدار بازگشتی یا یک خروجی دارد. در برنامه نویسی توابعی که کارهای خاصی انجام می دهند را به صورت مجزا نوشته و ارزیابی می کنند. یکی از مزایای استفاده از توابع امکان استفاده مجدد از آنها است یعنی یکبار تابع را نوشته و بارهای از آن استفاده می کنیم. حتی می توانید مجموعه ای از توابع را در یک کتابخانه در کنار هم گردآورید و در برنامه ها از آنها استفاده نمایید. برای مثال کتابخانه توابع برای محاسبات ریاضی را ایجاد کنید. یکی از قدرتهای برنامه نویسی امکان استفاده از کتابخانه های آماده است.
برای نوشتن یک تابع لازم است ابتدا نوع تابع مشخص گردد. نوع تابع همان نوع بازگشتی است. مثلاً تابع sin(x) مقدار x را دریافت می کند که از نوع Real است و مقدار sin(x) را باز می گرداند که آن هم از نوع Real است. تابع به صورت زیر تعریف می گردد

نوع تابع function نام تابع(متغیرهای ورودی تابع)
تعریف متغیرهای ورودی
دستورات تابع
نام تابع = مقدار
end

دستورات تابع دقیقاً همان الگوریتم است. اولین خط تعریف نوع تابع (نوع مقدار بازگشتی تابع)، کلمه کلیدی function، نام تابع و متغیرهای ورودی تابع است که در پرانتز نوشته می شوند. خط بعدی تعریف متغیرهای ورودی تابع است. الگوریتم انجام محاسبه تابع بعد از تعریف متغیرهای ورودی نوشته می شود. در دستورات تابع بایستی مقداری به نام تابع اختصاص داده شود.
مثال: تابعی بنویسید که ورودی خود را به توان سه برساند.

Real Function Power3(x)
Real::x
Power3=x^3
End Function
view rawPower3.f90 hosted with ❤ by GitHub

مثال: تابعی بنویسید که حاصل جمع دو ورودی خود را محاسبه نموده و بازگرداند

Real Function Add(x,y)
Real::x,y
Add=x+y
End Function
view rawAdd.f90 hosted with ❤ by GitHub


مثال: با دانستن این که تابع mod باقیمانده تقسیم اولین ورودی بر دومین ورودی خود را باز می گرداند، تابعی بنویسید که یک ورودی را گرفته در صورتی که ورودی اول باشد مقدار آن را چاپ کند و در صورتی که اول نباشد عدد یک را باز گرداند.

تابع mod باقیمانده تقسیم اولین ورودی بر دومین ورودی خود را نمایش می دهد، برای مثال محاسبات زیر را ببینید:

mod(10, 2)=0
mod(10, 3)=0
mod(10, 4)=8
view rawmod.f90 hosted with ❤ by GitHub

بنابراین اگر ورودی اول تابع mod بر ورودی دومش بخش پذیر باشد نتیجه این تابع برابر 0 خواهد بود.

Integer Function Aval(n) !looking for prime number
Integer::n,i, BakhshPazir
BakhshPazir=0
Do i=1, n
If(mod(n,i)==0)then
BakhshPazir= BakhshPazir+1
EndIf
End do
If (BakhshPazir==2) then
Aval=n
Else
Aval=0
EndIf
End Function
view rawAval.f90 hosted with ❤ by GitHub


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

ارسال با مقدار و ارسال با آدرس:

زبانهای مختلف برای ارسال مقدار یک متغیر به تابع (یا زیربرنامه-در بخش بعد معرفی می گردد) از دو روش استفاده می کنند. در روش اول (ارسال با مقدار) عملاً یک کپی از مقدار متغیر تهیه شده و به عنوان ورودی به تابع ارسال می گردد. در این روش تابع فقط به کپی مقدار ورودی دسترسی دارد و در صورتی که تابع، مقدار ورودی را تغییر دهد فقط مقدار کپی شده تغییر می کند و متغیر اصلی برنامه دستنخوده باقی می ماند. روش دوم (ارسال با آدرس)، آدرس متغیر به تابع فرستاده می شود و در صورتی که تابع متغیر ورودی خود را تغییر دهد، متغیر اصلی موجود در آن آدرس یعنی متغیر موجود در برنامه نیز تغییر خواهد کرد. این موضوع بسیار خطرناک است. بنابراین برای جلوگیری از آن هرگاه تابعی می نویسید مطمئن شوید که متغیر ورودی در تابع تغییری نمی کند. اجازه دهید با یک مثال موضوع را روشن کنم:
فرض کنید شما یک فایل در کامپیوتر خود دارید، یک کپی از آن تهیه کرده و آن را در اختیار همکلاسیتان که روی همان کامپیوتر کار می کند قرار می دهید. همکلاسی شما روی فایل کار کرده و آن را تغییر می دهد. فایل اصلی شما محفوظ است و خطری آن را تهدید نمی کند. این حالت مانند ارسال با مقدار است، یعنی یک کپی از متغیر اصلی تهیه و ارسال شده است.
حال فرض کنید شما آدرس فایل اصلی در کامپیوتر خود را به دوستتان بدهید، دوستتان فایل را باز کرده و روی آن تغییراتی ایجاد کند! چه اتفاق ناخوشایندی است، اگر دوستتان فایل را خراب کند، مخصوصاً اگر هیچ نسخه پشتیبانی نداشته باشید! دقیقاً مشابه این حالت ارسال یک متغیر با آدرس است؛ به جای آن که یک کپی از متغیر تهیه شود، آدرس متغیر ارسال می گردد بنابراین اگر تابع تغییری روی متغیر ارسال شده ایجاد کند، متغیر اصلی تغییر می کند. عملاً متغیر ارسال شده و متغیر اصلی یکسان هستند و فقط آدرس متغیر اصلی به تابع ارسال شده است. ارسال با آدرس مزیتهایی هم دارد، سرعت بالاتر و استفاده از حافظه کمتر از مزیتهای ارسال با آدرس است. فرترن متغیرها را با آدرس ارسال میکند.

زیربرنامه:

زیربرنامه شبیه به تابع است با این تفاوت که می تواند تعداد زیادی خروجی داشته باشد (تابع فقط یک خروجی داشت!). ساختار زیر برنامه به شکل زیر است:

Subroutine نام زیر برنامه (متغیرهای ورودی و خروجی)
تعریف متغیرهای ورودی و خروجی
دستورات زیر برنامه
End

در زیربرنامه متغیرها چه ورودی باشند و چه خروجی باشند، در کنار هم نوشته می شوند. این که کدام متغیر ورودی است و کدام خروج قراردادی است که شما به عنوان برنامه نویس تعیین میکنید، قانونی را در بخش استفاده از توابع بیان کردیم “تابع مجاز نیست مقدار متغیرهای ورودی خود را تغییر دهد”، این قانون در اینجا هم صادق است: “زیربرنامه مجاز نیست متغیرهای ورودی خود را تغییر دهد”. تفاوت متغیرهای ورودی و خروجی فقط همین است که زیربرنامه مجاز است مقادیر متغیرهای خروجی را تغییر دهد. به راحتی می توان نتیجه گیری کرد که یک متغیر می تواند هم نقش ورودی را داشته باشد یعنی یک مقدار را به زیربرنامه وارد نماید و هم نقش خروجی را داشته باشد یعنی در زیر برنامه مقدارش تغییر کند. پس ورودی و خروجی بودن متغیرها با نحوه استفاده و مقداردهی در دستورات مشخص می گردد و متغیرها می توانند به عنوان ورودی و خروجی عمل کنند. البته دستوراتی برای انحصاری کردن ورودی و خروجی یا ورودی- خروجی هم وجود دارد که در بخش آموزش فرترن به آنها خواهیم پرداخت.
مثال: زیربرنامه ای بنویسیدکه جمع دو بردار سه بعدی را محاسبه نموده و حاصل را بازگرداند

Subroutine Add2Vector3D(A,B,C)
Real, dimension(3)::A,B,C
Integer::i
Do i=1,3
C(i)=A(i)+B(i)
End do
End Subroutine
view rawSubAdd2Vector3D.f90 hosted with ❤ by GitHub

همانطور که در مثال بالا میبینید، آرایه های یک بعدی با سه عضو برای نگهداری بردارها استفاده شده است. ابتدا تعریف ورودی ها و خروجی خروجی ها نوشته شده است. با توجه به این که مقادیر ورودی توسط برنامه فراخواننده زیربرنامه و از خارج زیربرنامه ارسال میگردد، عملاً مقادیر آنها مشخص است. برای استفاده از زیربرنامه از دستور Call استفاده می گردد. به این صورت که ابتدا دستور Call را نوشته و نام زیربرنامه را پس از آن می نویسیم. جلو نام زیربرنامه در پرانتز متغیرهای ورودی و خروجی (متغیرهایی با نوع و اندازه مشابه متغیرهای تعریف شده برای زیربرنامه) را خواهیم نوشت و به این صورت متغیرها به زیربرنامه ارسال شده و حاصل به برنامه اصلی بازگردانده خواهد شد. مثال: الگوریتمی بنویسید که زیربرنامه فوق را فراخوانی نماید:

Program Call2Vector
Real, dimension(3)::A, B, C
Print Please enter A1,A2,A3
Read A
Print Please enter B1,B2,B3
Read B
Call Add2Vector3D(A,B,C)
Print C=, C
End Program
view rawCall2Vector.f90 hosted with ❤ by GitHub

محدوده وجود متغیرها:

یک متغیر از زمانی که تعریف می شود به وجود می آید و تا پایان آن بخش زندگی می کند. برای مثال متغیرهای یک تابع با تعریف متغیر در تابع به وجود می آیند و با پایان تابع از بین می روند. به همین ترتیب متغیرهای یک برنامه در زمان تعریف ایجاد می شوند و تا پایان برنامه زندگی می کنند. البته زمانی که شما یک متغیر را به تابعی ارسال می کنید، آدرس آن متغیر به تابع ارسال می گردد، عملاً می توان گفت که متغیرهای ورودی تابع یا متغیرهای ورودی و خروجی زیربرنامه فقط یک نام هستند که به آدرس ارسال شده اشاره دارند
، این نام با تعریف متغیر به وجود میآید و پس از پایان تابع یا زیربرنامه فقط این نام پاک میشود و آدرس اصلی پاک نخواهد شد. این قاعده برای سایر متغیرهای تابع و زیربرنامه (همه متغیرها به غیر از متغیرهای ورودی و خروجی) صادق نیست و آنها با تعریف ایجاد شده و با پایان آن بخش از بین می روند.

سایر انواع متغیرها:

تا کنون با دو نوع متغیر آشنا شده ایم، نوع Real برای نگهداری اعداد حقیقی و نوع Integer که برای نگهداری اعداد صحیح است . در این مبحث با دو نوع متغیر یعنی Logical منطقی و Character متغیر کاراکتری آشنا خواهیم شد. قبلاً روابط منطقی را در تصمیم گیریها استفاده نمودیم. مقدار یک متغیر منطقی می تواند True یا False باشد (صحیح یا غلط، صفر یا غیر صفر). حاصل هر عبارت منطقی یا صحیح است یا غلط و شما می توانید این حاصل را در یک متغیر Logical ذخیره نمایید. برای مثال دستورات زیر را ببینید:

Logical:: A, B
Integre::x
x=3
A=True
B= (4+x>5)
view rawLogical.f90 hosted with ❤ by GitHub

در دستورات بالا متغیرهای منطقی Aو B و متغیر صحیح x را تعریف نموده ایم، با اجرای دستورات بالا مقادیر A و B هر دو صحیح خواهد بود. نوع دیگر متغیر کاراکتری است. در اولین مثال یک الگوریتم نوشتیم که رشته Hello World را در خروجی چاپ کند. عملاً عبارت Hello World از 11 کاراکتر تشکیل شده است، ده حرف و یک فاصله و می توان آن را در یک آرایه 11 عضوی از نوع Character ذخیره نمود. عملاً یک متغیر کاراکتری می تواند حاوی یک حرف یا نمایش یک عدد یا یک علامت باشد. فهرست حروف ممکن را در ASCII می بینید. ما از آرایه ای از کاراکترها برای نگهداری اسامی و رشته ها استفاده می کنیم. مثال: الگوریتمی بنویسید که اسم شما را از ورودی بگیرد و به شما سلام کند.

Program SayHello
Character, dimension (20)::name
Read name
Print, Hello , name
End Program
view rawSayHello.f90 hosted with ❤ by GitHub


در الگوریتم بالا فرض نمودیم که اسم وارد شده کمتر از 20 کاراکتر باشد و برای آن یک متغیر name به اندازه 20 کاراکتر در نظر گرفتیم.

ورودی و خروجی فایل:

یک فایل برای ذخیره سازی دائم اطلاعات در کامپیوتر به کار می رود. برای کار با یک فایل بایستی ابتدا آن را باز کنید، هنگام بازکردن فایل یک شماره به فایل اختصاص خواهیم داد و سایر دستورات مربوط به فایل را با این شماره استفاده خواهیم نمود. اگر برنامه شما نیاز دارد همزمان بر روی چند فایل کار کند، لازم است به هر یک شماره منحصربفردی اختصاص دهیم. برای باز کردن فایل از دستور open استفاده خواهیم نمود. ساختار این دستور به شکل زیر است.
هنگامی که یک فایل را باز کردید، اشاره گر فایل به ابتدای آن اشاره می کند. در هر خواندن یا نوشتن فایل این اشاره گر جابجا می شود و به صورتی است که به آدرس بعد از آخرین خواندن یا نوشتن بعد از فایل اشاره خواهد کرد. یعنی با هر نوشتن و خواندن این اشاره گر به صورت خودکار جابجا خواهد شد.
سپس با دستور Write(number,*) می توانید
برای نوشتن در یک فایل لازم است ابتدا آن را ایجاد نموده یا باز کنیم، این کار با دستور open انجام می گیرد. ساختار این دستور بسیار ساده است. ابتدا فایل را با این دستور باز میکنیم.