সি প্রোগ্রামিং-৬ [কন্ট্রোল স্টেটম্যান্ট] - SMH Amiri

সর্বশেষ লিখাসমূহ

সি প্রোগ্রামিং-৬ [কন্ট্রোল স্টেটম্যান্ট]

কন্ট্রোল স্টেটম্যান্ট – প্রাথমিক ধারনা

প্রোগ্রামিং মানে হচ্ছে লজিক। আর আমাদের লজিক গুলো কম্পিউটারকে জানাতে ব্যবহার করা হয়  কন্ট্রোল স্টেটমেন্টস (Control Statements)।

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

কন্ট্রোল স্টেটমেন্ট গুলোর মধ্যে রয়েছেঃ

  • if-else Statement
  • while Statement
  • do-while  statement
  • for statement ইত্যাদি।

এগুলো জেনে আমরা সত্যিকারের প্রোগ্রামিং জগতে প্রবেশ করতে যাচ্ছি। যে যত সহজে কন্ট্রোল স্টেটমেন্ট গুলো দিয়ে নিজের লজিক গুলো কোডে পরিনত করতে পারবে, সে দ্রুত প্রোগ্রামিং এ ভালো করতে পারবে।


সি প্রোগ্রামিংঃ if – else


if

যদি কোন কিছু সত্য হয়, তাহলে একটা কিছু কোড রান করার জন্য if স্ট্যাটমেন্ট ব্যবহার করা হয়। এটি নিচের মত করে লেখা হয়ঃ
If (expression) statement.
এখানে expression মানে যে কোন লজিক্যাল বা রিলেশনাল অপারেশন ব্যবহার করা হয়। অপারেটর অধ্যায়ের রিলেশনাল এবং লজিক্যাল সেকশনে আমরা যা শিখেছি, এখন তা কাজে লাগবে। যেমনঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(void)
 
 
{
    int temperature = 35;
 
    if (temperature > 30){
            printf("Todays weather is too hot.");
}
 
    return 0;
}

আজকের আবহাওয়া গরম না ঠান্ডা, তা বের করার একটা প্রোগ্রাম লিখছি। যেখানে temperature নামে একটা ইন্টিজার ভ্যারিয়েবল নিয়েছি এবং যার ভ্যালু এসাইন করেছি ৩৫; এরপর আমরা if দিয়ে temperature টা ৩০ এর সাথে মিলিয়ে দেখেছি। দেখেছি আজকের temperature কি ৩০ থেকে বড় কিনা। মিলিয়ে দেখার জন্য আমরা greater then লজিক্যাল অপারেটর ব্যবহার করেছি।
যেহেতু temperature ৩০ থেকে বড়, তাই if এর ভেতরে থাকা কোডটি মানে printf টি কাজ করেছে। যদি temperature 30 থেকে ছোট হত, তাহলে প্রোগ্রামটি কোন আউটপুটই দিত না। নিচের প্রোগ্রামটি দেখি, যেখানে temperature ভ্যারিয়েবলটির ভ্যালু হচ্ছে 25;

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(void)
 
 
{
    int temperature = 25;
 
    if (temperature > 30){
            printf("Todays weather is too hot.");
}
 
    return 0;
}

প্রোগ্রামটি রান করে দেখলে কনসোলে আমরা কিছুই দেখতে পাবো না। কারণ if দিয়ে দেখেছি temperature এর মান 30 থেকে বড় কিনা। যেহেতু temperature এর মান 30 থেকে বড় না, তাই if এর ভেতরে থাকা কোড গুলো রান হবে না।
এখন একটা প্রোগ্রাম লিখব, যেটা ব্যবহারকারী থেকে temperature ভ্যালুটা নিবে। এরপর কনসোলে একটা মেসেজ দেখাবেঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main(void)
 
{
    int temperature;
 
    printf("Enter temperature  value:");
    scanf("%d", &temperature );
 
    if (temperature > 30)
    printf("Todays weather is too hot.");
 
    if (temperature <30){
        printf("Todays weather is cool.");
    }
 
    return 0;
}

এখানে প্রথমে ইউজার থেকে temperature নিয়েছি। একটা if ব্যবহার করে চেক করেছি যদি temperature 30 থেকে বেশি হয়, তাহলে কনসোলে আউটপুট দিবে Todays weather is too hot. আর যদি temperature 30 থেকে কম হয় তাহলে আউটপুট দিবে Todays weather is cool।

