1 / 104

زيرالگوريتم

زيرالگوريتم. الگوريتم و برنامه ای بنويسيد که ابتدا يک عدد صحيح مثبت n را, که فرض می شود n>1 , از ورودي بخواند. سپس درايه هاي سه ماتريس به اسامي A , B , و C را, که C معکوسپذير فرض می شود, به طور جداگانه خوانده و مقدار det(AB+C -1 ) را محاسبه و چاپ کند.

gretel
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. الگوريتم و برنامه ای بنويسيد که ابتدا يک عدد صحيح مثبت n را, که فرض می شود n>1 , از ورودي بخواند. سپس درايه هاي سه ماتريس به اسامي A,B, وCرا, که C معکوسپذير فرض می شود, به طور جداگانه خوانده و مقدار det(AB+C-1) را محاسبه و چاپ کند.

  3. زيرالگوريتم ها: 1) ضرب کننده دو ماتريس؛ 2) جمع کننده دو ماتريس؛ 3) وارون کننده يک ماتريس؛ 4) محاسبه کننده دترمينان؛ 5) خواننده درايه هاي يک ماتريس.کار الگوريتم اصلی:

  4. برخي انگيزه ها براي استفاده از زيرالگوريتم ها1) نوشتن الگوريتم ساده تر می گردد چرا که، کار محاسبه ای بزرگ بين زيرالگوريتم هايي کوچک، به انضمام يک الگوريتم اصلي کوچک تقسيم می گردد. اکنون نوشتن زيرالگوريتمها به خاطر حجم آنها و محدوديت کارشان ساده خواهد بود. 2) آزمايش درستي الگوريتم به آزمايش يک به يک زيرالگوريتم ها خلاصه شده و در نتيجه مشکل آزمايش الگوريتم نيز حل می گردد. بويژه، اگر اشتباهات احتمالي وجود داشته باشند، اصلاح آنها در هر زيرالگوريتم مستقل راحتتر و سريعتر انجام می گيرد. 3) از تکرار برخي بخشها در قسمتهاي مختلف برنامه، و در نتيجه از اتلاف وقت، جلوگيري می شود.4) هر زيرالگوريتم را می توان بطور مستقل براي استفاده هاي آتي در برنامه هاي ديگر، در حافظه هاي کمکي ذخيره نمود.

  5. ‼ يک زيرالگوريتم هيچ کاري انجام نمی دهدمگر اينکه يک زيرالگوريتم ديگر يا الگوريتم اصلي، که بعد از اين آن را الگوريتم (واحد) فراخوان خواهيم گفت، آن را فراخواند.در اينصورت, هيچ, يک, و يا چند مقدار به زيرالگوريتم داده شده و زيرالگوريتم شروع به اجرا می کند. در نتيجه اين اجرا، يا کاري انجام می شود (مثل خواندن و در حافظه ذخيره کردن، چاپ کردن، و يا يک پردازش ديگر) و يا يک يا چند مقدار به الگوريتم فراخوان باز می گردد.

  6. Data_Reader(a,b,c) Power(x,n) قاعده. در شروع يک زيرالگوريتم، نام آن به انضمام متغيرهاي ورودي به زيرالگوريتم و خروجي از آن را در داخل يک بيضي قرار می دهيم. مثلا اتمام الگوريتم را نيز با يک بيضی با نوشته Return اعلام خواهيم کرد.

  7. متغير هاي داخل پرانتز را آرگومانهاي صوريزيرالگوريتم می ناميم. اين آرگومانها بر دو دسته تقسيم می شوند. دسته اول، که آنها را پارامترهاي مقدار می ناميم، آرگومانهاي صوري ورودي به زيرالگوريتم می باشند؛ يعني مقادير را از الگوريتم فراخوان به زيربرنامه می آورند. دسته دوم، به نام پارامترهاي متغير، آرگومانهاي صوري خروجي از زيرالگوريتممیباشند؛ يعني مقاديري را که از اجراي زيرالگوريتم حاصل شده اند از آن خارج کرده و به الگوريتم فراخوان باز می گردانند.

  8. قاعده.وقتي اجراي يک زيرالگوريتم تمام شد، کنترل اجراي برنامه به موقعيت بعد از نقطه ای که از آنجا زيرالگوريتم فراخواني شده بود منتقل می شود.

  9. در ادامه خواهيم ديد که نوع زيرالگوريتمها، و همچنين نوع فراخواني آنها متفاوت است. ولي يک نکته در تمام اين فراخواني ها مشترک است و آن اينکه، ‼ در لحظه فراخواني يک زيرالگوريتم توسط الگوريتم فراخوان نام آن زيرالگوريتم به انضمام برخي متغيرها يا عبارتهايي ذکر می شود. مثلا Power(y,8).

  10. در Power(y,8) ، عبارتهاي داخل پرانتز را آرگومانهاي فعال می ناميم. آرگومانهاي فعال نيز به دو دسته ورودي به الگوريتم فراخوان و خروجي از آن تقسيم می شوند. آرگومانهاي ورودي به الگوريتم فراخوان حتما بايد متغيرانتخاب شوند. اين آرگومانها با پارامترهاي متغير (آرگومانهاي صوري خروجي از زيرالگوريتم) متناظر هستند. آرگومانهاي خروجي از الگوريتم فراخوان می توانند يک مقدار(متغير، ثابت، يا يک عبارت جبري) باشند. اين آرگومانها با پارامترهاي مقدار (آرگومانهاي صوري ورودي به زيرالگوريتم) متناظر می باشند.

  11. قاعده.تعداد، ترتيب، و نوع آرگومانهاي صوري بايد با تعداد، ترتيب و نوع آرگومانهاي فعال متناظر با آنها کاملا سازگار باشند.‼ آرگومانهای فعال و صوري متناظر می توانند همنام و يا غير همنام باشند.

  12. : اعشاریx : صحيح n Power(x,n) مثلا اگر در دستور معرف نوع آرگومانهاي x و n بصورتي که هست مشخص شده باشند، آنگاه به منظور فراخواني زيرالگوريتم براي مقدار اعشاري y (که فرض می شود از قبل در حافظه ذخيره شده) متناظر با آرگومان صوري x، و مقدار صحيح 8 متناظر با آرگومان صوري n، می توان فراخواني به صورت Power(y,8) را انجام داد ولي هيچيک از فراخواني هاي زير درست نمی باشند. Power(y,8.0) Power(8,y) Power(y)

  13. زيربرنامه

  14. در برنامه نويسی برگردان زيرالگوريتم را زيربرنامه (sub-program) و برگردان الگوريتم اصلي را برنامه اصلي (main program) می ناميم. موقعيت برنامه اصلي و يک زيربرنامه در برنامه نويسی پاسکال در نمودار (الف) صفحه بعد مشخص شده است.(از روی کتاب)

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

  16. ‼ دستور معرف برنامه اصلي، همان دستور; اسم برنامه Program است و دستورهاي معرف زيربرنامه ها بعداً مورد مطالعه قرار خواهند گرفت.

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

  18. در نمونه (ب: (

  19. ‼ اگر متغير موضعي يک زيربرنامه در حوزه عمل خود در يکي از زيربرنامه ها نوعش عوض شود آنگاه در آن زيربرنامه با همان نوع کار خواهد کرد.

  20. ‼ اگر متغيری هم در زيربرنامه و هم در يک واحد فراخوان خارجی آن استفاده شده باشد، آنگاه در صورتيکه استفاده آنها با هم تداخل نداشته باشند می توان به تعريف آن در واحد فراخوان (خارجی) اکتفا کرده و در زيربرنامه از تعريف مجدد آن صرفنظرنمود؛ ولی در صورتيکه استفاده آنها با هم تداخل داشته باشندبايد هم در زيربرنامه و هم در آن واحد فراخوان آن متغير را تعريف کرد؛ در غير اينصورت اثرات مخربی در نتايج خواهيم داشت که تشخيص و اصلاح آن بسيار مشکل است.

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

  22. در نمونه (ب: (

  23. زیرالگوريتمها به دو دسته تقسيم می شوند: 1. زيرالگوريتم تابع

  24. اين زيرالگوريتم را زماني بکار می بريم که بخواهيم تابعي بسازيم (تعريف کنيم) که اين تابع در فهرست توابع مترجم زبان برنامه نويسی موجود نباشد.

  25. قاعده.يک تابع، معمولاً، حداقل يک آرگومان صوري داشته و دقيقا يک مقدار به الگوريتم فراخوان باز می گرداند. اين مقدار بازگشتي توسط اسم خود تابع انجام می گيرد. به همين علت, براي تعريف مقدار تابع، اسم تابع بايد حداقل يک بار در سمت چپ يک دستور انتساب ظاهر شود تا مقدار تابع را در خود بگيرد. به علاوه، نوع نتيجه تابع نيز بايد تعيين گردد.

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

  27. قاعده.هيچيک از آرگومانهاي صوری تابع را ديگر نبايد در زيرالگوريتم تابع توسط دستورهاي خواندن بخوانيم. مقادير اين آرگومانها از طريق واحد فراخوان به زيرالگوريتم می آيند. همچنين مقدار تابع را نبايد در زيرالگوريتم چاپ کنيم. اين مقدار قرار است به واحد فراخوان بازگردد.

  28. تابع علامت signبرای يک عدد حقيقی x با ضابطه زير تعريف می شود:

  29. sign(x) x<0 sign← -1 x=0 sign←0 sign←1 Return

  30. قاعده.فراخواني توابع درست مثل استفاده از توابع تعريف شده براي مترجم هر زبان می باشد.همانطوريکه براي يک مقدار تعريف شده x در برنامه از تابع سينوس sin(x) استفاده می کنيم، از تابع sign(x) نيز به همان شکل استفاده می نماييم.

  31. Start y s←sign(sin(y)) t←sin(sign(y)) s≠t sign(x) s,t x<0 sign← -1 x=0 End sign←0 sign←1 Return

  32. قاعده.در برنامه نويسي، دستور معرف زيربرنامه هایتابع بصورت زير نوشته می شود:;نوع مقدار تابع): آرگومانهاي صوري(اسم تابعFunction

  33. ممکن است هيچ آرگومان صوري نداشته باشيم. چنين وضعيتی امکان دارد زمانی رخ دهد که بخواهيم مقداری را برای يک متغير بخصوصی تعريف کنيم. مثلاً در زيربرنامه تابع زير مقدار عدد نپری e تعريف می گردد: Functione:real;Begin e:=exp(1.0)End;

  34. اما، در صورت وجود آرگومانهای صوری، آنها به شکل زير (از چپ به راست) ظاهر خواهند شد.نوعدستهآخر:دستهآخر. . . ;نوعدسته2:دسته2;نوع دسته 1:دسته 1

  35. مثلا در دستور معرفFunction Pad(x,y:real;i,j,k:integer):char;دسته متغيرهای x و y از نوع حقيقی, و متغيرهای i , j , و k از نوع صحيح بوده, و نوع تابع Pad نيز کاراکتری می باشد.

  36. قاعده.هيچيک از آرگومانهاي صوري در يک زيربرنامه را ديگر نبايد در بلوک Var آن زيربرنامه تعريف کرد. به عبارت ديگر يک آرگومان صوري نمی تواند در عين حال يک متغير موضعي نيز باشد.

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

  38. {A program containing two units: A function sub-program called sign, and a main program}Program P4_1;Uses wincrt;Var y,t:real; s:integer;(*****************************)Function sign(x:real):integer;Begin If x<0 then sign:=-1 else if x=0 then sign:=0 else sign:=1End;{sign}(*****************************)Begin Write('Enter a real number: ');Readln(y); s:=sign(sin(y)); t:=sin(sign(y));If s<>t then begin Writeln('sign(sin(',y,')=',s);Writeln('sin(sign(',y,')=',t:8:4)end End.

  39. اينک به چگونگی اجرای برنامه دو واحدی بالا می پردازيم، ولی قبلا لازم است مطالبی در مورد حافظه زيربرنامه و برنامه اصلی بيان کنيم.

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

  41. ‼ حافظه موقت دو زيربرنامه در کامپيوتر کاملا از همديگر جدا هستند. بنابراين اگر يک متغير همنام در دو حافظه ظاهر شده باشد, آنگاه حافظه های اين دو متغير همنام هيچ برخوردي با هم نخواهند داشت زيرا وقتي يک زيربرنامه اجرايش تمام می شود حافظه موقت مربوط به آن از حافظه کامپيوتر پاک می شود. پس برخوردي وجود نخواهد داشت. اين مطلب براي حافظه موقت و حافظه دائمي نيز معتبر است.

  42. Program P4_1;Uses wincrt;Var y,t:real; s:integer;(*****************************)Function sign(x:real):integer;Begin If x<0 then sign:=-1 else if x=0 then sign:=0 else sign:=1End;{sign}(*****************************)Begin Write('Enter a real number: ');Readln(y); s:=sign(sin(y)); t:=sin(sign(y));If s<>t then begin Writeln('sign(sin(',y,')=',s);Writeln('sin(sign(',y,')=',t:8:4)end End. -0.544 x Sin(10) : - 0.544 10.0 y -1 s t

  43. Program P4_1;Uses wincrt;Var y,t:real; s:integer;(*****************************)Function sign(x:real):integer;Begin If x<0 then sign:=-1 else if x=0 then sign:=0 else sign:=1End;{sign}(*****************************)Begin Write('Enter a real number: ');Readln(y); s:=sign(sin(y)); t:=sin(sign(y));If s<>t then begin Writeln('sign(sin(',y,')=',s);Writeln('sin(sign(',y,')=',t:8:4)end End. 10.0 y -1 s t

  44. Program P4_1;Uses wincrt;Var y,t:real; s:integer;(*****************************)Function sign(x:real):integer;Begin If x<0 then sign:=-1 else if x=0 then sign:=0 else sign:=1End;{sign}(*****************************)Begin Write('Enter a real number: ');Readln(y); s:=sign(sin(y)); t:=sin(sign(y));If s<>t then begin Writeln('sign(sin(',y,')=',s);Writeln('sin(sign(',y,')=',t:8:4)end End. 10.0 x Sin(1) : 0.841 10.0 y -1 s 0.841 t

  45. Program P4_1;Uses wincrt;Var y,t:real; s:integer;(*****************************)Function sign(x:real):integer;Begin If x<0 then sign:=-1 else if x=0 then sign:=0 else sign:=1End;{sign}(*****************************)Begin Write('Enter a real number: ');Readln(y); s:=sign(sin(y)); t:=sin(sign(y));If s<>t then begin Writeln('sign(sin(',y,')=',s);Writeln('sin(sign(',y,')=',t:8:4)end End. 10.0 y -1 s 0.841 t

  46. قاعده.در زيربرنامه هاي تابع, اسم تابع به تنهايي (بدون ذکر آرگومانهايش) نبايد در سمت راست هيچ دستور انتسابي ظاهر شود.مثلا در بدنه تابعي که با دستور معرف Function Power(x:real;n:integer):realتعريف شده است, نوشتن دستوري مثل دستور زير غير مجازاست:Power:=Power*x;

  47. زیرالگوريتمها به دو دسته تقسيم می شوند: 1. زيرالگوريتم تابع2. زيرالگوريتم رويه

  48. هنگامي که بخواهيم در زيرالگوريتم کاري مثل چاپ، خواندن داده ها و ذخيره کردن آنها در حافظه، و يا هر پردازش ديگر انجام گيرد, و يا زماني که لازم باشد بيش از يک مقدار از زيرالگوريتم به الگوريتم فراخوان باز گردد، از زيرالگوريتم رويه(procedure) استفاده می کنيم.

  49. طريقه تنظيم اين زيرالگوريتم مثل زيرالگوريتم تابع است ولي با توجه به اينکه اينجا، اسم زيرالگوريتم هيچ مقداري را با خود به الگوريتم فراخوان باز نمی گرداند؛ پسقاعده.در طول زيرالگوريتم رويه اسم آن نبايد ظاهر شود.

  50. Heading يک عنوان Return Procedure Heading;Begin Writeln('******************************************'); Writeln('* Sub-program to investigate the roots *'); Writeln('* of the equation a*x^2+b*x+c=0 *'); Writeln('******************************************')End;{Heading} هيچ آرگومان صوری نداريم

More Related