হয়ে যান C প্রোগ্রামিং Ninja [পর্ব-৩] :: “ কনট্রোল ফ্লো:) :) ”


গত দুই পর্বে আমরা যে ছোট কোডগুলো দেখেছি তা খুবই প্রাথমিক পর্যায়ের।বাস্তবে কোডগুলো এত সহজ নয়।স্বাভাবিকভাবে চিন্তা করে দেখুন, ইউজারের কাছে একটা কিছু ইনপুট নিয়ে সেটাতে কিছু যোগ,বিয়োগ করে ফলাফল আউটপুটে দেখানোর জন্য আমাদের বাসায় তো ক্যালকুলেটর আছে।তাহলে কম্পিউটার প্রোগ্রামের দরকারটা কোথায় ?আসলে রিয়েল লাইফে সমস্যাগুলো এত সহজ হয় না তা আমরা ভালোই বুঝি।এখন আমরা বেশি কঠিন সমস্যায় যাব না,একটা সহজ সমস্যা নিয়ে আলোচনা করে আজকের টপিকটা বুঝে ফেলার চেস্টা করি ঝটপট।

আমরা এখানে যারা আছি সবাই তো মোটামুটি ফুটবল ভক্ত,তাইনা ?এখন ফিফার  Ranking টা কেমন আপনারা মনে হয় জানেন।যারা জানেন না, আসুন আমরা জেনে নিই।

  • ১.নেদারল্যান্ড
  • ২.স্পেন
  • ৩.জার্মানি
  • ৬.ব্রাজিল
  • ৯.আর্জেন্টিনা

সবাইকে নিলাম না।ব্রাজিল ও আর্জেন্টিনা দুটোকেই রাখলাম যেন কোন পক্ষের মন খারাপ না হয় :)।যাইহোক আমরা প্রবলেমে আসি।আজকের প্রবলেম হল আমরা  Rank টা ইনপুট নিব ও দেখব সংখ্যাটা কত।দেখে  দলের নামটা আমরা আউটপুট দেব।আশাকরি কারো বুঝতে সমস্যা নেই।

এখন আসি সমাধানে।Rank একটা ইন্টিজার সংখ্যা।এটা আমরা সহজেই ইনপুট নিতে পারি এখন,তাইনা ?যদি না পারি তাহলে আগের পোস্টটা থেকে একটু ঘুরে আসলেই পারব।এখন আমাদের দেখতে হবে কিভাবে আমরা চেক করব যে কত ইনপুট নিলাম।এরজন্য আমাদের যে দুইটা টপিক আজ শিখতে হবে তা হল Operator ও Control Flow।

অপারেটর নিয়ে আজকের পোস্টে বেশি আলোচনা করব না আমরা।এর জন্য আলাদা একটা পোস্ট আসবে সামনে।আজ শুধু আমরা রিলেশনাল অপারেটরগুলো সম্পর্কে জানব।রিলেশনাল অপারেটরগুলো বসে দুইটা অপারেন্ডের মাঝখানে বা সংখ্যার মাঝখানে।রিলেশনাল অপারেটর ব্যবহার করে আমরা পরীক্ষা করতে পারি একটা সংখ্যা আরেকটা সংখ্যার চেয়ে ছোট অথবা বড় কিনা, দুইটা সংখ্যা সমান বা অসমান কিনা ইত্যাদি।যেমন,

  • ১.  a ভ্যারিয়েবলের মান b এর মান অপেক্ষা বড় কিনা তা আমরা  a > b এক্সপ্রেশন দিয়ে চেক করতে পারি এবং সমান অথবা বড় কিনা সেটা a >= b দিয়ে চেক করতে পারি।অনুরূপভাবে a ভ্যারিয়েবলের মান b এর মান অপেক্ষা ছোট কিংবা "সমান অথবা ছোট" কিনা সেটা শুধু মাঝের অপারেটরটা বদলে দিয়েই চেক করতে পারি।
  • ২. c ভ্যারিয়েবলের মান ও d ভ্যারিয়েবলের মান সমান কিনা সেটা c == d দিয়ে পরীক্ষা করতে পারি আমরা। অসমান কিনা সেটাও অনুরূপভাবে মাঝের অপারেটর পরিবর্তন করে != বসিয়ে দেখা সম্ভব।

এখন আমরা একটু মনে মনে ভেবে নিই,আমাদের সমস্যা সমাধানের অ্যালগরিদম কি হবে।দেখুন তো, এমন কিছু আপনাদের মনে আসছে কিনা ?

  • ১.ইনপুট
  • ২. যদি ইনপুট = ১ হয় তাহলে "নেদারল্যান্ড" প্রিন্ট কর।
  • ৩. অথবা যদি ইনপুট = ২ হয় তাহলে "স্পেন" প্রিন্ট কর।
  • ৪. অথবা যদি ইনপুট = ৩ হয় তাহলে "জার্মানি" প্রিন্ট কর।
  • ৫. অথবা যদি ইনপুট = ৬ হয় তাহলে "ব্রাজিল" প্রিন্ট কর।
  • ৬. অথবা যদি ইনপুট = ৯ হয় তাহলে "আর্জেন্টিনা" প্রিন্ট কর।
  • ৭. উপরের একটাও যদি না হয় তাহলে কি আর করবা 🙂 , প্রিন্ট কর "জানি না"।
  • ৮.কাজ শেষ।