If এর ভেতর আমরা চাইলে একের অধিক স্ট্যাটমেন্ট লিখতে পারি। আবার একটা if এর ভেতর আরেকটা if ব্যবহার করতে পারি। যাকে বলা হয় nested if।

if – else

একটা লজিক্যাল টেস্ট যদি সত্য হয়, তাহলে কিছু কাজ করবে। যদি মিথ্যে হয়, তাহলে অন্য কাজ। এ লজিক থেকেই if else. যেমনঃ যদি আজ শুক্রবার হয়, ঘুমাবো। না হলে ব্যাগ গুছিয়ে স্কুল/কলেজে যাবো। এমন ধরনের “যদি, তা নাহলে” থেকেই if – else।

1
2
if(expression) statement 1
else statement2;

 

এখানে এই statement দিয়ে বুঝানো হয়, যদি Expression টি সত্য হয় তাহলে statement 1 কাজ করবে। আর যদি মিথ্যে হয় তাহলে statement2 টি কাজ করবে। একটা প্রোগ্রাম লিখে ফেলিঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(void)
{
    int day;
    printf("Enter value of day: ");
    scanf("%c",&day);
    if((day=='F')|| (day=='f')){
      printf("You can sleep today! :D");
    } else {
        printf("oh no! have to go to class :'( ");
    }
    return 0;
}

 

এখানে করছি কি, আমরা আজকের দিনের প্রথম অক্ষর ইনপুট নিয়েছি এবং তা day নামক ভ্যারিয়েবলে রেখেছি। তারপর if(day==’F’) এখানে একটা লজিক্যাল টেস্ট করেছি। যদি day এর মান F [মানে ফ্রাইডে, শুক্রবার] কারেকটারের সাথে মিলে, তাহলে প্রিন্ট করবে “You can sleep today! :D” কারণ আজ শুক্রবার। আর যদি অন্য কোন  কারেকটার ইনপুট দেয়, মানে সপ্তাহের অন্য কোন দিন হয়, তাহলে লেখা উঠবে “oh no! have to go to class :'(”

if – else  সহজ, তাই না?

উপরের প্রোগ্রামে হয়তো কেউ কেউ শুক্রবারের প্রথম লেটার হিসেবে F অথবা f যে কোন একটা দিতে পারে। এখন কেউ যদি উপরের প্রোগ্রামে f ইনপুট দেয়, তাহলেও লেখা উঠবে “oh no! have to go to class :'(” । অথচ আজ শুক্রবার। আমাদের প্রোগ্রামটি ঠিক করতে হবে। যেন কেউ  F অথবা f যে কোন একটা ইনপুট দিলেই লেখা উঠে  “You can sleep today! :D”

তার জন্য নিচের প্রোগ্রাম লিখিঃ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int main(void)
{
    int day;
    printf("Enter value of day: ");
    scanf("%c",&day);
    if((day=='F')|| (day=='f')){
      printf("You can sleep today! :D");
    } else {
        printf("oh no! have to go to class :'( ");
    }
    return 0;
}

আমরা কন্ডিশনটা একটু পরিবর্তন করেছি। লিখছি: if ((day==’F’)|| (day==’f’))

এখানে || মানে or মানে অথবা। আমরা তা লজিক্যাল অপারেটর সেকশনে জেনেছি। এখন (day==’F’) অথবা (day==’f’) যে কোন একটা সত্য হলেই আমাদের প্রোগ্রাম প্রিন্ট করবে “You can sleep today! :D” অন্যথায় প্রিন্ট করবে “oh no! have to go to class :'(”

 

if – else এ কিন্তু else না থাকলে ও হয়। এটা একটি বাড়তি অংশ। নিচে কয়েকটি statement দেওয়া হলঃ

1
if (x==1) pfrintf(“%d”,1);

এখানে যদি x=1 হয় তাহলে pfrintf(“%d”,1); statement টি কাজ করবে এবং 1 Print করবে। আর যদি x=1 না হয় তাহলে pfrintf(“%d”,1); statement টি কাজ করবে না। সম্পুর্ণ একটি প্রোগ্রামঃ

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main(void)
{
    int x;
    printf("Enter value of X: ");
    scanf("%d", &x);
 
    if(x==1){
        printf("value of X is 1");
    }
    return 0;
}

 

1
2
if(a>b) printf("a is greater then b");
else printf("a is less then or equal to b");

