الگوریتم و فلوچارت

Download Report

Transcript الگوریتم و فلوچارت

‫مبانی کامپیوترو‬
‫برنامه نویس ی‬
‫فصل اول‬
‫ارائه دهنده ‪ :‬مهندس عبداللهی‬
‫اجزاء تشکيل دهنده کامپيوتر عبارتند از ‪:‬‬
‫‪ ‬سخت افزار‬
‫‪ ‬نرم افزار‬
‫‪ ‬سخت افزار‬
‫‪Out put‬‬
‫‪process‬‬
‫خروجي‬
‫پردازش‬
‫‪Input‬‬
‫ورودي‬
‫ً‬
‫كامپيوترهاي امروزي معموال از قطعات زير تشكيل ميشوند‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫دستگاههاي ورودي‬
‫حافظه‌هاي جانبي‬
‫حافظه‌هاي اصلي‬
‫ي‬
‫واحد پردازشگر مركز ‌‬
‫دستگاههاي خروجي‬
‫‪ ‬نرم افزار‬
‫نرم‌افزار يكي از بخش‌هاي اساس ي كامپيوتر به شمار مي‌آيد‪ ،‬كه در‬
‫واقع سخت‌افزار را بكار مي‌گيرد‪.‬‬
‫بعبارت ديگر رابط بين كاربر و سخت‌افزار را نرم‌افزار مي‌نامند‪ .‬نرم‌افزار در‬
‫حقيقت روح و جان يك كامپيوتر است‪ ،‬كه به سخت‌افزار هويت مي‌بخشد‪.‬‬
‫نرم افزار سيستم عامل‬
‫‪ ‬سيستم عامل )‪ (OS: Operating System‬مشهورترين نوع‬
‫نرم‌افزارهاي سيستمي مي‌باشد‪ .‬كه مديريت منابع سيستمي ‌را بر‬
‫عهده دارد‪ .‬سيستم‌عامل‪ ،‬همچنين ارتباط بين كاربر و اجزاء‬
‫سخت‌افزاري و نرم‌افزاري ديگر را برقرار مي‌كند‪.‬‬
‫‪ ‬زبانهاي برنامهنويس ي‬
‫‪ ‬نرمافزارها توسط زبانهاي برنامهنويس ي نوشته ميشوند‪ .‬زبانهاي‬
‫برنامهنويس ي‪ ،‬يك سيستم ارتباطي هستند كه توسط آنها ميتوان‬
‫دستورات الزم را به ماشين انتقال داد‪.‬‬
‫‪ ‬هرزبان برنامهنويس ي به مجموعهأي از عاليم‪ ،‬قواعد و دستورالعملها‬
‫گفته ميشود كه امكان ارتباط با كامپيوتر را جهت بيان كاري يا حل‬
‫مسئلهاي فراهم ميكند‪.‬‬
‫در حالت كلي زبانهاي برنامهنويس ي را به سه دسته زير تقسيمبندي ميكنند‪:‬‬
‫زبانهاي سطح پايين‬
‫زبانهاي سطح باال‬
‫‪ ‬زبانهاي سطح خیلی باال‬
‫‪LOW LEVEL LANGUAGE‬‬
‫‪HIGH LEVEL LANGUAGE‬‬
‫‪VERY HIGH LEVEL LANGUAGE‬‬
‫كامپايلر برنامه نوشته در يك زبان سطح باال را به برنامه مقصد تبديل ميكند‪.‬‬
‫‪Object‬‬
‫‪program‬‬
‫‪Compiler‬‬
‫‪Source‬‬
‫‪program‬‬
‫الگوریتم و فلوچارت‬
‫تعریف الگوریتم‬
‫هر دستورالعملی که مراحل انجام کاری را با‬
‫زبانی دقیق و با جزئیات کافی بیان نماید‬
‫بطوریکه ترتیب مراحل و شرط خاتمه‬
‫عملیات در آن کامال“ مشخص شده باشد را‬
‫الگوریتم گویند‪.‬‬
‫ادامه تعریف الگوریتم‬
‫‪ ‬منظور از زبان دقیق‪ :‬آن است که الگوریتم دقیقا“ به‬
‫همان صورتیکه مورد نظر نویسنده است اجرا گردد‪.‬‬
‫‪ ‬منظور از جزئیات کافی ‪ ،‬آن است که در طول اجرای‬
‫الگوریتم عملیات ناشناخته پیش نیامده و باعث انحراف از‬
‫مسیر و هدف اصلی نگردد‪.‬‬
‫‪ ‬منظور از ترتیب مراحل‪ ،‬آن است که مراحل اجرای‬
‫الگوریتم قدم به قدم و با رعایت تقدم و تأ خر مشخص شده‬
‫باشد‪.‬‬
‫‪ ‬منظور از شرط خاتمه‪ ،‬پایان پذیر بودن الگوریتم می‬
‫باشد و بهر حال الگوریتم باید در زمانی دلخواه و تحت شرایط یا‬
‫شرایط داده شده خاتمه پذیرد‪.‬‬
‫الگوريتم مجموعهاي از دستورالعمل ها‪ ،‬براي حل مسئله ميباشد كه‬
‫شرايط زير را بايد دارا باشد‪:‬‬
‫• دقيق باشد‬
‫• جزئيات كامل حل مسئله را داشته باشد‪.‬‬
‫•پايانپذير باشد‪.‬‬
‫مراحل تهیه الگوریتم‬
‫برای تهیه یک الگوریتم خوب و کارآمد باید مراحل خاص ی اجرا شوند‪:‬‬
‫‪ -1‬تعریف دقیق مسئله‪:‬‬
‫باید مسئله را تجزیه و تحلیل کرده تا کوچکترین‬
‫ابهامی در فهم آن وجود نداشته باشد‪.‬‬
‫‪ -2‬تعیین عوامل اصلی(متغیرهای) مورد نیاز‬
‫‪ -3‬تعیین ورودی و خروجی مسئله ‪( :‬داده ها و‬
‫اطالعات)‬
‫‪ -4‬بررسی راه حل های مختلف مسئله‬
‫‪ -5‬انتخاب یک راه حل مناسب‬
‫‪ -6‬اشکال زدایی‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫تعريف الگوريتم‬
‫الگوریتم ‪ :‬به زبان ساده ميتوان گفت الگوريتم مجموعهاي از دستورالعملهاست كه اگر به ترتيب دنبال شوند‪،‬‬
‫موجب حل مسأله ميگردند‪.‬‬
‫طراحی الگوریتم ‪ :‬منظور از طراحي الگوريتم كشف الگوريتم‪ ،‬ايجاد‪ ،‬تعيين اعتبار‪ ،‬آناليز و ارزيابي الگوريتم‬
‫براي يك مسأله ميباشد‪.‬‬
‫آناليز الگوریتم ‪:‬منظور از آناليز الگوريتم اين است كه پارامترهاي زمان محاسبه و حافظه مورد نياز براي محاسبه‬
‫الگوريتم بدست آيد تا بتوان‪ ،‬الگوريتمهاي مختلف را براي يك مسأله خاص با يكديگر مقايسه كرد ‪.‬‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد‬
‫اکبرپور الگوريتم‬
‫تشريح‬
‫چگونگي‬
‫الگوريتمها را به روشهاي مختلف ميتوان تشريح نمود‪ ،‬كه بر اساس كوچك و يا بزرگ و پيچيده‬
‫بودن الگوريتم ‪ ،‬روشهاي تشريح زير را ميتوان نام برد‪:‬‬
‫‪ -1‬تشريح الگوريتم توسط يك زبان طبيعي (فارس ي يا انگليس ي) براي الگوريتمهاي آسان و كوچك‪.‬‬
‫به عنوان مثال عبارتي مانند "‪ n‬را بگير و در ‪ c‬ضرب كن‪”.‬‬
‫‪ -2‬نمايش گرافيكي الگوريتم توسط فلوچارت (براي الگوريتمهاي آسان و كوچك)‬
‫‪ -3‬نمايش با استفاده از شبه كد (‪ )Pseudo Code‬كه شباهت زيادي به زبانهاي ‪ C‬و پاسكال دارد‪.‬‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫مراحل اوليه حل يك مسأله‬
‫‪ -1‬تعريف و بيان مسأله و فهم كامل آن‬
‫‪ -2‬تشخيص و تدوين يك مدل براي حل مسأله فوق (بررس ي كليه روشهاي حل مسأله)‬
‫‪ -3‬طراحي الگوريتم بر اساس مدل انتخاب شده‬
‫‪ -4‬بررس ي و ارزيابي صحت الگوريتم‬
‫‪ -5‬تحليل الگوريتم و ارزيابي پيچيدگي آن‬
‫‪ -6‬پيادهسازي الگوريتم با استفاده از زبانهاي برنامهسازي‬
‫‪ -7‬تست برنامه‬
‫‪ -8‬مستندسازي‬
‫مثال ‪ :‬الگوريتمي بنويسيد كه دو عدد از ورودي دريافت كرده مجموع‬
‫دو عدد را محاسبه و چاپ نمايد‪.‬‬
‫خروجي‌ها‬
‫مجموع دو عدد‬
‫انجام محاسبات‬
‫جمع دو عدد‬
‫وروديها‬
‫‪a , b‬‬
‫‪0‬ـ شروع‬
‫‪1‬ـ ‪ b ,a‬را بخوان‪.‬‬
‫‪2‬ـ مجموع ‪ b , a‬را محاسبه و در ‪ sum‬قرار بده‪.‬‬
‫‪3‬ـ ‪ sum‬را در خروجي چاپ كن‬
‫‪4‬ـ پايان‬
‫مثال‪ :‬الگوريتمي بنويسيد كه سه عدد از ورودي دريافت كرده مجموع و ميانگين‬
‫سه عدد را محاسبه و چاپ كند‪.‬‬
‫خروجيها‬
‫چاپ مجموع‬
‫چاپ ميانگين‬
‫انجام محاسبات‬
‫محاسبه مجموع‬
‫محاسبه ميانگين‬
‫وروديها‬
‫‪a‬‬
‫‪b‬‬
‫‪c‬‬
‫‪0‬ـ شروع‬
‫‪1‬ـ سه عدد از ورودي بخوان‬
‫‪2‬ـ مجموع سه عدد را محاسبه و در ‪ sum‬قرار بده‪.‬‬
‫‪3‬ـ ‪ sum‬را بر سه تقسيم كرده‪،‬در ‪ ave‬قرار بده‪.‬‬
‫‪4‬ـ ‪ ave , sum‬را در خروجي چاپ كن‪.‬‬
‫‪5‬ـ پايان‪.‬‬
‫فلوچارت‬
‫‪‬بیان تصویری الگوریتم‬
‫‪‬مراحل انجام کار با اشکال هندسی‬
‫نشان داده می شوند‪.‬‬
‫‪‬مراحل انجام کار توسط خطوط به‬
‫هم وصل می گردند‪.‬‬
‫شکل‬
‫مثال‬
‫شرح‬
‫‪start‬‬
‫برای نشان دادن شروع و خاتمه‬
‫عملیات‬
‫‪stop‬‬
‫محاسبات و مقداردهی‬
‫‪c←a+b‬‬
‫‪d← i‬‬
‫ورود اطالعات‬
‫خروج بر روی صفحه نمایش‬
‫‪A,B‬‬
‫خروج اطالعات بر روی کاغذ‬
‫”‪A,B,”100‬‬
‫سئوال‪ ،‬تصمیم گیری و شرط‬
‫های دلخواه‬
‫ورودی‬
‫خروجی‬
‫?‬
‫خروجی‬
‫خروجی‬
‫معموال درك يك الگوريتم با شكل راحتر از نوشتن آن بصورت متن‬
‫ميباشد‪ .‬لذا الگوريتم را با فلوچارت( ‪)flowchart‬نمايش ميدهند‪.‬‬
‫فلوچارت از شكلهاي زير تشكيل ميشود‪.‬‬
‫‪‬عالمتهاي شروع و پايان‪ :‬كه معموال از يك بيض ي استفاده ميكنند‪:‬‬
‫‪End‬‬
‫‪Begi‬‬
‫‪n‬‬
‫‪‬عالمتهاي ورودي و خروجي‪ :‬كه معموال از متوازي‌االضالع استفاده ميشود‪:‬‬
‫چاپ کردن‬
‫‪write‬‬
‫خواندن یا‬
‫‪Read‬‬
‫‪‬عالمتهاي محاسباتي و جايگزيني‪ :‬براي نمايش دستورات جايگزيني‬
‫و محاسباتي از مستطيل استفاده مي‌كنند‪:‬‬
‫جایگزین یا محاسبات‬
‫•عالمت شرط‪ :‬براي نمايش شرط از لوزي استفاده ميشود‪.‬‬
‫•عالمت اتصال‪ :‬براي اتصال شكلهاي مختلف بهم از فلشهاي‬
‫جهتدار استفاده ميكنند‪.‬‬
‫مثال‪: 1‬‬
‫فلوچارتی رسم کنید که دو عدد را خوانده و حاصلضرب آنها را نمایش دهد‪.‬‬
‫شروع‬
‫‪A,B‬‬
‫‪z←A*B‬‬
‫‪z‬‬
‫پایان‬
‫مثال‪:2‬‬
‫فلوچارتی رسم کنید که شعاع یک دایره را خوانده‪ ،‬مساحت و محیط آنرا نمایش‬
‫دهد‪.‬‬
‫شروع‬
‫‪R‬‬
‫‪A←3.14*R²‬‬
‫‪P←2*R*3.14‬‬
‫‪A,P‬‬
‫پایان‬
‫• فلوچارت مجموع سه عدد‬
Begin
Read(a,b,c)
Sum
a+b+c
Ave
sum/3
Write(sum,ave)
End
‫مثال‪ :‬فلوچارتی رسم نمائيد كه دو عدد از ورودي دريافت كرده سپس‬
‫محتويات دو عدد را با هم جابجا نمايد‪.‬‬
‫براي حل اين مسئله ‪ b , a‬را دو متغير كه در آنها دو عدد خوانده شده‪،‬‬
‫قرار ميگيرند در نظر ميگيريم‪ .‬سپس با استفاده از يك متغير كمكي‬
‫محتويات اين دو عدد را جابجا ميكنيم ‪:‬‬
temp
a
12
b
a
b
15
12
15
temp
12
temp
a
b
a
b
15
15
15
12
12
12
temp
temp
:‫فلوچارت مسئله باال بصورت زير خواهد بود‬
Begin
Read(a,b)
temp
a
a
b
b
temp
Write(a,b)
End
‫‪ ‬دستورالعملهاي شرطي‬
‫ً‬
‫در حل بسياري از مسائل يا تقريبا تمام مسائل نياز به استفاده از شروط‬
‫جزء‪ ،‬نيازهاي اساس ي محسوب ميشود‪ .‬همانطور كه ما خودمان در‬
‫زندگي روزمره با اين شرطها سركار داريم‪ .‬بطور مثال اگر هوا ابري‬
‫باشد ممكن است چنين سخن بگوييم‪:‬‬
‫•‬
‫اگر هوا باراني باشد سپس چتري برميدارم‪.‬‬
‫در غير اينصورت چتر برنميدارم‪.‬‬
‫در حالت كلي شرط را بصورت زير نمايش ميدهند‪:‬‬
‫‪ yes‬عمل‬
‫‪then‬‬
‫شرط ‪If‬‬
‫‪NO‬‬
‫عمل بعدي‬
‫الگوریتم های حلقوی‬
‫‪‬‬
‫تعریف اول‪ :‬مراحلی از الگوریتم که چندین بار اجرای آنها‬
‫تکرار می گردد تشکیل یک حلقه )‪ (LOOP‬را می دهند‪.‬‬
‫‪‬‬
‫برای ساختن یک حلقه از یک متغیر کمکی استفاده می گردد‪،‬‬
‫این متغیر را قبل از شروع حلقه با یک مقدار اولیه آماده می‬
‫سازیم و سپس معموال“ در انتهای حلقه و قبل از بازگشت به‬
‫ابتدای حلقه مقداری را به آن اضافه کرده و تحت یک شرائط خاص‬
‫به مراحل قبل پرش می نماییم‪.‬‬
‫تعریف دوم‪ :‬مقداری که قبل از شروع حلقه به متغیر‬
‫حلقه داده می شود را مقدار اولیه یا شرط اولیه گویند‪.‬‬
‫تعریف سوم‪ :‬مقداری که پس از یکبار اجرای مراحل‬
‫حلقه به متغیر حلقه اضافه می شود را مقدار اضافه‬
‫شونده می نامند‪.‬‬
‫مثال ‪ :‬فلوچارتی رسم کنید که یک عدد بزرگتر از صفر را خوانده سپس‬
‫به تعداد آن عدد‪ ,‬اعداد دیگری را خوانده مجموع و میانگین آنها را نمایش‬
‫دهد‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪ N‬عدد خوانده شده‬
‫‪C‬شمارنده‬
‫‪S‬مجموع‬
‫‪A‬اعداد‬
‫شروع‬
‫‪N‬‬
‫‪C←0‬‬
‫‪S←0‬‬
‫‪Y‬‬
‫‪S, S / N‬‬
‫‪C=N‬‬
‫‪N‬‬
‫پایان‬
‫‪SSA‬‬
‫‪C  C 1‬‬
‫‪A‬‬
‫مثال ‪ :‬الگوریتم برنامه ای را بنویسید که ‪ 10‬عدد را گرفته و تعیین کند‬
‫کدام زوج و کدام فرد است‪.‬‬
‫شروع‬
‫‪C←0‬‬
‫‪p‬‬
‫‪k ← p-INT(p/2)*2‬‬
‫‪K=0‬‬
‫‪n‬‬
‫”‪P, “odd‬‬
‫‪C ← C+1‬‬
‫‪y‬‬
‫‪C< 10‬‬
‫‪n‬‬
‫پایان‬
‫‪y‬‬
‫”‪P, “even‬‬
‫مثال ‪:‬‬
‫الگوریتم برنامه ای را بنویسید که یک عدد مثبت را خوانده فاکتوریل‬
‫آن را نمایش دهد‪.‬‬
‫‪ ‬فاکتوریل یک عدد یعنی حاصل ضرب اعداد ‪ 1‬تا آن‬
‫عدد‬
‫‪ ‬فاکتوریل عدد صفر برابر یک می باشد‪.‬‬
‫ادامه مثال‬
‫شمارنده‬A
‫شروع‬
N
FACT ← 1
A ←1
Y
A>N
N
FACT ← FACT * A
A ← A+ 1
FACT
‫پایان‬

‫مثــال ‪ :‬فلوچااارتي رساام نماكيااد كااه عااددي را از ورودي دريافاات كاارده‪ ،‬فاارد يااا زوج‬
‫بودن آن را تشخيص دهد‪.‬‬
‫‪Begin‬‬
‫)‪Read(a‬‬
‫‪R‬‬
‫‪a mod 2‬‬
‫‪yes‬‬
‫)’‪Write(‘even‬‬
‫‪if R=0 then‬‬
‫‪No‬‬
‫)’‪Write(‘odd‬‬
‫‪End‬‬
‫مثال ‪ :‬فلوچارتي رسم كنيد كه دو عدد از ورودي دريافت كرده بزرگترين عدد‬
‫را پيدا كرده در خروجي چاپ نمايد‪.‬‬
‫‪Begi‬‬
‫‪n‬‬
‫)‪Read(a,b‬‬
‫‪a‬‬
‫‪b‬‬
‫‪max‬‬
‫‪yes‬‬
‫‪max‬‬
‫‪if b>max‬‬
‫‪No‬‬
‫)‪Write(max‬‬
‫‪End‬‬
‫‪ ‬حلقهها‬
‫در حل بسياري از مسائل با عملياتي روبرو ميشويم ‪ ،‬كه نياز به تكرار‬
‫دارند و عمل تكرار آنها به تعداد مشخص ي انجام ميگيرد‪ .‬فرض كنيد‪،‬‬
‫بخواهيم ميانگين ‪ 100‬عدد را محاسبه كنيم‪ ،‬در اينصورت منطقي بنظر‬
‫نميرسد كه ‪ 100‬متغير مختلف را از ورودي دريافت كنيم سپس آنها را‬
‫جمع كنيم‪.‬‬
‫حلقهها ی تکرار‪ (:‬شکل کلی)‬
‫‪No‬‬
‫شرط يا شروط ‪If‬‬
‫‪yes‬‬
‫محموعه دستورالعملها و‬
‫جاگزينها‬
‫• انواع حلقه ها‬
‫• حلقه های با تکرار مشخص‬
‫• حلقه های با تکرار نا مشخص‬
‫• حلقه های با تکرار مشخص‬
‫در اين نوع حلقهها تعداد تكرار مشخص ميباشد اين حلقه از اجزاء زير‬
‫تشكيل ميشود‪:‬‬
‫‪1‬ـ انديس حلقه‬
‫‪2‬ـ مقدار اوليه براي انديس حلقه‬
‫‪ -3‬مقدار افزاينده براي انديس حلقه (معموال يك واحد در هر مرحله)‬
‫‪4‬ـ مقدار نهايي (تعداد تكرا حلقه)‬
‫‪5‬ـ شرطي براي كنترل تعداد تكرار حلقه‬
‫ً‬
‫اين حلقهها را غالبا با فلوچارت بصورت زير نمايش ميدهند‪:‬‬
‫‪1‬‬
‫اتمام كار حلقه‬
‫‪No‬‬
‫‪i‬‬
‫‪if i<=n‬‬
‫‪yes‬‬
‫مجموعه دستورات حلقه‬
‫‪i+1‬‬
‫‪i‬‬
‫مثال ‪ :‬فلوچارتي رسم نمائيد كه عدد ‪ n‬را از ورودي دريافت كرده‪،‬‬
‫مجموع اعداد از يك تا ‪ n‬را محاسبه كند‪.‬‬
‫‪n‬‬
‫مقدار نهايي‬
‫‪i‬‬
‫انديس حلقه‬
Begi
n
Read(n)
I
sum
1
0
if I<=n
‫حلقه‬
No
Write(sum)
yes
End
sum
I
sum+I
I+1
‫نمونه اجراي فلوچارت باال بصورت زير است‪:‬‬
‫خروجي‬
‫‪15‬‬
‫‪sum‬‬
‫‪I‬‬
‫‪0‬‬
‫‪1‬‬
‫‪1‬‬
‫‪3‬‬
‫‪6‬‬
‫‪10‬‬
‫‪15‬‬
‫‪N‬‬
‫‪5‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫مثال ‪ :‬فلوچارتي رسم كنيد كه ‪ n‬عدد از ورودي دريافت كرده‪،‬‬
‫بزرگترين مقدار از بين ‪ n‬عدد را پيدا كرده در خروجي چاپ نمايد‪.‬‬
‫انديس حلقه‬
‫‪i‬‬
‫مقدار نهايي‬
‫بزرگترين مقدار‬
‫‪n‬‬
‫‪Max‬‬
Begin
Read(n)
I
max
2
a
No
if i<=n then
write(max)
yes
End
‫حلقه‬
Read(a)
yes
if a > max
No
i
i+1
max
a
‫‪ ‬حلقههاي تودرتو‬
‫الگوريتمهايي كه تا حال بكار برديم‪ ،‬فقط شامل يك حلقه بودند‪.‬‬
‫در صورتي كه در بسياري از مسائل ممكن است نياز به استفاده از‬
‫چندحلقه در داخل هم باشيم‪.‬‬
‫در اين نوع حلقهها بايد دقت بيشتري به خرج دهيم‪ ،‬تا مشكلي پيش‬
‫در‬
‫نيايد‪ .‬اگر از حلقههاي نوع اول بصورت تودرتو استفاده كنيم ‌‬
‫اينصورت براي هر حلقه شرط نهايي و انديس اوليه‬
‫جداگانه بايد تعريف كنيم ‪.‬‬
‫در حلقههاي تودرتو به ازاي يكبار تكرار حلقه اوليه‪ ،‬حلقه داخلي به اندازه‬
‫مقدار نهايي خود تكرار ميشود‪ .‬در كل اگر حلقه اوليه ‪ n‬بار تكرار شود و‬
‫حلقه داخلي ‪ m‬بار‪ ،‬در اينصورت كل حلقه ‪:‬‬
‫‪n m‬‬
‫بار تكرار خواهد شد‪.‬‬
‫فلوچارت حلقههاي تودرتو را ميتوان بصورت زير نشان داد‪:‬‬
‫‪1‬‬
‫اتمام كار حلقه هاي تو در تو‬
‫‪i‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪No‬‬
‫‪A‬‬
‫‪if i<=n then‬‬
‫‪yes‬‬
‫‪1‬‬
‫مجموعه دستورات و جايگزيني‬
‫ها‬
‫‪i‬‬
‫‪i+1‬‬
‫‪A‬‬
‫‪No‬‬
‫‪j‬‬
‫‪if j<=m then‬‬
‫‪yes‬‬
‫مجموعه دستورات و جايگزيني‬
‫ها‬
‫‪j+1‬‬
‫‪j‬‬
‫حلقه‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬رو‬
‫اکبرپورحل مسأله‬
‫مهندسشمحمدهاي‬
‫هدف اين درس مطالعه تكنيكهاي مختلفي است كه بهينه بودن آنها تا كنون به اثبات‬
‫رسيده است و ميتوان از آنها براي حل مساكل مختلف استفاده نمود‪.‬‬
‫با مسلط شدن بر اين استراتژيهاي طراحي ميتوان به راحتي يكي از‬
‫الگوريتمها و روشهاي معروف و جديد را براي مسأله خود كشف نمود‪.‬‬
‫از جمله تكنيكهاي حل مساكل ميتوان به موارد زير اشاره كرد كه در هفتههاي بعدي به طور كامل‬
‫تشريح خواهند شد‪:‬‬
‫‪ .1‬روش تقسيم و حل (‪)Divide & Conquer‬‬
‫‪ .2‬روش حريصانه (‪)Greedy‬‬
‫‪ .3‬روش برنامهنويس ي پويا (‪)Dynamic Programming‬‬
‫‪ .4‬روش بازگشت به عقب (‪)Back Tracking‬‬
‫‪ .5‬روش شاخه و حد (‪)Branch & Bound‬‬
‫☺‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫چگونه ميتوان در الگوريتم‪ ،‬حلقهي بينهايت را نمايش داد؟‬
‫روش اول‬
‫‪repeat‬‬
‫{‬
‫‪......‬‬
‫‪......‬‬
‫‪......‬‬
‫}‬
‫)‪until (false‬‬
‫روش دوم‬
‫)‪while (1‬‬
‫{‬
‫‪......‬‬
‫‪......‬‬
‫‪......‬‬
‫}‬
‫روش سوم‬
‫) ; ; ( ‪for‬‬
‫{‬
‫‪......‬‬
‫‪......‬‬
‫‪......‬‬
‫}‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫‪week1‬‬
‫‪ selection‬برای مسئله مرتب سازی‌‬
‫الگوریتم ‪sort‬‬
‫این بخش برای پیدا کردن عنصر‬
‫مینیمم لیست نامرتب می باشد‪.‬‬
‫)‪Alg selection-sort (a , n‬‬
‫{‬
‫‪for i = 1 to n do‬‬
‫{‬
‫; ‪min = i‬‬
‫‪for k = i + 1 to n do‬‬
‫; ‪if (a[k] < a[min]) then min = k‬‬
‫;) ] ‪swap ( a [ i ] , a [ min‬‬
‫}‬
‫}‬
‫در هر مرحله که الگوریتم اجرا می شود عنصر مینیمم لیست مرتب نشده مشخص شده‬
‫و به ابتدای لیست منتقل می شود ‪.‬‬
‫بنابراین پس از ‪ n‬جابجایی عنصر مینیمم لیست مرتب خواهد شد‪.‬‬
‫ليست زير را به روش‪week1‬‬
‫انتخابي مرتب كنيد‪.‬‬
‫‪67 – 33 – 21 – 84 – 49 – 50 – 75‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫حل‪:‬‬
‫ابتدا ليست مورد نظر را داخل يك آرايه قرار ميدهيم‪.‬‬
‫سپس عنصر اول آرايه را با بقيه عناصر بعد از آن مقايسه كرده و‬
‫كوچكترين عنصر را يافته و جاي آن را با عنصر اولي عوض ميكنيم‪.‬‬
‫پس ليست مورد نظر به صورت زير تغيير ميكند‪:‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪75‬‬
‫‪50‬‬
‫‪49‬‬
‫‪84‬‬
‫‪67‬‬
‫‪33‬‬
‫‪21‬‬
‫‪75‬‬
‫‪50‬‬
‫‪49‬‬
‫‪84‬‬
‫‪21‬‬
‫‪33‬‬
‫‪67‬‬
‫)‪(b‬‬
‫)‪(a‬‬
‫اکبرپور‬
‫با محمد‬
‫مهندس‬
‫الگوریتم ‪-‬‬
‫جاي طراحی‬
‫‪week1‬‬
‫كمترين عنصر در آرايه عوض ميكنيم‬
‫جاي‬
‫دوم را‬
‫عنصر‬
‫در مرحله دوم‬
‫كه در اينجا هر دو مورد ‪ 33‬است (يعني جاي ‪ 33‬با خودش عوض ميشود‪:).‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪75‬‬
‫‪50‬‬
‫‪49‬‬
‫‪84‬‬
‫‪67‬‬
‫‪33‬‬
‫‪21‬‬
‫)‪(c‬‬
‫در اين مرحله دو عنصر ‪ 21‬و ‪ 33‬در جاي خود ‪ fix‬شدهاند و از ليست نامرتب خارج شدهاند‪.‬‬
‫و همين طور پيش ميرويم تا آرايه مرتب شود‪:‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪75‬‬
‫‪50‬‬
‫‪67‬‬
‫‪84‬‬
‫‪49‬‬
‫‪33‬‬
‫‪21‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪75‬‬
‫‪84‬‬
‫‪67‬‬
‫‪50‬‬
‫‪49‬‬
‫‪33‬‬
‫‪21‬‬
‫)‪(d‬‬
‫)‪(e‬‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪75‬‬
‫‪84‬‬
‫‪67‬‬
‫‪50‬‬
‫‪49‬‬
‫‪33‬‬
‫‪21‬‬
‫)‪(f‬‬
‫در اين مرجله فقط دو عنصر ‪ 75‬و ‪ 84‬در ليست نامرتب باقي ماندهاند‪ .‬آنها را نيز مرتب مي كنيم‪:‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪84‬‬
‫‪75‬‬
‫‪67‬‬
‫‪50‬‬
‫‪49‬‬
‫‪33‬‬
‫‪21‬‬
‫)‪(g‬‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫در پايان پس از تعداد ‪ n‬جابجايي‪ ،‬ليست مرتب شده به روش انتخابي به صورت زير خواهد بود‪:‬‬
‫‪7‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪84‬‬
‫‪75‬‬
‫‪67‬‬
‫‪50‬‬
‫‪49‬‬
‫‪33‬‬
‫‪21‬‬
‫)‪(h‬‬
‫‪‬تعداد دقيق مقايسهها و همچنين تعداد دقيق تعويضها را براي مثال فوق بدست آوريد‪.‬‬
‫‪‬آيا ميتوان در اين الگوريتم ‪ ،‬تعداد مقايسهها و تعداد تعويضها را كاهش داد؟‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫پيچيدگيهاي زمان و فضا‬
‫‪ -1‬پيچيدگي فضا (‪:)Space Complexity‬‬
‫ميزان حافظه مورد نياز از اجرا تا تكميل الگوريتم ميباشد‪.‬‬
‫‪ -2‬پيچيدگي زمان (‪:)Time Complexity‬‬
‫ميزان زمان مورد نياز از اجرا تا تكميل الگوريتم ميباشد‪.‬‬
‫پيچيدگي فضاي مورد نياز الگوريتم ()‪: )S(n‬‬
‫به حاصل جمع فضاي مورد نياز متغيرها‪ ،‬آرايه ها ‪ ،‬پشته ها و كليه ساختمان دادههاي مورد نياز و‬
‫همچنين فضاي ذخيره كد برنامه در حافظه ‪ ،‬پيچيدگي فضاي الگوريتم گفته ميشود ‪ ،‬و‬
‫بايد بر حسب ‪( n‬تعداد وروديها) سنجيده شود‪.‬‬
‫اگر پيچيدگي فضاي يك الگوريتم به ‪ n‬وابسته نباشد‪ ،‬پيچيدگي آن را ثابت فرض كرده و از مرتبه‬
‫)‪ O(1‬ميدانيم‪.‬‬
‫به عنوان مثال پيچيدگي فضاي تكه كد زير )‪ O(1‬ميباشد‪:‬‬
‫; ‪for ( i = 1 ; i < = 20 ; i + + ) a + +‬‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫پیچیدگي زمان اجراي الگوریتم ()‪)T(n‬‬
‫اين زمان براي برنامهاي مانند ‪ P‬عبارت است از حاصل جمع زمان كامپايل و زمان اجراي برنامه‪ ،‬كه‬
‫ما زمان كامپايل را ثابت فرض كرده و بيشتر روي زمان اجراي برنامه تأكيد داريم و آن را )‪T(n‬‬
‫نمايش ميدهيم‪:‬‬
‫= ‪TP‬زمان كامپايل ‪ +‬زمان بار شدن حافظ ‪ +‬زمان انتظار زمانبندي سيستمعامل ‪ +‬زمان اجرا‬
‫= )‪T(n‬زمان اجراي الگوريتم= تعداد دستورات‪ × CPU‬زمان اجراي يك دستور توسط‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫پيچيدگي الگوريتمهاي غيربازگشتي‬
‫غير بازگشتي به توابعي ميگويند كه در آن‪ ،‬تابع خودش را فراخواني نكرده باشد‬
‫و فقط شامل حلقهها (‪ )while ، for, repeat-until‬و دستورات غير بازگشتي باشد‪.‬‬
‫براي محاسبه پيچيدگي الگوريتمهاي غيربازگشتي كافي است‪ ،‬تعداد تكرار دستورات‬
‫داخليترين حلقه مشخص شود‪.‬‬
‫نکته ‪ :‬اگر در الگوريتمهاي غيربازگشتي تعداد تكرار دستورات حلقه تكرار به ‪ n‬بستگي نداشته باشد‪،‬‬
‫)‪( T(n‬پيچيدگي زمان) مقداري ثابت خواهد بود و به صورت زير نمايش ميدهيم‪:‬‬
‫)‪O(1‬‬
‫)‪T(n‬‬
‫‪‬‬
‫‪week1‬‬
‫طراحی الگوریتم ‪ -‬مهندس محمد اکبرپور‬
‫پيچيدگي تكه كد زير را بدست آوريد‪:‬‬
‫)‪for (i = 1 ; i <= n ; i ++‬‬
‫)‪for (j = i; j <= min ( i , k ) ; j ++‬‬
‫;‪a++‬‬
‫‪)1‬‬
‫‪)3‬‬
‫‪)4‬‬