PDA

View Full Version : سوال 103 کنکور کارشناسی ناپیوسته سال 86



ahadabasi
چهارشنبه 17 اردیبهشت 1393, 15:12 عصر
سلام
لطفا در مورد برنامه پایین راهنمایی کنید، که کلا هر خط چه کاری انجام میده من که برنامه رو خواستم اجرا کنم ، یه پیغامی داد و نرفت اجرا
خطا : thread stopped
با تشکر

کدام خط خروجی 1386/4/22 را چاپ نمیکند ؟




int n,a1,a2;
n=printf("13%n86%n/",a1,a2); a2=(n-1)/2; //1
printf("13%n%n86/",&a1,&a2); //2
printf("%d%n%n%d/",'\r',&a1,&a2,'a'-'\n'-1); //3
n=printf("%s%n%n/","1386",a1,a2); a1=a2=(n-1)/2; //4
printf("%d/%d%d",a1+a2,a1,a2);

rahnema1
چهارشنبه 17 اردیبهشت 1393, 17:05 عصر
سلام
بر اساس استاندارد ANSI c میشه اینجو توضیح داد
فرض می کنیم اینها همه داخل یک تابع باشند
در خط اول 3 متغیر اعلان میشن بدون اینکه مقدار دهی اولیه بشن بنابراین مقدار اولیه هیچ کدام معلوم نیست. حتی برابر صفر هم لزوما نخواهد بود.
در خط دوم بر فرض اینکه با ایجاد خطا برنامه متوقف نشه n% انتظار داره که اشاره گر از نوع int به اون فرستاده بشه که در نتیجه چون a1,a2 هیچکدام اشاره گر نیستند پس printf با خطا مواجه میشه و عدد 1- را بر می گردونه وهم n و هم a2 هم برابر 1- میشن
در خط سوم عدد /1386 چاپ میشه و در دو متغیر a1 و a2 هر دو برابر 2 میشن چون %n قراره تعداد کاراکترهای چاپ شده را توی متغیرها ذخیره کنه و چون قبل از %n تنها 13 چاپ میشه که تعداد کاراکتراش برابر2 هست پس a1,a2 هر دو برابر 2 میشن.

در خط چهارم هم باز /1386 چاپ میشه
چون r\ برابر 13 هست و 'a' هم برابر 97 هست و n\ هم برابر 10 هست که نتیجه میشه 86 و %n هم چیزی چاپ نمی کنه فقط در a1,a2 عدد 2 ذخیره میشه
در خط پنج باز به همون دلیل قبلی با خطا مواجه میشیم و 1- در n ذخیره میشه و a1,a2 هم هر دو برابر با 1- میشن
در خط آخر هم

-2/-1-1

چاپ میشه

rahnema1
پنج شنبه 18 اردیبهشت 1393, 19:34 عصر
با کامپایلر قدیمی turbo c++3 کامپایل کردم این جواب داد
1386/1386/1386/1386/4/22Null pointer assignment
فکر کنم مولف سوالات در سال 1991 متوقف شده بوده در صورتی که امتحان در سال 2007 برگزار شده.
احتمالا پیاده سازی اینها از استاندارد ANSI متفاوت بوده چون با borland c++ 5.5 هم کامپایل کردم کلا از برنامه خارج شد. کامپایلرهای جدید تر هم همین طور
بنابراین میتونیم بگیم این سوال کلا اشتباهه
حتی اگه در سوال هم تعیین کرده بود از کامپایلر turbo c++3 استفاده بشه باز هم هیچ کدام از گزینه ها درست نبود خط دوم و سوم و چهارم و پنجم هر چهارتا /1386 و خط پنجم هم

4/22Null pointer assignment

چاپ می کنه

