সূচিপত্র
এতক্ষণ আমরা শুধু প্রিন্ট করা শিখেছি, অর্থাৎ আউটপুট দেওয়া। ইউজারকে পাত্তা দি নাই। কিন্তু এভাবে তো জীবন চলে না! আমাদের ইউজার ইন্টারঅ্যাকশনের ব্যবস্থা করতে হবে। অর্থাৎ ইউজার থেকে ইনপুট নিতে হবে।
এখন সমস্যা হল আমরা এই ইনপুট নিয়ে জমা রাখবো কোথায়! জমা করে রাখতে না বললে তো বেকুব কম্পিউটারটা ইনপুট নিয়েই সেটা ভুলে যাবে। এই ‘জমা রাখা’-র ব্যাপারে সাহায্য করতেই আবিস্কার ভ্যারিয়েবলের।
x = 9, y = 3 – এই ধরণের জিনিস নিশ্চয় অনেক বার দেখেছো। এগুলাই ভ্যারিয়েবল, যার অসংখ্য মান থাকতে পারে। সি-তে অনেক ধরণের ভ্যারিয়েবল আছে। তবে আনন্দের ব্যাপার হল সব এখন না শিখলেও চলবে, সব চেয়ে বেশি ব্যবহৃত তিনটি ভ্যারিয়েবল নিয়েই আপাতত অনেক কাজ করে ফেলা যাবে।
এই তিনটি ভ্যারিয়েবল টাইপ হলঃ
(১) Integer, যা ব্যবহার করা হয় পূর্ণ সংখ্যার জন্য
(২) Double, যা ব্যবহার করা হয় দশমিক সংখ্যার জন্য
(৩) Character, যা ব্যবহার করা হয় বিভিন্ন ASCII Character(A, z, ”, ), * ইত্যাদি)-এর জন্য
ভ্যারিয়েবল ডিক্লেয়ারেশন
আমরা ছোটবেলায় যখন অঙ্ক করতাম, তখন এরকম একটা লাইন লিখতাম, “মনে করি, আমার মাথায় x-টা চুল আছে।” ভ্যারিয়েবল ব্যবহার করতে চাইলেও ঠিক একইভাবে অবশ্যই বলে দিতে হবে যে তুমি ওই নামের একটা ভ্যারিয়েবল ব্যবহার করবা। আর সাথে এটাও বলে দিতে হবে ভ্যারিয়েবলটা কোন টাইপের। কম্পিউটার নিজে নিজে বুঝে নিবে, সেই আশায় বসে থেকে লাভ নাই, কারণ সে একটা বেকুব।
এই ভ্যারিয়েবল ডিক্লেয়ারেশনের নিয়মটা হল এমনঃ
int x;
double x;
কিংবা, char x;
সেমিকোলনের কথা মনে আছে তো? 😉
আর একাধিক ভ্যারিয়েবল ডিক্লেয়ার করতে চাইলে তাদের মাঝে অবশ্যই কমা দিতে হবেঃ
int a,b,c,x,y,z;
ভ্যারিয়েবলের মাধ্যমে ইনপুট নেওয়া
এখন ভ্যারিয়েবল ডিক্লেয়ার করে বসে থাকলেই তো হবে না, সেটার মানও জানতে হবে! এজন্য আমরা printf()-এর মত একটা ফাংশন ব্যবহার করবো, যার নাম হল scanf()।
scanf-এর স্ট্রাকচার হল এমনঃ
scanf(“variable_specifier”, &variable_name);
দেখ, এখানে একটা অ্যাম্পারসেন্ড (&) দরকার পড়েছে! এই অ্যাম্পারসেন্ডের ব্যাপারে সর্বোচ্চ সতর্কতার প্রয়োজন। নাহলে বুড়ো বয়সে এটি কান্নার কারণ হয়ে দাঁড়ায়! :p
তো, আমরা এবার x নামের ভ্যারিয়েবল ডিক্লেয়ার করে সেখানে একটি মান ইনপুট নি। তার জন্য আমাদের আগে বুঝতে হবে স্পেসিফায়ার কী। সি-তে বিভিন্ন ডাটা টাইপের জন্য বিভিন্ন স্পেসিফায়ার রয়েছে। Double Quote-এর মধ্যে এই স্পেসিফায়ারগুলো দিয়ে বুঝিয়ে দিতে হয় যে তুমি কোন টাইপের ভ্যারিয়েবল ইনপুট নিবা। যেমন, ইন্টিজার টাইপের জন্য স্পেসিফায়ার হল %d! স্পেসিফায়ারগুলোর সাথে সবসময় একটি % চিহ্ন থাকে।
int x; scanf("%d", &x);
এটা যা করবে তা হল, ইউজার যে মানটা ইনপুট দিবে সেটা গ্রহণ করে আগের লাইনে ডিক্লেয়ার করা x নামের ভ্যারিয়েবলটি যে অ্যাড্রেসে আছে, সেখানে রেখে দিবে। অ্যাড্রেসের ব্যাপারটা আপাতত বুঝার দরকার নেই। সহজভাবে মনে রাখ যে, এটা করলে x-এর মান হয়ে যাবে ইউজারের ইনপুট দেওয়া ইন্টিজারটা।
এবার আমরা কয়েকটি স্পেসিফায়ার সম্পর্কে একটু ধারণা নিয়ে রাখিঃ
Integer | %d |
Double | %lf |
Float | %f |
Char | %c |
এখন একাধিক ইনপুট নেওয়ার জন্য কি করতে হবে বল তো? আমরা এটা আলাদা আলাদা scanf দিয়ে করতে পারি চাইলেঃ
int a; double b; char c; scanf("%d", &a); scanf("%lf", &b); scanf("%c", &c);
কিংবা চাইলে একটি scanf() ফাংশনের মধ্যেই কাজটি করে ফেলতে পারতাম!
#include <stdio.h> int main() { int a; double b; char c; scanf("%d %lf %c", &a, &b, &c); printf("%d %lf %c\n", a, b, c); return 0; }
দেখ এখানে আমরা ইনপুট নেওয়ার পাশাপাশি আউটপুটও দিয়ে দিয়েছি। এক্ষেত্রে শুধু একটাই পার্থক্য। scanf()-এ অ্যাম্পারসেন্ড দরকার ছিল, printf()-এর ক্ষেত্রে সেই অ্যাম্পারসেন্ডটির আর দরকার নেই।
কোডটি রান করে 1, 3.1 আর a ইনপুট দিলে আউটপুট আসবেঃ
এখন একটা প্রশ্ন থাকতে পারে, ইউজার যদি a-এর জায়গায় char এবং c-এর জায়গায় integer ইনপুট দেয়, তাহলে কি হবে? আসলে কিছুই করার নাই। ইউজার ভুল ইনপুট দিলে ভুল আউটপুট পাবে, ওইটা নিয়ে মাথা ঘামানোর দরকার নাই। 😛 তোমার কাজ হল ইউজারকে যতটা সম্ভব ইনপুটের ফর্মেটটা বুঝিয়ে দেওয়া।
ভ্যারিয়েবলের মান ইউজার থেকে ইনপুট না নিয়ে আমরা চাইলে সেটা নিজে থেকে অ্যাসাইন করে দিতে পারি। কাজটা খুবই সহজ। করতে হয় এভাবেঃ
int a;
a=10;
শুধু শুধু লাইন না বাড়িয়ে এক লাইনেও লিখে ফেলা যায়ঃ
int a=10;
আবার char টাইপের একটা ভ্যারিয়েবলের মান অ্যাসাইন করার সময় অবশ্যই দুই পাশে ‘ দিতে হবে!
char a = ‘A’;
এখন বল তো নিচের প্রোগ্রামটা আউটপুট কি হবে?
#include <stdio.h> int main() { int a; a=8; printf("%d\n", a); scanf("%d", &a); printf("%d\n", a); a=9; printf("%d\n", a); return 0; }
রান না করে ভেবে দেখ কি হবে।
এটা রান করার সাথে সাথে “8” প্রিন্ট করবে। এরপর এটা অপেক্ষা করবে ইউজার একটা কিছু ইনপুট দেওয়ার জন্য। তারপর ইউজার যদি ১০ প্রিন্ট দেয়, তাহলে এটা এবার a-এর মান হিসেবে ১০ প্রিন্ট করবে। পরের লাইনে আমরা আবার a-এর মান বদলে ৯ করে দিয়েছি। তাই শেষে এটি ৯ প্রিন্ট করে প্রোগ্রাম টার্মিনেট করবে।
অর্থাৎ, মোট কথা হল, ভ্যারিয়েবলের মান যত বার খুশি বদলে দেওয়া যায়। তুমি যদি constant কিছু রাখতে চাও, তাহলে ব্যবহার করতে হবে “#define“। এই “#define” আবার ব্যবহার করতে হয় মেইন ফাংশনের বাইরে। নিচের উদাহারণটা দেখঃ
#include <stdio.h> #define PI 3.1416 int main() { double PI=3.14; printf("%lf", PI); }
প্রোগ্রাম রান করার সাথে সাথে কম্পাইলার দৃঢ় কণ্ঠে প্রতিবাদ জানাবে এভাবেঃ expected unqualified-id before numeric constant
অর্থাৎ একবার একটা constant ডিফাইন করে দেওয়ার পর সেটা আর বদলানো যায় না।তুমি মেইন ফাংশনে PI-এর মান না বদলালে এটি কাজ করবে ঠিক ভাবেই!
#include <stdio.h> #define PI 3.1416 int main() { printf("%lf", PI); }
আর constant ডিফাইন করা হয় এভাবেঃ
#define constant_name constant_value
আমরা চাইলে ইনপুট আউটপুটের ব্যাপারটা ইউজারের কাছে আরেকটু সহজবোধ্য করে তুলতে পারি এভাবে, যাতে সে বুঝতে পারে তাকে কী করতে হবেঃ
#include <stdio.h> #define PI 3.1416 int main() { double r; printf("Radius of the circle please: "); scanf("%lf", &r); double area = PI*r*r; printf("Area of the circle is : %lf\n", area); return 0; }
কোডটি রান করে 4 ইনপুট দিলে আউটপুট হবে এরকমঃ
আমরা যদি দশমিকের পর দুই ঘর পর্যন্ত চাই, তাহলে লিখতামঃ
#include <stdio.h> #define PI 3.1416 int main() { double r; printf("Radius of the circle please: "); scanf("%lf", &r); double area = PI*r*r; printf("Area of the circle is : %.2lf\n", area); return 0; }
আবার %.3lf লিখলে বুঝাতো আমরা দশমিকের পর তিনটি ঘর চাই!
খেয়াল কর এখানে আমরা ডাবলের পরিবর্তে ইন্টিজার দিলেও ঠিক মতই কাজ করছে। আসলে আমরা এখানে 4 ইনপুট দিলেও কম্পিউটার সেটা জমা রাখছে 4.000000… হিসেবে! কিন্তু আমরা যেখানে ইন্টিজার দরকার সেখানে ডাবল দিলে কী হত একটু দেখা যাক।
#include <stdio.h> int main() { int I; printf("An integer please: "); scanf("%d", &I); printf("Your input: %d\n", I); return 0; }
এখন আমরা 3.14 ইনপুট দিলে আউটপুট আসবেঃ
অর্থাৎ দশমিকের পরের অংশটি হারিয়ে গেছে!
আজকের মত শেষ করছি। আশা করি শীঘ্রই ফিরে আসবো। 😀
লেখা সংক্রান্ত কোনো ধরণের সাজেশন থাকলে জানাবেন। 🙂 কোনো প্রশ্ন থাকলে কমেন্ট করতে পারেন।
ধন্যবাদ।