লুপ (Loops)
অ্যাসেম্বলি লাইন (The Assembly Line)
ধরা যাক, একটি কারখানার (factory) অ্যাসেম্বলি লাইনের (assembly line) কথা। যেখানে একটি রোবটের হাত (robot arm) মূলত তার একটি পার্ট বা অংশ (part) তুলে নেয়, সেটির ওপর স্ট্যাম্প (stamps) মারে, বেলেটের (belt) ওপর রাখে এবং এই একই কাজ শত শত বার (hundreds of times) পুনরায় (repeats) করতে থাকে। এটি কখনোই বোর (bored) বা বিরক্ত হয় না, কোনো প্রকার কোনো ভুলও (mistakes) করে না (অবশ্য যদি না আপনি সেটিকে ভুলভাবে প্রোগ্রাম বা programmed করে থাকেন), এবং এর বাক্স বা বক্সটি (box) পুরো ভর্তি হওয়া মাত্রই এটি ঠিকঠাকমতো থেমে যায় (stops exactly)।
সি (C)-তে মূলত এই লুপগুলো (loops) ঠিক এভাবেই কাজ করে। এটি মূলত কোনো একটি নির্দিষ্ট শর্ত বা কন্ডিশন (condition) সেটিকে থামাতে না বলা পর্যন্ত কোডের (code) একটি নির্দিষ্ট ব্লককে (block) বারবার পুনরায় (repeat) চালাতে থাকে। সি (C) প্রোগ্রামিং মূলত এর প্রতিটি ভিন্ন বা আলাদা পরিস্থিতির (different situation) জন্য উপযুক্ত মোট তিনটি (three) ধরনের লুপ (loops) প্রদান করে থাকে:
for— যখন আপনি ঠিকঠাকমতো বা এক্সাক্টলি (exactly) জানেন যে আপনাকে কোনো জিনিস ঠিক কতবার পুনরাবৃত্তি (repeat) করতে হবে।while— যখন আপনি এর নির্দিষ্ট কোনো একটি শর্ত বা কন্ডিশনের (condition) শেষ না হওয়া পর্যন্ত বারবার এর কাজগুলোকে পুনরাবৃত্তি (repeat) করতে চান।do-while— এটি মূলত এইwhile-এর মতোই, তবে এটি অন্তত পক্ষে একবার (at least once) তার ভেতরের সমস্ত কাজগুলো রান (runs) করে।
ফর লুপ (The for Loop)
এই for লুপটি (for loop) মূলত এর সমস্ত জিনিসগুলোকে এক লাইনের (one line) ভেতরেই প্যাক (packs) করে নেয়: இனிশিয়ালাইজেশন (initialization) বা শুরু করা, কন্ডিশন (condition) বা শর্ত, এবং আপডেট বা হালনাগাদ (update)। সি (C)-তে এটি মূলত সবচেয়ে বেশি ব্যবহৃত বা কমন লুপ (common loop) এবং বিভিন্ন গণনার (counting) কাজে আপনি মূলত এটিকেই সবচেয়ে বেশি ব্যবহার করবেন।
সিনট্যাক্স (Syntax): for (init; condition; update) { body }
ফর লুপ (for Loop) — গণনা করা (Counting)
হোয়াইল লুপ (The while Loop)
এই while লুপ (while loop) মূলত তার প্রতিটি ইটারেশনের (iteration) বা পুনরাবৃত্তির আগেই (before) তার শর্ত বা কন্ডিশনটিকে (condition) যাচাই (checks) করে। তাই যদি এর ভেতরের শর্তটি (condition) শুরু থেকেই মিথ্যা বা ফলস (false) হয়, তবে এর ওই বডিটি (body) আর কখনই রান (runs) করে না। এটি আপনি মূলত তখনই ব্যবহার করবেন যখন আপনার আগে থেকেই জানা থাকে না যে এর ভেতর মোট কতগুলো পুনরাবৃত্তির (repetitions) প্রয়োজন।
হোয়াইল লুপ (while Loop) — অজানা ইটারেশনসমূহ (Unknown Iterations)
ডু-হোয়াইল লুপ (The do-while Loop)
এই do-while লুপটি (do-while loop) মূলত একটি ট্রাই-দেন-চেক (try-then-check) বা চেষ্টা-করে-চেক-করা লুপ। এটি মূলত সবার আগে (first) এর বডিকে (body) রান (runs) করিয়ে নেয়, এবং ঠিক তার পরপরই এর শর্ত বা কন্ডিশনটিকে (condition) চেক (checks) করে। এর ফলে এটির বডিটি অন্তত একবার হলেও (at least once) এক্সিকিউট (executes) বা রান হয় — ইনপুট ভ্যালিডেশনের (input validation) জন্য এটি মূলত একেবারে পারফেক্ট বা নিখুঁত (perfect), যেখানে আপনাকে সাধারণত ইউজারের (user) কাছে কোনো কিছু চেয়ে নিয়ে দেখতে হয় যে সেটি সম্পূর্ণ বৈধ বা ভ্যালিড (valid) কি না।
ডু-হোয়াইল (do-while) — ইনপুট ভ্যালিডেশন (Input Validation)
ব্রেক এবং কন্টিনিউ (break and continue)
এখানকার এই break বা ব্রেকটি মূলত এর ইমারজেন্সি স্টপ বাটনটিকে (emergency stop button) ভেঙে দেয় — অর্থাৎ এটি তাৎক্ষণিকভাবে (immediately) ওই লুপটি (loop) থেকে বের হয়ে আসে (exits)। অন্যদিকে continue বা কন্টিনিউ মূলত বর্তমান ইটারেশনের (current iteration) বাকি অংশটুকুকে একেবারে স্কিপ (skips) বা এড়িয়ে গিয়ে সরাসরি এর পরেরটিতে (next one) লাফ দেয় (jumps)। এই for, while, এবং do-while-এর তিনটির ক্ষেত্রেই এই জিনিসগুলো খুব সুন্দরভাবে কাজ করে।
ব্রেক এবং কন্টিনিউ (break and continue)
নেস্টেড লুপ (Nested Loops)
একটি লুপের (loop) ভেতরের আরেকটি লুপ (loop) — এখানকার ওই বাইরের লুপটির (outer loop) প্রতিটি সিঙ্গেল ইটারেশন (single iteration) বা পুনরাবৃত্তির জন্য মূলত এই ভেতরের লুপটি (inner loop) তার ভেতরের সমস্ত ইটারেশনগুলোকে (iterations) একে একে সম্পন্ন করে। ব্যাপারটিকে ঠিক কোনো ঘড়ির কাঁটার (clock hands) মতো করে দেখতে পারেন: যেখানে মূলত মিনিটের কাঁটার প্রতিটি টিকের (tick) জন্য সেকেন্ডের কাঁটাটি প্রায় ৬০ বার (60 times) পর্যন্ত ঘুরে আসে।
নেস্টেড লুপ (Nested Loops) — নামতা বা মাল্টিপ্লিকেশন টেবিল (Multiplication Table)
1. অফ-বাই-ওয়ান এরর (Off-by-one errors) —
<= বোঝাতে গিয়ে ভুল করে < ব্যবহার করা (অথবা এর ঠিক উল্টোটি)। এটি কি i < 5 (০-৪ পর্যন্ত চলবে বা runs 0-4) নাকি i <= 5 (০-৫ পর্যন্ত চলবে বা runs 0-5) হবে? এটি মূলত এখানকার লুপগুলোর (loop bug) সবথেকে কমন বা সাধারণ একটি ভুল।2. ইনফাইনাইট লুপ বা অসীম লুপ (Infinite loops) — একটি
while লুপের (loop) ভেতরের লুপ ভ্যারিয়েবলটিকে (loop variable) আপডেট (update) করতে ভুলে যাওয়া, অথবা এমন কোনো কন্ডিশন বা শর্ত (condition) লিখে ফেলা যা কখনোই মিথ্যা (false) হওয়ার কোনো সুযোগই নেই। এতে আপনার প্রোগ্রামটি (program) মূলত হ্যাং (hangs) হয়ে যায় বা আটকে থাকে এবং আপনাকে এটি কিল (kill) করতে বা বন্ধ করতে ওই Ctrl+C বোতামে চাপ দিতে হয়।3. do-while সবসময় অন্তত একবার কাজ করে (do-while always runs once) — যদি আপনার লজিকটি (logic) মূলত এর কন্ডিশনটি ফলস বা মিথ্যা (false) হওয়ার কারণে এর বডিটিকে (body) পুরোপুরি এড়িয়ে যাওয়ার বা স্কিপ (skipping) করার দাবি করে, তবে এই
do-while-এর বদলে শুধু while ব্যবহার করুন।