এখানে যদি a<b হয়, মানে a যদি  b থেকে ছোট হয় তাহলে printf(“a is greater  then b”); statement টি কাজ করবে এবং a is grater then b লেখা টি প্রিন্ট করবে। আর যদি a<b না হয় তাহলে printf(“a is greater  then b”); কাজ করবে না। else অংশে যাবে এবং printf(a is less then b”); statement টি কাজ করবে তারপর a is less then b লেখাটি প্রিন্ট করবে।

সম্পুর্ণ প্রোগ্রামঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main(void)
{
    int a,b;
    printf("input the valu of a:");
    scanf ("%d",&a);
    printf("input the valu of b:");
    scanf ("%d",&b);
    if(a>b) printf("a is greater then b");
    else printf("a is less then or equal to b");
 
    return 0;
}

শুধু মাত্র if statement ব্যবহার করে দুটি সংখ্যার মধ্যে ছোট বড় নির্নয়ের জন্য একটি প্রোগ্রাম লিখিঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main(void)
{
    int x,y;
     
    printf("input the valu of x:");
    scanf ("%d",&x);
     
    printf("input the valu of y:");
    scanf ("%d",&y);
     
    if(x>y) printf("x is greater then y\n");
    if(x<y)printf("x is less then y\n");
    if(x==y)printf("x is equal to y\n");
     
    return 0;
}

এ প্রোগ্রামে আপনার কাছ থেকে দুটি নাম্বার ইনপুট নিবে। তার পর তাদের মধ্যে কোনটা বড়, ছোট বা সমান তা দেখাবে। If-else statement ব্যবহার করে দুটি সংখ্যার মধ্যে ছোট বড় নির্নয়ের জন্য একটি প্রোগ্রাম লিখিঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main(void)
{
    int x,y;
    printf("input the valu of x:");
    scanf ("%d",&x);
      
    printf("input the valu of y:");
    scanf ("%d",&y);
      
    if(x>y) printf("x is greater then y\n");
    else printf("x is less then y\n");
}

এখানের প্রোগ্রামটি আগের টির মতই। তবে এখানে equality দেখাবে না। equality দেখার জন্য নিচের প্রোগ্রামটি দেখিঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(void)
{
    int x,y;
    printf("input the valu of x:");
    scanf ("%d",&x);
 
    printf("input the valu of y:");
    scanf ("%d",&y);
 
    if(x>y) printf("x is greater then y\n");
    if(x==y) printf("x is equal to y\n");
    else printf("x is less then y\n");
}

পাস এবং ফেল নির্নয় জন্য একটি প্রোগ্রামঃ

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main(void)
{
    int x;
    printf("input your number:");
    scanf ("%d",&x);
      
    if (x>40 && x<100)
    printf("Congratulation!!! You have passed");
    else("Ops!! You have failed.");
}

এখানে যদি এক্সামের মার্ক ইনপুট দেওয়া হয়ত, তাহলে পাস করছে নাকি ফেল করছে তা দেখাবে।

nested if-else

একটা if ব্লকের ভেতর যদি আরেকটা if/else ব্লক লিখি, তাই হচ্ছে nested if-else। নিচের প্রোগ্রামটি দেখিঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int main ()
{
  int grade;
  printf("Type in your grade: ");
  scanf ("%d", &grade);
 
  if (grade < 10){
    printf ("Oh no!");
  }
  else{
    if (grade < 40){
      printf ("You failed.\n");
    }
    else{
      printf ("You passed!\n");
      if (grade >= 90){
        printf ("And you got an A!\n");
      }
    }
  }
  return 0;
}



সি পোগ্রামিং – while

while লুপের সাধারণ ফরম হচ্ছেঃ

while (condition) statement

expression বলতে একটা কন্ডিশন দেওয়া হয়। যতক্ষণ  পর্যন্ত এই কন্ডিশনটি সত্য হবে, ততক্ষন পর্যন্ত while লুপটি চলবে। ছোট্ট একটা প্রোগ্রাম লিখিঃ

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main ( ){
  
int number = 0;
while (number <=9){
        printf("%d \n", number);
        number++;
    }
}

উপরের প্রোগ্রামে আমরা 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”

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main ( ) {
  
int number = 1;
while (number <=100){
        printf("ami r dustumi korbo na. \n");
        number++;
    }
}

 

