Header Ads

Header ADS

প্রোগ্রামিং সি এর control statement পদ্ধতি?

 

কন্ট্রোল স্টেটমেন্ট (প্রাথমিক ধারণা)

প্রোগ্রামিং মানে হচ্ছে লজিক। আর আমাদের লজিক গুলো কম্পিউটারকে জানাতে ব্যবহার করা হয় কন্ট্রোল স্টেটমেন্টস (Control Statements)।
এর আগে আমরা যত গুলো প্রোগ্রাম দেখেছি, সব গুলো শুধু মাত্র কিছু ডেটা ইনপুট নিয়েছে বা কিছু ডেটা আউটপুট দিয়েছে। কিন্তু কোন লজিক্যাল তুলনা করি নি। আমাদের যে সব প্রোগ্রাম লিখতে হবে, সে গুলোতে অনেক লজিক্যাল তুলনা করতে হবে। যেমন আমরা ৩টি সংখ্যার মধ্যে সবচেয়ে ছোট বা সবচেয়ে বড় সংখ্যা নির্ণয়ের ফ্লো চার্ট যদি দেখি, তাহলে দেখতে পাবো ঐখানে কিছু জায়গায় হ্যা অথবা না স্টেপ রয়েছে। আর ঐ ধরনের স্টেপ গুলোকে বলে লজিক্যাল স্টেপ। লজিক্যাল স্টেপ গুলোকে প্রোগ্রামে প্রকাশ করা হয় এই কন্ট্রোল স্টেটমেন্ট দিয়ে।
সি তে মূলত চার ধরনের কন্ট্রোল স্টেটমেন্ট রয়েছে। এগুলো হল
  1. ডিসিশন মেকিং স্টেটমেন্ট
  2. সিলেকশন স্টেটমেন্ট
  3. ইটারেশন স্টেটমেন্ট
  4. জাম্প স্টেটমেন্ট
সিনট্যাক্স হিসেবে কন্ট্রোল স্টেটমেন্ট গুলোর মধ্যে রয়েছেঃ
  1. if-else Statement
  2. while Statement
  3. do-while statement
  4. for statement ইত্যাদি।
সামনের অংশগুলোতে আমরা এসব কন্ট্রোল স্টেটমেন্ট নিয়ে আলোচনা করব। এগুলো জেনে আমরা সত্যিকারের প্রোগ্রামিং জগতে প্রবেশ করতে যাচ্ছি। যে যত সহজে কন্ট্রোল স্টেটমেন্ট গুলো দিয়ে নিজের লজিক গুলো কোডে পরিনত করতে পারবে, সে দ্রুত প্রোগ্রামিং এ ভালো করতে পারবে।

স্টেটমেন্ট এবং ব্লক

কন্ট্রোল স্টেটমেন্ট নিয়ে আগানোর আগে আমরা একটু ব্লক আর স্টেটমেন্ট এর ধারণাটা পরিষ্কার করে নেব। সাধারণত যে কোন এক্সপ্রেশনের শেষে সেমিকোলন ; দিলে সেটি একটি স্টেটেন্ট হয়ে যায়। যেমন
    x = 5;
    i++;
    printf("The result is ...");
উপরের তিনটি এক্সপ্রেশনই আলাদা আলাদা স্টেটমেন্ট।
একাধিক স্টেটমেন্টকে একসাথে { এবং } দিয়ে কম্পাউন্ড স্টেটমেন্ট বা ব্লক তৈরি করা হয়। ব্লকের বৈশিস্ট্য হল ব্লকের সিনট্যাক্স গুলো একসাথে এক্সিকিউট হয়। কন্ট্রোল স্টেটমেন্ট নিয়ে কাজ করতে হলে বিভিন্ন যায়গায় বিভিন্ন লজিকের উপর ভিত্তি করে আমাদেরকে বিভিন্ন ব্লক এক্সিকিউট করা লাগতে পারে।

প্রাথমিক ধারণা

সি তে if-else হল ডিসিশন মেকিং স্টেটমেন্ট। প্রোগ্রামের বিভিন্ন যায়গায় আমাদের লজিকাল ডিসিশন নিতে হতে পারে এবং সেগুলোর উপর ভিত্তি করে আমাদের বিভিন্ন কাজ করা লাগতে পারে। এধরনের অপারেশনের জন্য if-else ব্যবহার করা হয়। if-else এর সিনট্যাক্স স্ট্রাকচার নিচের মত।
    if(expression is true) 
    {
        statement;
    }
    else 
    {
        statement;
    }
