ورود

View Full Version : روال ها و بکار گیری انها



hercool
جمعه 15 خرداد 1388, 13:02 عصر
سلام خدمت دوستان من در مبحث روال ها دارای یک مشکل هستم
چطور می شود پی برد که روالی : متغیری است یا مقداری و همچنین کدام روال قدرت برگرداندن پارامتر را در برنامه اصلی دارد و کدام ندارد که بر می گردد به همان شناسایی نوع روال
در سوالی که عکس رو میزارم فکر می کنم در جواب جابجایی صورت گرفته و جای b و c با هم جابجا شده در جواب
ممنون میشم در این موارد نظرتون رو بیان کنید

(http://tehransar.ir/pics8/f1f002e44be910155bcf18216888d952.jpg)http://tehransar.ir/pics8/f1f002e44be910155bcf18216888d952.jpg (http://tehransar.ir/pics8/f1f002e44be910155bcf18216888d952.jpg)
http://tehransar.ir/pics8/f1f002e44be910155bcf18216888d952.jpg

hercool
جمعه 15 خرداد 1388, 16:47 عصر
میشه در باره این روال هم برای من توضیح بدید که چطور جواب این سوال گزینه (د) می شود

(http://tehransar.ir/pics8/89d1101c0c7f37ab7853c921b2177f90.jpg)http://tehransar.ir/pics8/89d1101c0c7f37ab7853c921b2177f90.jpg (http://tehransar.ir/pics8/89d1101c0c7f37ab7853c921b2177f90.jpg)

http://tehransar.ir/pics8/89d1101c0c7f37ab7853c921b2177f90.jpg

vcldeveloper
جمعه 15 خرداد 1388, 19:15 عصر
میشه در باره این روال هم برای من توضیح بدید که چطور جواب این سوال گزینه (د) می شود


a = a+b
b = a - b => b = a+b-b = a
a = a - b => a = a+b-a = b

vcldeveloper
جمعه 15 خرداد 1388, 19:25 عصر
در سوالی که عکس رو میزارم فکر می کنم در جواب جابجایی صورت گرفته و جای b و c با هم جابجا شده
مقادیر a و b با هم عوض شدند. c نقشی نداره و مقدارش همان صفر باقی می ماند.


چطور می شود پی برد که روالی : متغیری است یا مقداری و همچنین کدام روال قدرت برگرداندن پارامتر را در برنامه اصلی دارد و کدام ندارد
متوجه منظورتون نشدم. روال متغیری و روال مقداری دیگه چی هست؟ این اصطلاحات برگردان فارسی کدام اصطلاحات انگلیسی هستند؟

hercool
جمعه 15 خرداد 1388, 19:44 عصر
پارامتر های متغییری(variable parameters)
پارامتر های مقداری(value parameters)
و میشه بگید چرا c نقشی نداره؟

vcldeveloper
جمعه 15 خرداد 1388, 21:16 عصر
پارامتر متغیری با روال متغیری فرق داره!

پارامتر متغیری پارامتری هست که بصورت اشاره گر به تابع ارسال میشه؛ یعنی بجای اینکه یک مقدار برای تابع ارسال بشه، یک آدرس برای تابع ارسال میشه. این آدرس محل نگهداری یک متغیر هست. هر تغییری که تابع بر روی این مقدار اعمال کنه، در متغیری که به تابع ارسال شده اعمال میشه. مثلا:


procedure Foo(var num: integer);
begin
num := num * 2;
end;

begin
a := 5;
Foo(a);
write(a);
end.کد بالا مقدار 10 را چاپ میکنه، چون مقدار 5 از طریق متغیر a به تابع ارسال میشه، و تابع مقدار همان متغیر را دو برابر میکنه.

اما برای پارامتر مقداری کامپایلر یک متغیر محلی موقت برای تابع ایجاد میکنه، و مقدار پارامتر را در آن کپی میکنه. در نتیجه هر تغییری که در داخل تابع روی آن پارامتر اعمال بشه، تاثیری روی متغیر پاس داده شده به تابع نداره:


procedure Foo(num: integer);
begin
num := num * 2;
end;

begin
a := 5;
Foo(a);
write(a);
end.
این کد مقدار 5 را چاپ میکنه، چون تغییر اعمال شده در داخل تابع فقط بر روی کپی موقت متغیر در داخل تابع اعمال میشه و خارج از تابع تغییری ایجاد نمیشه.


و میشه بگید چرا c نقشی نداره؟ برای اینکه c در هیچ جا استفاده نمیشه. تابع Change فقط مقدار a , b را میگیره و با c کاری نداره. اون c که در داخل تابع Change استفاده شده با اون C که در داخل بلوک اصلی برنامه استفاده شده فرق میکنه. C موجود در تابع Change یک متغیر محلی هست که فقط در داخل همان تابع اعتبار داره، و فقط اسمش مشابه اسم متغیر C در بلوک اصلی هست.

hercool
جمعه 15 خرداد 1388, 22:09 عصر
ممنون بابت پاسخهای زیبا و جامعتون اما یه سوال
چطور می تونم این پارامتر ها رو تشخیص بدم از هم ؟

vcldeveloper
شنبه 16 خرداد 1388, 08:45 صبح
چطور می تونم این پارامتر ها رو تشخیص بدم از هم ؟
در کدهای پست قبلی مشخص هست:
قبل از تعریف پارامترهای متغیری از عبارت var استفاده میشه.
قبل از تعریف پارامترها مقداری چیزی استفاده نمیشه.

پست قبل را ویرایش کردم تا تفاوت بهتر مشخص شود.