এখন আমরা শিখবে এই "যদি"গুলো কিভাবে লিখতে হবে আমাদের কোডে।এটার জন্য যে ফিচার সি তে আছে সেটা হল if,else ব্লক।আমরা গত পর্বে ব্লকের কথা বলেছিলাম।আজ সেটা হাতে কলমে বুঝব।


if(expression)
{
    Perform some work
}
else if(expression)
{
    Perform some work
}
else
{
    Perform some work
}

if এবং else if এর পর ব্রাকেটের ভিতর যে এক্সপ্রেশন আছে ওখানে বসবে কোন একটা শর্ত বা কন্ডিশন যেটা সত্যি হলে ওটার সাথে যে স্টেটমেন্ট ব্লক আছে তার ভিতরের কাজগুলো সম্পন্ন হবে (অর্থাৎ সেকেন্ড ব্রাকেট দিয়ে ঘেরা যায়গাটা যেখানে কি করতে হবে সেই ব্যাপারে কিছু কোড থাকবে, ওটাকে আমরা একটা সিঙ্গেল স্টেটমেন্ট হিসেবে চিন্তা করতে পারি 🙂 :))।আর যদি কন্ডিশন মিথ্যা হয় তাহলে তার নিচের ব্লকে কি আছে তা প্রোগ্রাম দেখবে না।পরের কোডে চলে যাবে। if,else ব্লককে সাধারনভাবে আমরা এভাবে বলতে পারি।যদি if এর কন্ডিশন সত্য হয় তাহলে  if এর সাথে যে সেকেন্ড ব্রাকেট ঘেরা ব্লকটা আছে ওটার ভিতরের কাজ কর আর কন্ডিশন যদি সত্য না হয় তাহলে else এর ব্লকটার ভিতরের কাজগুলো কর।
আর কন্ডিশন যদি অনেকগুলো থাকে সেক্ষেত্রে if এর পরে else if ব্লক ব্যবহার করতে হবে।তবে else if এবং else কিন্তু আমাদের ইচ্ছার উপর নির্ভর করে আমরা ব্যবহার করব কিনা কারন ওটা ব্যবহার না করে শুধু if দিয়েই করা সম্ভব।কিন্তু সমস্যা হল কোড অযথা বড় হবে ও সবখানে সমস্যা সমাধান নাও হতে পারে।

তাহলে এখন উপরের অ্যালগরিদম অনুযায়ী কোডটা দেখে নিই। তাহলে ধারনাগুলো পরিস্কার হবে।


if(input == 1)
{
    printf("Nedarland\n");
}
else if(input == 2)
{
    printf("Spain\n");
}
else if(input == 3)
{
    printf("Germany\n");
}
else if(input == 6)
{
    printf("Brazil\n");
}
else if(input == 9)
{
    printf("Argentina\n");
}
else
{
    printf("Don't Know\n");
}

একই কাজটা আরেকভাবে করার ব্যবস্থা সি তে আছে।সেটা হল সুইচ।তবে সুইচ ব্যবহার করার কিছু সীমাবদ্ধতা আছে।আগে if বা else if এর জন্য আমরা যেকোন বড় কন্ডিশন চেক করতে পারতাম যেমন ছোট, বড়, সমান,অসমান ইত্যাদি।সুইচ দিয়ে একটা জিনিসই চেক করা যায়।সেটা হল পুরোপুরি মিলে কিনা।অর্থাৎ সমান কিনা।যদি সমান হয় তাহলে ঐ ভ্যালুর জন্য যেটা করার কথা সেটা করবে আর না হলে পরের ভ্যালুটা চেক করবে।যদি কোনটাই না মেলে তবে ডিফল্ট একটা কাজ থাকবে else এর মত।ওটা সম্পাদন করে বেরিয়ে যাবে সুইচ থেকে।তাহলে আমাদের একই সমস্যার সমাধানের সুইচ ভার্সনটাও দেখে নিই এবার।


switch(input)
{
case 1: printf("Nedarland\n");
        break;
case 2: printf("Spain\n");
        break;
case 3: printf("Germany\n");
        break;
case 6: printf("Brazil\n");
        break;
case 9: printf("Argentina\n");
        break;
default:printf("Don't Know\n");
}

কোডটা এখন একটু ব্যাখ্যা করি। switch(input) দিয়ে বোঝানো হয়েছে আমাদের সুইচ ব্লকটা input ভ্যারিয়েবলের ভ্যালু নিয়ে কাজ করবে।case 1 মানে যখন  input ভ্যারিয়েবলের ভ্যালু 'এক' তখন সে কি করবে।সেটা কোলনের পাশেই লেখা আছে।কাজ শেষ হওয়ার পর একটা  break দিতে হবে অবশ্যই।ভুল করা যাবে না।ভুল করলে কি সমস্যা ? সে পরের case এর কাজগুলোও করতে থাকবে যেটা আমরা চাইনা।যখন আমাদের ফিক্সড কয়েকটা ভ্যালু বা ক্যারেকটার নিয়ে কাজ করতে হয় যেখানে ছোট,বড় চেক করার ব্যাপার নেই সেখানে সুইচ ব্যবহার করা সুবিধাজনক।এতে কোডের আকার ছোট ও দেখতেও ভালো হয় আর কি। 🙂

নতুনেরা পুরো কোডটা একবার নিজেরা করে ফেলুন ঝটপট। তাহলে আজ আমরা যা আলোচনা করলাম বুঝতে খুব অসুবিধা হবে না ইনশাল্লাহ।হ্যাঁ, প্রবলেমটা আরেকটু লম্বা করে দিই।ইনপুট যদি ৩ এর সমান বা ছোট হয় তাহলে প্রিন্ট করবেন "Good Team"।আর ৩ এর বড় হলে প্রিন্ট করবেন "Vua Team"। ;);)

সবাই ভালো থাকুন।আজ এ পর্যন্তই..... 🙂

Level 0

আমি অয়ন। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 12 বছর 7 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 6 টি টিউন ও 56 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।

আমি অয়ন।ব্লগিং করতে পছন্দ করি সত্যি কিন্তু আমি টেক ব্লগার নই।যেহেতু এটা টেক ব্লগ তাই আমাকে চেস্টা করতে হবে টেক ব্লগারের অভিনয় করার।এই মুহূর্তে ঠিক জানিনা কতটুকু সফল অভিনয় করতে পারব :)।পড়াশোনা আপাতত বুয়েটের সিএসই ডিপার্টমেন্টে,ফাইনাল ইয়ার।আর বেশিদিন হয়তো ছাত্র থাকা হবে না,মাত্র এক বছর কিন্তু ছাত্র হয়ে থাকতে পারলেই...


টিউনস


আরও টিউনস


টিউনারের আরও টিউনস


টিউমেন্টস

Level 0

সুন্দর হয়েছে! 🙂

    Level 0

    @Dew Drops: ধন্যবাদ আপনাকে।সাথে থাকুন 🙂

kharap hoyeche

    Level 0

    @alienfaisal: কিভাবে ভালো করা যায় কোন সাজেশন যদি থাকে বলতে পারেন নির্দ্বিধায়।তাতে সবারই উপকার হবে 🙂

Level 0

খুব ভাল হইছে।নেট এ কি কোন ভাল c প্রোগ্রামিং বই পাব।যদি আপনাদের কারো জানা থাকে তাহলে দয়া করে লিঙ্ক দিবেন।plz

Level 0

বলতে ভুলে গেছি বইটা হতে হবে বাংলায়

    Level 0

    @Limon: বইয়ের ব্যাপারে বিস্তারিত এই সিরিজের ১ম পর্বে পাবেন 🙂

Level 0

আপনার লেখা ভাল লাগলো ধন্যবাদ ভাই আপনাকে… 🙂

    Level 0

    @skystar: অনেক ধন্যবাদ আপনাকে 🙂

আপনি টিউন কন্টিনিউ করবেন ধন্যবাদ।

সব তো ঠিক আছে কিন্তু Build messages বক্সে নিচের লেখাটা দেখায় আর প্রথম লাইনের পাশে লাল দাগ দেখায়। এটার কারন কি?
Error: expected identifier or ‘(‘ before ‘switch’

    Level 0

    @সোহাগপুরো কোডটা মেইল করুন আমাকে।দেখলে মনে হয় ভুলটা ধরিয়ে দিতে পারব।

      @অয়ন: আমি সরাসরি পোষ্ট থেকে কপিপেস্ট করে দেখেছি কোন কাজ হয় নাই

    Level 0

    @সোহাগ:পোস্টে আমি পুরো কোড লিখিনাই।যে টপিক নিয়ে আলোচনা সেটা বোঝার জন্য যেটুকু দরকার ঐটুকুই দিয়েছি।কাজেই কপিপেস্ট করলেই কোড কাজ করবে না।আরও কিছু করা লাগবে।প্রথম ও ২য় পর্ব ভালোমত পড়ে দেখুন আবার।

Level 2

আবার সময় করে লিখেন…. অনেক দিন তো হয়ে গেল

Level 0

You are a very good teacher………