খুব সাধারণভাবে বলা যায় আমরা if দিয়ে একটি স্টেটমেন্ট ট্রু নাকি ফলস সেটি দেখব এবং তারপর সেটি সত্য হলে আমরা কিছু স্টেটমেন্ট এক্সিকিউট করব আর না হলে অন্য কিছু স্টেটমেন্ট এক্সিকিউট করব। if-else আমাদের প্রোগ্রামটির কাজের ধারাকে বিভিন্ন ব্রাঞ্চ বা শাখায় ভাগ করে দিতে পারে। এখানে লক্ষ্যণীয় যে if-else এ মূলত if ব্লকটি প্রধান। অনেক সময় আমাদের else ব্লকটি একেবারে নাও লাগতে পারে। সেক্ষেত্রে শুধুমাত্র if ব্লকেই কাজ হয়ে যায়।
    if(expression is true)
    {
        statement;
    }
আরেকটি বিষয় হল if সিনট্যাক্স এক্সপ্রেশনের নিউম্যারিক ভ্যালু নিয়ে কাজ করে। তাই সবসময় expression != 0 না দিয়ে সরাসরি expression দিলেও হয়। অর্থাৎ নিচের দুইটি if ই কাজ করে একইভাবে।
    if(expression !=0)
    {
        statement;
    }


    if(expression)
    {
        statement;
    }

if-else এর ব্যবহার

আসুন এবার আমরা দেখি if-else কোথায় ব্যবহার করা যায়। আগেই বলেছি এটি ডিসিশন নিতে ব্যবহার করা হয়। আমরা একটি ছোট প্রোগ্রাম দিয়ে এর প্রয়োগ দেখব। এখানে আমরা দুইটি সংখ্যা ইউজারের কাছে জানতে চাইবো এবং সে দুটির মধ্যে কোনটি বড় আর কোনটি ছোট সেটি বের করব।
#include<stdio.h>

int main(void)
{

int num1, num2;

printf("Enter two numbers to compare :\n");

scanf("%d %d", &num1, &num2);

if(num1>num2) {
    printf("%d is greater than %d", num1, num2);
}
else {
    printf("%d is greater than %d", num2, num1);
}

return 0;
}
এখানে আমরা দুইটি সংখ্যা নিয়েছি এবং প্রথমে if দিয়ে আমরা দেখছি num1 কি num2 এর চাইতে বড় কি-না। যদি বড় হয় তাহলে if ব্লকটি এক্সিকিউট হবে এবং প্রিন্ট করবে num1 বড়। এবং যদি num1 বড় না হয় তাহলে else ব্লকটি কাজ করে এবং প্রিন্ট করবে num2 বড়।

নেস্টেড if-else

আগের কোডটিতে আমাদের লজিক ফ্লো বেশ সাধারণ ছিল, আমাদের খালি একটি ডিসিশন নিতে হয়েছে। কিন্তু বাস্তবে এর চাইতে অনেক বেশি জটিল লাজিকাল ডিসিশন নিয়ে আমাদের কাজ করতে হতে পারে এবং একটি ডিসিশনের উপর ভিত্তি করে আরও ডিসিশন নিতে হতে পারে অর্থাৎ একটি if বা একটি else এর ভেতর আরও এক বা একাধিক if-else ব্লক থাকতে পারে। এধরনের কাজ করার জন্য আমরা if-else কে নেস্টেড করে ব্যবহার করতে পারি। উদাহরণ হিসেবে আমরা আগের উদাহরণটিকে একটু পাল্টিয়ে দেখব। দুটির বদলে আমরা এবার তিনটি সংখ্যা নেব এবং দেখব কোনটি সবচেয়ে বড়।
#include<stdio.h>

int main(void)
{

int num1,num2,num3;

printf("Enter three numbers to compare :\n");
scanf("%d %d %d", &num1, &num2, &num3);


if(num1>num2) { //if num1 is greater than num2
    if(num1>num3) { //chechking with num3
        printf("%d is the largest number.", num1);
    }
    else {
        printf("%d is the largest number.", num3);
    }
}
else {
    if(num2>num3){ //checking num2 with num3
        printf("%d is the largest number.", num2);
    }
    else {
        printf("%d is the largest number.", num3);
    }
}

return 0;
}
এখানে আমরা যেটি করেছি সেটি হল, প্রথমে আমরা দেখেছি num1 কি num2 এর চাইতে বড় কি না। যদি বড় হয় তাহলে আমরা আরেকটি if ব্লকে num1 কে num3 এর সাথে তুলনা করেছি। আবার যদি প্রথম if এক্সপ্রেশনটি ট্রু না হয় অর্থাৎ যদি num1 ছোট হয়, তাহলে আমরা else ব্লকে গিয়ে আবার num2 কে num3 এর সাথে তুলনা করেছি। এরকমভাবে আমরা নেস্টেড if-else ব্যবহার করে আরো জটিল ধরনের লজিক নিয়ে কাজ করতে পারি।

সুইচ-কেস (switch case)

