PDA

View Full Version : سوال: تابع Swap



mbasirati
جمعه 11 دی 1388, 00:14 صبح
سلام ، میخواستم بدونم تابع swap توی سی پلاس پلاس وجود داره و اگر وجود داره سرفایل اون چیه؟(include)

qwerty11
جمعه 11 دی 1388, 01:12 صبح
بله وجود داره. فکر کنم داخل کتابخونه ی algorithm هم قرار داره.

#Elahe#
جمعه 11 دی 1388, 06:31 صبح
ولی فکر کنم نباشه !!
تو بورلند و توربو که نبود .
مجبور شدم با متغیر میانی کارم رو راه بندازم .

Salar Ashgi
جمعه 11 دی 1388, 11:33 صبح
اگه منظورتون از این swap ، تعویض مقدار دو متغیر هستش ، اولا این کار آنقدر مشکلی نیست که از تابع

مربوطه اش استفاده کرد و میتوان براحتی آنرا پیاده سازی کرد ، ثانیا برای پیاده سازی هم میتونید از روش

متغیر کمکی یا بدون متغیر کمکی استفاده کنید :

مثال از دو تابع برای اینکار یکی با متغیر کمکی و دیگری بدون متغیر کمکی :



void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
//========================
void swap2(int &a,int &b){
a = a+b;
b = a-b;
a = a-b;
}
//========================


موفق باشید .

mbasirati
جمعه 11 دی 1388, 14:05 عصر
اگه منظورتون از این swap ، تعویض مقدار دو متغیر هستش ، اولا این کار آنقدر مشکلی نیست که از تابع

مربوطه اش استفاده کرد و میتوان براحتی آنرا پیاده سازی کرد ، ثانیا برای پیاده سازی هم میتونید از روش

متغیر کمکی یا بدون متغیر کمکی استفاده کنید :

مثال از دو تابع برای اینکار یکی با متغیر کمکی و دیگری بدون متغیر کمکی :



void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
//========================
void swap2(int &a,int &b){
a = a+b;
b = a-b;
a = a-b;
}
//========================


موفق باشید .
دوست عزیز ، ازجوابتون ممنونم ، ولی اینا رو میدونم ، میخوام بدونم که تابع آماده برای این کار هست یا نه؟
بازم ممنون

Salar Ashgi
جمعه 11 دی 1388, 23:16 عصر
دوست عزیز ، ازجوابتون ممنونم ، ولی اینا رو میدونم ، میخوام بدونم که تابع آماده برای این کار هست یا نه؟
بازم ممنون

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

کنیم ، پیشرفتی در کار نخواهیم داشت .

بانوی ایران
جمعه 11 دی 1388, 23:52 عصر
اگه منظورتون از این swap ، تعویض مقدار دو متغیر هستش ، اولا این کار آنقدر مشکلی نیست که از تابع

مربوطه اش استفاده کرد و میتوان براحتی آنرا پیاده سازی کرد ، ثانیا برای پیاده سازی هم میتونید از روش

متغیر کمکی یا بدون متغیر کمکی استفاده کنید :

مثال از دو تابع برای اینکار یکی با متغیر کمکی و دیگری بدون متغیر کمکی :



void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
//========================
void swap2(int &a,int &b){
a = a+b;
b = a-b;
a = a-b;
}
//========================


موفق باشید .

سلام بهتر نيست براي اين تابع از pointrاستفاده بشه
اينجوري كلا swapميشه نه فقط مقاديرش



void swap(int *xp, int *yp)
{
int temp;
temp = *xp;
*xp = *yp;
*yp = temp;
}

clover
شنبه 12 دی 1388, 12:43 عصر
اينجوري كلا swapميشه نه فقط مقاديرش
متوجه منظورتون نمیشم، شما هم دارید مقادیر را جا به جا می کنید. فقط متغیر ها را با ارجاع ارسال کرده اید، در ++C مفهومی هست به نام پارامتر ارجاعی (روشی که salar_cpp_cs استفاده کردند )که در اینجا کاربرد بیشتری نسبت روش شما دارد.


مثال از دو تابع برای اینکار یکی با متغیر کمکی و دیگری بدون متغیر کمکی :
در این مورد یادآوری می کنم که تابع دوم امن نیست و بهتر است به جای آن از این تابع استفاده شود:

void swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
}

Salar Ashgi
شنبه 12 دی 1388, 13:16 عصر
سلام بهتر نيست براي اين تابع از pointrاستفاده بشه
اينجوري كلا swapميشه نه فقط مقاديرش



void swap(int *xp, int *yp)
{
int temp;
temp = *xp;
*xp = *yp;
*yp = temp;
}


پارامترها عموما به دو روش به توابع پاس داده میشوند : 1) با مقدار Call by value

2) با آدرس Call by Reference

اونی که شما گفتید مربوط میشه به مورد اول ، که عملکرد تابع روی یک کپی از پارامترها

اعمال میشه ولی مثالی که من ذکر کرده بودم ، فرستادن پارامترها با علامت & (آدرس) ،

همان مورد دوم هستش که متغیر ها با آدرس به تابع پاس داده میشن ، و عملکرد تابع

روی خود متغیر ها اعمال میشه و چون اشاره گر نیز متغیری است که حاوی آدرس میباشد ،

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

کاربرد ندارد ولی بکار بردن '&' همه جا قابل استفاده است .

موفق باشید .

