৯) কন্ডিশন

আমরা এতোক্ষণ যা যা কোড করেছি সেখানে সব কিছুই ছিল sequential, অর্থাৎ, আমরা ম্যাথমেটিকায় কাজের একটা ক্রম দিয়ে দিয়েছিলাম, সে একটার পর একটা করেছে, কোনোটা বাদ দেয় নি। কিন্তু প্রোগ্রামিং এ মাঝেমধ্যেই আমাদের কিছু শর্তসাপেক্ষ কাজ করতে হয়। যেমন: দুইটা ভ্যারিয়েবলের মান সমান হলে আমরা নির্দিষ্ট কিছু কাজ করবো, অসমান হলে অন্য কাজ করবো। তখন আমাদের একমুখী প্রোগ্রাম থেকে কিছু "শাখা" বের হয় যা পুনরায় একত্র হয়ে আবার একমুখী প্রোগ্রামে কনভার্ট হয়ে যায়।

ম্যাথম্যাটিকায় কন্ডিশন বা শর্ত হ্যান্ডেল করে If কমান্ড। ইফ এর মধ্যে একটা কন্ডিশন বা শর্ত দেওয়া থাকে, এবং সেই শর্ত সত্যি বা মিথ্যা হওয়া সাপেক্ষে ম্যাথম্যাটিকাকে দিয়ে কিছু কাজ করানো হয়। এই কন্ডিশন হয় True হবে, অথবা False. এর বাইরে কিছু হতে পারবে না। If[] এর structure অনেকটা এরকম:

এই কন্ডিশন হয় True হবে, অথবা False। এর বাইরে কিছু হতে পারবে না। কন্ডিশন অংশটুকু আসলে একটি তুলনা ছাড়া কিছুই না। আমরা সাধারণত কোনো একটা মানকে অন্য একটা মানের সাথে তুলনা করি, এবং সেই তুলনা থেকে একটা সিদ্ধান্তে আসি। If[] এর মধ্যে আমরা সাধারণত আমাদের প্রোগ্রামের একটা নির্দিষ্ট অংশ থেকে প্রাপ্ত কোনো রেজাল্টকে অন্য একটা মানের সাথে তুলনা করি। এই তুলনা করতে আমরা কিছু অপারেটর ব্যবহার করি : a < b a কি b এর চেয়ে ছোট কিনা a > b a কি b এর চেয়ে বড় কিনা a == b a কি b এর সমান কিনা

আমরা যদি 7 > 5 লিখে রান করি তাহলে আমরা দেখতে পারবো আউটপুট এ True দেখাচ্ছে। কারণ ৭ তো ৫ এর চেয়ে বড়ই, ফলে 7>5 এই তুলনা টাও সঠিক। তাই আমরা True দেখতেছি। আবার, 9 > 59 দেই তাহলে আমরা False দেখবো। কেননা 9 59 এর চেয়ে ছোট। তাই আমরা যে বললাম 9 is less than 59 এই কথাটা তো সঠিক না, বরং মিথ্যা। তাই false দেখাইছে।

আমরা যদি দুইটা বস্তু সমান কিনা চেক করতে চাই তাহলে কিন্তু আমরা শুধু একটা সমান চিহ্ন = দিতে পারবো না। কারণ একটা সমান চিহ্ন দিয়ে আমরা ভ্যারিয়েবলে ভ্যালু এ্যাসাইন করি। তাই সমান কিনা তুলনা করার জন্য ম্যাথম্যাটিকাতে দুইটা সমান চিহ্ন == পরপর দিতে হয়। 5 == 5 স্বাভাবিকভাবেই True দেখাবে, কারণ ৫ তো ৫ এর সমানই। আবার 5 == 6 এ ৫ যেহেতু ৬ এর সমান না তাই এটা False দেখাবে।

আরও ৩টা অপারেটর আছে: <= >= != প্রথম দুইটা এবং এর কাজ করে। ৩য় টা হলো != অসমান চিহ্ন। এটা তখনই সত্য হবে যখন দুই পক্ষ পরস্পর অসমান হয়। যেমন: 5!=6 True দেখাবে। কারণ ৫ তো ৬ এর মান সমান না। 10!=10 False দেখাবে। কারণ ১০ যে ১০ এর সমান না, এই ব্যাপারটা তো মিথ্যাই।