প্রোগ্রামটি রান করলে দেখব, কনসোলে ১০০ বার লেখা উঠে, আমি আর দুষ্টুমি করব না।

এখানে এর আগের প্রোগ্রামের মত একই কাজই করা হয়েছে। আগের প্রোগ্রামে নাম্বার ভ্যারিয়েবলটি প্রিন্ট করা হয়েছে। এখন প্রিন্ট করা হয়েছে একটি স্টিং।

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

while লুপ দিয়ে আরেকটি প্রোগ্রাম লিখতে পারি। 1 থেকে 100 পর্যন্ত বেজোড় সংখ্যা গুলো প্রিন্ট করতে পারি। নিচের প্রোগ্রামটি দেখিঃ

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main ( )
{
int number = 1;
while (number <=100){
    printf("%d \n", number);
    number = number + 2;
    }
}

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

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


সি প্রোগ্রামিংঃ for-লুপ

লুপিং এর কাজে সবছেয়ে বেশি ব্যবহৃত হয় 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
#include<stdio.h>
int main(void)
{
int i;
for(i=0;i<=10;i++)
    printf("%d\n",i);
}

এর আউট পুট হচ্ছেঃ ০ 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 লুপ ব্যবহার করে। 

1
2
3
4
5
6
7
8
#include<stdio.h>
int main(void)
{
int i;
for(i=0;i<=100;i++)
    printf("ami r dustumi korbo na. \n");
return 0;
}

এখানে আগের প্রোগ্রামের থেকে একটু পার্থক্য হচ্ছে আগে আমরা i এর মান প্রিন্ট করেছি। এখানে আমরা একটা লাইন প্রিন্ট করেছি “ami r dustumi korbo na.” for লুপ এর ভেতরের Exprission2 তে লিখেছি i<=100। মানে i এর মান যতক্ষণ না পর্যন্ত ১০০ হচ্ছে, ততক্ষণ পর্যন্ত এই লুপটি চলবে। Exprission3 তে i এর মান আমরা প্রতিবার ১ করে বাড়িয়ে দিয়েছি।
এবার আমরা আরেকটি প্রোগ্রাম লিখি। এবার এক থেকে ৫০ পর্যন্ত বেজোড় সংখ্যা গুলো বের করার একটা প্রোগ্রাম লিখি।

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(void)
{
int i;
for(i=0;i<=50;i++)
    {
    if(i%2==1)
        printf("%d\n",i);
    }
return 0;   
}

আগের প্রথম প্রোগ্রামের মতই i এর মান আমরা প্রিন্ট করেছি। তবে একটা কন্ডিশন দিয়েছি এখানে। for লুপের ভেতর প্রতিবার ঢুকবে। ঢুকার পর if দিয়ে একটা কন্ডিশন চেক করবে। if(i%2==1) মানে হচ্চে i কে দুই দ্বারা ভাগ করলে ভাগ শেষ যদি ১ থাকে, তাহলে if কন্ডিশনের ভেতরের স্টেটমেন্ট printf(“%dn”,i); দিয়ে i এর মান প্রিন্ট হবে। আর না হলে কিছুই হবে না। এখানে কি করছি কি, একটা লুপের ভেতর আরেকটা লুপ ব্যবহার করেছি।

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

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main(void)
{
int i;
for(i=1;i<=50;i=i+2)
    printf("%d\n",i);
 
return 0;
}

এখানে করছি কি i এর প্রথম মান ধরে নিয়েছি ১। এক একটা বিজোড় সংখ্যা। তা প্রিন্ট করবে। এরপর ১ এর সাথে ২ যোগ করে দিলেই তো হবে ৩, তা বিজোড় সংখ্যা। তা প্রিন্ট করবে। এরপর ৩ এর সাথে ২ যোগ করে দিলে হবে ৫, তা বিজোড় সংখ্যা। তা প্রিন্ট করবে। আমরা লুপের Expression3 তে লিখছি i=i+2। লুপের Expression2 তে কন্ডিশন দিয়েছি i<=50। মানে যতক্ষণ না পর্যন্ত i এর মান ৫০ এর বেশি হবে, ততক্ষন পর্যন্ত লুপটি চলবে।।

এবার একটা for লুপের ভেতরে আরেকটা for লুপ ব্যবহার করে একটা প্রোগ্রাম লিখিঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main(void){
int i, j;
 
for(i=0;i<=5;i++){
    for (j=0;j<=i;j++){
        printf("%d ", j);
    }
    printf("\n");
  }
 
return 0;
}

