تالار گفتمان مانشت
سوال مفهومی : تفاوت فراخواتی با نام؛مقدار؛نتیجه و ... - نسخه‌ی قابل چاپ

سوال مفهومی : تفاوت فراخواتی با نام؛مقدار؛نتیجه و ... - zahra412 - 26 دى ۱۳۹۰ ۰۱:۳۰ ق.ظ

سلام دوستان
من نمیتونم تفاوت فراخواتی با نام؛مقدار؛نتیجه و ... را بفهمم
جندبار هم این سوال پرسیده شده اما کسی جواب نداده
اکه ممکنه با مثال توضیح بدید
ممنون

سوال مفهومی - variant20002000 - 30 دى ۱۳۹۰ ۱۰:۵۶ ب.ظ

فراخوانی یک تابع با مقدار همان فراخوانی عادی هست که توی همه‌ی زبان های برنامه سازی مینویسیم (پارامتر های مجازی در پارامتر های واقعی کپی می شوند)
فراخوانی با ارجاع در واقع در واق به جای خود متغیر‌ها آدرس متغیر‌ها رو به صورت آرگومان به تابع میفرستیم( چون آدرس رو میفرستیم هر تغییری که روی متغیر های واقعی اعمال بشه روی متغیر های مجازی یعنی همون هایی که به عنوان پارامتر ارسال کردیم هم اعمال میشه)
فراخوانی با مقدار-نتیجه در عمل و از دید برنامه نویس مثل فراخوانی با ارجاع هست با این تفاوت که در موقع ورود به تابع اول پارامتر های مجازی رو روی پارامتر های واقعی کپی میکنه و بعد از تغییرات رو پارامتر های واقعی موقع خروج از تابع اون هارو مجدداً روی پارامتر های مجازی کپی میکنه.

RE: سوال مفهومی - zahra412 - 30 دى ۱۳۹۰ ۱۱:۲۷ ب.ظ

خیلی ممنون از توضیحات خوبتون
حالا میشه بر اساس توضیحاتتون این تست را حل کنید؟ ممنون

سوال مفهومی - variant20002000 - 03 بهمن ۱۳۹۰ ۱۲:۲۷ ق.ظ

اول call by value
تابع xyz دوبار پارامتر k رو با مقدار ۱۰۰ دریافت میکنه وارد تابع میشه شرط if برقرار نیست پس از تابع میاد بیرون و مقدار k که همون ۱۰۰ هست رو چاپ میکنه.

call by reference
توی این نوع فراخوانی اول تابع با مقدار متغییر k که همون ۱۰۰ هست فراخوانی میشه ولی چون آدرس متغیر ارسال میشه‌، هر تغییری توی تابع( روی پارامتر مجازی) باعث تغییر مقدارk (پارامتر واقعی) میشه. بنابر این مقدار k توی تابع به وسیله دستور i=300 تبدیل به ۳۰۰ میشه ... بنابر این مقدار پارامتر های مجازی i و j برابر هم میشه و شرط ارضاع میشه بنابر این مقدرا j برابر با ۳۰۰ * ۲ + ۳۰۰ میشه (درواقع چون J هم به k اشاره میکنه این تغییر باعث تغییر مقدار k یا همون پارامتر واقعی میشه) پس تا اینجا مقدار J و به دنبال اون مقدار k برابر با ۹۰۰ میشه

call by value result
توی این فراخوانی وقتی تابع xyz فراخوانی میشه مقدار که k قبل از فراخوانی ۱۰۰ هست توی متغیر های i , j کپی میشه پس تا اینجا i و j هر دو مقدار ۱۰۰ دارند. بعد توی تابع مقدار i تغییر میکنه و تبدیل به ۳۰۰ میشه بعد شرط i=j چک میشه چون i=300 و j=100 اون خط جلوی If اجرا نمیشه و تابع تموم میشه.. موقع خروج از تابع پارامتر های مجازی (i,j) توی پارامتر های واقعی (k) به ترتیب کپی میشند. یعنی اول ۳۰۰ کپی میشه و بعد ۱۰۰ .... پس آخرین مقدار k برابر با ۱۰۰ میشه و چاپ میشه

گزینه ۴ درسته...! Smile

RE: سوال مفهومی - variant20002000 - 25 بهمن ۱۳۹۰ ۰۶:۲۹ ب.ظ

(۲۲ بهمن ۱۳۹۰ ۰۶:۳۰ ب.ظ)vijay نوشته شده توسط:  call by nameچه شکلی به دست میاد؟؟؟؟
یعنی همیشه باcall by refrence یکی میشه؟؟؟!!!

