লুপিং স্ট্রাকচার: পুনরাবৃত্তি ও ধারার প্রোগ্রাম
সি প্রোগ্রামিং লুপ: for, while, do-while লুপের ব্যবহার। ধারার যোগফল (Series), ফ্যাক্টরিয়াল নির্ণয়, নেস্টেড লুপ এবং break/continue এর ব্যবহার।
অধ্যায় ৫: প্রোগ্রামিং ভাষা - লুপিং স্ট্রাকচার ও ধারার প্রোগ্রাম
- লুপিং স্ট্রাকচার: পুনরাবৃত্তি ও ধারার প্রোগ্রাম
- লুপের প্রয়োজনীয়তা: একটি চিন্তা
- লুপ (Loop) কী এবং এর উপাদান
- for লুপ: গঠন ও উদাহরণ
- while লুপ: শর্ত যখন প্রধান
- do-while লুপ: কাজ আগে, শর্ত পরে
- ধারার যোগফল নির্ণয় (Series Sum)
- বিভিন্ন ধারার কোডিং
- ফ্যাক্টরিয়াল (Factorial) নির্ণয়
- নেস্টেড লুপ (Nested Loop)
- লুপ কন্ট্রোল: break এবং continue
- সারসংক্ষেপ: যা শিখলাম
লুপিং স্ট্রাকচার: পুনরাবৃত্তি ও ধারার প্রোগ্রাম
লুপিং স্ট্রাকচার: পুনরাবৃত্তি ও ধারার প্রোগ্রাম
কম্পিউটার প্রোগ্রামিংয়ের অন্যতম প্রধান শক্তি হলো কোনো কাজ বা নির্দেশ দ্রুত এবং নির্ভুলভাবে বারবার সম্পাদন করা। যদি তোমাকে বলা হয় "I Love ICT" লেখাটি ১০০০ বার খাতায় লিখতে, তবে এটি তোমার জন্য অত্যন্ত বিরক্তিকর এবং সময়সাপেক্ষ কাজ হবে। কিন্তু কম্পিউটারের জন্য এটি মাত্র কয়েক মিলিসেকেন্ডের ব্যাপার। এই পুনরাবৃত্তিমূলক কাজ করার প্রক্রিয়াকেই প্রোগ্রামিংয়ের ভাষায় লুপিং (Looping) বলা হয়।
লুপ ব্যবহার করে আমরা স্যালারি শিট তৈরি, ডিজিটাল ঘড়ি বা টাইমার, এবং গাণিতিক ধারার (Series) মতো জটিল সমস্যাগুলো খুব সহজে সমাধান করতে পারি। আজকের এই পাঠে আমরা সি ল্যাঙ্গুয়েজের লুপিং স্ট্রাকচার, এর প্রকারভেদ এবং ধারার প্রোগ্রামের লজিক সম্পর্কে বিস্তারিত জানব।
লুপ কন্ট্রোল স্টেটমেন্ট: গভীর আলোচনা
প্রোগ্রামিংয়ে লুপ সঠিকভাবে কাজ করার জন্য এর গঠন বা স্ট্রাকচার বোঝা খুব জরুরি। একটি আদর্শ লুপের মূলত ৪টি অংশ থাকে। যদি এর কোনো একটি অংশ ভুল হয়, তবে লুপটি ঠিকমতো কাজ করবে না অথবা অসীম লুপ (Infinite Loop)-এ পরিণত হবে।
সংজ্ঞা (Definition): লুপ (Loop) — প্রোগ্রামের কোনো নির্দিষ্ট অংশ বা স্টেটমেন্ট ব্লক একটি নির্দিষ্ট শর্ত পূরণ না হওয়া পর্যন্ত বারবার পুনরাবৃত্তি করাকে লুপিং বা ইটারেশন (Iteration) বলে।
লুপের ৪টি প্রধান অংশ
- ইনিশিয়ালাইজেশন (Initialization): লুপ কোথা থেকে শুরু হবে তা নির্ধারণ করা। এখানে একটি ভেরিয়েবলের (যাকে কাউন্টার বলা হয়) প্রাথমিক মান সেট করা হয়। যেমন:
i = 1; - কন্ডিশন (Condition): এটি একটি লজিক্যাল শর্ত যা যাচাই করে লুপটি চলবে কি না। শর্ত সত্য (True) হলে লুপের বডি কাজ করে, আর মিথ্যা (False) হলে লুপ বন্ধ হয়ে যায়। যেমন:
i <= 10; - বডি (Body): লুপের ভেতরে থাকা স্টেটমেন্টগুলো যা বারবার এক্সিকিউট বা রান হয়। যেমন:
printf("ICT"); - ইনক্রিমেন্ট/ডিক্রিমেন্ট (Increment/Decrement): প্রতিবার লুপ চলার পর কাউন্টার ভেরিয়েবলের মান বাড়ানো বা কমানো। এটি না থাকলে কন্ডিশন কখনোই মিথ্যা হবে না এবং লুপ অনন্তকাল চলতে থাকবে। যেমন:
i++বাi = i + 1;
গুরুত্বপূর্ণ (Important):
- Loop Control Variable: যে ভেরিয়েবলটির মান পরিবর্তনের মাধ্যমে লুপ নিয়ন্ত্রণ করা হয় (যেমন: i), তাকে লুপ কন্ট্রোল ভেরিয়েবল বা কাউন্টার ভেরিয়েবল বলে।
- লুপের শর্ত সবসময় সত্য থাকলে তাকে Infinite Loop বলে। প্রোগ্রাম হ্যাং করার অন্যতম কারণ এটি।
লুপের প্রকারভেদ ও তুলনামূলক বিশ্লেষণ
সি ল্যাঙ্গুয়েজে প্রধানত ৩ ধরনের লুপ ব্যবহৃত হয়। প্রতিটি লুপের কাজ করার পদ্ধতি কিছুটা ভিন্ন হলেও মূল উদ্দেশ্য একই।
১. For Loop
যখন আমরা আগে থেকেই জানি যে লুপটি ঠিক কতবার ঘুরবে, তখন for লুপ ব্যবহার করা সবচেয়ে সুবিধাজনক। এর গঠন খুব গোছানো কারণ এক লাইনেই ইনিশিয়ালাইজেশন, কন্ডিশন এবং ইনক্রিমেন্ট থাকে।
Syntax:
for (initialization; condition; update) {
// Body of the loop
}
২. While Loop
এটি একটি Entry Controlled Loop। লুপের বডিতে ঢোকার আগেই কন্ডিশন চেক করা হয়। যদি কন্ডিশন শুরুতেই মিথ্যা হয়, তবে লুপটি একবারও কাজ করবে না। যখন ইটারেশন সংখ্যা অজানা থাকে কিন্তু কন্ডিশন জানা থাকে, তখন এটি ব্যবহার করা হয়।
Syntax:
initialization;
while (condition) {
// Body
update;
}
৩. Do-While Loop
এটি একটি Exit Controlled Loop। এখানে আগে লুপের বডি একবার কাজ করে এবং পরে কন্ডিশন চেক করা হয়। তাই কন্ডিশন মিথ্যা হলেও এই লুপটি অন্তত একবার কাজ করবেই।
Syntax:
initialization;
do {
// Body
update;
} while (condition); // Note the semicolon!
পরীক্ষার টিপস (Exam Tip): পরীক্ষায় প্রায়ই প্রশ্ন আসে "while লুপকে do-while লুপে রূপান্তর করো" অথবা কোড লিখে আউটপুট বের করতে বলা হয়। মনে রাখবে, do-while লুপের শেষে সেমিকোলন না দিলে সিনট্যাক্স ইরর (Syntax Error) হবে।
ব্রেক ও কন্টিনিউ (Break & Continue)
লুপ চলার সময় মাঝপথে লুপ থামানো বা কোনো নির্দিষ্ট স্টেপ বাদ দেওয়ার জন্য break এবং continue স্টেটমেন্ট ব্যবহৃত হয়।
Break Statement
এটি লুপকে তাৎক্ষণিকভাবে বন্ধ (terminate) করে দেয় এবং কন্ট্রোল লুপের বাইরে নিয়ে আসে।
উদাহরণ (Example): Break
যদি আমরা ১ থেকে ১০ পর্যন্ত প্রিন্ট করতে চাই কিন্তু ৫ এ পৌঁছালে লুপ থামাতে চাই:
for(i=1; i<=10; i++) {
if(i == 5) {
break; // ৫ হলে লুপ ভেঙে যাবে
}
printf("%d ", i);
}
Output: 1 2 3 4
Continue Statement
এটি লুপের বর্তমান ইটারেশন বা ধাপটিকে স্কিপ (skip) করে এবং পরবর্তী ধাপে চলে যায়। এটি লুপ থেকে বের হয় না, শুধু ওই নির্দিষ্ট বারের কাজ বাদ দেয়।
উদাহরণ (Example): Continue
যদি আমরা ১ থেকে ৫ পর্যন্ত প্রিন্ট করতে চাই কিন্তু ৩ প্রিন্ট করতে না চাই:
for(i=1; i<=5; i++) {
if(i == 3) {
continue; // ৩ প্রিন্ট না করে পরের ধাপে যাবে
}
printf("%d ", i);
}
Output: 1 2 4 5
ধারার প্রোগ্রাম ও অ্যালগরিদম (Series Programs)
পরীক্ষায় সবচেয়ে বেশি প্রশ্ন আসে ধারার যোগফল নির্ণয় থেকে। ধারা বা সিরিজ সমাধানের জন্য আমাদের দুটি বিশেষ ভেরিয়েবল বুঝতে হবে:
১. Counter Variable (i): যা ধারার পদ বা সংখ্যাগুলো তৈরি করে (যেমন: ১, ২, ৩...)।
২. Accumulator Variable (sum): যা যোগফল জমা রাখে।

