ডেটা টাইপ, চলক ও কীওয়ার্ড

সি প্রোগ্রামিং: ডেটা টাইপ (int, float, char), ফরম্যাট স্পেসিফায়ার, ভেরিয়েবল নামকরণের নিয়ম, কীওয়ার্ড এবং কনস্ট্যান্ট এর বিস্তারিত।

শেখা শুরু করুন

অধ্যায় ৫: ডেটা টাইপ, চলক ও কীওয়ার্ড

  1. ডেটা টাইপ, চলক ও কীওয়ার্ড
  2. রান্নাঘরের কৌটা বনাম কম্পিউটারের মেমোরি
  3. ডেটা টাইপ (Data Type) কী?
  4. বিভিন্ন ডেটা টাইপ ও মেমোরি সাইজ
  5. ফরম্যাট স্পেসিফায়ার (Format Specifier)
  6. চলক বা ভেরিয়েবল (Variable) কী?
  7. ভেরিয়েবল নামকরণের নিয়মাবলী (১)
  8. ভেরিয়েবল নামকরণের নিয়মাবলী (২)
  9. কোনটি বৈধ আর কোনটি অবৈধ?
  10. কীওয়ার্ড (Keyword) - সংরক্ষিত শব্দ
  11. ধ্রুবক বা কনস্ট্যান্ট (Constant)
  12. কোড উদাহরণ: হাতে-কলমে
  13. সারসংক্ষেপ

ডেটা টাইপ, চলক ও কীওয়ার্ড

এই লেকচার শেষে আমরা-

১। সি ভাষার বিভিন্ন ডেটা টাইপ (int, float, char, double) ও তাদের মেমোরি সাইজ ব্যাখ্যা করতে পারব।
২। চলক বা ভেরিয়েবল (Variable) ঘোষণার নিয়মাবলী বর্ণনা করতে পারব।
৩। ফরম্যাট স্পেসিফায়ার (%d, %f, %c) ব্যবহার করতে পারব।
৪। কীওয়ার্ড (Keyword) ও ধ্রুবক (Constant) চিহ্নিত করতে পারব।

সবাইকে স্বাগতম! আশা করি তোমরা সবাই ভালো আছো। আজ আমরা প্রোগ্রামিংয়ের খুবই গুরুত্বপূর্ণ তিনটি বিষয় নিয়ে আলোচনা করব—ডেটা টাইপ, ভেরিয়েবল এবং কীওয়ার্ড। এগুলো ছাড়া কোনো প্রোগ্রাম লেখাই সম্ভব নয়। চলো দেখে নিই, এই লেকচার শেষে আমরা ঠিক কী কী শিখতে পারব। এই লেকচার শেষে আমরা- ১। সি ভাষার বিভিন্ন ডেটা টাইপ ও তাদের মেমোরি সাইজ ব্যাখ্যা করতে পারব, ২। ভেরিয়েবল ঘোষণার সঠিক নিয়মাবলী বর্ণনা করতে পারব, ৩। ফরম্যাট স্পেসিফায়ার ব্যবহার করতে পারব এবং ৪। কীওয়ার্ড ও ধ্রুবক চিহ্নিত করতে পারব।

রান্নাঘরের কৌটা বনাম কম্পিউটারের মেমোরি

দৃশ্যপট: রান্নাঘরে বিভিন্ন সাইজের পাত্র
  • চালের জন্য: বড় ড্রাম
  • লবণের জন্য: ছোট কৌটা
  • তেলের জন্য: বোতল

প্রশ্ন: কম্পিউটারে কি সব ডেটা একই পাত্রে রাখা হয়?

  • বাস্তব জীবনে আমরা জিনিসের ধরন অনুযায়ী পাত্র বা container ব্যবহার করি।
  • কম্পিউটার মেমোরিতেও ডেটার ধরন অনুযায়ী আলাদা জায়গা বা container লাগে।

শুরুতেই চলো একটা বাস্তব উদাহরণ দিই। তোমাদের বাসার রান্নাঘরের কথা চিন্তা করো তো। আম্মু কি চাল, ডাল, লবণ বা তেল—সব কি একই রকমের বা একই সাইজের কৌটায় রাখেন? নিশ্চয়ই না! চালের জন্য হয়তো বড় প্লাস্টিকের ড্রাম ব্যবহার করেন, আবার লবণের জন্য ছোট্ট একটা কাঁচের বয়াম। আবার তেল রাখেন বোতলে। কেন? কারণ একেকটা জিনিসের ধরন একেক রকম, আর তাদের রাখার জায়গাও ভিন্ন ভিন্ন লাগে। ঠিক একইভাবে, কম্পিউটারের মেমোরিতেও যখন আমরা কোনো তথ্য বা 'ডেটা' রাখতে চাই, সব ডেটার জন্য একই সাইজের জায়গা বরাদ্দ করলে চলে না। ডেটার ধরন অনুযায়ী কম্পিউটারকে আগে থেকেই বলে দিতে হয়—'আমার এই তথ্যের জন্য এতোটুকু জায়গা লাগবে'। এই ধারণা থেকেই এসেছে ডেটা টাইপ এবং ভেরিয়েবল। চলো বিস্তারিত জানি।

ডেটা টাইপ (Data Type) কী?

সংজ্ঞা: ডেটা টাইপ হলো ডেটার ধরন। এটি কম্পাইলারকে বুঝিয়ে দেয় ডেটাটি কেমন (পূর্ণসংখ্যা, ভগ্নাংশ নাকি অক্ষর) এবং মেমোরিতে কতটুকু জায়গা দখল করবে।

সি ভাষায় প্রধান ৪টি ডেটা টাইপ:
১. int (Integer) - পূর্ণসংখ্যা (১০, ৫০)
২. float (Floating Point) - ভগ্নাংশ (৩.১৪)
৩. double (Double Precision) - বড় ভগ্নাংশ
৪. char (Character) - অক্ষর ('A', 'z')

প্রথমে আসি 'ডেটা টাইপ' কী? সহজ কথায়, ডেটা টাইপ মানে হলো ডেটার ধরন। তুমি যখন প্রোগ্রাম লিখবে, কম্পিউটারকে তো বুঝতে হবে তুমি তাকে কী দিচ্ছো। তুমি কি তাকে একটা পূর্ণসংখ্যা দিচ্ছো (যেমন ১০ বা ৫০), নাকি একটা দশমিক সংখ্যা দিচ্ছো (যেমন ৩.১৪), নাকি কোনো ইংরেজি অক্ষর (যেমন A বা B)? এই যে ডেটার ভিন্ন ভিন্ন রূপ, একেই বলে ডেটা টাইপ। সি ভাষায় মূলত আমরা ৪ ধরণের বেসিক ডেটা টাইপ ব্যবহার করি—int, float, double এবং char। ছবিতে তোমরা ডেটা টাইপের শ্রেণীবিভাগ দেখতে পাচ্ছো, কিন্তু আজ আমরা এই চারটা বেসিক টাইপ নিয়েই কথা বলব।

বিভিন্ন ডেটা টাইপ ও মেমোরি সাইজ

টাইপ ও বর্ণনা
  • char: একটি অক্ষর (যেমন 'A', 'z')।
  • int: পূর্ণসংখ্যা (যেমন 10, -50)।
  • float: দশমিক সংখ্যা (যেমন 3.14)।
  • double: বেশি মেমোরিযুক্ত দশমিক সংখ্যা।

এবার চলো দেখি কোন টাইপ মেমোরিতে কতটুকু জায়গা নেয়। স্ক্রিনে চার্টটা খেয়াল করো। প্রথমে **char** বা ক্যারেক্টার। যেকোনো একটি অক্ষর, যেমন 'A' বা 'x' রাখার জন্য এটি ব্যবহার হয়। এটি মেমোরিতে মাত্র ১ বাইট জায়গা নেয়। অনেকটা লবণের ছোট কৌটার মতো। এরপর **int** বা ইন্টিজার। পূর্ণসংখ্যা রাখার জন্য, যেমন ১০, ১০০ বা -৫। এটি সাধারণত ২ বাইট বা আধুনিক কম্পিউটারে ৪ বাইট জায়গা নেয়। এরপর **float**। দশমিক সংখ্যা, যেমন ৩.১৪ বা ৫.৫০ রাখার জন্য। এটি নেয় ৪ বাইট। আর যদি অনেক বড় দশমিক সংখ্যা হয় বা খুব সূক্ষ্ম হিসাব দরকার হয়, তখন আমরা ব্যবহার করি **double**। এটি মেমোরিতে ৮ বাইট জায়গা দখল করে, মানে float-এর দ্বিগুণ। মেমোরি সাইজগুলো মনে রাখা জরুরি, কারণ এর ওপর প্রোগ্রামের দক্ষতা নির্ভর করে।