একটা ভ্যালু এর উপর নির্ভর করে অনেক গুলো স্টেটম্যান্ট থেকে একটা স্টেটম্যান্ট এক্সিকিউট করার জন্য switch case ব্যবহার করা হয়। switch case সাধারণত নিচের মত করে লেখা হয়ঃ
এখানে যদি switch ( variable ) এর variable টির মান expression 1 এর সাথে মিলে, তাহলে case expression 1 এর statement এক্সিকিউট হবে। যদি variable টির মান expression 2 এর সাথে মিলে, তাহলে case expression 2 এর statement এক্সিকিউট হবে। যদি variable টির মান expression 3 এর সাথে মিলে, তাহলে case expression 3 এর statement এক্সিকিউট হবে। যদি কোনটির সাথেই না মিলে, তাহলে default এর statement টি এক্সিকিউট হবে। এখানে যত ইচ্ছে তত গুলো case যুক্ত করা যাবে। আর case এর স্টেটম্যান্ট শেষে break; যুক্ত করতে হয়। break; মানে হচ্ছে আমাদের কাজ শেষ, এবার switch case থেকে বের হতে পারি। break; টা খুবি গুরুত্ত্বপূর্ণ।
এখনো একটু জটিল মনে হতে পারে বিষয়টা, আমরা একটা উদাহরন দেখলে অনেক সহজ হয়ে যাবে এই switch case স্টেটম্যান্টটি। আমরা একটা প্রোগ্রাম লিখব এমন, যেখানে যদি আমরা r ইনপুট দি, তাহলে লেখা উঠবে You select Red, যদি w ইনপুট দি, তাহলে লেখা উঠবে You select White. যদি b ইনপুট দি, তাহলে লেখা উঠবে You select Black. আর প্রোগ্রামটা লিখব আমরা switch case ব্যবহার করে।
উপরের প্রোগ্রামটি রান করি, তারপর r, w, b এ তিনটার মধ্যে যে কোন একটা ইনপুট দিলে ঐ কালারটা দেখবে। আর যদি আমরা অন্য কোন কারেকটার ইনপুট দি, তাহলে লেখা উঠবে Wrong choose!। switch case এর switch ( colorFirsWord ) এর ভেতরে যে ভ্যারিয়েবলটি রয়েছে, তার মান যদি case 'r' এর সাথে মিলে, মানে colorFirsWord এর মান r হয়, তাহলে প্রোগ্রামটি এ স্টেটম্যান্টটি এক্সিকিউট করবেঃ printf("You select Red."); এরপরের স্টেটম্যান্ট হচ্ছে break; মানে হচ্ছে আমরা যে কাজ করার জন্য switch case এর ভেতরে প্রবেশ করেছি, তা শেষ হয়েছে। switch case থেকে এবার আমরা বের হতে পারি। break দিয়ে switch case ঐখানেই বন্ধ করে দেওয়া হয়।
একই ভাবে যদি আমরা w ইনপুট দি, তাহলে case 'r' এর সাথে মিলিয়ে দেখবে। যেহেতু আমরা w ইনপুট দিয়েছি, প্রথম case এর সাথে মিলে না। পরের case দেখবে। পরের case এ এসে দেখবে case 'w' তে ইনপুটির সাথে মিল পেয়েছে, তাই এর পরে থাকা স্টেটম্যান্টটি এক্সিকিউট করবে। printf("You select White."); এবং এর পর break দিয়ে switch case থেকে বের হবে।
একই ভাবে আমরা যদি b ইনপুট দি, তাহলে উপরের দুইটা case এ কোন মিল পাবে না, তাই ঐ case গুলোর স্টেটম্যান্ট গুলোও এক্সিকিউট হবে না। শুধু মাত্র case 'b' এর স্টেটম্যান্ট গুলো এক্সিকিউট হবে।
যদি আমরা অন্য কোন কারেকটার ইনপুট দি, তাহলে তার জন্য রয়েছে ডিফল্ট ভ্যালু। তখন লেখা উঠবে Wrong choose!
বিদ্রঃ switch ( colorCode ) এর এখানে যে কোন Expression আমরা লিখতে পারি। এমন একটা উদাহরন আমরা দেখব। আবার case এ আমরা একের অধিক স্টেটম্যান্ট লিখতে পারব। তার উদাহরণ একটু পরই দেখব।
উপরের প্রোগ্রামটিতে আমরা যদি বড় হাতে R, W বা B ইনপুট দি, তাহলে লেখা উঠবে Wrong choose!। এখন আমরা উপরের প্রোগ্রামটিকে আরেকটু মডিফাই করব, যেন ছোট বা বড় হাতে colorCode ইনপুট দিলে উভয় ক্ষেত্রেই আমাদের সঠিক আউটপুট দেয়।
এখানে আমরা লক্ষ্য করলে দেখব আমরা এখন break এর ব্যবহার ছাড়া এক সাথে দুই বার case ব্যবহার করেছি। যেমনঃ
case 'r' : case 'R' :
এভাবে break ছাড়া একের অধিক case লিখলে সে গুলো OR অপারেশনের মত কাজ করে। একটা সত্য হলে ঐ case গুলোর পরের Expression গুলো এক্সিকিউট হবে। এবং break পাওয়া পর্যন্ত অপেক্ষা করবে।
switch case এর ভেতরে যে কোন কোডই রান করানো যায়, লুপ চালানো, ফাংশান কল করা সহ সব কিছু। প্রথমে একটা প্রোগ্রাম লিখব, যেখানে switch case এর ভেতরে আমরা একবার for লুপ ব্যবহার করব, একবার while লুপ ব্যবহার করব। এটা বুঝানোর জন্য যে আমরা ইচ্ছে করলে যে কোন কোডই রান করাতে পারি switch case এর মধ্যেঃ
প্রোগ্রামটা আমাদের 1 অথবা 2 ইনপুট দিতে বলবে। 1 ইনপুট দিলে ১ থেকে ১০০ পর্যন্ত বেজোড় সংখ্যা গুলো প্রিন্ট করবে। আর 2 ইনপুট দিলে ১ থেকে ১০০ পর্যন্ত জোড় সংখ্যা গুলো প্রিন্ট করবে।
আমরা ইচ্ছে করলে switch case এর ভেতর থেকে ফাংশন ও কল করতে পারি। নিচের প্রোগ্রামটি দেখিঃ
আমরা দুইটা ফাংশন তৈরি করেছি, playGame() এবং closeGame()। ব্যবহারকারী 1 ইনপুট দিলে playGame() ফাংশনটি কল হবে, এবং 2 ইনপুট দিলে closeGame() ফাংশন কল হবে... এভাবে নিজের মত করে নিজের ক্রিয়েটিভিটি ব্যবহার করে আমরা প্রয়োজন মত আমাদের প্রোগ্রামে switch case ব্যবহার করতে পারি। শুভ প্রোগ্রামিং :)

