270 likes | 718 Views
مبانی کامپیوتر و برنامه سازی. فصل سوم :الگوریتم مدرس : نگین معروفی. 3 الگوریتم. الگوریتم مجموعه محدودی از دستورالعملها است که اگر به ترتیب دنبال شوند موجب انجام کار خاصی می گردند. هر الگوریتم باید دارای شرایط زیر باشد
E N D
مبانی کامپیوتر و برنامه سازی فصل سوم :الگوریتم مدرس : نگین معروفی
3 الگوریتم • الگوریتم • مجموعه محدودی از دستورالعملها است که اگر به ترتیب دنبال شوند موجب انجام کار خاصی می گردند. • هر الگوریتم باید دارای شرایط زیر باشد • ورودی : یک الگوریتم می تواند صفر یا چند ورودی داشته باشد که از محیط خارج تامین می گردد. • خروجی : الگوریتم باید یک یا چند کمیت خروجی داشته باشد. • قطعیت : هر دستورالعمل باید واضح و بدون ابهام باشد. • کارایی : هر دستورالعمل باید قابل اجرا باشد. • محدودیت : در تمام حالات، الگوریتم باید پس از طی مراحل محدودی خاتمه یابد.
3 الگوریتم • در علم کامپیوتر، ما معمولا با یک مسئله مواجهیم که باید آن را حل کنیم. این مسئله می تواند در زمینه های مختلفی همچون علمی، اقتصادی، ریاضی، فنی و ... باشد. • معمولا برای حل یک مسئله، مراحل زیر طی می گردد • تعریف مسئله بصورت جامع و دقیق (شامل تعریف ورودیها و خروجیها) • بررسی راه حلهای مختلف برای حل مسئله • انتخاب مناسبترین راه حل و تهیه یک الگوریتم برای آن • آزمایش الگوریتم با داده های ورودی و اشکالزدایی آن • تبدیل الگوریتم به یک زبان برنامه نویسی کامپیوتری (مانند C یا Pascal) • وارد کردن برنامه به کامپیوتر و تست و اشکالزدایی آن • استفاده از برنامه
1-3 نحوه بیان الگوریتمها • چگونه می توانیم الگوریتمها را بیان کنیم؟ • الگوریتمها باید برای انسانها قابل فهم و درک باشند و همه بتوانند به راحتی منظور نویسنده الگوریتم را درک کنند • معمولا الگوریتمها به یک زبان طبیعی مانند فارسی یا انگلیسی نوشته می شود. • این مسئله باعث می شود که بعضی ابهامات در درک الگوریتمها پیش آید. • معمولا یکسری از توافقات و تعریفها از قبل بین طراح و خواننده الگوریتم برقرار می گردد. • از آنجا که زبانهای برنامه نویسی مانند C به زبان انگلیسی خیلی نزدیک هستند، بعض از طراحان از ترکیب زبان C و انگلیسی (که به آن کد شبه C می گویند) برای بیان الگوریتم استفاده می کنند • لازم بذکر است که در گذشته از نمودار گردشی (Flowchart) نیز برای بیان الگوریتمها با استفاده از شکلهای استاندارد استفاده می شد، که تنها برای الگوریتمهای کوچک مناسب بود.
2-3 شروع به کار با الگوریتمها • الگوریتمی بنویسید که ضرایب یک معادله درجه دوم بصورت زیر را دریافت و ریشه های آن را محاسبه و چاپ کند. ax2 + bx + c = 0 • برای حل این مسئله ابتدا باید ضرائب a ، b و c از کاربر دریافت و در خانه های حافظه ذخیره گردند. • برای اینکه بتوانیم بعدا به این خانه های حافظه مراجعه کنیم، به هریک از آنها یک نام نسبت می دهیم. به هریک از این نامها یک متغیر گفته می شود. • دلیل این نامگذاری آنستکه مقادیر ذخیره شده در هریک از این خانه های حافظه می تواند تغییر کند. • گرچه انتخاب نام بعهده خودشماست و می تواند هر چیزی باشد، ولی توصیه می گردد از اسامی بامعنی و متناسب استفاده گردد. این کار سبب می شود که خواندن و درک الگوریتم شما برای سایر افراد نیز ساده گردد. • اکنون به قراردادهای زیر توجه کنید : • برای دریافت اطلاعات از کاربر از دستور بخوان استفاده می گردد. • برای نوشتن اطلاعات در خروجی از دستور چاپ کن استفاده می گردد. • برای انتساب یک مقدار به یک متغیر از علامت ← استفاده می شود.
2-3 شروع به کار با الگوریتمها • a و b و c را بخوان • delta ← b2 – 4ac • و x1و x2 را چاپ کن توقف کن
3-3 مکانیزم شرط • مکانیزم شرط هنگامی استفاده می شود که قصد داریم درستی یا نادرستی یک عبارت رابررسی کرده و متناسب با نتیجه بررسی شرط، عملیات خاصی را انجام دهیم و یا از انجام بعضی عملیات صرفنظر کنیم. • شکل کلی این دستور به شکل زیر است اگر (عبارت شرطی) آنگاهدستورات • این دستور به شکل زیر نیز استفاده می شود: اگر (عبارت شرطی) آنگاهدستورات1 درغیر اینصورتدستورات 2
3-3 مکانیزم شرط a و b و c را بخوان اگر ( a = 0 ) آنگاه چاپ کن ”معادله درجه 2 نیست“ و توقف کن delta ← b2 – 4ac اگر ( delta < 0 ) آنگاه چاپ کن ”معادله جواب ندارد“ درغیراینصورت و و x1 و x2 را چاپ کن توقف کن
4-3 مکانیزم حلقه تکرار • در بعضی الگوریتمها لازم است که عملیات مشخصی چندین بار تکرار شوند. بعنوان مثال فرض کنید قصد داریم میانگین معدلهای 100 دانشجو را محاسبه کنیم. قطعا 100 بار دستور خواندن و جمع کردن راه حل چندان مناسبی نیست. • راه حل بهتر آنستکه بگونه ای به مجری الگوریتم بگوییم بنحوی عمل خواندن معدل و جمع زدن آنها را 100 بار تکرار کند. • حلقه تکرار مکانیزمی است که مجموعه ای از دستوزات را تا زمانیکه شرط خاصی برقرار باشد تکرار می کند. • حلقه تکرار به دو شکل مورد استفاده قرار می گیرد
4-3 مکانیزم حلقه تکرار • شرط در ابتدای حلقه که مکانیزم کلی آن به شکل زیر است : تا زمانیکه (شرط مورد نظر) دستوراتa تا bرا تکرارکن … (a . . . … (b • در این حالت ابتدا شرط موردنظر بررسی می گردد؛ درصورتیکه شرط برقرار نباشد به اولین دستور پس از b می رود. اما در صورتیکه شرط درست ارزیابی شود، دستورات شماره a تا b انجام می شوند و سپس مجددا به ابتدای حلقه بازگشته و عملیات فوق را مجددا تکرار می کند.
4-3 مکانیزم حلقه تکرار • شرط در انتهای حلقه که مکانیزم کلی آن به شکل زیر است : تکرار کن …(a . . . … (b تا زمانیکه (شرط مورد نظر) • در این روش ابتدا دستورات حلقه یکبار انجام می شوند و در پایان حلقه شرط بررسی می گردد. چنانچه شرط برقرار نبود به دستور بعدی می رود و در صورت برقرار بودن شرط، مجددا به ابتدای حلقه باز می گردد.
4-3 مکانیزم حلقه تکرار • الگوریتمی بنویسید که یک عدد را دریافت و فاکتوریال آن را محاسبه و چاپ کند. N! = 1 × 2 × 3 × … × (N-1) × N • الگوریتم • n را بخوان • 1← i و 1← fact • تا زمانیکهn) ( i ≤ دستورات 5-4 را تکرار کن • fact × i ← fact • i + 1 ← i • fact را چاپ کن • توقف کن
5-3 آزمایش الگوریتم • n را بخوان • 1← i و 1← fact • تا زمانیکه( i ≤ n) دستورات 5-4 را تکرار کن • fact × i ← fact • i + 1 ← i • fact را چاپ کن • توقف کن n = i = fact = خروجی = 4 4 1 2 3 5 ←اجرای الگوریتم 1 2 6 24 24
6-3 چند الگوریتم نمونه • الگوریتمی بنویسید که n عدد را دریافت و حداکثر و حداقل آنها را چاپ کند. • n را بخوان • adad را بخوان • min ← adad و max ← adad • i ← 2 • تا زمانیکه ( i ≤ n ) دستورات 6 تا 8 را تکرار کن • adad را بخوان • اگر ( adad > max) آنگاه max ← adad در غیر اینصورت اگر ( adad < min ) آنگاه min ← adad • i ← i + 1 • max و min را چاپ کن • توقف کن
6-3 چند الگوریتم نمونه • nرا بخوان • adad را بخوان • min ← adad و max ← adad • i ← 2 • تا زمانیکه ( i ≤ n ) دستورات 6 تا 8را تکرار کن • adad را بخوان • اگر ( adad > max) آنگاه max ← adad در غیر اینصورت اگر ( adad < min ) آنگاه min ← adad • i ← i + 1 • max و min را چاپ کن • توقف کن n = i = adad = max = min = خروجی = 5 6 2 4 3 5 18 39 27 21 6 18 27 39 ←اجرای الگوریتم 18 6 39 6
6-3 چند الگوریتم نمونه • الگوریتمی بنویسید که مقدار x و تعداد جملات را دریافت و سپس sin(x) را با استفاده از فرمول زیر تخمین بزند: x و n را بخوان sin ← x و fact ← 1 و xPower ← x وsign ← 1 i ← 1 تازمانیکه ( i < n ) دستورات 5 تا 9 را تکرار کن fact ← fact × 2i × (2i+1) xPower ← xPower × x2 sign ← -1 × sign sin ← sin + sign × (xPower / fact) i ← i + 1 sin را چاپ کن توقف کن
6-3 چند الگوریتم نمونه • الگوریتمی بنویسید که برای تعدادی مشترک این اطلاعات را بخواند : شماره حساب، موجودی اولیه، تعداد برداشت یا واریز و سپس برای هر برداشت یا واریز این اطلاعات را دریافت کند: کد عمل (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 • توقف کن
6-3 چند الگوریتم نمونه • الگوریتمی بنویسید که معدل و کد جنسیت دانشجویان (پسران=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 را چاپ کن • توقف کن
6-3 چند الگوریتم نمونه • الگوریتمی بنویسید که برای تعدادی دانشجو، نام و شماره دانشجویی و تعداد دروس را دریافت کند و سپس برای هر دانشجو نمره و تعداد واحد هر درس وی را دریافت و معدل وی را محاسبه نماید. در پایان شماره دانشجویی، نام و معدل دو دانشجوی برتر کلاس را چاپ کند. • 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 را چاپ کن • توقف کن
6-3 چند الگوریتم نمونه • الگوریتمی بنویسید که برای تعدادی شهر ابتدا نام شهر را دریافت و سپس دمای هوا در 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’ ) • اطلاعات لازم را چاپ کن • توقف کن
6-3 چند الگوریتم نمونه • الگوریتمی بنویسید که یک عدد را دریافت و وارون آن را محاسبه و بهمراه خود عدد چاپ کند. مثلا وارون عدد 3872 برابر 2783 می باشد. • adad را بخوان • اگر ( adad < 0 ) آنگاه a ← -adad در غیر اینصورت a ← adad • varoon ← 0 • تازمانیکه ( a > 0 ) آنگاه دستورات 5 تا 7 را تکرار کن • remain ← a mod 10 • a ← a / 10 • varoon ← varoon × 10 + remain • اگر ( adad < 0 ) آنگاه varoon ← -varoon • adad و varoon را چاپ کن • توقف کن
6-3 چند الگوریتم نمونه • adadرا بخوان • اگر ( adad < 0 ) آنگاه a ← -adad در غیر اینصورت a ← adad • varoon ← 0 • تازمانیکه ( a > 0 ) آنگاه دستورات 5 تا 7 را تکرار کن • remain ← a mod 10 • a ← a / 10 • varoon ← varoon × 10 + remain • اگر ( adad < 0 ) آنگاه varoon ← -varoon • adad و varoon را چاپ کن • توقف کن adad = a = varoon = remain = خروجی = -275 2 27 275 0 ←اجرای الگوریتم 0 -572 57 572 5 2 5 7 -275 -572
6-3 چند الگوریتم نمونه • الگوریتمی بنویسید که یک عدد را دریافت و تعیین کند که آیا اول است یا خیر؟ • adad رابخوان • i ← 2 و primeSw ← 1 • تازمانیکه ( i ≤ root and primeSw=1 ) دستورات 5 تا 6 را تکرار کن • اگر ( adad mod i = 0 ) آنگاه primeSw ← 0 • i ← i + 1 • اگر ( primeSw = 1) آنگاه چاپ کن "عدد اول است“ درغیراینصورت چاپ کن "عدد اول نیست" • توقف کن
6-3 چند الگوریتم نمونه • الگوریتمی بنویسید که یک عدد صحیح مثبت در مبنای 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 را چاپ کن • توقف کن