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

صفحه‌ها: ۱ ۲
خروجی برنامه با استفاده از روش فراخوانی با نام - ldns0098 - 07 آذر ۱۳۹۳ ۱۰:۱۱ ق.ظ

برنامه زیر را در نظر بگیرید:
کد:
Var s: array[1..3] of char;
var i,j: integer;
    Procedure P(X: integer ; y: char);
    var j: integer
        begin
        j:=2;
        X= X+1;
        output(y);
        output(i);        
        end;
S[1]:='A';S[2]:='B';S[3]:='C';
i:=0; j:=1;
P(i,S[1+j]);
output(i);
خروجی برنامه با استفاده از روش فراخوانی با نام چیست؟
من تو تحلیل کد گیج شدم Huh

پ.ن: سوال ۱۲ - ص ۱۳۸-زبانهای برنامه سازی راهیان ارشد چاپ سوم

Re: خروجی برنامه با استفاده از روش فراخوانی با نام - ldns0098 - 09 آذر ۱۳۹۳ ۰۹:۴۷ ق.ظ

بچه ها کاش یه نگاه بهش بندازین. فک کنم کد پاسکاله.

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - amin1371 - 30 دى ۱۳۹۳ ۰۱:۲۵ ق.ظ


(۳۰ آذر ۱۳۹۳ ۰۲:۱۵ ب.ظ)Ametrine نوشته شده توسط:  سلام

خب وقتی که تابع فراخوانی شد: [tex]P(i,S[1 j])[/tex]
در تابع P،
[tex]S[1 j][/tex] جایگزین y میشه و i هم جایگزین X
[tex]S[1 j][/tex] چی میشه؟
۱+۱ = ۲ ، پس میشه [tex]S[2][/tex]
یعنی در اصل اول اندیس S حساب میشه بعد میریم توی تابع P

خب حالا تو تابع P یه j تعریف کرده و مقدار ۲ داده که اصلاً کاری بهش نداریم.
بعد X که الان i شده رو جمع کرده با ۱ ، که مقدارش میشه ۱ چون قبلاً صفر بوده.
[tex]output(y)[/tex] که میشه همون [tex]output(S[2])[/tex] که مقدارش B هست.
[tex]output(i)[/tex] هم میشه ۱
بعد برمیگردیم به برنامه اصلی اونجا هم دوباره i چاپ میشه که باز مقدار ۱ رو چاپ میکنه.

پس خروجی میشه: B 1 1

سعی کردم تا اونجا که میتونم واضح توضیح بدم.
اگه سوالی بود بپرسید.


سلام تا اونجایی ک من میدونم فکر کنم پاسخ سوال رو اشتباه دادن چون توی فراخوانی با ارجاع هست ک اول مقدار s حساب میشه بعد داخل تابع میشه
یعنی اینجا مقدار s(1+2)ra میده به خروجی
اگه درغیر اینصورت هست بگین منم متوجه بشم

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - Ametrine - 30 دى ۱۳۹۳ ۱۱:۲۲ ق.ظ

(۳۰ دى ۱۳۹۳ ۰۱:۲۵ ق.ظ)amin1371 نوشته شده توسط:  سلام تا اونجایی ک من میدونم فکر کنم پاسخ سوال رو اشتباه دادن چون توی فراخوانی با ارجاع هست ک اول مقدار s حساب میشه بعد داخل تابع میشه
یعنی اینجا مقدار s(1+2)ra میده به خروجی
اگه درغیر اینصورت هست بگین منم متوجه بشم
سلام

این سوال مربوط به کنکور ۷۳ هست.
این مطلب درباره محاسبه ی مقدار و بعد ارسال به تابع رو توی stackoverflow خوندم.

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - amin1371 - 30 دى ۱۳۹۳ ۱۱:۳۳ ق.ظ