ফরম্যাট স্পেসিফায়ার (Format Specifier)

কাজ: ইনপুট (scanf) বা আউটপুট (printf) ফাংশনে ডেটার ধরন বুঝিয়ে দেওয়া।

তালিকা:
- int%d (Decimal Integer)
- float%f (Float)
- char%c (Character)
- double%lf (Long Float)

এখন প্রশ্ন হলো, আমরা তো বুঝলাম কোন ডেটা কী। কিন্তু কম্পিউটারকে যখন আমরা বলি 'এই মানটা প্রিন্ট করো' বা 'স্ক্যান করো', তখন কম্পিউটারকে একটা বিশেষ সংকেত দিতে হয়। একে বলে 'ফরম্যাট স্পেসিফায়ার'। এটি অনেকটা আইডেন্টিটি কার্ডের মতো। ছবির দিকে তাকাও—ইন্টিজার বা পূর্ণসংখ্যার জন্য আমরা ব্যবহার করি `%d`। ফ্লোট বা দশমিকের জন্য `%f`। ক্যারেক্টার বা অক্ষরের জন্য `%c`। আর ডাবলের জন্য `%lf`। প্রোগ্রামে `printf` বা `scanf` ব্যবহারের সময় এই চিহ্নগুলো আমাদের ব্যবহার করতেই হবে, নইলে কম্পিউটার উল্টাপাল্টা মান দেখাবে।

চলক বা ভেরিয়েবল (Variable) কী?

সংজ্ঞা: মেমোরির একটি নির্দিষ্ট জায়গার নাম, যেখানে ডেটা সংরক্ষণ করা হয়। প্রোগ্রাম চলাকালীন এর মান পরিবর্তন হতে পারে।

গঠন (Syntax):
data_type variable_name = value;

উদাহরণ:
int age = 20;
এখানে,
- int = ডেটা টাইপ
- age = ভেরিয়েবলের নাম
- 20 = ভ্যালু বা মান

এখন আসি ভেরিয়েবল বা চলক-এ। ওই যে শুরুতে কৌটার উদাহরণ দিলাম? ভেরিয়েবল হলো সেই কৌটা বা পাত্রের নাম। মেমোরির যে জায়গায় আমরা ডেটা রাখি, সেই জায়গাটাকে চেনার জন্য আমরা একটা নাম দিই। এটাই ভেরিয়েবল। স্ক্রিনে দেখো, `int age = 20;`। এখানে আমরা কম্পিউটারকে বলছি—'একটা পূর্ণসংখ্যা রাখার পাত্র নাও, পাত্রটার নাম দাও age, আর তার ভেতরে ২০ সংখ্যাটি রাখো'। এখানে `int` হলো ডেটা টাইপ, `age` হলো ভেরিয়েবল বা পাত্রের নাম, আর `20` হলো ভ্যালু। মনে রাখবে, ভেরিয়েবল মানেই হলো যার মান পরিবর্তন করা যায় (vary করে)।

ভেরিয়েবল নামকরণের নিয়মাবলী (১)

ভেরিয়েবলের নাম ইচ্ছামতো দেওয়া যায় না। কিছু নিয়ম মানতে হয়:

  1. অক্ষর ও সংখ্যা: ইংরেজি ছোট হাতের (a-z) ও বড় হাতের (A-Z) অক্ষর এবং অঙ্ক (0-9) ব্যবহার করা যাবে।
  2. আন্ডারস্কোর: বিশেষ চিহ্ন হিসেবে শুধুমাত্র আন্ডারস্কোর _ ব্যবহার করা যায়।
  3. Case Sensitive: Total, total এবং TOTAL তিনটি আলাদা ভেরিয়েবল হিসেবে গণ্য হবে।

ভেরিয়েবলের নাম তুমি যা খুশি তাই দিতে পারো না। এর কিছু কড়া নিয়ম আছে, যা না মানলে এরর দেখাবে। চলো নিয়মগুলো দেখি। প্রথমত, নামে ইংরেজি অক্ষর (A-Z) এবং সংখ্যা (0-9) ব্যবহার করা যাবে। দ্বিতীয়ত, বিশেষ কোনো চিহ্ন যেমন @, #, $ ব্যবহার করা যাবে না, শুধুমাত্র আন্ডারস্কোর (_) ব্যবহার করা যাবে। তৃতীয়ত, সি ভাষা 'Case Sensitive'। মানে হলো, ছোট হাতের অক্ষরে লেখা `total` আর বড় হাতের অক্ষরে লেখা `Total`—কম্পিউটারের কাছে সম্পূর্ণ আলাদা দুটি নাম। তাই নামকরণের সময় বানানের দিকে খুব খেয়াল রাখতে হবে।

ভেরিয়েবল নামকরণের নিয়মাবলী (২)

  1. শুরুর নিয়ম: নাম অবশ্যই অক্ষর বা আন্ডারস্কোর দিয়ে শুরু হতে হবে। কোনো অঙ্ক (Digit) দিয়ে শুরু করা যাবে না।
    - সঠিক: roll_01, _num
    - ভুল: 1st_prize
  2. ফাঁকা স্থান: নামের মাঝে কোনো স্পেস বা ফাঁকা জায়গা রাখা যাবে না।
    - ভুল: my name
  3. কীওয়ার্ড: কোনো সংরক্ষিত শব্দ (Keyword) নাম হিসেবে ব্যবহার করা যাবে না (যেমন: int, return)।

বাকি নিয়মগুলো আরো বেশি গুরুত্বপূর্ণ। চার নম্বর নিয়ম: ভেরিয়েবলের নাম কখনোই সংখ্যা বা ডিজিট দিয়ে শুরু হতে পারবে না। যেমন `1st_prize` লিখলে ভুল হবে, কিন্তু `prize_1st` লিখলে ঠিক আছে। পাঁচ নম্বর: নামের মাঝে কোনো স্পেস দেওয়া যাবে না। `my name` আলাদা লেখা যাবে না, লিখতে হবে `my_name` অথবা `myname` এক সাথে। ছয় নম্বর: সি ভাষার নিজস্ব কিছু শব্দ আছে, যেগুলোকে আমরা কীওয়ার্ড বলি (যেমন int, float)। এগুলোকে ভেরিয়েবলের নাম হিসেবে ব্যবহার করা যাবে না। এই নিয়মগুলো প্রোগ্রামিংয়ে খুবই কড়াকড়িভাবে মানা হয়।

কোনটি বৈধ আর কোনটি অবৈধ?

নিচের ভেরিয়েবলগুলোর মধ্যে কোনটি সঠিক?

  1. student_id ✅ (সঠিক)
  2. 9class ❌ (ভুল - সংখ্যা দিয়ে শুরু)
  3. my name ❌ (ভুল - মাঝে স্পেস আছে)
  4. float ❌ (ভুল - এটি একটি কীওয়ার্ড)
  5. Age ✅ (সঠিক)

চলো এবার একটু প্র্যাকটিস করি। তোমরা ভিডিওটা পজ করে একটু ভাবো তো, স্ক্রিনে দেখানো নামগুলোর মধ্যে কোনগুলো সঠিক আর কোনগুলো ভুল? ১. `student_id`: এটা সঠিক, কারণ অক্ষর আর আন্ডারস্কোর আছে। ২. `9class`: এটা ভুল! কারণ শুরুতে সংখ্যা আছে। ৩. `my name`: এটাও ভুল। মাঝে স্পেস আছে। ৪. `float`: এটাও ভুল। কারণ float একটা কীওয়ার্ড। ৫. `Age`: এটা একদম সঠিক। আশা করি তোমরা নিয়মগুলো এখন ধরতে পেরেছ।

কীওয়ার্ড (Keyword) - সংরক্ষিত শব্দ

