کامپیوتر و IT و اینترنت

برنامه نویسی C (جلسه 11) آرایه ها

صفحه 1:
6 بسم الله الرّحمن الرّحيم 2 برنامه نويسى ) - جلسه ۱۱ دانشگاه قم نیم سال اول ۸۴-۸۵ وام

صفحه 2:
مثال از توابع بازگشتی - برج های هانوی مزايا و معايب نوشتن برنامه به صورت با زگشتی: — مزايا: ساده شدن برنامه نويسى و خوانا قر شدن برنامه - معايب: مصرف حافظه و سرعت اجراى كمتر محل قرار كرفتن توايع - هر تابع قبل از احضار مى بايست يا تعريف شده باشد ويا اعلان مزاياى استفاده از توايع: - قابل فهم كردن و امكان برنامه نويسى سريعتر و ساده قر فوشتن برنامه های خوانا: - استفاده از توابع؛ اسامی مناسب برای متغیرها و توابع» دندانه ای کردن برنامه؛ نوشتن

صفحه 3:
۶ آرایه ها - ضرورت وجود آرایه ها - تعریف آرایه - مثال هایی از کاربرد آرایه ها - آرایه ها به عنوان ورودی و برگشتی تابع - ابت ‎(cosstact)‏

صفحه 4:
ضرورت وجود آرایه ها * مثال: برنامه اى بنويسيد كه 3 عدد را بكيرد و ميانكين و واريائس آنها را محاسبه كند. ‎pos HAD ily 9 ool 15‏ يكار از ووابط زير به دست مى يندة ‎nt‏ ‎2 (۴ ‏كت ‏2 ‏اگر تنها هدف به دست آوردن میانگین بود به راحتی می توانستیم آن را انجام دهیم:

صفحه 5:
* در اینجا برای به دست آوردن واریانس نیاز به همه »ها داریم. اما در کد نوشته شده قبل تنها آخرین عدد را داریم و بقیه مقادیر از بين رفته اند. در نتيجه ناجاريم كد خود را به صورتى مثل اين بنويسيم: جک که ما ‎Avot ave,var;‏ ‎ser (“YP YELP PVP”, 8xD 8x1, 8xP ,8xD ,8xP );‏ ‎we=(xDtxl+xO+x9 +xP /S;‏ - ©« )سوم +( © ,عرد 6 )روم +( وره-1) :)نوم +( © ورد (1))ريوم) سبو :6/(( © عه :)نوب( © جره

صفحه 6:
* به این ترتیب کد نامناسبی خواهیم داشت. این موضوع به ازای داده های زیادتر (مثلا ۱۰۰۰ عدد) بیشتر نمود پیدا می کند. * در اين جلسه نشان می دهیم با تعریف آرایه ها می توان چنین برنامه هایی را خیلی ساده و خلاصه پیاده کرد. * به طور كلى آرايه ها در مواردی به کار برده می شوند که با مجموعه ای از داده های هم نوع سروکار داشته باشیم.

صفحه 7:
‎eget 9‏ :با دستور ‎int x fio glo sftp‏ مکانی در حافظه به نام « امه تخصیص داده می شد. * در زبان 6 ‎x[S‏ از » پنج مکا در حافظه به ‎al 2a Sa ca‏ تام ‎ee‏ 0 00 ‎igi go odo fF] 9 xf]‏ . * اصطلاحا مى كوبيم آرایه ای به نام« از نوع »و با ۵ عنصر تعریف کرده ایم. * به » ۵۲۰۱ ۳ و ۴ اصطلاحا اندیس آرایه گفته می شود. * به همین ترتیب می توان آرایه هایی ازانواع دیگر مثل ۲۷,۰۰ اد و ....داشت.

صفحه 8:

صفحه 9:
سوک لاو ‎Onid cain )‏ { ‎it 1;‏ ‎rt xf];‏ ‎Por (FD ji< +41)‏ ‎somn(“%P” xfi]);‏ ‎Por (FOi<;+4)‏ ۵ } حلقه اول مقادير را دريافت مى كند و در آرایه «قرار می دهد و حلقه دوم اين مقادير را جاپ می کند.

صفحه 10:
منال ۳ ) محاسبه میانگین و واریانس ۵ عدد on Poa xfS]; ‎ae;‏ , سر میا ۳۹ ‎Por (O;<8;+4) ‎Ow=0; ‎Cor (FO1O;+4) ‏:©/(6 سم [زام) سدع و0 (سه 90۳ الل نينا ‎Orn ("Dhe verre =%E er)‏ 1

صفحه 11:

صفحه 12:
مثال ۵) برنامه ای بنویسید که ۱۰ عدد از کاربر بگیرد آنها را به صورت صعودی مرتب کرده و چاپ برنامه از دو بخش تشکیل شده است: دریافت اعداد مرتب کردن آنها ‎١‏ دريافت اعداد را می توان با تعریف یک آرایه و نوشتن قطعه برنامه ای به صورت زیر انجام داد: ‎ ‎tet ]00[: ‎ii; ‎Por (iF O:i<dD;++i) souk (“%P” 8ox{i]);

صفحه 13:
۲. به مسئله مرتب سازی اصطلاحا -:«< گفته می شود. برای مرتب سازی روش های متعددی وجود دارد. مانند : و۰ در این مثال از :77 -ا« که یکی از ساده ترین آنهاست استفاده می شود.

صفحه 14:
اجه عارامان()برای مر تب سازی صعودی لپ ر سس * ابتدا دو عنصر اول و دوم آرایه با هم مقایسه می شوند.اگر عنصر اول از دوم بزرگتر بود جای دو عنصر عوض می شود. سپس عناصر دوم و سوم مقایسه می شوند و مشابه قبل ی مکان در صورت لزوم انجام می گیرد. همین کارها برای عناصر ۳ و ۴» ۴ و 4۵ ....انجام می شود تا به انتهای آرایه برسیم. * زمانى كه به اننهاى آرايه برسيم ماكزيمم مقادير در آخرين مكان آرايه قرار كرفته است و به عبارت ديكر زمانى كه يك باراز ابتدا قا انتهاى آرايه بيمايش شود عنصر آخر مى شود. * در مرحله بعد ابن يبمايش و اعمال كفته شده روى عناصر اول تا يكى مانده به آخر انجام مى شود و در نتيجه : با دو بار پیمایش ۲ عنصر مرتب می شوند. * در مرحله بعد يبمايش از ابتدا تا عنصر دوتا مانده به آخر آرایه انجام می شود و در نتیجه: با سه بار پیمایش سه عنصر مرتب می شود. © به این ترتیب اگر آرایه » ۰ عنصری باشد با 0- پیمایش ؛ کل آرایه مرتب می شود.

صفحه 15:
‎٩‏ فرض کنید دو متغیر 205« و <06-, داشته باشیم و ‏بخواهیم مقدار آنها را با هم تعویض کنیم. © با تعریف متغیری به نام م< و نوشتن قطعه کد زیر می فوان این کار را انجام داد: عمسا امسا 1۳7۳5 ‎wy;‏ ‎۱/۵

صفحه 16:
Por (FOi1-+4) ‏رهطم ج‎ : ‏هسب‎ ‎Offa]; ‎Of ex; * ‏سوبي‎ rere نکته: حلقه سب دوم تعداد پیمایش ها (0ج تا) را کنترل می کند.

صفحه 17:
مقدار دهی به آرایه ها ۶ سه روش برای مقدار دهی به آرایه ها وجود دارد: ۱ ۰ اد ۶ با دستورات ورودی مثل 7یا ۳ ‎AO}‏ ‏۹601 ‏© مقدار دهی مستقیم: ‎ao}:‏ ‏:0-6 ‏؟ مقداردهی هنگام تعریف: (صفحه بعد)

صفحه 18:
مقداردهی هنگام تعریف * مى قوان آرايه ها را (تنها) هنكام تعریف به صورت زیر مقداردهى كرد: :(60-,9[<)0,9]< ۰۱ در اینجا ۲ در 0[»5 در [1]- و ۵- در [9]- قرار می گیرد. مثال های دیگر: (©4.6, :0.00 - زمزم ممم ‎chor oh{P I=,‏

صفحه 19:
فه عداد مقادبر نوشته شده داخل [ ) از اندازه * اگر در مقداردهی هنگام ت مشخص شده برای آرایه ببشتر باشد خطا اعلام می شود. (,,0,,۵)-[9] م * اكر تعداد مقادير كمتر باشدء بقيه صفر در نظر گرفته می شوند: (6,©)-[0] م در اينجا 0)-[©] مى شود. مثال دیگر: ‎rt x[UOO]={O}‏ همه مقادیر صفر می شوند. (اين روشی برای صفر کردن همه عناصر آرایه است). * ار بنویسیم: (0,0)-[ ]« «:اندازه آرایه ۲ در نظر گرفته مى شود.

صفحه 20:
آرایه ها به عنوان ورودی و بر گشتی توابح * آرايه ها مانندسایر متفیرها می توانند ورودی با برگشتی تابع باشند.

صفحه 21:
آرايه به عنوان ورودى تابع مثال ۶: تابعی بنویسید که یک آرایه را بگیرد و ماکزیمم آن را بركردافد: ورودی: آرایه برگشتی: یک عدد ([۱0] مس ما rot; Pat wax=x[0]; Por (=0;i<00;++i) ‏د < لمم‎ ‏سس‎ مسا {

صفحه 22:
برنامه کامل مثال ۶

صفحه 23:
* در بسیاری مواقع نیاز به کار با مقادیر ثابت در برنامه» پیش می آید و اين مقادیر ممکن است چند بار در برنامه تکرار شوند. مانند عدد ۱۰ در مثال قبل * اگر در مثال قبل بخواهیم ماکزیمم فرضا ۲۰ عدد را حساب کنیم باید تمام اعداد ۱۰ را به ۲۰ تبديل كنيم. اين امر دو مشكل دارد: وقت كير بودن و فراموش كردن تعويض همه مقادير. * دستور 02-7 در زبان © اين مشكل را مرتفع مى سازد.

صفحه 24:
مثال ۷: همان مثال قبل با تغیبرات جزئی: (با رنگ قرمز) "دستور سا ماد یک دمتورراهنمای پیش پردازنده ی كامبايلر در هر جاى برنامه كه با 011/۵ مواجه شود به جای آن عدد ۱۰ 9 ۳ قرار می دهد. ‎Fe woof‏ ۰ لصطلاحا بسک لب(هجبسس) خوانده‌می‌شسود. مرت نصا *اسم ثابت» دلخواه است. معمولا ثابت ها را با نام های با حروف بزرگ و تعریف ‎ce‏ تم سیر "مقدار ثابت در برفامه غيرقابل تغيير است. مثلا اكر دستورى ) ‎ord woe) :‏ گر مثلا خواستیم با ۲۰ عدد کار کنیم تنها کافی است عدد ۱۰ را در ی 6 لاح به ۲۰ تبدیل کنیم. :هات سد ‎che AY 39 cee gtd Jet‏ هاست. (ترتیب نوشتن ‎eH AON‏ ۳ عبات ها و ع(اط هم نسیستو می‌سوانند قبلبا بستد هم مس ای تلا ‎pent‏ قرار گیرند) )

صفحه 25:
تابع به عنوان برگشتی ‎BG‏ * خارج از مباحث درس می باشد و نیاز به آشنایی با مفیومی به نام اشاره گرها دارد.

الرحيم الرحمن ّ بسم اهلل ّ برنامه نويسي – Cجلسه 11 دانشگاه قم نيم سال اول 84-85 1 خالصه جلسه قبل ‏ مثال از توابع بازگشتی – برج های هانوی ‏ مزایا و معایب نوشتن برنامه به صورت بازگشتی: – مزایا :ساده شدن برنامه نویسی و خوانا تر شدن برنامه – معایب :مصرف حافظه و سرعت اجرای کمتر ‏ محل قرار گرفتن توابع – هر تابع قبل از احضار می بایست یا تعریف شده باشد و یا اعالن ‏ مزایای استفاده از توابع: – قابل فهم کردن و امکان برنامه نویسی سریعتر و ساده تر ‏ نوشتن برنامه های خوانا: – استفاده از توابع ،اسامی مناسب برای متغیرها و توابع ،دندانه ای کردن برنامه ،نوشتن ‏comment 2 در این جلسه آرایه ها – – – – – ضرورت وجود آرایه ها تعریف آرایه مثال هایی از کاربرد آرایه ها آرایه ها به عنوان ورودی و برگشتی تابع ثابت ()constant 3 ضرورت وجود آرایه ها ‏ مثال :برنامه ای بنویسید که 5عدد را بگیرد و میانگین و واریانس آنها را محاسبه کند. نکته :میانگین و واریانس nنقطه x1،x0و....وxn 1 از روابط زیر به دست می آیند: ‏n 1 2 ( ‏x ‏ ‏ ) ‏ i ‏n ‏ 2  i0 ‏n 1 ‏xi ‏ ‏i ‏0 ‏n ‏ اگر تنها هدف به دست آوردن میانگین بود به راحتی می توانستیم آن را انجام دهیم: ;float x ;sum=0 )for (i=0;i<5;++i { ;)scanf(“%f”,&x ;sum+=x } ;ave=sum/5 4 در اینجا برای به دست آوردن واریانس نیاز به همه xiها داریم .اما در کد نوشته شده قبل تنها آخرین عدد را داریم و بقیه مقادیر از بین رفته اند. در نتیجه ناچاریم کد خود را به صورتی مثل این بنویسیم: ;float x0,x1,x2,x3,x4 ;float ave,var ;)scanf(“%f%f%f%f%f”,&x0,&x1,&x2,&x3,&x4 ;ave=(x0+x1+x2+x3+x4)/5 ‏var=(pow(x0-ave,2)+pow(x1-ave,2)+pow(x2-ave,2)+pow(x3;ave,2)+pow(x4-ave,2))/5 5  به این ترتیب کد نامناسبی خواهیم داشت .این موضوع به ازای داده های زیادتر (مثال 1000عدد) بیشتر نمود پیدا می کند. ‏ در این جلسه نشان می دهیم با تعریف آرایه ها مي توان چنين برنامه هايي را خيلي ساده و خالصه پياده كرد. ‏ به طور كلي آرايه ها در مواردي به كار برده مي شوند كه با مجموعه اي از داده هاي هم نوع سروكار داشته باشيم. 6 تعريف آرايه ‏ يادآوري :با دستور تعريف متغير مثل ;int xمكاني در حافظه به نام x به برنامه تخصيص داده مي شد. ‏ در زبان Cاگر بنويسيم ] ، ;int x[5پنج مكان مجاور هم در حافظه به برنامه تخصيص داده مي شود .اين مكان ها به صورت x[0]، x[1]، ] x[2و ] x[4ناميده مي شوند. اصطالحا مي گوييم آرايه اي به نام ، xاز نوع intو با 5عنصر تعريف كرده ايم. به 3 ،2، 1 ،0و 4اصطالحا انديس آرايه گفته مي شود. به همين ترتيب مي توان آرايه هايي ازانواع ديگر مثل float، char، shortو ....داشت. ‏ ‏ ‏ 7 1 مثال Void main( ) { float num[3]; num[0]=1.2; num [1]=2; num[2]=3.4; printf(“%f”,num[1]) } 8 Void main( ) { char c[3]; c[2]=‘A’; c[0]=‘d’; c[1]=‘D’; } مثال 2 >#include <stdio.h ) (Void main { ;int I ;]int x[4 )for (i=0;i<4;++i ;)]scanf(“%f”,x[i )for (i=0;i<4;++i ;)]printf(“\t%f”,x[i } حلقه اول مقادیر را دریافت می کند و در آرایه xقرار می دهد و حلقه دوم این مقادیر را چاپ می کند. 9 عدد5 ) محاسبه ميانگين و واريانس3 مثال 1 Void main( ) { float x[5]; float sum=0 , ave; int I; for (i=0;i<5;++i) { scanf(“%f”,&x[i]); sum+=x[i]; } Ave=sum/5; Var=0; For (i=0;i<5;++i) Var+=pow (x[i]-ave,2)/5; Printf(“The average=%f”,ave); Printf(“The variance=%f”,var) } مقدار را از کاربر دریافت کرده و آنها در یک آرایه بریزد و سپس ماکزیمم مقادیر و اندیس عنصر40 ) برنامه ای بنویسید که4 مثال .ماکزیمم را محاسبه کند 1 #include <stdio.h> void main() { int i; float x[40]; float max; int max_index; for (i=0;i<40;++i) { printf("Enter number %dth:",(i+1)); scanf("%f",&x[i]); } max=x[0]; max_index=0; for (i=1;i<40;++i) if (x[i]>max) { max=x[i]; max_index=i; } printf("\nThe maximum=%f",max); printf("\nAnd its index=%d",max_index); } مثال )5برنامه ای بنویسید که 10عدد از کاربر بگیرد آنها را به صورت صعودی مرتب کرده و چاپ کند. برنامه از دو بخش تشکیل شده است: دریافت اعداد مرتب کردن آنها .1دریافت اعداد را می توان با تعریف یک آرایه و نوشتن قطعه برنامه ای به صورت زیر انجام داد: ;]int x[10 ;int i )for (i=0;i<10;++i ;)]scanf(“%f”,&x[i 1 .2به مسئله مرتب سازی اصطالحا sortingگفته می شود .برای مرتب سازی روش های متعددی وجود دارد .مانند : )quick sort، merge sort ، ‏gی ‏gباب ‏gیح ‏gبسgاز (bubble sortمgرت و..... در این مثال از bubble sortکه یکی از ساده ترین آنهاست استفاده می شود. 1 Bubble sortبرای مرتب سازی صعودی ابتدا دو عنصر اول و دوم آرایه با هم مقایسه می شوند.اگر عنصر اول از دوم بزرگتر بود جای دو عنصر عوض می شود .سپس عناصر دوم و سوم مقایسه می شوند و مشابه قبل تعویض مکان در صورت لزوم انجام می گیرد .همین کارها برای عناصر 3و 4 ،4و ،5 و....انجام می شود تا به انتهای آرایه برسیم. زمانی که به انتهای آرایه برسیم ماکزیمم مقادیر در آخرین مکان آرایه قرار گرفته است و به عبارت دیگر زمانی که یک باراز ابتدا تا انتهای آرایه پیمایش شود عنصر آخر می شود. در مرحله بعد این پیمایش و اعمال گفته شده روی عناصر اول تا یکی مانده به آخر انجام می شود و در نتیجه : با دو بار پیمایش 2عنصر مرتب می شوند. در مرحله بعد پیمایش از ابتدا تا عنصر دوتا مانده به آخر آرایه انجام می شود و در نتیجه: با سه بار پیمایش سه عنصر مرتب می شود. به این ترتیب اگر آرایه n ،عنصری باشد با n-1پیمایش ،کل آرایه مرتب می شود. 1 تعویض دو مقدار فرض کنید دو متغیر x=23و y=34داشته باشیم و بخواهیم مقدار آنها را با هم تعویض کنیم. با تعریف متغیری به نام tempو نوشتن قطعه کد زیر می توان این کار را انجام داد: ;float temp ;temp=x ;x=y ;y=temp 1 5 برنامه مثال 1 #include <stdio.h> void main() { int i,j; float A[10]; float temp; for (i=0;i<10;++i) scanf("%f",&A[i]); for (i=9;i>1;--i) for (j=0;j<i;++j) if (A[j]>A[j+1]) { temp=A[j]; A[j]=A[j+1]; A[j+1]=temp; } for (i=0;i<10;++i) printf("\n%f",A[i]); } . تا) را کنترل می کندn-1( دوم تعداد پیمایش هاfor حلقه:نکته مقدار دهی به آرایه ها ‏ سه روش برای مقدار دهی به آرایه ها وجود دارد: ‏ با دستورات ورودی مثل scanfیا :getche ;)(ch[0]=getche ;)]scanf(“%d”,&x[2 ‏ مقدار دهی مستقیم: ‏ مقداردهی هنگام تعریف( :صفحه بعد) ;’ch[0]=‘a ;x[2]=23 1 مقداردهی هنگام تعریف می توان آرایه ها را (تنها)هنگام تعریف به صورت زیر مقداردهی کرد: ;}int x[3]={2,3,-5 در اینجا 2در x[0]، 3در ] x[1و -5در ] x[3قرار می گیرد. مثال های دیگر: ;}float f[2]={0.34,4.33 ;}’char ch[4]={‘a’,’d’,’x’,’v 1 چند سوال اگر در مقداردهی هنگام تعریف ،تعداد مقادیر نوشته شده داخل { } از اندازه مشخص شده برای آرایه بیشتر باشد خطا اعالم می شود. }int x[2]={3,4,6,7,8 اگر تعداد مقادیر کمتر باشد ،بقیه صفر در نظر گرفته می شوند: }int x[3]={3,4 در اینجا x[2]=0می شود. مثال دیگر: }int x[100]={0 همه مقادیر صفر می شوند( .این روشی برای صفر کردن همه عناصر آرایه است). اگر بنویسیم int x[ ]={2,3} :اندازه آرایه 2در نظر گرفته می شود. 1 آرایه ها به عنوان ورودی و برگشتی توابع آرایه ها مانند سایر متغیرها می توانند ورودی یا برگشتی تابع باشند. 2 آرایه به عنوان ورودی تابع مثال :6تابعی بنویسید که یک آرایه را بگیرد و ماکزیمم آن را برگرداند: ورودی :آرایه برگشتی :یک عدد )]float max(float x[10 { ;int i ;]float max=x[0 )for (i=1;i<10;++i )if (x[i]>max ;]max=x[i ;return max } 2 6 برنامه کامل مثال #include <stdio.h> float max(float x[10]) { int i; float max=x[0]; for (i=1;i<10;++i) if (x[i]>max) max=x[i]; return max; } 2 void main() { int i; float A[10]; for (i=0;i<10;++i) scanf("%f",&A[i]); printf("\nThe maximum=%f",max(A)); } ثابت ()Constant در بسیاری مواقع نیاز به کار با مقادیر ثابت در برنامه ،پیش می آید و این مقادیر ممکن است چند بار در برنامه تکرار شوند .مانند عدد 10در مثال قبل اگر در مثال قبل بخواهیم ماکزیمم فرضا 20عدد را حساب کنیم باید تمام اعداد 10را به 20تبدیل کنیم .این امر دو مشکل دارد :وقت گیر بودن و فراموش کردن تعویض همه مقادیر. دستور defineدر زبان Cاین مشکل را مرتفع می سازد. 2 دستور define مثال :7همان مثال قبل با تغییرات جزئی( :با رنگ قرمز) ‏gر ،defineمانند includeیک دستور راهنمای پیش پردازنده •دستو است. • کامپایلر در هر جای برنامه که با SIZEمواجه شود به جای آن عدد 10 قرار می دهد. gمgیشgود. ‏gنده ‏gوا ‏gت( )constantخ ‏gطالحا یکثgاب ‏gص • SIZEا •اسم ثابت ،دلخواه است .معموال ثابت ها را با نام های با حروف بزرگ تعریف می کنند. •مقدار ثابت در برنامه غیرقابل تغییر است .مثال اگر دستوری )(void main ‏gیسیم خطا داده می شود. مثل SIZE=23در برنامه بنو { ‏gاستیم با 20عدد کار کنیم تنها کافی است عدد 10را در •اگر مثال خو ;int i ;]float A[SIZE defineبه 20تبدیل کنیم. )for (i=0;i<SIZE;++i •محل دستور defineدر بخش includeهاست( .ترتیب نوشتن ;)]scanf("%f",&A[i ;))printf("\nThe maximum=%f",max(A ‏gد هم ‏gند قgبلیا بgع ‏gن includeها و defineمgهم نgیستو مgیتgوا } قرار گیرند) >#include <stdio.h #define SIZE 10 )]float max(float x[SIZE { ;int i ;]float max=x[0 )for (i=1;i<SIZE;++i )if (x[i]>max ;]max=x[i ;return max } 2 تابع به عنوان برگشتی تابع خارج از مباحث درس می باشد و نیاز به آشنایی با مفهومی به نام اشاره گرها دارد. 2

51,000 تومان