লুপ হলো এমন একটি কন্ট্রোল স্ট্রাকচার, যা একটি নির্দিষ্ট শর্তের ভিত্তিতে কোড বারবার চালানোর সুযোগ দেয়।
While লুপ হলো এমন একটি কন্ট্রোল স্ট্রাকচার, যা একটি নির্দিষ্ট শর্তের ভিত্তিতে কোড বারবার চালানোর সুযোগ দেয়। While লুপের ভেতরের কোড ততক্ষণ চলতে থাকবে, যতক্ষণ শর্তটি ট্রুথি হিসেবে মূল্যায়িত হয়। ইটারেশনের সংখ্যা আগে থেকে জানা না থাকলে While লুপ প্রায়ই ব্যবহার করা হয়, তবে যেখানে লুপ প্রয়োজন সেখানে যেকোনো পরিস্থিতিতেই এটি ব্যবহার করা যায়।
লুপের ভেতরের কোড চালানোর আগেই শর্তটি মূল্যায়ন করা হয়, অর্থাৎ শর্তটি ফলস হলে লুপের ভেতরের কোড কখনোই চালানো হবে না।
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
একটি স্ট্রিংয়ের ওপর ইটারেশন করতে চাইলে আপনি স্ট্রিংটির দৈর্ঘ্যের ওপর লুপ চালাতে পারেন।
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
Until লুপ While লুপের মতোই কাজ করে, তবে পার্থক্য হলো লুপের ভেতরের কোড ততক্ষণ চলতে থাকবে, যতক্ষণ না শর্তটি ট্রুথি হিসেবে মূল্যায়িত হয়।
এটি if আর unless-এর মধ্যকার পার্থক্যের মতোই।
i = 0
until i == 3
puts i
i += 1
end
While লুপের সাথে একটি কমন এরর হলো "ইনফিনিট লুপে" ঢুকে পড়া, যা কখনো শেষ হয় না। শর্তটি কখনোই ট্রুথি বা ফলসি হিসেবে মূল্যায়িত না হলে একটি ইনফিনিট লুপ তৈরি হতে পারে। এটি প্রায়ই প্রোগ্রামারের ভুলের কারণে ঘটে; যেমন, লুপ ভ্যারিয়েবল বাড়াতে ভুলে যাওয়া। কিন্তু কখনো কখনো একটি ইনফিনিট লুপই প্রোগ্রামের লজিক বাস্তবায়নের সবচেয়ে স্পষ্ট উপায়। আবার কখনো চিরকাল লুপ চালানো অপরিহার্য; যেমন একটি HTTP সার্ভার একটি ইনকামিং কানেকশনের জন্য অপেক্ষা করে, সেটি হ্যান্ডেল করে, তারপর পরের কানেকশনের জন্য অপেক্ষা করে।
লুপ থেকে আগেভাগেই বেরিয়ে আসতে break কিওয়ার্ডটি ব্যবহার করা যায়।
নির্দিষ্ট কিছু শর্তে লুপ থেকে আগেভাগে বেরিয়ে আসতে চাইলে এটি সুবিধাজনক হতে পারে।
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
লুপের পরের ইটারেশনে চলে যেতে next কিওয়ার্ডটি ব্যবহার করা যায়।
লুপের নির্দিষ্ট কিছু ইটারেশন বাদ দিতে চাইলে এটি সুবিধাজনক হতে পারে।
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
লুপের ভেতরে ভ্যারিয়েবলের টাইপ ভিন্ন হতে পারে।
নিচের উদাহরণে a-এর টাইপ Int32 | String, কারণ লুপের প্রথম অংশে এটি Int32 বা String হতে পারে।
ভ্যারিয়েবল a কেবল লুপের প্রথম অংশেই Int32 | String টাইপ ধারণ করবে, কারণ লুপ শুরু হওয়ার সময় এটি Int32 ধারণ করে, আর দ্বিতীয় ইটারেশনে এটি একটি String ধারণ করে।
এই মাল্টিপল-টাইপ সিস্টেমটি পরে বিস্তারিতভাবে ব্যাখ্যা করা হবে।
কিন্তু যেহেতু আমরা নিশ্চিত যে লুপের দ্বিতীয় অংশে কেবল String থাকবে, তাই লুপের দ্বিতীয় অংশে a-এর টাইপ String।
রানটাইমে এটি কখনোই একইসাথে Int32 আর String ধারণ করবে না।
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
Crystal-এ একটি মেথডের শেষ এক্সপ্রেশনটি তার মান রিটার্ন করে।
তবে কখনো কখনো শেষ এক্সপ্রেশনের আগেই একটি মান রিটার্ন করা প্রয়োজন হয়।
এজন্য আপনি return কিওয়ার্ডটি ব্যবহার করতে পারেন, যা পরের এক্সপ্রেশনটির মান রিটার্ন করবে।
return কিওয়ার্ডের পরে লেখা কোড আর চালানো হবে না।
def speed_limit(road_number)
if road_number == 1
return 50
puts "This will not be executed"
elsif road_number == 2
return 80
puts "This will not be executed"
end
100
end
p speed_limit(1) # => 50
p speed_limit(2) # => 80
p speed_limit(3) # => 100
একটি মেথডের শেষ এক্সপ্রেশনটিই যদি রিটার্ন করার মান হয়, তবে return কিওয়ার্ডটি বাদ দেওয়া উচিত।
এই অনুশীলনীতে আপনি সঞ্চয়ী হিসাব নিয়ে কাজ করবেন। প্রতি বছর আপনার সঞ্চয়ী হিসাবের ব্যালেন্স তার সুদের হার অনুযায়ী হালনাগাদ করা হয়। আপনার ব্যাংক আপনাকে যে সুদের হার দেয়, তা আপনার হিসাবে থাকা অর্থের পরিমাণের (তার ব্যালেন্সের) উপর নির্ভর করে:
1000 ডলারের কম ধনাত্মক ব্যালেন্সের জন্য 0.5%।1000 ডলারের সমান বা তার বেশি এবং 5000 ডলারের কম ধনাত্মক ব্যালেন্সের জন্য 1.621%।5000 ডলারের সমান বা তার বেশি ধনাত্মক ব্যালেন্সের জন্য 2.475%।আপনার চারটি কাজ আছে, যার প্রত্যেকটিতে আপনার ব্যালেন্স এবং তার সুদের হার নিয়ে কাজ করতে হবে।
SavingsAccount.interest_rate() মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে একটি ব্যালেন্স নেয়।
মেথডটি প্রদত্ত ব্যালেন্সের জন্য সুদের হার রিটার্ন করবে।
SavingsAccount.interest_rate(200.75)
# => 0.5
SavingsAccount.interest() মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে একটি ব্যালেন্স নেয়।
মেথডটি প্রদত্ত ব্যালেন্সের জন্য সুদ রিটার্ন করবে।
SavingsAccount.interest(200.75)
# => 1.00375
SavingsAccount.annual_balance_update() মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে একটি ব্যালেন্স নেয়।
মেথডটি এক বছর পরের ব্যালেন্স রিটার্ন করবে।
SavingsAccount.annual_balance_update(200.75)
# => 201.75375
SavingsAccount.years_before_desired_balance() মেথডটি ইমপ্লিমেন্ট করুন, যা আর্গুমেন্ট হিসেবে একটি ব্যালেন্স এবং একটি লক্ষ্য ব্যালেন্স নেয়।
মেথডটি লক্ষ্য ব্যালেন্সে পৌঁছাতে কত বছর লাগবে সেই সংখ্যা রিটার্ন করবে।
balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
সরল সুদ একটি মূলধনী ব্যালেন্সে প্রয়োগ করার সময়, ব্যালেন্সটি সুদের হার দিয়ে গুণ করা হয় এবং এই দুটির গুণফলই সুদের পরিমাণ।
অন্যদিকে চক্রবৃদ্ধি সুদ নিয়মিত বিরতিতে সুদ প্রয়োগের মাধ্যমে করা হয়। প্রতিবার প্রয়োগের সময় সুদের পরিমাণ গণনা করা হয় এবং মূলধনী ব্যালেন্সের সাথে যোগ করা হয়, যাতে পরবর্তী সুদ গণনাগুলো বড় মূলধনী ব্যালেন্সের উপর হয়ে থাকে।
Exercism-এ সাইন আপ করুন, Crystal ট্র্যাকের 26টি কনসেপ্ট142টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।