সংজ্ঞা: সি ভাষায় ব্যবহৃত কিছু সংরক্ষিত শব্দ যার নির্দিষ্ট অর্থ কম্পাইলারের কাছে আগে থেকেই ঠিক করা থাকে।

বৈশিষ্ট্য:
- এগুলো ভেরিয়েবল নাম হিসেবে ব্যবহার করা যায় না।
- সি ভাষায় (ANSI C) মোট ৩২টি কীওয়ার্ড আছে।

উদাহরণ: int, float, if, else, return, while, for, break ইত্যাদি।

আমরা একটু আগেই বললাম 'কীওয়ার্ড' ব্যবহার করা যাবে না। তাহলে কীওয়ার্ড জিনিসটা কী? কীওয়ার্ড হলো সি ভাষার নিজস্ব কিছু শব্দ, যাদের অর্থ কম্পাইলারের কাছে আগে থেকেই সেট করা আছে। যেমন, তুমি যখন `int` লেখো, কম্পাইলার বোঝে এটা পূর্ণসংখ্যা। তুমি চাইলেও `int` শব্দের অর্থ পাল্টাতে পারবে না বা ভেরিয়েবলের নাম হিসেবে ব্যবহার করতে পারবে না। সি ভাষায় এরকম ৩২টি স্ট্যান্ডার্ড কীওয়ার্ড আছে। যেমন: if, else, return, while ইত্যাদি। এগুলো সব সময় ছোট হাতের অক্ষরে (lowercase) লেখা হয়।

ধ্রুবক বা কনস্ট্যান্ট (Constant)

সংজ্ঞা: প্রোগ্রামে যার মান কখনো পরিবর্তন হয় না।

ব্যবহারের নিয়ম:
১. const কীওয়ার্ড ব্যবহার করে:
const float PI = 3.1416;

  1. #define প্রি-প্রসেসর ব্যবহার করে:
    #define PI 3.1416

ভেরিয়েবলের উল্টো হলো কনস্ট্যান্ট বা ধ্রুবক। ভেরিয়েবলের মান আমরা প্রোগ্রামের যেকোনো সময় পাল্টাতে পারি, কিন্তু কনস্ট্যান্টের মান একবার ঠিক করে দিলে আর পাল্টানো যায় না। যেমন, পাই (Pi)-এর মান ৩.১৪১৬। এটা তো কখনো বদলাবে না, তাই না? প্রোগ্রামে এটাকে আমরা কনস্ট্যান্ট হিসেবে ডিক্লেয়ার করি। এটা করার দুটি নিয়ম আছে। এক, `const` কীওয়ার্ড ব্যবহার করে, যেমন `const float PI = 3.1416;`। দুই, `#define` ব্যবহার করে। কনস্ট্যান্ট ব্যবহার করলে ভুল করে মান পরিবর্তন হয়ে যাওয়ার ভয় থাকে না।

কোড উদাহরণ: হাতে-কলমে

#include <stdio.h>

int main() {
    int num = 10;          // পূর্ণসংখ্যা
    float pi = 3.14;       // ভগ্নাংশ
    char letter = 'A';     // অক্ষর

    // প্রিন্ট করা হচ্ছে
    printf("Number: %d\n", num);
    printf("Pi Value: %f\n", pi);
    printf("Character: %c\n", letter);

    return 0;
}

আউটপুট:

Number: 10
Pi Value: 3.140000
Character: A

চলো এতক্ষণ যা শিখলাম, তা একটা ছোট্ট কোডের মাধ্যমে দেখি। এখানে দেখো, আমরা `num` নামে একটা `int` নিয়েছি যার মান ১০। `pi` নামে একটা `float` নিয়েছি। আর `letter` নামে একটা `char` নিয়েছি। খেয়াল করো, ভেরিয়েবলগুলোর নাম কিন্তু আমরা নিয়ম মেনেই দিয়েছি। এরপর `printf` ব্যবহার করে আমরা মানগুলো প্রিন্ট করেছি। ইন্টিজারের জন্য `%d`, ফ্লোটের জন্য `%f` এবং ক্যারেক্টারের জন্য `%c` ব্যবহার করা হয়েছে। আউটপুটে দেখো মানগুলো সুন্দরভাবে দেখাচ্ছে। তোমরাও বাসায় এই কোডটা টাইপ করে রান করে দেখবে।

সারসংক্ষেপ

আজ যা শিখলাম:
১. ডেটা টাইপ: int, float, char, double এবং তাদের মেমোরি সাইজ।
২. ভেরিয়েবল: মেমোরি লোকেশনের নাম।
৩. নামকরণের নিয়ম: সংখ্যা দিয়ে শুরু করা যাবে না, স্পেস দেওয়া যাবে না।
৪. কীওয়ার্ড: সি ভাষার সংরক্ষিত শব্দ (যেমন if, while)।
৫. ফরম্যাট স্পেসিফায়ার: %d, %f, %c ব্যবহার।

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

অধ্যায় ৫: প্রোগ্রামিং ভাষা - ডেটা টাইপ, চলক ও কীওয়ার্ড (বিস্তারিত আলোচনা)

পড়তে প্রায় 20 মিনিট

লেকচারের 'রান্নাঘরের কৌটা'র উদাহরণটি মনে আছে? বাস্তব জীবনে যেমন চাল, ডাল বা তেল রাখার জন্য ভিন্ন ভিন্ন ধরণের পাত্র বা কন্টেইনার প্রয়োজন হয়, তেমনি প্রোগ্রামিংয়েও বিভিন্ন ধরণের ডেটা মেমোরিতে সংরক্ষণের জন্য ভিন্ন ভিন্ন 'ডেটা টাইপ' প্রয়োজন। একটি পূর্ণসংখ্যা (যেমন ১০) এবং একটি দশমিক সংখ্যা (যেমন ১০.৫) কম্পিউটার মেমোরিতে একইভাবে সংরক্ষিত হয় না। এদের জায়গা বা মেমোরি স্পেস এবং প্রসেস করার পদ্ধতি ভিন্ন।

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

ডেটা টাইপ (Data Type) ও এর প্রকারভেদ

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

লেকচারে আমরা শুধুমাত্র ৪টি মৌলিক ডেটা টাইপ দেখেছি। কিন্তু পরীক্ষার 'খ' ও 'গ' বিভাগের প্রশ্নের জন্য ডেটা টাইপের পূর্ণাঙ্গ শ্রেণবিভাগ জানা জরুরি। সি ল্যাঙ্গুয়েজে ডেটা টাইপ প্রধানত ৪ প্রকার:

  1. মৌলিক (Primitive / Built-in): যা সরাসরি কম্পাইলারে দেওয়া থাকে। (যেমন: int, float, char, double)
  2. ডিরাইভড (Derived): যা মৌলিক টাইপ থেকে তৈরি হয়। (যেমন: Array, Pointer, Function)
  3. ইউজার ডিফাইন্ড (User Defined): যা ব্যবহারকারী নিজের প্রয়োজনমতো তৈরি করে। (যেমন: Structure, Union, Enum)
  4. ফাঁকা (Void): যার কোনো মান নেই।

ডেটা টাইপের প্রকারভেদ

সংজ্ঞা (Definition): ডেটা টাইপ

সি প্রোগ্রামে ব্যবহৃত ডেটা বা তথ্যের ধরন, মেমোরি সাইজ এবং রেঞ্জ নির্দিষ্ট করার প্রক্রিয়াকে ডেটা টাইপ বলে। এটি কম্পাইলারকে নির্দেশ দেয় যে মেমোরিতে কত বাইট জায়গা বরাদ্দ করতে হবে।

গুরুত্বপূর্ণ (Important):
- লেকচারে আলোচিত int, float, char, double হলো 'মৌলিক' বা Primitive ডেটা টাইপ।
- Array, Pointer, Function হলো 'ডিরাইভড' ডেটা টাইপ।
- Structure, Union, Enum হলো 'ইউজার ডিফাইন্ড' ডেটা টাইপ।
- MCQ-তে প্রায়ই আসে "নিচের কোনটি ইউজার ডিফাইন্ড ডেটা টাইপ?" উত্তর হবে Structure বা Union।

মৌলিক ডেটা টাইপ: মেমোরি সাইজ ও রেঞ্জ

সি প্রোগ্রামে বহুল ব্যবহৃত চারটি মৌলিক ডেটা টাইপ হলো char, int, float, এবং double। এদের মেমোরি সাইজ এবং রেঞ্জ জানা খুবই জরুরি, কারণ এর ওপর ভিত্তি করেই মেমোরি অপচয় রোধ করা যায়।

নিচের ছকটি খুব ভালো করে লক্ষ্য করো (৩২-বিট কম্পাইলারের জন্য):

ডেটা টাইপ বর্ণনা মেমোরি সাইজ ফরম্যাট স্পেসিফায়ার রেঞ্জ (Range)
char অক্ষর বা ক্যারেক্টার ১ বাইট (8 bits) %c -128 থেকে +127
int পূর্ণসংখ্যা ২ বা ৪ বাইট %d -32,768 থেকে +32,767
float দশমিক সংখ্যা ৪ বাইট %f 3.4E-38 থেকে 3.4E+38
double বড় দশমিক সংখ্যা ৮ বাইট %lf 1.7E-308 থেকে 1.7E+308
void মানহীন ০ বাইট নেই মান নেই

সাইনড (Signed) ও আনসাইনড (Unsigned) এর ধারণা:
স্বাভাবিকভাবে সব পূর্ণসংখ্যা টাইপ (int, char) 'Signed' হয়, অর্থাৎ এরা ধনাত্মক (+) ও ঋণাত্মক (-) উভয় মান রাখতে পারে। কিন্তু যদি আমরা ভেরিয়েবলের আগে unsigned কীওয়ার্ড ব্যবহার করি, তবে সেটি শুধু ধনাত্মক মান রাখবে এবং এর রেঞ্জ দ্বিগুণ হয়ে যাবে।


উদাহরণ: unsigned int শুধু পজিটিভ সংখ্যা রাখে, তাই এর রেঞ্জ 0 থেকে 65,535 পর্যন্ত।

ফ্লোট (float) বনাম ডাবল (double)

পরীক্ষায় প্রায়ই প্রশ্ন আসে: "দশমিক সংখ্যার জন্য কখন float এবং কখন double ব্যবহার করব?"

পার্থক্য: float বনাম double 1. মেমোরি: float মেমোরিতে ৪ বাইট জায়গা নেয়, কিন্তু double নেয় ৮ বাইট। 2. প্রিসিশন (Precision): float দশমিকের পর ৬ ঘর পর্যন্ত সঠিক মান দিতে পারে। double দশমিকের পর ১৫ ঘর পর্যন্ত নির্ভুল মান দেয়। 3. ব্যবহার: সাধারণ হিসাবের জন্য float যথেষ্ট। কিন্তু বৈজ্ঞানিক হিসাব বা অতি সূক্ষ্ম মানের জন্য double ব্যবহার করা শ্রেয়।

চলক বা ভেরিয়েবল (Variable) বিস্তারিত

প্রোগ্রামিংয়ের সময় আমাদের ডেটাগুলোকে মেমোরিতে কোথাও না কোথাও রাখতে হয়। মেমোরির যেই নির্দিষ্ট ঠিকানায় বা পাত্রে আমরা ডেটা রাখি, সেই পাত্রের নামই হলো চলক বা Variable। প্রোগ্রামে এর মান পরিবর্তন করা যায় বলেই একে 'ভেরিয়েবল' বলা হয়।

সংজ্ঞা (Definition): চলক বা Variable

চলক হলো মেমোরি লোকেশনের একটি নাম বা ঠিকানা, যেখানে ডেটা বা মান সংরক্ষণ করা হয় এবং প্রোগ্রাম নির্বাহের সময় যার মান পরিবর্তন হতে পারে।

ভেরিয়েবল ডিক্লেয়ার করার নিয়ম (Syntax):

data_type variable_name;
data_type variable_name = value; // মানসহ ডিক্লেয়ারেশন

উদাহরণ:

int age = 18;
float marks = 85.5;
char section = 'A';
লোকাল (Local) ও গ্লোবাল (Global) ভেরিয়েবল

লেকচারে আমরা শুধু ভেরিয়েবল দেখেছি, কিন্তু এর অবস্থান বা স্কোপ (Scope) অনুযায়ী এটি দুই প্রকার। এটি পরীক্ষার জন্য অত্যন্ত গুরুত্বপূর্ণ একটি টপিক।

উদাহরণ (Example): লোকাল বনাম গ্লোবাল

#include <stdio.h>

int globalVar = 100; // গ্লোবাল ভেরিয়েবল (সব ফাংশনের বাইরে)

void display() {
    printf("%d", globalVar); // এখানে globalVar কাজ করবে
}

int main() {
    int localVar = 10; // লোকাল ভেরিয়েবল (ফাংশনের ভেতরে)

    printf("%d", localVar);  // এটি কাজ করবে
    printf("%d", globalVar); // এটিও কাজ করবে
    return 0;
}

পরীক্ষার টিপস (Exam Tip):
অনুধাবনমূলক প্রশ্নে আসতে পারে "লোকাল ও গ্লোবাল ভেরিয়েবলের মধ্যে পার্থক্য লিখ"
- লোকাল ভেরিয়েবল: কোনো নির্দিষ্ট ফাংশনের ভেতরে ঘোষণা করা হয় এবং শুধুমাত্র ওই ফাংশনের ভেতরেই কাজ করে।
- গ্লোবাল ভেরিয়েবল: সকল ফাংশনের বাইরে (সাধারণত main এর আগে) ঘোষণা করা হয় এবং পুরো প্রোগ্রামের যেকোনো জায়গা থেকে ব্যবহার করা যায়।

চলক নামকরণের নিয়মাবলী ও সাধারণ ভুল

সি প্রোগ্রামে ভেরিয়েবলের নাম ইচ্ছেমতো দেওয়া যায় না। কিছু সুনির্দিষ্ট নিয়ম মেনে চলতে হয়। এই নিয়মগুলো ভঙ্গ করলে কম্পাইলার Syntax Error দেখাবে।

চলক নামকরণের প্রধান নিয়মসমূহ:
১. নাম অবশ্যই অক্ষর (a-z, A-Z) বা আন্ডারস্কোর (_) দিয়ে শুরু হতে হবে। কোনো সংখ্যা দিয়ে শুরু হতে পারবে না।
২. নামের মাঝে কোনো ফাঁকা স্থান (Space) রাখা যাবে না।
৩. নামের মধ্যে কোনো স্পেশাল ক্যারেক্টার (যেমন @, #, $, %, !) ব্যবহার করা যাবে না (শুধু _ বাদে)।
৪. সি ল্যাঙ্গুয়েজের কোনো কীওয়ার্ড (Keyword) (যেমন int, float, return) কে ভেরিয়েবলের নাম হিসেবে ব্যবহার করা যাবে না।
৫. সি ল্যাঙ্গুয়েজ Case Sensitive, তাই Total এবং total দুটি ভিন্ন ভেরিয়েবল হিসেবে গণ্য হবে।

নিচের ছকটি দেখে শুদ্ধ ও অশুদ্ধ নামগুলো চিনে নাও:

ভেরিয়েবলের নাম শুদ্ধ/অশুদ্ধ কারণ
student_age ✅ শুদ্ধ অক্ষর ও আন্ডারস্কোর ব্যবহৃত হয়েছে।
Roll_No_1 ✅ শুদ্ধ শেষে সংখ্যা ব্যবহার করা যাবে।
2ndPaper ❌ অশুদ্ধ সংখ্যা দিয়ে শুরু হয়েছে।
my name ❌ অশুদ্ধ মাঝখানে স্পেস আছে।
float ❌ অশুদ্ধ এটি একটি কীওয়ার্ড।
`total$` | ❌ অশুদ্ধ | স্পেশাল ক্যারেক্টার ($) আছে।

MCQ হ্যাক:
MCQ-তে প্রায়ই প্রশ্ন আসে "নিচের কোনটি বৈধ চলক?"। সবসময় খুঁজবে—শুরুতে সংখ্যা আছে কিনা, মাঝে স্পেস আছে কিনা বা সেটি কোনো কীওয়ার্ড কিনা। এই তিনটি বিষয় চেক করলেই ভুল উত্তর বাদ দেওয়া সহজ হবে।

কীওয়ার্ড (Keyword) ও ধ্রুবক (Constant)

কীওয়ার্ড (Keyword)

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

C Programming Keywords

সংজ্ঞা (Definition): কীওয়ার্ড

সি প্রোগ্রামে ব্যবহৃত কিছু সংরক্ষিত শব্দ (Reserved Words) যার নির্দিষ্ট অর্থ ও কাজ কম্পাইলারে পূর্বনির্ধারিত থাকে, তাকে কীওয়ার্ড বলে। যেমন: int, if, while, return ইত্যাদি।

ধ্রুবক (Constant)

প্রোগ্রামে এমন কিছু মান থাকে যা শুরু থেকে শেষ পর্যন্ত একই থাকে, কখনো পরিবর্তন হয় না। এদের কনস্ট্যান্ট বা ধ্রুবক বলে। যেমন: পাই ($\pi$) এর মান ৩.১৪১৬।

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

  1. const কীওয়ার্ড ব্যবহার করে:
const float PI = 3.1416;
  1. #define প্রি-প্রসেসর ব্যবহার করে:
#define PI 3.1416
পার্থক্য: ভেরিয়েবল ও কনস্ট্যান্ট 1. পরিবর্তনশীলতা: ভেরিয়েবলের মান প্রোগ্রাম চলাকালীন পরিবর্তন করা যায়, কিন্তু কনস্ট্যান্টের মান একবার সেট করার পর আর পরিবর্তন করা যায় না। 2. ঘোষণা: ভেরিয়েবল সাধারণ নিয়মে ঘোষণা করা হয় (int a;), কনস্ট্যান্টের ক্ষেত্রে const বা #define ব্যবহার করতে হয়।

সংক্ষিপ্ত সারাংশ (Quick Revision)

মনে রাখার মতো পয়েন্ট:
- ডেটা টাইপ ৪ প্রকার: মৌলিক, ডিরাইভড, ইউজার ডিফাইন্ড, এমপ্টি।
- মেমোরি সাইজ: char (১ বাইট), int (২/৪ বাইট), float (৪ বাইট), double (৮ বাইট)।
- ফরম্যাট স্পেসিফায়ার: int (%d), float (%f), char (%c), double (%lf)।
- চলক নামকরণ: সংখ্যা দিয়ে শুরু করা যাবে না, স্পেস দেওয়া যাবে না, কীওয়ার্ড ব্যবহার করা যাবে না।
- কনস্ট্যান্ট: এর মান অপরিবর্তনশীল। const বা #define দিয়ে তৈরি করা হয়।

পরিভাষা (Glossary)

পরিভাষা (Term) সংজ্ঞা (Definition)
Data Type ডেটার ধরন ও মেমোরি সাইজ নির্ধারণকারী নির্দেশক।
Variable মেমোরিতে ডেটা রাখার নামযুক্ত স্থান যার মান পরিবর্তনশীল।
Keyword কম্পাইলারের জন্য সংরক্ষিত বিশেষ শব্দ যা ভেরিয়েবল হিসেবে ব্যবহার নিষিদ্ধ।
Format Specifier ইনপুট/আউটপুটে ডেটার ধরন বোঝানোর চিহ্ন (যেমন %d পূর্ণসংখ্যার জন্য)।
Constant প্রোগ্রামে ব্যবহৃত এমন মান যা পরিবর্তন করা যায় না।
Local Variable নির্দিষ্ট ফাংশনের ভেতরে ঘোষিত চলক যা শুধু সেখানেই কাজ করে।
Global Variable ফাংশনের বাইরে ঘোষিত চলক যা পুরো প্রোগ্রামে কাজ করে।

অনুশীলনের প্রশ্ন

সৃজনশীল প্রশ্ন

সৃজনশীল প্রশ্ন ১

তমা সি ভাষায় একটি প্রোগ্রাম লিখছিল যেখানে সে শিক্ষার্থীদের রোল নম্বর (যেমন- ১০১), জিপিএ (যেমন- ৪.৫০) এবং গ্রেড (যেমন- 'A') সংরক্ষণ করতে চায়। সে সবগুলোর জন্য int ডেটা টাইপ ব্যবহার করায় জিপিএ এবং গ্রেড এর মান সঠিকভাবে প্রদর্শিত হচ্ছে না। রোল নম্বর ঠিক থাকলেও বাকি তথ্যগুলো ভুল আসছে।

ক) চলক (Variable) কী?
খ) সি ভাষাকে 'Case Sensitive' ভাষা বলা হয় কেন?
গ) উদ্দীপকে তমার সমস্যাটি ব্যাখ্যা করে সঠিক ডেটা টাইপ নির্বাচন করে দেখাও।
ঘ) মেমোরি ব্যবহারের দিক থেকে তমার নির্বাচিত ডেটা টাইপ এবং সঠিক ডেটা টাইপের তুলনামূলক বিশ্লেষণ কর।

উত্তর

(ক) মেমোরি লোকেশনের নাম বা ঠিকানা, যেখানে ডেটা বা মান সংরক্ষণ করা হয় এবং প্রোগ্রামের প্রয়োজনে যার মান পরিবর্তন করা যায়, তাকে চলক বা ভেরিয়েবল (Variable) বলে।

(খ) সি ভাষায় ইংরেজি বড় হাতের অক্ষর (Uppercase) এবং ছোট হাতের অক্ষর (Lowercase) কে আলাদা অর্থ বা সত্তা হিসেবে গণ্য করা হয়। যেমন- Total এবং total সি কম্পাইলারের কাছে দুটি ভিন্ন ভেরিয়েবল। এই বৈশিষ্ট্যর কারণেই সি ভাষাকে 'Case Sensitive' ভাষা বলা হয়।

(গ) উদ্দীপকে তমা জিপিএ (ভগ্নাংশ) এবং গ্রেড (অক্ষর) সংরক্ষণের জন্যও int (পূর্ণসংখ্যা) ডেটা টাইপ ব্যবহার করেছে। int টাইপ শুধুমাত্র পূর্ণসংখ্যা সংরক্ষণ করতে পারে, দশমিক বা অক্ষর নয়। তাই ৪.৫০ ইনপুট দিলে এটি শুধু ৪ গ্রহণ করেছে এবং 'A' এর ক্ষেত্রে এর ASCII মান বা গার্বেজ ভ্যালু দেখিয়েছে।

তমার সমস্যা সমাধানে সঠিক ডেটা টাইপ নির্বাচন নিচে দেওয়া হলো:
১. রোল নম্বরের জন্য int সঠিক আছে (কারণ এটি পূর্ণসংখ্যা)।
২. জিপিএ (৪.৫০) এর জন্য float বা double ব্যবহার করতে হবে।
৩. গ্রেড ('A') এর জন্য char ব্যবহার করতে হবে।

উদাহরণ কোড স্নিপেট:

int roll = 101;
float gpa = 4.50;
char grade = 'A';

(ঘ) উদ্দীপকে তমা সবগুলোর জন্য int ব্যবহার করেছিল। স্ট্যান্ডার্ড সি কম্পাইলারে (৩২/৬৪ বিট) int সাধারণত ৪ বাইট মেমোরি দখল করে।
তমার ভুল পদ্ধতিতে মোট মেমোরি লাগত:
- রোল (int): ৪ বাইট
- জিপিএ (int): ৪ বাইট
- গ্রেড (int): ৪ বাইট
মোট = ১২ বাইট।

কিন্তু সঠিক ডেটা টাইপ ব্যবহার করলে মেমোরি লাগত:
- রোল (int): ৪ বাইট
- জিপিএ (float): ৪ বাইট
- গ্রেড (char): ১ বাইট
মোট = ৯ বাইট।

বিশ্লেষণ: সঠিক ডেটা টাইপ ব্যবহার করলে ৩ বাইট মেমোরি সাশ্রয় হতো এবং তথ্যের সঠিকতা বজায় থাকত। char টাইপের জন্য ১ বাইট প্রয়োজন হলেও তমা ৪ বাইট বরাদ্দ করে মেমোরি অপচয় করেছে এবং float এর জায়গায় int ব্যবহার করে ডেটার (ভগ্নাংশ অংশ) ক্ষতি করেছে। সুতরাং, সঠিক ডেটা টাইপ নির্বাচন মেমোরি অপটিমাইজেশন এবং ডেটার নির্ভুলতার জন্য অপরিহার্য।


সৃজনশীল প্রশ্ন ২

আইসিটি ব্যবহারিক ক্লাসে শিক্ষক ছাত্রদের ভেরিয়েবল ডিক্লেয়ার করতে বললেন। ছাত্ররা int, student name, 1st_Result, total_marks এবং _score নামগুলো ব্যবহার করল। শিক্ষক বললেন এর মধ্যে কিছু নাম সঠিক নয় এবং কিছু নাম সঠিক। তিনি ভেরিয়েবল নামকরণের নিয়মগুলো পুনরায় বুঝিয়ে বললেন।

ক) কীওয়ার্ড (Keyword) কী?
খ) floatdouble এর মধ্যে পার্থক্য কী?
গ) উদ্দীপকের অবৈধ ভেরিয়েবল নামগুলো চিহ্নিত করে কেন সেগুলো অবৈধ তা ব্যাখ্যা কর।
ঘ) উদ্দীপকের সঠিক নামগুলো ব্যবহারের যৌক্তিকতা এবং ভেরিয়েবল নামকরণের নিয়মাবলি উদাহরণসহ বিশ্লেষণ কর।

উত্তর

(ক) কীওয়ার্ড হলো সি ভাষার কিছু সংরক্ষিত শব্দ (Reserved Words) যার নির্দিষ্ট অর্থ এবং কাজ কম্পাইলারের কাছে আগে থেকেই নির্ধারিত থাকে। যেমন- int, float, if, else ইত্যাদি।

(খ) floatdouble উভয়ই ভগ্নাংশ বা রিয়েল নম্বর সংরক্ষণের জন্য ব্যবহৃত হয়, তবে তাদের মধ্যে প্রধান পার্থক্য হলো আকার ও প্রিসিশনে।
১. float মেমোরিতে ৪ বাইট জায়গা নেয় এবং দশমিকের পর ৬ ঘর পর্যন্ত নির্ভুল মান দিতে পারে।
২. double মেমোরিতে ৮ বাইট জায়গা নেয় এবং দশমিকের পর ১৪-১৫ ঘর পর্যন্ত নির্ভুল মান দিতে পারে। বড় ও সূক্ষ্ম গাণিতিক হিসাবে double বেশি উপযোগী।

(গ) উদ্দীপকে ব্যবহৃত ভেরিয়েবল নামগুলোর মধ্যে অবৈধ নামগুলো হলো:
১. int: এটি একটি কীওয়ার্ড। সি ভাষায় কোনো কীওয়ার্ডকে ভেরিয়েবল নাম হিসেবে ব্যবহার করা যায় না।
২. student name: এই নামে মাঝখানে ফাঁকা স্থান (Space) আছে। ভেরিয়েবল নামের মাঝে স্পেস বা ফাঁকা জায়গা রাখা অবৈধ।
৩. 1st_Result: এই নামটি সংখ্যা (1) দিয়ে শুরু হয়েছে। ভেরিয়েবল নাম অবশ্যই অক্ষর বা আন্ডারস্কোর দিয়ে শুরু হতে হবে, সংখ্যা দিয়ে শুরু করা যাবে না।

(ঘ) উদ্দীপকে সঠিক ভেরিয়েবল নামগুলো হলো total_marks এবং _score
যৌক্তিকতা ও নিয়মাবলি বিশ্লেষণ:
১. total_marks: এটি সঠিক কারণ এতে শুধু অক্ষর এবং আন্ডারস্কোর ব্যবহৃত হয়েছে। দুটি শব্দের মধ্যে সংযোগের জন্য আন্ডারস্কোর ব্যবহার একটি উত্তম প্র্যাকটিস (Snake Case)।
২. _score: এটি সঠিক কারণ ভেরিয়েবল নাম আন্ডারস্কোর (_) দিয়ে শুরু করা বৈধ। সাধারণত সিস্টেম ভেরিয়েবল বা বিশেষ ভেরিয়েবলের ক্ষেত্রে এটি ব্যবহৃত হয়।

ভেরিয়েবল নামকরণের নিয়মাবলি:
- ভেরিয়েবল নাম অক্ষর (a-z, A-Z), অঙ্ক (0-9) এবং আন্ডারস্কোর (_) এর সমন্বয়ে হতে পারে।
- নাম অবশ্যই অক্ষর বা আন্ডারস্কোর দিয়ে শুরু হতে হবে।
- কোনো কীওয়ার্ড (যেমন char, for) ব্যবহার করা যাবে না।
- নামের মাঝে কোনো স্পেস বা বিশেষ ক্যারেক্টার (যেমন #, @, $) ব্যবহার করা যাবে না।
- সি ভাষা কেস সেন্সিটিভ, তাই mark এবং Mark আলাদা ভেরিয়েবল।


সৃজনশীল প্রশ্ন ৩

রফিক বৃত্তের ক্ষেত্রফল নির্ণয়ের জন্য একটি প্রোগ্রাম লিখল যেখানে সে PI এর মান ৩.১৪১৬ ব্যবহার করতে চায়। সে PI কে সাধারণ চলক float PI = 3.1416; হিসেবে ঘোষণা করল। কিন্তু বড় কোড লিখতে গিয়ে প্রোগ্রামের অন্য এক জায়গায় সে ভুল করে PI = 3.0; লিখে ফেলল, ফলে তার ক্ষেত্রফলের ফলাফল ভুল এল। তার বন্ধু বলল, "ধ্রুবক (Constant) ব্যবহার করলে এমন ভুল হতো না।"

ক) এস্কেপ সিকোয়েন্স (Escape Sequence) কী?
খ) গ্লোবাল ও লোকাল ভেরিয়েবলের মধ্যে পার্থক্য লেখ।
গ) উদ্দীপকে রফিকের বন্ধুর পরামর্শ অনুযায়ী ধ্রুবক (Constant) ঘোষণা করার পদ্ধতি ব্যাখ্যা কর।
ঘ) const কোয়ালিফায়ার এবং #define প্রি-প্রসেসর ডিরেক্টিভ ব্যবহার করে ধ্রুবক তৈরির পদ্ধতির তুলনামূলক বিশ্লেষণ কর।

উত্তর

(ক) এস্কেপ সিকোয়েন্স হলো ব্যাকস্ল্যাশ (\) দিয়ে শুরু হওয়া বিশেষ কিছু ক্যারেক্টার যা প্রিন্ট করার সময় দৃশ্যমান হয় না কিন্তু আউটপুটকে বিশেষভাবে বিন্যস্ত করে। যেমন- নতুন লাইনের জন্য \n, ট্যাবের জন্য \t

(খ) লোকাল ভেরিয়েবল: কোনো ফাংশনের ভেতরে ডিক্লেয়ার করা হয় এবং শুধুমাত্র সেই ফাংশনের ভেতরেই কাজ করে। ফাংশন শেষ হলে এর অস্তিত্ব থাকে না।
গ্লোবাল ভেরিয়েবল: সব ফাংশনের বাইরে (সাধারণত শুরুতে) ডিক্লেয়ার করা হয় এবং প্রোগ্রামের যেকোনো জায়গা থেকে একে অ্যাক্সেস বা ব্যবহার করা যায়। প্রোগ্রাম শেষ না হওয়া পর্যন্ত এর অস্তিত্ব থাকে।

(গ) রফিকের সমস্যা হলো PI এর মান দুর্ঘটনাবশত পরিবর্তন হয়ে যাওয়া। ধ্রুবক বা Constant ব্যবহার করলে এর মান প্রোগ্রাম চলাকালীন পরিবর্তন করা যায় না।
রফিক দুইভাবে ধ্রুবক ঘোষণা করতে পারে:
১. const কিওয়ার্ড ব্যবহার করে:

const float PI = 3.1416;

এক্ষেত্রে PI এর মান ফিক্সড হয়ে যাবে। পরবর্তীতে PI = 3.0; লিখলে কম্পাইলার এরর (Error) দেখাবে এবং ভুল মান অ্যাসাইন করতে দেবে না।

(ঘ) সি ভাষায় ধ্রুবক তৈরির দুটি প্রধান পদ্ধতি হলো const কিওয়ার্ড এবং #define ম্যাক্রো।
১. const কিওয়ার্ড:
- এটি মেমোরিতে জায়গা দখল করে (চলকের মতোই)।
- কম্পাইলার একে ডেটা টাইপসহ চেক করে (Type Checking)।
- এটি স্কোপ রুলস (Scope rules) মেনে চলে।
- উদাহরণ: const float PI = 3.1416;

২. #define প্রি-প্রসেসর:
- এটি মেমোরিতে কোনো ভেরিয়েবল তৈরি করে না, বরং কম্পাইলেশনের আগে টেক্সট রিপ্লেসমেন্ট করে।
- এর কোনো নির্দিষ্ট ডেটা টাইপ নেই এবং মেমোরি এড্রেস হয় না।
- সেমিকোলন (;) ব্যবহার করতে হয় না।
- উদাহরণ: #define PI 3.1416

বিশ্লেষণ: রফিকের ক্ষেত্রে উভয় পদ্ধতিই কাজ করবে। তবে ডিবাগিং এবং টাইপ সেফটির (Type Safety) জন্য const ব্যবহার করা আধুনিক সি প্রোগ্রামিংয়ে বেশি নিরাপদ ও উত্তম। অন্যদিকে মেমোরি বাঁচানো এবং দ্রুত রিপ্লেসমেন্টের জন্য #define ব্যবহৃত হয়। ছোট প্রোগ্রামের জন্য #define সহজ, কিন্তু বড় ও জটিল প্রজেক্টে const বেশি নির্ভরযোগ্য।

এমসিকিউ

১। ANSI সি ভাষায় int ডেটা টাইপ মেমোরিতে কত বাইট জায়গা দখল করে?

ক) ১ বাইট
খ) ২ বাইট
গ) ৪ বাইট
ঘ) ৮ বাইট

সঠিক উত্তর: খ) ২ বাইট

ব্যাখ্যা: ANSI সি স্ট্যান্ডার্ড অনুযায়ী ১৬-বিট মেশিনে int ২ বাইট এবং ৩২/৬৪-বিট মেশিনে ৪ বাইট জায়গা নেয়। তবে পাঠ্যবই অনুসারে সাধারণ ইন্টিজার ২ বাইট হিসেবে ধরা হয়।


২। float টাইপের ডেটার জন্য ফরম্যাট স্পেসিফায়ার কোনটি?

ক) %d
খ) %c
গ) %f
ঘ) %lf

সঠিক উত্তর: গ) %f

ব্যাখ্যা: float বা ভগ্নাংশ যুক্ত সংখ্যার জন্য %f এবং double এর জন্য %lf ফরম্যাট স্পেসিফায়ার ব্যবহৃত হয়।


৩। নিচের কোনটি সঠিক চলক (Variable) নাম?

ক) 1st_number
খ) roll no
গ) total_marks
ঘ) case

সঠিক উত্তর: গ) total_marks

ব্যাখ্যা: চলকের নাম সংখ্যা দিয়ে শুরু হতে পারে না (ক ভুল), মাঝে স্পেস থাকতে পারে না (খ ভুল) এবং কি-ওয়ার্ড হতে পারে না (ঘ ভুল)। তাই total_marks সঠিক।


৪। সি ভাষায় ক্যারেক্টার (char) ডেটা টাইপের রেঞ্জ কত?

ক) 0 to 255
খ) -128 to 127
গ) -32768 to 32767
ঘ) 3.4E-38 to 3.4E+38

সঠিক উত্তর: খ) -128 to 127

ব্যাখ্যা: signed char ১ বাইট মেমোরি নেয় এবং এর রেঞ্জ -১২৮ থেকে +১২৭ পর্যন্ত। unsigned char এর রেঞ্জ ০ থেকে ২৫৫।


৫। ডাবল (double) ডেটা টাইপ মেমোরিতে কত বাইট জায়গা নেয়?

ক) ২ বাইট
খ) ৪ বাইট
গ) ৮ বাইট
ঘ) ১০ বাইট

সঠিক উত্তর: গ) ৮ বাইট

ব্যাখ্যা: double বা দ্বিগুণ প্রিসিশন ফ্লোটিং পয়েন্ট নম্বরের জন্য মেমোরিতে ৮ বাইট জায়গা বরাদ্দ থাকে।


৬। নিচের কোনটি সি ভাষার কি-ওয়ার্ড (Keyword) নয়?

ক) main
খ) if
গ) while
ঘ) return

সঠিক উত্তর: ক) main

ব্যাখ্যা: main হলো একটি ইউজার ডিফাইনড ফাংশন বা আইডেন্টিফায়ার (Identifier)। বাকিগুলো সি ভাষার সংরক্ষিত কি-ওয়ার্ড।


৭। স্ট্রিং (String) ডেটা টাইপের শেষে স্বয়ংক্রিয়ভাবে কোন ক্যারেক্টার যুক্ত হয়?

ক) \0
খ) \n
গ) \t
ঘ) \r

সঠিক উত্তর: ক) \0

ব্যাখ্যা: সি ভাষায় স্ট্রিংয়ের সমাপ্তি নির্দেশ করতে নাল ক্যারেক্টার (\0) স্বয়ংক্রিয়ভাবে যুক্ত হয়।


৮। চলকের মান অপরিবর্তিত রাখতে কোনটি ব্যবহার করা হয়?

ক) static
খ) const
গ) volatile
ঘ) register

সঠিক উত্তর: খ) const

ব্যাখ্যা: const কিওয়ার্ড ব্যবহার করে চলক ঘোষণা করলে প্রোগ্রাম চলাকালীন এর মান পরিবর্তন করা যায় না, অর্থাৎ এটি ধ্রুবক হিসেবে কাজ করে।


৯। scanf() ফাংশনে & চিহ্নটি কেন ব্যবহৃত হয়?

ক) মান প্রিন্ট করতে
খ) মেমোরি এড্রেস নির্দেশ করতে
গ) মান যোগ করতে
ঘ) পয়েন্টার ডিক্লেয়ার করতে

সঠিক উত্তর: খ) মেমোরি এড্রেস নির্দেশ করতে

ব্যাখ্যা: scanf() ফাংশনে ভেরিয়েবলের মেমোরি লোকেশন বা এড্রেস বোঝাতে & (Address of operator) ব্যবহৃত হয়।


১০। নিচের কোনটি গ্লোবাল ভেরিয়েবলের বৈশিষ্ট্য?

ক) ফাংশনের ভেতরে ডিক্লেয়ার করা হয়
খ) শুধু ওই ফাংশনেই কাজ করে
গ) মেইন ফাংশনের বাইরে ডিক্লেয়ার করা হয়
ঘ) মেমোরি কম ব্যবহার করে

সঠিক উত্তর: গ) মেইন ফাংশনের বাইরে ডিক্লেয়ার করা হয়

ব্যাখ্যা: গ্লোবাল ভেরিয়েবল যেকোনো ফাংশনের বাইরে (সাধারণত শুরুতে) ডিক্লেয়ার করা হয় এবং পুরো প্রোগ্রামে যেকোনো জায়গা থেকে ব্যবহার করা যায়।


১১। নিচের কোডটির আউটপুট কী হবে?

int a = 5;
float b = 2.5;
printf("%d", a + (int)b);

ক) 7.5
খ) 7
গ) 52.5
ঘ) Error

সঠিক উত্তর: খ) 7

ব্যাখ্যা: এখানে টাইপ কাস্টিং (int)b এর কারণে ২.৫ পূর্ণসংখ্যা ২-এ রূপান্তরিত হয়েছে। তাই ৫ + ২ = ৭ প্রিন্ট হবে।


১২। long double ডেটা টাইপের ফরম্যাট স্পেসিফায়ার কোনটি?

ক) %ld
খ) %Lf
গ) %f
ঘ) %lf

সঠিক উত্তর: খ) %Lf

ব্যাখ্যা: long double এর জন্য %Lf (বড় হাতের L) ব্যবহৃত হয়। %ld লং ইন্টিজারের জন্য এবং %lf ডাবলের জন্য।


১৩। সি ভাষায় চলক নামকরণের ক্ষেত্রে—
i. প্রথম অক্ষর অবশ্যই বর্ণ হতে হবে
ii. আন্ডারস্কোর (_) ব্যবহার করা যাবে
iii. কোনো বিশেষ চিহ্ন (Special Character) ব্যবহার করা যাবে না

নিচের কোনটি সঠিক?

ক) i ও ii
খ) i ও iii
গ) ii ও iii
ঘ) i, ii ও iii

সঠিক উত্তর: ঘ) i, ii ও iii

ব্যাখ্যা: চলক নামের শুরুতে সংখ্যা হতে পারে না, তবে বর্ণ বা আন্ডারস্কোর হতে পারে। বিশেষ ক্যারেক্টার (যেমন @, #) নিষিদ্ধ।


১৪। ডেটা টাইপ ডিক্লেয়ারেশনের ক্ষেত্রে—
i. float মেমোরিতে ৪ বাইট জায়গা নেয়
ii. char মেমোরিতে ১ বাইট জায়গা নেয়
iii. void কোনো মান রিটার্ন করে না

নিচের কোনটি সঠিক?

ক) i ও ii
খ) i ও iii
গ) ii ও iii
ঘ) i, ii ও iii

সঠিক উত্তর: ঘ) i, ii ও iii

ব্যাখ্যা: তিনটি তথ্যই সঠিক। void সাধারণত ফাংশনের রিটার্ন টাইপ হিসেবে ব্যবহৃত হয় যা কোনো মান ফেরত দেয় না।


১৫। এসকেপ সিকোয়েন্স (Escape Sequence) এর উদাহরণ হলো—
i. \n
ii. \t
iii. \a

নিচের কোনটি সঠিক?

ক) i ও ii
খ) i ও iii
গ) ii ও iii
ঘ) i, ii ও iii

সঠিক উত্তর: ঘ) i, ii ও iii

ব্যাখ্যা: \n (নিউ লাইন), \t (ট্যাব), এবং \a (এলার্ট বা বেল) সবই সি ভাষার বৈধ এসকেপ সিকোয়েন্স।


১৬। নিচের উদ্দীপকটি পড় এবং প্রশ্নের উত্তর দাও:
#define PI 3.1416
প্রোগ্রামের শুরুতে এই লাইনটি লেখা হলো।

PI কে কী বলা হয়?

ক) লোকাল ভেরিয়েবল
খ) গ্লোবাল ভেরিয়েবল
গ) সিম্বলিক কনস্ট্যান্ট
ঘ) স্ট্যাটিক ভেরিয়েবল

সঠিক উত্তর: গ) সিম্বলিক কনস্ট্যান্ট

ব্যাখ্যা: #define দিয়ে ডিফাইন করা কনস্ট্যান্টকে ম্যাক্রো বা সিম্বলিক কনস্ট্যান্ট বলা হয়।


১৭। উদ্দীপকের PI ব্যবহারের সুবিধা কী?
i. মেমোরি কম লাগে
ii. প্রোগ্রামের যেকোনো জায়গায় মান পরিবর্তন করা যায়
iii. কোড রিডেবিলিটি বাড়ে

নিচের কোনটি সঠিক?

ক) i ও ii
খ) i ও iii
গ) ii ও iii
ঘ) i, ii ও iii

সঠিক উত্তর: খ) i ও iii

ব্যাখ্যা: সিম্বলিক কনস্ট্যান্টের মান রান টাইমে পরিবর্তন করা যায় না (ii ভুল)। এটি কোড বুঝতে সাহায্য করে এবং সরাসরি মান ব্যবহারের চেয়ে ভালো।


১৮। নিচের কোডটির আউটপুট কী?

int x = 10;
printf("%d %d", x, x++);

(কম্পাইলার ভেদে ভিন্ন হতে পারে, তবে সাধারণ স্ট্যাক নিয়ম অনুযায়ী)

ক) 10 10
খ) 10 11
গ) 11 10
ঘ) 11 11

সঠিক উত্তর: গ) 11 10

ব্যাখ্যা: printf আর্গুমেন্ট ডান থেকে বামে ইভালুয়েট করে (অধিকাংশ কম্পাইলারে)। তাই প্রথমে x++ (মান ১০ প্রিন্ট হবে, পরে ১১ হবে), তারপর x (মান ১১) প্রিন্ট হবে। (এটি আনডিফাইনড বিহেভিয়ার হতে পারে, তবে পাঠ্যবই অনুযায়ী এই লজিক দেওয়া থাকে)।


১৯। নিচের কোনটি ইউজার ডিফাইনড ডেটা টাইপ?

ক) int
খ) float
গ) enum
ঘ) double

সঠিক উত্তর: গ) enum

ব্যাখ্যা: enum, structure, union হলো ইউজার ডিফাইনড ডেটা টাইপ। বাকিগুলো প্রাইমারি বা বিল্ট-ইন ডেটা টাইপ।


২০। short int এর রেঞ্জ কত?

ক) -32768 to 32767
খ) -2147483648 to 2147483647
গ) 0 to 65535
ঘ) -128 to 127

সঠিক উত্তর: ক) -32768 to 32767

ব্যাখ্যা: short int সাধারণত ২ বাইট মেমোরি নেয় এবং সাইনড (signed) অবস্থায় এর রেঞ্জ -৩২৭৬৮ থেকে +৩২৭৬৭।


২১। unsigned int এ ঋণাত্মক সংখ্যা ইনপুট দিলে কী হবে?

ক) এরর দেখাবে
খ) ধনাত্মক মানে রূপান্তরিত হবে
গ) গার্বেজ ভ্যালু দেখাবে
ঘ) প্রোগ্রাম বন্ধ হয়ে যাবে

সঠিক উত্তর: গ) গার্বেজ ভ্যালু দেখাবে

ব্যাখ্যা: unsigned ভেরিয়েবলে ঋণাত্মক মান রাখলে তা মেমোরিতে ২'স কমপ্লিমেন্ট আকারে সংরক্ষিত বড় একটি ধনাত্মক সংখ্যা (গার্বেজ) হিসেবে প্রদর্শিত হবে।


২২। নিচের উদ্দীপকটি লক্ষ্য কর:

char ch;
scanf("%c", &ch);

ইনপুট হিসেবে 'A' দিলে মেমোরিতে কী সংরক্ষিত হবে?

ক) A
খ) 65
গ) a
ঘ) 97

সঠিক উত্তর: খ) 65

ব্যাখ্যা: কম্পিউটারের মেমোরিতে ক্যারেক্টার সরাসরি থাকে না, এর ASCII মান সংরক্ষিত হয়। 'A' এর ASCII মান ৬৫।


২৩। সি ভাষায় বুলিয়ান (Boolean) ডেটা টাইপ সরাসরি আছে কি?

ক) হ্যাঁ
খ) না
গ) শুধু C++ এ আছে
ঘ) হেডার ফাইল stdbool.h ছাড়া নেই

সঠিক উত্তর: ঘ) হেডার ফাইল stdbool.h ছাড়া নেই

ব্যাখ্যা: প্রমিত সি (C99 এর আগে) ভাষায় সরাসরি bool টাইপ ছিল না। C99 স্টান্ডার্ডে <stdbool.h> হেডার ফাইলের মাধ্যমে bool ব্যবহার করা যায়। সাধারণত ০ কে মিথ্যা এবং অশূন্য মানকে সত্য ধরা হয়।


২৪। মেমোরি এড্রেস রাখার জন্য কোন ধরনের চলক ব্যবহৃত হয়?

ক) int
খ) float
গ) pointer
ঘ) array

সঠিক উত্তর: গ) pointer

ব্যাখ্যা: পয়েন্টার (Pointer) হলো বিশেষ ধরণের চলক যা অন্য কোনো চলকের মেমোরি এড্রেস সংরক্ষণ করে।


২৫। 3.14 সংখ্যাটি ডিফল্ট হিসেবে কোন টাইপের?

ক) float
খ) double
গ) long double
ঘ) int

সঠিক উত্তর: খ) double

ব্যাখ্যা: সি ভাষায় দশমিক বা ভগ্নাংশ যুক্ত সংখ্যাকে ডিফল্টভাবে double হিসেবে গণ্য করা হয়। একে float করতে চাইলে শেষে f বা F যুক্ত করতে হয় (যেমন 3.14f)।