সূচিপত্র 

শুরুতেই বলে রাখি, এই পর্ব পড়াটা ঐচ্ছিক। এটি না পড়েও খুব সহজেই সামনে এগিয়ে যাওয়া যাবে। এটি শুধু যারা আরও বেশি জানতে আগ্রহী, তাদের জন্যই লেখা!

ভ্যারিয়েবল আছে অনেক ধরণের। প্রত্যেক ভ্যারিয়েবলের আছে নিজস্ব বৈশিষ্ট্য। এগুলো দেখানোরই চেষ্টা করা হবে এ পর্বে। এছাড়াও আলোচনা থাকছে কনস্ট্যান্ট নিয়েও। আউটপুটকে কিভাবে আরও সাজানো, গুছানো করা যায়, তা নিয়েও সংক্ষিপ্ত আলোচনা আছে এ পর্বে।

ডাটা টাইপের বিস্তারিত

গত পর্বে আমরা int, double আর char টাইপের সাথে পরিচিত হয়েছিলাম। কিন্তু এর বাইরেও আরও অসংখ্য ডাটা টাইপ আছে। এবং তাদের প্রত্যেকের আছে নিজস্ব সীমা। যেমন, integer হল ৩২ বীটের (বা ৪ বাইট। ১ বাইট = ৮ বিট) একটি ভ্যারিয়েবল। তার মধ্যে প্রথম বীটটি আবার চলে যায় ইন্টিজারটির আগে + কিংবা – ধারণের জন্য। বাকি থাকে ৩১-টি বিট। তাহলে, এর রেঞ্জ দাঁড়াচ্ছে –2^31 থেকে +2^31 পর্যন্ত। এসব ভিন্নতার কারণে প্রতিটি ভ্যারিয়েবলের আছে ভিন্ন ভিন্ন ব্যবহার।

এই সব ভ্যারিয়েবলের একটা লিস্ট তোমাদের সুবিধার জন্য নিচে দেওয়া হল। তবে ভুলেও এটা মুখস্ত করতে যেও না! আস্তে আস্তে তোমরা এদের সাথে এমনিতেই পরিচিত হবে। 🙂

Snap 2015-03-24 at 18.22.57

আবার তুমি চাইলেই কিন্তু এদের সাইজ নিজেই দেখে নিতে পার। এজন্য আমাদের একটি ফাংশন ব্যবহার করতে হবে। তবে চিন্তার কোনো কারণ নেই। কারণ এটি প্রিডিফাইনড ফাংশন এবং একটি লাইব্রেরীতে অন্তর্ভুক্ত। তাই তুমি এর নিয়ম মেনে লিখে দিলেই হয়ে যাবে। এর জন্য নিচের কোডটি দেখ।

#include<stdio.h>
int main() {
    printf("Size of int : %dn",sizeof(int));
    printf("Size of short int : %dn",sizeof(short int));
    printf("Size of long int : %dn",sizeof(long int));
    printf("Size of char : %dn",sizeof(char));
    printf("Size of wchar_t : %dn",sizeof(wchar_t));
    printf("Size of float : %dn",sizeof(float));
    printf("Size of double : %dn",sizeof(double));
    return 0;
}

এখানে sizeof হল একটি ফাংশন যার কাজ হল কোনো ডাটা টাইপ বা ভ্যারিয়েবলকে ব্র্যাকেটের ভিতর এর ইনপুট হিসেবে দেওয়া হলে তার সাইজ (বীট সংখ্যা ফিরিয়ে দেওয়া)। কোডটি রান করলেই  নিচের বক্সটি দেখবে।

Snap 2015-03-24 at 18.27.41

ভ্যারিয়েবল স্কোপ

প্রথমেই আসা যাক ভ্যারিয়েবল স্কোপের ব্যাপারে। দুই ধরণের ভ্যারিয়েবল রয়েছেঃ লোকাল এবং গ্লোবাল।

লোকাল ভ্যারিয়েবলটি ফাংশনের মধ্যেই থাকে, ফাংশনের মধ্যেই এর শুরু এবং শেষ। ফাংশন শেষ হওয়ার সাথে সাথে এর অস্তিত্ব বিলীন হয়ে যায়। অপরদিকে গ্লোবাল ভ্যারিয়েবল সার্বজনীন। ফাংশনের ভেতরে এর মান বদলে যেতে পারে। কিন্তু ফাংশন শেষ হওয়ার পরও এর অস্তিত্ব ঠিকই থেকে যায়।

ভবিষ্যতে আমরা মেইন ছাড়াও অন্যান্য ফাংশন সম্পর্কে জানবো। তখন ব্যাপারটা আরও ভাল মতে বুঝতে পারবে।

তো যা বলছিলাম, লোকাল ভ্যারিয়েবলের শুরু এবং শেষ ফাংশনের ভেতরেই। আমরা একটা কোড লিখে সেখানে গ্লোবাল এবং লোকাল ভ্যারিয়েবল খুঁজে বের করার চেষ্টা করি।

#include <stdio.h>
using namespace std;
int thisIsAGlobalVariable=7;
int main() {
    int thisIsALocalVariable=3;
    printf("%d %dn", thisIsAGlobalVariable, thisIsALocalVariable);
    return 0;
}

এখানে মেইন ফাংশনের বাইরে ডিফাইন করা thisIsAGlobalVariable হল একটি গ্লোবাল ভ্যারিয়েবল আর ভেতরের thisIsALocalVariable হল লোকাল ভ্যারিয়েবল।

ভ্যারিয়েবল ইনিশিয়ালাইজেশন

ভ্যারিয়েবল সংক্রান্ত একটি সবচেয়ে গুরুত্বপূর্ন ব্যাপার হল এই ভ্যারিয়েবল ইনিশিয়ালাইজেশন। এটা নিয়ে শুরু থেকেই সতর্ক থাকা উচিত। না হলে পরে অনেকেরই মাথার চুল ছিড়ার কারণ হয়ে দাঁড়ায় এটা।

ভ্যারিয়েবল যখন ডিক্লেয়ার করা হয়, তখন এতে নিজ থেকে একটি গার্বেজ ভ্যালু এসে বসে থাকে। হতে পারে সেটা শূন্য, কিংবা ১০ কিংবা -১০০০।  কথাটা সত্য নাকি সেটা বুঝতে তোমরা নিচের প্রোগ্রামটি রান করে দেখ।

#include <stdio.h>
int main() {
    int a,b,c,d,e,f,g;
    printf("%d %d %d %d %d %d %dn", a,b,c,d,e,f,g);
    return 0;
}

এটা রান করলে দেখবা রাজ্যের উল্টা পাল্টা সব ভ্যালু প্রিন্ট হচ্ছে।  তাই ভ্যারিয়েবল ডিক্লারেশনের সময়ই এর ভ্যালু ইনিশিয়ালাইজ করে দেওয়া উত্তম। তবে অনেক ক্ষেত্রেই এটা না করলেও চলে। ব্যাপারটা কিছু দিনের মধ্যেই আরও স্পষ্টভাবে বুঝতে পারবা!

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

#include <stdio.h>
int main() {
    int a=1,b=2,c=3,d=4,e=5,f=6,g=7;
    printf("%d %d %d %d %d %d %dn", a,b,c,d,e,f,g);
    return 0;
}

ইনিশিয়ালাইজ করার অভ্যাসটা রাখা খুবই ভাল। আর ইনিশিয়ালাইজ সাধারনত নিচের মত করা হয়। তবে এটা অনেক শর্তের উপরই নির্ভরশীল!

Snap 2015-03-24 at 18.33.21

Escape Sequence

আউটপুট ফরম্যাট নিয়ন্ত্রনের জন্য বেশ কিছু Escape Sequence ব্যবহার করা হয়ে থাকে। এদের একটি আমরা ইতোমধ্যেই দেখে ফেলেছি। সেটা হল ‘n’. আরও একটি হল ‘t’। এর কাজ হল উলম্ব একটি ট্যাব সৃষ্টি করা। যেমন, নিচের প্রোগ্রামটি রান করে দেখ।

#include<stdio.h>
int main() {
    printf("Hello t Worldn");
    return 0;
}

এর আউটপুট হবে নিচের মত।

Snap 2015-03-24 at 18.38.22

এদের লিস্টটা নিচে দিয়ে দিলাম। তোমার কাজ হবে বিভিন্ন কোড লিখে এবং রান করে এদের ব্যবহারগুলো বুঝার চেষ্টা করা!

Snap 2015-03-24 at 18.40.00

কনস্ট্যান্ট

আমরা ভ্যারিয়েবলের সাথে পরিচিত হয়েছি। এবার দেখব constant-কে। ভ্যারিয়েবলের সাথে এদের পার্থক্য হল ভ্যারিয়েবলের মান যত খুশি বদলানো যায়। কিন্তু constant একবার ডিফাইন করে দেওয়ার পর আর সেটার মান বদলানো যায় না। বদলানোর চেষ্টা করলেই কম্পাইল এরর দেখায়!

কনস্ট্যান্ট ডিফাইন দুই ভাবে করা যায়।

(১) #define এর মাধ্যমে // এটা #include-এর মতই একটা preprocessor

(২) const কীওয়ার্ড-এর মাধ্যমে

প্রথমে বলে নি, #define-এর ব্যাপারে। এর মাধ্যমে কনস্ট্যান্ট ডিফাইন করতে হয় এভাবেঃ #define <constant_name> <constant>

যেমন, নিচের কোডটা দেখঃ

#include<stdio.h>
#define LENGTH 7
#define WIDTH  3

int main() {
    int area;
    area = LENGTH * WIDTH;
    printf("%dn", area);
    return 0;
}

এই কোড রান করলে আউটপুট হবে 21!

constant-এর নাম সাধারনত সব লেটার ক্যাপিটাল করে দেওয়া হয়। এটা করা হয় বুঝতে সুবিধার জন্য, কোনটা constant আর কোনটা variable!

আর const কীওয়ার্ড ব্যবহারে নিয়মটা হল এমনঃ const <type> <variable name> = <value>

যেমন, নিচের কোডটা দেখঃ

#include<stdio.h>
int main() {
    const int  LENGTH =3;
    const int  WIDTH  =7;
    const char NEWLINE ='n';
    int area;
    area = LENGTH * WIDTH;
    printf("%d %c", area, NEWLINE);
    return 0;
}

আজকের মত এখানেই শেষ! আশা করি সি ভালই লাগছে! কোনো প্রশ্ন থাকলে কমেন্ট সেকশনে করে ফেল। উত্তর দেওয়ার সর্বোচ্চ চেষ্টা করব। আগামী পর্ব পর্যন্ত বিদায়! 🙂

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed