PDA

View Full Version : حرفه ای: اذیت کردن متغیر کمکی



User_Soual
سه شنبه 02 بهمن 1397, 21:15 عصر
سلام و خسته نباشید
من یک برنامه ای داشتم


این برنامه من باید جای مقادیر دو واحد ارایه رو بدون متغیر کمکی تغییر بده ایا کدی هست که بدون متغیر کمکی این کارو بکنه؟؟


یک مثال میزنم:

char [] a = new char [1];
char temp;
a[0] = "A";
a[1] = " B";

temp = a[0];
a[0] = a[1];
a[1] = temp;

نمیخوام از temp استفاده کنم


ممنون

farhad_shiri_ex
سه شنبه 02 بهمن 1397, 22:47 عصر
سلام و خسته نباشید
من یک برنامه ای داشتم


این برنامه من باید جای مقادیر دو واحد ارایه رو بدون متغیر کمکی تغییر بده ایا کدی هست که بدون متغیر کمکی این کارو بکنه؟؟


یک مثال میزنم:

char [] a = new char [1];
char temp;
a[0] = "A";
a[1] = " B";

temp = a[0];
a[0] = a[1];
a[1] = temp;

نمیخوام از temp استفاده کنم


ممنون
فقط توجه داشته باشید که کد خودتون هم باگ داشت.
1- تعداد آرایه را کم تعرف کردید
2- برای char باید از تک کوتیشن استفاده کنید

char[] a = new char[2];
a[0] = 'A';
a[1] = 'B';

Console.WriteLine("befor swap a[0] is:"+a[0]);
Console.WriteLine("befor swap a[1] is:" + a[1]);

a[0] = (char)(a[0] ^ a[1]);
a[1] = (char)(a[0] ^ a[1]);
a[0] = (char)(a[0] ^ a[1]);


Console.WriteLine("after swap a[0] is:" + a[0]);
Console.WriteLine("after swap a[1] is:" + a[1]);
Console.ReadLine();

منطق خیلی ساده ای هم داره!
کافی که بیت های متغیرها را باهم xor کنید والبته چون عملگرهای بیتی فقط بر روی داده های نوع int عمل میکنند بنابراین کامپایلر یک cast ضمنی به نوع int انجام میده! وبه علت اینکه در سی شارپ نوع char , int باهم متفاوت هستند از یک cast صریح هم برای تبدیل به char استفاده شده است.


//A ascii ->65 binary -> 0100-0001
//B ascii ->66 binary -> 0100-0010
a[0] =a[0] ^ a[1] ; // -> 0100-0001^0100-0010 = 0000-0011 -> a[0] -> 3
a[1] =a[0] ^ a[1] ; // -> 0000-0011^0100-0010 = 0100-0010 -> a[1] -> 65
a[0] =a[0] ^ a[1] ; // -> 0000-0011^0100-0010 = 0000-0011 -> a[0] -> 66

و این هم نسخه بهینه تر در ++C

char* sw = new char[2];
*(sw+0) = 'A';
*(sw+1) = 'B';
*(sw+0) = *(sw+0) ^ *(sw+1);
*(sw+1) = *(sw+0) ^ *(sw+1);
*(sw+0) = *(sw+0) ^ *(sw+1);
cout << *sw << '\n' << *(sw+1) << '\n';

User_Soual
چهارشنبه 03 بهمن 1397, 00:53 صبح
من متوجه نشدم ببخشید

نسخه سی شارپ رو ندارید؟

ایلیا آخوندزاده
چهارشنبه 03 بهمن 1397, 01:19 صبح
درود
جناب شیری فرم سی شارپ رو هم گفتن نمیدونم چرا متوجه نشدید.
ضمنا کد شما هم به این شکل صحیح است :
char [] a = new char [2];char temp;
a[0] = 'A';
a[1] = 'B';

temp = a[0];
a[0] = a[1];
a[1] = temp;

که همون بحث swap هستش.

farhad_shiri_ex
چهارشنبه 03 بهمن 1397, 08:06 صبح
من متوجه نشدم ببخشید

نسخه سی شارپ رو ندارید؟

چی را متوجه نشدید؟
در پستی که گذاشتم کد سی شارپ هم هست! و توضیح عملکرد برنامه
جناب آخوندزاده هم که مجدد1 کد خودتون را اصلاح کردن و پست کردن!
در هر حال اگر نخواهید از متغیر کمکی برای swap کردن دوتا متغیر استفاده کنید راه دیگه ای که نیازی به متغیر کمکی نداشته باشه mask کردن بیتها هست که در پست اشاره شده!