250 likes | 420 Views
نويسه و رشته CHARACTER string. رشته عبارتست از توالی از صفر يا چند کاراکتر مثل Ali برای ذخيره مواردی مثل اسم و آدرس و غيره استفاده می شوند ثابت نويسه ای: رشته صريحی از نويسه ها است (با نوشته ای که بعد از علامت “!” در فرترن و // در C می ايد متفاوت است) مثال: “Salaam”
E N D
نويسه و رشته CHARACTER string • رشته عبارتست از توالی از صفر يا چند کاراکتر مثل Ali • برای ذخيره مواردی مثل اسم و آدرس و غيره استفاده می شوند • ثابت نويسه ای: رشته صريحی از نويسه ها است (با نوشته ای که بعد از علامت “!” در فرترن و // در C می ايد متفاوت است) مثال: “Salaam” “What is your name?” همانطور که ملاحظه می شود برای تعيين ثابت نويسه ای در فرترن و C از علامت نقل قول ( “ “ ) استفاده می شود • متغير نويسه ای: يعنی نامی که نماينده نويسه ها يا رشته نويسه های اختياری است مثال: soft=“silk” Hard=“Steel” WRITE (*,*)soft, hard نتيجه چاپ به صورت: silksteel خواهد بود www.um.ac.ir/~abaspour/computer
پردازش اطلاعات نويسه ایCHARACTER PROCESSING • مواقعی استفاده می شوند که با اطلاعات غير عددی کار نمائيم • به صورت يک حرف يا رشته ای از حروف می باشند • مثال (استفاده از ثابت های غيرعددی در برنامه خروجی را به مقدار زياد بهبود می بخشد): • WRITE (6,*) `Please type a value for the radius of a circle' • READ (5,*) radius • area = pi*radius*radius • WRITE (6,*) `The area of a circle of radius `, radius, & • ` is `, area • کليه حروفی که به صورت نوشته در داخل “ “ می ايند به صورت يکسانی به صورت خروجی در فايل يا مونيتور ظاهر می شوند • Please type a value for the radius of a circle • 12.0 • The area of a circle of radius 12.0 is 452.38925 www.um.ac.ir/~abaspour/computer
پردازش اطلاعات نويسه ای در فرترنCHARACTER PROCESSING • بعضی از کامپايلر ها به جای “ “ از ‘ ‘ استفاده می کنند و بعضی هر دو را قبول دارند • "This string contains an apostrophe `." • `This string contains a double quote " .` • "This string contains an apostrophe ` and a double quote “.“ • که در خروجی به صورت: • This string contains an apostrophe `. • This string contains a double quote ". • This string contains an apostrophe ` and a double quote ". www.um.ac.ir/~abaspour/computer
نحوه اعلانِ DECLARATION • CHARACTER:: yesorno, gender • مقادير اختصاص داده شده به يک متغيير غير عددی ممکن است به صورت ثابت حرفی باشند • yesorno = `N' • gender = `F‘ • با اين وجود کاربرد اصلی متغيير های غير عددی در ذخيره کردن رشته ای از حروف می باشد. www.um.ac.ir/~abaspour/computer
مثال • CHARACTER (LEN=12) :: surname, firstname • CHARACTER (LEN=6) :: initials, title • title = `Prof.` • initials = `ado` • firstname = `ali` • surname = ‘dostee’ • به دستور LEN توجه شود که بيان کننده تعدادکاراکتری است که متغير مربوط می تواند داشته باشد . می توان همچنين از ثابت INTEGER به جای عدد استفاده کرد www.um.ac.ir/~abaspour/computer
طول ارايه تعيين شده LEN بايد به گونه ای انتخاب شود که به صورت مطمئنی تمام کاراکترها را در بر گيرد • اگر طول ارايه بيشتر از تعداد کاراکترها ی متغير در نظر گرفته شود محل های باقی مانده به صورت فضای خالی باقی می ماند • اگر طول ارايه کمتر در نظر گرفته شود از سمت چپ شروع می گردد Title=‘professor’ معادل Title=‘profes’ • می توان کلمه LEN را حذف کرد و در داخل پرانتز از عدد تنها استفاده کرد • اگر از دستور LEN استفاده نشود طول رشته (1) در نظر گرفته می شود • اگر به جای عدد از (*) استفاده شود طول بر حسب طول واقعی ارايه تعيين خواهد شد (در توابع نه برنامه اصلی) CHARACTER (*):: Surname=‘ahmadzadeh’ www.um.ac.ir/~abaspour/computer
استفاده از (‘ ) و ( “ ) در يک نويسه اگر بخواهيم عبارت زير چاپ شود: Use “==“ instead of “E.Q.” please. دستور فرترن آن به صورت زير نوشته می شود: Remark= “Use ” ”==“ “ instead of “ “E.Q.” “ please” يعنی وقتی خود علامت “ جزو ارايه است بايستی دو بار پشت سر هم نوشته شود www.um.ac.ir/~abaspour/computer
عملگر های منطقی در ارايه های نويسه ای • عملگرهای منطقی: <=, <, >=, >, /=, == اِين عملگر ها را می توان علاوه بر کميت های عددی در مورد ارايه های غير عددی نيز به صورت زير بکار برد: IF (String1==“sir” .AND. string2>string3) THEN . . . . . . www.um.ac.ir/~abaspour/computer
کاربرد متغير های نويسه ای • عملگرهای محاسباتی + ، - ،....در اين متغيرها نبايد استفاده شوند • تنها عملگر مورد استفاده در اين نوع متغير ها علامت // است که جهت اتصال متغير های نويسه ای استفاده می شود (همانند عمل جمع) • CHARACTER (len=24) :: name • CHARACTER (len=6) :: surname • surname = `Bloggs' • name = `Prof `//` Mrs. /Mr. `//surname • اگر تعداد کاراکتر name از 24 تجاوز نمايد ويا کمتر باشد همان قاعده کلی انجام خواهد شد www.um.ac.ir/~abaspour/computer
زير رشته ها در متغير های نويسه ای Substrings • از زير رشته می توان استفاده نمود تا از بخشی از ارايه اختصاص داده شده به يک متغير غير عددی استفاده شود • فرم کلی (start-position : end-position) نقاط شروع و خاتمه حتماً بايد INTEGER باشند نقطه شروع هميشه مساوی يا بزرگتر از 1 و نقطه خاتمه بايد کوچکتر يا برابر طول کل ارايه باشد CHARACTER (LEN=7) :: lang lang = `Fortran' WRITE (6,*) lang(1:1), lang(2:2), lang(3:4), lang(5:7) که نتيجه خروجی به صورت زير خواهد بود: Fortran اگر نقطه شروع حذف شود عدد 1 در نظر گرفته خواهد شد. اگر نقطه خاتمه حذف شود حداکثر طول ارايه منظور می شود lang(:3) is equivalent to lang(1:3) lang(5:) is equivalent to lang(5:7). www.um.ac.ir/~abaspour/computer
توابع آماده مرتبط با متغير هایغير عددی (نويسه ای) در فرترن www.um.ac.ir/~abaspour/computer
مثال CHARACTER(len=12) :: surname, firstname INTEGER :: length, pos ... length = LEN(surname) !len=12 firstname = `Walter` pos = INDEX( firstname, “al”) !pos=2 firstname = `Fred` pos = INDEX( firstname, “al”) !pos=0 length = LEN(TRIM(firstname))!len=4 www.um.ac.ir/~abaspour/computer
مثال : برنامه ای بنویسید که متنی را بخواند و فواصل بین کلمات را با کاراکتر دلخواهی عوض کند program test character(30)::text, newtext character::sep read*,text,sep newtext="" do i=1,len_trim(text) if(text(i:i)==" " )then newtext(i:i)=sep else newtext(i:i)=text(i:i) end if end do print*,text,newtext, end program test www.um.ac.ir/~abaspour/computer
رشته ها در C • همانند فرترن از مشخصه کاراکتر char استفاده می شود char name[10] • متغِير نويسه ای name بعنوان آرايه ای 10 عضوی از کاراکتر ها تعريف شده است (بصورت آرایه ای از کاراکتر) • کاراکتر علامت تهی null با کد اسکی (\0) • برای تعيين انتهای يک رشته که در يک متغير نويسه ای با تعداد بيشتر عضو char name[10]={‘a’,’l’,’i’,’\0’} • هنگام تعريف رشته بايد جا برای عنصر کاراکتر null در نظر گرفت • نحوه ذخيره مقدار ahmad در متغير name www.um.ac.ir/~abaspour/computer
استفاده از ثابت های نويسه ای برای مقدار دهی اوليه متغير های نويسه ای char name [10]=“ahmad”; char address[50]=“no.20 azadi street”; • هنگام استفاده از ثابت نويسه ای برای مقدار دهی اوليه يک متغير نويسه ای کامپيوتر خود يک کاراکتر null به انتهای رشته اضافه می کند • در c بجز در هنگام مقدار دهی اوليه نمی توان از (=) عملگر انتساب استفاده نمود • دستور زير غلط است char name[10]; ……. ………. name=“Ali”; در C رشته ها در واقع ارایه هستند و لذا نمی توان با یک دستور انتساب همه را یکجا مقدار دهی کرد www.um.ac.ir/~abaspour/computer
خواندن و نوشتن رشته های نويسه ای در C • با استفاده از توابع scanf , printf • استفاده از مشخصه تبديل %s • هنگام استفاده از تابعscanf نیاز به نوشتن علامت آدرس & نیست #include <stdio.h> void main() { char name[20]; printf(“what is your name?”); scanf(“%s”, name); printf(“hello %s!”,name); } What is your name? Ali Hello Ali! What is your name? Mohammad Hossein Hello Mohammad! www.um.ac.ir/~abaspour/computer
تابع gets در C • در دستور scanf اگر رشته دارای فضای خالی space باشد خواندن قطع می شود چون فکر می کند رشته خاتمه يافته است • دستور gets مشکل را مرتفع می کند • این تابع يک متغير رشته ای دريافت می کند و پس از خواندن يک رشته از صفحه کليد آنرا در اين پارامتر ورودی قرار می دهد • توجه: تا کليد enter فشار داده نشود اين تابع به خواندن از صفحه کليد ادامه می دهد #include <stdio.h> void main() { char name[20]; printf(“what is your name?”); gets(name); printf(“hello %s!”,name); } What is your name? Mohammad Hossein Hello Mohammad Hossein! www.um.ac.ir/~abaspour/computer
تابع puts • بجای printf puts (“hello”) puts (name) • کمتر معمول است مثال: #include <stdio.h> void main() { char name[20], surname[30]; printf("what is your name?"); gets(surname); // printf("hello %s!\n",surname); scanf("%s", name); //printf("hello %s !\n",name); puts("hello"); puts(name); } www.um.ac.ir/~abaspour/computer
توابع کتابخانه ای برای رشته های نويسه ای در C • محل توابع رشته ای در فايل سرامد string.h • تابع strlen (مشابه LEN_TRIM () در فرترن) • رشته ای را دريافت و تعداد کاراکتر های آن را مشخص می کند (تا علامت null ) • آرگومان آن يک رشته است (معادل LEN (TRIM(string)) ) در فرترن #include <stdio.h> #include <string.h> void main() { int len; char text[100]; printf(“enter a text!”); gets(text); len=strlen(text); printf(“the lengt of your text is %d”,len); } Enter a text! Hello The lengt of your text is 5 www.um.ac.ir/~abaspour/computer
تابع strcpy • مخفف string copy • دو رشته را به ترتیب در یافت و رشته دوم را در اولی کپی می کند • آرگومان آن دارای دو رشته است • معمولاً برای انتساب یک ثابت رشته ای به یک متغیر رشته ای بجای = از این تابع استفاده می شود #include <stdio.h> #include <string.h> void main() { char string1[20], string2[20]; printf(“please enter string1 :”); gets(string1); Strcpy (string2,string1); Printf(“copy string1 into string2\n”); printf(“now string1= %s and string2= %s”,string1,string2); Printf(“Copy new into string1\n”); Strcpy (string1,”new”); // عمل انتساب به یک متغیر نویسه ای Printf(“now string1 = %s”,string1); } Please enter string1: hello Copy string1 into string2 Now string1 = hello and string2 = hello Copy new into string1 Now string1= new www.um.ac.ir/~abaspour/computer
تابع strcat • از عبارت string concatenate به معنی الحاق رشته • دو رشته را دریافت و رشته دوم را به انتهای رشته اول الحاق می کند • معادل عملگر // در فرترن #include <stdio.h> #include <string.h> void main() { char string1[20], string2[20]; printf(“please enter string1 :”); gets(string1); printf(“please enter string2:”); gets(string2); strcat(string1, string2) printf(“ concatenation of string1and string2 is: %s”,string1); } Please enter string1: hello Please enter string2: everybody! concatenation of string1and string2 is: hello everybody!
تابع strcmp #include <stdio.h> #include <string.h> void main() { char string1[20], string2[20]; int result; printf("please enter string1 :"); gets(string1); printf("please enter string2 :"); gets(string2); result=strcmp (string1,string2); if (result==0) printf("%s equals %s\n",string1, string2); else if(result>0) printf("%s is greater than %s\n",string1, string2); else printf("%s ls less than %s\n",string1, string2); } • از string compare (مشابه عملگر های مقایسه ای در فرترن) • دو رشته را دریافت و پس از مقایسه مقادیر زیر را باز می گرداند • مساوی 0 • رشته اول بزرگتر 1+ • رشته اول کوچکتر 1- please enter string1 : ali please enter string2: ahmad ali is greater than ahmad please enter string1 : ali please enter string2: alireza ali is less than alireza www.um.ac.ir/~abaspour/computer
تابع strstr #include <stdio.h> #include <string.h> void main() { char text [100], word[20]; Int I, n, result; printf("please enter a text :"); gets(text); printf(“how many words do you have:"); Scanf(“%d”,&n); For(i=0;i,<n;i++){ printf(“enter a word to search :”); gets (word); result=strstr(text,word); if(result==-1) printf(“(%s) not found \n”,word); else printf (“(%s) is found at position %d\n”,word,result); } } • دو رشته را دریافت (تقریبا مشابه تابع INDEX در فرترن) • در رشته اول، رشته دوم را جستجو می کند • در صورت پیدا شدن مکان اولین کاراکتر آن در رشته دوم را باز می گرداند • اگر نباشد مقدار 1- را بر می گرداند • در صورت تکرار باز هم مکان اولین نمونه را باز می گرداند Enter a text: this is a sample text! How many word do you have:3 Enter a word to search: sample (sample is found at position 10 Enter a word to search: is (is) is found at position 2 Enter a word to search: test (test) not found www.um.ac.ir/~abaspour/computer
تابع strrev • از string reverse • تابع رشته ای را گرفته و معکوس می کند #include <stdio.h> #include <string.h> void main() { char word[20]; printf(" enter a word :"); gets(word); printf(“reverse of %s is:“, word); strrev (word) printf (“%s”,word); } Enter a word: hello Reverse of hello is olleh www.um.ac.ir/~abaspour/computer
تابع atoi • از ascii to integer • در فایل سرامد stdlib.h • رشته ای متشکل از اعداد و +، - را گرفته تبدیل به عدد صحیح می کند (“3478” را به 3478) • تابع itoa • integer to ascii • تبديل عدد به رشته • تابع atof (تبديل رشته به اعشاری) • تابع atol (تبدیل رشته به صحيح بلند) • برای ديگر توابع به help مراجعه کنید www.um.ac.ir/~abaspour/computer