ধরা যাক আমাদেরকে বলা হল যে, একটা ইংরেজি বাক্য দেওয়া আছে। আমাদের গুনে বের করতে হবে যে বাক্যটিতে কয়টি শব্দ আছে। আমরা চোখ দিয়ে তাকিয়ে শব্দ গুনে ফেলতে পারবো, কোন সমস্যা নয়। কিন্তু আমাদের যদি একটি প্রোগ্রাম লিখতে হয় এই গোনার কাজটি করার জন্য, তখন আমরা কি করব?
প্রথমেই আসবে ইনপুট এর ব্যাপার টা। বাক্যটাকে প্রথমে আমরা ইনপুট নিবো। আর যেহেতু একটি বাক্য অনেকগুলো ক্যারেকটার এর সমন্বয় তাই আমাদের চিন্তা করতে হবে স্ট্রিং ইনপুট নিয়ে। বাক্যটাকে আমরা একটি স্ট্রিং হিসেবেই ইনপুট নিবো।
এইবার শব্দ খোজার পালা। আর এখানেই আমাদের দরকার লিনিয়ার বা সিকোয়েন্সিয়াল সার্চ সম্পর্কে ধারণা। যাদের এই ধারণাটা নাই তারা দয়া করে এখান থেকে পড়ে আসেন।
লিনিয়ার সার্চের মতই আমরা স্ট্রিং এর প্রথম ইন্ডেক্স থেকে খোজা শুরু করবো এবং শেষের নাল টার্মিনেটর ধারী ইন্ডেক্স পর্যন্ত খুঁজবো। এখন প্রশ্ন হল, আমরা কোন বৈশিষ্ট্য টা ধরে খুজবো? কিসের উপর ভিত্তি করে খুজলে আমরা শব্দের সঠিক সংখ্যা খুজে পাবো? আসুন আমরা একটা উদাহরণ দিই। ধরি,
I love you.
হল আমাদের ইংরেজি বাক্য। আমরা জানি বাক্যের ২ টি শব্দের মধ্যে একটি ফাকা স্থান বা blank স্পেস থাকে। কাজেই আমরা যদি ফাকা স্থানের সংখ্যা বের করি তাহলে শব্দ হিসাব করাটা কিছুটা সহজ হবে। যেমন, উপরের উদাহরণ এ ২ কি ফাকা স্থান আছে। আর, ব্যাকরণগত ভাবে সঠিক যে কোন বাক্যের শেষে একটি ফুলস্টপ থাকবে এবং তার আগে একটি শব্দ থাকবে। তাই স্পেস সংখ্যার সাথে ১ যোগ করলেই আমরা পেয়ে যাবো শব্দ সংখ্যা।
কিন্তু সমস্যা অন্য এক জায়গায়। যদি বাক্যটি ব্যাকরণগত ভাবে সঠিক না হয়? যদি দুইটি শব্দের মধ্যে একাধিক ফাকা স্থান থাকে? যদি বাক্যের শেষে ফুল স্টপ এর পরিবর্তে ফাকা স্থান থাকে? যদি বাক্যের শুরুতেই একটি স্পেস থাকে? এরকম অনেক অনেক সমস্যায় আমাদের পড়তে হতে পারে। কাজেই যদি বলা না থাকে যে ব্যাকরণগত ভাবে সঠিক বাক্য আমাদের দেওয়া হবে সেই ক্ষেত্রে আমাদেরকে এই সব ত্রুটিপূর্ণ অবস্থাগুলোর কথা বিবেচনায় রাখতে হবে। আমাদেরকে এমন একটি অবস্থার কথা চিন্তা করতে হবে, এমন একটি শর্ত বিবেচনা করতে হবে, যে শর্তে গণনা করলে বাক্যের গঠন যেমনই হোক না কেন সঠিক শব্দসংখ্যা আমরা পেয়ে যাবো।
আমি একটি শর্ত সাজেস্ট করি।
১. আমরা একেবারে শুরুর ইন্ডেক্স থেকে গননা শুরু করবো না। আমরা ১ নম্বর ইন্ডেক্স থেকে গননা শুরু করবো।
২. আমরা তিনটা জিনিসের দিকে নজর রাখবো। স্পেস, স্পেশাল ক্যারেকটার আর নাল টার্মিনেটর।
৩. এদের যে কোন একটাকে খুঁজে পেলে চেক করে দেখবো যে তার আগের ইন্ডেক্সে একটি এলফাবেট বা নাম্বার আছে কি না। যদি এলফাবেট থাকে তাহলে আমরা ধরে নিবো যে একটা শব্দ (হিসাবে সুবিধার জন্য আমরা ধরে নিচ্ছি যে সংখ্যা বা সংখ্যাযুক্ত শব্দও শব্দ) আমরা পেয়ে গেছি। আর যদি তা না হয় তাহলে আমরা পরবর্তি ইন্ডেক্সে সার্চ চালিয়ে যাবো।
কাজেই আমাদের কোড এর গঠন হবে,
#include<stdio.h>
#include<ctype.h>
int main()
{
char str[128], ch; /* স্ট্রিং ধারণের জন্য array */
int i, word=0;
/* ইনপুট অংশ শুরু */
for (i =0;;)
{
ch=getchar();
if (ch=='\n')
{
str[i]='\0';
break;
}
str[i++]=ch;
}
/* ইনপুট অংশ শেষ */
/* সার্চ শুরু */
for (i =1; ; i++)
{
if (str[i]==' '||ispunct(str[i])||str[i]=='\0') /* স্পেস, স্পেশাল ক্যারেকটার ও নাল টার্মিনেটর চেক */
{
if (isalnum(str[i-1])) /* আগের ক্যারেকটার টি এলফাবেট বা ডিজিট কি না সেটা চেক */
word++;
if (str[i]=='\0')
break;
}
}
printf("Number of words = %d", word);
return 0;
}
দেখুন তো আপনারা চিন্তা করে অন্য একটি উপায় বের করতে পারেন কি না!!!
প্রথমেই আসবে ইনপুট এর ব্যাপার টা। বাক্যটাকে প্রথমে আমরা ইনপুট নিবো। আর যেহেতু একটি বাক্য অনেকগুলো ক্যারেকটার এর সমন্বয় তাই আমাদের চিন্তা করতে হবে স্ট্রিং ইনপুট নিয়ে। বাক্যটাকে আমরা একটি স্ট্রিং হিসেবেই ইনপুট নিবো।
এইবার শব্দ খোজার পালা। আর এখানেই আমাদের দরকার লিনিয়ার বা সিকোয়েন্সিয়াল সার্চ সম্পর্কে ধারণা। যাদের এই ধারণাটা নাই তারা দয়া করে এখান থেকে পড়ে আসেন।
লিনিয়ার সার্চের মতই আমরা স্ট্রিং এর প্রথম ইন্ডেক্স থেকে খোজা শুরু করবো এবং শেষের নাল টার্মিনেটর ধারী ইন্ডেক্স পর্যন্ত খুঁজবো। এখন প্রশ্ন হল, আমরা কোন বৈশিষ্ট্য টা ধরে খুজবো? কিসের উপর ভিত্তি করে খুজলে আমরা শব্দের সঠিক সংখ্যা খুজে পাবো? আসুন আমরা একটা উদাহরণ দিই। ধরি,
I love you.
হল আমাদের ইংরেজি বাক্য। আমরা জানি বাক্যের ২ টি শব্দের মধ্যে একটি ফাকা স্থান বা blank স্পেস থাকে। কাজেই আমরা যদি ফাকা স্থানের সংখ্যা বের করি তাহলে শব্দ হিসাব করাটা কিছুটা সহজ হবে। যেমন, উপরের উদাহরণ এ ২ কি ফাকা স্থান আছে। আর, ব্যাকরণগত ভাবে সঠিক যে কোন বাক্যের শেষে একটি ফুলস্টপ থাকবে এবং তার আগে একটি শব্দ থাকবে। তাই স্পেস সংখ্যার সাথে ১ যোগ করলেই আমরা পেয়ে যাবো শব্দ সংখ্যা।
কিন্তু সমস্যা অন্য এক জায়গায়। যদি বাক্যটি ব্যাকরণগত ভাবে সঠিক না হয়? যদি দুইটি শব্দের মধ্যে একাধিক ফাকা স্থান থাকে? যদি বাক্যের শেষে ফুল স্টপ এর পরিবর্তে ফাকা স্থান থাকে? যদি বাক্যের শুরুতেই একটি স্পেস থাকে? এরকম অনেক অনেক সমস্যায় আমাদের পড়তে হতে পারে। কাজেই যদি বলা না থাকে যে ব্যাকরণগত ভাবে সঠিক বাক্য আমাদের দেওয়া হবে সেই ক্ষেত্রে আমাদেরকে এই সব ত্রুটিপূর্ণ অবস্থাগুলোর কথা বিবেচনায় রাখতে হবে। আমাদেরকে এমন একটি অবস্থার কথা চিন্তা করতে হবে, এমন একটি শর্ত বিবেচনা করতে হবে, যে শর্তে গণনা করলে বাক্যের গঠন যেমনই হোক না কেন সঠিক শব্দসংখ্যা আমরা পেয়ে যাবো।
আমি একটি শর্ত সাজেস্ট করি।
১. আমরা একেবারে শুরুর ইন্ডেক্স থেকে গননা শুরু করবো না। আমরা ১ নম্বর ইন্ডেক্স থেকে গননা শুরু করবো।
২. আমরা তিনটা জিনিসের দিকে নজর রাখবো। স্পেস, স্পেশাল ক্যারেকটার আর নাল টার্মিনেটর।
৩. এদের যে কোন একটাকে খুঁজে পেলে চেক করে দেখবো যে তার আগের ইন্ডেক্সে একটি এলফাবেট বা নাম্বার আছে কি না। যদি এলফাবেট থাকে তাহলে আমরা ধরে নিবো যে একটা শব্দ (হিসাবে সুবিধার জন্য আমরা ধরে নিচ্ছি যে সংখ্যা বা সংখ্যাযুক্ত শব্দও শব্দ) আমরা পেয়ে গেছি। আর যদি তা না হয় তাহলে আমরা পরবর্তি ইন্ডেক্সে সার্চ চালিয়ে যাবো।
কাজেই আমাদের কোড এর গঠন হবে,
#include<stdio.h>
#include<ctype.h>
int main()
{
char str[128], ch; /* স্ট্রিং ধারণের জন্য array */
int i, word=0;
/* ইনপুট অংশ শুরু */
for (i =0;;)
{
ch=getchar();
if (ch=='\n')
{
str[i]='\0';
break;
}
str[i++]=ch;
}
/* ইনপুট অংশ শেষ */
/* সার্চ শুরু */
for (i =1; ; i++)
{
if (str[i]==' '||ispunct(str[i])||str[i]=='\0') /* স্পেস, স্পেশাল ক্যারেকটার ও নাল টার্মিনেটর চেক */
{
if (isalnum(str[i-1])) /* আগের ক্যারেকটার টি এলফাবেট বা ডিজিট কি না সেটা চেক */
word++;
if (str[i]=='\0')
break;
}
}
printf("Number of words = %d", word);
return 0;
}
দেখুন তো আপনারা চিন্তা করে অন্য একটি উপায় বের করতে পারেন কি না!!!
0 comments:
Post a Comment