هیچ وقت نمیتونیم بگیم این با اون یکی میشه اگرچه ممکنه خیلی با هم اشتراک داشته باشند ولی این قاعدده کلی نیست که بگیم با نام و با ارجاع همیشه یکی میشه

فراخوانی با نام به این صورته که توی زیر برنامه به محض رجوع به پارامتر مجازی مقدارش از پارامتر واقعی ارزیابی میشه. و باز یه محض تغییر روی پارامتر مجازی مقدارش روی پارامتر واقعی کپی میشه.

توی بعضی از تست‌ها دیدم که مقدار فراخوانی با نام و با ارجاع لزوما نتیجه یکسانی نمیدن.!

سوال مفهومی - - rasool - - 25 بهمن ۱۳۹۰ ۰۶:۳۵ ب.ظ

اگه اشتباه نکنم توی کتاب آقای مقسمی دیدم نوشته بود که اگه پارامتر (متغیر)مون ساده باشه اونوقت ارجاع و نام یک نتیجه می دهند. اما اگه مثلا پارامتر ما بصورت آرایه ای باشه اونوقت لزوما این دو تا نتیجه یکسانی نمی دهند.
و به نظر من هم درست گفته.

بازم خودتون تحقیق بفرمایید ...

سوال مفهومی - پشتکار - ۲۵ بهمن ۱۳۹۰ ۰۷:۱۳ ب.ظ

در کتاب پرات نوشته در صورتیکه از متغیر های ساده ای مثل int, ... استفاده کنیم فراخوانی با نام همانند فراخوانی با ارجاع می شود.

RE: سوال مفهومی : تفاوت فراخواتی با نام؛مقدار؛نتیجه و ... - hoda ahmadi - 30 آبان ۱۳۹۲ ۰۳:۵۲ ب.ظ

(۲۵ بهمن ۱۳۹۰ ۰۷:۱۳ ب.ظ)پشتکار نوشته شده توسط:  در کتاب پرات نوشته در صورتیکه از متغیر های ساده ای مثل int, ... استفاده کنیم فراخوانی با نام همانند فراخوانی با ارجاع می شود.

درسته هروقت که متغیر ساده باشه و یا عضو معین و مشخصی از یک آرایه باشد فراخوانی با نام و ارجاع نتایج یکسانی دارند اما اگر عضو نامعینی از آرایه باشد متفاوتند.
عضو معین مثل:B[5]5 و نامعین مثل:[B[I

(۳۰ دى ۱۳۹۰ ۱۱:۲۷ ب.ظ)zahra412 نوشته شده توسط:  خیلی ممنون از توضیحات خوبتون
حالا میشه بر اساس توضیحاتتون این تست را حل کنید؟ ممنون

سلام جواب گزینه ۴
تو این سوال i,jپارامترهای مجازی و kپارامتر واقعی
۱)فراخوانی با مقدار:مقدار پارامتر واقعی K که ۱۰۰ میباشد در پارامترهای مجازی i,j کپی میشود و هرگونه تغییری روی پارامترهای مجازی تاثیری در پارامتر واقعی نمیگذارد پس در انتها همان مقدار واقعی ۱۰۰ چاپ میشود.
۲)فراخوانی بامقدار-نتیجه: اولش مثل روش با مقدرا ر ، مقدار K در i,j کپی میشه بعد میبینیم که i مقدار ۳۰۰ میگیره اما چون در شرط if ، متغیرهای i,j برابر نیستن پس شرط اجرا نمیشه .اما در این روش در انتها مقادیر پارامتر مجازی در واقعی کپی میشوندو ودر(k,k) write مدار i در k اول , مقدار j در k دوم کپی میشود و مقدار نهایی یعنی k دوم: ۱۰۰/
۳)فراخوانی با ارجاع:آدرس پارامتر واقعی به پارامتر مجازی ارسال شده و هر تغییری روی پارامتر مجازی ،پارامتر واقعی را هم تغییر میدهدو
در اینجا ابتدا آدرس K به i,j ارسال میشود یعنی هر دو به یک آدرس اشاره میکنند پس در شرط if برقرار است و با اجرای حلقه j مقدار ۹۰۰ میگیرد.
۴)فراخوانی بانام:نام پارامتر واقعی kدر پارامترهای مجازی i,j کپی میشود و با هر تغییر پارامتر مجازی باید پارامتر واقعی هم ارزیابی شود.پس در اینجا وقتی i=300 یعنی k=300و باز یعنی j=300 پس شرط برقرار است و جواب=۹۰۰