ফর-লুপ (for loop)

লুপিং এর কাজে সবছেয়ে বেশি ব্যবহৃত হয় for loop. এ for loop এর তিনটি অংশ রয়েছে। তার আগে আমরা দেখেনি for loop সাধারন ব্যবহার নিয়ম।

for(exprission1;Exprission2;Expression3)Statement

বিদ্রঃ এখানে প্রত্যেকটি Expression ; (সেমিকোলন) দিয়ে আলাদা করে দিতে হবে।
এখানে প্রথম exprission1 হচ্ছে for loop এর প্রথম অংশ। এটি দ্বারা একটি প্রাথমিক মান দেওয়া হয় । যাকে বলা হয় initial অংশ। এটি পুরো লুপিং প্রক্রিয়াকে নিয়ন্ত্রন করে।
দ্বিতীয় অংশটি অর্থাৎ Exprission2 দ্বারা একটি শর্ত দেওয়া হয়। লুপটি কতক্ষন পর্যন্ত চলবে তা এটি নির্নয় করে। Exprission2 তে সাধারনত একটি logical expression থাকে যা শুধু সত্য মিথ্যে বুঝতে পারে। যদি সত্য হয় তাহলে 1 রিটার্ন করে আর যদি মিথ্যে হয় তাহলে 0 রিটার্ন করে। এটি যদি 0 ছাড়া অন্য কোন মান রিটার্ন করে তাহলে লুপটি চলবে, আর যদি 0 রিটার্ন করে তাহলে লুপটি আর চলবে না।
Expression3 কাজ হচ্ছে আমারা প্রথমে যে প্রাথমিক মান নিলাম তাকে আমাদের ইচ্ছে মত মডিফাই করা। এটি প্রত্যেক লুপের শেষ ধাপে কাজ করে।
আর আগেই বলছি লুপটি ততক্ষনই চলবে যতক্ষন পর্যন্ত Exprission2 মিথ্যে বা 0 রিটার্ন না করে।
For loop সম্পর্কে আমরা এতক্ষন অনেক কিছু জানলাম, এবার প্রোগ্রামে এটাকে কিভাবে ব্যবহার করব তা দেখি। তার জন্য একটি প্রোগ্রাম লিখি যা 1 থেকে 10 পর্যন্ত সংখা গুলো প্রিন্ট করবে। আপনাদের জন্য নিচের প্রোগ্রামটি। এটার আউটপুট কি হবে কিভাবে হবে তা বের করুন।
এর আউট পুট হচ্ছেঃ ০ 1 2 3 4 5 6 7 8 9 10 এখানে আমরা একটি integer variable নিয়েছি। for loop এর প্রথম Expression এ আমরা এর প্রাথমিক মান নিলাম ০. প্রাথমিক মানটি for loop এর দ্বিতীয় অংশ অর্থাৎ logical অংশ দ্বারা যাচাই না হয়েই for লুপের ভেতরে থাকা স্টেটমেন্টটি এক্সিকিউট করবে। এবং প্রথম Expression কাজ শেষ হয়ে যাবে। এর আর কোন কাজ নেই। Print করার পর এবার তৃতীয় অংশ অর্থাৎ Exprission3 এখানে i++ অংশ দ্বারা মডিফাই হবে। আমরা জানি i++ এর মানে হচ্ছে i = i+1 সুতরাং এখানে i এর মান এক বাড়বে এবং ০ থেকে 1 হবে। এবার দ্বিতীয় অংশ Expression2 এখানে এসে i<=10 অংশ দ্বারা লজিক্যাল যাচাই হবে। এখানে যাচাই করবে যে i এর মান 10 বা 10 থেকে ছোট কিনা। যেহেতু এখন i এর মান ১০ থেকে ছোট তাই লুপটা আবার চলবে। এবং দ্বিতীয় বার এসে 1 প্রিন্ট করবে। আবার Exprission3 তে এসে মডিফাই হবে। আগের লুপ থেকে i এর মান পেয়েছি 1 এখন আবার 1 এর সাথে এক বেড়ে 2 হবে ( এ অংশ i++ দ্বারা) । আবার দ্বিতীয় অংশ i<=10 অংশ দ্বারা লজিক্যাল যাচাই হবে। যেহেতু 2, 10 থেকে ছোট তাই আবার 2 প্রিন্ট করবে। এভাবে প্রত্যেক ধাপ শেষ করবে। যখন i এর মান বেড়ে 11 হয়ে যাবে তখন আর লুপ চলবে না। এবং আমাদের প্রোগ্রামটি শেষ হবে। আচ্ছা, আরেকটা প্রোগ্রাম লিখি। ছোট কালে কোন দুষ্টুমি করলে যে আমাদের শাস্তি দেওয়া হতো একশ বার লিখতে, আমি আর দুষ্টুমি করব না। আমরা এবার তা লিখব প্রোগ্রাম লিখে। এবং for লুপ ব্যবহার করে।
এখানে আগের প্রোগ্রামের থেকে একটু পার্থক্য হচ্ছে আগে আমরা i এর মান প্রিন্ট করেছি। এখানে আমরা একটা লাইন প্রিন্ট করেছি "ami r dustumi korbo na." for লুপ এর ভেতরের Exprission2 তে লিখেছি i<=100। মানে i এর মান যতক্ষণ না পর্যন্ত ১০০ হচ্ছে, ততক্ষণ পর্যন্ত এই লুপটি চলবে। Exprission3 তে i এর মান আমরা প্রতিবার ১ করে বাড়িয়ে দিয়েছি। এবার আমরা আরেকটি প্রোগ্রাম লিখি। এবার এক থেকে ৫০ পর্যন্ত বেজোড় সংখ্যা গুলো বের করার একটা প্রোগ্রাম লিখি।
আগের প্রথম প্রোগ্রামের মতই i এর মান আমরা প্রিন্ট করেছি। তবে একটা কন্ডিশন দিয়েছি এখানে। for লুপের ভেতর প্রতিবার ঢুকবে। ঢুকার পর if দিয়ে একটা কন্ডিশন চেক করবে। if(i%2==1) মানে হচ্চে i কে দুই দ্বারা ভাগ করলে ভাগ শেষ যদি ১ থাকে, তাহলে if কন্ডিশনের ভেতরের স্টেটমেন্ট printf("%dn",i); দিয়ে i এর মান প্রিন্ট হবে। আর না হলে কিছুই হবে না। এখানে কি করছি কি, একটা লুপের ভেতর আরেকটা লুপ ব্যবহার করেছি। আমরা ইচ্ছে করলে এমন একটা লুপের ভেতর আরেকটা, আরেকটা ভেতর আরেকটা এমন ইচ্ছে মত ব্যবহার করতে পারি। যেমন আমরা এবার একটা for লুপের ভেতর আরেকটা for লুপ ব্যবহার করব। তবে তার আগে উপরের প্রোগ্রামটি আরো সহজে কিভাবে লেখা যায়, তা দেখি। আমরা ইচ্ছে করলে ১ থেকে ৫০ পর্যন বেজোড় সংখ্যা গুলো নিচের মত করেও বের করতে পারিঃ এখানে করছি কি i এর প্রথম মান ধরে নিয়েছি ১। এক একটা বিজোড় সংখ্যা। তা প্রিন্ট করবে। এরপর ১ এর সাথে ২ যোগ করে দিলেই তো হবে ৩, তা বিজোড় সংখ্যা। তা প্রিন্ট করবে। এরপর ৩ এর সাথে ২ যোগ করে দিলে হবে ৫, তা বিজোড় সংখ্যা। তা প্রিন্ট করবে। আমরা লুপের Expression3 তে লিখছি i=i+2। লুপের Expression2 তে কন্ডিশন দিয়েছি i<=50। মানে যতক্ষণ না পর্যন্ত i এর মান ৫০ এর বেশি হবে, ততক্ষন পর্যন্ত লুপটি চলবে।। এবার একটা for লুপের ভেতরে আরেকটা for লুপ ব্যবহার করে একটা প্রোগ্রাম লিখিঃ এখানে আমরা দুইটা ভ্যারিয়েবল নিয়েছি। i এবং j. প্রথম for লুপের ভেতর i এর ইনিশিয়াল মান দিয়েছি ০, কন্ডিশন দিয়েছি i<=5 এবং i এর মান 1 করে বাড়িয়েছি। মানে হচ্ছে প্রথম for লুপটি ৫ বার এক্সিকিউট হবে। প্রোগ্রামটি আউটপুট দিবঃ ```c 0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5 ``` দ্বিতীয় ফর লুপে j=0 দিয়ে ইনিশিয়াল মান দিয়েছি ০, এরপর j<=i দিয়ে কন্ডিশন দিয়েছি। এবং শেষে j++ দিয়ে j এর মান বাড়িয়েছি। কন্ডিশন অনুযায়ী দ্বিতীয় ফরলুপটি কতবার এক্সিকিউট হবে তা নির্ভর করবে প্রথম ফর লুপের উপর। যেমন প্রথম বার i এর মান ০। তাই প্রথমবার দ্বিতীয় ফর লুপ চলবে একবার। দ্বিতীয় বার i এর মান ১, তাই দ্বিতীয় বার দ্বিতীয় লুপ চলবে দুই বার। তৃতীয় বার দ্বিতীয় ফর লুপ চলবে ৩ বার। এবার পঞ্চম বার দ্বিতীয় লুপ চলবে ৫বার। প্রথম বার দ্বিতীয় লুপ প্রিন্ট করবে ০, দ্বিতীয়বার প্রিন্ট করবে 0 1. তৃতীয় বার 0 1 2. এভাবে পঞ্চম বার প্রিন্ট করবে 0 1 2 3 4 5. এখন আমরা যদি প্রথম ফর লুপের কন্ডিশন পরিবর্তন করে দশ করে দি, তাহলে আউটপুট দিবেঃ nested for demo do while দিয়ে আমরা কয়েকটা সংখ্যার গড় বের করার প্রোগ্রাম লিখেছি এর আগে। এবার আমরা তা for লুপ ব্যবহার করে লিখবঃ

