با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، اگر به خاطر داشته باشید در جلسه قبل از دوره فرترن اعداد در این زبان برنامه نویسی را توضیح دادیم.در این جلسه می خواهیم کاربرد کاراکترها در فرترن را بررسی نماییم.کاراکترها میتوانند نمادی از مجموعه کاراکترهای اصلی، یعنی از حروف، رقم های دهدهی، زیرخط، و ۲۱ کاراکتر خاص گرفته شوند.منظورمان از کاراکتر، حروف الفبا، اعداد و علامت هایی است که در متن ها (رشته ها – Strings) به کار می بریم. اما رشته (String) خود از کنار هم قرار گفتن کاراکترها (character) ساخته می شود، ترکیب کاراکترها در فرترن و اعلامیه کاراکتر در فرترن از جمله مواردی است که در این آموزش به آن ها اشاره می کنیم.
در بسیاری از زبانهای برنامه نویسی همچنین نوع دادهای به نام Character (با کلمه کلیدی Char) مشاهده می شود. متغیرهای تعریف شده از این نوع داده برای نگهداری یک کاراکتر مورد استفاده قرار می گیرند. نقطه “.”، علامت تعجب “!”، خط تیره “-“، فاصله” ” کاراکتر محسوب میشوند. طول رشته را می توان با مشخص کننده len مشخص کرد. اگر هیچ طولی مشخص نشده باشد، در این صورت برابر ۱ می شود. شما می توانید کاراکترهای فرد را در یک رشته اشاره شده توسط موقعیت ارسال کنید؛ بیشتر کاراکترها سمت چپ در موقعیت ۱ قرار دارد.
اعلامیه کاراکتر در فرترن به عنوان داده مانند متغیرهای دیگر است.برای کاراکترهای شروع و پايان, می توان عدد شروع يا پايان را ننوشت.
1 | type-specifier :: variable_name |
برای مثال :
1 | character :: reply, sex |
همچنین شما می توانید یک مقدار را اختصاص دهید مانند :
1 2 | reply = ‘N’ sex = ‘F’ |
مثال زیر فراخوانی و استفاده از نوع داده کاراکتر در فرترن را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | program hello implicit none character(len = 15) :: surname, firstname character(len = 6) :: title character(len = 25)::greetings title = 'Mr. ' firstname = 'Rowan ' surname = 'Atkinson' greetings = 'A big hello from Mr. Bean' print *, 'Here is ', title, firstname, surname print *, greetings end program hello |
هنگامی که شما برنامه فوق را کامپایل و اجرا می کنید، نتیجه زیر را مشاهده می کنید :
1 2 | Here is Mr. Rowan Atkinson A big hello from Mr. Bean |
دو عمليات ساده با رشته های کاراکتری در فرترن ۷۷ عبارتند از استخراج بخشی از رشته يا پيوند دو رشته به يکديگر. استخراج بخشی
از رشته با قرار دادن علامت : بين شروع و پايان بخش مورد نظر صورت می گيرد. برای ترکيب رشته ها از علامت // استفاده می گردد. مثال زیر این را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | program hello implicit none character(len = 15) :: surname, firstname character(len = 6) :: title character(len = 40):: name character(len = 25)::greetings title = 'Mr. ' firstname = 'Rowan ' surname = 'Atkinson' name = title//firstname//surname greetings = 'A big hello from Mr. Bean' print *, 'Here is ', name print *, greetings end program hello |
هنگامی که شما برنامه فوق را کامپایل و اجرا می کنید، نتیجه زیر را مشاهده خواهید کرد :
1 2 | Here is Mr.Rowan Atkinson A big hello from Mr.Bean |
در توابع داخلی فرترن، توابع رشته ای نيز وجود دارد. برای مثال تابع LEN اندازه رشته می دهد، توابع CHAR و ICHAR بترتيب برای تبديل عدد صحيح به کاراکتر و تبديل کاراکتر به عدد صحيح به کار می روند. INDEX برای يافتن يک رشته در رشته ديگر کاربرد دارد.
جدول زیر برخی از توابع کاراکترهای معمولی همراه با توضیحات را نشان می دهد :
شماره | تابع و توضیحات |
۱ | (len(string این تابع طول یک رشته از کاراکتر را باز می گرداند. |
۲ | (index (string، substring برای يافتن محل يک زیر رشته در رشته ديگر کاربرد دارد و اگر یافت نشد، ۰ را برمی گرداند. |
۳ | (achar (int یک عدد صحیح را به یک کاراکتر تبدیل می کند. |
۴ | (iachar(c یک کاراکتر را به یک عدد صحیح تبدیل می کند. |
۵ | (trim(string اندازه رشته بدون احتساب فاصله و کاراکترهای خالی را برمی گرداند.. |
۶ | (scan(string, chars این تابع “رشته” را از چپ به راست (مگر اینکه back=.true) برای اولین بار هر کاراکتری که در آن “کاراکتر مورد نظر” وجود دارد را جستجو می کند. و یک عدد صحیح که موقعیت آن کاراکتر را باز می گرداند می دهد، و اگر هیچ یک از کاراکترهای دارای “chars یا همان کاراکتر مورد نظر” یافت نشود، صفر را برگشت می دهد. |
۷ | (verify(string, chars این تابع نیز “رشته” را از چپ به راست (مگر اینکه back=.true) برای اولین بار هر کاراکتری که در آن “کاراکتر مورد نظر” وجود ندارد را جستجو می کند. و یک عدد صحیح که موقعیت آن کاراکتر را باز می گرداند می دهد، و اگر یکی از کاراکترهای دارای “chars یا همان کاراکتر مورد نظر” یافت شود، صفر را برگشت می دهد. |
۸ | (adjustl(string کاراکترهای موجود در “رشته” را به سمت چپ مرتب می کند. |
۹ | (adjustr(string کاراکترهای موجود در “رشته” را به سمت راست مرتب می کند. |
۱۰ | (len_trim(string رشته ای را دریافت و تعداد کاراکترهای آن را محاسبه می کند. (تا علامت null) |
۱۱ | (repeat(string,ncopy یک رشته با طول برابر “ncopy” ، طول “رشته” و محتوای “ncopy” و نسخه های پیوندی از “رشته” را برمی گرداند. |
این مثال استفاده از تابع index را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | program testingChars implicit none character (80) :: text integer :: i text = 'The intrinsic data type character stores characters and strings.' i=index(text,'character') if (i /= 0) then print *, ' The word character found at position ',i print *, ' in text: ', text end if end program testingChars |
هنگامی که شما برنامه فوق را کامپایل و اجرا می کنید، نتیجه ی زیر را مشاهده می کنید:
1 2 | The word character found at position 25 in text : The intrinsic data type character stores characters and strings. |
این مثال نحوه استفاده از تابع trim را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | program hello implicit none character(len = 15) :: surname, firstname character(len = 6) :: title character(len = 25)::greetings title = 'Mr.' firstname = 'Rowan' surname = 'Atkinson' print *, 'Here is', title, firstname, surname print *, 'Here is', trim(title),' ',trim(firstname),' ', trim(surname) end program hello |
هنگامی که شما برنامه فوق را کامپایل و اجرا می کنید، نتیجه ی زیر را مشاهده می کنید :
1 2 | Here isMr. Rowan Atkinson Here isMr. Rowan Atkinson |
این مثال استفاده از تابع achar را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 | program testingChars implicit none character:: ch integer:: i do i = 65, 90 ch = achar(i) print*, i, ' ', ch end do end program testingChars |
هنگامی که شما برنامه فوق را کامپایل و اجرا می کنید، نتیجه ی زیر را مشاهده می کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z |
توابع زیر توالی لغوی کاراکترها را تعیین می کنند.
شماره | تابع و توضیحات |
۱ | (lle (char، char مقایسه می کند که آیا کاراکتر اول از لحاظ لغوی کمتر یا برابر با کاراکتر دومی است. |
۲ | (lge(char, char مقایسه می کند که آیا کاراکتر اول از لحاظ لغوی بزرگتر یا برابر با کاراکتر دومی است. |
۳ | (lgt (char، char مقایسه می کند که آیا کاراکتر اول از نظر لغوی بیشتر از دومی است. |
۴ | (llt(char, char مقایسه می کند که آیا کاراکتر اول از نظر لغوی کمتر از دومی است. |
تابع زیر نشان دهنده استفاده از :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | program testingChars implicit none character:: a, b, c a = 'A' b = 'a' c = 'B' if(lgt(a,b)) then print *, 'A is lexically greater than a' else print *, 'a is lexically greater than A' end if if(lgt(a,c)) then print *, 'A is lexically greater than B' else print *, 'B is lexically greater than A' end if if(llt(a,b)) then print *, 'A is lexically less than a' end if if(llt(a,c)) then print *, 'A is lexically less than B' end if end program testingChars |
هنگامی که شما برنامه فوق را کامپایل و اجرا می کنید، نتیجه ی زیر را مشاهده می کنید :
1 2 3 4 | a is lexically greater than A B is lexically greater than A A is lexically less than a A is lexically less than B |
زبان فرترن می تواند کاراکترها را به عنوان کاراکترهای تکی یا رشته های پیوسته پردازش کند.رشته ها در حقیقت آرایه ای از کاراکترها هستند. آموزش ترکیب کاراکترها در فرترن ، اعلامیه کاراکتر در فرترن و همچنین کاربرد کاراکترها به پایان رسید. امیدوارم از مطالب ذکر شده بهره کافی را برده باشید. در جلسه بعد آموزش رشته ها در فرترن را فرا خواهید گرفت.
مائده درویشی
با سلام و وقت بخیر من یه نمونه برنامه فرترن دارم که به سبک خاصی هست و خطای زیر رو میده میدونم که خطای عدد تعریف نشده رو میده در حالی که شرطهای لازم شده ممنوم میشم راهنماییم کنین.میتونم برنامه رو ایمیل کنم اگه لازمه.
run-time error M6201: MATH
– **: DOMAIN error
صادق
سلام. اونطور که من متوجه شدم، این خطا موقعی داده میشه که سعی کنیم به پارامتر یک تابع، مقدار خارج از محدوده یا domain بدیم. مثلا اگر یک عدد منفی به برای تابع ()sqrt یا جذر بدیم، کامپایلر این خطا رو میده.