প্রথম পর্ব লেখার পর সবার কাছ থেকে যে সাধুবাদ ও উৎসাহ পেয়েছি তা সত্যিই চমৎকার।হাতে যেহেতু সময় আছে তাই বসে গেলাম পরের পর্বটা লিখতে।কিন্তু সমস্যা হল, প্রথম পর্বে তো কেবল শুরুর কথাবার্তাই ছিল।কিছুটা চাপা মেরে না হয় পার পেয়ে গেলাম :)।কিন্তু এরপরের পর্বগুলোতে ধীরে ধীরে সি এর আসল টপিকগুলো চলে আসবে।সেগুলো নিয়ে লিখতে গেলে বেশ পড়াশোনার ব্যাপার স্যাপার আছে।আমি যেমন অলস তাতে শেষ পর্যন্ত কি অবস্থা হয় কে জানে।
যাহোক, প্রথম পর্বে আমরা দেখেছি যে আমাদের সি তে কোড করতে কি কি লাগবে, সি ভাষাটা কেমন, কি কি করা যায়, সি কোড কিভাবে কাজ করে তার একটা মোটামুটি ওভারভিউ।আমরা আগেই দেখেছি আমরা কোডব্লকস ব্যবহার করব আমাদের কোড লেখার জন্য।এখানে একটা কথা আছে।কোডব্লকস ডাউনলোডের যে লিংক দেওয়া আছে ওখানে থেকে আমরা codeblocks-10.05mingw-setup.exe এই ফাইলটা ডাউনলোড করব।এটা IDE এবং GCC Compiler একসাথে দেওয়া আছে।আরেকটা যেটা আছে ওটাতে কম্পাইলার নেই।কোড লিখতে পারবেন কিন্তু কম্পাইল,রান কিছুই করা যাবে না।ইন্সটল করার পর একবার টেস্ট করে দেখে নিন ঠিকঠাক কম্পাইল,মেইক,রান হয় কি না।যদি কম্পাইল না করে তাহলে কোডব্লকসের Settings এ যান।সেখানে Compiler & Debugger সিলেক্ট করুন।একটা উইন্ডো আসবে।ওটার উপরের দিকে কম্পাইলারগুলোর একটা ড্রপডাউন লিস্ট পাবেন।সেটার নিচে ডানপাশে Reset Default এ ক্লিক করুন ও OK করে বেরিয়ে আসুন।আর কোন প্রবলেম হওয়ার কথা না আমার জানা মতে।
এখন আসল কথায় আসি।আজ আমরা সি এর ডেটা টাইপ, ভ্যারিয়েবল, স্টেটমেন্ট ও এক্সপ্রেশন এই চারটা বড় বড় ইংরেজি শব্দের মর্ম বোঝার চেস্টা করব :)।সাথে আরেকটা ছোট্ট ইন্টারেস্টিং জিনিসও শিখতে হবে।কিন্তু সেটা এখন বলছি না।
ডেটা টাইপ হল আমরা যে প্রোগ্রাম লিখব সেটা কি ধরনের ডেটা নিয়ে কাজ করবে সেটা।স্কুলের পুরানো গণিত বইতে ফিরে যাই অল্প কিছুক্ষণের জন্য।সেখানে আমাদেরকে কত রকম সংখ্যা দেখেছি ও শিখেছি সেইসময় মনে আছে ?বেশি গভীরে ভাবার দরকার নেই।আমি পূর্ণসংখ্যা,ধনাত্মক সংখ্যা, ঋণাত্মক সংখ্যা,দশমিক সংখ্যা এগুলোর কথা বলছি।সেখানে কিছু নিয়মকানুন আমাদের মানতে হত,তাইনা ? যেমন ধরুন, যে কাজটার জন্য দশমিক সংখ্যা লাগবে সেটার জন্য আমরা যদি পূর্ণসংখ্যা ব্যবহার করি তাহলে কিন্তু ভুল হবে।কেমন ভুল? আপনি একটা বৃত্তের ক্ষেত্রফল বের করতে যদি পাইয়ের মান ৩.১৪ এর স্থলে ৩ বসান তাহলে আপনি আপনার কাংক্ষিত ফালাফল নাও পেতে পারেন।কাজেই মোটকথা হল, আমাদের বিভিন্ন কাজের জন্য বা বিভিন্ন রকম সমস্যা সমাধানের জন্য বিভিন্ন রকম সংখ্যা ব্যবহার করতে হয়। ধরতে পারেন,অনেকটা কারনেই সি তে প্রোগ্রাম লেখার জন্য বিভিন্ন ডেটা টাইপ আমাদেরকে দেওয়া হয়েছে।সি তে ডেটা টাইপগুলোকে আমরা প্রধানত ৩ টা ভাগে ভাগ করতে পারি।সেগুলো হল, Integer, Character,Floating point number।কোডে এগুলোকে লিখতে গেলে এভাবে লিখতে হবে,
১. Integer এর জন্য int
২. Characterএর জন্য char
৩.Floating point numberএর জন্য float
এখন কিছু কথা আছে।উপরে যে ডেটা টাইপগুলোর কথা বললাম সেগুলোর প্রত্যেকটার একটা নির্দিষ্ট লিমিট বা সীমা আছে।যেমন, char এর সাইজ এক বাইট।অর্থাৎ সে -১২৭ থেকে +১২৭ পর্যন্ত সকল নাম্বার নিয়ে কাজ করতে পারে। এমনিভাবে int এবং float এর সাইজ জিসিসি তে চার বাইট,অবশ্য সেটা কম্পাইলার ভেদে ভিন্ন হতে পারে।সাইজ অনুযায়ী একটা ডেটা টাইপ কোন রেন্জের নাম্বার নিয়ে কাজ করতে পারে সেটা মেশিন বুঝে নেয়।
উপরের তিনটা ডেটা টাইপে দেখা যাচ্ছে পজিটিভ ও নেগেটিভ দুই ধরনের নাম্বার নিয়েই তারা কাজ করতে পারে।আমরা আমাদের দরকারমত কিছু মোডিফায়ার ব্যবহার করে এদের বৈশিষ্ট্য বদলে ফেলতে পারি।যেমন, int এর যায়গায় unsigned int লিখলে সে নেগেটিভ সংখ্যাগুলো বাদ দিয়ে পজিটিভগুলো নিয়ে কাজ করবে।ফলে সাইজ যেহেতু বাড়ছে বা কমছে না কাজেই, ৪ বাইটই থাকছে।সুতরাং আমরা এখন ০ থেকে (২^৩২)-১ পর্যন্ত যেকোন সংখ্যা নিয়ে কাজ করতে পারছি যেখানে আগে ০ থেকে (২^১৬)-১ পর্যন্ত পজিটিভ সংখ্যা নিতে পারতাম।ক্যারেকটারের বেলার ০ থেকে ২৫৫ পর্যন্ত যেকোন সংখ্যাই ব্যবহার করা যাচ্ছে যেখানে আগে ১২৭ এর বেশি ব্যবহার করা যেত না।
float এর সাইজ জিসিসিতে চার বাইট।এটা হল দশমিক সংখ্যা নিয়ে কাজ করার ডেটা টাইপ।এটা ব্যবহার করাতে কিছু ছোটখাট ঝামেলা আছে।দশমিকের কাজ করার জন্য double ডেটা টাইপটা ব্যবহার করা সবচেয়ে নিরাপদ।আর এটার সাইজও বেশি, আট বাইট।তাই এটা অনেক বড় সংখ্যা রাখতে পারে। long নামে আরেকটা ডেটা টাইপ আছে।এটাকে আমরা অন্য ডেটা টাইপের মোডিফায়ার হিসেবেও ব্যবহার করতে পারি (যেমন, long double) । তবে long কে আমি প্রধান টাইপগুলোর ভিতরে রাখিনি কারন আমাদের কম্পাইলারে int ও long এর সাইজ সমান।কিন্তু অন্য কম্পাইলারে int হল ২ বাইট যেখানে long চার বাইট।কাজেই long একটা বড় সাইজের ইন্টিজার ছাড়া কিছুই না।
ডেটা টাইপ নিয়ে এটুকুই।বাকিটা ও খুটিনাটি জানতে বই দেখে নিতে পারেন।
এখন আসি ভ্যারিয়েবল টপিকে।গণিতে যেকোন টার্মের মান হয় স্থির থাকে অথবা পরিবর্তন হয়।শুধু গণিত না,আসলে সব জিনিসের বেলায়ই এটা সত্যি।হয় স্থির থাকবে অথবা পরিবর্তন হবে।যেটার মান পরিবর্তন হয় না সেটাকে আমরা কন্সট্যান্ট বা ধ্রুবক বলি(যেমন, পাই)।আর যেটা পরিবর্তন হয় তাকে আমরা ভ্যারিয়েবল বলি।আমাদের সি প্রোগ্রামিং এ ভ্যারিয়েবল কথাটা অনেকটা এই অর্থেই ব্যবহৃত হয়ে থাকে।এখন আমরা দেখব ভ্যারিয়েবল কি ও এটা কি কাজে লাগে।
কম্পিউটার বা অন্য কোন ডিভাইসের জন্য প্রোগ্রাম লিখতে গেলে আমাদেরকে অসংখ্য ডেটা নিয়ে কাজ করতে হতে পারে।এখন কথা হল আমাদের তো ডেটা নিয়ে কাজ করতে গেলে ডেটা কোন একটা যায়গা থেকে পড়তে হবে, কোন একটা যায়গায় লিখে রাখতে হবে যাতে দরকার মত সেটা আমরা ব্যবহার করতে পারি।তাই না ? আচ্ছা একটা উদাহরন দিই।মনে করি,আমাদের এমন একটা প্রোগ্রাম লিখতে হবে যেখানে আমরা একজন লোকের পরিবারের সদস্যদের বয়স ইনপুট নেব ও বয়সের যোগফল আউটপুট স্ক্রীনে দেখাব।আমরা এখনও দেখিনি কিভাবে ইনপুট নিতে হয়।দেখব একটু পর।ধরলাম আমরা পারি ইনপুট নিতে।এখন ধরি, কিবোর্ড থেকে বয়সগুলো ইনপুট নিয়েছি।এখন ক্যালকুলেশন করা বাকি।কিন্তু একটা সমস্যা তো থেকেই গেল।যে ইনপুটগুলো নিয়েছিলাম সেগুলো কোথায় পাবো ?? সেগুলো তো হারিয়ে গেল তাহলে।অর্থাৎ এটা পরিস্কার বোঝা যাচ্ছে যে আমাদের এমন কিছু একটা দরকার যেখানে আমরা ঐ বয়সগুলো বা ডেটাগুলো স্টোর করে রাখতে পারব ও দরকার হলে ব্যবহার করতে পারব।আমাদের ঐ "কিছু একটা" হল ভ্যারিয়েবল। ভ্যারিয়েবল হল এমন "একটা কিছু" যেটার ভিতর আমরা কোন ডেটা রাখতে পারি,পরিবর্তন করতে পারি ও দরকারমত ব্যবহার করতে পারি।আর ভ্যারিয়েবল ছাড়া কোডকে মোটামুটি অস্তিত্ত্বহীন বলা যায়।ভ্যারিয়েবল ব্যবহার করতে হলে এটাকে ডিক্লেয়ার করতে হয়।এটার জন্য নিয়মকানুন আছে।আমরা একটু দেখে নিই। ভ্যারিয়েবল ডিক্লেয়ার করার ফরম্যাট হল "ডেটা টাইপ (স্পেস) ভ্যারিয়েবলের নাম (সেমিকোলন) " অথবা ""ডেটা টাইপ (স্পেস) ভ্যারিয়েবলের নাম = কোন একটা ইনিশিয়াল ভ্যালু(সেমিকোলন) "।একই ডেটা টাইপের অনেকগুলো ভ্যারিয়েবল ডিক্লেয়ার করতে নামগুলোর মাঝে কমা দিতে হবে।ডিক্লেয়ারেশনের নিয়ম নিচের ছবি দেখলেই বুঝতে পারবেন।
একটা ভ্যারিয়েবল এভাবে যখন আমরা ডিক্লেয়ার করি তখন আমাদের মেশিনের মেমোরির কোন একটা যায়গাতে চার বাইট যায়গা যে নামে আমরা ভ্যারিয়েবল ডিক্লেয়ার করেছি ঐ নামে বরাদ্দ হবে।মেমোরিতে একটা যায়গা যেহেতু জড়িত এখানে কাজেই ঐ যায়গার একটা অ্যাড্রেসও থাকবে।অ্যাড্রেসটা কেন জড়িত ? কারন মেশিনের ঐ নাম নিয়ে কোন মাথাব্যথা নেই,তার যত কাজকারবার ঐ অ্যাড্রেসটা নিয়ে।অর্থাৎ int variable_name = 0; লেখার মানে মেমোরিতে কোন একটা অ্যাড্রেসে একটা ইন্টিজার রাখার জন্য চার বাইট যায়গা বরাদ্দ করা হল এবং ঐ মেমোরি লোকেশনে 0 সংখ্যাটা রাখা হল ও যায়গাটার নাম দেওয়া হল variable_name।এখানে আমরা ভ্যারিয়েবলকে একটা ইনিশিয়াল ভ্যালু দিয়ে দিয়েছি যেটা 0, কিন্তু ছবিতে প্রথম টাইপের যে ডিক্লারেশনটা আমরা দেখলাম ওখানে আমরা কোন ইনিশিয়াল ভ্যালু দিইনি।কাজেই ওখানে উল্টাপাল্টা কোন সংখ্যা থাকবে যেটাকে আমরা বলি গারবেজ ভ্যালু।একটা ছোট কোড লিখে দুইটা ভ্যারিয়েবলের মান প্রিন্ট করে দেখুন।বুঝতে পারবেন হাতে কলমে।আচ্ছা,আমরা তো সেটা পারিনা এখনও।আচ্ছা দেখি একটু পর।
এখন ছোট একটা কথা।খুবই গুরুত্বপূর্ণ।জিসিসি কম্পাইলারে একটা বড় সুবিধা হল আমরা আমাদের কোডের যেকোন যায়গাতেই ভ্যারিয়েবল ডিক্লেয়ার করতে পারব আমাদের দরকারমত।কিন্তু অন্য কম্পাইলারে কিন্তু তা হবে না।যেমন,অনেকের সাধের টার্বো সি তে সকল ভ্যারিযেবল ফাংশনের শুরুতে ডিক্লেয়ার করতে হয়।তা না করলে তিনি গাদাখানেক এরর দিতে এক সেকেন্ডও দেরি করেন না। 🙂
আরও একটা জিনিস আমাদের জানতে হবে।সেটা হল, লোকাল ভ্যারিয়েবল ও গ্লোবাল ভ্যারিয়েবল।গ্লোবাল ভ্যারিয়েবল হল এমন ভ্যারিয়েবল যেটাকে আমাদের পুরো কোডের যেখানে খুশি সেখানে আমরা ব্যবহার করতে পারি প্রয়োজন অনুযায়ী।সোজা কথায় কোডের সবাই যে ভ্যারিয়েবলকে চেনে সেটা হল গ্লোবাল ভ্যারিয়েবল।অন্যদিকে লোকাল ভ্যারিয়েবল হল এমন ভ্যারিয়েবল যেটাকে কোডের ভিতর একটা নির্দিষ্ট ব্লকই একমাত্র চেনে এবং ঐ ব্লকের বাইরে ঐ ভ্যারিয়েবলের কোন অস্তিত্ত্ব নেই অর্থাৎ যে ব্লকে তাকে ডিক্লেয়ার করা হয়েছে ঐ ব্লকের বাইরে তাকে কেউ চেনে না।এই চেনা আর অচেনার যে ব্যাপারটা বললাম এটাকে বলা হয় Scope ।আমরা সামনের কোন পর্বে এটার উদাহরন দেখব কারন আমরা এখনও যে ব্লকের কথা বলেছি ওটার ব্যাপারে ভালো ধারনা পাইনি।ভ্যারিয়েবলের নাম কি দিবেন সেটা নিয়ে কিন্তু একটু ঝামেলা আছে।ইচ্ছামত নাম দিতে পারবেন কিন্তু কিছু নিয়মকানুন মেনে চলতে হবে।যেমন, নামের ভিতর কোন স্পেস থাকবে না, শুরুতে অবশ্যই কোন ক্যারেকটার অথবা আন্ডারস্কোর দিতে হবে,সি তে কিছু সংরক্ষিত কি ওয়ার্ড আছে যেগুলো ব্যবহার করা যাবে না ইত্যাদি ইত্যাদি ।এরকম আরো কিছু নিয়ম আছে।বইতে পাবেন।
এখন আমরা অল্প কথায় জানব এক্সপ্রেশন ও স্টেটমেন্ট কি।স্টেটমেন্ট হল সোজা কথায় বাক্য।সি ভাষায় লেখা একটা সঠিক বাক্য যেটা সেমিকোলন দিয়ে শেষ হয়।আর এক্সপ্রেশন একেবারে একই জিনিস কিন্তু এর শেষে সেমিকোলন থাকবে না।তাহলে কি বোঝা গেল ? একটা স্টেটমেন্ট আর এক্সপ্রেশনের পার্থক্য গড়ে দেয় তাহলে একটা সেমিকোলন।কনফিউজড ?? আমরা পরের পর্বে দেখব আসলে একটা সেমিকোলন কত গুরুত্বপূর্ন আমাদের কোডে।একটা যায়গায় সেমিকোলন দিতে ভুল করলে কম্পাইল করার সময় ক্ষেত্রবিশেষে হাজারখানেক এরর আসতে পারে। 🙂
এখন আমরা সেই ছোট্ট ইন্টারেস্টিং ব্যাপারটা শিখে ফেলি ঝটপট।সেটা হল কিভাবে আমরা প্রোগ্রামে ইউজারের কাছ থেকে কিবোর্ড থেকে ইনপুট নেব ও কনসোল স্ক্রীনে আউটপুট দেব।
সি তে নরমাল ইনপুট নিতে হয় scanf ফাংশন দিয়ে।এটাও printf ফাংশনের মত stdio.h হেডারে থাকে।নিচে আমরা দেখতে পাচ্ছি scanf দিয়ে ইনপুট নেবার ফরম্যাট।
data type identifying character এর যায়গাতে আমরা কি টাইপের ডেটা ইনপুট নেব তার উপর ভিত্তি করে কোন একটা ক্যারেকটার বসবে।যেমন, ইন্টিজারের জন্য d , ক্যারেকটারের জন্য c ইত্যাদি।কাজেই, ইন্টিজার ইনপুট নিতে আমাদের লিখতে হবে %d , ক্যারেকটারের জন্য %c অনুরূপভাবে।অনেকগুলো একসাথে ইনপুট নিতে টাইপ অনুযায়ী %d%c..। এভাবে লিখে যেতে হবে।ডাবল কোটের ভিতরের কাজ শেষ।এখন একটা কমা এরপর &ভ্যারিয়েবলের নাম।এখানে বোঝার বিষয় আছে।আমরা যদি লিখি scanf("%d",&var_name); এর অর্থ কিবোর্ড থেকে একটা ইন্টিজার ইনপুট নাও ও সেই ভ্যালুটা মেমোরিতে var_name ভ্যারিয়েবলের অ্যাড্রেসে স্টোর কর।& চিহ্ন দিয়ে অ্যাড্রেস বোঝায়।এখানে লক্ষনীয় var_name কে অবশ্যই ইন্টিজার হতে হবে অর্থাৎ আগে যেখানে একে ডিক্লেয়ার করা হয়েছে সেখানে যেন অবশ্যই এর ডেটা টাইপ int হয়।
এখন কথা হল, আমরা যদি এক টাইপের ভ্যারিয়েবলের ভিতর অন্য টাইপের ডেটা রাখতে যাই তাহলে কি হবে ? হয়তো কিছু হবে না।কিন্তু ক্ষেত্রবিশেষে ঝামেলা হতে পারে।যেমন, ক্যারেকটার এক বাইট ও ইন্টিজার চার বাইট।আমরা যদি ইন্টিজার ভ্যারিয়েবলের ভিতর ক্যারেকটারের ভ্যালু রাখি তাহলে সমস্যা নেই কারন তার কাছে যায়গা আছে,সে রাখতে পারবে।কিন্তু উল্টোটা হলে বিপদ।এক বাইট যায়গায় নিশ্চয় চার বাইটের ডেটা থাকতে পারবে না।এখানে এরর বা ওয়ার্নিং কিছুই দিবে না , ঝামেলা হবে যখন আপনি ভ্যারিয়েবল ব্যবহার করবেন।আপনার স্টোর করা ভ্যালু সেখানে থাকবে না।
কোন ভ্যারিয়েবলের ভ্যালু প্রিন্ট করা তেমন কোন ঝামেলা না। printf ফাংশনই আমাদের এটা করে দিবে।তবে এটার ব্যাপারে বিস্তারিত বলছি না।আগেরটা যদি বুঝে থাকেন তাহলে এটা এমনিতে দেখেই বুঝবেন।শুধু ফরম্যাটের দিকে একটু খেয়াল করুন।& নেই এখানে।নিচের কোডের printf এর দিকে তাকান।ডান থেকে পড়ুন।অমুক ভ্যারিয়েবলের ভ্যালু পড়ে আনো ও বামের ডাবল কোটের ভিতর যা লেখা আছে তার ভিতর যায়গামত বসিয়ে প্রিন্ট করে দাও।কাহিনী শেষ।
তাহলে আমরা এখন আমাদের সমস্যা সমাধানের পুরো কোডটা একবার দেখে নিই।তাহলে এতক্ষনের আলোচনাটা বুঝতে সুবিধা হবে।
নতুনেরা যারা এই পোস্ট ফলো করছেন , এই কোডটা নিজেরা লিখে কম্পাইল ও রান করে আউটপুট টা কমেন্টে দেখান।তাহলে বুঝব আপনারা আমার সাথে আছেন। 🙂
আজ এ পর্যন্তই..... 🙂
**একইসাথে সামহয়্যারইন ব্লগে প্রকাশিত
আমি অয়ন। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 13 বছর 2 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 6 টি টিউন ও 56 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।
আমি অয়ন।ব্লগিং করতে পছন্দ করি সত্যি কিন্তু আমি টেক ব্লগার নই।যেহেতু এটা টেক ব্লগ তাই আমাকে চেস্টা করতে হবে টেক ব্লগারের অভিনয় করার।এই মুহূর্তে ঠিক জানিনা কতটুকু সফল অভিনয় করতে পারব :)।পড়াশোনা আপাতত বুয়েটের সিএসই ডিপার্টমেন্টে,ফাইনাল ইয়ার।আর বেশিদিন হয়তো ছাত্র থাকা হবে না,মাত্র এক বছর কিন্তু ছাত্র হয়ে থাকতে পারলেই...
age1 আর age2 এ যত দিবেন তার যোগফল। একটা কথা, কোডগুলা এভাবে স্ক্রিনশট হিসেবে না দিয়ে সরাসরি দিন। টেকটিউনসে কোড হাইলাইটার আছে। এখানে দেখুন https://www.techtunes.io/web-design/tune-id/77692/