(while(c=1) printf(cpp=0
جمعه 19 اردیبهشت 1393, 12:51 عصر
خط 3 و خط 6 کنار هم 1386/4/22 رو تشکیل میدن. امتحان کن تا ببینی.

rahnema1
جمعه 19 اردیبهشت 1393, 12:57 عصر
خط ششم که میشه این:

4/22Null pointer assignment

توی پست قبلی اشتباها گفتم خط پنجم

(while(c=1) printf(cpp=0
جمعه 19 اردیبهشت 1393, 13:16 عصر
دُرُست برنامه اینه :


#include <stdio.h>
void main()
{
int n, a1, a2;
printf("13%n%n86/",&a1,&a2);
printf("%d/%d%d",a1+a2,a1,a2);
}

(while(c=1) printf(cpp=0
جمعه 19 اردیبهشت 1393, 13:46 عصر
n% شمارنده کاراکتر هست. رشته 1386 متشکل از چهار کاراکتر هست که در پشت و جلوی n% قرار گرفتن. n% کاراکترهای جلوی خودش رو حساب نمی کنه (یعنی 86)، اما کاراکترهای پشت خودش رو حساب می کنه(یعنی 13). دو بار از n% استفاده شده، چون 2 متغیر تعریف شدن; بنابراین به تعداد دو کاراکتر (13) از n% به متغیرهای a1 و a2 به ارث میرسه. حالا متغیرهای a1 و a2 هر کدام دارای عدد 2 هستن (چون به هرکدوم دو کاراکتر رسید). در printf دوم، این دو متغیرها یک بار با هم جمع میشن که جواب میشه 4، بار بعد هم تک تک چاپ میشن که جواب میشه 2 و 2 کنار هم (که22 رو تشکیل میدن).
عدد 86 به هرحال چاپ میشه اما n% این دو کاراکتر رو قبول نمی کنه.

(while(c=1) printf(cpp=0
جمعه 19 اردیبهشت 1393, 13:49 عصر
http://upload7.ir/imgs/2014-05/37425873525821380146.jpg

rahnema1
جمعه 19 اردیبهشت 1393, 17:27 عصر
ببین سوال کلا مشکل داره. منظورم اینه که سوالی که برای آزمون طراحی شده اشتباهه. این سواله:
http://upload7.ir/imgs/2014-05/05377030018630087973.jpg (http://upload7.ir/)

(while(c=1) printf(cpp=0
شنبه 20 اردیبهشت 1393, 08:20 صبح
(http://barnamenevis.org/member.php?305905-rahnema1)rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1)، در عکسی که پُست کردی، اگر منظور از "کدام خط چاپ نمی کند" این باشه که "کدام خط باید حذف بشود"، بنابراین (البته خط printf("%d/%d%d",a1+a2,a1,a2); حتما باید باشه) :
اگر خط 1 حذف بشه، 1386/4/22 چاپ نمیشه.
اگر خط 3 حذف بشه، 1386/4/22 چاپ نمیشه.
اگر خط 1 و 2 حذف بشه، 1386/4/22 چاپ نمیشه.
اگر خط 1 و 4 حذف بشه، 1386/4/22 همچنان چاپ نمیشه.

وقتی 1386/4/22 چاپ میشه که :
خط 2 و printf("%d/%d%d",a1+a2,a1,a2); کنار هم باشن.
خط 3 و printf("%d/%d%d",a1+a2,a1,a2); کنار هم باشن.

اما، اگر خط 1 و 4 حذف بشن، 1386/1386/4/22 چاپ میشه; اما خب با سوال همخوانی نداره.
من حدس می زنم که "چاپ نمی کند" اشتباها به جای "چاپ می کند" نوشته شد; اگر حدسم دُرُست باشه، در گزینه ها به خط 2 که به تنهایی اشاره ای نشده، پس خط 3 می شد جواب دُرُست.
البته این خروجی ها رو من از کامپایلر GCC نسخه 4.8.1 دریافت کردم; در کامپیالر ++Dev C خروجی ها عجیب بودن.

برنامه رو اینجا اجرا کردم : http://www.compileonline.com/compile_c_online.php