এখানে আমরা দুইটা ভ্যারিয়েবল নিয়েছি। i এবং j. প্রথম for লুপের ভেতর i এর ইনিশিয়াল মান দিয়েছি ০, কন্ডিশন দিয়েছি i<=5 এবং i এর মান 1 করে বাড়িয়েছি। মানে হচ্ছে প্রথম for লুপটি ৫ বার এক্সিকিউট হবে। প্রোগ্রামটি আউটপুট দিবঃ  

 

1
2
3
4
5
6
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 লুপ ব্যবহার করে লিখবঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main ()
{
    int total_no, count;
    float number, average, sum =0;
 
    printf("How many numbers? ");
    scanf("%d", &total_no);
 
    for(count = 1; count <= total_no; count++){
        printf("Enter number %d : ", count);
        scanf("%f", &number);
        sum +=number;
    }
 
    average = sum / total_no;
    printf("Average is : %f\n", average);
 
return 0;
}


সি প্রোগ্রামিংঃ do – while



কিছু একটা কর, যতক্ষণ পর্যন্ত একটা কন্ডিশন সত্য হয়। এমন প্রোগ্রাম লিখতে আমরা do while ব্যবহার করি।
do while লুপের সাধারণ ফরম হচ্ছেঃ

do statement while (expression); 

expression বলতে একটা কন্ডিশন দেওয়া হয়। যতক্ষণ  পর্যন্ত এই কন্ডিশনটি সত্য হবে, ততক্ষন পর্যন্ত এই do while লুপটি চলবে এবং এই statement এক্সিকিউট হতে থাকবে। একটি স্টেটমেন্ট এক্সিকিউট করার জন্য আমাদের দ্বিতীয় ব্র্যকেট ব্যবহার করতে হবে না। কিন্তু যদি আমরা একের অধিক স্টেটমেন্ট এক্সিকিউট করতে চাই, তাহলে আমাদের দ্বিতীয় ব্র্যাকেট ব্যবহার করতে হবে। তখন লিখতে হবে এমন করেঃ