হোয়াইল-লুপ (while loop)

while লুপের সাধারণ ফরম হচ্ছেঃ
while (expression) statement
expression বলতে একটা কন্ডিশন দেওয়া হয়। যতক্ষণ পর্যন্ত এই কন্ডিশনটি সত্য হবে, ততক্ষন পর্যন্ত while লুপটি চলবে। ছোট্ট একটা প্রোগ্রাম লিখিঃ
উপরের প্রোগ্রামে আমরা number নামে একটা ইন্টিজার ভ্যারিয়েবল নিয়েছি। যার প্রাথমিক মান হচ্ছে ০। এরপর আমরা while লুপ লিখছি। (number <=9) এটা হচ্ছে কন্ডিশন। যতক্ষন পর্যন্ত এ কন্ডিশনটা সত্য হবে, ততক্ষণ পর্যন্ত ব্র্যাকেটের ভেতরের {...} কোড গুলো এক্সিকিউট হবে। ব্র্যাকেটের ভেতরে আমরা প্রথমে নাম্বারটি প্রিন্ট করেছি। পরের লাইনে number++; দিয়ে নাম্বারটির মান এক করে বাড়িয়ে দিয়েছি।

প্রথমে number ভ্যারিয়েবলটির ভ্যালু ছিল ০... প্রথমে while লুপের ভেতর ঢুকে নাম্বারটি প্রিন্ট করল। এরপর number++; দিয়ে নাম্বারেরর ভ্যালু এক বাড়িয়ে দিল। এখন number ভ্যারিয়েবল এর মান ১ এরপর আবার লুপের প্রথমে ফিরে গেলো। গিয়ে কন্ডিশনটি (number <=9) চেক করল। number ভ্যারিয়েবলের মান কি ৯ অথবা এর থেকে ছোট? যেহেতু নাম্বার ভ্যারিয়েবলের মান ১, এবং ৯ থেকে ছোট। তাই আবার লুপের ভেতরে ঢুকবে। এবং আবার প্রিন্ট করবে। এবার প্রিন্ট করবে 1. আবার number++; দিয়ে ভ্যালু এক বাড়িয়ে দিবে, মান হবে ২। এবং আবার লুপের প্রথমে গিয়ে চেক করবে। যখন দেখবে ৯ থেকে ছোট, তখন লুপের ভেতরে ঢুকবে। এবং আবার number টি প্রিন্ট করবে। ১০ বার লুপে ঢুকবে।
শেষ বার যখন number++ দিয়ে এক মান বাড়িয়ে দিবে, তখন number ভ্যারিয়েবল এর মান হবে 10 এবং যখন কন্ডিশনটি চেক করবে, তখন দেখবে number ভ্যারিয়েবলের মান ৯ থেকে বেশি। তখন আর while লুপটি কাজ করবে না। প্রোগ্রামটি শেষ হবে।

আমরা আরেকটা প্রোগ্রাম লিখতে পারি। ছোট বেলায় দুষ্টুমি করলে মাঝে মাঝে শিক্ষক বা বাড়িতে তো ১০০ বার লিখতে দিত, "আমি আর দুষ্টুমি করব না।" তখন যদি আমরা প্রোগ্রামিং জানতাম, আমাদের এত কষ্ট করতে হতো না। কয়েক লাইনের কোড লিখলেই ১০০ বার লেখা হয়ে যেতো। চাইলে তখন ১০০০ বার বা ১লক্ষ বার ও লিখে দেওয়া যেত। while লুপ দিয়ে এই প্রোগ্রামটি লিখি। প্রোগ্রামের ভেতর বাংলিশে লিখলাম "ami r dustumi korbo na"  

প্রোগ্রামটি রান করলে দেখব, কনসোলে ১০০ বার লেখা উঠে, আমি আর দুষ্টুমি করব না।
এখানে এর আগের প্রোগ্রামের মত একই কাজই করা হয়েছে। আগের প্রোগ্রামে নাম্বার ভ্যারিয়েবলটি প্রিন্ট করা হয়েছে। এখন প্রিন্ট করা হয়েছে একটি স্টিং।
প্রতিবার স্টিংটি প্রিন্ট করার পর number ভ্যারিয়েবল এর মান এক করে বাড়িয়ে দেওয়া হয়েছে। এবং while লুপের প্রথমে গিয়ে কন্ডিশনটি চেক করা হয়েছে। যতক্ষন পর্যন্ত দেখল number এর মান ১০০ থেকে ছোট বা সমান, ততক্ষণ পর্যন্ত লুপটি চলেছে। এবং যখনি number এর মান ১০১ এক হয়েছে, তখন লুপের কাজ শেষ হয়েছে।

