সি প্রোগ্রামিং লেকচার শিট (C Programming Lecture Sheet) বিষয়: ডেটাটাইপ (Data Types), ভেরিয়েবল (Variables) এবং পূর্ণাঙ্গ প্রজেক্ট বাস্তবায়ন |
কোর্স: C Programming & Computer Fundamentals | লেভেল: শিক্ষানবিস থেকে এডভান্সড | ফরম্যাট: হ্যান্ডআউট ও রেফারেন্স গাইড
১. সি প্রোগ্রামে ডেটাটাইপ (Data Types in C)
সি প্রোগ্রামিং ভাষায় ডেটাটাইপ (Data Type) একটি অত্যন্ত গুরুত্বপূর্ণ ধারণা। প্রোগ্রাম চালানোর সময় মেমোরিতে কী ধরনের তথ্য বা ডেটা জমা হবে এবং সেই ডেটার ওপর কী ধরনের অপারেশন (যেমন: গাণিতিক বা যুক্তিযুক্ত কাজ) চালানো যাবে, তা ডেটাটাইপ দ্বারা নির্ধারিত হয়।
💡 ডেটাটাইপের মূল উদ্দেশ্য: ডেটাটাইপ মেমোরি কন্ট্রোলার হিসেবে কাজ করে। এটি কম্পাইলারকে বলে দেয় একটি ভেরিয়েবলের জন্য কত বাইট (Byte) জায়গা মেমোরিতে (RAM) বরাদ্দ করতে হবে এবং ডেটাটিকে কীভাবে প্রসেস করতে হবে। |
১.১ ডেটাটাইপের প্রধান শ্রেণীবিন্যাস
সি ভাষায় ডেটাটাইপকে প্রধানত ৪টি শ্রেণীতে ভাগ করা হয়:
- ১. প্রাথমিক বা মৌলিক ডেটাটাইপ (Primitive / Primary Data Types): প্রোগ্রামিংয়ের মূল এবং বিল্ট-ইন ডেটাটাইপ (যেমন: int, float, double, char)।
- ২. লব্ধ বা উদ্ভূত ডেটাটাইপ (Derived Data Types): প্রাথমিক ডেটাটাইপ ব্যবহার করে যেগুলো তৈরি করা হয় (যেমন: Array, Pointer, Structure, Union)।
- ৩. ইউজার-ডিফাইন্ড ডেটাটাইপ (User-Defined Data Types): প্রোগ্রামার কর্তৃক নিজস্ব প্রয়োজনে সংজ্ঞায়িত টাইপ (যেমন: Enum, Typedef)।
- ৪. ভয়েড ডেটাটাইপ (Void Data Type): খালি বা মানহীন ডেটাটাইপ, যা সাধারণত ফাংশন রিটার্ন টাইপে বা পয়েন্টারে ব্যবহৃত হয় (void)।
১.২ মৌলিক ডেটাটাইপসমূহের বিস্তারিত আলোচনা
১. Integer (`int`):
পূর্ণসংখ্যা (যেমন: -৫০, ০, ২৫, ১০০) সংরক্ষণের জন্য `int` ব্যবহার করা হয়। এতে কোনো দশমিক থাকে না। সাধারণত মেমোরিতে এটি ২ অথবা ৪ বাইট জায়গা নেয় (কম্পাইলার আর্কিটেকচার অনুযায়ী)।
int age = 25; int temperature = -5; |
২. Floating Point (`float`):
ভগ্নাংশ বা দশমিক যুক্ত সংখ্যা (যেমন: ৩.১৪, ৯৮.৬, ৫০.২৫) সংরক্ষণের জন্য `float` ব্যবহৃত হয়। এটি মেমোরিতে ৪ বাইট জায়গা নেয় এবং দশমিকের পর প্রায় ৬ থেকে ৭ ঘর পর্যন্ত সঠিক মান দিতে পারে।
float cgpa = 3.75; float price = 120.50f; |
৩. Double Precision Floating Point (`double`):
অনেক বড় দশমিক যুক্ত সংখ্যা বা উচ্চ নিখুঁত (High Precision) হিসাব-নিকাশের জন্য `double` ব্যবহৃত হয়। এটি মেমোরিতে ৮ বাইট জায়গা নেয় এবং দশমিকের পর ১৫ থেকে ১৭ ঘর পর্যন্ত নিখুঁত হিসাব রাখতে পারে।
double pi = 3.141592653589793; double distance = 149600000.85; |
৪. Character (`char`):
যেকোনো একক বর্ণ, সংখ্যা বা চিহ্নের (যেমন: 'A', 'z', '5', '$') জন্য `char` ব্যবহৃত হয়। এটি মেমোরিতে ১ বাইট (৮ বিট) জায়গা নেয়। সি ভাষায় প্রতিটি অক্ষর মেমোরিতে তার নিজস্ব ASCII কোড (যেমন: 'A' = 65) হিসেবে সংরক্ষিত হয়।
char grade = 'A'; char symbol = '#'; |
৫. Boolean (`bool`):
C99 স্ট্যান্ডার্ডে `<stdbool.h>` হেডার ফাইলের মাধ্যমে `bool` যুক্ত করা হয়। এটি সত্য (`true` / 1) অথবা মিথ্যা (`false` / 0) মান ধারণ করে এবং মেমোরিতে ১ বাইট জায়গা নেয়।
#include <stdbool.h> bool isPassed = true; |
১.৩ ডেটাটাইপ মোডিফায়ার (Data Type Modifiers)
মৌলিক ডেটাটাইপের সীমা (Range) বা মেমোরি সাইজ বাড়ানো বা কমানোর জন্য মোডিফায়ার ব্যবহার করা হয়। সি ভাষায় ৪টি প্রধান মোডিফায়ার রয়েছে:
- unsigned: শুধুমাত্র ধনাত্মক সংখ্যা সংরক্ষণের জন্য। এটি ঋণাত্মক মান বাদ দিয়ে ধনাত্মক সীমা দ্বিগুণ করে।
- signed: ধনাত্মক ও ঋণাত্মক উভয় প্রকার সংখ্যা সংরক্ষণের জন্য (ডিফল্ট ব্যবস্থা)।
- short: ছোট রেঞ্জের ডেটা সংরক্ষণের জন্য মেমোরি সাইজ কমায় (সাধারণত ২ বাইট)।
- long / long long: মেমোরি সাইজ ও রেঞ্জ বৃদ্ধি করে (সাধারণত ৪ বা ৮ বাইট)।
১.৪ ডেটাটাইপের পূর্ণাঙ্গ সারসংক্ষেপ টেবিল
ডেটাটাইপ (Data Type) | সাইজ (Size) | ফরম্যাট স্পেসিফায়ার | মানের সীমা (Range) | উদাহরণ |
char | 1 Byte | %c | -128 to 127 | char c = 'K'; |
unsigned char | 1 Byte | %c | 0 to 255 | unsigned char c = 200; |
short int | 2 Bytes | %hd | -32,768 to 32,767 | short s = 1500; |
unsigned short | 2 Bytes | %hu | 0 to 65,535 | unsigned short s = 50000; |
int | 4 Bytes | %d / %i | -2,147,483,648 to 2,147,483,647 | int count = 45000; |
unsigned int | 4 Bytes | %u | 0 to 4,294,967,295 | unsigned int val = 3000000000; |
long long int | 8 Bytes | %lld | -9*10^18 to 9*10^18 | long long pop = 8000000000LL; |
float | 4 Bytes | %f | 1.2E-38 to 3.4E+38 (6-7 digits) | float avg = 85.5f; |
double | 8 Bytes | %lf | 2.3E-308 to 1.7E+308 (15 digits) | double d = 3.1415926535; |
long double | 10-16 Bytes | %Lf | 3.4E-4932 to 1.1E+4932 | long double ld = 1.23456789L; |
২. সি প্রোগ্রামে ভেরিয়েবল (Variables in C)
ভেরিয়েবল (Variable) হলো মেমোরি লোকেশনের একটি নামকৃত স্থান (Named Memory Location), যেখানে ডেটা বা তথ্য সাময়িকভাবে সংরক্ষণ করা হয়। প্রোগ্রাম চলার সময় এই ভেরিয়াবেলের মান পরিবর্তন হতে পারে।
২.১ ভেরিয়েবল নামকরণের নিয়মাবলী (Rules for Naming Variables)
সি প্রোগ্রামে ভেরিয়েবলের নাম নির্ধারণের ক্ষেত্রে নিচের নিয়মসমূহ কঠোরভাবে মেনে চলতে হয়:
- ভেরিয়েবলের নাম শুধুমাত্র ইংরেজি বর্ণ (a-z, A-Z), সংখ্যা (0-9) এবং আন্ডারস্কোর (_) দিয়ে গঠন করা যায়।
- প্রথম অক্ষর অবশ্যই একটি বর্ণ (Letter) অথবা আন্ডারস্কোর (_) হতে হবে। কোনো সংখ্যা দিয়ে শুরু হতে পারবে না (যেমন: `1total` ভুল, কিন্তু `total1` সঠিক)।
- সি একটি Case-Sensitive ভাষা। অর্থাৎ `age`, `Age`, এবং `AGE` ৩টি সম্পূর্ণ আলাদা ভেরিয়েবল।
- সি ভাষার সংরক্ষিত কী-ওয়ার্ড (Keywords - যেমন: `int`, `return`, `float`, `for`, `if`) ভেরিয়েবলের নাম হিসেবে ব্যবহার করা যাবে না।
- ভেরিয়েবলের নামের মাঝখানে কোনো স্পেস (Space) বা বিশেষ চিহ্ন (যেমন: `@`, `#`, `$`, `%`) ব্যবহার করা যাবে না।
২.২ ভেরিয়েবল ডিক্লেয়ারেশন, ইনিশিয়ালাইজেশন ও টাইপ কাস্টিং
- ডিক্লেয়ারেশন (Declaration):মেমোরিতে ভেরিয়েবলের জন্য জায়গা বরাদ্দ করা। যেমন: `int speed;`
- ইনিশিয়ালাইজেশন (Initialization):ভেরিয়েবলে প্রথমবার মান নির্ধারণ করা। যেমন: `speed = 80;`
- একত্রে ব্যবহার (Combined):একসাথে ডিক্লেয়ার ও মান প্রদান। যেমন: `int speed = 80;`
- টাইপ কাস্টিং (Type Casting):একটি ডেটাটাইপকে অন্য ডেটাটাইপে রূপান্তর করা। এটি দুই প্রকার: ১. স্বয়ংক্রিয় (Implicit Cast) ২. জোরপূর্বক (Explicit Cast - যেমন: `(float)total / count`)।
২.৩ স্কোপ ও লাইফটাইম অনুযায়ী ভেরিয়েবলের প্রকারভেদ
ভেরিয়েবলের কার্যক্ষেত্র (Scope) এবং স্থায়িত্ব (Lifetime)-এর ওপর ভিত্তি করে ভেরিয়েবলকে প্রধানত নিচের শ্রেণীতে ভাগ করা হয়:
১. লোকাল ভেরিয়েবল (Local Variables):
যে ভেরিয়েবল কোনো নির্দিষ্ট ফাংশন বা ব্লক `{ }`-এর ভেতরে ডিক্লেয়ার করা হয়। এটি শুধুমাত্র ওই নির্দিষ্ট ব্লকের ভেতরেই অ্যাক্সেসযোগ্য। ব্লক শেষ হলে মেমোরি থেকে মুছে যায়।
২. গ্লোবাল ভেরিয়েবল (Global Variables):
যে ভেরিয়েবল সমস্ত ফাংশনের বাইরে (প্রোগ্রামের শুরুতে) ডিক্লেয়ার করা হয়। পুরো প্রোগ্রামের যেকোনো ফাংশন থেকে এটিকে ব্যবহার ও পরিবর্তন করা যায়। প্রোগ্রাম শেষ না হওয়া পর্যন্ত এটি মেমোরিতে থাকে।
৩. স্ট্যাটিক ভেরিয়েবল (Static Variables):
`static` কী-ওয়ার্ড দিয়ে ডিক্লেয়ার করা হয়। এর বিশেষত্ব হলো, ফাংশনের এক্সিকিউশন শেষ হলেও এটি তার সর্বশেষ মান মেমোরিতে ধরে রাখে। প্রোগ্রাম চলাকালীন এটি কেবল একবার ইনিশিয়ালাইজ হয়।
৪. অটোমেটিক ভেরিয়েবল (Automatic Variables - `auto`):
ফাংশনের ভেতরে ঘোষিত সমস্ত লোকাল ভেরিয়েবল ডিফল্টভাবে `auto` ভেরিয়েবল।
৫. এক্সটার্নাল ভেরিয়েবল (External Variables - `extern`):
একাধিক ফাইলের মধ্যে কোনো গ্লোবাল ভেরিয়েবল শেয়ার করার জন্য `extern` কী-ওয়ার্ড ব্যবহৃত হয়।
৬. রেজিস্টার ভেরিয়েবল (Register Variables - `register`):
RAM-এর বদলে প্রসেসরের রেজিস্টার মেমোরিতে ভেরিয়েবল রাখার অনুরোধ করতে ব্যবহৃত হয়, যাতে অতি দ্রুত অ্যাক্সেস করা যায় (যেমন: লুপ কাউন্টার)।
৭. কনস্ট্যান্ট ভেরিয়েবল (Constant Variables - `const`):
`const` কী-ওয়ার্ড দিয়ে ঘোষিত ভেরিয়েবলের মান প্রোগ্রাম চলাকালীন কখনো পরিবর্তন করা যায় না।
২.৪ সি স্টোরেজ ক্লাসেস (Storage Classes) সারসংক্ষেপ
স্টোরেজ ক্লাস | স্টোরেজ স্থান (Storage) | ডিফল্ট মান (Default) | স্কোপ (Scope) | লাইফটাইম (Lifetime) |
auto | RAM (Stack) | Garbage Value | Local (ব্লকের ভেতর) | ব্লক শেষ হওয়া পর্যন্ত |
register | CPU Register | Garbage Value | Local (ব্লকের ভেতর) | ব্লক শেষ হওয়া পর্যন্ত |
static | RAM (Data Segment) | Zero (0) | Local / File Level | প্রোগ্রাম শেষ হওয়া পর্যন্ত |
extern | RAM (Data Segment) | Zero (0) | Global (সব ফাইল) | প্রোগ্রাম শেষ হওয়া পর্যন্ত |
৩. বাস্তবমুখী প্রজেক্ট (Comprehensive Practical Project)
তত্ত্বীয় আলোচনার বাস্তব প্রয়োগ হিসেবে নিচে একটি পূর্ণাঙ্গ সি প্রজেক্ট তৈরি করা হলো। এই প্রজেক্টের নাম: **"স্মার্ট একাডেমি স্টুডেন্ট অ্যান্ড ফি ম্যানেজমেন্ট সিস্টেম (Smart Academy Student & Fee Management System)"**।
৩.১ প্রজেক্টের বিবরণ ও ব্যবহৃত ধারণা সমূহের তালিকা
এই প্রজেক্টে ডেটাটাইপ ও ভেরিয়েবলের প্রায় সকল ধারণাকে একত্রে যুক্ত করা হয়েছে:
- ১. String / Char Array:শিক্ষার্থীর নাম ও বিভাগের নাম সংরক্ষণে।
- ২. Primitive Types (`int`, `float`, `double`, `char`):রোল নম্বর, বয়স ও মোট নিবন্ধিত সংখ্যায়।
- ৩. Enum (`enum Status`):শিক্ষার্থীর একাডেমিক স্ট্যাটাস (Active/Inactive) নির্দেশ করতে।
- ৪. Structure (`struct Student`):শিক্ষার্থীর যাবতীয় তথ্য একত্রে প্যাক করতে।
- ৫. `const` Variables:প্রতিষ্ঠান ও সফটওয়্যার সংক্রান্ত অপরিবর্তনশীল তথ্যে (যেমন: ট্যাক্স রেট, অ্যাকাডেমি নাম)।
- ৬. Global Variables:অ্যাকাডেমির মোট তহবিল বা মোট শিক্ষার্থী সংখ্যা ট্র্যাক রাখতে।
- ৭. `static` Variables:সিস্টেমে মোট কতবার ফি লেনদেন হয়েছে তার সংখ্যা ধরে রাখতে।
- ৮. `register` Variables:ফাংশনের কার্যকারিতা বাড়ানোর জন্য প্রসেসর রেজিস্টার ব্যবহারের অনুরোধে।
- ৯. Explicit Type Casting:গড় ও পার্সেন্টেজ নির্ভুলভাবে গণনায়।
৩.২ পূর্ণাঙ্গ সি সোর্স কোড (Complete C Code)
#include <stdio.h> #include <string.h> #include <stdbool.h> // ========================================== // ১. CONSTANT VARIABLES & ENUM DEFINITION // ========================================== const double VAT_RATE = 0.05; // কনস্ট্যান্ট ভেরিয়েবল (৫% ভ্যাট) const char ACADEMY_NAME[] = "CodeMaster Academy"; // ইউজার-ডিফাইন্ড এনামেরেটেড ডেটাটাইপ (Enum) enum StudentStatus { INACTIVE = 0, ACTIVE = 1, GRADUATED = 2 }; // ========================================== // ২. STRUCTURE DEFINITION (Derived Type) // ========================================== struct Student { int id; // Integer type char name[50]; // Character Array (String) int age; // Integer float marks[3]; // Float Array for 3 subjects double tuitionFee; // Double precision for currency enum StudentStatus status; // Enum Data Type bool isScholarship; // Boolean Data Type }; // ========================================== // ৩. GLOBAL VARIABLES (গ্লোবাল ভেরিয়েবল) // ========================================== int totalStudentsCount = 0; // কতজন ছাত্র যোগ করা হয়েছে double totalAcademyRevenue = 0; // মোট সংগৃহীত ফি // ========================================== // ৪. FUNCTION DECLARATIONS // ========================================== void addStudent(struct Student *s); void displayStudent(const struct Student *s); double calculateFinalFee(double baseFee, bool hasScholarship); void processTransaction(double amount); // ========================================== // MAIN FUNCTION // ========================================== int main() { printf("================================================== "); printf(" WELCOME TO %s ", ACADEMY_NAME); printf("================================================== "); // লোকাল অ্যারে ভেরিয়েবল (সর্বোচ্চ ২টি স্টুডেন্ট ধারণ করবে) struct Student academy[2]; // ১ নম্বর শিক্ষার্থী যোগ printf("--- [১ম শিক্ষার্থী নিবন্ধনের তথ্য প্রদান] --- "); academy[0].id = 101; strcpy(academy[0].name, "Tanvir Ahmed"); academy[0].age = 21; academy[0].marks[0] = 85.5f; academy[0].marks[1] = 90.0f; academy[0].marks[2] = 88.25f; academy[0].tuitionFee = 15000.00; academy[0].status = ACTIVE; academy[0].isScholarship = true; totalStudentsCount++; // ২ নম্বর শিক্ষার্থী যোগ printf(" --- [২য় শিক্ষার্থী নিবন্ধনের তথ্য প্রদান] --- "); academy[1].id = 102; strcpy(academy[1].name, "Rahim Chowdhury"); academy[1].age = 22; academy[1].marks[0] = 65.0f; academy[1].marks[1] = 72.5f; academy[1].marks[2] = 70.0f; academy[1].tuitionFee = 15000.00; academy[1].status = ACTIVE; academy[1].isScholarship = false; totalStudentsCount++; // ফি গণনা ও ট্রানজেকশন প্রসেস for (int i = 0; i < totalStudentsCount; i++) { double finalFee = calculateFinalFee(academy[i].tuitionFee, academy[i].isScholarship); processTransaction(finalFee); } // তথ্য প্রদর্শন printf(" ================================================== "); printf(" শিক্ষার্থীদের নিবন্ধিত প্রোফাইল "); printf("================================================== "); for (int i = 0; i < totalStudentsCount; i++) { displayStudent(&academy[i]); } // প্রজেক্ট সমাপনী সামারি (Global variables usage) printf(" ================================================== "); printf(" একাডেমিক ফাইন্যান্সিয়াল রিপোর্ট "); printf("================================================== "); printf("মোট নিবন্ধিত শিক্ষার্থী: %d জন ", totalStudentsCount); printf("মোট সংগৃহীত রাজস্ব: $%.2lf ", totalAcademyRevenue); return 0; } // ========================================== // FUNCTION DEFINITIONS // ========================================== // ফি হিসাব করার ফাংশন double calculateFinalFee(double baseFee, bool hasScholarship) { double payable = baseFee;
// স্কলারশিপ থাকলে ৫০% ডিসকাউন্ট if (hasScholarship) { payable = baseFee * 0.50; }
// ভ্যাট যোগ করা (VAT_RATE const global) payable += (payable * VAT_RATE); return payable; } // ট্রানজেকশন প্রসেসিং ফাংশন (STATIC Variable Usage) void processTransaction(double amount) { // static variable: ফাংশন কল শেষ হলেও এর মান বজায় থাকে static int transactionCounter = 0;
transactionCounter++; totalAcademyRevenue += amount; // গ্লোবাল ভেরিয়েবলে যোগ
printf(">> ট্রানজেকশন #%d সফল! গৃহীত অর্থ: $%.2lf ", transactionCounter, amount); } // শিক্ষার্থী তথ্য প্রিন্ট করার ফাংশন void displayStudent(const struct Student *s) { // Explicit Type Casting এর উদাহরণ float totalMarks = s->marks[0] + s->marks[1] + s->marks[2]; float average = (float)totalMarks / 3.0f; // Type cast explicitly // Register variable usage example register int i; printf(" [ID: %d] নাম: %s ", s->id, s->name); printf("বয়স: %d বছর | স্কলারশিপ: %s ", s->age, s->isScholarship ? "হ্যাঁ (Yes)" : "না (No)");
printf("প্রাপ্ত নম্বরসমূহ: "); for (i = 0; i < 3; i++) { printf("%.1f ", s->marks[i]); } printf(" গড় নম্বর: %.2f ", average); // Enum প্রিন্ট হ্যান্ডলিং printf("একাডেমিক স্ট্যাটাস: "); switch (s->status) { case INACTIVE: printf("ইনঅ্যাক্টিভ (Inactive) "); break; case ACTIVE: printf("অ্যাক্টিভ (Active) "); break; case GRADUATED: printf("গ্র্যাজুয়েটেড (Graduated) "); break; } } |
৩.৩ প্রজেক্ট কোডের পুঙ্খানুপুঙ্খ ব্যাখ্যা (Code Breakdown)
- ১. কনস্ট্যান্ট ভেরিয়েবল:`const double VAT_RATE = 0.05;` ব্যবহার করে আমরা একটি অপরিবর্তনশীল ভ্যাট নির্ধারণ করেছি, যা দুর্ঘটনাবশত কোডের কোথাও পরিবর্তন করা সম্ভব নয়।
- ২. এনামেরেটেড টাইপ (Enum):`enum StudentStatus` ব্যবহার করে স্টুডেন্টের অবস্থাকে ০, ১, ২ সংখ্যার বদলে অর্থপূর্ণ শব্দ দিয়ে প্রকাশ করা হয়েছে।
- ৩. স্ট্রাকচার (Structure):`struct Student` একটি কাস্টম ডেটাটাইপ যা বিভিন্ন প্রকার ডেটাটাইপকে (int, float, char array, enum, bool) একটি মাত্র প্যাকেজে রূপান্তর করেছে।
- ৪. গ্লোবাল ভেরিয়েবল:`totalStudentsCount` এবং `totalAcademyRevenue` সমস্ত ফাংশনের বাইরে ঘোষিত হওয়ায় পুরো প্রোগ্রামের যেকোনো জায়গা থেকে এটি এক্সেস ও আপডেট করা সম্ভব হয়েছে।
- ৫. স্ট্যাটিক ভেরিয়েবল:`processTransaction` ফাংশনের ভেতরে `static int transactionCounter` ব্যবহার করা হয়েছে। প্রতিটি ট্রানজেকশনের সাথে সাথে এর মান ১ করে বাড়ে এবং পরবর্তী ফাংশন কলে পূর্বের মান ধরে রাখে।
- ৬. টাইপ কাস্টিং:`average = (float)totalMarks / 3.0f;` লাইনে নিশ্চিত করা হয়েছে যেন নম্বর যোগফলের ভাগফল নিখুঁতভাবে দশমিক মান প্রদান করে।
- ৭. রেজিস্টার ভেরিয়েবল:`register int i;` প্রসেসরের দ্রুত মেমোরি ব্যবহার করার জন্য কম্পাইলারকে একটি নির্দেশ প্রদান করে।
৪. অনুশীলন, সাধারণ ভুলসমূহ ও রিভিশন (Practice & Pitfalls)
৪.১ সাধারণ ১০টি ভুল ও প্রতিকার (Common Pitfalls & Tips)
- ১. Integer Division Error:পূর্ণসংখ্যার সাথে পূর্ণসংখ্যা ভাগ করলে উত্তর পূর্ণসংখ্যায় আসে (যেমন: `5 / 2 = 2`)। সঠিক দশমিক উত্তর পেতে অন্তত একটিকে float/double এ কাস্ট করতে হবে (`(float)5 / 2 = 2.5`)।
- ২. Off-by-One in Strings:`char name[10];` হলে এতে সর্বোচ্চ ৯টি বর্ণ সংরক্ষণ করা যাবে, কারণ শেষে ১ বাইট নল ক্যারেক্টার (`\0`)-এর জন্য সংরক্ষিত থাকে।
- ৩. Uninitialized Variables:লোকাল ভেরিয়েবল ডিক্লেয়ার করার পর ইনিশিয়ালাইজ না করলে তাতে যথেচ্ছ মান (Garbage Value) থাকে। যা গণনায় ভুল ঘটায়।
- ৪. Data Overflow:ছোট টাইপের মধ্যে বড় টাইপ রাখতে গেলে ডেটা হারিয়ে যায় (Overflow)। যেমন: `char` এ ৩০০ রাখা সম্ভব নয়।
৪.২ আত্মযাচাই ও অনুশীলন প্রশ্নাবলী (Self-Assessment Questions)
- ১. `int` এবং `float` ডেটাটাইপের মধ্যে প্রধান ৩টি পার্থক্য কী কী?
- ২. `static` ভেরিয়েবল এবং `auto` ভেরিয়েবলের লাইফটাইমের মধ্যে পার্থক্য উদাহরণসহ ব্যাখ্যা করো।
- ৩. সি প্রোগ্রামে `const` কী-ওয়ার্ডের সুবিধা কী?
- ৪. Implicit and Explicit Type Casting বলতে কী বোঝো? উদাহরণ দাও।
- ৫. একটি সি প্রোগ্রাম লেখো যা ব্যবহারকারীর কাছ থেকে ৩টি ভাসমান সংখ্যা (float) গ্রহণ করবে এবং তাদের গড় `double` টাইপে প্রিন্ট করবে।