1 / 75

حلقه های شرطی

حلقه های شرطی. هدف ما در اين فصل مطالعه حلقه های شرطی خواهد بود. گفتيم که اين حلقه ها شامل يك شرط، به نام شرط خروج از حلقه ، می باشند كه باعث تكرار حلقه يا خروج از حلقه می شود. برحسب اينكه اين شرط در اول حلقه باشد يا در آخر آن، حلقه های شرطی را به دو قالب شرط-اول و شرط-آخر تقسيم می كنيم.

autumn-koch
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. مرحله دوم. طراحي برد حلقه، براساس پردازشهايي که در هر تکرار حلقه انجام می گيرند. برخي مواقع، بويژه وقتي که مقادير اوليه حلقه مشخص نباشند، نوشتن برد حلقه از تکرار دوم به بعد راحتتر است. در اين حالت، ابتدا برد حلقه را تشکيل می دهيم و سپس دنبال مقادير اوليه ای می گرديم که بتوانند، با اين برد، اولين تکرار را بسازند.

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

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

  7. cp←0 cx=1,20 x x>0 cp←cp+1 اين الگوريتم را در فصل قبل، با استفاده از يک حلقه خودکار نوشتيم. در آن حلقه تعيين مقدار اوليه، نمو، و مقدار نهايي بطور خودکار توسط پارامترهای يک دستورعمل انجام می شد: می خواهيم اين الگوريتم را بدون استفاده از حلقه خودکار بنويسيم. پس بايد سه دستورعمل مستقل برای تعيين سه مقدار مذکور بکار ببريم:

  8. cx←0 cp←0 x cx←cx+1 x>0 cp←cp+1 cx≥20 cp End قبل از حلقه، جايی که هنوز شمارش واقعی تعداد اعداد خوانده شده، cx ، شروع نشده، مقدار اوليهcx را 0 قرار می دهيم. بهترين جا براي افزايش نمو واحدی بلافاصله بعد از خواندن x می باشد. در آخر نيز شرط خروج از حلقه را قرار می دهيم بطوريکه پس از 20 بار شمارش، خروج از حلقه اتفاق بيافتد.جدول اجرا را برای داده های -2 0 9 -3 4ترتيب دهيد!

  9. cx←0 cp←0 cx←0 cp←0 cx<20 cp x x End cx←cx+1 cx←cx+1 x>0 x>0 cp←cp+1 cp←cp+1 cx≥20 cp End حال همين مسئله را با حلقه شرط-اول می نويسيم:

  10. برد حلقه شرط شرط برد حلقه حلقه شرط-آخر حلقه شرط-اول تازماني كه شرط حلقه برقرار است، برد حلقه را اجرا (تكرار) کن (در صورت برقرار نبودن شرط، خروج از حلقه انجام می شود). برد حلقه را تا زماني كه شرط حلقه برقرار شود، اجرا (تكرار) کن (در صورت برقراري شرط، خروج از حلقه انجام می شود). Whileشرط doبرد حلقه Repeatبرد حلقه untilشرط برد حلقه دستور While–do را بايد توسط beginو end دسته بندی کرد ولی اين کار برای دستورRepeat–untilلزومی ندارد.

  11. cx←0 cp←0 x cx←cx+1 x>0 cp←cp+1 cx≥20 cp End Program P6_1_A;Uses wincrt;Var x:real; cx,cp:integer;Begincx:=0; cp:=0; Repeat Write('Enter a number: '); Readln(x);cx:=cx+1; If x>0 then cp:=cp+1; until cx>=20; Writeln('The number of positive integers is: ',cp)End.

  12. cx←0 cp←0 cx<20 cp x End cx←cx+1 x>0 cp←cp+1 Program P6_1_B;Uses wincrt;Var x:real; cx,cp:integer;Begincx:=0; cp:=0; While cx<20 do begin Write('Enter a number: '); Readln(x);cx:=cx+1; If x>0 then cp:=cp+1 end; Writeln('The number ofpositive integers is: ',cp)End.

  13. ‼ همانطوريكه از نمودار اين دو نوع حلقه ديده می شود، علاوه بر موقعيت شرط حلقه، يك تفاوت عمده بين آنها وجود دارد:تفاوت دو قالب حلقه شرطی. در حلقه شرط-اول برد حلقه ممكن است اصلا اجرا نشود(كافي است كه از اول، شرط حلقه نادرست باشد)، ولي در حلقه شرط-آخر برد حلقه حداقل يكبار اجرا می شود. اين دقيقا به علت موقعيت شرط حلقه ها می باشد.

  14. c←0 c←0 c←c+1 c<20 c=1,20 برد حلقه برد حلقه c←c+1 c=20 سه نمونه زير از نظر اجرايي با هم معادلند: همانطوريكه ملاحظه می شود، در حلقه خودكار پارامترهاي اوليه، نهايي، و نمو بطور خودكار عمل می كنند در حاليكه در دو حلقه شرط-اول و شرط-آخر اين پارامترها با سه دستورعمل پردازش می شوند. دستورعمل افزايش نمو، بسته به منطق الگوريتم، ممکن است در موقعيتهای مختلفی در برد حلقه واقع شود.مثال بالا نمونه ای بود گويای اين واقعيت که حلقه های شمارشی را می توان با استفاده از حلقه های شرطی نيز نوشت. عکس اين کار معمولا انجام پذير نيست. ‼ برای ساختن يک حلقه شمارشی بهتر است از حلقه خودکار استفاده کنيم، مگر اينکه نتوانيم متغير حلقه را به نوع صحيح برگردانيم.

  15. تعدادي نمره از ورودي داده خواهد شد که از تعداد دقيق آنها، که آن را n می گيريم، هيچ اطلاعي نداريم و فقط می دانيم که اين تعداد حداکثر 30 است. الگوريتمي بنويسيد که اين نمرات را خوانده و ميانگين آنها را محاسبه و چاپ کند (نمرات از 20 گرفته می شوند).

  16. sum←0 n←0 s←0 x x=21 n←n+1 sum←sum+x s←1 s=1 or n=30 sum/n End چون نمرات از 20 گرفته شده اند يک نمره مجازي 21 را پس از اتمام نمرات می دهيم که اين نمره مجازي فقط نقش اعلام اتمام وروديها را بازي کرده و در محاسبه ميانگين دخالتي نداشته باشد. يک سويچ s , با وضعيت اوليه 0,در نظر می گيريم. در برد يک حلقه شرط-اول, تعداد و مجموع نمرات واقعي خوانده شده محاسبه می شوند و به محض آنکه نمره مجازي 21 خوانده شد سويچ به وضعيت 1 تبديل می گردد. خروج از حلقه زماني صورت می گيرد که عدد 21 خوانده شود (يعني s=1) و يا اينکه همه 30 عدد خوانده شود (يعنی n=30). Program P6_3_A;Uses wincrt;Var sum,x:real; s,n:integer;Begin sum:=0; n:=0; s:=0; Repeat Write('Enter a real number: '); Readln(x); If x=21 then s:=1 else begin n:=n+1; sum:=sum+x end until (s=1) or (n=30); Writeln('The mean value is: ',sum/n:10:4)End.

  17. Start sum←0 n=1,30 x sum/n x=21 End sum/(n-1) sum←sum+x Halt الگوريتم بالا را می توان با استفاده از حلقه خودکار نيز نوشت. در اين صورت نيازی به سويچ نبوده و به محض خواندن نمره مجازی 21 ميانگين محاسبه و چاپ شده و برنامه خاتمه می يابد. نمودار زير نتيجه کار ماست. Program P6_3_B;Uses wincrt;Var sum,x:real; n:integer;Begin sum:=0; For n:=1 to 30 do begin Write('Enter a real number: '); Readln(x); If x=21 then begin Writeln('The mean value is: ',sum/(n-1):10:4); Halt end else sum:=sum+x end; Writeln('The mean value is: ',sum/n:10:4)End.

  18. حال توجه خود را روی حلقه های غيرشمارشی متمرکز می سازيم؛ حلقه هايی که تکرار آنها ديگر بر محور شمارش استوار نيستند.يکي از دنباله هاي مشهور، دنباله اعداد فيبوناچي است. در اين دنباله، جملات اول و دوم برابر 1 بوده و از جمله سوم به بعد، هر جمله مجموع دو جمله قبل از خودش می باشد. چند جمله از اين دنباله عبارتند از: 1 , 1 , 2 , 3 , 5 , 8 , 13 ,...الگوريتمي بنويسيد که جملاتی از اين دنباله را که کمتر از 50 هستند توليد و چاپ کند.

  19. a←1 b←1 توليد و چاپ جملة ؟ ?≥50 End در روش زير بدين طريق عمل می کنيم که ابتدا دو متغير a و b با مقادير اوليه 1 در نظرمي گيريم. اينها دو جمله اول دنباله هستند. چون می خواهيم جملات کمتر از 50 چاپ شوند، خروج از حلقه را در مسيری قرار می دهيم که موارد چاپی بزرگتر از يا مساوی 50 می گردند. تا كنون نمودار زير را داريم.

  20. a←1 b←1 a a←a+b a←→b a≥50 End جملات دنباله را با اين ايده توليد می كنيم:a را جمله قديم و b را جمله جديد می ناميم. در گام اول، جمله قديم و جمله جديد را با هم جمع كرده و براي جمله قديم نسبت می دهيم. حال جمله قديم جديد شده و جمله جديد قديم می شود. در گام بعدي، جاي اين دو جمله را عوض می كنيم(با استفاده از الگوريتم ماهي طلايي). بدين ترتيب b آخرين جمله توليد شده خواهد بود، ولی چاپ و شرط خروج از حلقه را از روی a تعيين می کنيم. اين کار به اين خاطر انجام می گيرد که اولين جمله 1 نيز چاپ گردد. جدول اجرا را براي جملات کمتر از 5 , به جای 50 , نشان دهيد!

  21. Fibo(i) a←1 b←1 a←1 b←1 a a a←a+b a←a+b a←→b a←→b a≥50 a≥i End Return حال الگوريتم نمودار قبل را به دو واحد زيرالگوريتم و الگوريتم اصلي تفکيک می کنيم بطوريکه زيرالگوريتم رويه به نام Fibo يک عدد صحيح مثبت i را گرفته و تمام جملات دنباله را که کمتر از i هستند چاپ کند.

  22. Fibo(i) Start a←1 b←1 k a k<2 a←a+b Fibo(k) ‘Out of range’ a←→b End a≥i Return الگوريتم اصلي نيز يک عدد صحيح kرا از ورودي خوانده و در صورتي که k<2 ، يک پيغام چاپ کند. در غير اينصورت تمام جملات کمتر ازkرا با استفاده از زيرالگوريتم بالا چاپ کند.

  23. Fibo(i) Start a←1 b←1 k a k<2 a←a+b Fibo(k) ‘Out of range’ a←→b End a≥i Return Program P6_4_A;Uses wincrt; Var k:integer;(*************************)Procedure Fibo(i:integer);Var a,b,h:integer;Begin a:=1; b:=1; Repeat Writeln(a); a:=a+b; h:=a; a:=b; b:=h; until a>=i End; (*************************)Begin Write('Enter an integer: '); Readln(k); If k<2 then Writeln('Out of range') elseFibo(k)End.

  24. نوشتن برنامه براي دنباله فيبوناچي با استفاده از زيربرنامه هاي خودفراخوان خيلي ساده تر خواهد بود. اگر جمله n ام را با f(n) نشان دهيم آنگاه, به عنوان يک تابع, داريم:

  25. Start k k≤0 Fib(k) ‘Not positive’ Fib(n) n=1 or n=2 End Fib←Fib(n-1)+Fib(n-2) Fib←1 Return با توجه به ضابطه بالا, تابع مولد اين دنباله در زيرالگوريتم Fib نمودار زير تنظيم گرديده است.اين زيرالگوريتم يک عدد صحيح مثبت n را گرفته و n-امين جمله دنباله فيبوناچی را محاسبه و باز می گرداند. الگوريتم اصلی اين نمودار نيز پس از خواندن يک عدد صحيح k از ورودی، در صورتيکه k مثبت نباشد يک پيغام، و در غير اينصورت k امين جمله دنباله را با استفاده از زيرالگوريتم تعيين و چاپ می کند.

  26. Start k k≤0 Fib(k) ‘Not positive’ Fib(n) n=1 or n=2 End Fib←Fib(n-1)+Fib(n-2) Fib←1 Return Program P6_4_B;Uses wincrt;Var k:integer;(*******************************)Function Fib(n:integer):integer;Begin If (n=1) or (n=2) then Fib:=1 else Fib:=Fib(n-1)+Fib(n-2)End;{Fib}(*******************************)Begin Write('Enter an integer: '); Readln(k); If k<=0 then Writeln('Not positive') else Writeln(Fib(k))End.

  27. Fibo(i) Start a←1 b←1 k Start a k<2 k a←a+b Fibo(k) ‘Out of range’ k≤0 a←→b Fib(k) ‘Not positive’ End a≥i Fib(n) n=1 or n=2 End Return Fib←Fib(n-1)+Fib(n-2) Fib←1 Return

  28. Start Start a←1 b←1 m←1 a←1 a a m←m+1 Fib(n) a←a+b a←Fib(m) n=1 or n=2 a≥50 a←→b Fib←Fib(n-1)+Fib(n-2) Fib←1 End a≥50 Return End در نمودار زير يک الگوريتم اصلی با فراخوانی زيربرنامه Fib جملات کمتر از 50 دنباله را تعيين و چاپ می کند. اينجا سرعت برنامه پايين است زيرا هر بار برای يک m جديد m جمله از دنباله از اول محاسبه می گردد.

  29. الگوريتمی ترتيب دهيد كه يك عدد صحيح دلخواه را خوانده و منقلب آن را چاپ كند. مثلا -49 منقلب -94 است.

  30. مناسبترين گام براي شروع آن است كه واکنش ذهن را براي يك عدد صحيح مثبت تجزيه و تحليل كنيم تا از آن يك ايده بگيريم. يك روش براي منقلب كردن اين است كه عدد را بطور مكرر به 10 تقسيم كرده و باقيمانده هاي تقسيم ها را به ترتيب از چپ به راست بچينيم و اين كار را تا آنجا ادامه دهيم كه خارج قسمت تقسيم مساوي صفر گردد. بدين ترتيب عدد حاصل عدد مطلوب خواهد بود.

  31. با عدد 234 كار كرده و جزئيات كار را با توجه به جدول روبرو تشريح می كنيم:234 را به 10تقسيم كرده و باقيمانده، يعني 4 ، را به عنوان عدد جديد درج می كنيم. خارج قسمت اين تقسيم، يعني 23، را نيز جايگزين عدد اوليه می سازيم. چون خارج قسمت هنوز صفر نيست, تقسيم را ادامه می دهيم. 23را به 10تقسيم كرده و باقيمانده، يعني 3, را در مقابل 4درج می کنيم. خارج قسمت اين تقسيم, يعني 2, را نيز جايگزين خارج قسمت قبلي می سازيم. باز, چون خارج قسمت هنوز صفر نيست, تقسيم را ادامه می دهيم. 2را به 10تقسيم كرده و باقيمانده، يعني خود 2, را در مقابل 43درج می کنيم. خارج قسمت اين تقسيم, که جايگزين خارج قسمت قبلي خواهد شد, اکنون صفر است. بنابراين کار را خاتمه داده و آخرين عدد درج شده, يعني 432, را به عنوان عدد مطلوب اعلام می کنيم.

  32. آنچه را كه در بالا انجام گرفت با توجه به جدول بالا با جرئيات بيشتر توضيح می دهيم: عدد پردازش شونده234 را به نام old در نظر می گيريم. باقيمانده تقسيم old بر 10، يعنی4 ، به نام rثبت می شود.خارج قسمت اين تقسيم، يعنی 23 ، نيز جايگزين old می گردد. عدد پردازش شدهnew را در مرحله اول برابر همان باقيمانده 4 می گيريم. باز, باقيمانده تقسيم old بر 10، اين بار 3 ،برای rثبت می شود. خارج قسمت اين تقسيم، يعنی 2 ، نيز جايگزين old می شود.عدد پردازش شده new در اين مرحله برابر است با: 10+3*43=4. اين، به همان معنی است که بگوييم 3 را در مقابل 4درج می کنيم. چون old, خارج قسمت تقسيم در اين مرحله, هنوز صفر نشده, يک مرحله ديگر باقيمانده تقسيم old بر 10 را، که اکنون 2 است،برای rثبت کرده و خارج قسمت اين تقسيم را، که حال 0 شده، جايگزين old می نماييم. عدد پردازش شده new در اين مرحله برابر است با: 10+2*432=4. مقدار old, خارج قسمت تقسيم در اين مرحله, اکنون صفر است. بنابراين با اعلام new به عنوان عدد مطلوب کار را تمام می کنيم.بدين ترتيب، يك حلقه می توانيم داشته باشيم هرگاه اولين رديف new را با رديفهاي بعدي سازگار سازيم و براي رسيدن به اين مقصود كافي است مقدار اوليه new را صفر اختيار كنيم. آنگاه رديف اول را می توانيم بنويسيم: 10+4*4=0.

  33. new←0 r←old mod 10 new←new*10+r old←old div 10 old=0 حال پردازشهاي يك حلقه (شرط-آخر) كامل شده اين قسمت از نمودارگردشي، بخش كليدي آن بوده و اساس الگوريتم بر آن استوار است. در واقع، در همين قسمت است كه ايده گرفته شده از ذهن، به تصوير كشيده می شود. قاعده.در نوشتن الگوريتم يك روش مناسب اين است كه بخش كليدي نمودار را نوشته و سپس موارد ديگر، از جمله خواندن وروديها، چاپ خروجي ها، و قسمتهاي واضح و ساده الگوريتم را به آن بيافزاييم. در بيشتر موارد اين بخش، از برد حلقه(ها) الهام گرفته می شود.اين روش در اغلب موارد روش كارآمد و مفيدي در نوشتن الگوريتم بوده و اكثراً به نتيجه می نشيند.

  34. n old←|n| new←0 r←old mod 10 new←new*10+r old←old div 10 old=0 n≥0 -new new END نمودار قبل پردازش خواسته شده براي يک عدد صحيح مثبت بود. فرض کنيد که نمی دانيم که عدد داده شده منفی است يا نامنفي. دو روش پيش روي ماست:( روش اول چندان جالب نيست! )روش دوم. عدد را به نامي غير از نام old گرفته و قدرمطلق آن را به oldنسبت دهيم. سپسپردازش اخير را داشته باشيم. بعد, اگر عدد اوليه مثبت باشد new , و در غير اينصورت –new راچاپ کنيم. نمودار روبرو از اين ايده الهام گرفته شده است:

  35. n old←|n| new←0 r←old mod 10 new←new*10+r old←old div 10 old=0 n≥0 -new new END rev(old) Start new←0 n r←old mod 10 old←old div 10 new←new*10+r old←|n| n≥0 old=0 -rev(old) rev(old) rev←new Return End اکنون پردازشي را که نمودار قبل می کند به شکل يک زيرالگوريتم تابع در آورده و به جاي الگوريتم قبل يک الگوريتم می نويسيم که اين زيرالگوريتم را فراخواني کند. اين کارها در بالا انجام گرفته اند. اسم تابع را rev انتخاب کرده ايم. اين زيرالگوريتم يک عدد صحيح مثبت را به نام old گرفته و منقلب آن را به نام new محاسبه کرده و آن را به اسم تابع, rev, نسبت می دهد.

  36. rev(old) Start new←0 n r←old mod 10 old←old div 10 new←new*10+r old←|n| n≥0 old=0 -rev(old) rev(old) rev←new Return End Program P6_5_A;Uses wincrt;Var n,old:integer;(*********************************)Function rev(old:integer):integer;Var new,r:integer;Begin new:=0; Repeat r:=old mod 10; old:=old div 10; new:=new*10+r; until old=0; rev:=newEnd;{rev}(*********************************)Begin Write('Enter an integer: '); Readln(n); old:=abs(n); If n>=0 then Writeln('The reversed form is: ',rev(old)) else Writeln('The reversed form is: ',-rev(old))End.

  37. Reverse(old) old≠0 old mod 10 Reverse(old div 10) Return حال با استفاده از فن خودفراخوانی، يک زيرالگوريتم رويه می نويسيم که يک عدد صحيح مثبت را گرفته و منقلب آن را، اين بار، چاپ کند.در اين زيرالگوريتم, از اين ايده الهام گرفته شده که منقلب يک عدد با شروع از رقم آخر تا به رقم اول چاپ می شود: ابتدا رقم آخر چاپ می شود. سپس زيرالگوريتم براي عدد باقي مانده از حذف رقم آخر (خارج قسمت تقسيم بر 10) خودفراخواني می گردد و اين روند تا تمام شدن ارقام عدد ادامه می يابد. اين زيرالگوريتم فقط برای مقادير مثبت n کار مي کند.

  38. Reverse(old) old≠0 Start old mod 10 n Reverse(old div 10) old←|n| Return n≥0 ‘-‘ Reverse(old) Reverse(old) End اگر بخواهيم آن را براي يک عدد ناصفر n فراخواني کنيم آنگاه, در صورت منفي بودن عدد بايد يک علامت منفی, به عنوان کاراکتر قبل از فراخواني چاپ نماييم. اين کار در نمودار روبرو انجام گرفته است. Program P6_5_B;Uses wincrt;Var n,old:integer;(**************************)Procedure Reverse(old:integer);Begin If old<>0 then begin Write( old mod 10); Reverse(old div 10) endEnd;{Reverse}(**************************)Begin Write('Enter a non-zero integer: '); Readln(n); old:=abs(n); If n>=0 then Reverse(old) else begin Write('-'); Reverse(old) endEnd.

  39. زيرالگوريتمي بنويسيد که يک عدد حقيقي را گرفته و آن را به مبناي 2 برده و نتيجه را محاسبه و برگرداند.

  40. با يک عدد صحيح مثبت n شروع مي کنيم.n را بطور متوالي بر 2 تقسيم کرده و باقيمانده و خارج قسمت را مي نويسيم. اين کار را تا آنجا ادامه مي دهيم که خارج قسمت صفر ظاهر شود. حال اگر باقيمانده ها را از آخر پشت سر هم (از چپ به راست) بچينيم به عدد مطلوب مي رسيم. قاعده گفته شده را روي n=11 پياده کرده و نتيجه را در جدول زير درج مي نماييم. نتيجه:1011 مسئله را بيشتر تشريح می کنيم (اسلايد بعدی).

  41. متغيري به نام new تعريف مي کنيم که هر بار عدد جديدي را که از چيدن باقيمانده جديد در مقابل عدد قبلي حاصل مي شود، نشان دهد و براي آن مقدار اوليه 0 منظور مي کنيم. متغيري موقعيت ياب، به اسم p ، را براي تعيين موقعيت يکان، دهگان، و غيره در نظر مي گيريم. چون اين متغير براي تعيين موقعيت جديد هر بار در 10 ضرب خواهد شد، پس براي آن مقدار اوليه 1 نسبت مي دهيم. باقيمانده تقسيم بر 2 را نيز با r نمايش مي دهيم. 1 ، رقم يکان باشد؛ يعني باضريب يک ظاهر شده باشد؛بنابراين 1را در يک ضرب کرده و به new ی قبلی اضافه می کنيم: 1سپس برای ساختن موقعيت بعدی، موقعيت ياب، p را در 10 ضرب می کنيم.1 ، رقم دهگان باشد؛ يعني باضريب ده ظاهر شده باشد؛ بنابراين 1را در ده ضرب کرده و به new ی قبلی اضافه می کنيم: 11سپس برای ساختن موقعيت بعدی، موقعيت ياب، p را در 10 ضرب می کنيم.0 ، رقم صدگان باشد؛ يعني باضريب صد ظاهر شده باشد؛ بنابراين 1را در صدضرب کرده و به new ی قبلی اضافه می کنيم: 011سپس برای ساختن موقعيت بعدی، موقعيت ياب، p را در 10 ضرب می کنيم.1 ، رقم هزارگان باشد؛ يعني باضريب هزار ظاهر شده باشد؛ بنابراين 1را در هزار ضرب کرده و به new ی قبلی اضافه می کنيم: 1011 در نهايت مي خواهيم عدد حاصل را در مبناي 10 به نمايش بگذاريم. براي اين کار، باقيمانده ها از بالا به پايين بايد آرايش زير را داشته باشند:

  42. بنابراين در هر بار تکرار يک حلقه شرط-آخر کارهاي زير را انجام مي دهيم: bin1(n) new←0 p←1 r←n mod 2 new←new+p*r p←p*10 n←n div 2 n=0 bin1←new Return 1) باقيمانده r را محاسبه مي کنيم. 2) با ضرب r در p ، موقعيت آن را تعيين، و آن را به عدد قبلي new اضافه کرده و جايگزين آن مي سازيم. 3) p را در ده ضرب مي کنيم. 4) خارج قسمت را محاسبه و جايگزين n مي سازيم.بدين ترتيب زيرالگوريتم نمودار روبرو را خواهيم داشت: براي آزمايش درستي اين زيرالگوريتم، جدول اجرا را براي همان عدد 11 تنظيم مي کنيم!

  43. حال براي يک عدد کسري u مسئله را بررسي مي کنيم. برای تحليل رياضی مسئله، نمايش زير را در نظر مي گيريم:در اينصورت داريم:با ضرب طرفين تساوي اخير در 2 خواهيم داشت:که از آنجا نتيجه مي شود ، که در آن، کروشه جزء صحيح را نشان مي دهد. اگر روند ضرب کردن تساويهاي بدست آمده در 2 را ادامه دهيم، نتايج زير حاصل خواهند شد: ...حال مسئله را از نقطه نظر الگوريتم بررسی می نماييم.

  44. u را بطور متوالي به 2 ضرب کرده و قسمت صحيح عدد حاصل از اين ضرب را، به نام b ، برداشته و قسمت اعشاری آن را جايگزين u می سازيم. اين کار را تا رسيدن به تعداد ارقام اعشار خواسته شده ادامه می دهيم. حال اگر قسمتهای صحيح برداشته شده را بعد از مميز به ترتيب از چپ به راست بچينيم به عدد مطلوب می رسيم. قاعده گفته شده را روي u=0.688 پياده کرده و نتيجه را تا چهار رقم اعشار در جدول زير درج مي کنيم. نتيجه:0.1011 تشريح بيشتر مسئله مشابه قبل صورت می گيرد.

  45. متغيري به نام new تعريف مي کنيم که هر بار عدد جديدي را که از چيدن قسمتهای صحيح برداشته شده بعد از مميز حاصل مي شود، نشان دهد و براي آن مقدار اوليه 0 منظور مي کنيم. متغيري موقعيت ياب، به اسم p ، را براي تعيين موقعيت يک دههم، يک صدم، و غيره در نظر مي گيريم. اين متغير براي تعيين موقعيت جديد هر بار در 0.1 ضرب خواهد شد؛ براي آن موقعيت اوليه 0.1 نسبت مي دهيم.

  46. بنابراين در هر بار تکرار يک حلقه شرط-آخر، دو برابر u را محاسبه، و کارهاي زير را انجام مي دهيم: bin2(u) new←0 p←0.1 b←[2*u] new←new+p*b p←p*0.1 u←2*u-b u=0 bin2←new Return 1) قسمت صحيح 2uرا بهbمنظور می کنيم. 2) با ضرب b در p ، موقعيت آن را تعيين، و آن را به عدد قبلي new اضافه کرده و جايگزين آن مي سازيم. 3) p را در يک دهم ضرب مي کنيم. 4) قسمت اعشاری 2uرا جايگزين u مي سازيم.بدين ترتيب زيرالگوريتم نمودار روبرو را خواهيم داشت: الگوريتم روبرو تنها زمانی تمام می شود که ارقام اعشار مورد نظر تمام شدنی باشد. برای رفع اين ضعف، الگوريتم را طوری تغيير می دهيم که حداکثر تا mرقم اعشار پيش برود.

  47. bin2(u,m) bin2(u) new←0 p←0.1 i←0 new←0 p←0.1 i←i+1 b←[2*u] new←new+p*b p←p*0.1 u←2*u-b b←[2*u] new←new+p*b p←p*0.1 u←2*u-b u=0 or i=m u=0 bin2←new bin2←new Return Return جدول اجرا را برای u=0.688 و m=4ترتيب دهيد!

  48. bin2(u,m) bin1(n) new←0 p←0.1 i←0 new←0 p←1 i←i+1 b←[2*u] new←new+p*b p←p*0.1 u←2*u-b r←n mod 2 new←new+p*r p←p*10 n←n div 2 u=0 or i=m n=0 bin2←new bin1←new Start Return Return x,m y←|x| n←trunc(y) u←frac(y) z←bin1(n)+bin2(u,m) x<0 z -z End اکنون يک الگوريتم اصلي ترتيب مي دهيم که يک عدد حقيقي داخواه x و يک عدد صحيح مثبت m را خوانده و، با استفاده از دو تابع bin1 و bin2 ، معادل x در مبناي 2 را با m رقم اعشار چاپ کند. براي اينکار، نخست قسمتهاي صحيح و اعشاري x را جدا کرده و آنها را جداگانه به مبناي 2 مي بريم. سپس حاصل کار را با هم جمع مي زنيم.بالاخره، بر حسب اينکه x منفي يا نامنفي باشد، نتيجه را چاپ مي کنيم. الگوريتم نمودار زير ماحصل کار ماست.

  49. bin1(n) new←0 p←1 r←n mod 2 new←new+p*r p←p*10 n←n div 2 n=0 bin1←new Return Function bin1(n:integer):integer;Var r,new,p:integer;Begin new:=0; p:=1; Repeat r:=n mod 2; new:=new+p*r; p:=p*10; n:=n div 2 until n=0; bin1:=newEnd;{bin1}

  50. bin2(u,m) new←0 p←0.1 i←0 i←i+1 b←[2*u] new←new+p*b p←p*0.1 u←2*u-b u=0 or i=m bin2←new Return Function bin2(u:real;n:integer):real;Var r,new,p,b:real; i:integer;Begin new:=0; p:=1; i:=0; Repeat i:=i+1; b:=int(2*u); p:=p*0.1; new:=new+p*b; u:=2*u-b until (u=0) or (i=m); bin2:=newEnd;{bin2}

More Related