1
2
3
4
5
6
7
do{
 statement 1;
 statement 2;
 statement 3;
....
 
while (expression);


ছোট্ট একটা প্রোগ্রাম লিখিঃ

#include <stdio.h>
int main ()
{
int number = 0;
do {
printf("%d \n", number);
number++;
} while (number <=9);
return 0;
}

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

#include <stdio.h>
int main ()
{
int number = 0;
do
printf("%d \n", number++);
while (number <=9);
return 0;
}

আমরা যদি একটি মাত্র স্টেটম্যান্ট এক্সিকিউট করতে চাই, তাহলে আমাদের দ্বিতীয় ব্র্যকেট ব্যবহার না করলেও হবে।

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

#include <stdio.h>
int main ()
{
int total_no, count = 1;
float number, average, sum =0;
printf("How many numbers? ");
scanf("%d", &total_no);
do{
printf("Enter number %d : ", count);
scanf("%f", &number);
sum +=number;
count++;
}while (count <=total_no);
average = sum / total_no;
printf("Average is : %f\n", average);
return 0;
}

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

number নামক ভ্যারিয়েবল দিয়ে আমরা এরপর প্রতিটা সংখ্যা ইনপুট নিচ্ছি। ইনপুট নিয়ে সেগুলো সব যোগ করছি। ছোট্ট একটা লাইন দিয়ে। sum +=number; যার মানে হচ্ছে sum = sum + number;

যখন দেখেছি count এর মান total_no এর থেকে বড় হয়ে গেছে, তার মানে হচ্ছে আমাদের সকল সংখ্যা ইনপুট নেওয়া হয়ে গেছে। তাই আমরা do while থেকে বের হয়ে গিয়েছি। এরপর গড় বের করেছি। তারপর প্রিন্ট।



সি প্রোগ্রামিং – switch case

একটা ভ্যালু এর উপর নির্ভর করে অনেক গুলো স্টেটম্যান্ট থেকে একটা স্টেটম্যান্ট এক্সিকিউট করার জন্য switch case ব্যবহার করা হয়। switch case  সাধারণত নিচের মত করে লেখা হয়ঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch ( variable ) {
    case expression 1:
        statement;
        break;
    case expression 2:
        statement;
        break;
    case expression 3:
        statement;
        break;
    default:
        statement;
        break;
 
}

এখানে যদি 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 ব্যবহার করে।

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
int main ()
{
char colorCode;
printf("Enter first word of Red, White or Black: \n");
scanf("%c", &colorCode);
 
 
switch ( colorCode ) {
    case 'r' :
    printf("You select Red.");
    break;
 
    case 'w':
    printf("You select White.");
    break;
 
    case 'b':
    printf("You select Black.");
    break;
 
    default:
    printf("Wrong choose!");
    break;
}
return 0;
}

উপরের প্রোগ্রামটি রান করি, তারপর 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 ইনপুট দিলে উভয় ক্ষেত্রেই আমাদের সঠিক আউটপুট দেয়।

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
int main ()
{
char colorCode;
printf("Enter first word of Red, White or Black: \n");
scanf("%c", &colorCode);
 
 
switch ( colorCode ) {
    case 'r' :
    case 'R' :
    printf("You select Red.");
    break;
 
    case 'w':
    case 'W' :
    printf("You select White.");
    break;
 
    case 'b':
    case 'B' :
    printf("You select Black.");
    break;
 
    default:
    printf("Wrong choose!");
    break;
}
return 0;
}

এখানে আমরা লক্ষ্য করলে দেখব আমরা এখন break এর ব্যবহার ছাড়া এক সাথে দুই বার case ব্যবহার করেছি। যেমনঃ

case ‘r’ :
case ‘R’ :

এভাবে break ছাড়া একের অধিক case লিখলে সে গুলো OR অপারেশনের মত কাজ করে। একটা সত্য হলে ঐ case গুলোর পরের Expression গুলো এক্সিকিউট হবে। এবং break পাওয়া পর্যন্ত অপেক্ষা করবে।

switch case এর ভেতরে যে কোন কোডই রান করানো যায়, লুপ চালানো, ফাংশন কল করা সহ সব কিছু। প্রথমে একটা প্রোগ্রাম লিখব, যেখানে switch case এর ভেতরে আমরা একবার for লুপ ব্যবহার করব, একবার while লুপ ব্যবহার করব। এটা বুঝানোর জন্য যে আমরা ইচ্ছে করলে যে কোন কোডই রান করাতে পারি switch case এর মধ্যেঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
int main ()
{
int code;
int i = 0;
printf("Enter 1 to print even integers or enter 2 to print odd integers: ");
scanf("%d", &code);
 
 
switch ( code ) {
    case 1 :
        while(i<=100){
            printf("%d \n", i);
            i=i+2;
        }
    break;
 
 
    case 2 :
         for(i =1; i<=100; i=i+2)
                printf("%d \n", i);
 
    break;
 
 
    default:
    printf("Wrong choose!");
    break;
}
return 0;
}

প্রোগ্রামটা আমাদের 1 অথবা 2 ইনপুট দিতে বলবে। 1 ইনপুট দিলে ১ থেকে ১০০ পর্যন্ত বেজোড় সংখ্যা গুলো প্রিন্ট করবে। আর 2 ইনপুট দিলে ১ থেকে ১০০ পর্যন্ত জোড় সংখ্যা গুলো প্রিন্ট করবে।

আমরা ইচ্ছে করলে switch case এর ভেতর থেকে ফাংশন ও কল করতে পারি। নিচের প্রোগ্রামটি দেখিঃ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
int main ()
{
    void playGame(){
       printf("You choose to Play the game.");
        }
    void closeGame(){
       printf("You choose to Close the game.");
        }
 
 
int code;
 
printf("Enter 1 to play the Game.\nEnter 2 to close the Game :");
scanf("%d", &code);
 
 
switch ( code ) {
    case 1 :
        playGame();
        break;
 
 
    case 2 :
        closeGame();
        break;
 
 
    default:
    printf("Wrong choose!");
    break;
}
return 0;
}

আমরা দুইটা ফাংশন তৈরি করেছি, playGame() এবং closeGame()। ব্যবহারকারী 1 ইনপুট দিলে playGame() ফাংশনটি কল হবে, এবং 2 ইনপুট দিলে closeGame() ফাংশন কল হবে… এভাবে নিজের মত করে নিজের ক্রিয়েটিভিটি ব্যবহার করে আমরা প্রয়োজন মত আমাদের প্রোগ্রামে switch case ব্যবহার করতে পারি।