এতোক্ষণ আমরা বিভিন্ন ধরনের রিলেশনাল অপারেটর দেখলাম, এখন সরাসরি If এর কয়েকটা উদাহরণ দেখি। If এর একটি জনপ্রিয় উদাহরণ হলো একটা সংখ্যা ধনাত্মক নাকি ঋণাত্মক সেটা নির্ণয় করা। এর জন্য আমরা লিখবো num = 10; If[ num < 0, Print["negative"], Print["positive"] ]

কোড টা চালানোর আগে আমরা দেখি এটা দিয়ে কি বুঝানো হচ্ছে। প্রথমে আমরা If এর মধ্যে ঢুকলাম এবং প্রথমেই জিজ্ঞেস করতেছি যে num টা কি জিরো এর চেয়ে ছোট? যদি ছোট হয়, অর্থাৎ, num<0 স্টেটমেন্ট টা যদি True হয়, তাহলে কমার ঠিক পরের অংশটুকু রান হবে। মানে নেগেটিভ লেখা টা আউটপুট এ দেখাবে। আর যদি সংখ্যাটা জিরোর চেয়ে ছোট না হয়ে সমান বা বড় হয় তাহলে num<0 স্টেটমেন্টটা False হয়ে যাবে, তখন ২য় কমার পরের অংশ টুকু রান হবে, অর্থাৎ, পজিটিভ দেখাবে।

এখানে লক্ষণীয় বিষয় হচ্ছে, If এর মধ্যের কন্ডিশন সত্যি হলে ১ম কমার পর থেকে ২য় কমার আগ পর্যন্ত অংশ টুকু রান হবে, ২য় কমার পরের অংশ কিন্তু রান হবে না। আবার False হলে শুধু ২য় কমার পরের ইংশ রান হবে।তার আগের টুকু রান হবে না।

আবার আমরা চাইলে কন্ডিশন এর পরে শুধু একটা অংশও রাখতে পারি। যেমন: If[ 5==5, Print["it's five"] ] এখানে কন্ডিশন টা সত্য জন্য it's five দেখাবে। If[ 5!=5, Print["it’s not five"] ] এখানে কিছুই দেখাবে না, কারণ কন্ডিশনটা মিথ্যা এবং মিথ্যা হলে কী করতে হবে সেটা বলা নাই।

circle-info

ছোট্ট একটা বিষয়, == এর দুই পাশের মান যখন সমান হয় তখনই কেবল পুরা ব্যাপারটা সত্যি হয়। তাই, 5 == 5 যেমন সত্য তেমনি True == True ও সত্য। আবার False == False ও কিন্তু সত্য।

Mod[]

ম্যাথম্যাটিকায় ভাগশেষ নির্ণয়ের একটা ফাংশন আছে। এর নাম Mod[] । Mod এ দুইটা সংখ্যা দেওয়া হয়। ১ম সংখ্যাটাকে, ২য় সংখ্যা দ্বারা ভাগ করলে যে ভাগশেষ পাওয়া, মড সেটা বের করে আমাদেরকে দেয়। যেমন আমরা যদি Mod[22, 4] দেই তাহলে ২ পাবো, কারণ ২২ কে ৪ দিয়ে ভাগ করলে ভাগশেষ ২ হয়।

তো আমরা যদি দেখতে চাই একটা সংখ্যা জোড় নাকি বিজোড় তাহলে আমরা চেক করবো সংখ্যাটাকে ২ দিয়ে ভাগ করলে ভাগশেষ টা কী। যদি ভাগশেষ হয় তাহলে জোড়। আর হলে বিজোড়। ম্যাথম্যাটিকা তে এর প্রোগ্রাম হবে

num = 10 এখানে

আমরা এর আগে বুলিয়ান এ্যালজেবরা পড়েছিলাম। সেখানে আমরা দেখেছি দুইটা ম্যাথম্যাটিকাল স্টেটমেন্ট কে একসাথে যুক্ত করে একটা কম্বাইন্ড রেজাল্ট পাওয়া যায়। এই যুক্ত করার কাজটা করা হতো conjunction (∧) আর disjunction (∨) দিয়ে। যেমন, P ∨ Q এর ট্রুথ টেবল দেখলে আমরা দেখবো যখন অন্তত একটা অংশ যদি সত্য হয় তখনই পুরা P ∨ Q সত্য হয়ে যায়। কেবল মাত্র দুইটা একই সাথে মিথ্যা হলে এ অর বি মিথ্যা হয়ে যায়। আবার P ∧ Q এর ক্ষেত্রে যখন P Q একই সাথে সত্য হয়, তখন পুরা P ∧ Q সত্য হয়। অন্যথায় মিথ্যা।

