Follow Us
মাধ্যম নির্বাচন করুন / Select Medium:
Eng (English) Beng (বাংলা) Hindi (हिन्दी)
পশ্চিমবঙ্গ মধ্যশিক্ষা পর্ষদ (WBBSE) • শ্রেণি XI • Computer Science • অধ্যায় 3
আনুমানিক সময়: ৪৫ মিনিট
অগ্রগতি: অধ্যয়নে সক্রিয়

সি প্রোগ্রামিংয়ের পরিচিতি

পশ্চিমবঙ্গ উচ্চমাধ্যমিক শিক্ষা সংসদের (WBCHSE) একাদশ শ্রেণির কম্পিউটার সায়েন্স পাঠ্যক্রমের তৃতীয় ও অত্যন্ত মৌলিক অধ্যায় হলো 'সি প্রোগ্রামিংয়ের পরিচিতি'। ১৯৭২ সালে মার্কিন যুক্তরাষ্ট্রের এটি অ্যান্ড টি বেল ল্যাবরেটরিতে ডেনিস রিচি ইউনিক্স অপারেটিং সিস্টেম তৈরির লক্ষ্যে সি ভাষার উদ্ভাবন করেন, যাকে আধুনিক প্রোগ্রামিং ভাষার জননী এবং আদর্শ মধ্যম স্তরের ভাষা বলা হয়। এই অধ্যায়ে শিক্ষার্থীরা একটি পূর্ণাঙ্গ সি প্রোগ্রামের গাঠনিক কাঠামো অনুধাবন করে এবং সি কম্পাইলেশনের ৫টি মূল ধাপ—প্রিপ্রসেসিং (cpp), কম্পাইলেশন (cc1), অ্যাসেম্বলি (as), লিংকিং (ld) এবং লোডিং—সম্পর্কে বিশদ জ্ঞান অর্জন করে। এছাড়াও রানিং প্রোগ্রামের মেমোরি আর্কিটেকচার (টেক্সট, ইনিশিয়ালাইজড ডেটা, BSS, হিপ ও স্ট্যাক সেগমেন্ট)-এর কার্যপদ্ধতি পুঙ্খানুপুঙ্খভাবে ব্যাখ্যা করা হয়েছে। শিক্ষার্থীরা সি ভাষার ক্ষুদ্রতম একক বা টোকেনের ছয়টি রূপভেদ—৩২টি এএনএসআই কীওয়ার্ড, আইডেন্টিফায়ার নামকরণের সুনির্দিষ্ট শর্তাবলি, ধ্রুবক (পূর্ণসংখ্যা, বাস্তব, বর্ণ ও এস্কেপ সিকোয়েন্স), নাল-টার্মিনেটেড স্ট্রিং, অপারেটর ও বিরামচিহ্ন—আয়ত্ত করে। অধ্যায়টিতে মৌলিক ডেটা টাইপ (char, int, float, double, void), টাইপ কোয়ালিফায়ার (const, volatile), চারটি স্টোরেজ ক্লাস (auto, register, static, extern), stdio.h লাইব্রেরির ফরম্যাটেড ইনপুট/আউটপুট ফাংশন (printf, scanf ও অ্যাড্রেস-অফ অপারেটর &), আনফরম্যাটেড I/O (getchar, putchar, নিরাপদ fgets), অপারেটরের ১৫-স্তরের অগ্রাধিকার ক্রম এবং টাইপ কাস্টিং বিস্তারিতভাবে বিশ্লেষিত হয়েছে।

অধ্যায়টির গুরুত্ব

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

অধ্যায়ের বিষয়সূচি ও রূপরেখা

1 মডিউল ১: সি ভাষার উৎপত্তি, বিবর্তন...
2 মডিউল ২: সি কম্পাইলেশনের ৫টি পর্যায...
3 মডিউল ৩: সি টোকেন, ক্যারেক্টার সেট,...
4 মডিউল ৪: ডেটা টাইপ, কোয়ালিফায়ার,...
5 মডিউল ৫: স্ট্যান্ডার্ড ইনপুট ও আউটপ...
6 মডিউল ৬: অপারেটরসমূহ, ব্যঞ্জক মূল্য...

সম্পূর্ণ তত্ত্ব ও ধারণাগত আলোচনা

মডিউল ১: সি ভাষার উৎপত্তি, বিবর্তন ও একটি সি প্রোগ্রামের সাধারণ রূপরেখা

১.১ সি ভাষার ঐতিহাসিক প্রেক্ষাপট ও ক্রমবিকাশ

সি প্রোগ্রামিং ভাষার উদ্ভাবন ঘটে ১৯৬৯ থেকে ১৯৭৩ সালের মধ্যে মার্কিন যুক্তরাষ্ট্রের এটি অ্যান্ড টি বেল ল্যাবরেটরিতে (AT&T Bell Laboratories)। এর মূল স্রষ্টা ছিলেন প্রখ্যাত কম্পিউটার বিজ্ঞানী ডেনিস রিচি (Dennis Ritchie)। পূর্বে ইউনিক্স অপারেটিং সিস্টেমটি হার্ডওয়্যার-নির্ভর অ্যাসেম্বলি ভাষায় রচিত ছিল; ইউনিক্সকে সহজে অন্য কম্পিউটারে স্থানান্তরযোগ্য (Portable) করার উদ্দেশ্যেই সি ভাষার জন্ম হয়।

সি ভাষার উৎপত্তির ঐতিহাসিক ক্রমধারা নিম্নরূপ:

  • ALGOL 60 (১৯৬০): স্ট্রাকচার্ড ব্লক প্রোগ্রামিং ও ব্যাকাস-নাউর ফর্ম (BNF) ব্যাকরণের প্রবর্তন।
  • CPL (Combined Programming Language, ১৯৬৩): অত্যন্ত শক্তিশালী কিন্তু কম্পাইলার তৈরি করা দুরূহ ছিল।
  • BCPL (Basic Combined Programming Language, ১৯৬৭): কেমব্রিজ বিশ্ববিদ্যালয়ের মার্টিন রিচার্ডস কর্তৃক নির্মিত একটি সাধারণ ও টাইপহীন ভাষা।
  • B ভাষা (১৯৬৯): বেল ল্যাবসে কেন থম্পসন BCPL-কে আরও সংক্ষিপ্ত করে ইউনিক্সের প্রথম সংস্করণের জন্য তৈরি করেন।
  • C ভাষা (১৯৭২): ডেনিস রিচি B ভাষার সাথে ডেটা টাইপ, ডেটা স্ট্রাকচার ও পয়েন্টার যুক্ত করে একটি পূর্ণাঙ্গ ও শক্তিশালী ভাষা সি (C) উদ্ভাবন করেন।
  • ANSI C (C89/C90): ১৯৮৯ সালে আমেরিকান ন্যাশনাল স্ট্যান্ডার্ডস ইনস্টিটিউট (ANSI) দ্বারা সি-এর প্রমিত মান নির্ধারণ করা হয়।
