حسین اتحادی سه شنبه 14 آبان 1398 06:05 ب.ظ نظرات ()

مثال برنامه‌نویسی:

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

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

دیاگرام برنامه:

  1. شروع
  2. ضرایب ورودی
  3. معادله را بخوان
  4. دلتا را محاسبه کن
  5. اگر دلتا بزرگتر یا مساوی صفر است
    1. ریشه ها را محاسبه کن
    2. ریشه ها را چاپ کن
  6. در غیر اینصورت
    1. چاپ کن “معادله ریشه حقیقی ندارد”
  7. پایان

برنامه:

PROGRAM Equation_solver_fortran
! This is program calculate the real roots of second order equation
IMPLICIT NONE ! this is important to get used to this statment
! Variable decleration
REAL::a,b,c
REAL::Delta, x1, x2
! Main Porgram
WRITE(*,*) "Please enter the equation coefficients a*x^2+b*x+c"
WRITE(*,*) "a: ?"
READ(*,*) a
WRITE(*,*) "b: ?"
READ(*,*) b
WRITE(*,*) "c: ?"
READ(*,*) c
Delta=b**2-4*a*c
IF (Delta >= 0) THEN
x1=(b+SQRT(Delta))/(2*a)
x2=(b-SQRT(Delta))/(2*a)
WRITE(*,*) " The real roots are : ", x1, x2
ELSE
WRITE(*,*) " This equation has no real root!"
ENDIF
PAUSE
END PROGRAM Equation_solver_fortran

اگر در نوشتن برنامه اشتباهی نکرده باشید، برنامه اجرا خواهد شد. تبریک می گویم، شما اولین برنامه مهندسی خود را نوشته اید. در خواندن برنامه بالا نباید مشکلی داشته باشید. فقط ممکن است ساختار IF..THEN..ELSE و تابع SQRT() برایتان تازگی داشته باشد و همانطور که حدس زده اید، ساختار IF..THEN..ELSE ساختار تصمیم گیری و تابع SQRT() تابع جذر می باشد که در بخشهای بعدی در مورد آن بحث خواهیم کرد.   برنامه نویسی شما فقط محدود به تفکر شما در مورد برنامه هاست. هر آنچه که فکر کنید را می توانید بنویسید. حتی برنامه های پیچیده هوش مصنوعی نیز با همین دستورات ساده قابل نوشتن است. در هر حال اگر بدانید چه می خواهید برنامه نویسی بسیار لذت بخش خواهد بود. آموختن یک زبان برنامه نویسی مانند یادگرفتن استفاده از یک ابزار است. هر چه ابزار قویتری داشته باشید کارها ساده تر انجام خواهد گرفت، زبان فرترن یک ابزار برنامه نویسی مهندسی بسیار کارآمد است.

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

کار کردن با فایلها در فرترن بسیار ساده است. ورودی وخروجی فایل هم مانند ورودی از صفحه کلید یا خروجی به نمایشگر با دستور READ و WRITE صورت می گیرد. در این حالت بخش UNIT در این دستورات مشخص کننده نوع ورودی و خروجی است. برای ورودی از صفحه کلید و خروجی به صفحه نمایش، بخش UNIT در این دستورات برابر * قرار می گیرد. برای ورودی و خروجی از فایل، ابتدا فایل را باز می کنیم، این کار یک عدد (UNIT) به فایل اختصاص می دهد.

دستور OPEN

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

OPEN(UNIT= number, FILE= ’Name of file’, STATUS= status, ACCESS= access…)

number عددی است که شما به فایل اختصاص می دهید (این عدد را بین 0 تا 255 انتخاب کنید – یعنی شما می توانید با خیال راحت تا 255 فایل مجزا را باز کنید!)، این عدد شناسه فایل است.   status وضعیت فایل را مشخص می کند و می تواند برای ایجاد فایل جدید ‘NEW’ باشد، یا ‘OLD’ برای باز کردن فایل موجود و اگر مطمئن نیستید ‘UNKNOWN’ بکار می رود و ‘SCRATCH’ برای ایجاد فایلهای موقت که با پایان برنامه یا بسته شدن فایل، فایل از بین می رود! وضعیت ‘REPLACE’ برای جایگزاری فایل جدید است. اگر فایل موجود باشد، پاک شده و فایل جدید جایگزین آن می گردد و اگر فایل موجود نباشد، فایل جدید ایجاد می گردد.   access نوع دسترسی به فایل را مشخص می کند که ممکن است، ‘DIRECT’ یا ‘SEQUENTAL’ باشد. نوع دسترسی به فایل بسیار مهم است، اما دسترسی ترتیبی ‘SEQUENTAL’ بسیار ساده است. در این فایلها داده ها بترتیب خط به خط خوانده و نوشته می شوند. پیش فرض دسترسی ترتیبی است.

