for লুপ স্টেটমেন্ট

আমরা পূর্বের পর্বে জেনেছি সি প্রোগ্রামিং এর লুপিং কন্ট্রোল স্টেটমেন্ট নিয়ে। এই পর্বে আমরা সি প্রোগ্রামিং এর for লুপ স্টেটমেন্ট নিয়ে বিস্তারিত আলোচনা করব।

আমরা ইতিমধ্যে জেনে গেছি, লুপের কাজ হলো একই কাজ বারবার পুনরাবৃত্তি করা। অর্থাৎ আমরা যদি এক ধরণের কাজ বারবার করতে চাই তাহলে আমাদেরকে লুপ ব্যবহার করতে হবে। এই পর্বে আমরা বহুল ব্যবহৃত for লুপ নিয়ে আলোচনা করবো।

for লুপের সিনট্যাক্স

for (initialization; condition; increment/decrement)
{
statements
}

ব্যাখ্যা

প্রতিটি লুপ কন্ট্রোল স্টেটমেন্টে দুটি প্রধান অংশ loop ডিক্লারেশন ও loop বডি থাকে। আর loop ডিক্লারেশন অংশের আবার তিনটি বিশেষ অংশ রয়েছে সেগুলো হল-

  • Initialization Statement

  • Test Expression

  • Update Statement

এখন আমরা যদি for লুপের সিনট্যাক্স এর দিকে লক্ষ্য করি, তখন দেখতে পাবো for কিওয়ার্ডটির মাঝে তিনটি অংশ রয়েছে। যেগুলোকে loop ডিক্লারেশনের অংশ বলা হয়। for লুপের উপাদান গুলোকে সেমিকোলন (;) দিয়ে আলাদা করা হয়। for লুপের প্রথম অংশকে ভেরিয়েবলের initialization বলা হয়। এর মানে হচ্ছে আমাদেরকে প্রথমেই ভেরিয়েবলের প্রাথমিক মান নির্ধারণ করে দিতে হবে। এরপরের অংশকে condition বা Test Expression বলা হয়, যেখানে আমরা আমাদের কোডের শর্ত গুলো নির্ধারণ করে দিয়ে থাকি। এরপরের অংশকে বলে Update Statement বা increment/decrement, এই অংশে ভেরিয়েবলের মান বাড়ানো বা কমানোর কাজে ব্যবহার করা হয়।

এরপরের যে statements অংশ, একে বলে loop বডি। এর মানে হচ্ছে যদি আমাদের শর্ত সত্য হয় তাহলে এই অংশ কাজ করবে আর আমাদের দেওয়া শর্ত মিথ্যা হলে এই অংশ কাজ করবে না।

নিচে for লুপের কিছু উদাহরণ লক্ষ্য করুন-

আমি পূর্বের পর্বে বলেছিলাম, অনেক সময় আমাদের একাধিক জিনিস প্রিন্ট করার দরকার হতে পারে, এই জন্য আমরা বারবার printf ফাংশন ব্যবহার করবো না। আমরা একটা স্মার্ট ওয়েতে সেইম কাজটাই করবো, আর সেটা হচ্ছে লুপ। ধরুন, আপনি আপনার নামটা পাঁচ বার প্রিন্ট করে দেখাতে চান কিন্ত printf ফাংশন দিয়ে পাঁচ বার লিখতে চান না, তাহলে কাজটা কিভাবে করবেন? নিচের কোডটা দেখুন-

#include <stdio.h>
int main()
{
int i;
for(i=1; i<=5; i++)
{
printf("MD Sazibur Rahman \n");
}
return 0;
}

আউটপুট

MD Sazibur Rahman
MD Sazibur Rahman
MD Sazibur Rahman
MD Sazibur Rahman
MD Sazibur Rahman

এখানে আমি আমার নামটি পাঁচ বার প্রিন্ট করেছি। প্রথমেই আমি i নামে একটা ইন্টিজার ভেরিয়েবল নিয়েছি তারপর for লুপের ভিতরে i এর ভেল্যু 1 এসাইন করেছি। এরমানে হচ্ছে আমি ভেরিয়েবলের প্রাথমিক মান 1 নির্ধারণ করে দিয়েছি। এরপর condition বা Test Expression অংশে বলে দিয়েছি i এর মান 5 না হওয়া পর্যন্ত এই লুপ চলতে থাকবে। এরপরের অংশ অর্থাৎ Update Statement বা increment/decrement অংশে বলে দিয়েছি, যাতে এটি i++ মানে এক এক করে যাতে বৃদ্ধি পায়।

এখন আমরা যদি ১ থেকে ১০ পর্যন্ত অথবা আমাদের ইচ্ছে মত বার কিবোর্ড থেকে ইনপুট নিয়ে প্রিন্ট করতে চাই, তখন কোড কেমন হবে? আমি প্রথমে ১ থেকে ১০ পর্যন্ত দেখাই তারপর কিবোর্ড থেকে ইনপুট নিয়ে দেখাবো।

#include <stdio.h>
int main()
{
int i;
for(i=1; i<=10; i++)
{
printf("%d ",i);
}
return 0;
}

আউটপুট

1 2 3 4 5 6 7 8 9 10

এখানে উপরের প্রোগ্রামটির সেইম কনসেপ্ট ব্যবহার করা হয়েছে, শুধু printf ফাংশনে আমরা যেহেতু ইন্টিজার টাইপ ডিজিট প্রিন্ট করবো তাই %d দেওয়া হয়েছে আর %d শেষে একটা স্পেস দেওয়া হয়েছে, কেন দেওয়া হয়েছে সেটা আপনি পুরো প্রোগ্রাম কোড করে স্পেসটি ডিলেট দিয়ে রান করলেই বুঝতে পারবেন, সে ব্যাপারে আমি কিছু বলবো না। আর i মানে আমি i এর মান গুলো প্রিন্ট করেছি তাই।

এখন আপনি যদি আপনার ইচ্ছেমত বার প্রিন্ট করতে চান, তাহলে কোডের কিছুই পরিবর্তন করতে হবে না শুধু এক্সট্রা আরেকটি ফাংশন সংযুক্ত করতে হবে, সেটি হচ্ছে scanf ফাংশন।

#include <stdio.h>
int main()
{
int i, input;
scanf("%d", &input);
for(i=1; i<=input; i++)
{
printf("%d ",i);
}
return 0;
}

আউটপুট

30
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

এখন 1 থেকে 1000 পর্যন্ত সব সংখ্যার যোগফল যদি for লুপ দিয়ে বের করতে চাই তাহলে-

#include <stdio.h>
int main()
{
int i, sum = 0;
for(i=1; i<=1000; i++)
{
sum = sum+i; // sum += i; same concept
}
printf("Sum: %d \n",sum);
return 0;
}

আউটপুট

Sum: 500500

এখন আমরা যদি 1 থেকে 100 সংখ্যা পর্যন্ত জোড়-বেজোড় বের করতে চাই তাহলে-

বেজোড় সংখ্যার জন্য
#include <stdio.h>
int main()
{
int i;
for(i=1; i<=100; i = i+2)
{
printf("%d ",i);
}
return 0;
}

আউটপুট

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43
45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83
85 87 89 91 93 95 97 99
জোড় সংখ্যার জন্য
#include <stdio.h>
int main()
{
int i;
for(i=2; i<=100; i = i+2)
{
printf("%d ",i);
}
return 0;
}

আউটপুট

2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44
46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84
86 88 90 92 94 96 98 100

ব্যাখ্যা

উপরের দুটি প্রোগ্রামে আমরা তেমন কিছু পরিবর্তন করি নাই, শুধু Update Statement বা increment/decrement অংশে পরিবর্তন করেছি। আগে ছিল i++ আর এখন i = i+2 লিখেছি। এর মানে হচ্ছে আগে i এর মান এক এক করে বৃদ্ধি পেত অর্থাৎ i++ মানে i = i+1 বা i = 1+1 কিন্তু এখন i = i+2 করে দিয়েছি। তাই এখন i এর প্রাথমিক মান যদি 1 হয়, তাহলে i = i+2 বা i = 1+2 বা i = 3 হয়ে যাবে। এইভাবে আবার 3 এর সাথে 2 যোগ হয়ে 5 হয়ে যাবে। এইভাবে এই লুপটি 100 পর্যন্ত ঘুরবে।

এরপরের অংশে আমরা শুধু ইনিশিয়ালাইজেশনে i এর মান 2 করে দিয়েছি। এরপর যখন এটি Update Statement এ আসবে তখন i = i+2 বা i = 2+2 বা i = 4 হয়ে যাবে, এইভাবে আবার 4 এর সাথে 2 যোগ হয়ে 6 হয়ে যাবে। এইভাবে এই লুপটি 100 পর্যন্ত ঘুরবে।

এখন for লুপ দিয়ে কিছু পিরামিডের প্রোগ্রাম লিখি-

Star (*) চিহ্ন দিয়ে হাফ পিরামিড প্রিন্ট করার প্রোগ্রাম-

#include <stdio.h>
int main()
{
int i, j, rows;
scanf("%d", &rows);
for(i=1; i<=rows; ++i)
{
for(j=1; j<=i; ++j)
{
printf("* ");
}
printf("\n");
}
return 0;
}

আউটপুট

5
*
* *
* * *
* * * *
* * * * *

Number দিয়ে হাফ পিরামিড প্রিন্ট করার প্রোগ্রাম-

#include <stdio.h>
int main()
{
int i, j, rows;
scanf("%d", &rows);
for(i=1; i<=rows; ++i)
{
for(j=1; j<=i; ++j)
{
printf("%d ", j);
}
printf("\n");
}
return 0;
}

আউটপুট

5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Infinite loop