صفحه 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 i0
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