دستور CLOSE

پیشنهاد می گردد بعد از پایان کار با فایل آنرا ببندید. ساختار این دستور به شکل زیر است:

CLOSE (UNIT= unit, STATUS = status…)

 unit شماره شناسه فایل است وstatus وضعیت بستن می تواند ‘KEEP’ برای حفظ فایل و ‘DELETE’ برای حذف فایل است. پیش فرض حذف فایل است.

توابع و زیربرنامه ها

توابع داخلی Intrinsic Functions هر مترجم برنامه فرترن کتابخانه ای از توابع داخلی دارد. بعضی از مهمترین این توابع به شرح زیر هستند.

  • توابع مثلثاتی: SIN, COS, ASIN, ACOS, TAN, ATAN, COTAN
  • توابع ریاضی: قدرمطلق ABS، جذر SQRT، لگاریتم LOG, LOG10، تابع نمایی EXP، حداقل و حداکثر MIN,MAX، باقیمانده تقسیم MOD و…
  • توابع ماتریسی: DOT_PRODUCT, MATMUL, TRANSPOSE,…

توابع بسیار زیاد دیگری نیز وجود دارد؛ همچنین ممکن است که مترجم شما توابع بیشتری از توابع استاندارد در اختیار شما قرار دهد. در هر حال اگر احتیاج به تابعی داشتید، قبل از اینکه خودتان به فکر نوشتن آن باشید مطمئن شوید که آن تابع وجود ندارد!!   بعضی از این توابع انواع داده ها را بعنوان ورودی خود می پذیرند البته اگر چند ورودی وجود داشته باشد همه باید از یک نوع باشند، بعضی از این توابع نیز نوع مشخصی را پشتیبانی می کنند. بعضی از مترجم ها مانند Digital Visual Fortran برای مشخص کردن نوع داده ورودی و خروجی از پیشوند و پسوند برای توابع استفاده می کند (برای جزئیات به help نرم افزار خود مراجعه نمایید.). فراخوانی توابع مانند اختصاص یک مقدار به متغیر می باشد.

Result_variable = function_name({list of parameters})
برای مثال: a= sin(b)

b متغیری است که به تابع ارسال می گردد و a حاصل تابع سینوس خواهد بود!

زیربرنامه های داخلی Intrinsic Subroutines

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

CALL subroutine_name({list of variables})

 بعضی از زیربرنامه های داخلی عبارتند از:

DATE_AND_TIME, MVBITS, RANDOM_NUMBER, RANDOM_SEED, SYSTEM_CLOCK

توابع خارجی External Functions

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


type FUNCTION name ({dummy arguments})
   local variable declaration
   body of function…
   name = expression
   body of function continued if needed
END FUNCTION name

type نوع تابع (نوع حاصل تابع) را مشخص می کند. حاصل تابع مقداری است که توسط تابع بازگردانده می شود. اگر به ساختار بالا توجه کنید دقیقاً جایی که نام تابع برابر یک عبارت قرار گرفته، حاصل تابع است. تابع باید حداقل یک مقدار خروجی داشته باشد. یعنی در جایی از تابع، مقداری به “نام” تابع اختصاص داده شود. متغیرهای ظاهری dummy arguments، شامل همه ثابت ها، متغیرها و حتی روالهای1 قابل دسترسی در بدنه تابع است. (منظور از روالها، توابع و زیربرنامه ها هستند). وقتی تابع فراخوانی می گردد باید لیستی از این متغیرها به آن فرستاده شود. نوع این متغیرهای واقعی باید با متغیرهای ظاهری موجود در تعریف تابع یکسان باشد، اما نام آنها مهم نیست. نوع متغیرها در هنگام ارسال به توابع توسط مترجم برنامه کنترل نمی گردد و اگر نوع متغیرهای یکسان نباشد با اشکالات عجیبی روبرو خواهید شد! بعنوان مثال برای محاسبه نیروی جاذبه بین دو جسم با استفاده از فرمول نیوتن، تابع نیوتن را به شکل زیر تعریف می کنیم.

REAL FUNCTION Newton(m1, m2, r)
REAL:: gamma = 6.672E-11, m1, m2, r
Newton = -gamma*m1*m2/r**2
END FUNCTION Newton
view rawfNewton.f90 hosted with ❤ by GitHub