مشاهده

Download Report

Transcript مشاهده

‫فصل ‪6‬‬
‫بسته بندی‬
‫‪1‬‬
‫مقدمه‬
‫تمام فعالیتهای طراحی را می توان به عنوان طراحی‬
‫مشخصات نوع داده (ایجاد انواع داده جدید) در نظر گرفت‬
‫یعنی ‪:‬‬
‫• طراحی صفات نوع داده(عناصر شی داده)‬
‫• عملیات موردنیاز(عملیات بر روی شی داده)‬
‫چهار روش ایجاد انواع داده جدید و عملیات بر روی آنها‪:‬‬
‫– ساختمان داده‬
‫– زیربرنامه ها‬
‫– اعالن نوع‬
‫– وراثت‬
‫‪2‬‬
‫ساختمان داده ها‬
‫‪ .1‬از نظر مجازی تمام زبان ها خواصی برای ایجاد اشیا داده‬
‫پیچیده از انواع داده اولیه دارند‪.‬‬
‫‪ .2‬ساختمان داده شی داده ی مرکب از اشیا داده دیگری‬
‫است‪(.‬عنصر ارایه می تواند عدد‪،‬رکورد‪،‬رشته کاراکتری یا ارایه‬
‫دیگری باشد‪).‬‬
‫‪ .3‬برای توصیف هر گونه ساختمان داده به یک توصیفگر نیاز‬
‫است که مشخصات ان را تعیین کند‪.‬‬
‫‪ .4‬ساختمان داده های مهم عبارتند از‪:‬ارایه ها‪/‬رکوردها‪/‬پشته‬
‫ها‪/‬لیست ها‪/‬مجموعه ها‬
‫ایجاد اشیا داده غیر همگن‪:‬‬
‫رکوردها‬
‫ایجاد اشیا داده‬
‫همگن‪:‬لیست‬
‫ها‪/‬مجموعه ها‪/‬ارایه ها‬
‫‪3‬‬
‫زیر برنامه ها‬
‫برنامه نویس میتواند برنامه هایی را ایجاد کند که مثل یک نوع جدید‬
‫عمل کند‪.‬‬
‫استفاده از نوع‬
‫جدید به برنامه‬
‫نویس و تا حدی‬
‫به زبان برنامه‬
‫نویسی بستگی‬
‫دارد‪.‬‬
‫در برخی از‬
‫زبان ها عملیات‬
‫به عنوان یک‬
‫نوع جدید‬
‫محسوب میشوند‪.‬‬
‫این مکانیزم در‬
‫همه زبان ها‬
‫وجود دارد‪.‬‬
‫‪4‬‬
‫اعالن نوع‬
‫زبان توانایی تعریف انواع داده جدید و عملیات بر روی ان انواع را‬
‫دارد‪.‬‬
‫مفهوم نوع داده انتزاعی برای ایجاد انواع داده جدید به کار برده میشود‪.‬‬
‫)‪Class(c++‬‬
‫)‪Package(Ada‬‬
‫وراثت‬
‫به کمک تکنیک های شی گرایی و وراثت می توان انواع‬
‫جدید و عملیات بر روی ان ها را انجام داد‪.‬‬
‫‪5‬‬
‫مشخصات انواع ساختمان داده‬
‫(صفات اصلی ساختمان داده )‬
‫تعداد‬
‫عناصر‬
‫سازمان‬
‫عناصر‬
‫نوع هر‬
‫عنصر‬
‫اسامی‬
‫برای‬
‫انتخاب‬
‫عناصر‬
‫حداکثر‬
‫تعداد‬
‫عناصر‬
‫‪6‬‬
‫‪.1‬تعداد عناصر‪:‬‬
‫اگر تعداد عناصر ساختمان داده در طول عمرش ثابت‬
‫باشد(ارایه‪/‬رکورد)‬
‫اندازه ساختمان داده‬
‫ثابت‬
‫اگر تعداد عناصر ساختمان داده در طول عمرش ثابت‬
‫نباشد(پشته‪/‬لیست)‬
‫اندازه ساختمان داده‬
‫متغیر‬
‫اشیا داده طول متغیر با استفاده از اشاره گر ها‬
‫اشیا داده طول ثابت را به هم پیوند می‬
‫دهند‪(.‬رشته)‬
‫‪7‬‬
‫‪ .3‬اسامی برای انتخاب عناصر‪:‬‬
‫هر ساختمان داده باید مکانیزمی داشته باشد که بتوان اجزا ان را انتخاب‬
‫کرد‪.‬‬
‫در ارایه به کمک اندیس‪/‬در رشته به وسیله اشاره گر‬
‫‪.4‬حد اکثر تعداد عناصر‪:‬‬
‫برای ساختار هایی با طول متغیر مثل رشته یا پشته حداکثر طول ان بر حسب تعداد‬
‫عناصر باید مشخص باشد‪.‬‬
‫‪ .5‬سازمان عناصر‪:‬‬
‫متداول ترین سازمان دنباله خطی از عناصر است مانند‪:‬ارایه های یک‬
‫بعدی‪/‬رکوردها‪/‬رشته ها در یک فضای پیوسته از حافظه وجود دارد‪.‬‬
‫‪9‬‬
‫عملیات در ساختمان داده ها‬
‫عملیات‬
‫انتخاب‬
‫عناصر‬
‫ایجاد و‬
‫حذف‬
‫ساختمان‬
‫داده ها‬
‫درج و‬
‫حذف‬
‫عناصر‬
‫عملیات‬
‫روی کل‬
‫ساختمان‬
‫داده ها‬
‫‪10‬‬
‫‪.1‬عملیات انتخاب عناصر‪:‬‬
‫الف )انتخاب تصادفی(مستقیم)‪:‬اجزا به صورت دلخواه انتخاب میشوند‪(.‬بردارها)‬
‫ب )انتخاب ترتیبی‪:‬اجزا به ترتیبی که از قبل مشخص شده است انتخاب میشوند‪(.‬لیست)‬
‫‪.2‬عملیات روی کل ساختمان داده‪:‬‬
‫عملیات ممکن است کل ساختمان داده ها را به عنوان ارگومان بپذیرند و ساختمان داده جدیدی‬
‫را تولید کنند‪(.‬جمع دو ارایه‪/‬اجتماع بر روی مجموعه ها)‬
‫‪.3‬درج و حذف عناصر‪:‬‬
‫عملیاتی است که تعداد عناصر ساختمان داده را تغییر می دهد‪.‬‬
‫‪.4‬ایجاد و حذف ساختمان داده ها‪:‬‬
‫عملیاتی که ساختمان داده ها را ایجاد یا حذف می کند‪.‬‬
‫‪11‬‬
‫پیاده سازی ساختمان داده ها‬
‫‪.1‬نمایش حافظه‪:‬هنگام ذخیره سازی ساختمان داده حافظه ای برای عناصر‬
‫ساختمان داده و توصیفگر اختیاری که تمام یا چند صفت ساختمان داده را ذخیره‬
‫میکند در نظر گرفته میشود‪.‬‬
‫الف)نمایش ترتیبی‪:‬‬
‫در این نمایش ساختمان داده در یک بلوک پیوسته از حافظه ذخیره میشود که شامل‬
‫توصیفگر و اجزا می باشد(ساختمان داده با طول ثابت و گاهی با طول متغیر»»‬
‫رشته ها ‪/‬پشته ها)‬
‫ب)نمایش پیوندی‪:‬‬
‫در این نمایش ساختمان داده در چندین بلوک حافظه نا پیوسته ذخیره می شوند که‬
‫بلوک ها از طریق اشاره گرها به یکدیگر پیوند خواهند خورد‪(.‬ساختمان داده با‬
‫طول متغیر»»لیست ها)‬
‫‪12‬‬
13
‫‪.2‬پیاده سازی عملیات‪:‬‬
‫انتخاب اجزا ساختمان داده مهمترین نکته در پیاده سازی ان است و هدف ان است که‬
‫انتخاب ترتیبی و تصادفی عناصر کار امد باشد‪.‬‬
‫الف)انتخاب ترتیبی در حافظه‪:‬‬
‫عملیات انتخاب عنصر در نمایش ترتیبی حافظه به کمک یک ادرس مبنا و یک ادرس‬
‫افست به صورت(‪ )Base+Offset‬به سادگی و با سرعت انجام می شود‪( .‬ادرس‬
‫دستیابی)‬
‫محل نسبی عنصر انتخاب شده در بلوک ترتیبی( افست)‬
‫محل شروع بلوک(ادرس پایه)‬
‫ب)انتخاب پیوندی در حافظه‪:‬‬
‫برای انتخاب یک جز در ساختمان داده در روش پیوندی می بایست تمام عناصر اول تا‬
‫‪i‬ام برای رسیدن به عنصر ‪i‬ام دستیابی شوند‪.‬‬
‫نمایش پیوندی زنجیره ای از اشاره گرها را از اولین بلوک موجود در ساختار تا عنصر‬
‫مورد نظر دنبال کرد‪.‬‬
‫‪14‬‬
+
15
‫مدیریت حافظه و ساختمان داده ها‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫هنگامی که به یک شی داده حافظه تخصیص داده می شود طول عمر ان شروع می‬
‫شود و هنگامی که این انقیاد از بین برود طول عمر ان هم تمام میشود‪.‬‬
‫برای ساختمان داده های با طول متغیر هر یک از عناصر طول عمر مخصوص به‬
‫خودشان را دارند ولی در ساختمان داده با طول ثابت کل ساختمان داده دارای یک‬
‫طول عمر است‪.‬‬
‫هنگام ایجاد یک شی داده یک مسیر دستیابی به ان نیز ایجاد میشود این مسیر‬
‫دستیابی یا از طریق نام برای ان صورت میگیرد یا به کمک اشاره گری که به ان‬
‫اشاره میکند ‪.‬‬
‫در هر نقطه از طول عمر شی داده ای ممکن است چندین مسیر دستیابی وجود داشته‬
‫باشد‬
‫مانند‪:‬ارگومانی به زیر برنامه ارسال میشود یا اشاره گر جدیدی به ان اشاره‬
‫میکند(ارجاع سرگردان)‬
‫»»یا مسیر های دستیابی ممکن است به روش های گوناگون از بین بروند‬
‫مانند‪:‬انتساب مقدار جدیدی به متغیر اشاره گر(زباله)‬
‫‪16‬‬
‫‪.1‬داده های زباله(حافظه مازاد)‪:‬‬
‫هنگامی که یک مسیر دستیابی به یک شی داده از بین برود ولی خود شی داده‬
‫وجود داشته‬
‫باشد شی داده را زباله گوییم زیرا دیگر قابل استفاده نیست ولی انقیاد ان به محل‬
‫حافظه اش از بین نرفته است یعنی حافظه ای که در اختیار ان است قابل استفاده‬
‫مجدد نیست‪.‬‬
‫‪17‬‬
‫‪.2‬ارجاعهای معلق‬
‫‪.1‬اگر طول عمر شی داده تمام شود ولی هنوز یک مسیر دستیابی به ان را داشته باشیم‬
‫می گوییم ارجاع معلق رخ داده است ‪.‬‬
‫‪.2‬در حقیقت ارجاع سرگردان یک مسیر دستیابی است که پس از اینکه طول عمر شی‬
‫داده خاتمه یافت وجود داشته باشد‪.‬‬
‫‪.3‬این مشکل زمانی رخ می دهد که چند اشاره گر به صورت همزمان به شی داده اشاره‬
‫می کنند‪.‬‬
‫دستور)‪:free(p‬حافظه مذکور از(‪ )p‬رها شده ولی هنوز (‪)q‬به ان اشاره می‬
‫‪18‬‬
‫کند‪.‬‬
‫اگر دو مشکل فوق همزمان رخ دهد‪‬‬
‫(داده زباله‪/‬ارجاع معلق)‬
‫مشکل داده زباله چندان مهم نیست چون داده های زباله حافظه مصرف می کنند و‬
‫باعث به هدر رفتن حافظه می شوند و حداکثر یک برنامه به دلیل عدم حافظه کافی‬
‫اجرا نخواهد شد ولی ارجاع معلق مسئله مهمی در مدیریت حافظه است که اگر از‬
‫طریق ارجاع سر گردان به یک شی داده دسترسی داشته باشیم باعث نا هنجاری‬
‫اطالعات می شود‪.‬‬
‫‪19‬‬
‫اعالن و کنترل نوع ساختمان داده ها‪:‬‬
‫یک اعالن داده ساخت یافته صفات متعددی را برای ان مشخص می‬
‫سازد‪.‬‬
‫اعالن زیردر پاسکال‪:‬‬
‫;‪A=array[1…20,-4…8]Of real‬‬
‫‪.1‬مشخص می کند که نوع داده ارایه ای است دو بعدی‪.‬‬
‫‪.2‬اندیس سطرها از )‪ )1‬تا (‪ )20‬و اندیس ستون ها از(‪ )-4‬تا (‪)8‬‬
‫است‪.‬‬
‫‪.3‬تعداد سطر ها (‪ )20‬و تعداد ستون ها (‪ )13‬است‪.‬‬
‫‪.4‬تعداد کل خانه ها(‪ )260‬است‪.‬‬
‫‪ .5‬نوع هر خانه نیز حقیقی است‪.‬‬
‫‪20‬‬
‫در هنگام کنترل ساختمان داده دو موضوع مهم باید در نظر‬
‫گرفته شود‪:‬‬
‫‪.1‬وجود مولفه انتخابی‪:‬‬
‫جز انتخابی ممکن است در ساختمان داده نباشد‪.‬‬
‫‪A[13] X‬‬
‫]‪Q A[1…10‬‬
‫عملیات اندیس که جزئی از ارایه را انتخاب می کند ممکن است اندیس خارج از محدوده‬
‫ارایه باشد‪.‬کنترل زمان اجرا باید معتبر بودن ان را بررسی کند‪.‬‬
‫‪.2‬نوع عنصر انتخابی‪:‬‬
‫اگر عنصری وجود داشته باشد باید نوع ان هم درست باشد‪(.‬نوع مورد انتظارعملیات)‬
‫‪A[2][3].LINK-<Item‬‬
‫باید نوع عنصری که از این طریق به دست می اید مشخص و درست باشد‪.‬‬
‫این کنترل به صورت ایستا و در زمان کامپایل انجام می گیرد‪.‬‬
‫‪21‬‬
‫بردارها و ارایه ها‪:‬‬
‫مشخصات‪:‬‬
‫‪.1‬بردار (ارایه یک بعدی) ساختمانی مرکب از تعداد ثابتی از عناصر هم نوع است که به‬
‫شکل دنباله خطی از عناصر سازمان دهی شده اند‪.‬‬
‫صفات بردار‪:‬‬
‫تعداد‬
‫عناصر‬
‫اندیس برای‬
‫انتخاب هر‬
‫عنصر‬
‫نوع هر‬
‫عنصر‬
‫‪22‬‬
‫عملیات روی بردارها‪:‬‬
‫‪.1‬عملیاتی که عنصری را از برداری انتخاب می کند اندیس گذاری نام دارد ‪ (.‬عملیات‬
‫اندیس گذاری محل شی داده را بر می گرداند‪).‬‬
‫‪.2‬عملیات دیگر بردارها عبارتند از‪ :‬ساخت و از بین بردن ان ها‪،‬انتساب به عناصری از‬
‫بردار‪،‬جمع دو بردار(بردار با طول یکسان)‬
‫‪.3‬عملیات روی بردارها بسیار محدود است ولی در ‪ APL‬این عملیات بسیار زیاد است‪.‬‬
‫پیاده سازی‪:‬‬
‫‪ .1‬همگنی عناصر و ثابت بودن اندازه بردار‪،‬نمایش حافظه و دستیابی به عناصر ان را‬
‫ساده کرده است(از همگنی نتیجه میشود که اندازه و ساختار هر عنصر باید یکسان‬
‫باشد‪،‬از طول ثابت بردار نتیجه میشودکه تعداد و موقعیت هر عنصر بردار در طول‬
‫عمرش ثابت باشد‪).‬‬
‫‪ .2‬ذخیره صفات بردار‬
‫توصیفگر‬
‫(حدود باال و پایین بازه در توصیفگر‬
‫‪ .3‬کنترل بازه مقادیر اندیس محاسبه شده‬
‫ذخیره میشوند‪) .‬‬
‫‪23‬‬
24
‫پیاده سازی‪:‬‬
‫‪Address: A[i]=a+(i-lB)*E‬‬
‫‪ .1‬با شروع از عنصر اول برای رسیدن به )‪(i‬امین عنصر باید از (‪ )i-1‬امین عنصر‬
‫قبلی عبور کرد‪.‬‬
‫‪ .2‬اگر )‪(E‬اندازه هر عنصر باشد باید از ‪ )i-1(*E‬محل حافظه عبور کنیم‪.‬‬
‫‪ .3‬اگر اولین عنصر در محل (‪ )a‬باشد و (‪ )lB‬حد پایین اندیس باشد ‪،‬فرمول دستیابی‬
‫برای مقدار چپ یک عنصر بردار به صورت زیر است‪:‬‬
‫‪LVALUE(A(i)) =a+(i-LB) *E‬‬
‫‪a+i*E-LB*E=(a-LB*E)+i*E‬‬
‫در ‪ C‬برای ارایه های کاراکتری مقدار )‪ (E=1‬و (‪ )Lb=0‬است‪.‬‬
‫‪ :LVALUE(A(i))=(a+0*E)+i*E=a+i‬فرمول دستیابی عنصر ارایه‬
‫کاراکتری‬
‫در پاسکال اندیس از (‪ )1‬و در ‪ c‬از صفر شروع می شود‪.‬‬
‫‪25‬‬
‫مبدا مجازی‪:‬‬
‫ادرس عنصری با اندیس صفر را مشخص می کنیم‪.‬‬
‫)مقدار ثابت(‪LVALUE(A(0))=(a-LB*E)+(0*E)=a-LB*E=K‬‬
‫ادرسی است که عنصر صفر برداری در ان جا قرار می گیرد این ادرس مبدا‬
‫مجازی نام دارد‪(VO).‬‬
‫‪VO=a-LB*E‬‬
‫‪26‬‬
27
‫پیاده سازی های دیگر‪:‬‬
‫اگر(‪ )a‬ادرس شروع اولین خانه ارایه در حافظه باشد و(‪ )E‬مقدار بایت های الزم جهت‬
‫ذخیره هر یک از عناصر ارایه باشد‪.‬‬
‫حد پایین اندیس ارایه ‪)lB( :‬‬
‫حد باالی اندیس ارایه ‪)UB( :‬‬
‫محل ذخیره عنصر ‪i‬ام (ارایه تک بعدی)‪A[i]=a+(i-lB)*E:‬‬
‫نکته ‪ :‬برای تولید ادرس عناصر یک ماتریس باید ابتدا ان را به بردار تبدیل کنیم چون‬
‫در‬
‫حافظه کامپیوتری حافظه دو بعدی معنا ندارد ‪،‬این تبدیل ادرس معموال به دو روش‬
‫سطری و ستونی می باشد‪.‬‬
‫بسیاری از زبان ها مانند ‪،C‬پاسکال و جاوا از روش سطری و فرترن از ستونی استفاده‬
‫میکند‪.‬‬
‫‪28‬‬
‫نمایش حافظه به صورت فشرده ‪:‬‬
‫‪.1‬در نمایش حافظه فشرده عناصر یک بردار به صورت فشرده ذخیره میشوند‪(.‬به این‬
‫نکته توجه نمیشود که هر عنصر باید از کلمه ادرس پذیر شروع شود)‬
‫این روش باعث صرفه جویی در حافظه میشود ولی دستیابی به عنصر هزینه زیادی می‬
‫برد زیرا نمی توان از فرمول دستیابی استفاده کرد‪.‬‬
‫نمایش حافظه به صورت غیر فشرده‪:‬‬
‫‪.2‬به دلیل گران بودن هزینه دستیابی بردارها به صورت غیر فشرده ذخیره می شوند‪.‬‬
‫هر عنصر در مرز یک واحد حافظه ادرس پذیر قرار می گیرد و بین هر جفت از‬
‫عناصر ممکن است حافظه بدون استفاده باقی بماند‪،‬مزیت این روش دستیابی سریع است‬
‫ولی حافظه به هدر میرود‪.‬‬
‫‪29‬‬
‫آرایه های شرکت پذیر‬
‫برداریک آرایه یک بعدی است وماتریس یک آرایه دوبعدی است که‬
‫شامل چند سطر وستون است ‪.‬آرایه سه بعدی شامل سطحی ازسطرها‬
‫وستونهااست به همین ترتیب آرایه ای باابعادبیشتررامی توان با آرایه‬
‫ای باابعادکمترایجادکرد‪.‬‬
‫• مشخصات ونحو‪:‬‬
‫تفاوت آرایه چندبعدی وبرداردربازه اندیس هربعداست که اعالن آن به‬
‫‪....‬‬
‫‪matrix:‬‬
‫‪array‬‬
‫صورت زیراست‪[1...20][1....20] of :‬‬
‫‪....‬‬
‫‪....‬‬
‫‪....‬‬
‫‪integer‬‬
‫• ویژگی آرایه ها‪»:‬‬
‫‪.1‬آرایه ها به دوروش سطری وستونی پیاده سازی می شوند‪:‬‬
‫سطر‬
‫‪1‬‬
‫ستون ‪k‬‬
‫ستون‪2‬‬
‫ستون‪1‬‬
‫سطر‬
‫‪k‬‬
‫فرمول دستیابی به هر آرایه سه بعدی دردوحالت سطری وستونی به صورت زیراست‪:‬‬
‫‪30‬‬
‫=)]‪Lvalue(A[I,J,K‬‬
‫مثال‪:‬درآرایه ]‪A[1....3,1....4‬وآدرس عنصر]‪ A[2,3‬رادردوترتیب‬
‫سطری وستونی‬
‫بدست آورید(فرض کنید آدرس شروع ‪0‬وطول هرعنصر‪1‬بایت باشد)‪:‬‬
‫‪Lvalue(A[2,3])=0+[(2-1)(4-1+1)+(3-1)]×1=6‬سطری‬
‫‪Lvalue(A[2,3])=0+[(3-1)(3-1+1)+(2-1)]×1=7‬ستونی‬
‫‪.2‬نمایش حافظه برای آرایه های چندبعدی ازبردارپیروی می کنندبرای‬
‫ماتریس ها‬
‫اشیای داده اولین سطرسپس اشیای داده دومین سطروبه همین ترتیب‬
‫ذخیره می‬
‫شودتایک نمایش حافظه ترتیبی ازتمام عناصرآرایه داشته باشیم‪.‬‬
‫‪.3‬توصیفگرآرایه مانندبرداراست بااین تفاوت که حدودباالوپایین‬
‫هربعدنگهداری‬
‫می شودمانندمثال بعد‪:‬‬
‫‪31‬‬
32
‫‪.4‬عملیات اندیس گذاری‪(,‬استفاده ازفرمول دستیابی برای محاسبه‬
‫آفست یک عنصر‬
‫ازآدرس پایه آرایه)مانندبردارهاست به طور مثال اگر ‪ A‬ماتریسی‬
‫با‪ N‬سطرو‬
‫‪ M‬ستون باشدوبه صورت سطری ذخیره گردد‪،‬محل عنصر ]‪A[I,J‬‬
‫به صورت زیرمحاسبه می شود‪:‬‬
‫‪Lvalue(A[i,j]) =α+(I-LB1)×S+(J-LB2) ×E‬‬
‫‪S=(UB2 –LB2+1 )×E‬‬
‫‪VO=α-LB1×S-LB2×E‬‬
‫‪Lvalue(A[I,J])=VO+I×S+J×E‬‬
‫‪33‬‬
‫آرایه هایی باابعادباالتر‪:‬‬
‫آرایه ]‪A[L1:U1,.....,Ln:Un‬یک آرایه ‪ n‬بعدی است که ‪LI‬‬
‫حدودپایین ‪ Ui ،‬حدودباال و ‪e‬اندازه هرعنصرآرایه است وآرایه‬
‫درآدرس ‪ α‬ذخیره می شود‪.‬‬
‫محاسبه ضرایب‪:‬‬
‫‪Mn=e‬‬
‫‪[For each i=n-1 down to 1‬‬
‫‪Compute: mi=(ui+1 –li+1)×mi+1‬‬
‫محاسبه مبدأ مجازی‪:‬‬
‫‪34‬‬
‫آدرس عنصرآرایه‪:‬‬
‫آدرس عنصر ]‪A[S1...Sn‬به صورت زیر محاسبه می شود‪:‬‬
‫برش آرایه ها‪:‬‬
‫• مشخصات‪:‬‬
‫برش بخشی ازیک آرایه است که خودش یک آرایه است‪.‬شکل‬
‫زیرمثالی ازبرش آرایه ای رانشان می دهد‪:‬‬
‫‪35‬‬
‫نکته‪ :‬یکی از اولین زبانهایی که برش راپیاده سازی کرد‪ PL/I‬است‪.‬‬
‫مثال‪ :‬پرل ازدوشکل پشتیبانی می کند‪:‬‬
‫الف)لیستی ازاندیس ها ]‪@LIST[1...5]=@LIST2[3,5,7,9,13‬‬
‫ب)محدوده اندیس ها‬
‫• پیاده سازی‪:‬‬
‫پیاده سازی برش هابه کمک توصیفگرآرایه ساده وکارآمداست‪:‬فرض‬
‫کنیدماتریس ‪ A3×4‬به صورت زیرتعریف شده باشد‪:‬‬
‫‪36‬‬
‫می توان توصیفگرزیررابرای آن تولیدکرد‪:‬عناصراین آرایه براساس‬
‫فرمول زیرقابل دسترسی هستند‪:‬‬
‫‪Lvalue(A[I,J])=α+I*3+J*1‬‬
‫‪α‬‬
‫‪VO‬‬
‫‪1‬‬
‫‪LB1‬‬
‫‪4‬‬
‫‪UB1‬‬
‫‪3‬‬
‫‪multi1‬‬
‫‪1‬‬
‫‪LB2‬‬
‫‪3‬‬
‫‪UB2‬‬
‫‪1‬‬
‫‪multi2‬‬
‫حدپایین‬
‫حدباال‬
‫اختالف‬
‫حدباالوپایین‬
‫فاصله بین‬
‫عناصرمتوالی‬
‫‪37‬‬
‫برای پیاده سازی برش)‪s(*,2‬میتوان توصیفگری برای‬
‫ماتریس‪A‬ایجادکرداین برش یک بردارستونی رانشان می دهدکه‬
‫واحداست‪.‬‬
‫عناصرسه‬
‫بردارستونی رانشان می دهدکه فاصله بین‬
‫‪VO‬‬
‫‪α-3‬‬
‫‪1‬‬
‫‪LB1‬‬
‫‪4‬‬
‫‪UB1‬‬
‫‪3‬‬
‫‪MULTI1‬‬
‫آرایه های شرکت‬
‫انجمنی‬
‫آرایه)‪:‬هاکه تاکنون مطرح شد‪،‬روش دستیابی به یک‬
‫پذیر(مهم‬
‫ویژگی‬
‫عنصرخاص ‪،‬ازطریق یک نوع شمارشی به نام اندیس‬
‫است‪.‬عناصرآرایه برحسب این اندیس مرتب هستند وبااستفاده‬
‫ازمقادیراندیس می توان به هرعنصرآرایه دست یافت دربعضی‬
‫ازبرنامه های کاربردی مطلوب است که ازطریق نام (بدون استفاده‬
‫ازاندیس) بتوان به اطالعات دست یافت‪.‬‬
‫‪38‬‬
‫مثال‪:‬‬
‫به ترتیب نام دانشجو و نمره دانشجوی]‪grade[i],name[i‬اسامي‬
‫افراد كالس را مي توان با دو آرایه نشان داد در این حالت‪ ،‬یك ترتیب‬
‫ضمني با استفاده از اندیس دانشجوي‪i‬وجود دارد‪.‬‬
‫درپرل آرایه شرکت پذیربه وسیله عملگر‪%‬ایجادمی شودمانندمثال‬
‫زیر‪:‬‬
‫}’‪%classlist={“ali”,’a’,”ahmad”,’b’,”reza”,’d‬‬
‫‪39‬‬
‫رکوردها‪:‬‬
‫رکوردساختمان داده ای مرکب ازتعدادثابتی ازعناصروازانواع‬
‫مختلف است‪.‬یابه عبارت دیگررکوردمجموعه ای ازعناصرداده ای‬
‫است که هرعنصربا یک نام شناخته شده وازطریق آفستی ازشروع‬
‫ساختارموردبررسی قرارمی گیرد‪.‬‬
‫‪ .1‬عناصررکوردممکن است ناهمگن وازانواع مختلفی باشند‪.‬‬
‫‪ .2‬عناصررکورد دارای نام هستند‪.‬‬
‫‪40‬‬
‫درمثال زیرمی خواهیم اطالعات دانشجورانگهداری کنیم این رکوردبه‬
‫صورت زیرتعریف می شود‪:‬‬
‫{‪Struct student‬‬
‫;‪Int stid‬‬
‫;]‪Char name[30‬‬
‫;]‪Char major[15‬‬
‫;‪Int department‬‬
‫}‬
‫;‪Struct student st1,st2‬‬
‫‪41‬‬
‫• صفات رکوردهاعبارت‬
‫انداز ‪:‬‬
‫تفاوت بین آرایه ورکورد‪:‬‬
‫عناصررکوردبااندیس دسترسی نمی شوندبلکه بااسامی فیلدهاقابل‬
‫ارجاع هستند‪.‬بعالوه یک رکوردمی تواندعناصری از جنس‬
‫رکوردهای دیگر‪،‬یا رکوردخودش داشته باشد‪.‬‬
‫‪42‬‬
‫نکته‪:‬عناصررکوردرافیلدونام آن رانام‬
‫فیلدمی نامند‪.‬‬
‫فرمول محاسبه برای دستیابی به محل ‪i‬امین عنصردررکوردبه‬
‫صورت زیراست که درآن‪α‬آدرس پایه بلوک حافظه است که ‪R‬‬
‫رانشان می دهد‪.‬‬
‫‪43‬‬
:‫رکوردها وآرایه هایی باعناصرساختاری‬
:‫تعریف رکورددرکوبول به صورت زیراست‬
01 EMPLOYEE_RECORD
02 EMPLOYEE_NAME
05 FIRST PICTURE IS X(20)
05 MIDDLE PICTURE IS X(10)
05 LAST PICTURE IS X(20)
02 HOURLY_RATE PICTURE IS 99V99.
44
‫رکورد ‪EMPLOYEE_RECORD‬ازیک رکورد‬
‫‪EMPLOYEE_NAME‬ویک‬
‫فیلد ‪HOURLY_RATE‬تشکیل شده است‪ .‬اعداد‪0,02,05‬‬
‫درابتدای هرخط شماره‬
‫سطح وساختارسلسله مراتبی رکوردرانشان می دهد‪.‬دستور‬
‫‪PICTURE‬فرمت ذخیره‬
‫سازی هرفیلدرانشان می دهد‪X(20) .‬یعنی ‪ 20‬کارکترالفبای عددی‬
‫و‪99 v99‬یعنی‬
‫عدددهدهی ممیزثابت بادورقم صحیح ودورقم اعشار‪.‬‬
‫‪45‬‬
‫رکوردهای طول متغییر(یونیون)‪:‬‬
‫یونیون نوعی است که متغیرهای آن مقادیرباانواع مختلف رادرزمان‬
‫های متفاوت‬
‫حین اجرا می توانند داشته باشند‪.‬فرض کنیدیک کامپایلرجدولی‬
‫داردکه انواع ثابتهای‬
‫درون هربرنامه رادرآن نگهداری می کند‪.‬یک فیلدجدول مقدارثابت‬
‫است وهمچنین زبان مربوط به این کامپایلراجازه تعریف ثابت هایی‬
‫رابانوع صحیح‪،‬ممیزشناوروبولین‬
‫بدهد‪.‬دراین حالت‪ C‬و‪C++‬ازکلمه ‪UNION‬ودرفرترن‬
‫از‪ EQUIVALENCE‬پس به دودسته‪.1‬یونیون آزاد‪.2‬یونیون قابل‬
‫تشخیص تقسیم می شود‪.‬یونیون آزاد در‪C‬و‪ C++‬کاربرد دارد‪.‬‬
‫‪46‬‬
:‫به صورت زیرخواهدبود‬C‫یک نمونه ازیونیون آزاددر‬
Union flex type{
int int value;
float floatvalue;
};
Union flex type var1;
Float x;
……..
Var1.intvalue=27;
X=var1.floatvalue;
47
‫کنترل نوع درآخرین دستورانجام نمی شودزیراسیستم نوع‬
‫مقدارفعلی‪var‬رانمی تواند تشخیص دهدبنابراین رشته ی بیتی که‬
‫عددصحیح ‪27‬رانمایش می دهدبه متغییر ممیز شناور‪x‬نسبت می‬
‫دهدکه کامال بی معنی است‪.‬رکوردطول متغیررایونیون قابل تشخیص‬
‫می نامیم‪.‬رکوردی باطول متغیرمانندمثال زیرخواهدبود‪:‬‬
‫‪48‬‬
‫عنصر‪ payclass‬درپاسکال برچسب ودرادامتمایزکننده(مشخص می‬
‫کنددرهرزمان چه شکلی ازرکوردقابل استفاده است)‬
‫‪3‬فیلد‪ID,DEPT,AGE‬برای تمامی رکوردها ثابت است‪.‬ممکن‬
‫است بعضی ازفیلدهادرطول عمررکورد وجودداشته وثابت‬
‫باشدیااینکه تغییرکندوازبین برودپس برای این کاربایدکنترل‬
‫شونددرنتیجه داریم‪:‬‬
‫‪ .1‬کنترل پویا(عنصربرچسب قبل ازدستیابی به آن بررسی می شودکه‬
‫آیاوجود داردیانه)‬
‫یونیون آزاد‬
‫که تعریف رکوردطول متغیربدون‬
‫درحالتی‬
‫(‬
‫نشود‬
‫انجام‬
‫کنترلی‬
‫‪.2‬‬
‫یونیون قابل‬
‫تشخیص‪).‬‬
‫عنصربرچسب صورت گیرد‬
‫نکته ‪ :‬اگردرساختاررکوردازفیلدبرچسب استفاده نشود‪.‬‬
‫اگرازفیلدبرچسب استفاده شود‬
‫‪49‬‬
‫نمایش حافظه برای رکوردهای طول متغیربه صورت‬
‫زیراست‪:‬‬
‫‪50‬‬
‫لیست ها‬
‫لیست‪ ،‬ساختمان داده اي است كه دنباله مرتبي از ساختمان داده ها است‪.‬‬
‫مشخصات و نحو‪ :‬لیست ها همانند بردارها حاوي دنباله مرتبي از اشیا هستند‪.‬‬
‫اولین عنصر لیست را معموال راس گویند‪.‬‬
‫لیست ها از جهات زیر با بردارها متفاوت اند‪:‬‬
‫‪ .1‬طول لیست ها به ندرت ثابت است‪ .‬لیست ها معموال براي نمایش ساختمان داده‬
‫ها به كار مي روند‪ .‬و درطول اجراي برنامه‪ ،‬كوتاه و بلند مي شوند‪(.‬طول متغیر)‬
‫‪ .2‬لیست ها به ندرت همگن هستند‪ .‬نوع داده هر عنصر لیست ممكن است با‬
‫عنصر دیگر متفاوت باشد‪.‬‬
‫‪ .3‬زبان هایي كه از لیست ها استفاده مي كنند‪ ،‬نوعا چنین داده اي را به صورت‬
‫ضمني‪ ،‬بدون صفات صریحي براي اعضاي لیست‪ ،‬تعریف مي كنند‪.‬‬
‫‪51‬‬
‫نحو زبان لیسپ‪ ،‬ساختار لیست را به صورت زیر نمایش مي دهد‪:‬‬
‫)‪(FunctionName Data1, Data2 , ……,Datan‬‬
‫لیسپ با اعمال ‪ FunctionName‬بر روي آرگومان هاي ‪Data1‬تا ‪ Datan‬اجرا مي‬
‫شود‪.‬‬
‫اغلب عملیات در لیسپ‪ ،‬آرگومان هاي لیست را گرفته‪ ،‬مقادیر لیست را برمي گردانند‪.‬‬
‫به عنوان مثال ‪:‬‬
‫‪ Cons‬دوآرگومان لیست را مي گیرد و لیستي را برمي گرداند كه آرگومان اول آن به‬
‫ابتداي آرگومان دوم اضافه مي شود‪.‬‬
‫)‪(cons ‘ )a b c ( ‘)d e f(( = ))a b c (d e f‬‬
‫این مثال نشان مي دهد كه نتیجه‪ ،‬لیستي با چهار عنصر است كه عنصر اول‪ ،‬لیست)‪(a,b,c‬‬
‫است‪ .‬چهار عنصر لیست حاصل‪ ،‬از یك نوع نیستند‪.‬اولي یك لیست است(عنصر اول‬
‫لیست)‪ ،‬در حالي كه بقیه‪ ،‬عناصر اولیه یا اتم هستند‪.‬‬
‫‪52‬‬
‫این مثال همچنین ویژگي مهم از زبان لیسپ را نشان مي دهد كه در آن تمام آرگومان‬
‫هاي تابع ابتدا ارزیابي مي شوند‪ .‬اگر عبارتي به صورت زیر نوشته شود‪:‬‬
‫))‪(cons (a b c )d e f‬‬
‫لیسپ ابتدا تالش مي كند تابع (‪ )a‬رابا آرگومان هاي (‪ )b‬و (‪ )c‬ارزیابي كند و سپس‬
‫سعي مي كند تابع(‪ )d‬را با آرگومان هاي تابع (‪)f‬و (‪ )e‬ارزیابي نماید‪ .‬این كار احتماال با‬
‫خطا مواجه مي شود‪.‬‬
‫تابع)‪ (quote x‬یا’‪ x‬فقط مقدار لیترال (مقدار چپ) آرگومان خود را بر مي گرداند‪،‬‬
‫لذا از ارزیابي نادرست جلوگیري مي شود‪(.‬مشخص میکند که خودش یک پارامتر است‬
‫نیاز به ارزیابی ندارد‪).‬‬
‫نحو لیست در ام ال نیز به صورت ]‪[a, b, c‬است‪ .‬لیست ها در ام ال همگن هستند‪.‬‬
‫یعني مي توان لیستي از مقادیر صحیح مثل[‪ ]1,2,3‬یا لیستي از رشته ها مثل‬
‫[”‪ ]“abc” , “def‬داشت‪.‬‬
‫‪53‬‬
‫پیاده سازي‪ .‬از ماهیت پویاي اغلب پیاده سازي هاي لیست و این واقعیت كه عناصر‬
‫موجود در لیست به ندرت همگن هستند‪:‬‬
‫نتیجه مي شود كه مدیریت حافظه منظم كه براي بردارها و آرایه ها مفید است‪ ،‬در اینجا‬
‫قابل استفاده نیست‪.‬‬
‫در چنین مواردي‪ ،‬معموال از سازمان مدیریت حافظه پیوندي استفاده مي شود‪ .‬یك قلم‬
‫لیست‪ ،‬یك عنصر اولیه است كه معموال شامل شي داده اي به اندازه ثابت است‪.‬‬
‫در لیسپ به سه فیلد از اطالعات نیاز داریم‪.‬‬
‫یك فیلد نوع و دو اشاره گر لیست‪ ،‬اگر فیلد نوع‪ ،‬اتم باشد‪ ،‬آنگاه فیلدهاي باقي مانده‬
‫توصیفگرهایي هستند كه این اتم را توصیف مي كنند‪.‬‬
‫اگر فیلد نوع‪ ،‬یك لیست باشد‪ ،‬اشاره گر اول‪ ،‬راس لیست است (اولین عنصر لیست) در‬
‫حالي كه اشاره گر دوم‪ ،‬انتهاي لیست است‪( ،‬اعضاي باقي مانده)‪.‬‬
‫ساختار حافظه را براي مثال فوق نشان مي دهد‪:‬‬
‫(‪)cons ‘ )a b c ( ‘)d e f(( = ))a b c (d e f‬‬
‫‪54‬‬
‫شباهت بین ساختارهاي پایین و وسط در شكل صفحه بعد كارایي این پیاده‬
‫سازي را براي این ساختار نشان مي دهد‪.‬‬
‫‪.Cons.1‬عملیات ‪ cons‬یا الحاق به این صورت پیاده سازي مي شوند‪ :‬گره جدیدي‬
‫از لیست ایجاد مي شود وفیلد راس به عنوان آرگومان اول ‪ cons‬و فیلد انتها به عنوان‬
‫آرگومان دوم ‪ cons‬منظور مي شود‪.‬‬
‫‪.Head.2‬راس لیست‪ ،‬محتویات (مقدار راست) فیلد راس لیست است‪.‬‬
‫‪ Tail.3‬انتهاي لیست‪ ،‬محتویات فیلد انتهاي لیست است‪.‬‬
‫‪55‬‬
56
‫شكل هاي گوناگون لیست ها‬
‫در بعضي از زبان ها شكل هاي مختلفي از ساختارهاي لیست وجود دارد‪.‬‬
‫پشته ها و صف ها‪ .‬پشته لیستي است كه انتخاب‪ ،‬درج و حذف عناصر از انتهاي‬
‫آن انجام مي شود‪ .‬صف لیستي است كه انتخاب و حذف از یك طرف و درج از طرف‬
‫دیگر انجام مي شود‪ .‬حافظه پشته و صف را مي توان به صورت ترتیبي یا پیوندي نمایش‬
‫داد‪(.‬پشته زمان اجرا یک شی داده مهم است که توسط سیستم تعریف می شود‪،‬صف ها در‬
‫زمان بندی و همزمان سازی زیر برنامه ها کاربرد دارند‪).‬‬
‫درخت ها‪ .‬لیستي كه عناصرش عالوه بر اشیاي داده اولیه‪ ،‬ممكن است لیست باشند‪،‬‬
‫درخت نام دارد‪ ،‬به شرطي كه هر لیست فقط یك عنصر از اولین لیست باشد‪(.‬درخت ها‬
‫برای نمایش جدول نمادها در کامپایلر به کار می روند‪).‬‬
‫گراف هاي جهت دار‪ .‬ساختمان داده اي كه عناصر آن با استفاده از الگوي پیوندي‬
‫خاصي به هم پیوند داده مي شوند (به جاي دبناله خطي از عناصر)‪ ،‬گراف جهت دار نام‬
‫دارد‪.‬‬
‫‪57‬‬
‫لیست هاي خاصیت‪ .‬اگر در ركوردي با تعداد متغیري از عناصر‪ ،‬تعداد عناصر بدون‬
‫هیچ محدودیتي تغییر كند‪ ،‬لیست خاصیت نام دارد‪.‬‬
‫در لیست خاصیت‪ ،‬اسامي عناصر (اسامي فیلدها) و مقادیر آنها باید ذخیره شوند هر نام‬
‫فیلد‪ ،‬نام خاصیت نامیده مي شود‪.‬‬
‫مقدار متناظر فیلد‪ ،‬مقدار خاصیت نامیده مي شود‪.‬‬
‫نمایش متداول براي لیست خاصیت‪ ،‬همان لیست پیوندي معمولي است به طوري كه‬
‫اسامي صفت و مقادیر آنها در یك دنباله طوالني تغییر مي كنند‪(.‬شکل صفحه بعد)‬
‫براي انتخاب یك مقدار خاصیت‪ ،‬لیست جستجو مي شود تا خاصیت مطلوب پیدا شود‪ .‬فقط‬
‫اسامي خاصیت ها بررسي مي شوند پس از یافتن خاصیت مطلوب‪ ،‬عنصر بعدي لیست‪،‬‬
‫مقدار آن خاصیت است‪،‬‬
‫وقتي خاصیت جدیدي در لیست خاصیت (لیست توصیفی)درج مي شود‪:‬‬
‫دو عنصر درج مي گردد كه عبارتند از‪ :‬نام خاصیت و مقدارش‪.‬‬
‫‪58‬‬
59
‫مجموعه ها‬
‫مجموعه شي داده اي است كه شامل مقادیر نامرتب و مجزا است‪ ،‬در حالي كه لیست از‬
‫تعدادي مقادیر مرتب تشكیل شده است كه ممكن است بعضي از عناصر آن تكراري‬
‫باشند‪.‬‬
‫عملیات اصلي روي مجموعه ها عبارتند از‪:‬‬
‫‪.1‬عضویت‪ .‬آیا مقدار(‪ )x‬عضوي از مجموعه )‪(s‬است)‪(XЄS‬‬
‫‪.2‬درج و حذف یك مقدار‪ .‬اگر فعال)‪(X‬عنصري از مجموعه (‪)s‬نباشدمي توان آن را‬
‫در)‪(S‬درج كرد‪ .‬چنانچه)‪ (x‬عضو )‪(s‬باشد مي توان آن را از مجموعه)‪(S‬حذف كرد‪.‬‬
‫‪.3‬اجتماع‪ ،‬اشتراك و تفاضل مجموعه ها‪.‬‬
‫‪60‬‬
‫پیاده سازي‪ .‬در زبان هاي برنامه سازي‪ ،‬منظور از مجموعه‪ ،‬ساختمان داده اي است‬
‫كه عناصر مرتب را نشان مي دهد‪ ،‬مجموعه مرتب‪ ،‬لیستي است كه مقادیر تكراري آن‬
‫حذف شده اند‪.‬‬
‫مجموعه نامرتب‪ ،‬دو نمایش حافظه دارد‪:‬‬
‫نمایش بیتي مجموعه ها‪ .‬نمایش حافظه بیتي در حالتي مناسب است كه اندازه مقادیر‬
‫مجموعه جهاني‪ ،‬كوچك باشد‪.‬نمایش تابع ویژگي مجموعه ‪،‬رشته بیتی را نشان می دهد در‬
‫این نمایش برای درج یک عنصر در مجموعه باید بیت مناسبی را به یک تبدیل کرد و برای‬
‫حذف یک عنصر از مجموعه باید بیت مناسبی را صفر نمود‪.‬‬
‫;‪For A=set of 1…6‬‬
‫حال اگر در‪A‬مجموعه [‪ ]2،3،5‬با دستور [‪ A= ]2،3،5‬ذخیره گردد‪.‬حافظه به شکل زیر‬
‫در می اید‪:‬‬
‫‪61‬‬
‫نمایش درهم سازي مجموعه ها‪ .‬نمایش دیگري براي مجموعه‪ ،‬براساس‬
‫تكنیك درهم سازي یا حافظه پراكنده است‪ ،‬از این روش وقتي استفاده مي شود كه‬
‫مجموعه جهاني بزرگ باشد (مثال وقتي كه مجموعه شامل اعداد و رشته هاي كاراكتري‬
‫باشد)‪.‬‬
‫حتي بهترین تابع درهم سازي نمي تواند تضمین كند كه داده هاي مختلف‪ ،‬آدرس هاي‬
‫درهم سازي مختلفي را ایجاد مي كنند‪ .‬گرچه مطلوب است كه تابع درهم سازي‪ ،‬آدرس‬
‫هاي درهم سازي تولید شده را در سراسر بلوك پخش كند‪ ،‬ممكن است دو داده مختلف‪ ،‬یك‬
‫آدرس درهم سازي را تولید كنند‪ .‬در این صورت مي گوییم‪ .‬برخورد پیش مي آید تكنیك‬
‫هاي زیادي براي مقابله با برخورد وجود دارد‪:‬‬
‫(عنصر جدید ‪ x‬را که به صورت رشته بیتی ‪Bx‬است‪).‬‬
‫درهم سازي مجدد‪ .‬مي توانیم رشته بیتی(‪ )Bx‬را اصالح كنیم (مثال با ضرب كردن در‬
‫یك مقدار ثابت) و نتیجه را دوباره درهم سازي كنیم تا آدرس درهم سازي جدیدي ایجاد‬
‫شود‪ .‬اگر برخورد دیگري پیش آمد‪ ،‬درهم سازي را تكرار مي كنیم تا(‪ )Bx‬پیدا شود یا یك‬
‫محل خالي در بلوك پیدا شود‪.‬‬
‫‪62‬‬
‫پیمایش ترتیبي‪ .‬جستجو را از نقطه برخورد در بلوك شروع مي كنیم تا ‪Bx‬یا یك‬
‫محل خالي در بلوك پیدا مي شود‪.‬‬
‫باكت بندي‪.‬‬
‫مي توانیم اشاره گرهایي را در بلوك در نظر بگیرم كه به لیستهاي باكت‬
‫پیوندي اشاره كنند كه حاوي عناصر با آدرسهاي درهم سازي یكسان است‪ .‬پس از درهم‬
‫سازي)‪ (Bx‬و بازیابي اشاره گر به لیست باكت مناسب آن لیست را براي )‪(Bx‬جستجو‬
‫مي كنیم چنانچه پیدا نشد آن را به انتهاي لیست اضافه مي كنیم‪.‬‬
‫‪63‬‬
‫تكامل مفهوم نوع داده‬
‫چون كامپیوترهاي واقعي محدودیت هایي را براي تعریف نوع اعمال نمي كنند‪ ،‬اغلب‬
‫زبان هاي برنامه سازي انواع داده اولیه اي مثل حقیقي‪ ،‬صحیح و رشته كاراكتري را‬
‫دارند‪.‬‬
‫مفهوم اولیه نوع داده‪ ،‬نوع را به صورت مجموعه اي از مقادیر تعریف مي كند كه یك‬
‫متغیر مي تواند آنها را بپذیرد‪ .‬متغیرها را مي توان از نوع مورد نظر اعالن كرد‪.‬‬
‫براي انواع اولیه اي مثل حقیقي و صحیح‪ ،‬زبان برنامه سازي‪ ،‬امكاني را براي اعالن‬
‫متغیرهاي آن نوع عملیاتي را براي آنها تدارك مي بیند‪ .‬نمایش حافظه مربوط به مقادیر‬
‫حقیقي و صحیح‪ ،‬كامال بسته بندي شده است یعني از برنامه نویس پنهان است‪ .‬برنامه‬
‫نویس بدون اینكه از جزییات نمایش حافظه این انواع اطالع داشته باشد‪ ،‬از اشیاي داده‬
‫آنهااستفاده مي كند‪ .‬برنامه نویس فقط نام نوع و عملیاتي را براي دستكاري آن نوع فراهم‬
‫مي بیند‪.‬‬
‫‪64‬‬
‫انتزاع داده‪ .‬براي بسط مفهوم بسته بندي به داده هایي كه توسط برنامه نویس تعریف‬
‫مي شود‪ .‬نوع داده انتزاعي را به صورت زیر تعریف مي كنیم‪:‬‬
‫‪ .1‬مجموعه اي از اشیاي داده معموال با استفاده از یك یا چند تعریف نوع‪.‬‬
‫‪ .2‬مجموعه اي از عملیات انتزاعي بر روي آن انواع داده‬
‫‪ .3‬بسته بندي تمام آنها‪ ،‬به طوري كه كاربر نوع جدید نتواند اشیاي داده اي از آن نوع‬
‫را‪ ،‬به جز از طریق عملیاتي كه براي آن تعریف شده است‪ ،‬دستكاري كند‪.‬‬
‫‪65‬‬
‫پنهان سازي اطالعات‬
‫براي نوشتن برنامه بزرگ بایداز استراتژي تقسیم و حل استفاده كرد ‪ :‬برنامه به‬
‫مجموعه اي از قطعات بنام ماژول تقسیم مي شود‪ .‬هر ماژول مجموعه محدودي از‬
‫عملیات را بر روي مقدار محدودي از داده ها انجام مي دهد‪ .‬بدین ترتیب‪ ،‬كنترل منطقي‬
‫بر فرآیند طراحي برنامه وجود خواهد داشت‪.‬‬
‫طراحي ماژول معموال به دو روش انجام مي شود‪:‬‬
‫‪ .1‬ماژول ها‪ ،‬تجزیه تابعي برنامه را نشان مي دهد‪(.‬مدل متداول برنامه نویسي در دهه‬
‫‪ 1960‬بود‪ ،‬و ساختار زیربرنامه ها‪ ،‬رویه ها و توابع‪ ،‬از آنها نتیجه مي شود‪).‬‬
‫‪ .2‬ماژول ها تجزیه داده اي برنامه را نشان مي دهند‪(.‬براي استفاده از نوع داده‪ ،‬فقط‬
‫باید مشخصات آن معلوم باشد ‪،‬جزییات پیاده سازي پنهان هستند و مي توان از آنها‬
‫صرف نظر كرد‪).‬‬
‫‪66‬‬
‫زبان برنامه سازي انتزاع را به دو روش پشتیباني مي كند‪ .‬در یك روش با‬
‫تدارك كامپیوتر مجازي كه كاربرد آن آسان تر و قدرت آن بیشتر است كامپیوتر سخت‬
‫افزار است‪ ،‬مجموعه مفیدي از انتزاع ها را تدارك مي بیند كه به عنوان ویژگي هاي زبان‬
‫مي شناسیم‪.‬‬
‫در روش دوم‪ ،‬زبان امكاناتي را فراهم مي كند كه برنامه نویس مي تواند انتزاع ها را به‬
‫وجود آورد‪ ،‬انتزاع هایي كه كامپیوتر مجازي تعریف شده توسط كاربر را به وجود مي‬
‫آورند‪ .‬زیربرنامه ها‪ ،‬كتابخانه هاي زیربرنامه‪ ،‬تعاریف نوع‪ ،‬كالس ها و پكیج ها بعضي‬
‫از امكاناتي هستند كه در زبان هاي مختلف براي پشتیباني از انتزاع هاي برنامه نویسي‬
‫وجود دارد‪.‬‬
‫‪67‬‬
‫پنهان سازي اطالعات‪ ،‬اصطالح مهمي در طراحي انتزاع هاي برنامه نویسي است‪.‬‬
‫هر قطعه از برنامه باید تا آنجایي كه ممكن است اطالعات را از كاربران آن قطعه‬
‫پنهان كند‪.‬‬
‫وقتي اطالعات در یك انتزاع بسته بندي شدند‪ ،‬معنایش این است كه ‪:‬‬
‫‪.1‬الزم نیست كاربر از اطالعات مخفي اطالع داشته باشد تا بتواند از آن انتزاع‬
‫استفاده نماید‪.‬‬
‫‪.2‬در صورت لزوم‪ ،‬نمي تواند مستقیما ٌ اطالعات مخفي را دستكاري‬
‫كند‪(.‬مانند‪:‬نمایش عدد صحیح در فرترن و پاسکال)‬
‫‪68‬‬
‫زیربرنامه ها‪:‬‬
‫زیربرنامه یک عملیات انتزاعی است که توسط برنامه نویس تعریف‬
‫می شود‪ .‬به عبارت دیگر‪ :‬زیربرنامه نمایانگریک تابع ریاضی که‬
‫مجموعه خاصی ازآرگومانها را به مجموعه خاصی ازنتایج نگاشت‬
‫می کند‪.‬‬
‫دودیدگاه اززیربرنامه مهم است‪:‬‬
‫‪ .1‬درسطح طراحی زبان(طراحی وپیاده سازی امکاناتی است که‬
‫برای تعریف وفراخوانی زیربرنامه تهیه می شود‪).‬‬
‫‪ .2‬درسطح طراحی برنامه (روش نمایش عملیات انتزاعی که برنامه‬
‫نویس تعریف می کنددرمقایسه باعملیات اولیه موجوددرزبان‬
‫مورد توجه است)‬
‫‪69‬‬
‫• مشخصات زیربرنامه‪:‬‬
‫‪ .1‬نام زیربرنامه‬
‫‪ .2‬امضای زیربرنامه(که تعدادآرگومان ها‪،‬ترتیب ونوع هرکدام‬
‫ازآنها وتعدادنتایج وترتیب ونوع آنها بایدمشخص باشد)‬
‫‪ .3‬عملیاتی که توسط زیربرنامه انجام می شود‪.‬‬
‫نکته ‪ :‬اگرزیربرنامه یک مقداری برگرداند به آن زیربرنامه تابع می‬
‫گویم‪.‬مانندزیر‪:‬‬
‫‪70‬‬
‫نکته ‪ :‬دربعضی اززبان ها برای اعالن زیربرنامه ها ازکلمات کلیدی‬
‫مانند ‪procedure,function‬‬
‫مثال ‪:‬درپاسکال داریم‪:‬‬
‫رویه (زیرروال)‪:‬‬
‫اگرزیربرنامه بیش ازیک مقداررابرگرداندیا آرگومانهای‬
‫خودراتغیردهدرویه یازیرروال نامیده می شود‪.‬‬
‫در‪void ،c‬نشان می دهدکه تابع مقداری رابرنمی گرداند‪.‬نام‬
‫پارامترمجازی که با* مشخص شده است نشان دهنده ی پارامتری‬
‫است که تغیرات آن درزیربرنامه ‪،‬دربرنامه فراخوان قابل دسترسی‬
‫است‪.‬‬
‫‪71‬‬
‫مشکل زیربرنامه ها‪:‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫زیربرنامه ممکن است آرگومان ضمنی به شکل متغیرهای‬
‫غیرمحلی داشته باشد‪.‬‬
‫زیربرنامه ممکن است نتایج ضمنی(اثرات جانبی) داشته باشد‪،‬به‬
‫طوری که متغیرهای غیرمحلی یاآرگومانهای ورودی_خروجی‬
‫راتغیردهد‪.‬‬
‫زیربرنامه ممکن است برای بعضی ازآرگومانها تعریف نشده‬
‫باشد‪.‬به طوری که کامل اجرانمی شوندبلکه کنترل اجرارابه‬
‫پردازنده ی استثناارسال می کنندیاکل برنامه رابه طورناقص‬
‫خاتمه می دهند‪.‬‬
‫زیربرنامه ممکن است به گذشته حساس باشد‪.‬یعنی نتایج آن به‬
‫‪72‬‬
‫پیاده سازی زیربرنامه‪:‬‬
‫زیربرنامه‪ ،‬عملیاتي از الیه كامپیوتر مجازي را نشان مي دهد كه‬
‫توسط برنامه نویس ساخته مي شود و در نتیجه‪،‬زیربرنامه با استفاده‬
‫از ساختمان داده و عملیاتي پیاده سازي مي گردد كه توسط خود زبان‬
‫برنامه سازي ارائه مي شود‪ .‬پیاده سازي توسط بدنه زیربرنامه تعریف‬
‫مي شود كه متشكل از اعالن داده هاي محلي است كه ساختمان داده‬
‫هاي مورد استفاده زیربرنامه ها را تعریف مي كنند و شامل دستوراتي‬
‫است كه عملكرد زیربرنامه ها رامشخص مي كنند‪ .‬اعالن ها و‬
‫دستورات طوري بسته بندي مي شوند كه داده هاي محلي و دستورات‪،‬‬
‫به طورجداگانه توسط كاربر زیربرنامه ها قابل دستیابي نیستند‪ .‬كاربر‬
‫مي تواند زیربرنامه ها را با آرگومان هاي خاصي فرا خواني كند و‬
‫نتایج محاسبه را دریافت نماید‪.‬‬
‫‪73‬‬
‫نحو‪C‬برای بدنه زیربرنامه به صورت زیر است‪:‬‬
‫تعریف وفراخوانی زیربرنامه‪:‬‬
‫• تعاریف وسابقه فعالیت زیربرنامه‪:‬‬
‫تعریف زیربرنامه ها‪ ،‬خاصیت ایستاي یك برنامه است‪ .‬در حین‬
‫اجراي برنامه‪ ،‬اگر زیر برنامه اي فراخواني شود‪،‬سابقه فعالیتي از آن‬
‫زیربرنامه ایجاد مي شود‪ .‬وقتي زیر برنامه ها خاتمه یافت‪ .‬سابقه‬
‫فعالیت آن نیز از بین می رود‪ .‬تعریف زیر برنامه‪ ،‬قالبي براي ایجاد‬
‫سابقه فعالیت در حین اجرا است‪.‬درواقع سابقه فعالیت یک‬
‫زیربرنامه‪،‬نوعی شی داده ای است که دربلوکی ازحافظه نشان داده‬
‫‪74‬‬
‫‪ ‬تعریف زیربرنامه‪:‬‬
‫تعریف‪ ،‬چیزي است كه در برنامه نوشته مي شود و تنهااطالعاتي‬
‫است که در زمان ترجمه وجود دارد یعني نوع متغیرهاي زیربرنامه‬
‫ها مشخص است‪ ،‬ولي مقادیر (مقدارراست)یا محل آنها (مقدار چپ)‬
‫‪.‬‬
‫نیست‬
‫مشخص‬
‫‪ ‬فعالیت زیربرنامه‪:‬‬
‫سابقه فعالیت زیربرنامه ها فقط در حین اجراي برنامه وجود دارند‪.‬در‬
‫حین اجرا‪ ،‬كد مربوط به دستیابي به مقدار چپ یا مقدار راست متغیر‬
‫مي تواند اجرا شود‪ ،‬اما نوع متغیر ممكن است وجود نداشته باشد مگر‬
‫اینكه مترجم این اطالعات را توصیفگر متغیر ذخیره كرده باشد‪ .‬سابقه‬
‫فعالیت زیربرنامه ها‪ ،‬داراي طول عمر است كه از فراخواني‬
‫زیربرنامه ها شروع مي شود و تا از بین رفتن آن ادامه دارد‪.‬‬
‫‪75‬‬
‫مثال ‪:‬‬
‫‪76‬‬
‫این تعریف‪،‬اجزایی رامشخص می کندکه سابقه فعالیت‬
‫زیربرنامه درزمان اجرابه آنهانیازدارد‪:‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫خط امضای ‪،FN‬اطالعاتی رابرای حافظه پارامترها(اشیای‬
‫داده‪X‬و‪)Y‬وحافظه الزم برای نتیجه تابع ارایه می کند‪.‬‬
‫اعالنهایی وجوددارندکه حافظه رابرای متغیرهای محلی‬
‫(آرایه‪M‬ومتغیر‪)N‬آماده می کنند‪.‬‬
‫حافظه مربوط به لیترال ها وثوابت تعریف شده‪initval.‬ثابتی‬
‫بامقدار‪2‬و‪ finalval‬ثابتی بامقدار‪10‬است‪10.‬و‪20‬لیترال هستند‪.‬‬
‫حافظه الزم برای کداجرایی که ازدستورات بدنه زیربرنامه‬
‫تولیدمی شود‪.‬‬
‫‪77‬‬
‫یکی ازخواص مهم ‪C‬این است که صفت ‪CONST‬به‬
‫کامپایلر‪C‬اطالع می دهدکه شی داده ‪initval‬دارای مقدارلیترال ‪2‬‬
‫است‪.‬دستور‪define #‬یک دستورپیش پردازنده(ماکرو) است که به‬
‫جای هر ‪finalval‬کارکترهای “‪”10‬راقرارمی دهد‪.‬مترجم ‪c‬نام‬
‫‪finalval‬راپردازش نمی کند‪.‬اثرات عملی هردودستوردرزیربرنامه‬
‫اجرایی یکسان است امامعنای آنهامتفاوت است‪initval .‬دارای یک‬
‫مقدارچپ است که مقدار راستش ‪2‬است‪،‬درحالی که ‪finalval‬فقط‬
‫دارای مقدارراست ‪ 10‬است‪.‬‬
‫زیربرنامه دارای دوفضااست‪:‬‬
‫‪ .1‬بخش پویا(رکوردفعالیت)‬
‫‪ .2‬بخش ایستا(سگمنت کد)‬
‫‪78‬‬
‫‪.1‬بخش ایستا ‪:‬‬
‫كه سگمنت كد نام دارد و حاوي ثوابت و كد اجرایي است‪ .‬این بخش‬
‫در حین اجرازیربرنامه هاباید ثابت باشد‪ ،‬لذا یك كپي از آن مي تواند‬
‫بین تمام سوابق فعالیت زیربرنامه ها مشترك باشد‪.‬‬
‫‪.2‬بخش پویا‪:‬‬
‫بخش پویا كه ركورد فعالیت نام دارد و شامل پارامترها‪ ،‬نتایج تابع و‬
‫داده هاي محلي و ناحیه حافظه موقت‪،‬نقاط برگشت و پیوندهایي براي‬
‫مراجعه به متغیرهاي غیر محلي است ساختار این بخش براي تمام‬
‫سوابق فعالیت زیربرنامه ها یكسان است‪ .‬اما مقادیر متفاوتي در آنها‬
‫وجود دارد‪ .‬لذا‪ ،‬هر سابقه فعالیت یك كپي ازركورد فعالیت مخصوص‬
‫به خود را دارد‪.‬‬
‫‪79‬‬
‫شکل زیرمفهوم دوبخش ایستاوپویارانشان می دهد‪:‬‬
‫نکته‪:‬اندازه و ساختار ركورد فعالیت مورد نیاز براي یك زیربرنامه ها‪،‬‬
‫مي تواند در زمان ترجمه تعیین شود‪.‬‬
‫دوعمل مخفی که درهنگام فراخوانی زیربرنامه صورت می گیرد‪:‬‬
‫‪Prolog .1‬‬
‫‪Epilog .2‬‬
‫‪80‬‬
‫‪:Prolog‬‬
‫این اعمال بایدقبل ازدستورات اجرای زیربرنامه گنجانده شود‪.‬انجام‬
‫این مقدمات توسط مترجم قبل ازاجرای کدزیربرنامه انجام می‬
‫شودوشامل عملیاتی چون‪:‬تنظیم رکورد فعالیت‪ ،‬انتقال‬
‫پارامترها‪،‬ایجادپیوندبرای ارجاع های غیرمحلی و‪.....‬‬
‫‪:Epilog‬‬
‫این اعمال هنگام خاتمه زیربرنامه انجام می شودتانتایج‬
‫رابرگردانندوحافظه رکورد فعالیت راآزاد کنند‪.‬برای این اعمال‬
‫نیزدستوراتی توسط مترجم درانتهای کداجرایی قرارداده می شود‪.‬‬
‫‪81‬‬
‫زیربرنامه های کلی‪:‬‬
‫مشخصات زیربرنامه ها‪ ،‬تعداد‪ ،‬ترتیب و نوع آرگومان ها را مشخص‬
‫مي كند‪ .‬زیربرنامه كلي‪ ،‬زیربرنامه اي با یك نام اما چندین تعریف‬
‫است كه با امضاهاي مختلف مشخص مي شوند‪ .‬زیربرنامه كلي را‬
‫زیربرنامه ي مجددا تعریف شده نیز مي نامند‪.‬‬
‫)‪Procedure Enter (Student:integer;Sect:in out Section‬‬
‫‪is‬‬
‫‪Begin‬‬
‫;‪End‬‬
‫‪Procedure Enter(S:in Section;Tab:in out Classlist) Is‬‬
‫‪Begin‬‬
‫‪End‬‬
‫‪82‬‬
‫تعریف زیربرنامه به عنوان شی داده‪:‬‬
‫تعریف زیربرنامه ها مستقل از اجراي آن است‪.‬برنامه‬
‫‪c++,c‬‬
‫منبع توسط كامپایلر به شكل اجرایي در مي آید‪ .‬در حین اجراي‬
‫برنامه‪ ،‬بخش ایستاي تعریف زیربرنامه ها‪ ،‬غیر قابل دستیابي و غیر‬
‫قابل مشاهده است‪.‬‬
‫تمایزي بین این مرحله (تعریف واجرا)وجود‬
‫‪Prolog,lisp‬‬
‫ندارد‪ .‬با تعریف زیربرنامه ها مي توان مثل اشیاي داده زمان اجرا‬
‫برخورد كرد‪(.‬زبانی مفسری است‪).‬‬
‫ترجمه‪:‬‬
‫ترجمه عملیاتي است كه تعریف زیربرنامه ها را به شكل رشته‬
‫كاراكتري گرفته‪ ،‬شي داده زمان اجرا را تولید مي كند‪.‬‬
‫اجرا‪:‬‬
‫‪83‬‬
‫تعریف نوع‪:‬‬
‫یک زبان برنامه نویسی بایدامکاناتی جهت تعریف نوع جدیدباتوجه به‬
‫نوع های اولیه موجود درزبان فراهم سازد‪.‬هرنوع شامل یک ‪name‬‬
‫ویک‪description‬می باشد‪.‬‬
‫مثال‪:‬‬
‫‪Pascal‬‬
‫‪84‬‬
‫‪ ‬مزایای تعریف نوع‪:‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫ساده کردن ساختاربرنامه‬
‫جلوگیری ازتکرار‪type‬های موجوددرزبان‬
‫ساده ترکردن انتقال پارامترها‬
‫یک شکل جدیدازبسته بندی وپنهان سازی اطالعات به وجودمی‬
‫آورد‪.‬‬
‫هم ارزی نوع‪:‬‬
‫كنترل نوع‪ ،‬چه به صورت ایستا و چه به صورت پویا‪ ،‬مقایسه بین‬
‫نوع آرگومان واقعي و نوع داده اي است كه عملیات انتظار آن را‬
‫دارد‪ .‬اگر انواع یكسان باشند‪ ،‬آرگومان پذیرفته مي شود و عملیات‬
‫ادامه مي یابد‪ .‬اگریكسان نباشند‪ ،‬یا خطا محسوب مي شود یا تبدیل‬
‫‪85‬‬
‫برای بررسی هم ارزبودن دونوع داده ای دوراه حل‬
‫وجوددارد‪:‬‬
‫هم ارزی نام‬
‫هم ارزی‬
‫ساختار‬
‫‪86‬‬
‫• هم ارزی نام‪:‬‬
‫دو نوع داده وقتي هم ارز هستند كه نام آنها یكسان باشد‪.‬مزیت هم‬
‫ارزی نام پیاده سازی آسان این نوع هم ارزی می باشد‪.‬‬
‫;‪Type Vect1:array [1...10] of integer‬‬
‫‪Vect2: array [1…10] of integer:‬‬
‫;‪Var X, Z: Vect1; Y: vect2‬‬
‫)‪Procedure sub (A: Vect1‬‬
‫‪Begin‬‬
‫;‪end‬‬
‫‪Begin‬‬
‫‪X:=Z‬‬
‫;‪X: =Y‬‬
‫‪87‬‬
‫‪ ‬معایب هم ارزی نام‪:‬‬
‫‪ .1‬هر شیئي كه در انتساب به كار مي رود باید داراي نام باشد‪ ،‬یعني انواع‬
‫داده بي نام وجود ندارند‪.‬‬
‫متغیر‪w‬نوع مستقلی دارداما نمي تواند به عنوان آرگومان زیربرنامه ها‬
‫باشد‪ ،‬زیرا نوع آن فاقد نام است‪Var W: array [1….10] of .‬‬
‫;‪real‬‬
‫‪ .2‬یك تعریف نوع باید در سراسر برنامه یا بخش بزرگي از برنامه قابل‬
‫استفاده باشد‬
‫زیرا نوع شي داده اي كه از طریق زنجیره اي از زیربرنامه ها به‬
‫صورت آرگومان انتقال‬
‫داده شد‪ ،‬نمي تواند دوباره در هراسامی زیربرنامه ها تعریف شود‪ .‬باید از‬
‫تعریف‬
‫نوع عمومي استفاده كرد‪ .‬تعریف كالس هاي در‪c++‬نمونه ای ازآن است‪.‬‬
‫‪88‬‬
‫• هم ارزی ساختاری ‪:‬‬
‫دو نوع داده وقتي هم ارز هستند كه اشیاي داده آنها عناصر داخلي‬
‫یكساني داشته‬
‫باشند‪ .‬معموال‪،‬معناي عناصر داخلي یكسان این است كه تمام اشیاي‬
‫داده از یك نمایش‬
‫حافظه استفاده كنند به عنوان مثال‪Vect 1،‬و ‪Vect 2‬براساس این‬
‫تعریف‪ ،‬هم ارز‬
‫هستند‪ .‬زیرا تعداد عناصر‪ ،‬نوع و ترتیب آنها در اشیاي داده‬
‫‪Vect2‬و‪Vect1‬یكسان‬
‫است‪ .‬نمایش حافظه هر دو نوع اشیاي نیز یكسان است‪.‬مزیت آن این‬
‫است که‬
‫انعطاف پذیری برنامه افزایش می یابد‪.‬‬
‫‪89‬‬
‫‪ ‬معایب هم ارزی ساختاری‪:‬‬
‫‪ .1‬وقتي دو نوع از نظر ساختاري هم ارز باشند‪ ،‬در موردركوردها‪،‬‬
‫آیا اسامي فیلدها باید یكسان باشند‪،‬؟ یا اگر تعداد و نوع فیلدها و‬
‫ترتیب آنها یكسان باشد‪ ،‬كافي است‪ ،‬اگر اسامي فیلدهاي ركورد‬
‫یكسان باشند‪ ،‬آیا ترتیب فیلدها باید یكي باشد؟‬
‫‪ .2‬جهت تشخیص معادل بودن ‪type‬بایدهزینه پرداخت شودیعنی‬
‫زمان راازدست می دهیم کامپایلربایدزمان صرف کندکه‬
‫آیادو‪type‬برابرندیانه؟‬
‫‪ .3‬دو متغیر ممكن است به طور یتصادفي از نظر ساختاري یكسان‬
‫باشند‪،‬درحالی که ازدیدبرنامه نویس متفاوت باشند‪.‬دراین موقع‬
‫زبان برنامه نویسی کمکی به کنترل نوع ایستانمی تونه بکن‪.‬‬
‫‪90‬‬
‫مثال ‪:‬‬
‫‪Type meter=integer‬‬
‫;‪liters=integer‬‬
‫;‪Var Len: meter‬‬
‫;‪Vol: Liters‬‬
‫تساوی دوشی داده ای‪:‬‬
‫تساوي اشیاي داده‪ .‬وقتي كامپایلر مشخص مي كند كه دو شي داده از‬
‫یك نوع اند‪ ،‬آیا آن دو شيء با هم مساویند؟فرض کنید‬
‫دومتغیر‪A,B‬ازنوع‪X‬هستند‪.‬تحت چه شرایطی ‪A=B‬است؟‬
‫دوتعریف زیرزیررادر‪C++‬برای‪SET‬و‪STACK‬درنظربگیرید‪:‬‬
‫‪91‬‬
‫تساوی پشته ای‪:‬‬
‫اگرفرض کنیم ‪topstack‬به شی داده موجوددر‪data‬اشاره می کندکه‬
‫درباالی پشته قرارداردتساوی بین ‪x,y‬به صورت بیان می کنیم‪:‬‬
‫‪X.topstack=y.topstack .1‬‬
‫‪ .2‬برای تمامی ‪i‬های بین‪0‬و‪topstack-1‬داریم‬
‫]‪x.data[i]=y.data[i‬‬
‫‪92‬‬
:‫تساوی مجموعه‬
‫تساوی‬،‫است‬A,B‫تعداداشیای موجوددر‬numberinset‫اگرفرض شود‬
:‫رابه صورت زیرتعریف می کنیم‬A,B‫بین‬
A.numberinset=B.numberinset .1
A.data[0[…..A.data[numberinset-1 .2
.‫است‬B.data[0[…..B.data[numberinset-1]‫جایگشت‬
93
‫تعریف انواعی که پارامتردارند‪:‬‬
‫دربرخی اززبان هامانند‪Ada‬این امکان وجودداردکه درتعریف نوع‬
‫ازپارامتراستفاده شودوبتوان اشیاداده ازنوع یکسان وبااشکال متفاوت‬
‫ایجادکرد‪.‬‬
‫مثال‪:‬‬
‫‪Type section(maxsize:integer) is‬‬
‫‪Record‬‬
‫;‪Room:integer‬‬
‫;‪Instructor:integer‬‬
‫;‪Classsize :integer‬‬
‫;‪End record‬‬
‫‪94‬‬
‫دراینجا‪maxsize‬به عنوان پارامتردرتعریف نوع ‪section‬آمده است‪.‬‬
‫دراین تعرین می توان متغیری به صورت زیرتعریف کرد‪:‬‬
‫;)‪X:section(100‬‬
‫;)‪Y:section(25‬‬
‫ازجهت پیاده سازی کامپایلرابتدابایدارزش پارامتررامحاسبه کردسپس‬
‫باتوجه به ارزش پارامتروتایپ مشخص شده‪،‬نوع جدیدی‬
‫ازمتغیرتعریف خواهدکرد‪.‬درحقیقت متغیربایددو مرحله طی کند‪.‬‬
‫‪ .1‬ارزشیابی پارامتر‬
‫‪ .2‬تعریف تایپ جدید‬
‫‪95‬‬
‫موفق و پیروز باشید‪.‬‬
‫فاطمه رازی‬
‫فاطمه رحیمی‬
‫‪96‬‬