এরকম আমরা ম্যাথম্যাটিকাতেও শর্ত কম্বাইন করতে পারি। যেমন, আমরা যদি দেখতে চাই একটা সংখ্যা কোনো একটা ইন্টারভাল এ আছে কিনা তাহলে আমাদেরকে দেখতে হবে সংখ্যাটা ঐ ইন্টারভাল এর lower লিমিট এর সমান বা বড় কিনা এবং একই সাথে upper লিমিট এর ছোট বা সমান কিনা। ব্যাপারটা অনেকটা এরকম: ইন্টারভাল যদি [5,10] হয়। এবং আমাদের সংখ্যাটা n হয় তাহলে আমরা চেক করবো: ( n >= 5) and (n <= 10) পুরা কন্ডিশন টা সত্য হবে যদি && এর দুই পাশ একই সাথে সত্য হয়। ম্যাথম্যাটিকা তে or বা disjunction (∨) লিখে || এভাবে আর and বা conjunction (∧) লিখে && এভাবে।

কী-বোর্ডে & এবং | এর অবস্থান
একটি সংখ্যা কোনো ইনটারভালে আছে কিনা তার কোড

বুলিয়ান এ্যালজেবরা তে আরেকটা অপারেটর ছিল, Not (negation ¬) , যা কিনা একটা ট্রুথ ভ্যালু কে উল্টা করে দিতো, মানে True হয়ে যেত False, False হয়ে যেত True। ম্যাথমেটিকায় সেই not কে বোঝানো হয় বিস্ময়সূচক চিহ্ন ! দ্বারা। !True যদি আমরা রান করি, তাহলে আউটপুট দেখবো False । আবার !False হয়ে যাবে True

use of not

Nested If

আমরা চাইলে, লিস্ট যেভাবে নেস্টিং করে ছিলাম, সেভাবে If-ও নেস্টিং করতে পারি, অর্থাৎ একটা If এর মধ্যে আরেকটা If, তার মধ্যে আরেকটা ...।

একটা সাল লিপ ইয়ার কিনা আমরা কি সেটা বের করতে পারি? হয়তো মনে হচ্ছে এ আর এমন কঠিন কী কাজ, ৪ দ্বারা নিঃশেষে বিভাজ্য হলে লিপ ইয়ার, না হলে লিপ ইয়ার না। এমন যদি ভেবে থাকি, তাহলে আমাদের জানায় একটু ভুল আছে। আসলে 1800,1900,2100,2200 এগুলা সব ৪দ্বারা বিভাজ্য হলেও কিন্তু লিপ ইয়ার না। আবার ১৬০০,২০০০,২৪০০ লিপ ইয়ার। অর্থাৎ, কোনো সাল যদি ১০০ এর গুণিতক হয়, তাহলে আমরা চট করে বলে দিতে পারবো না যে সাল টা লিপ ইয়ার, তখন আমাদের দেখতে হবে সালটা একই সাথে ৪০০ দ্বারা নিঃশেষ এ বিভাজ্য কিনা। যদি ৪০০ দ্বারাও নিঃশেষ এ বিভাজ্য হয় তাহলে লিপ ইয়ার হবে, অন্যথায় হবে না। তো লিপ ইয়ার বের করার একটা সহজ এ্যালগোরিদম হবে এরকম:

০) প্রোগ্রাম শুরু। ১) সাল ইনপুট নাও ২) সাল কি ১০০ দ্বারা নিঃশেষ এ বিভাজিত ? হ্যাঁ হলে: ৩ নাম্বার ধাপ এ যাও। না হলে: ৪র্থ ধাপ এ যাও

৩) সাল কি ৪০০ দ্বারা নিঃশেষ এ বিভাজিত? হ্যাঁ হলে : এটি লিপ ইয়ার। ৫ম ধাপ এ যাও না হলে: লিপ ইয়ার না। ৫ম ধাপ এ যাও ৪) এটা কি ৪ দ্বারা নিঃশেষ এ বিভাজিত? হ্যাঁ হলে: এটি লিপ ইয়ার না হলে: এটি লিও ইয়ার না

৫) প্রোগ্রাম শেষ।

Leap Year বের করার কোড