while লুপ দিয়ে আরেকটি প্রোগ্রাম লিখতে পারি। 1 থেকে 100 পর্যন্ত বেজোড় সংখ্যা গুলো প্রিন্ট করতে পারি। নিচের প্রোগ্রামটি দেখিঃ
এক এর থেকে দুই যোগ করলে হবে তিন। একটা বিজোড় সংখ্যা। তিনের সাথে আবার দুই যোগ করলে হবে ৫, আরেকটি বিজোড় সংখ্যা। এভাবে প্রতিবার ভ্যারিয়েবল এর মান দুই বাড়িয়ে দিলেই আমরা বিজোড় সংখ্যা গুলো পেতে পারি। উপরের প্রোগ্রামে সে কাজটিই করা হয়েছে। number = number + 2; দিয়ে প্রতিবার নাম্বার ভ্যারিয়েবলটির মান দুই করে বাড়িয়ে দেওয়া হয়েছে।
প্রথমে ভ্যারিয়েবলটির মান ছিল 1, int number = 1; এর কথা বলছি। এরপর লুপের ভেতরে ঢুকলো। এবং কন্ডিশন চেক করা হল। যেহেতু কন্ডিশন সত্য, তাই লুপের ভেতরের কোড গুলো রান করল। number টি প্রিন্ট করল। পরের লাইনে number ভ্যারিয়েবল টির মান দুই বাড়িয়ে দেওয়া হলো। এভাবে এক সময় যখন দেখল number ভ্যারিয়েবলটির মান 100 থেকে বেশি হয়ে গেলো, তখন লুপটি কাজ করা শেষ করল।

উপরের প্রোগ্রামটিকে একটু মডিফাই করেই তো জোড় সংখ্যা গুলো বের করতে পারি তাই না? তাহলে তা করে ফেলুন। এরপর কমেন্টে আমাকে জানাতে পারেন।

ডু-হোয়াইল-লুপ (do while loop)

