1 / 91

آرايه های يک بعدی

آرايه های يک بعدی. شکل بالا هشت متغير را نشان می دهد که نام همه آنها يکی بوده و فقط انديسشان متفاوتند. اين متغيرها را در بررسيهای نظری به صورت u 1 ، u 2 ، u 3 ، ...، u 8 می نويسيم.

yardley-kim
Télécharger la présentation

آرايه های يک بعدی

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. شکل بالا هشت متغير را نشان می دهد که نام همه آنها يکی بوده و فقط انديسشان متفاوتند. اين متغيرها را در بررسيهای نظری به صورت u1، u2، u3، ...، u8مینويسيم.

  3. تعريف آرايه ها در برنامه نويسی پاسکال به دو روش انجام می گيرد. روش اول.توسط نام آرايه، انديس آغازي و پاياني، و نوع اعضاي آرايه در بلوک Var. مثلاً Varu: array[1..8] of integer;A: array[1..3,1..5] of real; uرا يک آرايه يک بعدی صحيح 8 عضوی و Aرا يک آرايه دوبعدی حقيقي 3 در 5 عضوی تعريف می کند.‼ می توانيم آرايه يک بعدی رابردارو آرايه دوبعدی راماتريس تصور کنيم.

  4. u:[1..8] of integer A:[1..3,1..5] of real در الگوريتم نويسی، بدون توجه به نوع يک آرايه، آن را توسط نام آن و انديسهاي آغازي و پاياني در داخل يک مستطيل نقطه چين، به عنوان توضيح جانبی، تعريف می کنيم. مثلاً آرايه های u و A به روش بالا را، در الگوريتم، به صورت زير تعريف می کنيم:البته، اگر تاکيد روی نوع آرايه مهم نباشد می توان آن را حذف کرد.

  5. روش دوم.ابتدا يک نوع داده آرايه ای يا به طور خلاصه نوع آرايه ایبا مشخص کردن انديس هاي آغازي و پاياني و نوع اعضاي آن در بلوک Type تعريف می کنيم. مثلاً در Type integerVec=array[1..8] of integer;realMat=array[1..3,1..5] of real; دو نوع آرايه ای تعريف شده: نوع integerVecکه برداري هشت مولفه ای با مولفه هاي صحيح است و نوع realMat که يک ماتريس حقيقي 3 در 5 می باشد.

  6. integerVec=[1..8] of integer realMat=[1..3,1..5] of real تعريف نوع آرايه ای بالا را در الگوريتم به صورت زير انجام می دهيم:اينجا نيز، اگر تاکيد روی نوع آرايه مهم نباشد می توان آن را حذف کرد.

  7. u:integerVec A:realMat سپس در بلوک Var، متغير هاي مورد نظر را از انواع آرايه اي از قبل تعريف شده در بلوک Type معرفي می کنيم. مثلاً اگر بخش VAR u: integerVec; A: realMat; را به بخش بالا ضميمه کنيم آنگاه با بخش مذکور در روش اول معادل خواهد بود:

  8. Varu: array[1..8] of integer;A: array[1..3,1..5] of real; u:[1..8] of integer A:[1..3,1..5] of real Type integerVec=array[1..8] of integer;realMat=array[1..3,1..5] of real;VARu: integerVec;A: realMat; integerVec=[1..8] of integer realMat=[1..3,1..5] of real u:integerVec A:realMat

  9. ‼ ملاحظه می شود که، وقتي يک نوع آرايه ای در بلوک Type تعريف می کنيم، اين نوع، رفتاري مشابه انواع استاندارد مثل integerوreal از خود نشان می دهد.‼ تعريف آرايه ها، به عنوان توضيح جانبی، در الگوريتم نويسی اجباری نيست ولی اين کار، اگر به برنامه نويسی پاسکال منجر شود، به طور اکيد توصيه می شود. طبيعی است که اين توضيحات جانبی در زبانهای ديگر متفاوت خواهند بود.

  10. ‼ رشته نيز يک آرايه، به نام آرايه فشرده، به حساب می آيد. برای شفاف شدن اين موضوع لازم است گفته شود که وقتی می نويسيمVar S: string[8];در واقع مثل اين است يک آرايه يک بعدی با اعضايي که همه کاراکتر هستند، تعريف نماييم:Var S: array[1..8] of char;بنابراين، رشته ها را می توانيم به عنوان نوع آرايه ای نيز بکارببريم:Type str8=string[8];Var S:str8;بدين ترتيب می توانيم حتی دستور معرفی مثل دستور زير داشته باشيم:Function No_Blank(s:str8):str8;در حاليکه به جای تعيين نوع آرگومان صوریsنمی توانيمstring[8] را داشته باشيم.

  11. ‼ اگر منظور از تعريف يک آرايه، استفاده معمولی بوده و برای تعيين نوع هيچ آرگومانی بکار نخواهد رفت، روش ساده اول توصيه می شود؛ ولی اگر از آن برای تعيين نوع آرگومانهااستفاده گردد، بايد از روش دوم استفاده کرد.مثلا در دستور معرف زيربرنامه ای به صورت Procedure WriteIVec(v:integerVec;n:integer);نوع آرايه ای integerVec براي تعيين نوع آرگومان v (که در نقش يک بردار خواهد بود) مورد استفاده قرار گرفته است. در حاليکه دستور معرفProcedure WriteIVec(v:array[1..8] of integer;n:integer);غير مجاز می باشد.

  12. ‼ وقتي يک آرگومان صوري در دستور معرف يک زيربرنامه به صورت نوع آرايه ای تعريف می شود، اگر بعد (ابعاد) اين آرگومان در طول آن زيربرنامه متغير باشد (باشند) آنگاه بايد اين متغير(ها) را نيز در فهرست آرگومانهاي ظاهري ازنوع integer تعريف نمود. مثلاً در دستور معرفProcedure MatSum(A,B:realMat;var C:realMat;m,n:integer);دو آرگومان صوری m و n، به عنوان ابعاد متغير ماتريسهای حقيقی A ، B ، و c، از نوع integer معرفی شده اند.

  13. ‼ در بلوک هاي Var و Type نمی توان انديسهاي آغازي و پاياني يک آرايه را به صورت متغير نوشت مگر اينکه آن متغير قبلا در بلوک Const تعريف شده باشد. لازم به ذکر است که اولويت قرار گرفتن اين سه بلوک در برنامه به ترتيب Const ،Type ، و Varاست.

  14. ‼ وقتي يک نوع آرايه ای در بلوک Type تعريف می شود، تمام متغيرها (و آرگومانها) که بعداً با اين نوع تعريف می شوند بايد داراي ابعادي در محدوده ابعاد پايه در بلوک Type باشند. مثلا نوع آرايه ای realMat در بالا را، که يک ماتريس 3 در 5 با درايه های حقيقی بود، در نظر می گيريم. در اينصورت می توان يک ماتريس 3 در 4 يا 2 در 3 را با اين نوع آرايه ای تعريف و استفاده نمود ولي يک ماتريس 5 در 5 را نمی توان.‼ در ارتباط با نکته بالا، به اين نکته هم بايد توجه داشت که دو نوع داده ای همنام نمی توانيم تعريف کنيم. مثلا مورد زير غير مجاز است:Type realMat=array[1..3,1..5] of real; realMat=array[1..4,1..6] of real;

  15. براي n عدد ميانگين M و واريانس V از فرمولهاي زير محاسبه می شوند:يک الگوريتم بنويسيد كه ابتدا يک عدد صحيح n>1 را بخواند. سپس nعدد را خوانده و ميانگين و واريانس آنها را محاسبه و چاپ كند.

  16. sum1←0 sum2←0 i=1,n x sum1←sum1+x sum2←sum2+x*x ابتدا الگوريتمي می نويسيم که در آن از آرايه ها استفاده نشده باشد. براي اين کار، عددي را که در هر بار قرار است خوانده شود با x نشان داده و براي مجموع xها و مجموعx2ها، که جمعهاي تکراري هستند، بترتيب متغيرهاي sum1وsum2 بكار می بريم.يک حلقه خودکار بکار برده و قبل از حلقه برای sum1 و sum2 مقادير اوليه 0نسبت می دهيم. کاری که در هر بار تکرار حلقه انجام می دهيم اين است که پس از خواندن x ، جمعهاي تکراري sum1 وsum2 رامحاسبه می کنيم.

  17. Start n sum1←0 sum2←0 i=1,n M←sum1/n V←(sum2-n*M*M)/(n-1) x sum1←sum1+x sum2←sum2+x*x M,V End Program P7_1_A;Uses wincrt;Var x,sum1,sum2,M,V:real; i,n:integer;Begin Write('First enter an integer n>1: ’); Readln(n); sum1:=0; sum2:=0; write('Now enter n numbers: '); For i:=1 to 60 do begin Read(x); sum1:=sum1+x; sum2:=sum2+x*x end; M:=sum1/n; V:=(sum2-n*M*M)/(n-1); writeln('Mean: ',M:7:2,' Variance: ',V:7:2)End. پس از خروج از حلقه نيز، M و V را محاسبه و چاپ می کنيم. توضيحات اخير در نمودار زير به قالب الگوريتم در آمده اند.

  18. Start x:[1..60] of real n sum1←0 sum2←0 i=1,n M←sum1/n V←(sum2-n*M*M)/(n-1) x[i] sum1←sum1+x[i] sum2←sum2+x[i]*x[i] M,V End حال از آرايه ها براي نوشتن اين الگوريتم استفاده می کنيم. براي اين منظور، يك بردار 60 مولفه ای به نام x را تعريف كرده و از متغيرهاي انديسدار (مولفه هاي اين بردار) در محاسبه استفاده می كنيم. بدين ترتيب نمودار زير حاصل می شود. Program P7_1_B;Uses wincrt;Varx:array[1..60] of real; sum1,sum2,M,V:real; i,n:integer;Begin Write('First enter an integer n>1: ’); Readln(n); sum1:=0; sum2:=0; write('Now enter the numbers: '); For i:=1 to 60 do begin Read(x[i]); sum1:=sum1+x[i]; sum2:=sum2+x[i]*x[i] end; M:=sum1/n; V:=(sum2-n*M*M)/(n-1); writeln('Mean: ',M:7:2,' Variance: ',V:7:2)End.

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

  20. Start a,b:[1..20] i=1,20 a[i] i=1,20 b[21-i]←a[i] i=1,20 a[i] i=1,20 b[i] End الگوريتم و برنامه خواسته شده را طوری ترتيب می دهيم كه اعضاي يك آرايه 20 عضوي به نام a را خوانده و سپس اين اعضا را به ترتيب وارون (از آخر به اول) در يك آرايه ديگر 20 عضوي به نام bقرار دهد. سپس اين دو آرايه را بطور جداگانه چاپ كند.پس از معرفي بردارهاي 20 مولفه ای aو b، ابتدا مولفه هاي بردار a را می خوانيم. سپس مولفه هاي a را به ترتيب وارون در b قرار داده، و بعد هر دو بردار را چاپ می کنيم.

  21. integerVec=[1..20] a,b:integerVec Start Start a,b:[1..20] i=1,20 i=1,20 a[i] a[i] b[21-i]←a[i] i=1,20 b[21-i]←a[i] i=1,20 a[i] i=1,20 a[i] i=1,20 b[i] End i=1,20 b[i] End در نمودار قبل می توان دو حلقه اول را در هم ادغام کرد. در اينصورت در يک حلقه بطور همزمان a[i]خوانده شده و بلافاصله در عضو b[21-i]ذخيره می گردد.

  22. integerVec=[1..20] a,b:integerVec Start i=1,20 a[i] b[21-i]←a[i] i=1,20 a[i] i=1,20 b[i] End Program P7_2;Uses wincrt;Type integerVec=array[1..20] of integer;Var a,b:integerVec; i:integer;Begin Write('Enter the entries of the array: '); For i:=1 to 20 do begin Readln(a[i]); b[21-i]:=a[i] end; Write('The initial array is: '); For i:=1 to 20 doWrite(a[i]:4);Writeln; Write('The deformed array is: '); For i:=1 to 20 doWrite(b[i]:4)End.

  23. ReadIVec(v,n) WriteIVec(v,n) i=1,n i=1,n v[i] v[i] Return Return در دو نمودار قبل و همچنين در برنامه بالا ملاحظه می کنيم که کار چاپ آرايه توسط يک حلقه خودکار در دو جا تکرار شده است. به طور کلي براي صرفه جويي در وقت الگوريتم نويسی و حجم الگوريتم، از اين به بعد، براي خواندن و چاپ اعضاي بردارها (آرايه هاي يک بعدي) می توانيم از زيرالگوريتم (زيربرنامه)هايي به اين منظور استفاده کنيم: Procedure ReadIVec(var v:integerVec;n:integer);Var i:integer;Begin For i:=1 to n do Read(v[i]) End{ReadIVec}; Procedure WriteIVec(v:integerVec;n:integer);Var i:integer;Begin For i:=1 to n do Write(v[i]:4) End{WriteIVec};

  24. مشابه زيرالگوريتمهاي بالا به اسامي ReadRVec و WriteRVec براي حالت حقيقي مورد استفاده قرار خواهند گرفت. زيربرنامه هاي اين چهار زيرالگوريتم بشرح زير هستند: ‼ زيربرنامه WriteIVec براي چاپ اعضاي آرايه هاي صحيح و زيربرنامه WriteRVec براي چاپ اعضاي آرايه هاي حقيقی مورد استفاده قرار می گيرند. در هنگام استفاده از آنها، بسته به اندازه داده ها، فرمت را، اگر لازم باشد، تغيير دهيد. Procedure ReadIVec(var v:integerVec;n:integer);Var i:integer;Begin For i:=1 to n do Read(v[i]) End{ReadIVec};Procedure ReadRVec(var v:realVec;n:integer);Var i:integer;Begin For i:=1 to n do Read(v[i]) End{ReadRVec};Procedure WriteIVec(v:integerVec;n:integer);Var i:integer;Begin For i:=1 to n do Write(v[i]:4) End{WriteIVec};Procedure WriteRVec(v:realVec;n:integer);Var i:integer;Begin For i:=1 to n do Writeln(v[i]:6:2)End{WriteRVec};

  25. ‼ نوع آرايه هاي integerVec و realVecبايد قبلا در واحدي قابل دسترس (معمولا واحد اصلي) در بلوک Type تعريف شده باشند.‼ در زيربرنامه هاي ReadIVec و ReadRVecوجود مشخصه var قبل از آرگومان صوري v انکار ناپذيراست. در حقيقت اعضاي v که در اين زيربرنامه خوانده می شوند در حافظه موقت، مختص همان زيربرنامه، ذخيره می گردند و بلافاصله پس از اتمام اين زيربرنامه، حافظه موقت پاک می گردد. بنابراين اگر var وجود نداشته باشد آنگاه آنچه که ذخيره شده ، بلافاصله پس از اتمام اجراي زيربرنامه از بين خواهند رفت.

  26. Start a,b:[1..20] Start a,b:[1..20] i=1,20 a[i] ReadIVec(a,20) i=1,20 i=1,20 b[21-i]←a[i] b[21-i]←a[i] WriteIVec(a,20) i=1,20 a[i] WriteIVec(b,20) i=1,20 End b[i] End با توجه به زيرالگوريتمهاي بالا، نمودار سمت چپی را می توان بصورت ساده سمت راستی نوشت.

  27. الگوريتمی بنويسيد كه اعضای يک آرايه صحيح 20 عضوی را خوانده و بدون استفاده از هيچ آرايه ديگر، آنها را به ترتيب وارون (از آخر به اول) چاپ کند.

  28. integerVec=[1..20] a:integerVec Start ReadIVec(a,20) i=1,10 a[i]←→a[21-i] WriteIVec(a,20) End روشي كه در اين الگوريتم استفاده می شود تعويض مقادير اعضاي با انديسهای متقارنa[i]و a[21–i] با استفاده از الگوريتم ماهي طلايي است. قابل ذکر است که ابتدا بايد اعضاي a بطور کامل خوانده شوند و سپس پردازش تعويض اعضاي با انديس متقارن انجام گيرد Program P7_3;Uses wincrt;Type integerVec=array[1..20] of integer;Var a:integerVec; i,t:integer;(**********************************************)Procedure ReadIVec(var v:integerVec;n:integer);Begin For i:=1 to n do Read(v[i])End;{ReadIVec}(**********************************************)Procedure WriteIVec(v:integerVec;n:integer);Begin For i:=1 to n do Write(v[i]:3)End;{WriteIVec}(*******************************************)Begin Write('Enter the entries of the array: '); ReadIVec(a,20); For i:=1 to 10 do begint:=a[i]; a[i]:=a[21-i]; a[21-i]:=t end; Writeln('The reordered array is:'); WriteIVec(a,20)End. سؤال. اگر در حلقه، به جای پارامتر نهايي 10عدد 20 می نوشتيم، نتيجه چه می شد؟سؤال. اگر آرايه 21 عضو داشت پارامتر نهايي چه بايد می بود؟

  29. يک الگوريتم بنويسيد كه اعضاي يك آرايه 20 عضوي به نام a را خوانده وسپس اعضاي منفي را در آرايه ای به نام b و اعضاي نامنفي را در آرايه ای به نام c قرار دهد. آنگاه اعضاي آرايه هاي b و c را چاپ كند.

  30. چون در ابتدا معلوم نيست كه b و c چه تعداد عضو دارند، آنها را 20 عضوي ايجاد می كنيم. روش ما روش مقايسه عضو به عضو آرايه است تا اينکه مقادير منفي در b و مقادير نامنفي در cقرار داده شوند. تنها مسئله ای كه در اينجا بايد مورد توجه قرار گيرد آن است كه اعضاي منفي و نامنفي را به طور مستقل شمارش كنيم تا تعداد اعضاي آرايه هاي b و cمشخص گردد. براي اين منظور از دو انديس سازnb و nc، به ترتيب، برای ساختن انديسهاي b و c در نظر می گيريم. اينها شمارنده هايي هستند که کارشان ساختن انديس است تا بلافاصله مقداری مورد نظر در عضو آرايه، با انديس ساخته شده، قرار داده شود.

  31. integerVec=[1..20] a,b,c:integerVec Start nb←0 nc←0 i=1,20 a[i] a[i]<0 nc←nc+1 c[nc]←a[i] nb←nb+1 b[nb]←a[i] WriteIVec(b,nb) writeIVec(c,nc) End به محض اينکه انديسي از b (يا c) ساخته می شود عضو منفي (يا نامنفي) a[i] در آرايه b (يا c) با همان انديس قرار می گيرد

  32. n max←n c←1 integerVec=[1..50] u:integerVec Start n ReadIVec(u,50) c←c+1 max←u[1] n>max i=2,50 u[i]>max max←n max End max←u[i] c≥50 max End در الگوريتم روبرو (فصل 1) براي پيدا كردن بزرگترين عدد از بين 50 عدد خوانده شد، ابتدا اولين عدد را خوانده و براي max داديم. سپس با يك حلقه پردازش لازم را انجام نموديم. اين كار با استفاده از يك آرايه خيلي ساده تر انجام می گيرد. Program P7_5;Uses Wincrt;Type integerVec=array [1..50] of integer;Var u:integerVec; i,max:integer;(**********************************************)Procedure ReadIVec(var v:integerVec;n:integer);Begin For i:=1 to n do Read(v[i])End;{ReadIVec}(**********************************************)Begin Write('Enter the entries of the array: '); ReadIVec(u,50); max:=u[1]; For i:=2 to 50 do If u[i]>max then max:=u[i]; Write('The maximum member is: ',max)End.

  33. integerVec=[1..50] u:integerVec Start ReadIVec(u,50) max←u[1] i=2,50 u[i]>max max End max←u[i] max(u,n) integerVec=[1..50] u:integerVec Start max←u[1] ReadIVec(u,50) i=2,n u[i]>max max(u,50) Return max←u[i] End حال کار پيدا کردن maxرا به يک زيرالگوريتم به نام max داده و آن را به يک زيرالگوريتم و يک الگوريتم اصلی تفکيک می کنيم:

  34. max(u,n) max←u[1] i=2,n u[i]>max Return max←u[i] Function IMax(u:integerVec;n:integer):integer;Var i:integer;Begin IMax:=u[1]; For i:=2 to n do If u[i]>IMax then IMax:=u[i]End{IMax};Function RMax(u:realVec;n:integer):real;Var i:integer; Begin RMax:=u[1]; For i:=2 to n do If u[i]>RMax then RMax:=u[i]End{RMax};

  35. integerVec=[1..50] u:integerVec Start integerVec=[1..50] u:integerVec Start ReadIVec(u,50) i=1,50 max←u[1] max u[i] i=2,50 End i=1 max←u[i] u[i]>max max End u[i]>max max←u[i] max←u[i] در الگوريتم سمت چپ، ابتدا توسط يك زيرالگوريتم اعضاي آرايه خوانده می شد. سپس اولين عضو به max نسبت داده شده و كار مقايسه و جايگزيني توسط يك حلقه خودكار انجام می گرفت. اين دو کار را می توان در يك حلقه خودكار ادغام كرد

  36. integerVec=[1..50] u:integerVec Start integerVec=[1..50] u:integerVec i=1,50 Start max u[i] i=1,50 End i=1 max←u[i] u[i] max i=1 or u[i]>max End u[i]>max max←u[i] max←u[i] حال به کمک قاعده ادغام شرط ها توسط عملگر or (فصل 3)، دو شرط موجود در نمودار سمت چپی را ادغام نموده و نمودار سمت راستی را می سازيم.

  37. زيرالگوريتمی بنويسيد كه هر بار شماره دانشجويي و معدل يكي از 40 دانشجوي يك كلاس را بخواند. سپس يك شماره دانشجويي خوانده و در صورتيكه دانشجوي مورد نظر در بين چهل دانشجوي خوانده شده باشد معدل وي را چاپ كند. در غير اينصورت پيغام Not in list چاپ شود.

  38. n:[1..40] of integer a:[1..40] of real Start i=1,40 n[i],a[i] m ابتدا شماره دانشجويي و معدل دانشجويان را خوانده و به ترتيب در آرايه هاي n و a ذخيره می سازيم. سپس شماره مورد نظر را به اسم m خوانده و به کمک يک سويچ آن را در بين شماره ها جستجو می کنيم.

  39. m s←0 i=1,40 n[i]=m s=0 s←1 a[j] ‘Not in list’ j←i End براي اين کار، از يک حلقه خودکار با متغير i استفاده می کنيم. قبل از حلقه، سويچ را در وضعيت خاموش قرار می دهيم. در داخل حلقه، هرگاه m در بين n[i]ها باشد (با يکي از آنها برابر باشد) سويچ تبديل وضعيت می دهد. پس از خروج از حلقه نيز تصميم لازم بر حسب وضعيت سويچ گرفته می شود. فقط يک نکته باقي مانده و آن اينکه آن انديس i را که در آن m با يکي از a[i]ها برابر گشته بايد در يک متغير، اينحا j ، نگه داريم (ذخيره سازيم) تا پس از خروج از حلقه بتوانيم معدل مربوط به آن انديس، يعني a[j]، را چاپ کنيم.

  40. n:[1..40] of integer a:[1..40] of real Start i=1,40 n[i],a[i] m s←0 i=1,40 n[i]=m s=0 s←1 a[j] ‘Not in list’ j←i End Program P7_6_A;Uses Wincrt;Var n:array[1..40] of integer; a:array[1..40] of real; i,j,s,m:integer;Begin Write('Enter the ID and the averages of the students: '); For i:=1 to 40 do Read(n[i],a[i]); Write('Enter the ID of the student you want to search: '); Readln(m); s:=0; For i:=1 to 40 do If n[i]=m then begin j:=i; s:=1 end; If s=0 then Writeln('The student is not in the list') else Writeln('The average of the student is: ',a[j])End.

  41. n:[1..40] of integer a:[1..40] of real Start i=1,40 n[i],a[i] m i=1,40 n[i]=m ‘Not in list’ a[i] End Halt Program P7_6_B;Uses Wincrt;Var n:array[1..40] of integer; a:array[1..40] of real; i,m:integer;Begin Write('Enter the ID and the averages of the students: '); For i:=1 to 40 do Read(n[i],a[i]); Write('Enter the ID of the student you want to search: '); Readln(m); For i:=1 to 40 do If n[i]=m then begin Writeln('The average of the student is: ',a[i]); Halt end; Writeln('The student is not in the list')End. به روش ديگر نيز می توان الگوريتم قبل را ترتيب داد: در داخل يک حلقه خودکار، با استفاده از يک قالب شرطی بريده توقف، به محض اينکه آن شماره دانشجويي با يکی از شماره های 40 دانشجو برابر باشد معدل آن دانشجو را چاپ و الگوريتم را متوقف می کنيم. در غير اينصورت، پس از خروج از حلقه پيغام گفته شده را چاپ می کنيم.

  42. s(m,a,n) s←0 i=1,n Return m=a[i] S←1 n:[1..40] of integer a:[1..40] of real Start i=1,40 n[i],a[i] m s←0 i=1,40 n[i]=m s=0 s←1 a[j] ‘Not in list’ j←i End در الگوريتم قبل از يک سويچ براي جستجوي يک عدد در بين اعضاي يک آرايه استفاده شد. زيرالگوريتم تابع نمودار زير يک مقدار صحيح m و يک آرايه صحيح n عضوی به نام a را گرفته و در صورتی که m در بين اعضای آرايه باشد مقدار 1 و در غير اينصورت مقدار 0 را به واحد فراخوان بازمی گرداند.

  43. s(m,a,n) s←0 i=1,n Return m=a[i] S←1 در واقع، سويچ s (اينجا اسم تابع) درصورتی که m با (حداقل) يکی از اعضای آرايه برخورد کند مقدار 1 به خودش می گيرد (روشن می شود). در غير اينصورت همچنان 0 (خاموش) باقی می ماند. اين زيرالگوريتم را بارها در متن درس و همچنين حل تمرينها به نام زيرالگوريتم تابع جستجو بکار خواهيم برد. برگردان اين زيربرنامه بصورت زير است: Function s(m:integer; a:integerVec; n:integer):integer;Var i:integer;Begin s:=0; For i:=1 to n do If m=a[i] then s:=1End; البته، می توان در داخل حلقه بعد از S←1با Exit خروج از زيربرنامه انجام داد.

  44. s(m,a,n) s←0 i=1,n n:[1..40] of integer a:[1..40] of real Return Start m=a[i] S←1 i=1,40 n[i],a[i] m s(m,n,40)=0 ‘Founded’ ‘Not founded’ End الگوريتم اصلی زير، ابتدا شماره دانشجويي و معدل 40 دانشجوي يك كلاس را می خواند. سپس يك شماره دانشجويي خوانده و در صورتيكه دانشجوي مورد نظر در بين چهل دانشجوي خوانده شده باشد پيغام Founded و در غير اينصورت Not founded چاپ می کند. Program P7_7;Uses Wincrt;Type realVec=array[1..40] of real;Var n:array[1..40] of integer; a:realVec; i,m:integer;(******************************************************)Function s(m:integer; a:realVec; n:integer):integer;Begin s:=0; For i:=1 to n do If m=a[i] then s:=1End;(******************************************************)Begin Write('Enter the ID and the averages of the students: '); For i:=1 to 40 do Read(n[i],a[i]); Write('Enter the ID of the student you want to search: '); Readln(m); If s(m,n,40)=0 then Writeln('The student is not in the list') else Writeln('The student is in the list')End.

  45. يک الگوريتم ترتيب دهيد كه اعضاي يك آرايه 20 عضوي a را خوانده و سپس اعضای آن را، پس از حذف تکراری ها، به ترتيب در آرايه ديگر b بريزد؛ به عبارت ديگر، اعضای b همان اعضای a ، با همان ترتيب، هستند بدون تکرار. در نهايت آرايه های a و b را جداگانه چاپ كند.

  46. integerVec=[1..20] a,b:integerVec Start ReadIVec(a,20) b[1]←a[1] n←1 i=2,20 s(a[i],b,n)=0 WriteIVec(a,20) n←n+1 b[n]←a[i] WriteIVec(b,n) End روش ما در اين الگوريتم بصورت زير خواهد بود: n را انديس ساز b در نظر می گيريم. ابتدا a[1] را به b[1] می ريزيم. سپس در يک حلقه خودکار با مشخصات i=2,20، يک عضو a[i] را برداشته و با استفاده از زيرالگوريتم تابع جستجو، آن را در بين اعضايي از b که تا کنون ساخته شده اند جستجو می کنيم.در صورتيکه a[i] در بين اين اعضا يافت نشود انديس ساز b يک انديس جديد ساخته و اين عضو برداشته شده در آرايه b با اين انديس ساخته شده ريخته می شود.

  47. integerVec=[1..20] a,b:integerVec Start ReadIVec(a,20) b[1]←a[1] n←0 i=1,20 s(a[i],b,n)=0 WriteIVec(a,20) n←n+1 b[n]←a[i] WriteIVec(b,n) End الگوريتم بالا را به صورت زير بهينه سازی می کنيم: دستورعمل a[1]←b[1] را حذف کرده و مقدار اوليه n را 0 ، و پارامتر اوليه i را 1 می گيريم. در اينصورت در تکرار اول حلقه داخلی، ناسازگاری پارامترها سبب می گردد که انديس ساز n برابر 1 گشته و a[1] به b[1] منتسب گردد.

  48. Program P7_8;Uses wincrt;Type integerVec=array[1..20] of integer;Var a,b:integerVec;i,n:integer;(**********************************************)Procedure ReadIvec(var v:integerVec;n:integer);Begin For i:=1 to n do Read(v[i])End;{ReadIvec}(**********************************************)Procedure WriteIvec(v:integerVec;n:integer);Begin For i:=1 to n do Write(v[i]:4)End;{WriteIvec}(******************************************************)Function s(m:integer; a:integerVec; n:integer):integer;Vari:integer;Begin s:=0; For i:=1 to n do If m=a[i] then s:=1End;(******************************************************)Begin ReadIVec(a,20);n:=0; For i:=1 to 20 do If s(a[i],b,n)=0 then begin n:=n+1; b[n]:=a[i] end; WriteIVec(a,20); WriteIVec(b,n)End. ! برنامه الگوريتم بهينه يافته

  49. در فصل 4 توضيح داديم که اگر يک متغير هم در زيربرنامه و هم در واحد فراخوان آن استفاده شده باشد، آنگاه در صورتيکه استفاده آنها با هم تداخل داشته باشند بايد به تعريف آن متغير در هر دو واحد زيربرنامه و فراخوان مبادرت ورزيد. در غير اينصورت، يعني اگر اين متغير فقط در واحد فراخوان تعريف شده باشد، اثرات مخربي را در نتايج ظاهر خواهد ساخت بدون آنکه اعلام خطايي صورت گيرد. براي شفافتر شدن اين نکته، تعريف متغير i را در واحد زيربرنامه تابع s در برنامه P7_8 پاک کرده و نتايج آن را با نتايج اصلي مقايسه کنيد!

  50. يک الگوريتم بنويسيد كه اعضاي يك آرايه 20 عضوي به نام aرا خوانده و اعضاي تكراري اين آرايه را در آرايه ديگر b ريخته و سپس b را چاپ كند (چاپهاي اضافی پذيرفته نيست).

More Related