তৃতীয় ভেরিয়েবলটি ব্যবহার না করে দুটি সংখ্যার অদলবদল করার জন্য একটি সি সি উদাহরণ দেখুন।
প্রোগ্রাম 1:
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a+b;//a=30 (10+20)
b=a-b;//b=10 (30-20)
a=a-b;//a=20 (30-10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
আউটপুট:
অদলবদলের আগে a = 10 b = 20 এর পরে a = 20 b = 10 After
প্রোগ্রাম 2: * এবং / ব্যবহার করে
আসুন আরেকটি উদাহরণ দেখুন * এবং / ব্যবহার করে দুটি সংখ্যা অদলবদল করতে।
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a*b;//a=200 (10*20)
b=a/b;//b=10 (200/20)
a=a/b;//a=20 (200/10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
আউটপুট:
অদলবদলের আগে a = 10 b = 20 এর পরে a = 20 b = 10 After
প্রোগ্রাম 3: বিটওয়াইজ এক্সওআর অপারেটরটি ব্যবহার করা:
বিটওয়াইজ এক্সওআর অপারেটরটি দুটি ভেরিয়েবল অদলবদল করতে ব্যবহৃত হতে পারে। X এবং y দুটি সংখ্যার XOR একটি সংখ্যার রিটার্ন দেয় যেখানে যেখানে x এবং y এর বিট পৃথক হয় সেখানে 1 হিসাবে সমস্ত বিট থাকে। উদাহরণস্বরূপ, 10 এর XOR (বাইনারি 1010 ইন) এবং 5 (বাইনারি 0101 তে) 1111 এবং 7 (0111) এবং 5 (0101) এর XOR (0010)।
#include <stdio.h>
int main()
{
int x = 10, y = 5;
// Code to swap 'x' (1010) and 'y' (0101)
x = x ^ y; // x now becomes 15 (1111)
y = x ^ y; // y becomes 10 (1010)
x = x ^ y; // x becomes 5 (0101)
printf("After Swapping: x = %d, y = %d", x, y);
return 0;
আউটপুট:
অদলবদলের পরে: x = 5, y = 10
প্রোগ্রাম 4:
এখনও কেউ স্টাডি :: অদলবদল ব্যবহারের পরামর্শ দেয়নি।
std::swap(a, b);
আমি কোনও অস্থায়ী ভেরিয়েবল ব্যবহার করি না এবং ক এবং খ এর ধরণের উপর নির্ভর করে বাস্তবায়নের একটি বিশেষীকরণ থাকতে পারে যা হয় না। কোনও 'কৌশল' উপযুক্ত কিনা তা জেনেও বাস্তবায়নটি লিখতে হবে।
উপরোক্ত পদ্ধতিগুলির সাথে সমস্যাগুলি:
1) গুণমান এবং বিভাগ ভিত্তিক পদ্ধতির কাজ করে না 'যদি সংখ্যাগুলির মধ্যে একটি 0 হয় তবে অন্য সংখ্যা নির্বিশেষে পণ্য 0 হয়ে যায়।
2) উভয় গাণিতিক সমাধানগুলি পাটিগণিতের ওভারফ্লো হতে পারে। যদি x এবং y খুব বড় হয় তবে সংযোজন এবং গুণগুলি পূর্ণসংখ্যার ব্যাপ্তির বাইরে চলে যেতে পারে।
3) যখন আমরা কোনও ভেরিয়েবলের জন্য পয়েন্টার ব্যবহার করি এবং একটি ফাংশন অদলবদল করি, তখন উভয় পয়েন্টার একই ভেরিয়েবলের দিকে নির্দেশ করলে উপরের সমস্ত পদ্ধতি ব্যর্থ হয়। আসুন একবার দেখে নেওয়া যাক যদি উভয়ই একই ভেরিয়েবলের দিকে ইঙ্গিত করে তবে এই ক্ষেত্রে কী ঘটবে।
// বিটওয়াইস এক্সওআর ভিত্তিক পদ্ধতি
x = x ^ x; // x becomes 0
x = x ^ x; // x remains 0
x = x ^ x; // x remains 0
// পাটিগণিত ভিত্তিক পদ্ধতি
x = x + x; // x becomes 2x
x = x – x; // x becomes 0
x = x – x; // x remains 0
আসুন নীচের প্রোগ্রামটি দেখুন।
#include <stdio.h>
void swap(int *xp, int *yp)
{
*xp = *xp ^ *yp;
*yp = *xp ^ *yp;
*xp = *xp ^ *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
আউটপুট :
অদলবদলের পরে (& x, & x): x = 0
নিজের সাথে একটি ভেরিয়েবল অদলবদল করতে অনেক স্ট্যান্ডার্ড অ্যালগরিদমে প্রয়োজন হতে পারে। উদাহরণস্বরূপ, কুইকসোর্টের এই বাস্তবায়নটি দেখুন যেখানে আমরা নিজের সাথে একটি চলক অদলবদল করতে পারি। অদলবদল করার আগে একটি শর্ত রেখে উপরের সমস্যাটি এড়ানো যায়।
#include <stdio.h>
void swap(int *xp, int *yp)
{
if (xp == yp) // Check if the two addresses are same
return;
*xp = *xp + *yp;
*yp = *xp - *yp;
*xp = *xp - *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
আউটপুট :
অদলবদলের পরে (& x, & x): x = 10