১. স্বাভাবিক সংখ্যার যোগফল (1 + 2 + 3 + ... + N)
এখানে প্রতি পদের পার্থক্য ১। তাই i এর মান ১ করে বাড়বে (i++) এবং sum এর সাথে যোগ হবে।
Logic:
sum = 0; // যোগফলের প্রাথমিক মান ০ হতে হয়
for (i = 1; i <= n; i++) {
sum = sum + i;
}
printf("Sum = %d", sum);
২. বর্গের ধারা (1² + 2² + 3² + ... + N²)
এখানে পদগুলো বর্গের আকারে আছে। তাই যোগ করার সময় i*i যোগ করতে হবে।
Logic:
sum = sum + (i * i);
৩. চিহ্ন পরিবর্তনশীল ধারা (1 - 2 + 3 - 4 + ... + N)
এই ধারায় বিজোড় পদগুলো পজিটিভ (+) এবং জোড় পদগুলো নেগেটিভ (-)। এটি সমাধানের জন্য if-else অথবা গাণিতিক লজিক ব্যবহার করা যায়।
লজিক (Logic):
for (i = 1; i <= n; i++) {
if (i % 2 == 0) {
sum = sum - i; // জোড় হলে বিয়োগ
} else {
sum = sum + i; // বিজোড় হলে যোগ
}
}
নেস্টেড লুপ (Nested Loop)
একটি লুপের ভেতরে যখন অন্য একটি লুপ ব্যবহার করা হয়, তাকে নেস্টেড লুপ বলে। ম্যাট্রিক্স বা প্যাটার্ন (Pattern) প্রিন্টিংয়ের জন্য এটি ব্যবহৃত হয়।
গঠন:
for (outer_counter; condition; update) { // সারি (Row) নিয়ন্ত্রণ করে
for (inner_counter; condition; update) { // কলাম (Column) নিয়ন্ত্রণ করে
// Statement
}
}
গুরুত্বপূর্ণ (Important): নেস্টেড লুপে বাইরের লুপের (Outer Loop) প্রতি ১ বার ঘোরার জন্য ভেতরের লুপটি (Inner Loop) সম্পূর্ণ একবার ঘুরে আসে। অর্থাৎ, বাইরের লুপ যদি ৩ বার এবং ভেতরের লুপ যদি ৫ বার চলে, তবে ভেতরের স্টেটমেন্ট মোট $3 \times 5 = 15$ বার কাজ করবে।
সংক্ষিপ্ত সারাংশ (Quick Revision)
মনে রাখার মূল বিষয়:
- ইনিশিয়ালাইজেশন: লুপ শুরুর মান। while লুপে এটি লুপের বাইরে থাকে।
- সেমিকোলন: for এবং while এর শেষে সেমিকোলন হয় না, কিন্তু do-while এর শেষে অবশ্যই সেমিকোলন (;) দিতে হয়।
- ইনফিনিটি লুপ: লুপের কন্ডিশন মিথ্যা না হলে লুপ থামে না, একে অসীম লুপ বলে। Ctrl + C চেপে এটি থামানো যায়।
- ধারা বা সিরিজ: যোগফলের জন্য sum = 0 এবং গুণফলের (যেমন ফ্যাক্টরিয়াল) জন্য fact = 1 দিয়ে শুরু করতে হয়।
- ব্রেক vs কন্টিনিউ: break লুপ থেকে বের করে দেয়, continue শুধু বর্তমান ধাপ স্কিপ করে।
পরিভাষা (Glossary)
| পরিভাষা (Term) | সংজ্ঞা (Definition) |
|---|---|
| Iteration | লুপের একবার সম্পূর্ণ ঘূর্ণন বা পুনরাবৃত্তি। |
| Infinite Loop | যে লুপের শর্ত কখনোই মিথ্যা হয় না এবং চলতেই থাকে। |
| Counter | যে চলক লুপ কতবার ঘুরবে তা গণনা করে বা নিয়ন্ত্রণ করে। |
| Accumulator | যে চলকে ধারার যোগফল বা গুণফল জমা রাখা হয় (যেমন: sum, fact)। |
| Nested Loop | একটি লুপের ভেতরে অবস্থিত অন্য একটি লুপ। |