১.২ সি-কে কেন "মধ্যম স্তরের ভাষা" (Middle-Level Language) বলা হয়?
মধ্যম স্তরের ভাষার বৈশিষ্ট্য: সি ভাষা উচ্চস্তরের ভাষার মতো মানববোধ্য কাঠামোবদ্ধ সিনট্যাক্স (লুপ, ফাংশন, কন্ডিশনাল স্টেটমেন্ট) সমর্থন করে, আবার একই সাথে নিম্নস্তরের ভাষার মতো সরাসরি মেমোরি অ্যাড্রেস নিয়ন্ত্রণ (Pointers), বিটওয়াইজ অপারেশন এবং প্রসেসর রেজিস্টার ব্যবহারের সুবিধা দেয়। উচ্চ ও নিম্ন স্তরের এই সমন্বয়ের কারণেই সি-কে মধ্যম স্তরের ভাষা বলা হয়।
১.৩ একটি সি প্রোগ্রামের প্রমিত গাঠনিক অংশসমূহ

একটি আদর্শ সি প্রোগ্রাম প্রধানত ছয়টি কার্যকরী অংশে বিভক্ত থাকে:

  1. ডকুমেন্টেশন সেকশন (মন্তব্য অংশ): প্রোগ্রামের উদ্দেশ্য, রচয়িতা ও নিয়মাবলি সংক্রান্ত মন্তব্য। সি-তে মাল্টি-লাইন মন্তব্য (`/* মন্তব্য */`) এবং সি৯৯ সিঙ্গল-লাইন মন্তব্য (`// মন্তব্য`) ব্যবহৃত হয়। প্রিপ্রসেসিংয়ের সময় কম্পাইলার সকল মন্তব্য মুছে ফেলে।
  2. লিঙ্ক সেকশন (প্রিপ্রসেসর নির্দেশিকা): হেডার ফাইল যুক্ত করার নির্দেশ (`#include <stdio.h>`, `#include <math.h>`), যা স্ট্যান্ডার্ড লাইব্রেরি ফাংশনের প্রোটোটাইপ সরবরাহ করে।
  3. সংজ্ঞা সেকশন (Definition Section): `#define` নির্দেশিকা ব্যবহার করে প্রতীকী ধ্রুবক (Symbolic Constants) ঘোষণা করা (`#define PI 3.14159`)।
  4. গ্লোবাল ডিক্লারেশন সেকশন: সমগ্র প্রোগ্রামের সকল ফাংশনে ব্যবহারযোগ্য গ্লোবাল চলক ও ব্যবহারকারী-সংজ্ঞায়িত ফাংশনের প্রোটোটাইপ ঘোষণা।
  5. main() ফাংশন অংশ: প্রতিটি সি প্রোগ্রামের প্রধান ও বাধ্যতামূলক প্রবেশদ্বার (Entry Point)। প্রোগ্রাম নির্বাহ সর্বদা `main()` থেকে শুরু হয়। প্রমিত ANSI সি-তে এটি `int main(void)` হিসেবে ঘোষিত হয় এবং অপারেটিং সিস্টেমকে সাফল্যের বার্তা হিসেবে `return 0;` প্রদান করে।
  6. সাবপ্রোগ্রাম সেকশন (ব্যবহারকারী-সংজ্ঞায়িত ফাংশন): মডিউলার কোডিংয়ের স্বার্থে `main()` ফাংশনের বাইরে প্রয়োজনীয় স্বতন্ত্র ফাংশনগুলির পূর্ণাঙ্গ কোড বডি।

মডিউল ২: সি কম্পাইলেশনের ৫টি পর্যায় ও রানটাইম মেমোরি আর্কিটেকচার

২.১ সি কম্পাইলেশন পাইপলাইনের ৫টি পর্যায়

সি কোনো ইন্টারপ্রেটেড ভাষা নয়; এটি একটি বিশুদ্ধ কম্পাইল্ড ভাষা। মানুষের লেখা টেক্সট ফাইল থেকে কম্পিউটারের নির্বাহযোগ্য বাইনারি ফাইলে রূপান্তরের পাঁচটি ধাপ রয়েছে:

পর্যায়ব্যবহৃত সফটওয়্যার টুলইনপুট ফাইলআউটপুট ফাইলপ্রধান কার্যক্রম
১. প্রিপ্রসেসিংপ্রিপ্রসেসর (`cpp`)`file.c``file.i`মন্তব্য মুছে ফেলা, `#include` হেডার ফাইলের সম্পূর্ণ কোড যুক্ত করা, `#define` ম্যাক্রো সম্প্রসারণ ও কন্ডিশনাল প্রিপ্রসেসিং।
২. কম্পাইলেশনকম্পাইলার (`cc1` / `gcc`)`file.i``file.s`লেক্সিক্যাল, সিনট্যাক্স ও শব্দার্থিক যাচাইকরণ, টাইপ চেকিং এবং অপ্টিমাইজেশন শেষে অ্যাসেম্বলি কোডে রূপান্তর।
৩. অ্যাসেম্বলিঅ্যাসেম্বলার (`as`)`file.s``file.o` / `file.obj`অ্যাসেম্বলি নির্দেশমালাকে প্রসেসরের অপকোডে অনুবাদ করে রি-লোকেটযোগ্য মেশিন অবজেক্ট কোড তৈরি করা।
৪. লিংকিংলিংকার (`ld`)`file.o` + লাইব্রেরি`file.exe` / `a.out`বাহ্যিক ফাংশন রেফারেন্স (যেমন `printf`) সমাধান করা, রানটাইম স্টার্টআপ কোড (`crt0.o`) যুক্ত করে স্বাধীন এক্সিকিউটেবল বাইনারি তৈরি।
৫. লোডিংওএস কার্নেল লোডার`file.exe`র‍্যামে প্রসেস নির্বাহভার্চুয়াল মেমোরি বরাদ্দ করা, ডিস্ক থেকে কোড র‍্যামে কপি করা এবং `_start` রুটিন ডেকে `main()` নির্বাহ শুরু করা।
২.২ একটি চলমান সি প্রোগ্রামের মেমোরি আর্কিটেকচার

অপারেটিং সিস্টেম যখন কোনো সি এক্সিকিউটেবল ফাইলকে র‍্যামে লোড করে, তখন তার ভার্চুয়াল মেমোরিকে পাঁচটি নির্দিষ্ট সেগমেন্টে বিন্যস্ত করা হয়:

  • ১. টেক্সট সেগমেন্ট (Text / Code Segment): মেমোরির সর্বনিম্ন ঠিকানায় অবস্থিত। এতে প্রোগ্রামের কম্পাইল্ড মেশিন নির্দেশমালা থাকে। অনিচ্ছাকৃত পরিবর্তন রোধে এটি Read-Only থাকে।
  • ২. ইনিশিয়ালাইজড ডেটা সেগমেন্ট (Data Segment): কোডে প্রারম্ভিক মান নির্ধারণ করা সকল গ্লোবাল ও স্ট্যাটিক চলক এখানে সংরক্ষিত থাকে (যেমন: `int count = 10; static float rate = 5.5;`)।
  • ৩. আন-ইনিশিয়ালাইজড ডেটা সেগমেন্ট (BSS Segment): "Block Started by Symbol"-এর সংক্ষিপ্ত রূপ। যেসব গ্লোবাল ও স্ট্যাটিক চলকের কোনো প্রারম্ভিক মান দেওয়া হয় না (যেমন: `int arr[100];`), তারা এখানে থাকে। প্রোগ্রাম চালু হলে ওএস স্বয়ংক্রিয়ভাবে এই অংশকে শূন্য (`0`) দিয়ে পূর্ণ করে।
  • ৪. হিপ সেগমেন্ট (Heap Segment): রানটাইমে ডায়নামিক মেমোরি বরাদ্দের (`malloc()`, `calloc()`) জন্য ব্যবহৃত হয়। এটি BSS-এর উপর থেকে উর্ধ্বমুখী (উচ্চ মেমোরি ঠিকানার দিকে) প্রসারিত হয়।
  • ৫. স্ট্যাক সেগমেন্ট (Stack Segment): মেমোরির সর্বোচ্চ ঠিকানা থেকে নিম্নমুখী (নিচের ঠিকানার দিকে) প্রসারিত হয়। এতে লোকাল চলক, ফাংশনের আর্গুমেন্ট এবং কল স্ট্যাকের অ্যাক্টিভেশন ফ্রেম সংরক্ষিত থাকে (LIFO পদ্ধতি)।

