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

متغیرها

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

نام گذاری متغیرها

قوانین نامگذاری متغیرها عبارتند از :

  • حداکثر طول نام متغیرها 34 کاراکتر است.
  • فقط امکان استفاده از حروف کوچک و بزرگ انگلیسی (a…z A…Z,)، اعداد(0,1,..,9) و کاراکتر زیر-خط ( _ ) وجود دارد.
  • توجه داشته باشید که بزرگی یا کوچکی حروف برای فرترن فرقی ندارد.
  • اولین کاراکتر یک اسم باید حرف باشد.
  • از کلمات کلیدی در نامگذاری استفاده نکنید.

انواع داده ها

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

  • نوع INTEGER برای اعداد صحیح
  • نوع REAL برای اعداد اعشاری (تقریباً 8 رقم)
  • نوع DOUBLE برای اعداد اعشاری با دقت بیشتر (تقریباً 16 رقم معنی دار) [این اعداد را دقت مضاعف می نامیم]
  • نوع CHARACTER برای یک کاراکتر یا رشته ای از کاراکترها
  • نوع LOGICAL برای مقادیر منطقی
  • نوع COMPLEX برای اعداد مختلط به عنوان یک جفت با دقت REAL، اغلب توابع فرترن 77 بر روی اعداد مختلط قابل استفاده هستند.

ثابت های هم به همین شکل بکار می روند مثلاً 1234 یک عدد ثابت صحیح است، 1234.0 یا 1.234E3 یک ثابت اعشار و 1.234D3 عدد اعشار با دقت مضاعف است. اعداد مختلط به شکل (3.14,-1E5) نمایش داده می شوند و کاراکترها بین دو کوتیشن قرار می گیرند “AbBa” یا “S”. ثابتهای منطقی فقط می توانند دو مقدار .TRUE. و .FALSE. را داشته باشند (به نقاط ابتدایی و انتهایی هر یک توجه کنید). اگر اعداد بسیار کوچک یا بسیار بزرگ باشند، ممکن است سیستم آنها را صفر در نظر گرفته و مشکل تقسیم بر صفر در محاسبات پیش آید یا اینکه سیستم دچار سر ریز گردد. این خطاها بسیار رایج هستند و اشکال گزارش شده به سیستم بستگی خواهد داشت.

تعریف متغیرها

برای تخصیص حافظه لازم به متغیرها، مترجم برنامه (Compiler) باید نام، نوع و اندازه هر متغیر را بداند. اگر از دستور IMPILICIT NONE استفاده گردد، لازم است که تمام متغیرها تعریف گردند. در غیر اینصورت نوع متغیر با حرف اول آن مشخص می گردد.

  • a..h و o..z برای متغیرهای اعشار
  • i,j,k,l,m,n برای متغیرهای صحیح

تعریف متغیر با دستور زیر صورت می گیرد (این تعریف در برنامه نویسی بسیار پسندیده است):

REAL:: alpha, beta, c=10.0
INTEGER:: count, hours, minutes=36
view rawvar2.f90 hosted with ❤ by GitHub

اگر بخواهید مقدار ثابتی را تعریف کنید از دستور PARAMETER استفاده می گردد PARAMETER ({list of names=value})
PARAMETER (pi=3.141592)
view rawpar.f90 hosted with ❤ by GitHub

عبارات ساده (عبارات و عملیات محاسباتی)

عملگرهایی مانند + ، – ، / (همان ÷ است) و * (همان × است) را می شناسید. عملگر توان در فرترن به شکل ** است.

اولویت محاسبه در عبارات

این موضوع که ابتدا کدام محاسبات انجام خواهد شد در پاسخ یک عبارت ریاضی بسیار موثر است. ترتیب محاسبه و اولویت آنها به شکل زیر است:

  • پرانتز – اگر در عبارات، پرانتز وجود داشته باشد. اول داخلی ترین پرانتز محاسبه خواهد شد و به همین ترتیب عبارات داخل پرانتز اولویت اول را دارند.
  • توان
  • رب و تقسیم
  • جمع و منها