سلام اخه اصلا تفاوت فراخوانی با نام و ارجاع تو همین موضوع هست وگرنه فرقی ندارن تو متغرهای ساده یا مغیرهای مشخص مثل b(5 تنها تفاوتشون تو متغرهای نامعین هست و اینکه توی ارجاع مقدار رو حساب میکنه و میفرسته ولی توی نام تو خود تابع مقدار ارابه مشخص میشه
بعدشم stackoverflow یه انجمنه ک هرکسی براساس اطلاعات خودش صحبت میکنه منبع رسمی نیست منبع رسمی ما کتاب هاست
بااین حال اگه بازم مطمین هستید مارو هم در جریان بذارید
(۳۰ دى ۱۳۹۳ ۱۱:۲۲ ق.ظ)Ametrine نوشته شده توسط:  
(30 دى ۱۳۹۳ ۰۱:۲۵ ق.ظ)amin1371 نوشته شده توسط:  سلام تا اونجایی ک من میدونم فکر کنم پاسخ سوال رو اشتباه دادن چون توی فراخوانی با ارجاع هست ک اول مقدار s حساب میشه بعد داخل تابع میشه
یعنی اینجا مقدار s(1+2)ra میده به خروجی
اگه درغیر اینصورت هست بگین منم متوجه بشم
سلام

این سوال مربوط به کنکور ۷۳ هست.
این مطلب درباره محاسبه ی مقدار و بعد ارسال به تابع رو توی stackoverflow خوندم.


RE: خروجی برنامه با استفاده از روش فراخوانی با نام - bluebaran - 30 دى ۱۳۹۳ ۱۱:۵۱ ق.ظ

(۳۰ دى ۱۳۹۳ ۱۱:۳۳ ق.ظ)amin1371 نوشته شده توسط:  سلام اخه اصلا تفاوت فراخوانی با نام و ارجاع تو همین موضوع هست وگرنه فرقی ندارن تو متغرهای ساده یا مغیرهای مشخص مثل b(5 تنها تفاوتشون تو متغرهای نامعین هست و اینکه توی ارجاع مقدار رو حساب میکنه و میفرسته ولی توی نام تو خود تابع مقدار ارابه مشخص میشه
بعدشم stackoverflow یه انجمنه ک هرکسی براساس اطلاعات خودش صحبت میکنه منبع رسمی نیست منبع رسمی ما کتاب هاست
بااین حال اگه بازم مطمین هستید مارو هم در جریان بذارید
(۳۰ دى ۱۳۹۳ ۱۱:۲۲ ق.ظ)Ametrine نوشته شده توسط:  
(30 دى ۱۳۹۳ ۰۱:۲۵ ق.ظ)amin1371 نوشته شده توسط:  سلام تا اونجایی ک من میدونم فکر کنم پاسخ سوال رو اشتباه دادن چون توی فراخوانی با ارجاع هست ک اول مقدار s حساب میشه بعد داخل تابع میشه
یعنی اینجا مقدار s(1+2)ra میده به خروجی
اگه درغیر اینصورت هست بگین منم متوجه بشم
سلام

این سوال مربوط به کنکور ۷۳ هست.
این مطلب درباره محاسبه ی مقدار و بعد ارسال به تابع رو توی stackoverflow خوندم.

بله مقدار (۱+۲)s میره به خروجی یعنی c

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - amin1371 - 30 دى ۱۳۹۳ ۱۱:۵۴ ق.ظ

ممنون از اینکه من رو هم مطمین کردید
شما درمورد static scoping و daynamic scoping هم اطلاعاتی دارین؟
اگه بتونین توضیحی بدین ممنون میشم
(۳۰ دى ۱۳۹۳ ۱۱:۵۱ ق.ظ)bluebaran نوشته شده توسط:  
(30 دى ۱۳۹۳ ۱۱:۳۳ ق.ظ)amin1371 نوشته شده توسط:  سلام اخه اصلا تفاوت فراخوانی با نام و ارجاع تو همین موضوع هست وگرنه فرقی ندارن تو متغرهای ساده یا مغیرهای مشخص مثل b(5 تنها تفاوتشون تو متغرهای نامعین هست و اینکه توی ارجاع مقدار رو حساب میکنه و میفرسته ولی توی نام تو خود تابع مقدار ارابه مشخص میشه
بعدشم stackoverflow یه انجمنه ک هرکسی براساس اطلاعات خودش صحبت میکنه منبع رسمی نیست منبع رسمی ما کتاب هاست
بااین حال اگه بازم مطمین هستید مارو هم در جریان بذارید
(۳۰ دى ۱۳۹۳ ۱۱:۲۲ ق.ظ)Ametrine نوشته شده توسط:  
(30 دى ۱۳۹۳ ۰۱:۲۵ ق.ظ)amin1371 نوشته شده توسط:  سلام تا اونجایی ک من میدونم فکر کنم پاسخ سوال رو اشتباه دادن چون توی فراخوانی با ارجاع هست ک اول مقدار s حساب میشه بعد داخل تابع میشه
یعنی اینجا مقدار s(1+2)ra میده به خروجی
اگه درغیر اینصورت هست بگین منم متوجه بشم
سلام

این سوال مربوط به کنکور ۷۳ هست.
این مطلب درباره محاسبه ی مقدار و بعد ارسال به تابع رو توی stackoverflow خوندم.

بله مقدار (۱+۲)s میره به خروجی یعنی c


RE: خروجی برنامه با استفاده از روش فراخوانی با نام - Ametrine - 30 دى ۱۳۹۳ ۱۲:۰۵ ب.ظ

(۳۰ دى ۱۳۹۳ ۱۱:۵۱ ق.ظ)bluebaran نوشته شده توسط:  بله مقدار (۱+۲)s میره به خروجی یعنی c
یعنی الان خروجی این کد چی میشه از نظر شما؟

این جوابی که من بدست اوردم مطابق با کتاب هست.

شما مطابق با چه کتابی حل کردید.
اصلاً این مطلبی که میگید تو کدوم کتاب نوشته؟

(۳۰ دى ۱۳۹۳ ۱۱:۵۴ ق.ظ)amin1371 نوشته شده توسط:  ممنون از اینکه من رو هم مطمین کردید
شما درمورد static scoping و daynamic scoping هم اطلاعاتی دارین؟
برای سوال جدید باید تاپیک جدید ایجاد کنید.

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - bluebaran - 30 دى ۱۳۹۳ ۱۲:۱۳ ب.ظ

(۳۰ دى ۱۳۹۳ ۱۲:۰۵ ب.ظ)Ametrine نوشته شده توسط:  
(30 دى ۱۳۹۳ ۱۱:۵۱ ق.ظ)bluebaran نوشته شده توسط:  بله مقدار (۱+۲)s میره به خروجی یعنی c
یعنی الان خروجی این کد چی میشه از نظر شما؟

این جوابی که من بدست اوردم مطابق با کتاب هست.

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

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - amin1371 - 30 دى ۱۳۹۳ ۱۲:۱۸ ب.ظ

(۳۰ دى ۱۳۹۳ ۱۲:۰۵ ب.ظ)Ametrine نوشته شده توسط:  [quote='bluebaran' pid='328220' dateline='1421738474']
بله مقدار (۱+۲)s میره به خروجی یعنی c
یعنی الان خروجی این کد چی میشه از نظر شما؟

این جوابی که من بدست اوردم مطابق با کتاب هست.

شما مطابق با چه کتابی حل کردید.
اصلاً این مطلبی که میگید تو کدوم کتاب نوشته؟

خروجی c 1 1 هست منابع من کتابای پارسه هست ولی بیشتر از توی جواب تستا میشه روش حل کردن رو پیدا کرد یعنی حل تستای زیاد

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - Ametrine - 30 دى ۱۳۹۳ ۱۲:۱۹ ب.ظ

(۳۰ دى ۱۳۹۳ ۱۲:۱۳ ب.ظ)bluebaran نوشته شده توسط:  کتاب من پوران هست
و کلا فراخوانی با نام یعنی ما پارامتر واقعی رو ارسال میکنیم به زیربرنامه و هر جا که استفاده شده و در اون لحظه محاسبه رو انجام میدیم نه قبل از ارسال واسه همینه که میگیم با ارجاع یکیه در صورتی که متغیر ما معمولی باشه و اگه مثل اینجا آرایه با اندیس متغیر باشه و اندیس داخل زیربرنامه تغییر کنه دیگه یکی نیست
اینجوری خروجی C 1 1 میشه که.
خب آخه تو گزینه ها اصلا C نداره!

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - bluebaran - 30 دى ۱۳۹۳ ۱۲:۲۷ ب.ظ

(۳۰ دى ۱۳۹۳ ۱۲:۱۹ ب.ظ)Ametrine نوشته شده توسط:  
(30 دى ۱۳۹۳ ۱۲:۱۳ ب.ظ)bluebaran نوشته شده توسط:  کتاب من پوران هست
و کلا فراخوانی با نام یعنی ما پارامتر واقعی رو ارسال میکنیم به زیربرنامه و هر جا که استفاده شده و در اون لحظه محاسبه رو انجام میدیم نه قبل از ارسال واسه همینه که میگیم با ارجاع یکیه در صورتی که متغیر ما معمولی باشه و اگه مثل اینجا آرایه با اندیس متغیر باشه و اندیس داخل زیربرنامه تغییر کنه دیگه یکی نیست
اینجوری خروجی C 1 1 میشه که.
خب آخه تو گزینه ها اصلا C نداره!

مگه همیشه گزینه درست تو گزینه ها هست

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - amin1371 - 30 دى ۱۳۹۳ ۱۲:۲۷ ب.ظ

(۳۰ دى ۱۳۹۳ ۱۲:۱۹ ب.ظ)Ametrine نوشته شده توسط:  
(30 دى ۱۳۹۳ ۱۲:۱۳ ب.ظ)bluebaran نوشته شده توسط:  کتاب من پوران هست
و کلا فراخوانی با نام یعنی ما پارامتر واقعی رو ارسال میکنیم به زیربرنامه و هر جا که استفاده شده و در اون لحظه محاسبه رو انجام میدیم نه قبل از ارسال واسه همینه که میگیم با ارجاع یکیه در صورتی که متغیر ما معمولی باشه و اگه مثل اینجا آرایه با اندیس متغیر باشه و اندیس داخل زیربرنامه تغییر کنه دیگه یکی نیست
اینجوری خروجی C 1 1 میشه که.
خب آخه تو گزینه ها اصلا C نداره!

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

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - afagh.msm - 30 دى ۱۳۹۳ ۱۲:۵۴ ب.ظ

سلام بچه ها
گزینه درست B 1 1
اصلا داخل گزینه ها c وجود نداره چون ارجاع با نام ارگومان ها ارزیابی نشده ارسال میشن و موقع ارجاع به اونا در محیط ارجاعی که به عنوان پارامتر ارسال شدند ارزیابی میشه.

حالا توضیحی که پوران گفته برای این سوال اینه :
در ()P ابتدا j برابر ۲ می شود سپس دستور دوم این طور ارزیابی میشود:
i=i+1
چون ارگومان X به جای i سراسری نشسته است و مقدار i سراسری برابر ۱ می گردد.دستور چاپ y در ()p مقدار [ s [j+1 را چاپ می کند منتها j در محیط سراسری ارزیابی می شود نه درون ()p پس مقدارش ۱ است نه ۲ لذا مقدار [۲]s که 'B' چاپ می شود دستور چاپ i هم به i سراسری اشاره می کند که هم اکنون مقدارش ۱ است و پس از برگشت مقدار i دوباره چاپ می شود لذا خروجی
'B',1,1 است

نظرتون؟؟؟

RE: خروجی برنامه با استفاده از روش فراخوانی با نام - amin1371 - 30 دى ۱۳۹۳ ۰۱:۰۴ ب.ظ

(۳۰ دى ۱۳۹۳ ۱۲:۳۲ ب.ظ)Ametrine نوشته شده توسط:  
(30 دى ۱۳۹۳ ۱۲:۱۸ ب.ظ)amin1371 نوشته شده توسط:  خروجی c 1 1 هست منابع من کتابای پارسه هست ولی بیشتر از توی جواب تستا میشه روش حل کردن رو پیدا کرد یعنی حل تستای زیاد
خب من بجز این، تست دیگه ای ندیدم که اینجوری پارامتر ارسال کنه.
اگه شما دیدید بذارید اینجا لطفاً.

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

(۳۰ دى ۱۳۹۳ ۱۲:۵۴ ب.ظ)afagh.msm نوشته شده توسط:  سلام بچه ها
گزینه درست B 1 1
اصلا داخل گزینه ها c وجود نداره ولی من خودم هم فک میکنم باید c ب جای B قرار میگرفته چون ارجاع با نام ارگومان ها ارزیابی نشده ارسال میشن و موقع ارجاع به اونا در محیط ارجاعی که به عنوان پارامتر ارسال شدند ارزیابی میشه.

حالا توضیحی که پوران گفته برای این سوال اینه :
در ()P ابتدا j برابر ۲ می شود سپس دستور دوم این طور ارزیابی میشود:
i=i+1
چون ارگومان X به جای i سراسری نشسته است و مقدار i سراسری برابر ۱ می گردد.دستور چاپ y در ()p مقدار [ s [j+1 را چاپ می کند منتها j در محیط سراسری ارزیابی می شود نه درون ()p پس مقدارش ۱ است نه ۲ لذا مقدار [۲]s که 'B' چاپ می شود دستور چاپ i هم به i سراسری اشاره می کند که هم اکنون مقدارش ۱ است و پس از برگشت مقدار i دوباره چاپ می شود لذا خروجی
'B',1,1 است

نظرتون؟؟؟

اگه اینجوری باشه درسته
پس توی فراخوانی با نام از متغیرهای سراسری باید استفاده کنیم؟
توی فراخوانی با ارجاع چی؟