মডিউল ৩: সি টোকেন, ক্যারেক্টার সেট, কীওয়ার্ড, আইডেন্টিফায়ার ও ধ্রুবক

৩.১ সি ক্যারেক্টার সেট (Character Set)

সি ভাষায় প্রোগ্রাম লেখার জন্য অনুমোদিত মৌলিক ক্যারেক্টার সেট নিম্নরূপ:

  • বর্ণমালা: ইংরেজি বড় হাতের `A`–`Z` এবং ছোট হাতের `a`–`z` (সি ভাষা কেস-সেনসিটিভ)।
  • অঙ্ক: ডেসিমাল অঙ্ক `0` থেকে `9` (মোট ১০টি)।
  • বিশেষ প্রতীক: `+ - * / % = < > ! & | ^ ~ . , ; : ? ' " ( ) [ ] { } _ # \`।
  • হোয়াইট স্পেস: স্পেস বার, অনুভূমিক ট্যাব (` `), নিউলাইন (` `), ক্যারেজ রিটার্ন (` `)।
৩.২ সি টোকেন (C Token)-এর আনুষ্ঠানিক সংজ্ঞা ও প্রকারভেদ

একটি সি প্রোগ্রামের ক্ষুদ্রতম অর্থপূর্ণ একককে টোকেন বলা হয়। কম্পাইলার লেক্সিক্যাল অ্যানালাইসিস পর্যায়ে সোর্স কোডকে টোকেনে বিভক্ত করে। সি টোকেন প্রধানত ৬ প্রকার:

  1. কীওয়ার্ড (Keywords): পূর্বনির্ধারিত সংরক্ষিত শব্দ যার অর্থ অপরিবর্তনীয়।
  2. আইডেন্টিফায়ার (Identifiers): চলক, ফাংশন বা অ্যারে চিহ্নিত করার জন্য ব্যবহারকারী প্রদত্ত নাম।
  3. ধ্রুবক (Constants / Literals): যেসব মান প্রোগ্রাম চলাকালীন কখনো পরিবর্তিত হয় না।
  4. স্ট্রিং (Strings): ডবল কোটেশনের মধ্যে আবদ্ধ এবং নাল ক্যারেক্টার (`'\0'`) দ্বারা সমাপ্ত অক্ষরের ক্রম।
  5. অপারেটর (Operators): গাণিতিক বা যৌক্তিক হিসাব সম্পন্ন করার বিশেষ প্রতীক।
  6. বিশেষ প্রতীক (Special Symbols / Punctuators): বন্ধনী `( )`, ব্র্যাকেট `[ ]`, ব্রেস `{ }`, কমা `,`, সেমিকোলন `;` ইত্যাদি।
৩.৩ ৩২টি প্রমিত ANSI C কীওয়ার্ড

ANSI C (C89) মানে ঠিক ৩২টি কীওয়ার্ড নির্ধারিত রয়েছে। এগুলি সর্বদা ছোট হাতের অক্ষরে লিখতে হয় এবং কোনো আইডেন্টিফায়ার হিসেবে ব্যবহার করা নিষিদ্ধ:

শ্রেণিবিভাগকীওয়ার্ডসমূহব্যবহারের উদ্দেশ্য
ডেটা টাইপ`char`, `int`, `float`, `double`, `void`মেমোরির পরিসর ও উপাত্তের ধরন নির্ধারণ।
টাইপ মডিফায়ার`signed`, `unsigned`, `short`, `long`পূর্ণসংখ্যার সীমা বা চিহ্নের রূপান্তর।
শাখা নিয়ন্ত্রণ`if`, `else`, `switch`, `case`, `default`শর্তাধীন সিদ্ধান্ত গ্রহণ।
লুপ নিয়ন্ত্রণ`for`, `while`, `do`পুনরাবৃত্তিমূলক কাজ সম্পন্ন করা।
জাম্প স্টেটমেন্ট`break`, `continue`, `goto`, `return`স্বাভাবিক প্রবাহ বিচ্ছিন্ন করা।
স্টোরেজ ক্লাস`auto`, `register`, `static`, `extern`চলকের আয়ুষ্কাল, স্কোপ ও মেমোরি অবস্থান।
কাস্টম টাইপ`struct`, `union`, `enum`, `typedef`মিশ্র ডেটা স্ট্রাকচার ও নামান্তর।
টাইপ কোয়ালিফায়ার`const`, `volatile`অপরিবর্তনীয়তা বা অপ্টিমাইজেশন রোধ।
কম্পাইলার অপারেটর`sizeof`বাইট আকার পরিমাপক কম্পাইল-টাইম অপারেটর।
৩.৪ আইডেন্টিফায়ার (Identifier) নামকরণের নিয়মাবলি
  • অনুমোদিত অক্ষর: শুধুমাত্র বর্ণ (`A-Z`, `a-z`), অঙ্ক (`0-9`) এবং আন্ডারস্কোর (`_`) ব্যবহার করা যাবে।
  • প্রথম অক্ষরের শর্ত: নাম অবশ্যই বর্ণ অথবা আন্ডারস্কোর দিয়ে শুরু হতে হবে; কখনোই অঙ্ক দিয়ে শুরু হতে পারবে না (যেমন: `1st_num` অবৈধ, কিন্তু `num1` বা `_total` বৈধ)।
  • কেস সংবেদনশীলতা: বড় ও ছোট হাতের অক্ষর ভিন্ন অর্থ বহন করে; যেমন `total`, `Total` এবং `TOTAL` তিনটি ভিন্ন চলক।
  • নিষিদ্ধ উপাদান: কোনো ফাঁকা স্থান (Space), যতিচিহ্ন বা বিশেষ চিহ্ন (`@`, `$`, `#`, `-`) এবং ৩২টি কীওয়ার্ডের কোনোটি নাম হিসেবে ব্যবহার করা যাবে না।
  • দৈর্ঘ্য তাৎপর্য: ANSI মানে প্রথম ৩১টি অক্ষর স্বতন্ত্র হিসেবে বিবেচিত হয়।
