Chapter 7: JavaScript Loop-জাভাস্ক্রিপ্ট লুপ
7-1: Loop-এর লুটপাট

পোলাপান নতুন বাইক কিনলে কী করে? কিছু না, জাস্ট শো-অফ করার জন্য বাইকের পিছনে আরও দুইজনকে বসাইয়া ক্যাম্পাসে খালি গোল গোল চক্কর দেয় আর গড়গড় করে সাউন্ড করে। কানের বারোটা বাজায়। যতক্ষণ পর্যন্ত ক্যাম্পাসের সবাই না দেখছে যে— সে নতুন একটা বাইক কিনছে, ততক্ষন পর্যন্ত খালি চক্কর দিতেই থাকে, দিতেই থাকে।
শুধু বাইকের চক্কর না; বরং এমন অনেক চক্র আমরা দেখতে পাই চারপাশে। মাঝেমধ্যে বিজ্ঞানের বইতে এইগুলা শেখানো হয়। যেমন, পানিচক্র। যেখানে সমুদ্রের পানি বাষ্প হয়ে আকাশে উঠে, আবার বৃষ্টি হয়ে নিচে নামে। সেটা আবার গড়িয়ে গড়িয়ে সমুদ্রে যায়। আবার বাষ্প হয়ে ওপরে ওঠে। মেঘ হয়ে আকাশে ভাসে আর বৃষ্টি হয়ে নিচে পড়ে। এইভাবে একই কাজ চক্রাকারে চলতেই থাকে।
এই চক্রাকারে একই কাজ একটানা বারবার করাকে প্রোগ্রামিংয়ের ভাষায় লুপ (Loop) বলে।
তবে লুপ বুঝার আগে একটা অ্যারে লিখলাম। এইটার মধ্যে অনেকগুলা উপাদান আছে।
const numbers = [12, 98, 45, 63, 21, 72];আমি চাইলে ওপরের অ্যারের প্রতিটি এলিমেন্টকে আলাদা আলাদা করে প্রিন্ট করতে পারি। তবে যদি অ্যারের মধ্যে দশ লক্ষ উপাদান থাকে, তাহলে ধরে ধরে সবগুলাকে আলাদা আলাদাভাবে কনসোল লগ করা সম্ভব না। অন্যদিকে লুপ চালিয়ে ফেললে অ্যারের মধ্যে একটা উপাদান থাকুক আর ১ লক্ষ উপাদান থাকুক, সব তিন লাইন কোড দিয়েই আউটপুট হিসেবে দেখতে পারবি।
const numbers = [12, 98, 45, 63, 21, 72];
for (const num of numbers) {
console.log(num);
}এখন তুই বলতে পারিস, এগুলো কী লিখলি? এখানে আমরা একটি লুপ ব্যবহার করছি, এটাকে for of লুপ বলে। for of বলার কারণ হচ্ছে, এইটা লেখার জন্য একদম শুরুতে for লিখছি, আর মাঝখানে এক জায়গায় of লিখছি। তাই এইটার নাম for-of লুপ। এটা নিয়ে আমরা একটু পরে বিস্তারিত আলোচনা করব। তবে, তার আগে এর আউটপুটটা দেখে আসি:
Output: 12;
98;
45;
63;
21;
72;এখন দেখা যাক, for (const num of numbers) { }— এটা আমরা কীভাবে করছি? for মানে হলো "জন্য"। এর পরের const num হচ্ছে একটি নতুন ভেরিয়েবল ডিক্লেয়ার করছি, যেটা for লুপের ভিতরে ব্যবহার করব। তুই চাইলে এই ভেরিয়েবলের নাম যেকোনো কিছু দিতে পারবি। আমরা এখানে নাম হিসেবে num ব্যবহার করছি।
তা ছাড়া আমরা ভেরিয়েবল ডিক্লেয়ার করলেও সেটার মান সেট করিনি। কারণ, এইভাবে লিখলে লুপ যখন অ্যারের বিভিন্ন উপাদানের জন্য বারবার চলবে, তখন জাভাস্ক্রিপ্টই প্রত্যেকবার অ্যারের একটা উপাদান নিয়ে এসে এই ভেরিয়েবলের মান সেট করবে।
তোকে ধরে ধরে বারবার মান সেট করা লাগবে না।
এরপর of, যা সব সময় বসবে এবং শেষে অ্যারের নাম লিখছি। of কেন লিখছি, সেটা বুঝতে হলে of-এর পরে দেখবি আছে একটা অ্যারের নাম। অর্থাৎ of numbers দিয়ে বুঝায়— "numbers-এর"।
সোজা বাংলায় বলতে গেলে, for (const num of numbers) দিয়ে numbers নামক অ্যারেতে যতগুলো উপাদান আছে, তা সবগুলোর একটা একটা করে num নামক ভেরিয়েবলে আলাদা আলাদা করে আসবে। অনেকটা খাবার নেয়ার লাইনে কেউ দাঁড়ালে একজন একজন করে আসবে খাবার নেয়ার জন্য। সেটা চিন্তা করতে পারস।
সেকেন্ড ব্র্যাকেটের ভিতরে যা লেখা আছে, সেটা প্রত্যেকটা উপাদানের জন্য আলাদা আলাদাভাবে একবার একবার করে চলবে। আর আমরা যেহেতু সেকেন্ড ব্র্যাকেটের ভিতরে console.log(num); লিখিছি সেহেতু এক একটা উপাদানের মান এসে num নামক ভেরিয়েবলে সেট হবে এবং console.log লেখার কারণে সেটা console-এ দেখাবে বা আউটপুট হিসেবে দেখাবে।
এখন তুই চাইলে বিভিন্ন উদাহরণের মাধ্যমে প্র্যাকটিস করতে পারবি।
const fruits = ["orange", "apple", "banana", "jackfruit", "watermelon"];
for (const item of fruits) {
console.log(item);
}কয়েকটা জিনিস দিয়ে এই লুপ লেখা প্র্যাকটিস কর। তাহলে তোর জন্য সহজ হয়ে উঠবে। প্র্যাকটিস করা ছাড়া কোনো কিছুই ভালোভাবে শেখা, বুঝা এবং ফীল করা পসিবল না।
JavaScript Loop Practice:
তুই 5টা পছন্দের সাবজেক্টের নাম লেখ। তারপর প্রোগ্রাম লিখে দেখ, কীভাবে লুপ ব্যবহার করে সব সাবজেক্টের নাম আলাদাভাবে প্রিন্ট হবে।
তোর একদম পছন্দের খাবার গুলোর নাম লেখ। এখন লুপ ব্যবহার করে প্রোগ্রাম লিখে দেখ, কীভাবে সব খাবারের নাম আলাদা আলাদা করে প্রিন্ট হবে।
একটা অ্যারের মধ্যে তোর ফ্যামিলি মেম্বারদের জন্মসাল লিখে ফেল। তারপর লুপ চালিয়ে সবার জন্মসাল আউটপুট হিসেবে দেখা।
ক্রিকেট বা ফুটবল খেলায় তোর প্রিয় একাদশের একটা টিম বানিয়ে তোর প্রিয় খেলোয়াড়দের নাম একটা অ্যারের মধ্যে রাখ। তারপর কনসোল লগ করে সব খেলোয়াড়দের নাম আউটপুট হিসেবে দেখবি।
নেক্সট কবে কবে তোর পরীক্ষা আছে, সেই তারিখগুলা অ্যারের মধ্যে লিখে ফেল। তারপর লুপ ব্যবহার করে পরীক্ষার তারিখগুলা কনসোল লগ কর।
7-2: While পাতলা ডাইল
মেসের পাতলা ডাইল কয়েক লেয়ারে থাকে। সবার ওপরে ভাসে হালকা তেল, তারপর বাগাড় দেয়া একটা-দুইটা মাইক্রোস্কপিক সাইজের পেঁয়াজ বা রসুন টুকরা। এরপর চার লেয়ারের পানি। আর সবার তলায় থাকে দুই দানা ডাল। যে ডাল হয়তো কম উচ্চতার ঘন ডাল হতে পারত। সেটাকেই পানি দিয়ে অনেক উচা, লম্বা, বড় পাতিলের পাতলা ডাল বানাই ফেলছে। while লুপও তেমন লুপ জিনিসটাকে মাল্টি লেয়ারে বানাই ফেলে।
মনে করে দেখ, লুপ লেখার সময় for-এর ভিতরে of লিখলে হয় for of লুপ। আর লুপ লিখতে গিয়ে যদি while দিয়ে লিখতে হয়, তখন সেটাকে বলে while লুপ। আর এই while লুপ লিখতে পাঁচটা জিনিস লাগে।
১. প্রথমেই একটা লুপ ভেরিয়েবল ডিক্লেয়ার করতে হবে। এই ভেরিয়েবলের একটা প্রাথমিক মান থাকবে। আর লুপ চলতে চলতে এই ভেরিয়েবলের মান পরিবর্তন হবে। লুপ চালানোর জন্য যে ভেরিয়েবল ডিক্লেয়ার করা হয়, তাকে সাধারণত loop variable বলে।
২. while লিখতে হবে। এরপর প্রথম ব্র্যাকেট ( ) দিতে হবে।
৩. ব্র্যাকেটের ভিতরে একটা শর্ত থাকবে। শর্ত দিয়ে লুপ ভেরিয়েবলের মান চেক করা হয়। যদি শর্ত সত্য হয়, তাহলে লুপ চলতে থাকবে। চলতে চলতে লুপ ভেরিয়েবলের মান চেইঞ্জ হতে থাকবে। আর চেইঞ্জ হতে হতে এক সময় শর্ত মিথ্যা হয়ে যাবে। তখন আর লুপ চলবে না। অর্থাৎ শর্ত সত্য হলে লুপ চলবে, আর শর্ত মিথ্যা হলে লুপ বন্ধ হয়ে যাবে।
৪. লুপের ভিতরে এক বা একাধিক লাইনের কোড। যেটা লুপ যতবার চলবে, ততবার এই কোড চলবে।
৫. লুপের ভিতরে অন্য কোডের পাশাপাশি লুপ ভেরিয়েবলের মান পরিবর্তন করতে হবে। না করলে লুপের শর্ত সব সময় সত্য থেকে যাবে, আর লুপ আজীবন চলতে থাকবে।
এখন যদি আমরা একটা স্ট্রাকচার বা স্টাইল দেখি। এইটা কোড না, কোড লেখার স্টাইল।
Declare a loop variable with an initial value
while(loop condition){
Repetitive tasks
Change the value of the loop variable
}স্ট্রাকচারটা পুরাপুরি বুঝতে পারবি, যদি ফটাফট কয়েকটা উদাহরণ দেখে ফেলস—
তাই প্রথমে let দিয়ে একটি ভেরিয়েবল ডিক্লেয়ার করব। let দিয়ে ভেরিয়েবল ডিক্লেয়ার করার কারণ হচ্ছে, এই ভেরিয়েবলের মান চেইঞ্জ হবে। যদি let দিয়ে ডিক্লেয়ার না করে const দিয়ে ভেরিয়েবল ডিক্লেয়ার করি, তাহলে এই ভেরিয়েবলের মান চেইঞ্জ করা যাবে না। তাই আগেভাগেই let দিয়ে ডিক্লেয়ার করে ফেললাম।
তারপর স্পেশাল কি-ওয়ার্ড while() ব্যবহার করব। এর ভেতরে একটি কন্ডিশন দিবি। যেমন: num < 5 যেটা একটা শর্ত। এই শর্ত দিয়ে বুঝানো হচ্ছে, লুপ এক একবার চলে num ভেরিয়েবলের মান চেক করবে। যদি num ভেরিয়েবলের মান 5-এর কম হয়, তাহলে লুপ চলবে। যদি কখনো 5-এর কম না হয়, অর্থাৎ 5-এর সমান বা বেশি হয়, তখন শর্ত মিথ্যা হয়ে যাবে, আর লুপ বন্ধ হয়ে যাবে।
তারপর সেকেন্ড ব্র্যাকেটের ভিতরে প্রথমে console.log(num); লিখছি। যাতে প্রত্যেকবার লুপ চলে প্রত্যেকবার num ভেরিয়েবলের মান আউটপুট হিসেবে দেখায়। তারপর একটা স্পেশাল লাইন আছে num = num + 1; যেটা দিয়ে num ভেরিয়েবলের মান চেইঞ্জ করা হচ্ছে। এটা আমরা একটু পরে আলোচনা করব।
let num = 0;
while (num < 5) {
console.log(num);
num = num + 1;
}
Output: 0 1 2 3 4এখানে একদম প্রথমে num-এর মান 0 ছিল, তখন while লুপের কন্ডিশনটি num <5 সত্যি ছিল। কারণ, 0 অবশ্যই 5-এর চাইতে ছোট। তাই লুপের ভিতরে ঢুকে num-এর মান প্রিন্ট করল বা console log করে আউটপুট দেখাল। এরপর num = num + 1-এর মাধ্যমে num-এর মান 1 বাড়বে।
কারণ, সমান চিহ্নের ডানপাশে আছে num + 1
এইটার মানে হচ্ছে, num-এর মান আছে 0, আর 0-এর সাথে 1 যোগ করবে। যোগফলটা বের করবে। যোগফল হবে 1। কারণ, 0-এর সাথে 1 যোগ করলে যোগফল হয় 1।
num = num + 1;
num = 0 + 1;
num = 1;অর্থাৎ num = num + 1 দিয়ে num ভেরিয়েবলের মান 1 বাড়বে।
তুই চাইলে num = num + 1-এর পরিবর্তে num += 1 অথবা num++ দিয়েও num-এর মান বাড়াতে পারোস। তিনটাই একই কাজ করে।
এইভাবে লুপ চলতে চলতে লুপের ভিতরে যতবার num = num + 1-এ যাবে, ততবার num-এর মান এক এক করে বাড়বে। লুপ ভেরিয়েবল num-এর মান বাড়ার পর লুপ গিয়ে শর্ত চেক করবে। শর্ত সত্য হলে লুপের ভিতরে যাবে। লুপের ভিতরে যেসব কাজ আছে, সেগুলা করে একসময় num = num + 1 পেয়ে num ভেরিয়েবলের মান এক বাড়াবে। তারপর আবার লুপের শর্তের কাছে গিয়ে চেক করবে।
এইভাবে চলতে চলতে আর লুপ ভেরিয়েবল এর মান বাড়তে বাড়তে এক সময় num এর মান 5 হয়ে যাবে তখন লুপের শর্ত num < 5 এর শর্ত মিথ্যা হয়ে যাবে। তারপর লুপ চলা বন্ধ হয়ে যাবে।
এখন কেউ যদি তোকে বলে, তুই তোর স্কুলের নাম পাঁচবার প্রিন্ট কর, তাহলে তুই খুব সহজেই একটি while লুপ লিখে তা করতে পারবি।
let num = 0;
while (num < 5) {
console.log("Bamboo Eating High School");
num++;
}
Output:
Bamboo Eating High School
Bamboo Eating High School
Bamboo Eating High School
Bamboo Eating High School
Bamboo Eating High Schoolতুই while loop সম্পর্কে একটি প্রাথমিক ধারণা পাইলি। এইবার ফটাফট কয়েকটা সিম্পল সিম্পল সিচুয়েশনে এই জিনিসটা প্র্যাকটিস করে ফেল।
JavaScript While Practice:
while লুপ দিয়ে 10 বার কনসোল লগ কর। আমি প্রতিদিন মিনিমাম 3 ঘণ্টা করে প্রোগ্রামিং প্র্যাকটিস করব।
তুই 1 থেকে 20 পর্যন্ত সংখ্যা লিখবি একটা while লুপ দিয়ে।
while লুপ দিয়ে 50 থেকে 100 পর্যন্ত সংখ্যা প্রিন্ট কর।
একটি while লুপ দিয়ে 1 থেকে 10 পর্যন্ত সংখ্যাগুলো প্রিন্ট করার সময় সংখ্যাগুলাকে 3 দিয়ে গুণ করে ফেলবি। তাহলে কিন্তু 3-এর নামটা হয়ে যাবে।
একটি while লুপ দিয়ে 111 থেকে 110 পর্যন্ত সংখ্যাগুলো প্রিন্ট করার সময় সংখ্যাগুলাকে 2 দিয়ে ভাগ করে ফেলবি।
7-3: While লুপ দিয়ে যোগফল
মানুষ কেন চক্কর চক্কর দৌড় দেয়? হয় দৌড় দিয়ে দিয়ে ভালো করলে তারা দৌড়ের মেডেল জিতবে, না হয় দৌড়াতে দৌড়াতে শরীর ফিট করবে বা অন্য কোনো লাভ হবে। লুপ চালিয়ে এমন আমরা অনেক কিছু লাভ করতে পারি, অনেক কিছু যোগ করতে পারি। সেজন্য প্রথমেই While Loop দিয়ে 1 থেকে 10 পর্যন্ত প্রিন্ট করে ফেল:
let num = 1;
while (num < 10) {
console.log(num);
num++;
}
Output: 1 2 3 4 5 6 7 8 9আগেরবার num = num + 1 লিখছিলি। এবার আমরা num++ দিয়ে লুপ ভেরিয়েবলের মান আপডেট করব। তবে যেভাবেই লুপ ভেরিয়েবলের মান চেইঞ্জ হোক না কেন, হিসাব কিন্তু আগের মতোই। যখন লজিকটি false হবে, তখনই loop থেকে বের হয়ে আসবে।
এখন তুই বলতেই পারিস যে, আমরা তো 1 থেকে 10 পর্যন্ত প্রিন্ট করার কথা ছিল, কিন্তু এখানে 9 পর্যন্ত প্রিন্ট হয়েছে। তাহলে সমস্যা কোথায়? চিন্তা করে দেখ, সমস্যা হলো আমরা num < 10 লিখেছি, যা 10-এর ছোট সংখ্যা পর্যন্ত প্রিন্ট করবে। কিন্তু 10-এর সমান হলে লজিকটি false হয়ে যাবে। তাই, এখানে শুধু num <= 10 চেঞ্জ করলেই আমাদের আউটপুট ঠিক হবে।
let num = 1;
while (num <= 10) {
console.log(num);
num++;
}
Output: 1 2 3 4 5 6 7 8 9 10আমরা অনেকক্ষণ ধরে লুপ চালানো শিখেছি। এখন, যদি তোকে বলা হয় 1 থেকে 10 পর্যন্ত সংখ্যাগুলোর যোগফল বের করতে, তাহলে কীভাবে লুপ কাজে লাগানো যায়?
ঠিক যেভাবে আমরা 1 থেকে 10 পর্যন্ত প্রিন্ট করেছিলাম, এবার সেটিকে যোগফল বের করার জন্য ব্যবহার করব। প্রতিবার প্রিন্ট না করে সংখ্যাগুলোকে একটি ভেরিয়েবলে যোগ করে শেষ পর্যন্ত প্রিন্ট করব। তাহলেই কাজ হয়ে যাবে। তবে সেটা করার আগে একটু ধাপে ধাপে এগুনোর চেষ্টা করি। প্রথমেই একটা বেসিক লুপ লিখে ফেল।
let num = 1;
while (num <= 10) {
console.log(num);
num++;
}এবার কিছু আপডেট করতে হবে। কারণ, আমাদের এখন যোগফল দেখাতে হবে। প্রথমেই আমরা একটি নতুন ভেরিয়েবল ডিক্লেয়ার করব, যার নাম হবে let sum = 0। এরপর লুপের ভিতরে প্রতিবার num ভেরিয়েবলের মান এক এক করে বাড়তে থাকবে, আর সেই মান যোগ করে এই sum ভেরিয়েবলে যোগ করতে থাকবি।
let num = 1;
let sum = 0;
while (num <= 10) {
console.log(num);
sum = sum + num;
num++;
}
console.log("Sum: ", sum);
Output: Sum: 55;এখানে নতুন একটি লাইন যোগ করা হয়েছে— sum = sum + num। এটি কি পরিচিত লাগছে? হ্যাঁ, আমরা sum-এর সাথে num-এর মান যোগ করে sum-এর মধ্যেই স্টোর করছি।
এরপর num++ দিয়ে num-এর মান এক এক করে বাড়ছে। অর্থাৎ প্রত্যেকবার লুপ চলার পর num-এর মান এক এক করে বাড়ে। আর সেটা লুপের ভিতরে এসে sum-এর সাথে যোগ হয়ে sum-এর মান হিসেবে সেট হয়ে যায়।
এরপর লুপের বাইরে গিয়ে আমরা sum-কে console লগ করে ফেলব। এই sum-এর আউটপুট আমরা লুপের ভিতরে দিব না। কারণ, লুপ যতবার চলবে, ততবার sum-এর মান বাড়তে থাকবে। আমরা প্রত্যেক ধাপে ধাপে (অর্থাৎ প্রতিবার যখন লুপ চলবে, তখনই যদি বারবার sum-এর মান পেতে চাই, তাহলে লুপের ভিতরে sum-কে কনসোল লগ করতে পারি। আর যদি আমরা চাই, একেবারে ফাইনাল যে যোগফল হবে, সেটা দেখতে চাই, তাহলে আমরা লুপের বাইরে গিয়ে কনসোল লগ করব।
এইভাবে 10 বার চলার পর num-এর মান বাড়তে বাড়তে এক সময় num-এর মান 11 হয়ে যাবে। আর তখন লুপের শর্ত false হয়ে যাবে এবং লুপ বন্ধ হয়ে যাবে। এভাবে আমরা লুপ চালিয়ে একাধিক সংখ্যার যোগফল বের করতে পারি।
JavaScript While Loop Practice:
while লুপ দিয়ে 50 থেকে 100 পর্যন্ত সংখ্যা প্রিন্ট কর।
while লুপ দিয়ে 5 থেকে 15 পর্যন্ত সংখ্যাগুলোর যোগফল বের কর।
তুই এক স্কুলে 1 থেকে 50 পর্যন্ত ছাত্রদের রোল নম্বর লিস্ট করবি, তারপর একটা while লুপ ব্যবহার করে সেই সংখ্যাগুলোর যোগফল বের কর।
while লুপ ব্যবহার করে 21 থেকে 50 পর্যন্ত সংখ্যাগুলোর যোগফল বের কর এবং প্রতিবারের যোগফল দেখাবি।
20 থেকে 40 পর্যন্ত সংখ্যাগুলোর যোগফল বের কর এবং শুধু ফাইনাল যোগফলটা আউটপুট হিসেবে দেখবি।
7-4: For লুপের খিচুড়ি
কিছু কিছু বিলাসী মানুষ আছে। ভাত রান্না করে, তরকারি রান্না করে, আলাদভাবে ডাল রান্না করে। আমি বলি, এত ক্যাঁচালের কী দরকার। সব যেহেতু একসাথে এক পেটেই যাবে, সব একসাথে রান্না করলে কী এমন ক্ষতি হয়; বরং একসাথে চাল, ডাল, সবজি দিয়ে খিচুড়ি রান্না করে ফেললে রান্নার সময়ও বাঁচে, পাতিল ধোঁয়ার কষ্টও কমে, আবার খাওয়ার সময় আলাদা আলাদা বাটি থেকে তরকারি উঠায় নেয়ার ঝামেলাও কমে।
এইটা বলতেছি, কারণ, একটা খুবই কমন এবং পপুলার লুপ আছে। যেটাকে for লুপ বলে। সেই লুপে এক লাইনের মধ্যেই লুপ ভেরিয়েবল ডিক্লেয়ার করে। শর্ত দিয়ে আবার লুপ ভেরিয়েবলের মান চেইঞ্জও করে। এক লাইনেই বেশির ভাগ কাজ খতম।
তবে এই for লুপের বিষয়টা while লুপের মতোই এবং দুইটা আসলে একই জিনিস। একটু আগে-পরে হলেও সেইম কাজই দুইভাবে করে। অনেকটা তোর লম্বা খালতো ভাইয়ের মতো। সে দাঁড়ায় থাকলে লম্বা লাগে, আর শুয়ে থাকলে পাশ থেকে চ্যাপ্টা লাগে। তবে যেমন লাগুক না কেন, মানুষ কিন্তু একজনই।
সেজন্যই while লুপের মতো for লুপ লিখতেও পাঁচটা জিনিস লাগে।
১. প্রথমেই for লিখবি। কারণ, এইটা for লুপ, তাই for দিয়ে শুরু হবে। তারপর ব্র্যাকেট দিবি।
২. একটা লুপ ভেরিয়েবল ডিক্লেয়ার করবি। এই লুপ ভেরিয়েবলের একটা প্রাথমিক মান থাকবে। আর এই লুপ ভেরিয়েবলের মান চেইঞ্জ হবে। ভেরিয়েবল ডিক্লেয়ারের সাথে সাথে সেমিকোলন দিবি।
৩. লুপের শর্ত লিখ। শর্ত লেখার পর সেমিকোলন দিবে। লুপের শর্ত সত্য হলে লুপ চলবে, আর মিথ্যা হলে লুপ শেষ হয়ে যাবে।
৪. লুপ ভেরিয়েবলের মান পরিবর্তন করবি।
৫. এরপর সেকেন্ড ব্র্যাকেট দিয়ে লুপের ভিতরে যে যে কাজ বারবার রিপিট করবে, সেই এক বা একাধিক লাইনের কোড লিখবি।
এখন ঠান্ডা মাথায় for লুপের স্ট্রাকচারটা যদি দেখস, সেটা এই রকম
for (declare loop variable; loop condition ; change loop variable){
One or more lines of code that will be repeated
}টেকনিক্যালি, while লুপ আর for লুপ, এই দুইটা loop-এর মধ্যে কোনো পার্থক্য নেই, শুধু syntax বা লেখার সিস্টেম ছাড়া দুইটা loop-এর কাজ একই।
এইবার কয়েকটা উদাহরণ দেখলেই সব রসগোল্লার মতো টসটসে রসালো মিষ্টি হয়ে যাবে
for(let num = 0; num < 5; num++) {
console.log(num);
}
Output: 0 1 2 3 4আবার ঠিক আগের মতোই । 1 থেকে 10 পর্যন্ত প্রিন্ট করতে চাইলে নিচের মতো করে লিখবি।
for(let i = 1; i < 10; i++) {
console.log(i);
}
Output: 1 2 3 4 5 6 7 8 9
50 থেকে 100 পর্যন্ত
for(let i = 50; i <= 100; i++) {
console.log(i);
}
Output: 50 51 52 53 —----- 100এইবার for loop দিয়ে 11 থেকে 20 পর্যন্ত সংখ্যাগুলোর যোগফল বের কর।
let sum = 0;
for(let i = 11; i <= 20; i++) {
sum = sum + i;
}
console.log('Sum of numbers 11 to 20 is: ', sum);
Output: Sum of numbers 11 to 20 is: 155একটা জিনিস খেয়াল করবি— যদি লুপ চালিয়ে প্রতিটা উপাদানকে আউটপুট হিসেবে দেখাতে হয়, তাহলে লুপের ভিতরে, সেকেন্ড ব্র্যাকেটের ভিতরে আমরা console log লিখি। যাতে লুপ যতবার চলে, ততবার আউটপুট দেয়। আবার কিছু কিছু ক্ষেত্রে লুপের প্রতিটা উপাদান আউটপুট হিসেবে দরকার নাই; বরং লুপ চালিয়ে সবগুলা উপাদান দিয়ে কিছু একটা ফাইনাল আউটপুট পেতে চাই। সেটা হতে পারে সবগুলার যোগফল বা অন্য কিছু। তাহলে লুপের সেকেন্ড ব্র্যাকেটের ভিতরে না; বরং সেকেন্ড ব্র্যাকেটের বাইরে গিয়ে লুপ শেষ হওয়ার পর সেটাকে console log করি।
বিষয়টা সিম্পল। তবে একটু খেয়াল করার দরকার আছে কিন্তু।
JavaScript For Loop Practice:
For লুপ দিয়ে 150 থেকে 170 পর্যন্ত সংখ্যা প্রিন্ট কর।
তুই এক স্কুলে 31 থেকে 58 পর্যন্ত ছাত্রদের রোল নম্বর লিস্ট করবি, তারপর একটা for লুপ ব্যবহার করে সেই সংখ্যাগুলোর যোগফল বের কর।
For লুপ দিয়ে 25 থেকে 75 পর্যন্ত সংখ্যাগুলোর যোগফল বের কর এবং যোগফল শেষে প্রিন্ট কর।
7-5: জোড়-বিজোড় লুপের শর্ত
ক্যাম্পাসের যেদিকে যাবি, দেখবি কাপল আর কাপল। জোড়ায় জোড়ায় তারা ক্লাসে যায়। জোড়ায় জোড়ায় লাইব্রেরিতে যায়। জোড়ায় জোড়ায় ক্যান্টিনে যায়। জোড়ায় জোড়ায় বাথরুমে যায়। অন্তত একজন বাথরুমে গেলে আরেকজন বাথরুমের সামনে গার্ড হিসেবে দাঁড়িয়ে থাকে। তবে সেই সময় যে বাইরে দাঁড়িয়ে থাকে, তাকে সিঙ্গেল বা বিজোড় ভেবে প্রপোজ করে বসিস না আবার। একটু পরে দেখবি, বাথরুমের দরজা খুলে আরেকজন এসে ঠিকই বিজোড়কে জোড় বানিয়ে ফেলছে।
সংখ্যার ক্ষেত্রেও জোড়-বিজোড় সংখ্যা আছে
জোড়সংখ্যা, যেমন— 2, 4, 6, 8, 10, 12, 14, 16...
আবার বিজোড়সংখ্যা, যেমন— 1, 3, 5, 7, 9...
কিন্তু কোনটা জোড় আর কোনটা বিজোড় সংখ্যা, সেটা কীভাবে বুঝবি? বুঝার সিম্পল সিস্টেম আছে। জাস্ট কোনো সংখ্যাকে 2 দিয়ে ভাগ করলে ভাগশেষ 0 হয়, তখন সেই সংখ্যাটি জোড় সংখ্যা এবং যখন কোনো সংখ্যাকে 2 দিয়ে ভাগ করার পরে ভাগশেষ 1 থাকে, তখন সেই সংখ্যাকে আমরা বিজোড় সংখ্যা বলি।
এখন জোড়সংখ্যার জন্য যদি আমরা কোড লিখি। একটা লুপের ভিতরে
for (let i = 0; i < 20; i++) {
if (i % 2 == 0) {
console.log(i);
}
}
Output: 0 2 4 6 8 10 12 14 16 18এই কোডটি শুধু জোড় সংখ্যাগুলো প্রিন্ট করে দেখাচ্ছে।
আবার, যদি বিজোড় সংখ্যার জন্য আমরা কোড লিখি:
for (let i = 0; i < 20; i++) {
if (i % 2 == 1) {
console.log(i);
}
}
Output: 1 3 5 7 9 11 13 15 17 19এই কোডটি আমাদের বিজোড় সংখ্যাগুলো প্রিন্ট করবে। তুই চাইলে if-এর কন্ডিশন এভাবেও লিখতে পারিস— i % 2 != 0। "Not equal" সম্পর্কে আমরা অনেক আগেই জেনেছি। চাইলে তুই এই লজিকটাও ব্যবহার করে বিজোড় সংখ্যা প্রিন্ট করতে পারবি।
ওপরের কোড দুটিতে আমরা 0 থেকে 20-এর আগ পর্যন্ত যতগুলো জোড় ও বিজোড় সংখ্যা রয়েছে, তা প্রিন্ট করেছি।
এই ঠিক একই কাজ আমরা চাইলে কন্ডিশন ছাড়াও করতে পারি। সেটা কীভাবে? শুধুমাত্র আমাদের for লুপের, লুপ ভেরিয়েবল চেইঞ্জ করার যে পার্ট রয়েছে, সেখানে একটু পরিবর্তন করে:
সাধারণত i++ দিয়ে লুপ চলার সময় i-এর মান এক এক করে বাড়ানো হয়। তবে লুপ চলার সময় i-এর মান 2 করে বাড়াতে চাইলে i++ এর জায়গায় i = i + 2 বা i += 2 লিখলে লুপ যতবার চলবে, ততবার i-এর মান 2 করে বাড়বে।
for (let i = 1; i < 20; i = i + 2) {
console.log(i);
}
Output: 1 3 5 7 9 11 13 15 17 19প্রথমে আমাদের লুপ ভেরিয়েবলের মান ছিল i = 1 এবং যখন একটি লুপ কমপ্লিট হলো, এই লুপ ভেরিয়েবলের সাথে অর্থাৎ i = i + 2 হয়েছে। মানে 1 + 2 = 3;-এর পর ভেরিয়েবলের মান 3 হয়েছে, যা কি না একটা বিজোড়সংখ্যা।
আবার 3 + 2 = 5
আবার 5 + 2 = 7
...
এভাবে করে প্রতিবারই 2 যোগ করার মাধ্যমে আমরা একটার পর একটা বিজোড় সংখ্যা পেতে পারি।
একইভাবে তুই চাইলে 2 থেকে শুরু করে 20 পর্যন্ত সবগুলা জোড়সংখ্যাও পেতে পারস।
for (let i = 2; i < 20; i = i + 2) {
console.log(i);
}
Output: 2 4 6 8 10 12 14 16 18তুই খেয়াল করলে দেখবি, এখানে 20 পর্যন্ত আউটপুট দেখায়নি, 18-তে শেষ। কারণ, for লুপের মাঝখানে শর্ত আছে 20-এর কম। তাই 20 যখন গেছে, তখন শর্ত মিথ্যা হয়ে গেছে, আর লুপ সাথে সাথে বন্ধ হয়ে গেছে। তুই যদি 20 হলেও লুপটা চালাতে চাস, তাহলে শর্তটা হালকা একটু মোডিফাই করে দে।
for (let i = 2; i <= 20; i = i + 2) {
console.log(i);
}
Output: 2 4 6 8 10 12 14 16 18 20ভাজতে ভাজতে বিভাজ্য
তোকে একটা প্রবলেম দেয়া হলো— এক থেকে ত্রিশ পর্যন্ত এমন সংখ্যাগুলো প্রিন্ট করতে হবে, যা 5 দিয়ে বিভাজ্য। তাহলে তুই সেটা কীভাবে করবি?
প্রবলেমটা খুবই সহজ। তুই একটু নিজে থেকে চিন্তা করলেই অ্যান্সার দিতে পারবি।
না পারলে যে খুব একটা প্রবলেম হবে, তা নয়। আমরা একই জিনিস ঘুরিয়ে-ফিরিয়ে বারবার প্র্যাকটিস করব, যার মাধ্যমে আমাদের কাছেও এইসব প্রবলেমগুলো ডাল-ভাতের মতো সহজ মনে হবে।
প্রথমেই 1 থেকে 30 পর্যন্ত একটি লুপ চালা:
for (let i = 1; i <= 30; i++) {}এখন তোকে এমন একটা কন্ডিশন দিতে হবে, যেটার মাধ্যমে শুধু ওই সংখ্যাগুলো থাকবে, যেগুলো 5 দিয়ে বিভাজ্য। একটু চিন্তা করে দেখ, এরকমটা আমরা আগে কোথাও করেছি কি না। হ্যাঁ, করেছি। কীভাবে?
i % 2 == 0 কন্ডিশনটা তোর চেনা চেনা লাগছে কি না? দেখ তো!
হ্যাঁ, ঠিক এভাবেই 2 দিয়ে বিভাজ্য কি না অর্থাৎ 2 দিয়ে ভাগ যাচ্ছে কি না, সেটা চেক করছি। সো, সেটা যদি করতে পারস, তাহলে 5 দিয়ে ভাগ যাচ্ছে কি না, সেটা বের করতে পারবি না? অবশ্যই পারবি। জাস্ট 2-এর জায়গায় 5 বসিয়ে i % 5 == 0 করে ফেল। তারপর এইটাকে একটা if-এর শর্ত হিসেবে ইউজ করে তার ভিতরে কনসোল লগ করে ফেল।
for (let i = 1; i <= 30; i++) {
if (i % 5 == 0) {
console.log(i);
}
}
Output: 5 10 15 20 25 30কোডটা খুব মজার ছিল, তাই না?
এখন যদি তোকে একটু ব্যতিক্রমভাবে বলি যে, 1 থেকে 30 পর্যন্ত এমন সংখ্যাগুলো প্রিন্ট কর, যা 3 দিয়ে বিভাজ্য। আশা করি এটা তুই খুব সহজেই করে ফেলবি।
for (let i = 1; i <= 30; i++) {
if (i % 3 == 0) {
console.log(i);
}
}
Output: 3 6 9 12 15 18 21 24 27 30আবার ধর, 1 থেকে 30 পর্যন্ত এমন সংখ্যাগুলো প্রিন্ট কর, যা 3 অথবা 5 দিয়ে বিভাজ্য।
সেটা তুই একসাথে কীভাবে করবি? খুবই সহজ:
for (let i = 1; i <= 30; i++) {
if (i % 5 == 0 || i % 3 == 0) {
console.log(i);
}
}
Output: 3 5 6 9 10 12 15 18 …… 30এখানে আমরা OR (||) অপারেটরটি ব্যবহার করেছি, যেটা আমরা অনেক আগেই শিখেছি।
এখন যদি তোকে বলা হয়, 3 এবং 5 উভয় দিয়ে বিভাজ্য সংখ্যাগুলো প্রিন্ট কর, তাহলে কি করতে পারবি?
খুবই সহজ। শুধু OR অপারেটরের জায়গায় AND(&&) অপারেটর ব্যবহার করতে হবে:
for (let i = 1; i <= 30; i++) {
if (i % 5 == 0 && i % 3 == 0) {
console.log(i);
}
}
Output: 15 30কি, বিষয়গুলো সহজ না?
এখন যদি তোকে নতুন একটা প্রবলেম সলভ করতে বলি, তুই কি সেটা পারবি? আশা করি তুই পারবি।
JavaScript Loop Condition Practice:
তোর কাজ হবে 20 থেকে 50 পর্যন্ত যে সকল সংখ্যা 7 দিয়ে বিভাজ্য, তা আউটপুট হিসেবে দেখা।
এইবার 40 থেকে 80 পর্যন্ত যে সকল সংখ্যা 5 দিয়ে এবং 7 দিয়ে বিভাজ্য, তা আউটপুট হিসেবে দেখা।
এখন তোর প্রবলেম হলো 1 থেকে 40 পর্যন্ত যে সকল সংখ্যা 13 দিয়ে বিভাজ্য, তাদের যোগফল কর।
For লুপ দিয়ে 1 থেকে 50 পর্যন্ত লুপ চালাবি। তবে লুপ চালানোর সময় লুপ ভেরিয়েবলের মান প্রত্যেকবার 4 করে বাড়াবি।
0 থেকে 100 পর্যন্ত সব সংখ্যাগুলো প্রিন্ট কর, যা 9 এবং 6 দিয়ে বিভাজ্য।
1 থেকে 50 পর্যন্ত এমন সংখ্যাগুলো প্রিন্ট কর, যা 3 এবং 4 উভয়ের দ্বারা বিভাজ্য এবং সংখ্যাগুলোর যোগফল বের কর।
7-6: লুপের break-আপ
লাইফে সব সময় যে উড়ে উড়ে লাফাতে লাফাতে চলতে হবে, তা কিন্তু না; মাঝেমধ্যে থেমেও যেতে হয়, ব্রেক নিতে হয়, রেস্ট নিতে হয়। গাড়ি চালানোর সময়ও গাড়ি আজীবন চলে না, থামাতে হয়। এভাবেই বিভিন্ন জায়গায় আমাদের থামতে হয়; প্রোগ্রামিংয়েও এর ব্যতিক্রম নয়।
যেমন, আমরা যদি কোনো লুপ লিখি, যা 0 থেকে 15 পর্যন্ত চলে এবং প্রতিবার 0 থেকে 15-এর আগ পর্যন্ত সংখ্যাগুলো প্রিন্ট করে, সেটা তুই অলরেডি জানস।
for (let i = 0; i < 15; i++) {
console.log(i);
}এখন ধর, এমন একটা প্রয়োজন পড়ল, যেখানে লুপ ভেরিয়েবলটা 7-এর থেকে বড় হওয়ার পর ডাইরেক্ট ব্রেক হবে। এ ক্ষেত্রে break মারবি। জাস্ট একটা কন্ডিশন সেট করবি। কন্ডিশন বা শর্ত সত্য হলেই শর্তের ভিতরে ঢুকে break হয়ে লুপটি থেমে যাবে:
for(let i = 0; i < 15; i++) {
console.log(i);
if(i > 7) {
break;
}
}
Output: 0 1 2 3 4 5 6 7 8তুই বলতে পারস, 7 গেলে ব্রেক মারার কথা। 8 পর্যন্ত আউটপুট কেন দেখাচ্ছে? এইটার লজিক কিন্তু আছে। লজিক ছাড়া কোড কখনোই কাজ করে না এবং আরেকটু শক্তভাবে বললে, কোড কখনো ভুল করে না। যে কোড করে, সে ভুল করে বা ভুল বুঝে।
ওপরে সেই কাজটাই হয়েছে। কারণ ওপরের কোডে লেখা আছে if( i > 7) অর্থাৎ i-এর মান 7-এর বড় হলে অর্থাৎ 8 হলে ব্রেক হবে। সেজন্য ওপরে 8 আউটপুট হিসেবে দেখাইছে তারপর সেটা if( i > 7)-এর শর্ত সত্য হইছে। এরপর শর্তের ভিতরে গিয়ে লুপ ব্রেক করছে। তুই যদি চাস একজাক্টলি 7-এ গিয়ে ব্রেক করবে, তাহলে শর্ত একটু মোডিফাই করে দে। জাস্ট if( i > 7)-এর জায়গায় if( i >= 7) করে দে। তাহলে i-এর মান 7-এর সমান হওয়ার সাথে সাথে শর্ত সত্য হয়ে যাবে। আর শর্তের ভিতরে গিয়ে লুপ ব্রেক মেরে দিবে।
for(let i = 0; i < 15; i++) {
console.log(i);
if(i >= 7) {
break;
}
}
Output: 0 1 2 3 4 5 6 7এভাবে break আমাদের লুপ থামানোর জন্য ব্যবহার হয়। ব্রেকের কাছাকাছি আরেকটা জিনিস আছে। সেটার জন্য–
মাঝেমধ্যে দেখবি এক্সপ্রেস ট্রেন আছে। সেই ট্রেন সব স্টেশনে থামে না; বরং কিছু কিছু স্টেশন স্কিপ করে। আবার অনেক স্পেশাল দূরপাল্লার বাসও আছে, সব স্টেশনে থামে না; বরং স্কিপ করে। এই স্কিপ করার জন্য জাভাস্ক্রিপ্টে একটা স্পেশাল continue কী-ওয়ার্ড আছে। যদি কোনো নির্দিষ্ট সংখ্যা স্কিপ করতে হয়, তবে আমরা continue ব্যবহার করতে পারি। ধর, তুই 1 থেকে 10 পর্যন্ত প্রিন্ট করতে চাস, কিন্তু 6 সংখ্যাটি বাদ দিতে চাস:
for(let i = 1; i <= 10; i++) {
if(i == 6) {
continue;
}
console.log(i);
}
Output: 0 1 2 3 4 5 7 8 9 10এই কোডে 6 সংখ্যাটি স্কিপ হবে। একইভাবে আমরা জোড়সংখ্যা স্কিপ করতে চাইলে নিচের মতো করে কন্ডিশন দিয়ে তার ভিতরে continue কি-ওয়ার্ড বসিয়ে দিবি। তাহলে সে জোড়সংখ্যা আউটপুট হিসেবে দেখাবে না:
for(let i = 1; i < 10; i++) {
if(i % 2 == 0) {
continue;
}
console.log(i);
}
Output: 1 3 5 7 9এখানে সব জোড়সংখ্যা আউটপুট হবে। আবার বিজোড়সংখ্যা স্কিপ করতে চাইলে কন্ডিশন চেঞ্জ করলেই হবে:
for(let i = 1; i < 10; i++) {
if(i % 2 == 1) {
continue;
}
console.log(i);
}
Output: 2 4 6 8খেয়াল করলে দেখবি, আমরা continue-এর পরে console log লিখেছি। কারণ, continue হলে লুপের ভিতরে সেইবার চলার সময় বাকি যেসব কোড আছে, সেগুলা চলবে না। অর্থাৎ স্কিপ করবে। আর এই কন্টিনিউ কি-ওয়ার্ডের আগে যদি কনসোল লগ থাকে, তাহলে সেগুলা স্কিপ করার আগেই কাজ করে ফেলবে। তাই কন্টিনিউ বা স্কিপ করলে যে যে কোডের আউটপুট স্কিপ করতে হবে, সেগুলা continiue-এর শর্তের পরে লিখতে হবে। যাতে স্কিপ করলে সেগুলা স্কিপ হয়ে যায়।
JavaScript Break and Continue Statement Practice:
ধর, তুই 1 থেকে 30 পর্যন্ত সংখ্যা প্রিন্ট করতে চাস, কিন্তু তোর ইচ্ছা হলো, 15-এর পরে প্রিন্ট করা বন্ধ হবে, থেমে যাবে।
তুই 1 থেকে 40 পর্যন্ত সংখ্যা প্রিন্ট করতে চাস, কিন্তু এমনভাবে, যেন 7 দিয়ে বিভাজ্য সংখ্যাগুলো বাদ যায়। যেমন- 7, 14, 21, ইত্যাদি বাদ যাবে। একটা প্রোগ্রাম লিখ, যেখানে এই সংখ্যাগুলো স্কিপ হবে।
তুই 1 থেকে 15 পর্যন্ত সংখ্যা প্রিন্ট করতে চাস, কিন্তু 9 বাদে। একটা প্রোগ্রাম লিখ, যেখানে 9 স্কিপ হয়ে যাবে আর বাকিসব সংখ্যা প্রিন্ট হবে।
1 থেকে 20 পর্যন্ত সংখ্যা প্রিন্ট কর, কিন্তু 12 বাদে। 12 স্কিপ হয়ে যাবে এবং বাকিসব সংখ্যা প্রিন্ট হবে।
1 থেকে 25 পর্যন্ত সংখ্যা প্রিন্ট কর, কিন্তু 3 দিয়ে বিভাজ্য সংখ্যা বাদ যাবে।
91 থেকে 120 পর্যন্ত সংখ্যা প্রিন্ট কর, কিন্তু 10 দিয়ে ভাগ যায়, এমন সংখ্যা পেলে প্রিন্ট করা বন্ধ হয়ে যাবে, থেমে যাবে।