এখানে Mod[year, 100] == 0 কন্ডিশনটা সত্যি হলে If[Mod[year, 400] == 0 অংশটুকু রান করবে, আর মিথ্যা হলে If[Mod[year, 4] == 0 রান করবে। If[Mod[year, 400] == 0 সত্য হলে Print["Leap Year"] রান করবে আর মিথ্যা হলে Print["Not Leap Year"] রান করবে। একই ভাবে, If[Mod[year, 4] == 0 সত্য হলে Print["Leap Year"] রান করবে আর মিথ্যা হলে Print["Not Leap Year"] রান করবে।

আমরা কন্ডিশন কী দেখলাম, এবং এর আগে লিস্ট নিয়ে কিছু কাজ করেছি। এখন একটা আনুষঙ্গিক প্রবলেম সলভ করা যাক।

Palindrome কিনা যাচাই

ধরি আমাদের কে একটা সংখ্যা N দেওয়া হবে, আমাদেরকে বলতে হবে সংখ্যাটি প্যালিন্ড্রোম কিনা। প্যালিন্ড্রোমিক সংখ্যা হলো এমন একটি সংখ্যা, যাকে উল্টালে একই সংখ্যা পাওয়া যায়। অর্থাৎ, প্রথম থেকে সংখ্যাটা পড়লে যে মান পাওয়া যায়, শেষ থেকে পড়লেও একই মান পাওয়া যায়। যেমন, 121 এটা একটা প্যালিন্ড্রম, কারণ একে উল্টালে 121 ই পাওয়া যায় যা কিনা সংখ্যাটা নিজেই। আবার, 12321 ও একটি প্যালিন্ড্রম। 123421 প্যালিন্ড্রম না, কারণ এটাকে উল্টালে 124321 পাওয়া যায়, যা এই সংখ্যাটার সমান না।

এখন একটা সংখ্যা প্যালিন্ড্রম কিনা কীভাবে চেক করবো? আমরা যদি আমাদের সংখ্যাটাকে উল্টায়ে নতুন একটা সংখ্যা বানাতে পারি, তাহলে আমাদের শুধু চেক করলেই হবে যে নতুন সংখ্যাটা আগের সংখ্যাটার সমান কিনা? যদি সমান হয় তাহলে আমরা বলে দিতে পারবো সংখ্যাটা প্যালিন্ড্রম। আর না হলে বলে দিব সংখ্যাটা প্যালিন্ড্রম না।

এখন এতোগুলো কাজ আমরা করবো কীভাবে? দুইটা সংখ্যা সমান কিনা চেক করতে পারবো আমরা If দিয়ে। কিন্তু সংখ্যা উল্টাবো কীভাবে? সংখ্যা উল্টায় কীভাবে তা হয়তো আমরা আপাতত জানিনা, কিন্তু একটি লিস্টকে কীভাবে উল্টাতে হয় সেটা আমরা লিস্ট সেকশনের শেষে দেখেছি। Reverse[] ফাংশনের মধ্যে একটা লিস্ট দিলে সেটা আমাদেরকে উল্টায়ে দেয়।

এখন সমস্যা হলো আমরা সংখ্যার ডিজিটগুলোকে লিস্ট আকারে আলাদা আলাদা ভাবে দেখাবো কীভাবে? সেটার জন্যও একটা ফাংশন আমরা আগে দেখে এসেছি। তার নাম হলো IntegerDigits । এটা ইউজ করে একটা সংখ্যার ডিজিট গুলো দিয়ে একটা লিস্ট বানানো যায়।

তাহলে আমরা একটা সংখ্যাকে লিস্ট আকারে লিখলাম, সেটাকে রিভার্সও করলাম, কিন্তু, সেই লিস্ট থেকে আবার সংখ্যায় কনভার্ট করবো কীভাবে? তারজন্যও আমরা একটা ফাংশন দেখেছি, FromDigits । এর কাজ হলো একটা লিস্টের উপাদানগুলো যদি কয়েকটা ডিজিট হয় তাহলে এই ফাংশন টা এই ডিজিট গুলো পরপর যুক্ত করে দিয়ে একটা সংখ্যা বানাবে।

আমাদের কাজের summary তাহলে অনেকটা এরকম হচ্ছে Take a number "n" > convert it to a list using IntegerDigits[] > reverse this list > convert this list back to a number using FromDigits[] > Check if it is equal to the initial number "n"

এখানে n = 12321
আমরা চাইলে আলাদা ভ্যারিয়েল ইউজ না করে এক লাইনেই কাজ টা করতে পারতাম

Last updated