بانوی ایران
شنبه 12 دی 1388, 14:19 عصر
پارامترها عموما به دو روش به توابع پاس داده میشوند : 1) با مقدار Call by value

2) با آدرس Call by Reference

اونی که شما گفتید مربوط میشه به مورد اول ، که عملکرد تابع روی یک کپی از پارامترها

اعمال میشه ولی مثالی که من ذکر کرده بودم ، فرستادن پارامترها با علامت & (آدرس) ،

همان مورد دوم هستش که متغیر ها با آدرس به تابع پاس داده میشن ، و عملکرد تابع

روی خود متغیر ها اعمال میشه و چون اشاره گر نیز متغیری است که حاوی آدرس میباشد ،

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

کاربرد ندارد ولی بکار بردن '&' همه جا قابل استفاده است .

موفق باشید .
من اول يه عذر خواهي ميكنم ديشب خسته بودم و دقت به نوشته شما نكردم و & رو نديدم به خاطر همين فكر كردم فقط مقاديرswap ميشن
اما راجع به توضيحتون من تازه كار با pointerرو ياد گرفتم
وقتي ميگيمint*xpداريم اشاره ميكنيم به مقدار موجود توي خونه اي به ادرس xدرسته؟
پس با اين حساب من اشتباه گفتم روشي كه من گفتم مقادير توي x,yرو swap ميكنه نه ادرسشون درسته؟
اما كاري كه شما كرديد وقتي ميگيدint&aداريد ادرس aرو تعريف ميكنيد
a=b داره ادرسaرو ميريزه تو bيا مقدارش رو؟

clover
شنبه 12 دی 1388, 14:46 عصر
پس با اين حساب من اشتباه گفتم روشي كه من گفتم مقادير توي x,yرو swap ميكنه نه ادرسشون
اما كاري كه شما كرديد ادرس رو

هر دو روش دارند مقادیر موجود در خانه ها را جابه جا می کنند و اصلا کاری که ما می خواهیم انجام بدهیم همین است.
برای جابه جا کردن مقادیر دو متغیر (مقادیر دو خانه از حافظه) نیاز به دانستن مکان (آدرس) آن متغیر ها داریم (اصطلاحا هندل متغیر)، در تابع اصلی این هندل همان نام متغیر است، در توابع دیگر اشاره گری که حاوی آدرس متغیر است.
روش دیگر استفاده از ارجاع (تعریف متغیر با عملگر &) که ما با این کار در واقع نام دیگری برای متغیر تعریف می کنیم.

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
int a = 5;
int &b = a;
int c = a;

cout << a;

c += 2;
cout << a << c;

b += 2;
cout << a << b;

_getch();
return 0;
}
در برنامه بالا b متغیر جدیدی نیست، فقط نام دیگری برای متغیر a هست.
با تغییر c هیچ اتفاقی برای a نمی افتد، اما تغییر b در واقع تغییر a هست، در توابع هم دقیقا همین اتفاق می افتد.

بانوی ایران
شنبه 12 دی 1388, 14:51 عصر
هر دو روش دارند مقادیر موجود در خانه ها را جابه جا می کنند و اصلا کاری که ما می خواهیم انجام بدهیم همین است. برای جابه جا کردن مقادیر دو متغیر (مقادیر دو خانه از حافظه) نیاز به دانستن مکان (آدرس) آن متغیر ها داریم (اصطلاحا هندل متغیر)، در تابع اصلی این هندل همان نام متغیر است، در توابع دیگر اشاره گری که حاوی آدرس متغیر است. روش دیگر استفاده از ارجاع (تعریف متغیر با عملگر &) که ما با این کار در واقع نام دیگری برای متغیر تعریف می کنیم.
ما ميخوايم a,bرو swapكنيم پس ما ادرس رو swapميكنيم در نتيجه مقادير هم swap ميشن
راه اقاي سالار اينه درست ميگم؟
دوست عزيز نوشته قبلي رو رو اصلاح كردم ميشه يه نگاه كنيد و به اون جواب بديد

clover
شنبه 12 دی 1388, 15:04 عصر
ما ميخوايم a,bرو swapكنيم پس ما ادرس رو swapميكنيم در نتيجه مقادير هم swap ميشن
نه، کاری که ما می خواهیم انجام بدهیم دقیقا جابه جا کردن مقادیر است. کافیه شما یکبار آدرس ها را عوض کنید و مقادیر را چک کنید تا متوجه منظور من بشید.

دوست عزيز نوشته قبلي رو رو اصلاح كردم ميشه يه نگاه كنيد و به اون جواب بديد
من هم پست قبلم را اصلاح کردم. می دونم مشکل شما کجاست، اما قادر به توضیح نیستم.
شاید جناب salar_cpp_cs بتونند شما را راهنمایی کنند.

بانوی ایران
دوشنبه 14 دی 1388, 14:41 عصر
نه، کاری که ما می خواهیم انجام بدهیم دقیقا جابه جا کردن مقادیر است. کافیه شما یکبار آدرس ها را عوض کنید و مقادیر را چک کنید تا متوجه منظور من بشید.

من هم پست قبلم را اصلاح کردم. می دونم مشکل شما کجاست، اما قادر به توضیح نیستم.
شاید جناب salar_cpp_cs بتونند شما را راهنمایی کنند.

يعني شما ميگيد كدي كه اقايsalar_cpp_cs نوشتن ادرس ها رو swapنميكنه؟

به هر حال ممنون از توضيحاتتون:چشمک: