1 / 104

حلقه های خودكار

حلقه های خودكار.

tadeo
Download Presentation

حلقه های خودكار

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. حلقه های خودكار

  2. به هر پردازش كه اجراي يك مجموعه از دستورعملها، به نام برد حلقه,را چند بار تكرار كند يك حلقهگوييم. در ساختن تمام حلقه ها طراحي برد حلقه اساسي ترين کار است. به عبارت ديگر مهمترين کار اين است که بدانيم در هر بار تکرار حلقه چه کارهايي بايد انجام گيرند و بتوانيم آنها را به درستي در الگوريتم طراحي نماييم.

  3. نوعي از اين حلقه ها بر محور يک (يا چند) متغير استوارند بطوريکه ابتدا مقدار اوليه ای براي آن متغير، قبل از شروع حلقه، منتسب می شود. سپس در هر بار تکرار حلقه، در طول پردازش حلقه (ابتدا، انتها، يا لابلاي آن)، تغييري در محور حلقه ايجاد می شود. اينکه حلقه تکرار شود يا خروج از حلقه صورت پذيرد، توسط يک شرط، به نام شرط خروج از حلقه، تعيين می گردد. اين نوع حلقه ها به حلقه هاي شرطی مشهورند که در فصل بعد آنها را بطور مفصل با قالبهايشان مورد بررسي قرار خواهيم داد.

  4. نوع ديگر از حلقه ها، حلقه هاي شمارشي هستند که در آنها محور حلقه يک شمارنده می باشد. در اين نوع حلقه ها سه کار بايد انجام گيرد:1) مقدار اوليه براي شمارنده تعيين گردد. 2) در هر بار تکرار حلقه به مقدار قبلي شمارنده يک مقدار ثابت به نام نمو حلقه (مثبت يا منفي) افزوده شود. 3) شرط خروج از حلقه تعيين گردد. اين شرط بر اساس مقدار نهايي شمارنده ساخته و پرداخته می گردد.

  5. براي ساختن اين نوع حلقه ها می توان از قالبهاي حلقه هاي شرطي (فصل بعد) استفاده نمود. در اينصورت هر يک از سه کار بالا توسط يک دستورعمل انجام خواهد شد. ولي ساده ترين روش براي ساختن حلقه هاي شمارشي استفاده از يک قالب حلقه خودکار خواهد بود که در آن سه کار بالا توسط پارامترهاي يک دستورعمل بطور خودکار انجام می گيرد.

  6. i=a,b,step برد حلقه يک قالب حلقه خودکار را در الگوريتم نويسی با شکلی که در نمودار زير نشان داده شده، بکار می بريم. عبارت i=a,b,step را مشخصات حلقه می ناميم. iرا متغير حلقه، aرا پارامتر اوليه، bرا پارامتر نهايي، و stepرا پارامتر نمو می ناميم.

  7. اجرا بدين صورت است: به تعداد دفعات تکرار، برد حلقه را با شروع از i=a تکرار کن طوريکه در هر مرحله تکراربه i قبلي نمو step افزوده شود.‼ تعداد دفعات تکرار به a ، b ، و step بستگي داشته و توسط مترجم زبان برنامه نويسی با استفاده از فرمول زير محاسبه می گردد: = تعداد دفعات تکراركه در آن [ ] اشاره به جزء صحيح دارد.

  8. i=1,9,3 برد حلقه مثلا اگرi=1,9,3، تعداد دفعات تکرار برابر خواهد بود با 3. بنابراين اجراي نمودار بدينصورت خواهد بود که به تعداد 3 بار برد حلقه اجرا خواهد شد:

  9. ‼ قوياتوصيه می کنيم که هرگز مقادير پارامترهای اوليه و نهايي را در برد حلقه تغيير ندهيد.‼ تغيير مقدار متغير حلقه در برد حلقه، در بيشتر موارد اشکالاتی از قبيل قفل کردن برنامه را به دنبال خواهد داشت. بنابراين نبايد مقدار متغير حلقه را در برد حلقه تغيير دهيد.

  10. ‼ در دو حالت در پارامترهاي حلقه ناسازگاري اتفاق می افتد که عبارتند از:الف) a<b وstep<0مثلi=1,3,-1;ب)a>b وstep>0مثل i=4,1,2 .در اين حالتها تعداد دفعات تکرار برابر صفر بوده و در نتيجه برد حلقه اصلا اجرا نمی شود. مثل اينكه حلقه ای در ميان نيست.

  11. ها ؟؟؟ ‼ در برخي از زبانهاي برنامه نويسي(مثل پاسکال) step تعريف نمی شود (همواره 1 يا -1در نظر گرفته می شود) در چنين مواقعي می توانيم با يک شرط step را اعمال کنيم.

  12. i=1,9,1 i mod 3 = 1 برد حلقه مثلا به منظور پردازش با پارامترهاي i=1,9,3 می توانيم به صورت زير عمل کنيم: در اين حالت تعداد دفعات تکرار برابر 9 بوده و برد اين حلقه، که اکنونيک قالب اگر-آنگاهاست به صورتيکه درجدول زير درج شده اجرا میگردد :

  13. ‼ از اين به بعد هر گاه در نمودارهای گردشی نمو نوشته نشود به منزله 1 تلقی می گردد.قاعده. در پاسکال، متغير حلقه خودکار فقط نوع صحيح را می پذيرد.

  14. وقتي stepمقدارش برابر 1 است:For i:=a to b do برد حلقهوقتي stepمقدارش برابر -1 است:For i:= a downto b do برد حلقهدر هر دو حالت، برد حلقه بايد توسط begin و end دسته بندی شوند.

  15. الگوريتمي بنويسيد كه 20 عدد دلخواه را خوانده، و تعداد اعداد مثبت در بين آنها را تعيين و چاپ كند.

  16. cx=1,20

  17. x x>0 cp←cp+1

  18. cx=1,20 x x>0 cp←cp+1

  19. cp←0 cx=1,20 x x>0 cp←cp+1

  20. cp←0 cx=1,20 x cp x>0 End cp←cp+1

  21. cp←0 cx=1,20 x cp x>0 End cp←cp+1 Program P5_2; Uses wincrt; Var cp,cx:integer; x:real; Begin cp:=0; For cx:=1 to 20 do begin Write('Enter an integer: '); Readln(x); If x>0 then cp:=cp+1 end; Writeln('The number of positive integers is: ',cp) End.

  22. يک الگوريتم بنويسيد که عدد صحيح مثبت n را خوانده و n! را با استفاده از فرمولمحاسبه و چاپ کند.

  23. اينجا نيز با يک شمارش معمولی سرو کار داريم: از 1 تا n . پس يک حلقه خودکار با مشخصات c=1,n خواهيم داشت.وقتی c برابر 1 است می خواهيم نتيجه کار 1باشد؛وقتی c برابر 2 است می خواهيم نتيجه کار1×2باشد؛وقتی c برابر 3 است می خواهيم نتيجه کار1×2×3باشد؛ و غيره.

  24. fact←fact*c همانطوريکه می بينيم، يک ضرب تکراري داريم که آن را fact می گيريم. در هر تکرار حلقه، شماره جديد به مقدار قبلي fact ضرب شده و جايگزين آن می گردد. بنابر اين دستورعملی که در هر بار تکرار حلقه اجرا می شود عبارتست از:

  25. c=1,n fact←fact*c

  26. fact←1 c=1,n fact←fact*c

  27. Start n fact←1 c=1,n fact fact←fact*c End

  28. Start n fact←1 c=1,n fact fact←fact*c End

  29. قاعده. اگر متغيري فقط يک بار خوانده شود لزومي ندارد آن را در جدول اجرا بنويسيم. در جدول بالا n را وارد نكرده ايم.قاعده. براي اينکه يک همخواني و مقايسه بين محاسبه خواسته شده در مسئله و نتايج جدول اجرا وجود داشته باشد بهتر است جزئيات محاسبه را در جدول اجرا بنويسيم.

  30. سؤال. آيا نمودار بالا براي n=0کار می كند؟

  31. Start n fact(n) fact←1 f←1 c=1,n c=1,n fact←f fact fact←fact*c f←f*c Return End

  32. Start i=1,30 n End n≥0 fact(n) f←1 ‘negative’ fact(n) c=1,n fact←f f←f*c Return Program P5_3; Uses wincrt; Var i,n:integer; (********************************) Function fact(n:integer):longint; Var c,f:integer; Begin f:=1; For c:=1 to n do f:=f*c; fact:=f End;{fact} (********************************) Begin For i:=1 to 30 do begin Write('Enter an integer: '); Readln(n); If n>=0 then Writeln(n,'!=',fact(n)) else Writeln(n,' is negative') end End.

  33. الگوريتمی بنويسيد که عدد صحيح مثبت n را خوانده و مجموع زير را محاسبه و چاپ کند.1! + 2! + 3! + ... + n!

  34. جدول اجرای الگوريتم محاسبه فاکتوريل

  35. Start Start fact←1 fact←1 sum←0 n n c=1,n c=1,n fact←fact*c fact←fact*c sum←sum+fact fact sum END END تکميل الگوريتم محاسبه فاکتوريل:

  36. Start fact←1 sum←0 n c=1,n fact←fact*c sum←sum+fact sum END جدول اجرای برای n=4

  37. ‼ يادآوری و تاکيد می کنيم کهترتيب اجرای دستورعملها در داخل مستطيل خيلی مهم است.برای پی بردن به اين مهم، جای دو دستورعمل موجود در داخل مستطيل واقع در برد حلقه را عوض کرده و جدول اجرا را از نو ترتيب دهيد!

  38. يک الگوريتم بنويسيد که مقدار عدد صحيح مثبت n را خوانده و مجموع زير را محاسبه و چاپ کند.1+(1+2)+(1+2+3)+...+(1+2+...+n)مقايسه با مجموع قبلی:1! + 2! + 3! + ... + n! پس به نظر خيلي بديهي می رسد كه ضرب در محاسبه factرا به جمع تبديل كنيم.

  39. Start fact←1 sum←0 n c=1,n fact←fact+c sum←sum+fact sum END جدول اجرای برای n=4 کار نمی کند! 1+(1+2)+(1+2+3)+...+(1+2+...+n)

  40. Start fact←0 sum←0 n c=1,n fact←fact+c sum←sum+fact sum END کار می کند! 1+(1+2)+(1+2+3)+...+(1+2+...+n) ! حتي براي بديهي ترين تغييرات در نمودار گردشي نيز بايد جدول اجرا را از نو ترتيب دهيم.

  41. الگوريتمی بنويسيد که مقدار صحيح مثبت n را خوانده و مجموع زير را محاسبه و چاپ کند.

  42. اگر علامتها را براي يک لحظه ناديده بگيريم، مجموع قبلي با مجموع مثال قبل اين فرق را خواهد داشت که فقط جمله عمومي، که در هر مرحله به جمع تکراري قبليsum اضافه می شود، اينجا معکوس می گردد.

  43. Start fact←1 sum←0 sign←-1 n c=1,n sign← -sign fact←fact*c sum←sum+sign*1/fact sum End چطور علامت را اعمال كنيم؟ دو روش كلي براي اينكار وجود دارد. روش اول

  44. Start fact←-1 sum←0 n c=1,n fact←-fact*c sum←sum+1/fact sum End روش دوم

  45. حال يک الگوريتم بنويسيد که پس از خواندن يک عدد صحيح مثبت فرد n مجموع زير را محاسبه کند:

  46. اين بار تفاوت بيشتري مشاهده می شود. شمارنده دو واحد افزايش می يابد و اين، کار را اندكي پيچيده تر می سازد.خوشبختانه منطق الگوريتم همان منطق الگوريتم قبل است؛ فقط محاسبه فاكتوريل است كه فرق كرده است.

  47. fact←fact*(c-1)*c sign←(-sign) sum←sum+sign/fact به اين سؤال بايد جواب دهيم: مقدار قبلي factعبارتست از c! . به مقدار قبلی شمارنده c دو واحد اضافه می کنيم. حال با اين شمارنده جديد، به جای نقطه چين در fact*...*cچه قرار دهيم تا نتيجه(c+2)! حاصل گردد؟ با توجه به جدول روبرو، جواب c-1 است!بنابراين در هر بار تکرار حلقه دستورعملهای زيربه ترتيب اجرا می شوند:

  48. (c mod 2)=1 fact←fact*(c-1)*c sign←(-sign) sum←sum+sign/fact افزايش نمو دو واحدی را نيز، همانطوريکه در ابتدای فصل گفتيم، با يک قالب شرطی اگر-آنگاه پردازش می کنيم.

  49. Start fact←1 sum←1 sign←1 n c=3,n (c mod 2)=1 sum fact←fact*(c-1)*c sign←(-sign) sum←sum+sign/fact End برای آنکه c-1 با قرار گرفتن 1 برای c صفر نگردد پارامتر اوليه حلقه را 3 و مقدار اوليه sum را 1 می گيريم. اکنون، مقدار اوليه sign بايد عوض شود.

  50. Start fact←1 sum←1 sign←1 n c=3,n (c mod 2)=1 sum fact←fact*(c-1)*c sign←(-sign) sum←sum+sign/fact End Begin fact:=1; sum:=1; sign:=1; write('Enter a positive odd integer: '); Readln(n); For c:=3 to n do If (c mod 2)=1 then begin fact:=fact*(c-1)*c; sign:=-sign; sum:=sum+sign/fact end; Writeln('sum=',sum:10:6)End.

More Related