560 likes | 981 Views
_. دانشگاه كردستان دانشكدة فني و مهندسي گروه كامپيوتر. مباني كامپيوتر و برنامه سازي Basics of Computer and Programming. Session 3 Algorithms آشنايي با الگوريتم. Algorithm الگوريتم ها. هدفهاي كلي. شناخت حل مسئله و ارائه الگوريتم. شناخت اجزاء لازم براي حل مسئله. بررسي صحت الگوريتم.
E N D
_ • دانشگاه كردستان • دانشكدة فني و مهندسي • گروه كامپيوتر • مباني كامپيوتر و برنامه سازي • Basics of Computer and Programming • Session 3 • Algorithms • آشنايي با الگوريتم BY: GhasemMohammadi
Algorithm الگوريتم ها هدفهاي كلي شناخت حل مسئله و ارائه الگوريتم شناخت اجزاء لازم براي حل مسئله بررسي صحت الگوريتم
هدفهاي رفتاري دانشجو پس از مطالعه اين فصل بايد بتواند: • الگوريتمي را براي حل مسئله ارائه دهد. • الگوريتم هاي مختلف براي يک مسئله را مقايسه کند. • شرط ها و حلقه ها را در الگوريتم بکار ببرد .
مقدمه در زندگي روزمره، انسان با مسائل مختلفي روبروست و براي هر كداماز اين مسائل (حل مشكلات) راه حلي و روشي را بر ميگزيند. مسائلي از قبيل راه رفتن، غذا خوردن، خوابيدن و غيره كه بشر تقريباً هر روز آنها را پيش روي خود دارد. • همه اين مسائل نياز به روشي براي حل كردن دارند مثلا راه رفتن بايد با ترتيب خاصي و مراحل معيني انجام شود. تا مسئله راه رفتن براي بشر حل شود. اصطلاحاً روش انجام كار يا حل مسئله را الگوريتم آن مسئله مينامند.
تعريف الگوريتم هر دستورالعملی که مراحل انجام کاری را با زبانی دقیق و با جزئیات کافی بیان نماید بطوریکه ترتیب مراحل و شرط خاتمه عملیات در آن کاملا“ مشخص شده باشد را الگوریتم گویند. به عبارتي ديگر: الگوريتم مجموعهاي از دستورالعمل ها، براي حل مسئله ميباشد كه شرايط زير را بايد دارا باشد: • دقيق باشد • جزئيات كامل حل مسئله را داشته باشد. • پايانپذير باشد.
مراحل الگوريتم براي حل يك مسئله بايد الگوريتم آن مسئله را مشخص كنيم (يا بيابيم). كه اصطلاحاً طراحي الگوريتم براي آن مسئله ناميده ميشود. در طراحي الگوريتم معمولاً سه مرحله زير را از هم جدا ميكنند: • خواندن دادهها • انجام محاسبات • خروجيها
مثال : الگوريتمي بنويسيد كه دو عدد از ورودي دريافت كرده مجموع دو عدد را محاسبه و چاپ نمايد. خروجيها انجام محاسباتوروديها مجموع دو عدد جمع دو عدد 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ـ پايان.
معمولا درك يك الگوريتم با شكل راحتر از نوشتن آن بصورت متن ميباشد. لذا الگوريتم را با فلوچارت( flowchart )نمايش ميدهند. فلوچارت از شكلهاي زير تشكيل ميشود. • علامتهاي شروع و پايان: كه معمولا از يك بيضي استفاده ميكنند: Begin End • علامتهاي ورودي و خروجي: كه معمولا از متوازيالاضلاع استفاده ميشود: خواندن يا Read چاپ کردن write
علامتهاي محاسباتي و جايگزيني: براي نمايش دستورات جايگزيني و محاسباتي از مستطيل استفاده ميكنند: جايگزين يا محاسبات • علامت شرط: براي نمايش شرط از لوزي استفاده ميشود. • علامت اتصال: براي اتصال شكلهاي مختلف بهم از فلشهاي جهتدار استفاده ميكنند. شرط
Begin cin<<a<<b<<c; Sum a+b+c Ave sum/3 cout>>sum>>ave; End فلوچارت مجموع سه عدد
مثال: فلوچارتي رسم نمائيد كه دو عدد از ورودي دريافت كرده سپس محتويات دو عدد را با هم جابجا نمايد. براي حل اين مسئله b , a را دو متغير كه در آنها دو عدد خوانده شده، قرار ميگيرند در نظر ميگيريم. سپس با استفاده از يك متغير كمكي محتويات اين دو عدد را جابجا ميكنيم :
temp a b a b 12 15 12 15 temp 12 temp a b b a 15 12 15 15 12 12 temp temp
Begin Read(a,b) temp a a b b temp Write(a,b) End فلوچارت مسئله بالا بصورت زير خواهد بود:
تمرين 1ـ فلوچارتي رسم نمائيد كه طول و عرض مستطيل را از ورودي دريافت كرده محيط و مساحت آنرا محاسبه و چاپ كند. 2ـ فلوچارتي رسم نمائيد كه شعاع دايرهاي را از ورودي دريافت كرده، محيط و مساحت آنرا محاسبه و چاپ نمايد. 3ـ فلوچارتي رسم كنيد كه سه عدد Third , second, first را از ورودي دريافت كرده، محتويات آنها را جابجا نموده، حاصل را در خروجي چاپ كند.
4ـ فلوچارتي رسم نمائيد كه دو عدد از ورودي دريافت كرده، سپس محتويات دو عدد را بدون استفاده از متغير كمكي جابجا كند. 5ـ فلوچارتي رسم نمائيد كه عددي (درجه حرارت برحسب سانتيگراد) را از ورودي دريافت كرده سپس آنرا به درجه فارنهايت تبديل كند.
دستورالعملهاي شرطي در حل بسياري از مسائل يا تقريباً تمام مسائل نياز به استفاده از شروط جزء، نيازهاي اساسي محسوب ميشود. همانطور كه ما خودمان در زندگي روزمره با اين شرطها سركار داريم. بطور مثال اگر هوا ابري باشد ممكن است چنين سخن بگوييم: اگر هوا باراني باشد سپس چتري برميدارم. در غير اينصورت چتر برنميدارم.
If شرط يا شروط then در حالت كلي شرط را بصورت زير نمايش ميدهند: عمل يا اعمال yes NO عمل يا اعمال بعدي
مثال : فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده، فرد يا زوج بودن آن را تشخيص دهد. Begin Read(a) R a mod 2 yes if R=0 then Write(‘even’) No Write(‘odd’) End
مثال : فلوچارتي رسم كنيد كه دو عدد از ورودي دريافت كرده بزرگترين عددرا پيدا كرده در خروجي چاپ نمايد. Begin Read(a,b) max a if b>max max b yes No Write(max) End
مثال : فلوچارتي رسم نمائيد كه سه عدد از ورودي دريافت كرده، كوچكترين عدد را يافته در خروجي چاپ نمايد: Begin Read(a,b,c) min a if b<min then min b yes No if c<min then yes min c No Write(min) End
نمونه اجراي فلوچارت بالا بصورت زير ميباشد:
تمرين 1- فلوچارتي رسم كنيد که عددي را از ورودي دريافت كرده، قدر مطلق عدد را در خروجي چاپ كند. 2- فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده مثبت، منفي يا صفر بودن عدد را تشخيص داده، در خروجي با پيغام مناسب چاپ كند. 3- فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده، بخشپذيري آن بر 3 و 5 را بررسي نمايد. 4ـ فلوچارتي رسم نمائيد كه ضرايب يك معادله درجه دوم را از ورودي دريافت كرده، ريشههاي آن را محاسبه در خروجي چاپ كند.
حلقهها در حل بسياري از مسائل با عملياتي روبرو ميشويم ، كه نياز به تكرار دارند و عمل تكرار آنها به تعداد مشخصي انجام ميگيرد. فرض كنيد، بخواهيم ميانگين 100 عدد را محاسبه كنيم، در اينصورت منطقي بنظر نميرسد كه 100 متغير مختلف را از ورودي دريافت كنيم سپس آنها را جمع كنيم.
انواع حلقه ها حلقه هاي با تکرار مشخص حلقه هاي با تکرار نا مشخص
حلقه هاي با تکرار مشخص در اين نوع حلقهها تعداد تكرار مشخص ميباشد اين حلقه از اجزاء زير تشكيل ميشود: 1ـ انديس حلقه 2ـ مقدار اوليه براي انديس حلقه 3- مقدار افزاينده براي انديس حلقه (معمولا يك واحد در هر مرحله) 4ـ مقدار نهايي (تعداد تكرا حلقه) 5ـ شرطي براي كنترل تعداد تكرار حلقه
i 1 No if i<=n اتمام كار حلقه yes مجموعه دستورات حلقه i i+1 اين حلقهها را غالباً با فلوچارت بصورت زير نمايش ميدهند:
مثال : فلوچارتي رسم نمائيد كه عدد n را از ورودي دريافت كرده، مجموع اعداد از يك تا n را محاسبه كند. n مقدار نهايي i انديس حلقه
Begin Read(n) I 1 sum 0 if I<=n No Write(sum) yes حلقه End sum sum+I I I+1
نمونه اجراي فلوچارت بالا بصورت زير است:
مثال : فلوچارتي رسم كنيد كه n عدد از ورودي دريافت كرده، بزرگترين مقدار از بين n عدد را پيدا كرده در خروجي چاپ نمايد. انديس حلقه i مقدار نهاييn بزرگترين مقدارMax
Begin Read(n) I 2 max a No if i<=n then write(max) yes End Read(a) حلقه yes if a > max max a No i i+1
مثال : فلوچارتي رسم نمائيد كه n , x ، دو عدد صحيح مثبت را از ورودي دريافت كرده سپس x به توان n را محاسبه كند. انديس حلقه i مقدار نهايي n عدد به توان npow
Begin Read(n,x) i 1 pow 1 if i<=n then No write(pow) yes End pow pow*x حلقه i i+1
حلقههايي كه تعداد تكرار آنها مشخص نيست (در C++ به حلقه while مشهورند.) در اين حلقهها با توجه به ورودي، تعداد تكرار مشخص ميشود. و دقيقاً نميتوان تعداد تكرار حلقه را بدون ورودي معين كرد. اين حلقه ها فقط شامل شرطي هستند كه تا زمانيكه برقرار باشد حلقه اجرا ميشود.
If شرط يا شروط محموعه دستورالعملها و جاگزينها در حالت كلي اين نوع حلقهها بصورت زير نمايش داده ميشوند: No yes
مثال: فلوچارتي رسم كنيد كه عددي را از ورودي دريافت كرده سپس تعداد ارقام آن را شمرده در خروجي چاپ نمايد. • عدد خوانده شده N • تعداد ارقام count
Begin count 0 Read(N) if N>0 then No write(count) yes End N N div 10 حلقه count count+1
مثال : فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده، سري فيبوناچي قبل از آنرا توليد نمايد. در حالت كلي جملات سري بصورت: fk=fk-1+fk-2 عدد خوانده شده N جمله اول سري f1 جمله دوم سري f2 جمله سوم سري f3
Begin F1 0 f2 1 Read(N) f3 f1+f2 if f3>N then End No yes write(f3) حلقه f1 f2 f2 f3 f3 f1+f2
تمرين 1- فلوچارتي رسم نمائيد كه عددي از ورودي دريافت كرده، كامل بودن آنرا بررسي نمايد. (عدد كامل، عددي است كه مجموع مقسومعليههاي آن با خودش برابر باشد.) 2- فلوچارتي رسم كنيد كه N را از ورودي دريافت كرده، N جمله سري فيبوناچي را توليد نمايد. 3ـ فلوچارتي رسم نمائيد كه دو عدد N , M را از ورودي خوانده، بزرگترين مقسومعليه مشترك دو عدد را محاسبه و چاپ كند.
حلقههاي تودرتو الگوريتمهايي كه تا حال بكار برديم، فقط شامل يك حلقه بودند.در صورتي كه در بسياري از مسائل ممكن است نياز به استفاده از چند حلقه در داخل هم باشيم. در اين نوع حلقهها بايد دقت بيشتري به خرج دهيم، تا مشكلي پيش نيايد. اگر از حلقههاي نوع اول بصورت تودرتو استفاده كنيم در اينصورت براي هر حلقه شرط نهايي و انديس اوليه جداگانه بايد تعريف كنيم .
در حلقههاي تودرتو به ازاي يكبار تكرار حلقه اوليه، حلقه داخلي به اندازه مقدار نهايي خود تكرار ميشود. در كل اگر حلقه اوليه n بار تكرار شود و حلقه داخلي m بار، در اينصورت كل حلقه : بار تكرار خواهد شد.
i 1 . . . A if i<=n then اتمام كار حلقه هاي تو در تو No yes j 1 if j<=m then No مجموعه دستورات و جايگزيني ها yes حلقه مجموعه دستورات و جايگزيني ها i i+1 A j j+1 فلوچارت حلقههاي تودرتو را ميتوان بصورت زير نشان داد:
مثال : فلوچارتي رسم نمائيد كه N را از ورودي دريافت كرده، مجموع سري زير را محاسبه نمايد: انديس حلقه اول I ورودي N محاسبه فاكتوريلfact انديس حلقه داخلي j مجموع Sum
i 2 sum 1 Read(N) A if i<=N No Write(sum) End yes fact 1 j 2 sum sum+i/fact if j<=i No yes i i+1 fact fact*j A j j+1
تمرينات آخر فصل 1- فلوچارتي رسم نمائيد كه N عدد از ورودي دريافت كرده تعداد اعداد اول و كامل را شمرده در خروجي چاپ نمايد. 2- فلوچارتي رسم نمائيد كه N , X را از ورودي خوانده مقدار سري زير را محاسبه كند:
3- فلوچارتي رسم نمائيد كه عددي را از ورودي دريافت كرده مقلوب عدد را محاسبه و در خروجي چاپ كند. 4ـ فلوچارتي رسم كنيد كه تاريخ تولد شخصي را از ورودي خوانده، سن شخص را با تاريخ روز، محاسبه نموده در خروجي چاپ كند. 5- فلوچارتي رسم نمائيد كه (m>n) N ,M را از ورودي دريافت كرده سري فيبوناچي بين N ,M را توليد كرده، در خروجي چاپ كند.