6-3 چند الگوریتم نمونه
Download
Report
Transcript 6-3 چند الگوریتم نمونه
مبانی کامپیوتر و برنامه سازی
فصل سوم :الگوریتم
مدرس :نگین معروفی
3الگوریتم
الگوریتم
مجموعه محدودی از دستورالعملها است که اگر به ترتیب دنبال
شوند موجب انجام کار خاصی می گردند.
هر الگوریتم باید دارای شرایط زیر باشد
ورودی :یک الگوریتم می تواند صفر یا چند ورودی داشته باشد
که از محیط خارج تامین می گردد.
خروجی :الگوریتم باید یک یا چند کمیت خروجی داشته باشد.
قطعیت :هر دستورالعمل باید واضح و بدون ابهام باشد.
کارایی :هر دستورالعمل باید قابل اجرا باشد.
محدودیت :در تمام حاالت ،الگوریتم باید پس از طی مراحل
محدودی خاتمه یابد.
3الگوریتم
در علم کامپیوتر ،ما معموال با یک مسئله مواجهیم که باید آن را حل
کنیم .این مسئله می تواند در زمینه های مختلفی همچون علمی،
اقتصادی ،ریاضی ،فنی و ...باشد.
معموال برای حل یک مسئله ،مراحل زیر طی می گردد
تعریف مسئله بصورت جامع و دقیق (شامل تعریف ورودیها و خروجیها)
بررسی راه حلهای مختلف برای حل مسئله
انتخاب مناسبترین راه حل و تهیه یک الگوریتم برای آن
آزمایش الگوریتم با داده های ورودی و اشکالزدایی آن
تبدیل الگوریتم به یک زبان برنامه نویسی کامپیوتری (مانند Cیا )Pascal
وارد کردن برنامه به کامپیوتر و تست و اشکالزدایی آن
استفاده از برنامه
3-1نحوه بیان الگوریتمها
چگونه می توانیم الگوریتمها را بیان کنیم؟
الگوریتمها باید برای انسانها قابل فهم و درک باشند و همه بتوانند به
راحتی منظور نویسنده الگوریتم را درک کنند
معموال الگوریتمها به یک زبان طبیعی مانند فارسی یا انگلیسی نوشته
می شود.
این مسئله باعث می شود که بعضی ابهامات در درک الگوریتمها پیش
آید.
معموال یکسری از توافقات و تعریفها از قبل بین طراح و خواننده الگوریتم
برقرار می گردد.
از آنجا که زبانهای برنامه نویسی مانند Cبه زبان انگلیسی خیلی
نزدیک هستند ،بعض از طراحان از ترکیب زبان Cو انگلیسی (که به آن
کد شبه Cمی گویند) برای بیان الگوریتم استفاده می کنند
الزم بذکر است که در گذشته از نمودار گردشی ) (Flowchartنیز برای
بیان الگوریتمها با استفاده از شکلهای استاندارد استفاده می شد ،که
تنها برای الگوریتمهای کوچک مناسب بود.
3-2شروع به کار با الگوریتمها
الگوریتمی بنویسید که ضرایب یک معادله درجه دوم بصورت زیر را دریافت و ریشه
های آن را محاسبه و چاپ کند.
ax2 + bx + c = 0
برای حل این مسئله ابتدا باید ضرائب b ، aو cاز کاربر دریافت و در خانه های
حافظه ذخیره گردند.
برای اینکه بتوانیم بعدا به این خانه های حافظه مراجعه کنیم ،به هریک از آنها یک
نام نسبت می دهیم .به هریک از این نامها یک متغیر گفته می شود.
دلیل این نامگذاری آنستکه مقادیر ذخیره شده در هریک از این خانه های حافظه
می تواند تغییر کند.
گرچه انتخاب نام بعهده خودشماست و می تواند هر چیزی باشد ،ولی توصیه می
گردد از اسامی بامعنی و متناسب استفاده گردد .این کار سبب می شود که
خواندن و درک الگوریتم شما برای سایر افراد نیز ساده گردد.
اکنون به قراردادهای زیر توجه کنید :
برای دریافت اطالعات از کاربر از دستور بخوان استفاده می گردد.
برای نوشتن اطالعات در خروجی از دستور چاپ کن استفاده می گردد.
برای انتساب یک مقدار به یک متغیر از عالمت ← استفاده می شود.
3-2شروع به کار با الگوریتمها
(1
(2
(3
aو bو cرا بخوان
delta ← b2 – 4ac
x1 b deltaو
(4
(5
x1و x2را چاپ کن
توقف کن
2a
b delta
2a
x2
3-3مکانیزم شرط
مکانیزم شرط هنگامی استفاده می شود که قصد داریم درستی یا
نادرستی یک عبارت رابررسی کرده و متناسب با نتیجه بررسی شرط،
عملیات خاصی را انجام دهیم و یا از انجام بعضی عملیات صرفنظر کنیم.
شکل کلی این دستور به شکل زیر است
اگر (عبارت شرطی) آنگاه دستورات
این دستور به شکل زیر نیز استفاده می شود:
اگر (عبارت شرطی) آنگاه دستورات1
درغیر اینصورت دستورات 2
3-3مکانیزم شرط
(1
(2
(3
(4
aو bو cرا بخوان
اگر ) ( a = 0آنگاه چاپ کن ”معادله درجه 2نیست“ و توقف کن
delta ← b2 – 4ac
اگر ) ( delta < 0آنگاه چاپ کن ”معادله جواب ندارد“
و b delta
b delta
درغیراینصورت
x2
x1
2a
و x1و x2را چاپ کن
(5
توقف کن
2a
3-4مکانیزم حلقه تکرار
در بعضی الگوریتمها الزم است که عملیات مشخصی چندین بار تکرار
شوند .بعنوان مثال فرض کنید قصد داریم میانگین معدلهای 100دانشجو را
محاسبه کنیم .قطعا 100بار دستور خواندن و جمع کردن راه حل چندان
مناسبی نیست.
راه حل بهتر آنستکه بگونه ای به مجری الگوریتم بگوییم بنحوی عمل
خواندن معدل و جمع زدن آنها را 100بار تکرار کند.
حلقه تکرار مکانیزمی است که مجموعه ای از دستوزات را تا زمانیکه شرط
خاصی برقرار باشد تکرار می کند.
حلقه تکرار به دو شکل مورد استفاده قرار می گیرد
3-4مکانیزم حلقه تکرار
شرط در ابتدای حلقه که مکانیزم کلی آن به شکل زیر است :
تا زمانیکه (شرط مورد نظر) دستورات aتا bرا تکرارکن
… )a
.
.
.
… )b
در این حالت ابتدا شرط موردنظر بررسی می گردد؛ درصورتیکه شرط
برقرار نباشد به اولین دستور پس از bمی رود .اما در صورتیکه شرط
درست ارزیابی شود ،دستورات شماره aتا bانجام می شوند و سپس
مجددا به ابتدای حلقه بازگشته و عملیات فوق را مجددا تکرار می کند.
3-4مکانیزم حلقه تکرار
شرط در انتهای حلقه که مکانیزم کلی آن به شکل زیر است :
تکرار کن
…)a
.
.
.
… )b
تا زمانیکه (شرط مورد نظر)
در این روش ابتدا دستورات حلقه یکبار انجام می شوند و در پایان حلقه
شرط بررسی می گردد .چنانچه شرط برقرار نبود به دستور بعدی می
رود و در صورت برقرار بودن شرط ،مجددا به ابتدای حلقه باز می گردد.
3-4مکانیزم حلقه تکرار
(1
(2
(3
(4
(5
(6
(7
الگوریتمی بنویسید که یک عدد را دریافت و فاکتوریال آن را محاسبه و
چاپ کند.
N! = 1 × 2 × 3 × … × (N-1) × N
الگوریتم
nرا بخوان
i ←1و fact ←1
تا زمانیکه ) ) i ≤ nدستورات 4-5را تکرار کن
fact ← fact × i
i←i+1
factرا چاپ کن
توقف کن
3-5آزمایش الگوریتم
(1
(2
(3
(4
(5
(6
(7
nرا بخوان
i ← 1و fact ← 1
تا زمانیکه ( ) i ≤ nدستورات 4-5را تکرار کن
fact ←fact × i
i ←i + 1
factرا چاپ کن
n=4
توقف کن
اجرای الگوریتم ←
i= 4
1
2
3
5
fact = 1
2
6
24
= 24خروجی
3-6چند الگوریتم نمونه
الگوریتمی بنویسید که nعدد را دریافت و حداکثر و حداقل آنها را چاپ
کند.
n (1را بخوان
adad (2را بخوان
min ← adad (3و max ← adad
i ← 2 (4
(5تا زمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
adad (6را بخوان
(7اگر ) ( adad > maxآنگاه max ← adad
در غیر اینصورت اگر ) ( adad < minآنگاه min ← adad
i←i+1
(8
max (9و minرا چاپ کن
(10توقف کن
3-6چند الگوریتم نمونه
n (1را بخوان
adad (2را بخوان
min ← adad (3و max ← adad
i ← 2 (4
(5تا زمانیکه ( ) i ≤ nدستورات 6تا 8را تکرار کن
adad (6را بخوان
(7اگر ) ( adad > maxآنگاه max ← adad
در غیر اینصورت اگر ) ( adad < minآنگاه min ← adad
i ← i + 1 (8
n= 5
2
4
3
max (9و minرا چاپ کن
i=6
5
39
27
21
6
(10توقف کن
adad = 18
27
39
max = 18
اجرای الگوریتم ←
6
min = 18
= 39 6خروجی
3-6چند الگوریتم نمونه
الگوریتمی بنویسید که مقدار xو تعداد جمالت را دریافت و سپس )sin(x
را با استفاده از فرمول زیر تخمین بزند:
3
5
7
x
x
x
sin(x) x ...
!3! 5! 7
x (1و nرا بخوان
sin ← x (2و fact ← 1و xPower ← xوsign ← 1
i ← 1 (3
(4تازمانیکه ) ( i < nدستورات 5تا 9را تکرار کن
fact ← fact × 2i × (2i+1) (5
xPower ← xPower × x2 (6
sign ← -1 × sign (7
sin ← sin + sign × (xPower / fact) (8
i ← i + 1 (9
sin (10را چاپ کن
(11توقف کن
3-6چند الگوریتم نمونه
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
الگوریتمی بنویسید که برای تعدادی مشترک این اطالعات را بخواند :شماره حساب ،موجودی اولیه،
تعداد برداشت یا واریز و سپس برای هر برداشت یا واریز این اطالعات را دریافت کند:
کد عمل ( = 1برداشت = 2 ،واریز) و مبلغ.
در نهایت برای هرمشترک ،شماره حساب و موجودی نهایی را چاپ کند.
nرا بخوان
i←1
تا زمانیکه ( ) i ≤ nدستورات 4تا 11را تکرار کن
shomareو mojodiو tedadرا بخوان
j←1
تا زمانیکه ( ) j ≤ tedadدستورات 7تا 9را تکرار کن
codeو mablaghرا بخوان
اگر ) ( code = 1آنگاه mojodi ← mojodi – mablagh
درغیراینصورت اگر ) ( code = 2آنگاه mojodi ← mojodi + mablagh
درغیراینصورت چاپ کن "کد اشتباه است"
j←j+1
shomareو mojodiرا چاپ کن
i←i+1
توقف کن
3-6چند الگوریتم نمونه
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
الگوریتمی بنویسید که معدل و کد جنسیت دانشجویان (پسران= mو دختران= )fیک کالس را
دریافت و در پایان میانگین معدل پسران و میانگین معدل دختران و میانگین معدل کل کالس را چاپ
کند.
nرا بخوان
mSum ← 0و mCount ← 0و fSum ← 0و fCount ← 0
i←1
تا زمانیکه ( ) i ≤ nدستورات 5تا 7را تکرار کن
codeو averageرا بخوان
اگر ) ( code = mآنگاه
fSum ← fSum + averageو fCount ← fCount + 1
در غیراینصورت اگر ) ( code = mآنگاه
mSum ← mSum + averageو mCount ← mCount + 1
در غیراینصورت چاپ کن "کد اشتباه است" و i ← i – 1
i←i+1
اگر ) ( fCount > 0آنگاه fAve ← fSum / fCount
اگر ) ( mCount > 0آنگاه mAve ← mSum / mCount
totalAverage ← (mSum + fSum) / n
mAveو fAveو totalAverageرا چاپ کن
توقف کن
3-6چند الگوریتم نمونه
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
الگوریتمی بنویسید که برای تعدادی دانشجو ،نام و شماره دانشجویی و تعداد دروس را دریافت کند و سپس برای هر دانشجو نمره و تعداد واحد هر
درس وی را دریافت و معدل وی را محاسبه نماید .در پایان شماره دانشجویی ،نام و معدل دو دانشجوی برتر کالس را چاپ کند.
nرا بخوان
maxAve1 ← -1و maxAve2 ← -1
i←1
تازمانیکه ( ) i ≤ nدستورات 5تا 15را تکرار کن
nameو idو tedadرا بخوان
sum ← 0و sumVahed ← 0
j←1
تازمانیکه ( ) j ≤ tedadدستورات 9تا 12را تکرار کن
nomreو vahedرا بخوان
sum ← sum + nomre × vahed
sumVahed ← sumVahed + vahed
j←j+1
average ← sum / sumVahed
اگر ) ( average > maxAve1آنگاه
maxName2 ← maxName1و maxId2 ← maxId1
maxAve2 ← maxAve1و maxName1 ← name
maxId1 ← idو maxAve1 ← average
درغیراینصورت اگر ) ( average > maxAve2آنگاه
maxName2 ← nameو maxId2 ← idو maxAve2 ← average
i←i+1
maxId1و maxName1و maxAve1و maxId2و maxName2و maxAveرا چاپ کن
توقف کن
3-6چند الگوریتم نمونه
(1
(2
(3
(4
(5
(6
(7
(8
(9
(10
(11
(12
(13
(14
(15
(16
(17
الگوریتمی بنویسید که برای تعدادی شهر ابتدا نام شهر را دریافت و سپس دمای هوا در 24ساعت گذشته دریافت نماید و میانگین دما
را برای هر شهر محاسبه و چاپ نماید .درپایان موارد زیر را چاپ نماید :
شهری که از همه سردتر بوده است
شهری که از همه گرمتر بوده است
تعداد شهرهای سرد (کمتر از ، )10معتدل (بین 10تا )30و گرم (بیشتر از )30به تفکیک
درضمن تعداد شهرها مشخص نیست و در پایان هر شهر سوال می شود که آیا ادامه بدهیم یا خیر؟
warmDegree ← -100و coldDegree ← 100
coldCount ← 0و warmCount ← 0و mediumCount ← 0
تکرار کن
cityرا بخوان
sum ← 0و hour ← 1
تازمانیکه ) ) hour ≤ 24دستورات 7تا 9را تکرار کن
degreeرا بخوان
sum ← sum + degree
hour ← hour + 1
sum ← sum / 24
اگر ) ( sum > warmDegreeآنگاه
warmDegree ← sumو warmCity ← city
درغیراینصورت اگر ) ( sum < coldDegreeآنگاه
coldDegree ← sumو coldCity ← city
اگر ) ( sum < 10آنگاه coldCount ← coldCount +1
در غیر اینصورت اگر ) ( sum < 30آنگاه
mediumCount ← mediumCount + 1
درغیراینصورت warmCount ← warmCount + 1
چاپ کن "آیا مایل به ادامه هستید ؟"
answerرا بخوان
تا زمانیکه ( ’) answer = ‘yes
اطالعات الزم را چاپ کن
توقف کن
3-6چند الگوریتم نمونه
الگوریتمی بنویسید که یک عدد را دریافت و وارون آن را محاسبه و بهمراه
خود عدد چاپ کند .مثال وارون عدد 3872برابر 2783می باشد.
adad (1را بخوان
(2اگر ) ( adad < 0آنگاه a ← -adad
در غیر اینصورت a ← adad
varoon ← 0 (3
(4تازمانیکه ) ( a > 0آنگاه دستورات 5تا 7را تکرار کن
remain ← a mod 10 (5
a ← a / 10 (6
varoon ← varoon × 10 + remain (7
(8اگر ) ( adad < 0آنگاه varoon ← -varoon
adad (9و varoonرا چاپ کن
(10توقف کن
3-6چند الگوریتم نمونه
adad (1را بخوان
(2اگر ) ( adad < 0آنگاه a ← -adad
در غیر اینصورت a ← adad
varoon ← 0 (3
(4تازمانیکه ) ( a > 0آنگاه دستورات 5تا 7را تکرار کن
remain ← a mod 10 (5
a ← a / 10 (6
varoon ← varoon × 10 + remain (7
(8اگر ) ( adad < 0آنگاه varoon ← -varoon
adad = -275
adad (9و varoonرا چاپ کن
275
27
0
a=2
(10توقف کن
0
57
-572
5
varoon = 572
اجرای الگوریتم ←
remain = 2
5
7
= -275 -572خروجی
3-6چند الگوریتم نمونه
(1
(2
(3
(4
(5
(6
(7
(8
الگوریتمی بنویسید که یک عدد را دریافت و تعیین کند که آیا اول است یا
خیر؟
adadرابخوان
adad
root
i ← 2و primeSw ← 1
تازمانیکه ) ) i ≤ root and primeSw=1دستورات 5تا 6را تکرار کن
اگر ) ( adad mod i = 0آنگاه primeSw ← 0
i←i+1
اگر ) ( primeSw = 1آنگاه چاپ کن "عدد اول است“
درغیراینصورت چاپ کن "عدد اول نیست"
توقف کن
3-6چند الگوریتم نمونه
(1
(2
(3
(4
(5
(6
(7
(8
(9
الگوریتمی بنویسید که یک عدد صحیح مثبت در مبنای 10را دریافت و
سپس آن را به مبنای bببرد .مبنای bنیز از کاربر دریافت می گردد.
adadو bرا بخوان
hasel ← 0و i ← 0
تازمانیکه ) ( adad > 0دستورات 4تا 7را تکرار کن
remain ← adad mod b
hasel ← hasel + remain × 10 i
( adad ← adad / bتقسیم صحیح بر صحیح)
i←i+1
haselرا چاپ کن
توقف کن