Post updated on 28th July, 2016 at 07:06 am
আজ রাফির বিবাহ। ^_^
আদর আপ্যায়নের সাথে তার শ্যালিকাগণ কিঞ্চিত ‘মজাক’ করার চেষ্টা করছে। রাফির সামনে তিনটা একই সাইজের গ্লাস রাখা হল। চিনতে সুবিধা হবে তাই গ্লাসগুলোকে a, b ও c নাম দিলাম। শ্যালিকাগণ a নামক গ্লাসে রেখেছেন চিরতা ভেজানো পানি, b নামক গ্লাসে রেখেছেন কোকাকোলা। আর c গ্লাসটা খালি।
রাফি অন্দর মহল ( <3 ) থেকে গোপন সূত্রে জানতে পেরেছে প্রথম দুটি গ্লাসের যে কোন একটা গ্লাসের তরল বস্তু তাকে পান করতে বাধ্য করা হবে। আর কোন্ গ্লাসটির তরল তাকে গলদকরণ করানো হবে সেটা নির্বাচন করার জন্য “ওবু দশ কুড়ি নাড়ি-ভূড়ি, চিংড়ি মাছের চচ্চরি…” টাইপের একটি ছড়াও বানানো হয়েছে। তার একজন স্নেহের শ্যালিকা ছড়া আবৃত্তি করে ঠিক ঠিক a নামক গ্লাসে এসেই থামবে। ফলে জামাই বাবাজিকে চিরতার পানিই খেতে হবে। রাফির চিন্তায় অন্দর মহলের সেই রমনী বড়ই পেরেশান! সেই রমনীই এই c নামক খালি গ্লাসের ব্যবস্থা করেছেন। এখন রাফি ঠিক কিভাবে এই আতিথিয়তা থেকে বাঁচতে পারে?
ঠিক ধরেছ! কোন ক্রমে যদি a গ্লাসের চিরতার পানিটুকু b গ্লাসে, আর b গ্লাসের কোকাকোলাটুকু a গ্লাসে ঢেলে দেয়া যায় তাহলেই একমাত্র রক্ষা! অর্থাৎ গ্লাসদুটির পানীয়গুলোকে অদল-বদল করতে হবে। ধর কেউ গ্লাস-ট্রের দিকে তাকিয়ে নেই। এখন রাফি কিভাবে গ্লাসের তরলগুলোকে অদল-বদল করতে পারে?
খুব সোজা তাই না? রাফি যা করতে পারে সেগুলোকে নিচে লিখছি-
a গ্লাসের চিরতার পানি c গ্লাসে ঢালো [এখন c গ্লাসে চিরতার পানি আছে] a যেহেতু খালি তাই, b গ্লাসের কোকাকোলা a গ্লাসে ঢালো [এখন a গ্লাসে কোকাকোলা আছে, b গ্লাসটা খালি] c গ্লাসের চিরতার পানি b গ্লাসে ঢালো
খেয়াল করে দেখ, তিনটা কাজ করার ফলে কিন্তু আমরা গ্লাস দুটোর তরলকে অন্য পাত্রে স্থানান্তর করে দিয়েছি। একদম সিম্পল না?
প্রোগ্রামিং করার সময়ও এরকম দুটি variable এর মান পরস্পরের মধ্যে অদল-বদলের দরকার হয়। আর এর একটা গাল ভরা নাম আছে। তা হচ্ছে সোয়াপ (Swap). ধর, a ও b দুটি ভেরিয়েবলে দুইটি মান আছে। তুমি তাদের মধ্যে সোয়াপ করতে চাও। তাহলে উপরের তিনটা কাজই করতে হবে।
int a = 5, b = 6, c; //c কিন্তু ফাঁকা c = a; a = b; //a ফাঁকা না, কিন্তু b এর মান a তে assign হচ্ছে, ফলে a এর পূর্বের মান আর সেখানে থাকছে না b = c; // b এর মান আগের লাইনে a তে রিপ্লেস করে দেয়া হয়েছে। এখন a এর যেই মান c তে ছিল সেই মানটাই b তে assign হচ্ছে
এবার তোমার কাছে প্রশ্নঃ তৃতীয় কোন variable এর সাহায্য ছাড়া কি সোয়াপ করা সম্ভব? একটু চিন্তা কর।
হিন্টস দিচ্ছিঃ দুটি ভেরিয়েবল দিয়েই সোয়াপ করা সম্ভব তাদের মধ্যে যোগ বিয়োগের কিছু হিসাব-নিকাশ করে। গুণ-ভাগ দিয়েও করা যাবে। XOR operation চালিয়েও করা যায়। তোমার কাজ হচ্ছে তৃতীয় ভ্যারিয়েবল ছাড়া যে কোন ভাবে দুটি number swap করা।
এটা আরেকটা way:
int a=10, b=5; a = a ^ b; // x now becomes 15 (1111) b = a ^ b; // y becomes 10 (1010) a = a ^ b; // x becomes 5 (0101) //উপরের তিন লাইনের কাজ নিচের এক লাইনে করা যায়ঃ a^=b^=a^=b;
এবার আসি swap function এর ব্যাপারে। C++ এ swap() নামের একটা method আছে যেটা ব্যবহার করে দুটি ভেরিয়েবলের মধ্যে সোয়াপ করা যায়।
আর সি প্রোগ্রামিং ল্যাঙ্গুয়েজে যেহেতু swap() নাই তাই নিজেরা ফাংশন লিখে ব্যবহার করা যেতে পারে।
void swapFunction(int *a, int *b) { int c = *a; *a = *b; *b = c; } int main() { int a = 5, b = 6; swapFunction(&a, &b); // value না পাঠিয়ে তাদের reference পাঠানো হয়েছে printf("%d %d," a, b); return 0; }
পয়েন্টার ব্যবহার করে হয়ত আরো কোন ভাবে সোয়াপ করা যেতে পারে। ঘাটাঘাটি করে দেখো। আর ভাল কোন উপায় বের করতে পারলে অবশ্যই কমেন্টে জানাবা। শেয়ারিং ইজ কেয়ারিং… 😉
Method 1 (Using Arithmetic Operators)
The idea is to get sum in one of the two given numbers. The numbers can then be swapped using the sum and subtraction from sum.
ethod 2 (Using Bitwise XOR)
The bitwise XOR operator can be used to swap two variables. The XOR of two numbers x and y returns a number which has all the bits as 1 wherever bits of x and y differ. For example XOR of 10 (In Binary 1010) and 5 (In Binary 0101) is 1111 and XOR of 7 (0111) and 5 (0101) is (0010).
Problems with above methods
1) The multiplication and division based approach doesn’ work if one of the numbers is 0 as the product becomes 0 irrespective of the other number.
2) Both Arithmetic solutions may cause arithmetic overflow. If x and y are too large, addition and multiplication may go out of integer range.
3) When we use pointers to variable and make a function swap, all of the above methods fail when both pointers point to the same variable. Let’s take a look what will happen in this case if both are pointing to the same variable.
well said! (Y)
avabe ki swap hoa?
হওয়ার কথা না।
here is my pointer code
evabe hbe apni sure? hbena mne hcche
Thanks,
I’ve got a fun for your describing procedure
You are most welcome.
Happy to know your valuable opinion. 🙂
অনেক ভালো লিখেছেন,বিশেষ করে বোঝানোর পদ্ধতি টা খুব ভালো