সি টিউটোরিয়াল, পর্ব ৮ – (ডাটা টাইপ ও character ডাটা টাইপ)

এই সিরিজের পূর্বের টিউটোরিয়াল গুল।

  1. সি টিউটোরিয়াল, পর্ব ১ – (প্রোগ্রামিং ল্যাংগুয়েজের ইতিহাস)
  2. সি টিউটোরিয়াল, পর্ব ২ – (প্রোগ্রামিং ল্যংগুয়েজের সূচনা লগ্ন)
  3. সি টিউটোরিয়াল, পর্ব ৩- (সি ল্যাংগুয়েজের ইতিহাস)
  4. সি টিউটোরিয়াল, পর্ব ৪– (C প্রোগ্রাম এর ফরম্যাট)
  5. সি টিউটোরিয়াল, পর্ব ৫ – (ভেরিয়েবল ডিক্লেয়ার/ঘোষনা করা)
  6. সি টিউটোরিয়াল, পর্ব ৬ – (‘printf()’ ফাংশন ও ‘backslash character’)
  7. সি টিউটোরিয়াল, পর্ব ৭ – (Formate Specifier ও “scanf()” ফাংশন)

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

  1. Character – বিভিন্ন অক্ষর – যেমনঃ – a, e, r  ইত্যাদি
  2. Integer – বিভিন্ন পূর্ন সংখ্যা – যেমনঃ – 124, 45, 45 ইত্যাদি
  3. Floating  – দশমিক যুক্ত সংখ্যা – যেমনঃ – 124.24, 45.78, 45.04 ইত্যাদি
  4. Double  – দশমিক যুক্ত কিন্তু Float ডাটা টাইপের যেয়ে বেশি নিয়ে কাজ করে। – যেমন – 3.125569842556

1যখন আমরা  একটি ভেরিয়েবল ডিক্লেয়ার করি  তখন যে ডাটা টাইপ ভেরিয়েবল ডিক্লেয়ার করা হয় ঐ ডাটা টাইপের জন্য নিদিষ্ট পরিমান যায়গা মেমেরিতি নির্ধারিত হয়। ডাটা টাইপের জন্য এই জায়গা / স্পেস নির্ধারন কম্পাইলার, কম্পিউটারের আর্কিটেকচার, অপারেটিং সিষ্টেমের উপর নির্ভর করে। অবশ্য ANSI কর্তৃক সি তে ডাটা টাইপের জন্য নিদিষ্ট পরিমান স্পেস নির্ধারন করে দেওয়া হয়েছে।

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

remote-database-services-3ভেরিয়েবলের জন্য স্পেসঃ ধরুন আপনি ৫ এর সাথে ৩ যোগ করবেন।  এক্ষেত্রে আপনাকে অবশ্যই প্রোগ্রামের প্রথমে উল্লেখ্য / ডিক্লেয়ার করে দিতে হবে Integer নামের ২ টি সংখ্যা আছে। ডিক্লিয়ার করার জন্য আপনাকে ইন্টেজের টাইপের ২ টি ভেরিয়েবল ডিক্লেয়ের করতে হবে এবং এই ডিক্লেয়ার করার মাধ্যমে আপনি কম্পিউটারের মেমরিতে ২ টি ভেরিয়েবলের জন্য নিদিষ্ট কিছু পরিমান স্থান রাখবেন যেখানে উক্ত ভেরিয়েবল ২ টির ভ্যালু ৫ ও ৩ জমা করবেন। আরো সহজ ভাবে বলা যায় ধরুন আপনি আপনার 512MB এর একটি মেমেরি কার্ডে রয়েছে। আপনার মেমেরি কার্ডে 500 MB গান লোড করেছেন তাহলে মেমির কার্ডে বাকী রয়েছে 12MB এখন আপনি জাতীয় সংগীত মেমরীতে লোড করবেন যা 10MB এখন আপনি যদি মেমেরি কার্ডে জাতীয় সংখীত লোড করতে ইচ্ছুক হন তাহলে অবশ্যই আপনার মেমরি 10MB জায়গা / স্পেস / স্থান / সাইজ এর প্রয়োজন হবে। যদি 10MB স্পেস না থেকে থাকে তাহলে আপনি জাতীয় সংখীত লোড করতে পারবে না। তাহলে দেখা যাচ্ছে যে, আপনি পূর্ব থেকেই মেমেরিতে স্পেস রেখেছেন যেখানে জাতীয় সংখীত লোড করবেন। এখানে ডাটা টাইপ এর স্পেসও ঠিক তাই এবং ভেরিয়েবলের সাথে আপনি জাতীয় সংখীত এর তুলনা করতে পারেন। জাতীয় সংখীত এর সাইজ 10MB অপর দিকে Intger টাইপ এর একটি ভেরিয়েবলের জন্য রয়েছে 2 Byte.

পাঠক এখানে Byte দেখি হয়ত পুনরায় কনফিউজ হয়ে গেলেন। এ তক্ষন আলোচনা করলাম MB নিয়ে এখন আবার Byte আসছে কোথা থেকে। তাদের জন্য –

‘1’ / ‘0’  = 1 Bit

8 Bit = 1 Byte

1056 Byte = 1 Mega Byte (MB)

1056 MB = 1 Giga Byte (GB)

1056 GB = 1 Tera Byte(TB)

আশা করছি কনফিউশন দূর হয়ে গেছে। চলুন তাহলে দেখি সি তে কোন ডাটা টাইপের জন্য কতটুক স্পেস নির্ধারন করা হয়।

Character   —  1 Byte / 8 Bit

Integer   —  2 Byte / 16 Bit

Floating   —  4 Byte / 32 Bit

Double   —  8 Byte / 64 Bit

চলুন একটি প্রোগ্রামের মাধ্যমেও দেখেনেই কোন ডাটা টাইপের জন্য মেমরিতে কতটুক জায়গা নির্ধারন হয়। codeblock এ নিচের কোড টুক লিখে রান করুন—

void main (){

printf(“\tCharacter Data Type: %d Byte\n”,sizeof(char));

printf(“\tInteger Data Type  : %d Byte\n”,sizeof(int));

printf(“\tFloating Data Type : %d Byte\n”,sizeof(float));

printf(“\tDouble Data Type   : %d Byte\n”,sizeof(double));

getchar();

}

নিচের মত করে cmd প্রদর্শন হবে। এখানে Integer ডাটা টাইপ এর ভ্যালু “4” দেখে কনফিউজ হবেন না। আমি পূর্বের বলেছে  “স্পেস নির্ধারন কম্পাইলার, কম্পিউটারের আর্কিটেকচার, অপারেটিং সিষ্টেমের উপর নির্ভর করে” আমারা আমাদের বিস্তারিত আলোচনাতে ANSI এর মান অনুযায়ী করব।

Character:  সিঙ্গেল অক্ষর ষ্টোর / জমা রাখার জন্য character ডাটা টাইপের ভেরিয়েবল ব্যবহার করা হয়। প্রোগ্রামে ভেরিয়েবল ডিক্লেয়ার করার সময় character না লিখে সংক্ষেপে char লিখা হয়। ধরুন প্রোগ্রামের কোন অংশে ইউজারের yes অথবা No এই ধরনের কোন মতামত নেওয়ার প্রয়োজন, সেক্ষেত্রে হয়ত প্রোগ্রাম থেকে বলা হবে “আপনি এই কাজটি করতে ইচ্ছুক হন তাহলে y প্রেস করুন অথবা ইচ্ছুক না হলে N প্রেস করুন”। আপনি যখন Y অথবা N প্রেস করার মাধ্যমে আপনার মতামত জানাবেন তখন, প্রোগ্রামে পূর্বে উক্ত ইনপুট এর জন্য যে কাজটি নির্ধারন করে দেওয়া থাকবে সেই কাজটি করবে। একটি উদাহরন লক্ষ্য করি।

void main (){

char input; // Declear a character(char) type variable

printf(“Prass y for show tutorialbd ink or prass n for show tutohost link: “);

scanf(“%c”,&input); // wait for input

if (input == ‘y’){  // if you prass y then execute next line

printf(“\t\n\ntutorialbd link is: www.tutorialbd.com”);

}

else if (input == ‘n’){ // or you prass n then execute next line

printf(“\t\n\ntutohostlink is: www.tutohost.com”);

}

else{  // if you not prass y or n then execute next line

printf(“\t\n\nyou are not prass y or n “);

}

getchar(); // wait for prass enter

getchar();

}

কোড বিশ্লেষনঃ

( char input; ):  এই লাইলে input নামের একটি ভেরিয়েবল ডিক্লেয়ার করা হয়েছে যা char ডাটা টাইপের। এই input ভেরিয়েবলের জন্য মেমরিতে 1 Byte বা 8 Bit জায়গা নির্ধারন হবে।

( scanf(“%c”,&input); ): scanf() ফাংশনের মাধ্যমে ইনপুট নেওয়া হবে ও ইনপুট হিসেবে শুধু মাত্র char টাইপ ডাটা নিবে কারন fromat specifier “%c” এর মাধ্যমে তাই বলা হয়েছে এবং উক্ত ডাটা input নামের ভেরিয়েবলের মান / ভ্যালু হিসাবে নির্ধারিত হবে। অন্যভাবে বলা যায় উক্ত ইনপুটকৃত ডাটা input নামের ভেরিয়েবলের জন্য মেমরিতে যে 1 Byte বা 8 Bit এর স্পেস / স্থানে রাখা হয়েছে সেই স্পেস / স্থানে জমা করবে।

( if (input == ‘y’) ): এখানে কন্ডিশন ব্যবহার করা হয়েছে (if,else if,elseসম্পর্কে পরবর্তিতে বিস্তারিত আলোচনা করা হবে।) আপনি যদি input নামের ভেরিয়েবলে y জমা করে রাখেন তাহলে if (input == ‘y’) এর পরের { থেকে } পর্যন্ত যে কোড লিখা থাকবে সেই কাজ করবে।

( else if (input == ‘n’) ): অথবা আপনি যদি input নামের ভেরিয়েবলে n জমা করে রাখেন তাহলে else if (input == ‘n’) এর পরের  { থেকে } পর্যন্ত যে কোড লিখা থাকবে সেই কাজ করবে।

( else ): আপনি যদি y অথবা n এর যে কোন একটি অক্ষর জমা করে না রেখে অন্য কোন অক্ষর জমা করেন তাহলে else এর পরের { থেকে } পর্যন্ত যে কোড লিখা থাকবে সেই কাজ করবে।

3

5

উপরের কোড গুল codeblock এ লিখে রান করুন এবং কয়েক বার রান করুন। প্রতিবার পর্যায়ক্রমে y, n, , a, s, …. ইত্যাদি থেকে যে কোন একটি অক্ষর প্রেস করে ইন্টার প্রেস করুন। আশা করি character (char) এর প্রয়োজনীয়তা বুঝতে সক্ষম হয়েছেন।

Char ডাটা টাইপের মেমরি স্পেস ঠিক নিচের মত

tab1

এখানে দেখা যাচ্ছে যে ডান দিক থেকে প্রথম ৭ টি বিট হচ্ছে Data Bit রাখার জন্য এবং সর্বশেষ বিট টি হচ্ছে Sign Bit. ধরুন আপনি char ভেরিয়েবলে A জমা রেখেছেন তাহলে উক্ত char ভেরিয়েবলের মেমেরি স্পেস হবে নিচের মত

tab2

A এর ASCII মান হচ্ছে 048 এবং বিভিন্ন সংখ্যা, অক্ষর, প্রতীক  ASCII এর মান Decimal ফরমেটে দেওয়া থাকে। 048 কে Decimal ফরমেট থেকে Binary  ফরমেটে পরিবর্তন করলে 048 এর মান হবে “1000001”।  মেমেরিতে ভেরিয়েবলের জন্য  যে স্থান নিদিষ্ট করে দেওয়া থাকে তা Binary  ফরমেটে থাকে এবং কম্পিউটারও বাইনারী ভাষায় কাজ করে । এখানে ডান দিক থেকে প্রথম ৭ টি ডাটা বিট উক্ত A এর বাইনারী ভ্যালু এর জন্য। সর্বশেষ Sign Bit টি ব্যাবহার করা হয় ডাটাটি ধনাত্মক নাকি ঋনাত্মক তা বুঝার জন্য। যদি ডাটাটি ধনাত্মক হয়ে থাকে তাহলে Sign Bit টি হবে ‘0’ অথবা ডাটাটি যদি ঋনাত্মক হয়ে থাকে তাহলে Sign Bit টি হবে ‘1’ । যেহেতু সর্বশেষ বিটটি সাইন বিট হিসেবে ব্যবহার করা হয় এবং sign Bit টি যদি ‘0’ হয় তাহলে তাই বাকি যে ৭ টি বিট রয়েছে তা দিয়ে সর্বচ্চ ‘1111111’ অথবা 127 (ডেসিমেল) পর্যন্ত গননা করা যাবে। যদি sign Bit টি ‘1’ হয় তাহলে তাই বাকি যে ৭ টি বিট রয়েছে তা দিয়ে সর্বচ্চ ‘-1111111’ অথবা -128 (ডেসিমেল) পর্যন্ত গননা করা যাবে।  চলুন দেখি কি ASCII Chart এ কি কি রয়েছে 0 – 127 পর্যন্ত। যেহেতু char  সাধারন ভাবে ৭ টি ডাটা বিট নিয়ে কাজ করে তাই char ভেরিয়েবলে ASCII এর ০-১২৭ পর্যন্ত অক্ষর গুল জমা রাখতে পারবে।

এই char টাইপ ভেরিয়েবল এর মান ২ ভাবে নির্ধারন করা যায়। প্রথমত সরাসরি উক্ত অক্ষর এর ASCII ভ্যালু লিখে অন্যভাবে সিঙ্গেল কোটেশনের (‘’) মধ্যে উক্ত অক্ষর লিখে । চলুন একটি উদাহরন লক্ষ্য করি।

void main (){

char ch1 = 88;

printf(“\n\tPrint: %c”,ch1);

char ch2 = ‘X’;

printf(“\n\tPrint: %c”,ch2);

getchar(); // wait for prass enter

getchar();

}

উক্ত কোডটুক codeblock এ লিখে রান করুন।

কোড বিশ্লেষনঃ

( char ch1 = 88; ) : ch1 নামে একটি char ডাটা টাইপের ভেরিয়েবল ডিক্লেয়ার করা হয়েছে এবং এর মান নির্ধারন করে দেওয়া হয়েছে 88 । এই 88 হচ্ছে X এর ASCII ভ্যালু। পরবর্তি লাইনে উক্ত ch1 ভ্যালু প্রদর্শন করা হয়েছে।

( char ch1 = ‘X’; ) : ch2 নামে অপর একটি char ডাটা টাইপের ভেরিয়েবল ডিক্লেয়ার করা হয়েছে যার মান হচ্ছে X । পরবর্তি লাইনে উক্ত ch2 এর মান প্রদর্শন করা হয়েছে।

6

একটি বিষয়ে পাঠকের দৃষ্টি আকর্ষন করছি এখানে দেখা যাচ্ছে যে char ডাটা টাইপে 127  থেকে  -128 পর্যন্ত যে কোন একটি ভ্যালু রাখা যাবে। পাঠকের কাছে আমার প্রশ্ন, আমার জানি যদি +২ হয় তাহলে বিপরীতে হবে -২ । কিন্তু এখানে ১২৭ এর বিপরীতে -১২৮ কেন? উত্তর থাকবে আগামী পর্বে। সবাই ভাল থাকুন ও সুস্থ থাকুন এবং অবশ্যই টিউটোরিয়ালবিডির সাথেই থাকুন।

3 thoughts on “সি টিউটোরিয়াল, পর্ব ৮ – (ডাটা টাইপ ও character ডাটা টাইপ)”

  1. সি প্রোগ্রামিং সংক্রান্ত আপনার পোস্টগুলো ভালো লেগেছে। আশাকরি এই ধারা অব্যহত থাকবে।

    1. ভাল লাগছে জেনে খুশি হলাম। আপনাদের মতামতের উপর নির্ভর করে অব্যহত থাকবে না বন্ধ হয়ে যাবে । ধন্যবাদ

Leave a Comment