برای مثال عبارت A*B**n-C/D و (A*(B**n))-(C/D) یکسان هستند. اگر دو عبارت از اولویت یکسانی برخوردار باشند، محاسبه از چپ به راست خواهد بود. برای مثال عبارت A/B*C و (A*B)/C یکسان هستند. لازم است بدانید که حاصل عملیات بین دو اعشار، اعشار است و حاصل عملیات بین دو عدد صحیح، عدد صحیح است؛ حاصل عملیات بین عدد اعشار و عدد صحیح، عدد اعشار است. به عنوان مثال حاصل 1/5 برابر 0 صحیح است، حاصل 1./5. برابر 0.2 اعشار است و حاصل 1d0/1d5 برابر 0.2 مضاعف است. بطور کلی می توان گفت که در محاسبه عبارات اگر تبدیل نوع لازم باشد، متغیرها به متغیر با بالاترین دقت تبدیل می گردند. در استفاده از اعداد دقت کنید، عدد 4 صحیح است، عدد 4. اعشار و عدد 4d0 مضاعف است. برابر قرار دادن مقدار یک متغیر با یک عبارت یکی از ساده ترین عبارات هر زبان برنامه نویسی است.

variable = expression

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

مقایسه متغیرها

مقایسه متغیرها به کامپیوتر قدرت تصمیم گیری داده است. متأسفانه فرترن 77 عباراتی مانند <, > و … را به این شکل پشتیبانی نمی کند و بجای آنها مقایسه را با عباراتی چون .EQ. انجام می دهد.

  • .EQ. equal to
  • .GE. greater or equal to
  • .GT. greater than
  • .LE. less than or equal to
  • .LT. less than
  • .NE. not equal to

این مشکل در فرترن 90 حل شده است و فرترن 90 علامتهای <، >، >=، <=، == و != را هم پشتیبانی می کند. برای مثال عبارت (A .EQ. B) معادل (A==B) و یک عبارت منطقی است، این عبارت در صورتی صحیح است که مقدار متغیرها با هم برابر باشد. در هر حال حاصل یک عبارت مقایسه ای یک مقدار منطقی خواهد بود که می تواند درست یا اشتباه باشد.

عبارات منطقی

دستورات منطقی این زبان عبارتند از:

  • .NOT. logical negative
  • .AND. logical and
  • .OR.   logical or
  • .EQV. logical equivalence
  • .NEQV. logical non-equivalence (exclusive or)
    T: TRUE, F:FALSE
xy.NOT. xx .AND. yx .OR. yx .EQV. yx .NEQV. y
FFTFFTF
TFFFTFT
FTTFTFT
TTFTTTF

کاراکتر و رشته

در فرترن 77 رشته ها باید اندازه ای ثابت و از پیش تعیین شده داشته باشند. تعریف رشته در فرترن 77 به این شکل است:

CHARACTER name*length

همچنین می توان آرایه ای از رشته ها تعریف کرد:

CHARACTER array (size)*length

برای نوشتن رشته های ثابت تعداد لازم نیست و بجای آن از * استفاده می گردد.

CHARACTER format_scope*(*)
PARAMETER(format_scope=’this is constant character!’)

دو عملیات ساده با رشته های کاراکتری در فرترن 77 عبارتند از استخراج بخشی از رشته یا پیوند دو رشته به یکدیگر. استخراج بخشی از رشته با قرار دادن علامت : بین شروع و پایان بخش مورد نظر صورت می گیرد. برای ترکیب رشته ها از علامت // استفاده می گردد.

substring= string(start position: end position)

برای کاراکترهای شروع و پایان, می توان عدد شروع یا پایان را ننوشت.

CHARACTER first_word*8, second_word*5, third_word*20 first_word=’FORTRAN’
second_word=first_word(:3)
third_word=second_word // first_word(4:)

متغیر third_word پس از اجرای این دستورات برابر رشته کاراکتری FOR TRAN خواهد بود ( فاصله بعلت اندازه متغیر second_word است).

توابع رشته ای

در توابع داخلی فرترن، توابع رشته ای نیز وجود دارد. برای مثال تابع LEN اندازه رشته می دهد، توابع CHAR و ICHAR بترتیب برای تبدیل عدد صحیح به کاراکتر و تبدیل کاراکتر به عدد صحیح به کار می روند. INDEX برای یافتن یک رشته در رشته دیگر کاربرد دارد. توابع مقایسه رشته ها مانند LGE، LGT، LLE و LLT و بسیارس از توابع دیگر وجود دارند که در صورت نیاز امکان مطالعه آنها را خواهید داشت.

ورودی و خروجی

در اغلب برنامه ها نیاز داریم که اطلاعات ورودی را از صفحه کلید یا فایل بخوانیم و اطلاعات خروجی را در صفحه نمایش نشان دهیم یا آنها را در فایل خروجی ذخیره کنیم.

دستور READ

این دستور برای دریافت ورودی از صفحه کلید بکار می رود و ساختار آن به شکل زیر است.

READ *, {input list} or 
RAED([UNIT=] unit type, [FMT=] format) {input list}

unit type عددی است که نوع ورودی را مشخص می کند، مثلاً 5 برای صفحه کلید، این عدد اغلب برای خواندن ورودی از فایل بکار می رود. format برای دریافت ورودی معمولاً * است، اما کاربرد اصلی آن برای خواندن ورودی فرمت شده از فایل است.

READ (*,*) a, b, c

دستور WRITE

این دستور برای نمایش خروجی در صفحه نمایش یا فرستادن خروجی به پرینتر یا فایل خروجی بکار می رود.

PRINT *,{output list}

WRITE([UNIT=] unit type, [FMT=] format) {output list}

مانند دستور READ، unit typeنوع خروجی را مشخص می کند و format فرمت خروجی را تعیین می کند. WRITE(*,*) ‘The total is:’, total این دستور ابتدا رشته The total is: و در ادامه مقدار متغیر total را روی صفحه نمایش نشان خواهد داد.

تعیین قالب ورودی و خروجی – دستور FORMAT

این دستور قالب بندی داده را تعیین می کند و در دستورات ورودی و خروجی بکار می رود. این دستور به دو صورت به کار می رود. یک روش استفاده مستقیم این دستور در بخش format در دستورات ورودی و خروجی است. روش دوم قرار دادن یک شماره خط قبل از این دستور (شماره خط در فرترن 77 بین خط 1 تا 5 قرار می گیرد.) و ارجاع این شماره در دستورات ورودی و خروجی است. ساختار این دستور به شکل زیر است.

FORMAT (format sequence)

یا اگر داخل دستوراتی چون WRITE قرار گیرد به شکل زیر خواهد بود.

FMT= (‘format sequence’)

ساختار استفاده شده در این دستور مشخص کننده تعداد ارقام خروجی و شکل نمایش آنهاست. همانطور که در مثالهای قبلی متوجه شده اید؛ اگر قالب بندی آزاد انتخاب گردد، می توان بجای این بخش در دستورات ورودی و خروجی از * استفاده کرد.

ترتیب قالب بندی format sequence

برای مشخص کردن قالب بندی در دستور FORMAT، قالب هر متغیر باید مشخص گردد. این قالب بندی شامل نوع متغیر و تعداد ارقام آن و نوع نمایش ارقام می باشد.

Data descriptionData type
Iw, Iw.mInteger
Ew.d, Ew.dEe, Fw.d,Gw.d, Gw.dEeFloating Point
LwLogical
A, AwCharacter

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

I :متغیر صحیح
F :متغیر اعشار با اعشار مشخص
E :نمایش علمی عدد اعشار
G :مانند F، به دقت عدد بستگی دارد
L :متغیر منطقی
A :متغیر کاراکتری!

و حروف کوچک قالب متغیر را مشخص می کنند

w :تعداد کل ارقام
m :حداقل تعداد ارقامی که باید نمایش داده شود
d :تعداد ارقام بعد از ممیز (دقت)
e :تعداد ارقام توان

تعدادی از کاراکترهای کنترلی که کاربرد بیشتری دارند

/انتفال به خط بعدی
‘Any string’رشته ای را به خروجی انتقال می دهد
nXمکان نما را n خانه به راست هدایت می کند

برای مثال:

WRITE(UNIT=*,FMT=10) ‘The frequency is’, f, ‘Hz’
10 FORMAT(1X, A, F10.5, A)

ابتئا مکان نما یک خانه به راست حرکت می کند، رشته کاراکتری نمایش داده می سود، مقدار متغیر f با حداکثر 15 رقم و با دقت 5 رقم اعشار نمایش داده شده و دوباره رشته کاراکتر چاپ می گردد. می توان از کلمات کلیدی UNIT و FMT صرفنظر کرد و فقط مقدار آنها را نوشت.

WRITE(*,10) ‘The frequency is’, f, ‘Hz’
10 FORMAT(1X, A, F10.5, A)