এবার আমরা দুটো স্ট্রিংকে লেক্সিকোগ্রাফিকালি কম্পেয়ার করে বের করব দুটি স্ট্রিং এর মধ্যে কোনটি ছোট আর কোনটি বড়। লেক্সিকোগ্রাফিকালি কম্পেয়ার মূলত ডিকশনারি সিরিয়াল ফলো করে। a,b,c,d....x,y,z এই সিরিয়াল অনুযায়ী লেক্সিকোগ্রাফিকাল কম্পেয়ারিজন হয়।
এখানে আমাদের কাছে দুটো স্ট্রিং থাকবে। আমরা লুপ চালিয়ে দুটি স্ট্রিং ই চেক করতে থাকব। আমরা লুপ থামিয়ে দিব যদিঃ
- কোন স্ট্রিং শেষ হয়ে যায়।
- যদি দুটি স্ট্রিং এর মধ্যে অমিল পাওয়া যায়।
যদি কোন স্ট্রিং শেষ হয়ে যায় অন্য আরেকটির আগে তাহলে বুঝা যাবে ওটাই ছোট স্ট্রিং। আর যদি দুটি একসাথে শেষ হয় তাহলে দুটোই সমান।
আর যদি দুটি স্ট্রিং এর মধ্যে অমিল পাওয়া যায় তাহলে চেক করে দেখব অমিল পাওয়া ক্যারেক্টার গুলোর মধ্যে কোন স্ট্রিং এর ক্যারেক্টারটি ছোট। যেটি ছোট হবে ওই স্ট্রিংটিই ছোট হবে।
এবার এই লজিকটি কোডে করে ফেলি আমরাঃ
#include<stdio.h>
int main()
{
char a[100],b[100];
scanf("%s %s",a,b); // দুটি স্ট্রিং ইনপুট নেওয়া হচ্ছে
int i=0;
while(1) // এখানে আমাদের লুপ থামিয়ে দেওয়ার অনেকগুলো কন্ডিশন আছে। সবগুলো কন্ডিশন শুরুতে লিখে ফেলাটা ভালো দেখাবে না তাই এখানে আমরা ইনফাইনাইট লুপ চালাচ্ছি। লুপের ভিতর যখনি থেমে যাওয়ার কন্ডিশন মিলে যাবে তখন আমরা ব্রেক করে লুপ থামিয়ে দিব।
{
if(a[i]=='\0' && b[i]=='\0') // প্রথমেই চেক করছি দুটো স্ট্রিং ই শেষ কিনা অর্থাৎ আমরা দুটো স্ট্রিং এর ই নালে চলে আসছি কিনা।
{
printf("Same\n"); // যদি দুটো স্ট্রিং ই শেষ হয়ে যায় তাহলে দুটো স্ট্রিং ই সেইম।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
else if(a[i]=='\0') // উপরের কন্ডিশনটি সত্য হয় নি তাই এবার আমরা চেক করছি শুধু প্রথম স্ট্রিংটি শেষ হয়েছে কিনা
{
printf("A choto\n"); // যদি প্রথম স্ট্রিংটি শেষ হয়ে থাকে তাহলে এটিই ছোট।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
else if(b[i]=='\0') // উপরের দুটো কন্ডিশনটি সত্য হয় নি তাই এবার আমরা চেক করছি শুধু দ্বিতীয় স্ট্রিংটি শেষ হয়েছে কিনা
{
printf("B choto\n"); // যদি দ্বিতীয় স্ট্রিংটি শেষ হয়ে থাকে তাহলে এটিই ছোট।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
// উপরের তিনটি কন্ডিশনের কোনটিই যদি সত্য না হয়ে থাকে তাহলে বুঝা যাচ্ছে কোন স্ট্রিং ই শেষ হয়ে যায় নি। এবার আমাদের মিল অমিল চেক করতে হবে তাই নতুন একটি ইফ এলস লেডার চালানো হচ্ছে।
if(a[i]==b[i]) // প্রথমেই চেক করে নিচ্ছি দুটো স্ট্রিং এর ক্যারেক্টার সেইম কিনা।
{
i++; // সেইম হলে আমরা লুপ কন্টিনিউ করব। তাই i এর মান বাড়িয়ে দিচ্ছি।
}
else if(a[i]<b[i]) // যদি উপরের কন্ডিশন সত্য না হয় তারমানে অমিল পাওয়া গেছে। এবার দেখছি প্রথম স্ট্রিং এর ক্যারেক্টারটি ছোট কিনা।
{
printf("A choto\n"); // যদি ছোট হয় তাহলে প্রিন্ট করে দিচ্ছি প্রথম স্ট্রিংটি ছোট।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
else // যদি উপরের কন্ডিশন সত্য না হয় তারমানে অবশ্যই দ্বিতীয় স্ট্রিং এর ক্যারেক্টারটি ছোট।
{
printf("B choto\n"); // তাই প্রিন্ট করে দিচ্ছি দ্বিতীয়টি ছোট।
break; // ব্রেক করে লুপ থামিয়ে দেওয়া হচ্ছে।
}
}
return 0;
}
আমরা নিজেরা এটির লজিক বুঝে ফেললাম এবার আমরা এই পুরো কাজটি করার জন্য একটি বিল্ট-ইন ফাংশন আছে। ওটা দেখে নিব।
ফাংশনটি হলো strcmp()। এই ফাংশনে আমরা দুটি স্ট্রিং দেই। ফাংশনটি আমাদের ৩ ধরনের ভেলু রিটার্ন করে।
- ০ এর থেকে বড়ঃ দ্বিতীয় স্ট্রিংটি ছোট
- ০ : দুটি স্ট্রিং ই সমান।
- ০ এর থেকে ছোটঃ প্রথম স্ট্রিংটি ছোট।
#include<stdio.h>
#include<string.h>
int main()
{
char a[100],b[100];
scanf("%s %s",a,b); // দুটি স্ট্রিং ইনপুট নিচ্ছি।
int v=strcmp(a,b); // strcmp ফাংশনের মধ্যে ইনপুট নেওয়া দুটি স্ট্রিং দেওয়া হচ্ছে এবং ফাংশন যেই ভেলুটি রিটার্ন করবে তা আলাদা একটি ভেরিয়েবলে স্টোর করছি।
if(v<0) // চেক করে দেখছি ফাংশনের রিটার্ন করা ভেলুটি ০ এর থেকে ছোট কিনা
{
printf("A is smaller\n"); // যদি ছোট হয় তাহলে প্রথম স্ট্রিংটি ছোট।
}
else if(v>0) // চেক করে দেখছি ফাংশনের রিটার্ন করা ভেলুটি ০ এর থেকে বড় কিনা
{
printf("B is smaller\n"); // যদি বড় হয় তাহলে দ্বিতীয় স্ট্রিংটি ছোট।
}
else // যদি রিটার্ন করা ভেলুটি ০ হয়
{
printf("Same\n"); // তাহলে স্ট্রিং দুটি সেইম।
}
return 0;
}