৩.৫ ধ্রুবক ও এস্কেপ সিকোয়েন্স
  • পূর্ণসংখ্যা ধ্রুবক: ডেসিমাল (`45`), অক্টাল (সামনে `0`, যেমন `075` = $61_{10}$), হেক্সাডেসিমাল (সামনে `0x`, যেমন `0x2A` = $42_{10}$)।
  • বাস্তব (ফ্লোটিং) ধ্রুবক: দশমিক ভগ্নাংশ (`3.1415`) বা বৈজ্ঞানিক সূচক পদ্ধতি (`1.5e-3` = $1.5 imes 10^{-3}$)।
  • বর্ণ ধ্রুবক (Character Constant): একক উদ্ধৃতিতে একটিমাত্র বর্ণ (`'A'`, `'9'`); মেমোরিতে এর পূর্ণসংখ্যা ASCII মান (যেমন `'A'` এর জন্য ৬৫) জমা হয়। এটি ১ বাইট দখল করে।
  • এস্কেপ সিকোয়েন্স: ব্যাকস্ল্যাশ (`\`) দিয়ে শুরু হওয়া বিশেষ বর্ণ: `\n` (নতুন লাইন), `\t` (ট্যাব), `\0` (নাল ক্যারেক্টার), `\\` (ব্যাকস্ল্যাশ), `\'` ও `\"`।
  • স্ট্রিং ধ্রুবক: ডবল উদ্ধৃতিতে থাকা অক্ষরের সারি (`"Hello"`), যার শেষে কম্পাইলার নিজে থেকে নাল ক্যারেক্টার `'\0'` যুক্ত করে। সুতরাং `"A"` মেমোরিতে ২ বাইট জায়গা নেয় (`'A'` এবং `'\0'`), কিন্তু `'A'` নেয় ১ বাইট।

মডিউল ৪: ডেটা টাইপ, কোয়ালিফায়ার, চলক ঘোষণা ও স্টোরেজ ক্লাস

৪.১ সি ভাষার মৌলিক ডেটা টাইপ ও তাদের মেমোরি পরিসর
ডেটা টাইপসাধারণ মেমোরি আকারবিট সংখ্যাফরম্যাট স্পেসিফায়ারটু-জ কমপ্লিমেন্ট মেমোরি পরিসর
`char` (চিহ্নযুক্ত)১ বাইট৮`%c`$-128$ থেকে $+127$ ($-2^7$ থেকে $2^7 - 1$)
`unsigned char`১ বাইট৮`%c`$0$ থেকে $255$ ($0$ থেকে $2^8 - 1$)
`short int`২ বাইট১৬`%hd`$-32,768$ থেকে $+32,767$
`unsigned short`২ বাইট১৬`%hu`$0$ থেকে $65,535$
`int` (৩২-বিট প্রসেসর)৪ বাইট৩২`%d` / `%i`$-2,147,483,648$ থেকে $+2,147,483,647$
`unsigned int`৪ বাইট৩২`%u`$0$ থেকে $4,294,967,295$
`long int`৪ বা ৮ বাইট৩২ / ৬৪`%ld`$-2^{31}$ থেকে $2^{31} - 1$ (বা $-2^{63}$ থেকে $2^{63}-1$)
`long long int`৮ বাইট৬৪`%lld`$-9.22 imes 10^{18}$ থেকে $+9.22 imes 10^{18}$
`float` (একক নির্ভুলতা)৪ বাইট৩২`%f`$\pm 3.4 imes 10^{-38}$ থেকে $\pm 3.4 imes 10^{+38}$ (৬ দশমিক স্থান)
`double` (দ্বৈত নির্ভুলতা)৮ বাইট৬৪`%lf`$\pm 1.7 imes 10^{-308}$ থেকে $\pm 1.7 imes 10^{+308}$ (১৫ দশমিক স্থান)
`void`০ বাইট০নেইমানহীন; ফাংশনের রিটার্নহীনতা বা জেনেরিক পয়েন্টারে ব্যবহৃত হয়
৪.২ টাইপ কোয়ালিফায়ার: const ও volatile
  • `const`: চলককে শুধুমাত্র পাঠযোগ্য (Read-Only) করে তোলে; এর মান পরবর্তীতে পরিবর্তন করার চেষ্টা করলে কম্পাইলার এরর দেয় (`const float PI = 3.14;`)।
  • `volatile`: কম্পাইলার অপ্টিমাইজারকে নির্দেশ দেয় যে এই চলকের মান বাহ্যিক হার্ডওয়্যার বা ইন্টারাপ্ট দ্বারা যেকোনো সময় পরিবর্তিত হতে পারে, তাই প্রতিবার সরাসরি র‍্যাম থেকে মান পড়তে হবে, ক্যাশে রাখা যাবে না।
৪.৩ চারটি স্টোরেজ ক্লাস (Storage Classes)

সি ভাষায় একটি চলকের স্টোরেজ ক্লাস চারটি বিষয় নির্ধারণ করে: মেমোরি অবস্থান, ডিফল্ট প্রারম্ভিক মান, স্কোপ (দৃশ্যমানতা) এবং লাইফটাইম (স্থায়িত্ব):

স্টোরেজ ক্লাসকীওয়ার্ডমেমোরি অবস্থানডিফল্ট মানস্কোপ (Scope)লাইফটাইম (Lifetime)
Automatic`auto`রানটাইম কল স্ট্যাকআবর্জনা মান (Garbage)যে ব্লকে ঘোষিত কেবল সেখানেব্লকটি শেষ হওয়া পর্যন্ত
Register`register`সিপিইউ রেজিস্টারআবর্জনা মান (Garbage)যে ব্লকে ঘোষিত কেবল সেখানেব্লকটি শেষ হওয়া পর্যন্ত
Static`static`ডেটা / BSS সেগমেন্টশূন্য (`0` বা `NULL`)ব্লক বা ফাইলের মধ্যে সীমাবদ্ধসম্পূর্ণ প্রোগ্রাম চলাকালীন স্থায়ী
External`extern`ডেটা / BSS সেগমেন্টশূন্য (`0` বা `NULL`)অন্যান্য সকল লিঙ্কড ফাইলে গ্লোবালসম্পূর্ণ প্রোগ্রাম চলাকালীন স্থায়ী

গুরুত্বপূর্ণ প্রযুক্তিগত সতর্কতা:

  • রেজিস্টার ভেরিয়েবল সরাসরি সিপিইউতে থাকায় এর ওপর অ্যাড্রেস-অফ অপারেটর `&` প্রয়োগ করা যায় না (`&reg_var` কম্পাইল এরর দেয়)।
  • একটি ফাংশনের ভেতরের `static` লোকাল চলক ফাংশন শেষ হলেও মান ধরে রাখে এবং পুরো প্রোগ্রামে মাত্র একবার ইনিশিয়ালাইজ হয়।

মডিউল ৫: স্ট্যান্ডার্ড ইনপুট ও আউটপুট ফাংশন (stdio.h)

৫.১ printf() দ্বারা ফরম্যাটেড আউটপুট প্রদর্শন

`<stdio.h>` হেডার ফাইলে ঘোষিত `printf()` ফাংশন স্ট্যান্ডার্ড আউটপুটে ফরম্যাটেড লেখা প্রদর্শন করে:

int printf(const char *format, ...);

রিটার্ন মান: পর্দায় সফলভাবে মুদ্রিত মোট অক্ষরের সংখ্যা রিটার্ন করে।

ফরম্যাট স্পেসিফায়ার কাঠামো: `%[flags][width][.precision]type`

  • ফিল্ড উইথ (Width): সর্বনিম্ন কতটি কলামে মানটি ছাপা হবে (যেমন `%6d` দিয়ে `42` ছাপালে সামনে ৪টি স্পেস দিয়ে `____42` হবে)।
  • প্রিসিশন (.precision): ফ্লোটের জন্য দশমিকের পর কত ঘর থাকবে (যেমন `%.2f` দিলে `3.14159` হবে `3.14`)। স্ট্রিংয়ের জন্য সর্বোচ্চ কতটি বর্ণ ছাপা হবে (যেমন `%.4s`)।
  • ফ্ল্যাগসমূহ: `-` (বাম সারিবদ্ধকরণ বা Left Align), `0` (স্পেসের বদলে শূন্য দিয়ে ফাঁকা পূরণ), `+` (ধনাত্মক চিহ্নের স্পষ্ট প্রদর্শন)।
৫.২ scanf() দ্বারা ফরম্যাটেড ইনপুট গ্রহণ ও & অপারেটর

কীবোর্ড থেকে ইনপুট গ্রহণের জন্য `scanf()` ব্যবহৃত হয়:

int scanf(const char *format, ...);

অ্যাড্রেস-অফ অপারেটরের (&) অপরিহার্যতা: সি ফাংশনে আর্গুমেন্ট শুধুমাত্র মান দ্বারা প্রেরিত (Call by Value) হয়। `scanf` যাতে ব্যবহারকারীর টাইপ করা মান মূল চলকের মেমোরিতে সরাসরি জমা করতে পারে, সেজন্য চলকের নামের পূর্বে তার মেমোরি ঠিকানা নির্দেশক `&` অপারেটর (যেমন `&num`) দেওয়া বাধ্যতামূলক।

স্ট্রিং অ্যারের ব্যতিক্রম: সি-তে অ্যারের নাম নিজেই তার প্রথম উপাদানের মেমোরি পয়েন্টার নির্দেশ করে। তাই স্ট্রিং পড়ার সময় `&` দিতে হয় না (`scanf("%s", str)` যথেষ্ট)।

৫.৩ আনফরম্যাটেড I/O ফাংশন: ক্যারেক্টার ও স্ট্রিং অপারেশন
  • `getchar()`: ইনপুট থেকে একটি একক অক্ষর পড়ে তার ASCII পূর্ণসংখ্যা রিটার্ন করে।
  • `putchar(c)`: পর্দায় একটি একক অক্ষর প্রদর্শন করে।
  • `gets()`-এর মরণঘাতী ঝুঁকি ও বাফার ওভারফ্লো: `gets()` ফাংশন ইনপুটের কোনো আকার যাচাই না করেই অ্যারেতে ডেটা লেখে। অতিরিক্ত বর্ণ দিলে তা মেমোরির স্ট্যাক ফ্রেম ধ্বংস করে (Buffer Overflow)। তাই সি১১ মানে এটি সম্পূর্ণরূপে বাতিল করা হয়েছে।
  • নিরাপদ `fgets()`: বাফার আকার উল্লেখ করে নিরাপদে লাইন পড়ার প্রমিত ফাংশন: `fgets(str, sizeof(str), stdin)`।
  • `puts(str)`: স্ট্রিং প্রিন্ট করে স্বয়ংক্রিয়ভাবে শেষে নতুন লাইন (`\n`) তৈরি করে।

মডিউল ৬: অপারেটরসমূহ, ব্যঞ্জক মূল্যায়ন, টাইপ রূপান্তর ও অগ্রাধিকার ক্রম

৬.১ সি ভাষার বিভিন্ন অপারেটরের বিবরণ
  1. অঙ্কগণিত অপারেটর: যোগ (`+`), বিয়োগ (`-`), গুণ (`*`), ভাগ (`/`), মডুলাস বা ভাগশেষ (`%`)। লক্ষণীয় যে, `%` অপারেটরের উভয় পাশের অপারেন্ডকে অবশ্যই পূর্ণসংখ্যা হতে হবে; ফ্লোট সংখ্যায় `%` ব্যবহার করলে কম্পাইল এরর হয়।
  2. সম্পর্কযুক্ত (Relational) অপারেটর: সত্য হলে `1` এবং মিথ্যা হলে `0` প্রদান করে: `==`, `!=`, `<`, `<=`, `>`, `>=`।
  3. যৌক্তিক (Logical) অপারেটর: শর্ট-সার্কিট পদ্ধতিতে মূল্যায়িত হয়: `&&` (AND), `||` (OR), `!` (NOT)।
  4. বিটওয়াইজ অপারেটর: বাইনারি বিট স্তরে হিসাব করে: বিটওয়াইজ AND (`&`), OR (`|`), XOR (`^`), ওয়ান-স কমপ্লিমেন্ট বা NOT (`~`), লেফট শিফট (`<<`, মানকে $2^k$ দিয়ে গুণ), রাইট শিফট (`>>`, মানকে $2^k$ দিয়ে ভাগ)।
  5. অ্যাসাইনমেন্ট অপারেটর: সাধারণ সমতা (`=`) ও যৌগিক রূপ: `+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `|=`, `^=`, `<<=`, `>>=` (ডান থেকে বামে মূল্যায়িত হয়)।
  6. ইঙ্কক্রিমেন্ট / ডিক্রিমেন্ট: প্রি-ইঙ্কক্রিমেন্ট (`++x`, আগে বাড়ে পরে মান ব্যবহৃত হয়), পোস্ট-ইঙ্কক্রিমেন্ট (`x++`, আগে বর্তমান মান ব্যবহৃত হয় পরে বাড়ে)।
  7. কন্ডিশনাল (টার্নারি) অপারেটর: `শর্ত ? সত্য_মান : মিথ্যা_মান`। সি ভাষার একমাত্র তিন-অপারেন্ড বিশিষ্ট অপারেটর।
  8. বিশেষ অপারেটর: `sizeof` (বাইট আকার নির্ণয়), কমা অপারেটর `,` (বাম থেকে ডানে চলে সর্বডানের মান দেয়)।
৬.২ সি ভাষার ১৫-স্তরের অপারেটর অগ্রাধিকার সারণী
অগ্রাধিকার স্তরঅপারেটরের ধরনঅপারেটরসমূহদিক (Associativity)
১ (সর্বোচ্চ)পোস্টফিক্স / গ্রুপিং`()` `[]` `->` `.` `x++` `x--`বাম থেকে ডানে
২ইউনারি অপারেটর`++x` `--x` `+` `-` `!` `~` `(type)` `*` `&` `sizeof`ডান থেকে বামে
৩গুণ ও ভাগ`*` `/` `%`বাম থেকে ডানে
৪যোগ ও বিয়োগ`+` `-`বাম থেকে ডানে
৫বিটওয়াইজ শিফট`<<` `>>`বাম থেকে ডানে
৬তুলনামূলক সম্পর্ক`<` `<=` `>` `>=`বাম থেকে ডানে
৭সমতা যাচাই`==` `!=`বাম থেকে ডানে
৮বিটওয়াইজ AND`&`বাম থেকে ডানে
৯বিটওয়াইজ XOR`^`বাম থেকে ডানে
১০বিটওয়াইজ OR`|`বাম থেকে ডানে
১১যৌক্তিক AND`&&`বাম থেকে ডানে
১২যৌক্তিক OR`||`বাম থেকে ডানে
১৩কন্ডিশনাল টার্নারি`? :`ডান থেকে বামে
১৪অ্যাসাইনমেন্ট`=` `+=` `-=` `*=` `/=` `%=` ইত্যাদিডান থেকে বামে
১৫ (সর্বনিম্ন)কমা অপারেটর`,`বাম থেকে ডানে
৬.৩ টাইপ রূপান্তর: স্বতঃস্ফূর্ত বনাম প্রত্যক্ষ কাস্টিং
  • স্বতঃস্ফূর্ত টাইপ রূপান্তর (Implicit Type Promotion): মিশ্র রাশিমালার গণনায় কম্পাইলার নিজে থেকে ক্ষুদ্রতর টাইপকে বৃহত্তর টাইপে উন্নীত করে (যেমন `5 / 2.0` করলে পূর্ণসংখ্যা `5` স্বয়ংক্রিয়ভাবে `5.0` হয়ে ফলাফল `2.5` প্রদান করে)।
  • প্রত্যক্ষ টাইপ কাস্টিং (Explicit Casting): প্রোগ্রামার দ্বারা জোরপূর্বক টাইপ পরিবর্তন: `(type) expression`। যেমন: `(float)15 / 4` লিখলে ফলাফল `3.75` আসে, অন্যথায় পূর্ণসংখ্যা ভাগে দশমিক বাদ গিয়ে `3` আসত।

প্রোগ্রামিং সিনট্যাক্স, কমান্ড ও অনুবাদক নীতি

চিহ্নযুক্ত টু-জ কমপ্লিমেন্ট পরিসর সূত্র
$$R_{signed} = [-2^{n-1}, +2^{n-1} - 1]$$
চিহ্নহীন (Unsigned) পূর্ণসংখ্যার পরিসর সূত্র
$$R_{unsigned} = [0, 2^n - 1]$$
বিটওয়াইজ লেফট শিফট গুণের সমীকরণ
$$x ll k = x times 2^k$$
বিটওয়াইজ রাইট শিফট ভাগের সমীকরণ
$$x gg k = lfloor frac{x}{2^k} rfloor$$
বিটওয়াইজ ওয়ান-স কমপ্লিমেন্ট সম্পর্ক
~x = -(x + 1)
কম্পাইল-টাইমে অ্যারের মোট উপাদান সংখ্যা গণনা
$$N_{elements} = frac{sizeof(arr)}{sizeof(arr[0])}$$

সমাধানকৃত উদাহরণ ও প্রয়োগ (Solved Examples)

উদাহরণ 1
ধাপে ধাপে সমাধান / উত্তর:
সি কম্পাইলেশনের ৫টি পর্যায়ের পুঙ্খানুপুঙ্খ বিবরণ:

১. পর্যায় ১: প্রিপ্রসেসিং (Preprocessing):
- টুল: সি প্রিপ্রসেসর (`cpp` বা `gcc -E`)।
- ইনপুট: `sum.c` (টেক্সট ফাইল)।
- আউটপুট: `sum.i` (প্রসারিত ফাইল)।
- কার্যক্রম: সোর্স কোডের সমস্ত মন্তব্য মুছে ফেলা হয়; `#include <stdio.h>`-এর সম্পূর্ণ প্রোটোটাইপ কোড যুক্ত করা হয়; এবং `#define BONUS 500` ম্যাক্রোটির জায়গায় সরাসরি `500` বসিয়ে টেক্সট প্রতিস্থাপন করা হয়।

২. পর্যায় ২: কম্পাইলেশন (Compilation):
- টুল: কম্পাইলার (`cc1` বা `gcc -S`)।
- ইনপুট: `sum.i`।
- আউটপুট: `sum.s` (অ্যাসেম্বলি কোড ফাইল)।
- কার্যক্রম: ব্যাকরণ ও ডেটা টাইপ যাচাই শেষে সি কোডকে লক্ষ্য প্রসেসরের নির্দেশমালায় (অ্যাসেম্বলি নেমোনিক যেমন `movl`, `addl`) রূপান্তর করা হয়।

৩. পর্যায় ৩: অ্যাসেম্বলি (Assembly):
- টুল: অ্যাসেম্বলার (`as` বা `gcc -c`)।
- ইনপুট: `sum.s`।
- আউটপুট: `sum.o` / `sum.obj` (মেশিন অবজেক্ট ফাইল)।
- কার্যক্রম: অ্যাসেম্বলি কোডকে সরাসরি বাইনারি মেশিন কোডে অনুবাদ করা হয়। তবে লাইব্রেরি ফাংশনগুলির (যেমন `printf`) লিঙ্ক তখনও অসম্পূর্ণ থাকে।

৪. পর্যায় ৪: লিংকিং (Linking):
- টুল: লিংকার (`ld` বা `gcc`)।
- ইনপুট: `sum.o`, স্ট্যান্ডার্ড সি লাইব্রেরি `libc.a` এবং স্টার্টআপ ফাইল `crt0.o`।
- আউটপুট: `sum.exe` (উইন্ডোজ) বা `a.out` (লিনাক্স)।
- কার্যক্রম: লিংকার লাইব্রেরির সাথে `printf`-এর সংযোগ স্থাপন করে এবং একটি স্বাধীন নির্বাহযোগ্য বাইনারি ফাইল তৈরি করে।

৫. পর্যায় ৫: লোডিং (Loading):
- টুল: ওএস লোডার।
- কার্যক্রম: ডিস্ক থেকে বাইনারি ফাইলটি পড়ে র‍্যামের টেক্সট, ডেটা ও স্ট্যাক সেগমেন্ট সাজিয়ে `main()` ফাংশন চালু করে।
উদাহরণ 2
ধাপে ধাপে সমাধান / উত্তর:
অংশ ক: sizeof দ্বারা মেমোরি পরিমাপ:
- `signed char` এবং `unsigned char` উভয়ই মেমোরিতে ঠিক ১ বাইট (৮ বিট) স্থান দখল করে।
- `sizeof(x) = 1 byte`, `sizeof(y) = 1 byte`।

অংশ খ: ওভারফ্লো ও টু-জ কমপ্লিমেন্ট বিশ্লেষণ:
১. চিহ্নযুক্ত চলক `x`:
- প্রাথমিক মান: $127_{10} = 01111111_2$ (৮-বিট চিহ্নযুক্ত সংখ্যার সর্বোচ্চ ধনাত্মক মান)।
- `x++` করলে বাইনারি যোগ: $01111111_2 + 1 = 10000000_2$।
- টু-জ কমপ্লিমেন্টে প্রথম বিট `1` হলে তা ঋণাত্মক সংখ্যা বোঝায়: $-2^7 = -128$।
- অতএব: x = -128 (ওভারফ্লোজনিত কারণে ঋণাত্মক মানে রূপান্তর)।

২. চিহ্নহীন চলক `y`:
- প্রাথমিক মান: $255_{10} = 11111111_2$ (৮-বিট চিহ্নহীন সংখ্যার সর্বোচ্চ মান)।
- `y++` করলে বাইনারি যোগ: $11111111_2 + 1 = 100000000_2$ (৯ বিট)।
- ৮-বিট চলকে নবম বিটটি মেমোরির বাইরে ছিটকে বাদ পড়ে যায়, ফলে থাকে $00000000_2 = 0$।
- অতএব: y = 0।
উদাহরণ 3
ধাপে ধাপে সমাধান / উত্তর:
ধাপভিত্তিক ড্রাই-রান বিশ্লেষণ:

১. প্রথমবার `test()` ফাংশন কল:
- `auto int a = 10;` স্ট্যাক মেমোরিতে নতুন ফ্রেম তৈরি করে `a`-এর মান ১০ রাখে।
- `static int s = 10;` ডেটা সেগমেন্টে মাত্র একবারের জন্য ইনিশিয়ালাইজ হয়।
- `a++` হয়ে `a = 11`; `s++` হয়ে `s = 11`।
- প্রথম আউটপুট: a=11, s=11।
- ফাংশন শেষ হলে `a` স্ট্যাক থেকে ধ্বংস হয়ে যায়; কিন্তু `s` ডেটা সেগমেন্টে ১১ মানটি ধরে রাখে।

২. দ্বিতীয়বার `test()` ফাংশন কল:
- `a` নতুন করে স্ট্যাকে তৈরি হয়ে আবার ১০ থেকে শুরু হয়; `a++` হয়ে ১১ হয়।
- স্ট্যাটিক চলক `s` আগের ১১ মানটি ধরে রাখে (ইনিশিয়ালাইজেশন আর চলে না); `s++` হয়ে ১২ হয়।
- দ্বিতীয় আউটপুট: a=11, s=12।

৩. তৃতীয়বার `test()` ফাংশন কল:
- `a` পুনরায় ১০ থেকে শুরু হয়ে ১১ হয়।
- `s` ১২ ধরে রাখে এবং বেড়ে ১৩ হয়।
- তৃতীয় আউটপুট: a=11, s=13।

সর্বমোট কনসোল আউটপুট:
a=11, s=11
a=11, s=12
a=11, s=13
উদাহরণ 4
ধাপে ধাপে সমাধান / উত্তর:
ফরম্যাট স্পেসিফায়ারের পুঙ্খানুপুঙ্খ আউটপুট:

১. লাইন ১: পূর্ণসংখ্যার ফিল্ড উইথ ও ফ্ল্যাগ (`n = 42`):
- `%6d`: মোট ৬টি কলাম, ডান-সারিবদ্ধ। ৪টি ফাঁকা স্পেস ও শেষে ৪২: `| 42|`।
- `%-6d`: মোট ৬টি কলাম, বাম-সারিবদ্ধ (`-` ফ্ল্যাগ)। আগে ৪২ পরে ৪টি স্পেস: `|42 |`।
- `%06d`: মোট ৬টি কলাম, শূন্য দিয়ে পূরণ (`0` ফ্ল্যাগ)। ৪টি শূন্য ও শেষে ৪২: `|000042|`।
- লাইন ১ আউটপুট: `| 42|42 |000042|`

২. লাইন ২: ফ্লোট প্রিসিশন (`f = 3.14159`):
- `%8.2f`: মোট ৮ ঘর, দশমিকের পর ২ ঘর। `3.14159` রাউন্ড হয়ে `3.14` (৪ অক্ষর) হবে। ৮ ঘর পূরণ করতে সামনে ৪টি স্পেস: `| 3.14|`।
- `%.3f`: দশমিকের পর ৩ ঘর। `3.14159` রাউন্ড হয়ে `3.142` হবে: `|3.142|`।
- লাইন ২ আউটপুট: `| 3.14|3.142|`

৩. লাইন ৩: স্ট্রিং উইথ ও ট্রাঙ্কেশন (`str = "KOLKATA"` - ৭ বর্ণ):
- `%10s`: মোট ১০ কলাম, ডান-সারিবদ্ধ। ৩টি স্পেস ও পরে KOLKATA: `| KOLKATA|`।
- `%-10.4s`: বাম-সারিবদ্ধ, প্রিসিশন `.4` স্ট্রিংকে কেটে প্রথম ৪টি বর্ণ `KOLK` রাখে। বাকি ৬ ঘর স্পেস দিয়ে পূরণ: `|KOLK |`।
- লাইন ৩ আউটপুট: `| KOLKATA|KOLK |`
উদাহরণ 5
ধাপে ধাপে সমাধান / উত্তর:
প্রারম্ভিক মান ও বাইনারি রূপ:
- $a = 12_{10} = 00001100_2$
- $b = 5_{10} = 00000101_2$
- $c = 2_{10} = 00000010_2$

অগ্রাধিকারের ক্রম:
১. ইউনারি বিটওয়াইজ NOT (`~c`) [স্তর ২]
২. যোগ অপারেটর (`1 + b`) [স্তর ৪]
৩. বিটওয়াইজ শিফট (`>>`, `<<`) [স্তর ৫]
৪. বিটওয়াইজ AND (`&`) [স্তর ৮]
৫. বিটওয়াইজ XOR (`^`) [স্তর ৯]
৬. বিটওয়াইজ OR (`|`) [স্তর ১০]

ধাপভিত্তিক সমাধান:
১. `~c` নির্ণয়: `~2 = -(2 + 1) = -3`।
২. `1 + b` যোগ: `1 + 5 = 6`। ব্যঞ্জক দাঁড়াল: `a >> 6 & 7 ^ -3 | a << 1`।
৩. শিফট মূল্যায়ন (বাম থেকে ডানে):
- `a >> 6` = $12 >> 6 = 0$।
- `a << 1` = $12 << 1 = 24$।
ব্যঞ্জক দাঁড়াল: `0 & 7 ^ -3 | 24`।
৪. বিটওয়াইজ AND (`&`): `0 & 7 = 0`। ব্যঞ্জক দাঁড়াল: `0 ^ -3 | 24`।
৫. বিটওয়াইজ XOR (`^`): `0 ^ -3 = -3`। ব্যঞ্জক দাঁড়াল: `-3 | 24`।
৬. বিটওয়াইজ OR (`|`): -3 এর সাথে 24 এর বিটওয়াইজ OR করলে ফলাফল আসে -3।

চূড়ান্ত মান: x = -3।
উদাহরণ 6
ধাপে ধাপে সমাধান / উত্তর:
gets() ব্যবহারের মারাত্মক ঝুঁকি:
`gets()` ফাংশনে ইনপুট অ্যারের সর্বোচ্চ সীমা নির্ধারণের কোনো প্যারামিটার থাকে না:
char buffer[8];
gets(buffer); /* বিপজ্জনক */
ব্যবহারকারী যদি ৮ অক্ষরের বেশি (যেমন `"TargetExams2026"` - ১৫ বর্ণ) টাইপ করে, তবে:
১. প্রথম ৮টি বর্ণ `buffer` অ্যারেতে বসে।
২. অবশিষ্ট বর্ণগুলি স্ট্যাকের পার্শ্ববর্তী মেমোরিতে উপচে পড়ে (Overflow)।
৩. এতে স্ট্যাক ফ্রেমে থাকা ফাংশনের রিটার্ন অ্যাড্রেস বিকৃত হয়ে যায়।
৪. ফাংশন শেষ হলে সিপিইউ ভুল মেমোরি ঠিকানায় জাম্প করে এবং প্রোগ্রামটি সেগমেন্টেশন ফল্ট (Segmentation Fault) ক্র্যাশ করে।

fgets() দ্বারা নিরাপদ রূপান্তর:
#include <stdio.h>
int main() {
    char buffer[8];
    if (fgets(buffer, sizeof(buffer), stdin) != NULL) {
        printf("নিরাপদে পঠিত: %s\n", buffer);
    }
    return 0;
}

সুবিধা: `fgets` সর্বোচ্চ `sizeof(buffer) - 1` (৭টি অক্ষর) পড়ে এবং শেষে নিশ্চিতভাবে `'\0'` বসায়, ফলে বাফার উপচে পড়ার কোনো সুযোগ থাকে না।

সাধারণ ভুলত্রুটি ও সতর্কতা (Common Traps)

সাধারণ ভুল ধারণা

মৌলিক চলকে ইনপুট নেওয়ার সময় scanf()-এ অ্যাড্রেস-অফ অপারেটর (&) ভুলে যাওয়া (যেমন scanf("%d", n); লেখা)।

সঠিক পদ্ধতি ও সমাধান

সর্বদা মেমোরি ঠিকানা `&n` দিতে হবে (`scanf("%d", &n);`); অন্যথায় প্রোগ্রামটি রানটাইমে সেগমেন্টেশন ফল্ট ক্র্যাশ করবে।

সাধারণ ভুল ধারণা

স্ট্রিং ইনপুট নেওয়ার সময় scanf()-এ & অপারেটর ব্যবহার করা (যেমন scanf("%s", &str); লেখা)।

সঠিক পদ্ধতি ও সমাধান

সি ভাষায় অ্যারের নাম নিজেই তার মেমোরি ঠিকানাকে নির্দেশ করে, তাই সরাসরি `scanf("%s", str);` লিখতে হবে।

সাধারণ ভুল ধারণা

একক উদ্ধৃতির ক্যারেক্টার 'A' এবং ডবল উদ্ধৃতির স্ট্রিং "A" কে একই মনে করা।

সঠিক পদ্ধতি ও সমাধান

`'A'` একটি ১ বাইটের ক্যারেক্টার কনস্ট্যান্ট; কিন্তু `"A"` একটি ২ বাইটের স্ট্রিং যাতে `'A'` এবং নাল ক্যারেক্টার `'\0'` থাকে।

সাধারণ ভুল ধারণা

ভগ্নাংশ বা ফ্লোট সংখ্যায় মডুলাস অপারেটর (%) প্রয়োগ করা (যেমন 5.5 % 2)।

সঠিক পদ্ধতি ও সমাধান

মডুলাস অপারেটর `%` শুধুমাত্র পূর্ণসংখ্যার ক্ষেত্রে প্রযোজ্য। ফ্লোট সংখ্যার ভাগশেষ পেতে `` লাইব্রেরির `fmod()` ফাংশন ব্যবহার করতে হয়।

সাধারণ ভুল ধারণা

মনে করা যে কোনো লোকাল চলক (auto) তৈরি করলেই তার মান ডিফল্টভাবে শূন্য থাকে।

সঠিক পদ্ধতি ও সমাধান

অ-ইনিশিয়ালাইজড লোকাল চলকে আবর্জনা বা গার্বেজ (Garbage) মান থাকে। ব্যবহারের পূর্বে অবশ্যই চলকটিতে মান নির্ধারণ করতে হবে।

অধ্যায় সারসংক্ষেপ ও গুরুত্বপূর্ণ বিষয়

মূল বিষয় 1
অধ্যায় ৩ 'সি প্রোগ্রামিংয়ের পরিচিতি' পশ্চিমবঙ্গ উচ্চমাধ্যমিক একাদশ শ্রেণির পাঠ্যক্রমের একটি পূর্ণাঙ্গ ও বাস্তবমুখী ভিত্তি প্রদান করে। আমরা বেল ল্যাবসে ডেনিস রিচি কর্তৃক সি ভাষার উদ্ভাবন, এর মধ্যম স্তরের বৈশিষ্ট্য এবং একটি সি প্রোগ্রামের ছয়টি প্রমিত সেকশন অধ্যয়ন করেছি। আমরা সি কম্পাইলেশন পাইপলাইনের ৫টি স্তর—প্রিপ্রসেসিং, কম্পাইলেশন, অ্যাসেম্বলি, লিংকিং ও লোডিং—বিশ্লেষণ করেছি এবং প্রসেস মেমোরির টেক্সট, ডেটা, BSS, হিপ ও স্ট্যাক সেগমেন্টের ভূমিকা অনুধাবন করেছি। আমরা সি টোকেন, ৩২টি এএনএসআই কীওয়ার্ড, আইডেন্টিফায়ার তৈরির নিয়ম, ধ্রুবক, ডেটা টাইপ, const/volatile কোয়ালিফায়ার এবং চারটি স্টোরেজ ক্লাস (auto, register, static, extern) আয়ত্ত করেছি। পরিশেষে stdio.h লাইব্রেরির ফরম্যাটেড I/O (printf ও scanf), fgets() দ্বারা বাফার ওভারফ্লো নিরাপত্তা এবং সি ভাষার ১৫-স্তরের অপারেটর অগ্রাধিকার সারণী অনুসরণ করে গাণিতিক ও বিটওয়াইজ সমীকরণ মূল্যায়ন সম্পন্ন হয়েছে।

স্ব-মূল্যায়ন অনুশীলন (Check Your Understanding)

মূল ধারণাগত স্পষ্টতা যাচাই করার জন্য অনুশীলন প্রশ্ন। উত্তর দেখার আগে নিজে সমাধান করার চেষ্টা করো।

1
সি ভাষার আধুনিক মানক থেকে gets() ফাংশনকে কেন সম্পূর্ণভাবে বাদ দেওয়া হয়েছে?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: কারণ gets() বাফারের আকার পরীক্ষা না করায় স্ট্যাক মেমোরি উপচে বাফার ওভারফ্লো নিরাপত্তা ত্রুটি ও সিস্টেম ক্র্যাশ ঘটায়।
2
"WEST BENGAL" স্ট্রিং লিটারেলটি মেমোরিতে মোট কত বাইট স্থান দখল করবে?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: ১২ বাইট (১১টি দৃশ্যমান অক্ষর + ১টি সমাপ্তি নির্দেশক নাল ক্যারেক্টার '\0')।
3
কোন স্টোরেজ ক্লাসের চলকের মেমোরি ঠিকানা পেতে অ্যাড্রেস-অফ অপারেটর (&) প্রয়োগ করা যায় না?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: `register` স্টোরেজ ক্লাসের চলকে, কারণ এটি সরাসরি সিপিইউ রেজিস্টারে থাকে, কোনো র‍্যাম ঠিকানায় নয়।
4
সি ভাষায় পূর্ণসংখ্যার সমীকরণ 19 / 4 এবং 19 % 4 এর মান কত হবে?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: 19 / 4 = 4 (পূর্ণসংখ্যা ভাগফল), এবং 19 % 4 = 3 (ভাগশেষ)।
5
printf() ফাংশন সফলভাবে কাজ সম্পন্ন করার পর কী মান রিটার্ন করে?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: পর্দায় সফলভাবে মুদ্রিত মোট অক্ষরের সংখ্যা রিটার্ন করে।
অধ্যায় পড়া শেষ হয়েছে?
অনুশীলন শুরু করো

অনলাইন মক টেস্ট দিয়ে প্রস্তুতি যাচাই করো

পশ্চিমবঙ্গ মধ্যশিক্ষা পর্ষদ (WBBSE) পাঠ্যক্রম অনুযায়ী বহু বিকল্পীয় প্রশ্ন (MCQ) সমাধান করো। তাৎক্ষণিক ফলাফল, সঠিক ব্যাখ্যা এবং নিজের স্কোর জেনে নাও।