কিছু একটা কর, যতক্ষণ পর্যন্ত একটা কন্ডিশন সত্য হয়। এমন প্রোগ্রাম লিখতে আমরা do while ব্যবহার করি। do while লুপের সাধারণ ফরম হচ্ছেঃ
do statement while (expression);
expression বলতে একটা কন্ডিশন দেওয়া হয়। যতক্ষণ পর্যন্ত এই কন্ডিশনটি সত্য হবে, ততক্ষন পর্যন্ত এই do while লুপটি চলবে এবং এই statement এক্সিকিউট হতে থাকবে। একটি স্টেটমেন্ট এক্সিকিউট করার জন্য আমাদের দ্বিতীয় ব্র্যকেট ব্যবহার করতে হবে না। কিন্তু যদি আমরা একের অধিক স্টেটমেন্ট এক্সিকিউট করতে চাই, তাহলে আমাদের দ্বিতীয় ব্র্যাকেট ব্যবহার করতে হবে। তখন লিখতে হবে এমন করেঃ
do{
 statement 1;
 statement 2;
 statement 3;
....

} while (expression);
ছোট্ট একটা প্রোগ্রাম লিখিঃ
উপরের প্রোগ্রামে আমরা number নামে একটা ইন্টিজার ভ্যারিয়েবল নিয়েছি। যার প্রাথমিক মান হচ্ছে ০। এরপর আমরা do while লুপ লিখছি। do এর পর দ্বিতীয় ব্র্যাকেটের মধ্যে আমরা যে স্টেটমেন্ট গুলো এক্সিকিউট করতে হবে, সে গুলো লিখেছি। এরপর লিখছি while (number <=9) এটা হচ্ছে কন্ডিশন। যতক্ষন পর্যন্ত এ কন্ডিশনটা সত্য হবে, ততক্ষণ পর্যন্ত ব্র্যাকেটের ভেতরের {…} কোড গুলো এক্সিকিউট হবে। ব্র্যাকেটের ভেতরে আমরা প্রথমে নাম্বারটি প্রিন্ট করেছি। পরের লাইনে number++; দিয়ে নাম্বারটির মান এক করে বাড়িয়ে দিয়েছি। এরপর এক সময় number এর মান 10 হয়ে গেছে। তখন while (number <=9) এ এসে দেখল কন্ডিশনটি মিথ্যে হয়ে গেছে। মানে number এর মান ৯ এর থেকে বড়, তখন আর do ভেতরে আর ঢুকবে না এবং তার ভেতরের কোড গুলোও এক্সিকিউট করবে না।
উপরের প্রোগ্রামটি আমরা আরেকটু ছোট করে লিখতে পারে। একই ভাবে কাজ করবে। শুধু ব্র্যকেটটি সরিয়ে ফেলছি।
আমরা যদি একটি মাত্র স্টেটম্যান্ট এক্সিকিউট করতে চাই, তাহলে আমাদের দ্বিতীয় ব্র্যকেট ব্যবহার না করলেও হবে।
do while ব্যবহার করে আমরা কিছু সংখ্যার গড় বের করব। প্রোগ্রামটি প্রথম ব্যবহারকারীকে জিজ্ঞেস করব, কয়টা সংখ্যার গড় ব্যবহার করতে চায়। এরপর এক এক করে সব গুলো সংখ্যা ইনপুট নিবে। তারপর গড় দেখাবে।
আমরা অনেক গুলো ভ্যরিয়েবল ডিক্লেয়ার করেছি। total_no হচ্ছে কয়েটা নাম্বারের গড় বের করব, তার জন্য। এরপর আমরা do while লুপে প্রবেশ করেছি। লুপ ততক্ষণই চলবে যতক্ষণ না পর্যন্ত আমাদের সব গুলো নাম্বার ইনপুট নেওয়া হয়। তার জন্য আমরা একটা count ভ্যারিয়েবল নিয়েছি। যার প্রথম মান হচ্ছে ১। এর পর প্রতিবার আমরা একটা সংখ্যা ইনপুট নিব, একবার করে এই count এর মান বাড়িয়ে দিব।
number নামক ভ্যারিয়েবল দিয়ে আমরা এরপর প্রতিটা সংখ্যা ইনপুট নিচ্ছি। ইনপুট নিয়ে সেগুলো সব যোগ করছি। ছোট্ট একটা লাইন দিয়ে। sum +=number; যার মানে হচ্ছে sum = sum + number;
যখন দেখেছি count এর মান total_no এর থেকে বড় হয়ে গেছে, তার মানে হচ্ছে আমাদের সকল সংখ্যা ইনপুট নেওয়া হয়ে গেছে। তাই আমরা do while থেকে বের হয়ে গিয়েছি। এরপর গড় বের করেছি। তারপর প্রিন্ট।


কোন মন্তব্য নেই

Blogger দ্বারা পরিচালিত.