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

প্রোগ্রামিংয়ের মূল ভিত্তি

পশ্চিমবঙ্গ উচ্চমাধ্যমিক শিক্ষা সংসদের (WBCHSE) একাদশ শ্রেণির কম্পিউটার সায়েন্স পাঠ্যক্রমের দ্বিতীয় ও অত্যন্ত গুরুত্বপূর্ণ অধ্যায় হলো 'প্রোগ্রামিংয়ের মূল ভিত্তি'। এই অধ্যায়ে কম্পিউটার হার্ডওয়্যারের সাথে সফটওয়্যারের সংযোগ ঘটিয়ে বাস্তব জীবনের জটিল সমস্যার সুশৃঙ্খল ও গাণিতিক সমাধান প্রণয়নের পদ্ধতি বিশদভাবে আলোচনা করা হয়েছে। সমস্যা সমাধান পদ্ধতি এবং ডোনাল্ড নুথের পাঁচটি অপরিহার্য বৈশিষ্ট্যের (সসীমতা, সুনির্দিষ্টতা, ইনপুট, আউটপুট ও কার্যকারিতা) ওপর ভিত্তি করে অ্যালগরিদম গঠনের নিয়ম দিয়ে অধ্যায়ের সূচনা ঘটে। শিক্ষার্থীরা আন্তর্জাতিক ANSI মানসম্মত প্রতীক ব্যবহার করে ফ্লোচার্ট অঙ্কন, সিউডোকোড রচনা এবং ড্রাই রান ট্রেস টেবিলের মাধ্যমে লজিক যাচাই করার দক্ষতা অর্জন করে। অধ্যায়টিতে বম-জ্যাকোপিনির ঐতিহাসিক কাঠামো উপপাদ্য বিশ্লেষণ করা হয়েছে, যা প্রমাণ করে যেকোনো পরিগণনাযোগ্য প্রোগ্রাম মাত্র তিনটি মৌলিক নিয়ন্ত্রণ কাঠামোর মাধ্যমে তৈরি সম্ভব—অনুক্রম (Sequence), নির্বাচন বা শাখা (Selection - if-else, switch) এবং পুনরাবৃত্তি বা লুপ (Iteration - while, do-while, for)। এছাড়াও মডুলার প্রোগ্রামিংয়ের মূলনীতি, টপ-ডাউন নকশা, উচ্চ সংহতি (High Cohesion), নিম্ন সংযোগ (Low Coupling), মান দ্বারা প্রেরণ (Call by Value) বনাম রেফারেন্স দ্বারা প্রেরণ (Call by Reference) এবং রিকার্শনের ক্ষেত্রে মেমোরি কল স্ট্যাকের অভ্যন্তরীণ কার্যপ্রণালী ব্যাখ্যা করা হয়েছে। পরিশেষে ডেটা টাইপ, অপারেটরের অগ্রাধিকার, শর্ট-সার্কিট মূল্যায়ন, প্রোগ্রাম উন্নয়ন জীবনচক্র (PDLC), ত্রুটির প্রকারভেদ (সিনট্যাক্স, রানটাইম, লজিক্যাল) এবং অ্যালগরিদমের বিগ-ও (Big-O) সময় ও স্থান জটিলতার বাস্তব বিশ্লেষণ পরিবেশিত হয়েছে।

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

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

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

1 মডিউল ১: সমস্যা সমাধান পদ্ধতি ও অ্য...
2 মডিউল ২: প্রোগ্রামিং প্যারাডাইম ও ত...
3 মডিউল ৩: মডুলার প্রোগ্রামিং, টপ-ডাউ...
4 মডিউল ৪: ডেটা টাইপ, চলক, অপারেটর ও...
5 মডিউল ৫: প্রোগ্রাম উন্নয়ন জীবনচক্র...
6 মডিউল ৬: অ্যালগরিদমের দক্ষতা ও অ্যা...

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

মডিউল ১: সমস্যা সমাধান পদ্ধতি ও অ্যালগরিদমের ভিত্তি

১.১ সমস্যা সমাধানের জীবনচক্র (Problem-Solving Lifecycle)

কম্পিউটারের নিজস্ব কোনো বুদ্ধি নেই; এটি মানুষের দেওয়া সুনির্দিষ্ট নির্দেশমালা অত্যন্ত দ্রুতগতিতে নির্বাহ করে। একটি বাস্তব সমস্যাকে সফল সফটওয়্যারে রূপান্তর করতে পাঁচটি সুশৃঙ্খল ধাপ অনুসরণ করা হয়:

  1. সমস্যার সংজ্ঞায়ন ও বিশ্লেষণ: ব্যবহারকারীর প্রয়োজনীয়তা, সীমাবদ্ধতা এবং উদ্দিষ্ট ফলাফল স্পষ্টভাবে নির্ধারণ করা।
  2. ইনপুট ও আউটপুট রূপরেখা: কী কী কাঁচা তথ্য ইনপুট হিসেবে লাগবে এবং আউটপুট কী ফরম্যাটে প্রদর্শিত হবে তা নির্দিষ্ট করা।
  3. অ্যালগরিদম ডিজাইন: ইনপুটকে কাঙ্ক্ষিত আউটপুটে রূপান্তরের জন্য সসীম ও সুনির্দিষ্ট ধাপসমূহ প্রণয়ন করা।
  4. যাচাইকরণ ও ড্রাই রান (Desk Checking): কম্পিউটারে কোডিং করার পূর্বেই কাগজ-কলমে কাল্পনিক ডেটা দিয়ে অ্যালগরিদমের প্রতিটি ধাপের নির্ভুলতা পরীক্ষা করা।
  5. কোডিং ও বাস্তবায়ন: যাচাইকৃত অ্যালগরিদমটিকে কোনো উচ্চস্তরের প্রোগ্রামিং ভাষায় (যেমন সি, পাইথন) রূপান্তর করা।
১.২ অ্যালগরিদমের আনুষ্ঠানিক সংজ্ঞা ও নুথের ৫টি শর্ত

অ্যালগরিদম হলো কোনো নির্দিষ্ট গাণিতিক বা যৌক্তিক সমস্যা সমাধানের জন্য সুসংজ্ঞায়িত, দ্ব্যর্থহীন এবং সসীম সংখ্যক কার্যকরী নির্দেশের একটি সুশৃঙ্খল ক্রম। প্রখ্যাত কম্পিউটার বিজ্ঞানী ডোনাল্ড ই. নুথ (Donald Knuth)-এর মতে, একটি সার্থক অ্যালগরিদমকে অবশ্যই পাঁচটি মৌলিক শর্ত পূরণ করতে হবে:

শর্তবর্ণনাতাৎপর্য
১. সসীমতা (Finiteness)অ্যালগরিদমটিকে যেকোনো বৈধ ইনপুটের জন্য একটি সসীম সংখ্যক পদক্ষেপের পর অবশ্যই সমাপ্ত হতে হবে।প্রোগ্রাম যাতে কখনো অনির্দিষ্টকালের জন্য অসীম লুপে আটকে না থাকে।
২. সুনির্দিষ্টতা (Definiteness)প্রতিটি নির্দেশ সম্পূর্ণ দ্ব্যর্থহীন ও সুস্পষ্ট হতে হবে; এর কেবল একটিই অর্থ থাকবে।মেশিনভেদে যেন ফলাফল ভিন্ন বা বিভ্রান্তিকর না হয়।
৩. ইনপুট (Input)অ্যালগরিদম চালুর পূর্বে বাইরে থেকে শূন্য বা ততোধিক সুনির্দিষ্ট মান সরবরাহ করা হতে পারে।প্রোগ্রামের কার্যক্ষেত্র নির্ধারণ করে।
৪. আউটপুট (Output)অ্যালগরিদমটিকে অন্তত একটি বা একাধিক পরিমাপযোগ্য ফলাফল প্রদান করতে হবে।সমস্যার কাঙ্ক্ষিত চূড়ান্ত সমাধান সরবরাহ করে।
৫. কার্যকারিতা (Effectiveness)প্রতিটি ধাপ এমন মৌলিক হতে হবে যা একজন মানুষ কাগজ-কলমে সীমিত সময়ে সম্পাদন করতে সক্ষম।নির্দেশটি যাতে বাস্তবে কম্পিউটারে সম্পাদনযোগ্য হয়।
১.৩ ফ্লোচার্ট ও প্রমিত ANSI/ISO প্রতীকসমূহ

ফ্লোচার্ট হলো কোনো অ্যালগরিদমের নির্দেশ প্রবাহ ও সিদ্ধান্ত গ্রহণের একটি সার্বজনীন জ্যামিতিক চিত্ররূপ। আমেরিকান ন্যাশনাল স্ট্যান্ডার্ডস ইনস্টিটিউট (ANSI) কর্তৃক নির্ধারিত প্রধান প্রতীকগুলো হলো:

  • প্রান্তীয় প্রতীক (Terminal - ওভাল / উপবৃত্ত): প্রোগ্রামের শুরু (`START`) এবং সমাপ্তি (`STOP` / `END`) নির্দেশ করে। প্রতিটি ফ্লোচার্টে একটি শুরু ও অন্তত একটি শেষ প্রতীক থাকবে।
  • ইনপুট/আউটপুট প্রতীক (Parallelogram - সামান্তরিক): ব্যবহারকারীর কাছ থেকে ডেটা গ্রহণ (`READ A`, `INPUT N`) অথবা ফলাফল প্রদর্শন (`PRINT Result`) বোঝাতে ব্যবহৃত হয়।
  • প্রক্রিয়াকরণ প্রতীক (Rectangle - আয়তক্ষেত্র): যেকোনো গাণিতিক হিসাব বা চলকের মান নির্ধারণ (`C = A + B`, `Count = Count + 1`) নির্দেশ করে।
  • সিদ্ধান্ত প্রতীক (Diamond - হীরক বা রম্বস): শর্ত যাচাইয়ের জন্য ব্যবহৃত হয় (`Is X > 0?`)। এর একটি প্রবেশ পথ এবং দুটি নির্গমন পথ থাকে—একটি সত্য (`Yes`/`True`) এবং অন্যটি মিথ্যা (`No`/`False`)।
  • অন-পেজ কানেক্টর (On-Page Connector - ছোট বৃত্ত): একই পৃষ্ঠায় ভিন্ন ভিন্ন লাইনের সংযুক্তি ঘটাতে ব্যবহৃত হয়।
  • প্রবাহরেখা (Flow Lines - তীরচিহ্নযুক্ত রেখা): নির্দেশ নির্বাহের গতিপথ ও দিক নির্দেশ করে।
১.৪ সিউডোকোড বনাম ফ্লোচার্ট ও ট্রেস টেবিল

সিউডোকোড (Pseudo-code) হলো প্রাকৃতিক ভাষা এবং প্রোগ্রামিং কাঠামোর একটি সমন্বিত রূপ। এটি কোনো নির্দিষ্ট কম্পাইলারের কঠোর সিনট্যাক্স না মেনে অ্যালগরিদমের যৌক্তিক ধাপগুলো তুলে ধরে।

ট্রেস টেবিল (Trace Table): কাগজ-কলমে প্রোগ্রাম যাচাইয়ের জন্য ব্যবহৃত একটি বহুমাত্রিক ছক। এতে প্রোগ্রামের প্রতিটি চলক, শর্ত ও আউটপুটের জন্য আলাদা কলাম থাকে। ধাপ ধরে ধরে প্রতিটি চলকের মান লিখে প্রোগ্রামের ভুলত্রুটি ও অসীম লুপ আগেভাগেই ধরা যায়।

মডিউল ২: প্রোগ্রামিং প্যারাডাইম ও তিনটি মৌলিক নিয়ন্ত্রণ কাঠামো

২.১ বম-জ্যাকোপিনি কাঠামো উপপাদ্য (Böhm-Jacopini Theorem)

প্রাথমিক যুগের প্রোগ্রামিংয়ে অবাধে `GOTO` স্টেটমেন্ট ব্যবহার করার ফলে কোড অত্যন্ত জটিল হয়ে পড়ত, যাকে বলা হতো "স্প্যাগেটি কোড"। ১৯৬৬ সালে ইতালীয় গণিতবিদ কোরাদো বম ও জিউসেপ্পে জ্যাকোপিনি এক যুগান্তকারী উপপাদ্য প্রমাণ করেন:

বম-জ্যাকোপিনি উপপাদ্য: যেকোনো পরিগণনাযোগ্য অ্যালগরিদম বা কম্পিউটার প্রোগ্রামকে কোনো অনির্ভরযোগ্য জাম্প ছাড়াই শুধুমাত্র তিনটি মৌলিক নিয়ন্ত্রণ কাঠামোর সমন্বয়ে রচনা করা সম্ভব: অনুক্রম (Sequence), নির্বাচন (Selection), এবং পুনরাবৃত্তি (Iteration)।
২.২ তিনটি মৌলিক নিয়ন্ত্রণ কাঠামোর পুঙ্খানুপুঙ্খ বিবরণ
  1. অনুক্রমিক কাঠামো (Sequence Construct): নির্দেশাবলি উপর থেকে নিচে একটির পর একটি স্বাভাবিক রৈখিক ক্রমানুসারে নির্বাহ হয়। প্রথম নির্দেশের কাজ শেষ না হওয়া পর্যন্ত দ্বিতীয় নির্দেশ শুরু হতে পারে না।
  2. নির্বাচন বা শর্তাধীন শাখা কাঠামো (Selection / Branching): কোনো নির্দিষ্ট শর্তের ওপর ভিত্তি করে প্রোগ্রামের গতিপথ পরিবর্তিত হয়:
    • একক বিকল্প (`IF-THEN`): শর্ত সত্য হলে নির্দিষ্ট কাজ হয়, মিথ্যা হলে কিছুই না করে পরবর্তী ধাপে চলে যায়।
    • দ্বৈত বিকল্প (`IF-THEN-ELSE`): শর্ত সত্য হলে একটি ব্লক এবং মিথ্যা হলে সম্পূর্ণ বিপরীত অন্য একটি ব্লক কাজ করে।
    • বহু বিকল্প সিঁড়ি (`IF-ELSE-IF` Ladder): একাধিক শর্ত ক্রমানুসারে পরীক্ষা করা হয়; প্রথম যে শর্তটি সত্য হয় কেবল সেটির কাজ হয়।
    • বহুমুখী নির্বাচন (`SWITCH-CASE`): একটি নির্দিষ্ট ইন্টিজার বা ক্যারেক্টার চলকের বিভিন্ন নির্দিষ্ট মানের ওপর ভিত্তি করে সরাসরি নির্দিষ্ট কেস লেবেলে জাম্প করে।
  3. পুনরাবৃত্তি বা লুপ কাঠামো (Iteration / Looping): একটি নির্দিষ্ট শর্ত পূরণ থাকা পর্যন্ত নির্দেশের একটি ব্লককে বারবার সম্পাদন করা হয়। লুপ মূলত দুই প্রকার:
    • প্রাক-পরীক্ষিত বা প্রবেশ-নিয়ন্ত্রিত লুপ (Entry-Controlled / Pre-Tested Loop - `WHILE`, `FOR`): লুপে প্রবেশের পূর্বেই শর্ত পরীক্ষা করা হয়। শর্ত শুরুতেই মিথ্যা হলে লুপের বডি ০ বার (একবারও না) কাজ করে।
    • প্রস্থান-নিয়ন্ত্রিত লুপ (Exit-Controlled / Post-Tested Loop - `DO-WHILE`): লুপের কাজ একবার শেষ করার পরে শর্ত পরীক্ষা করা হয়। ফলে শর্ত মিথ্যা হলেও লুপের বডি অন্তত ১ বার নিশ্চিতভাবে নির্বাহ হয়।
২.৩ একটি লুপের অঙ্গসমূহ এবং সাধারণ ত্রুটিসমূহ

প্রতিটি সঠিক লুপের চারটি অবিচ্ছেদ্য অংশ থাকে: ১. প্রারম্ভিকীকরণ (Initialization), ২. পরীক্ষা শর্ত (Termination Test), ৩. লুপ বডি (Loop Body), এবং ৪. আপডেট (Increment/Decrement)।

  • অসীম লুপ (Infinite Loop): যদি আপডেট পদটি বাদ পড়ে যায় অথবা এমন শর্ত দেওয়া হয় যা কখনো মিথ্যা হতে পারে না, তবে প্রোগ্রাম অনন্তকাল চলতে থাকে এবং সিস্টেম হ্যাং করে।
  • অফ-বাই-ওয়ান ভুল (Off-by-One / Fencepost Error): লুপের শর্তে `<` এর স্থলে `<=` ব্যবহারের কারণে লুপটি প্রয়োজনীয় সংখ্যার চেয়ে একবার বেশি বা একবার কম চললে এই যৌক্তিক ভুলের সৃষ্টি হয়।

মডিউল ৩: মডুলার প্রোগ্রামিং, টপ-ডাউন নকশা ও মেমোরি কল স্ট্যাক

৩.১ টপ-ডাউন পদ্ধতি ও স্টেপওয়াইজ রিফাইনমেন্ট

একটি বিশাল ও জটিল প্রোগ্রামকে এককভাবে না লিখে ছোট ছোট স্বয়ংসম্পূর্ণ উপ-সমস্যায় বা মডিউলে (ফাংশন/সাবরুটিন) ভাগ করে সমাধান করার পদ্ধতিকে মডুলার প্রোগ্রামিং বলা হয়:

  • টপ-ডাউন নকশা (Top-Down Design): মূল সমস্যাটিকে প্রথমে কয়েকটি প্রধান স্তরে ভাগ করা হয়, এরপর প্রতিটি স্তরকে পুনরায় যতক্ষণ না ক্ষুদ্রাতিক্ষুদ্র সুনির্দিষ্ট ফাংশনে রূপান্তর করা যায়, ততক্ষণ বিভক্ত করা হয় (Stepwise Refinement)।
  • সুবিধাসমূহ: কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি, দলগতভাবে কাজ করার সুবিধা, পৃথকভাবে ত্রুটি নির্ণয় ও সংশোধন (Testing & Debugging)।
৩.২ সংহতি (Cohesion) ও সংযোগ (Coupling)
  • সংহতি (Cohesion): একটি একক মডিউলের ভেতরের নির্দেশগুলো কতটা ঘনিষ্ঠভাবে একটিমাত্র নির্দিষ্ট কাজ সম্পন্ন করার জন্য নিবেদিত, তার পরিমাপ। একটি আদর্শ সফটওয়্যারে উচ্চ সংহতি (High Cohesion) থাকা বাঞ্ছনীয়।
  • সংযোগ (Coupling): একটি মডিউলের সাথে অন্য মডিউলের পারস্পরিক নির্ভরশীলতার মাত্রা। মডিউলগুলোর মধ্যে নিম্ন বা শিথিল সংযোগ (Low Coupling) কাম্য, যাতে একটির পরিবর্তনে অন্যটি ক্ষতিগ্রস্ত না হয়।
৩.৩ ফাংশন আর্গুমেন্ট ও প্যারামিটার
  • আনুষ্ঠানিক প্যারামিটার (Formal Parameters): ফাংশন সংজ্ঞায়নের সময় যে চলকগুলো গ্রহণ করা হয় (যেমন `int add(int x, int y)`-তে `x` ও `y`)।
  • প্রকৃত আর্গুমেন্ট (Actual Arguments): মূল প্রোগ্রাম থেকে ফাংশন কল করার সময় যে বাস্তব মান বা চলক পাঠানো হয় (যেমন `add(a, b)`-তে `a` ও `b`)।
৩.৪ মান দ্বারা প্রেরণ (Call by Value) বনাম রেফারেন্স দ্বারা প্রেরণ (Call by Reference)
তুলনার বিষয়কল বাই ভ্যালু (Call by Value)কল বাই রেফারেন্স (Call by Reference)
ডেটা প্রেরণপ্রকৃত আর্গুমেন্টের মানের একটি অবিকল প্রতিলিপি (Copy) পাঠানো হয়।আর্গুমেন্টের প্রকৃত মেমোরি ঠিকানা (Address/Pointer) পাঠানো হয়।
মেমোরি সেলফাংশনের ভেতরে আলাদা নতুন মেমোরি তৈরি হয়।আলাদা মেমোরি লাগে না, মূল চলকের স্মৃতিঠিকানাই ব্যবহৃত হয়।
মূল চলকের পরিবর্তনফাংশনের ভেতরে প্যারামিটারের মান পাল্টালেও মূল চলকের মান অপরিবর্তিত থাকে।ফাংশনের ভেতরের যেকোনো পরিবর্তন মূল চলককে সরাসরি প্রভাবিত করে।
গতি ও মেমোরিবৃহৎ ডেটা কাঠামোর ক্ষেত্রে ডেটা কপির কারণে গতি হ্রাস পেতে পারে।অত্যন্ত দ্রুত এবং মেমোরি সাশ্রয়ী।
৩.৫ চলকের পরিধি (Scope) ও স্থায়িত্বকাল (Lifetime)
  • পরিধি (Scope): প্রোগ্রামের যে অংশে চলকটি দৃশ্যমান ও ব্যবহারের যোগ্য থাকে। লোকাল ভেরিয়েবলের পরিধি কেবল সংশ্লিষ্ট ব্লকের ভেতরেই সীমাবদ্ধ থাকে; গ্লোবাল ভেরিয়েবল সমগ্র প্রোগ্রামের যেকোনো অংশ থেকে ব্যবহারযোগ্য।
  • স্থায়িত্বকাল (Lifetime): মেমোরিতে চলকটির টিকে থাকার সময়সীমা। লোকাল ভেরিয়েবল ফাংশন শেষ হলেই মেমোরি থেকে মুছে যায়; গ্লোবাল ভেরিয়েবল প্রোগ্রাম শুরু থেকে শেষ পর্যন্ত বহাল থাকে।
৩.৬ রিকার্শন ও রানটাইম কল স্ট্যাক (Call Stack)

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

  1. ভিত্তি শর্ত (Base Case): একটি সুনির্দিষ্ট অ-পুনরাবৃত্তিমূলক শর্ত যেখানে রিকার্শন থেমে যায় (যেমন $0! = ১$)। এটি না থাকলে অসীম রিকার্শন ঘটবে।
  2. রিকার্সিভ ধাপ (Recursive Step): যেখানে ফাংশনটি ক্ষুদ্রতর ইনপুট সহকারে পুনরায় নিজেকে কল করে ($n! = n imes (n-১)!$)।

রানটাইম কল স্ট্যাক: প্রতিটি ফাংশন কলের সময় অপারেটিং সিস্টেম মেমোরির স্ট্যাক অংশে একটি অ্যাক্টিভেশন রেকর্ড বা স্ট্যাক ফ্রেম (Stack Frame) পুশ (Push) করে। যখন ফাংশন কাজ শেষ করে মান ফেরত দেয়, তখন ফ্রেমটি স্ট্যাক থেকে পপ (Pop) হয়ে যায় (LIFO নিয়ম)। ভিত্তি শর্ত ভুল হলে স্ট্যাক মেমোরি পূর্ণ হয়ে গিয়ে স্ট্যাক ওভারফ্লো (Stack Overflow) ক্র্যাশ ঘটে।

মডিউল ৪: ডেটা টাইপ, চলক, অপারেটর ও সমীকরণ মূল্যায়ন

৪.১ ডেটা টাইপ, চলক ও ধ্রুবকের ধারণা
  • মৌলিক ডেটা টাইপ: ইন্টিজার (`int`, পূর্ণসংখ্যা), ফ্লোট ও ডাবল (`float`, `double`, ভগ্নাংশযুক্ত দশমিক সংখ্যা), ক্যারেক্টার (`char`, একক বর্ণ বা চিহ্ন), এবং বুলিয়ান (`bool`, সত্য/মিথ্যা)।
  • চলক (Variables): মেমোরির নামাঙ্কিত স্থান যেখানে সংরক্ষিত মান প্রোগ্রাম চলাকালীন পরিবর্তিত হতে পারে।
  • ধ্রুবক (Constants): যার মান প্রোগ্রাম নির্বাহকালে কখনো পরিবর্তন করা যায় না।
  • আইডেন্টিফায়ারের নামকরণের নিয়ম: বর্ণমালা বা আন্ডারস্কোর (`_`) দিয়ে শুরু হতে হবে; কোনো ফাঁকা স্থান বা বিশেষ চিহ্ন থাকা চলবে না; কোনো সংরক্ষিত কিওয়ার্ড (যেমন `while`, `int`) নাম হিসেবে ব্যবহার করা যাবে না।
৪.২ অপারেটরের শ্রেণিবিন্যাস ও অগ্রাধিকার (Precedence)
  • গাণিতিক অপারেটর: যোগ (`+`), বিয়োগ (`-`), গুণ (`*`), ভাগ (`/`), ভাগশেষ বা মডুলাস (`%`)। লক্ষণীয়: পূর্ণসংখ্যার ভাগে ভগ্নাংশ বাদ যায় ($৭ / ২ = ৩$), কিন্তু ফ্লোটিং ভাগে $৭.০ / ২.০ = ৩.৫$ হয়।
  • সম্পর্কযুক্ত অপারেটর: তুলনা করতে ব্যবহৃত হয়: `==`, `!=`, `<`, `<=`, `>`, `>=`। ফলাফল সর্বদা ১ (True) বা ০ (False) হয়।
  • যৌক্তিক অপারেটর: লজিক্যাল অ্যান্ড (`&&`), লজিক্যাল অর (`||`), লজিক্যাল নট (`!`)।
  • ইনক্রিমেন্ট ও ডিক্রিমেন্ট: প্রি-ইনক্রিমেন্ট (`++x`, মান আগে বৃদ্ধি পায় পরে ব্যবহৃত হয়) বনাম পোস্ট-ইনক্রিমেন্ট (`x++`, বর্তমান মান ব্যবহৃত হওয়ার পর বৃদ্ধি পায়)।
  • অপারেটরের অগ্রাধিকার: বন্ধনী `()` > ইউনারি `++`, `--`, `!` > গুণ/ভাগ/ভাগশেষ `*`, `/`, `%` > যোগ/বিয়োগ `+`, `-` > সম্পর্কযুক্ত `<`, `>` > সমতা `==`, `!=` > যৌক্তিক `&&` > `||` > অ্যাসাইনমেন্ট `=`।
৪.৩ শর্ট-সার্কিট মূল্যায়ন (Short-Circuit Evaluation)

কম্পাইলার যৌগিক শর্ত মূল্যায়নে অতিরিক্ত সময় বাঁচাতে এই কৌশল প্রয়োগ করে:

  • `A && B` সমীকরণে যদি প্রথম অংশ `A` মিথ্যা (False) হয়, তবে দ্বিতীয় অংশ `B` আর পরীক্ষাই করা হয় না, কারণ সম্পূর্ণ শর্তটি কোনোমতেই সত্য হতে পারে না।
  • `A || B` সমীকরণে যদি প্রথম অংশ `A` সত্য (True) হয়, তবে দ্বিতীয় অংশ `B` আর পরীক্ষাই করা হয় না।
  • এর ফলে রানটাইমে শূন্য দিয়ে ভাগের মতো মারাত্মক ক্র্যাশ প্রতিরোধ করা যায়: `if (n != 0 && sum / n > 50)`।
৪.৪ টাইপ রূপান্তর (Type Casting)
  • অন্তর্নিহিত রূপান্তর (Implicit / Type Promotion): কম্পাইলার স্বয়ংক্রিয়ভাবে ছোট ডেটা টাইপকে বড় ডেটা টাইপে উন্নীত করে ডেটা ক্ষয় রোধ করে ($ ext{int} + ext{float} ightarrow ext{float}$)।
  • স্পষ্ট রূপান্তর (Explicit Casting): প্রোগ্রামার নিজে কাস্ট অপারেটর `(type)` ব্যবহার করে জোরপূর্বক রূপান্তর করেন (যেমন `(int)3.85` ভগ্নাংশ কেটে `3` প্রদান করে)।

মডিউল ৫: প্রোগ্রাম উন্নয়ন জীবনচক্র (PDLC) ও সফটওয়্যার গুণমান

৫.১ পিডিএলসি (PDLC)-এর ছয়টি পর্যায়
  1. সমস্যার সংজ্ঞায়ন (Problem Definition): প্রয়োজনীয়তা ও ব্যবহারকারীর লক্ষ্য চূড়ান্ত করা।
  2. সিস্টেম বিশ্লেষণ ও অ্যালগরিদম নকশা: ডেটা স্ট্রাকচার নির্ধারণ, অ্যালগরিদম ও ফ্লোচার্ট প্রস্তুতকরণ।
  3. কোডিং ও প্রোগ্রাম রচনা: উচ্চস্তরের প্রোগ্রামিং ভাষায় মডুলার কোড লেখা।
  4. কম্পাইলেশন ও অনুবাদ: কোডকে মেশিন ভাষায় অনুবাদ করে সিনট্যাক্স ভুল দূর করা।
  5. টেস্টিং ও ডিবাগিং (Testing & Debugging): বিভিন্ন ধরনের জটিল ও টেস্ট ডেটা প্রয়োগ করে ভুল শনাক্ত ও সংশোধন করা।
  6. ডকুমেন্টেশন ও রক্ষণাবেক্ষণ: ব্যবহারকারীর ম্যানুয়াল তৈরি এবং সফটওয়্যারকে যুগোপযোগী রাখা।
৫.২ সফটওয়্যারের ত্রুটিসমূহ (Bug Taxonomy)
ত্রুটির ধরনকখন ধরা পড়েউৎপত্তির কারণশনাক্তকরণের উপায়উদাহরণ
সিনট্যাক্স ভুল (Syntax Error)কম্পাইলেশনের সময়প্রোগ্রামিং ভাষার ব্যাকরণগত নিয়ম ভঙ্গ করা।কম্পাইলার ফাইল ও লাইন নম্বরসহ নির্দেশ দেয়।সেমিকোলন বাদ দেওয়া, ভুল বানান (`whle`)।
রানটাইম ভুল (Runtime Error)প্রোগ্রাম চলার সময়অবৈধ গাণিতিক বা মেমোরি সংক্রান্ত অনুরোধ।প্রোগ্রাম আকস্মিক বন্ধ হয়ে যায় ও ক্র্যাশ করে।শূন্য দিয়ে ভাগ (`x / 0`), সীমার বাইরে অ্যারে।
যৌক্তিক ভুল (Logical Error)ফলাফল যাচাইয়েঅ্যালগরিদমের ত্রুটিপূর্ণ সূত্র বা ভুল শর্ত।ভুল আউটপুট পাওয়া যায়, কিন্তু কোড ক্র্যাশ করে না।`+` এর জায়গায় `-` দেওয়া, লুপে ভুল সীমা।
৫.৩ টেস্টিং ও ডিবাগিং কৌশল
  • ব্ল্যাক-বক্স টেস্টিং: কোডের ভেতরের গঠন না দেখে কেবল ইনপুট দিয়ে সঠিক আউটপুট আসছে কিনা যাচাই করা।
  • হোয়াইট-বক্স টেস্টিং: কোডের অভ্যন্তরীণ লজিক, প্রতিটি শাখা ও পথ পুঙ্খানুপুঙ্খ পরীক্ষা করা।
  • বাউন্ডারি ভ্যালু অ্যানালিসিস: ইনপুটের সর্বনিম্ন, সর্বোচ্চ এবং প্রান্তিক সীমানায় (Boundary values) পরীক্ষা করা।
  • ডিবাগিং পদ্ধতি: সাময়িক প্রিন্ট স্টেটমেন্ট দিয়ে মান পর্যবেক্ষণ করা অথবা আইডিই-তে ব্রেকপয়েন্ট (Breakpoint) বসিয়ে এক এক লাইন করে এক্সিকিউট করে চলকের মান পরীক্ষা করা।

মডিউল ৬: অ্যালগরিদমের দক্ষতা ও অ্যাসিম্পটোটিক বিগ-ও (Big-O) বিশ্লেষণ

৬.১ অ্যালগরিদমের দক্ষতা পরিমাপের মানদণ্ড

একই সমস্যা সমাধানের জন্য একাধিক সঠিক অ্যালগরিদম থাকতে পারে। এদের মধ্যে কোনটি শ্রেষ্ঠ তা দুটি বিষয়ের ওপর নির্ভর করে:

  • সময় জটিলতা (Time Complexity): ইনপুট সাইজ $N$ বৃদ্ধির সাথে সাথে অ্যালগরিদমটির মোট মৌলিক অপারেশনের সংখ্যা কীভাবে বৃদ্ধি পায়।
  • স্থান জটিলতা (Space Complexity): ইনপুট সাইজ $N$ নির্বাহকালে অ্যালগরিদমটির সর্বোচ্চ অতিরিক্ত কত মেমোরি (RAM) প্রয়োজন হয়।
৬.২ অ্যাসিম্পটোটিক নোটেশন ও বিগ-ও (Big-O)

যেহেতু বিভিন্ন কম্পিউটারের হার্ডওয়্যারের গতি আলাদা, তাই বাস্তব সেকেন্ডে সময় না মেপে গাণিতিক বৃদ্ধির হার দিয়ে জটিলতা প্রকাশ করা হয়:

  • বিগ-ও নোটেশন ($O$): অ্যালগরিদমের সর্বনিকৃষ্ট সীমা (Worst-case Upper Bound) প্রকাশ করে। এটি নিশ্চিত করে যে অ্যালগরিদমটির নির্বাহ সময় কোনোমতেই এই সীমার চেয়ে খারাপ হবে না।
  • বিগ-ওমেগা ($\Omega$): সর্বোত্তম সম্ভাব্য নিম্নসীমা (Best-case Lower Bound)।
  • বিগ-থিটা ($\Theta$): সুনির্দিষ্ট টাইট বাউন্ড (Tight Bound)।
৬.৩ সাধারণ বিগ-ও জটিলতা শ্রেণিসমূহ
জটিলতা শ্রেণিনামবৃদ্ধির প্রকৃতিবাস্তব উদাহরণ
$O(1)$ধ্রুবক সময় (Constant)ইনপুট সাইজ যতই বাড়ুক, সময় সর্বদা অপরিবর্তিত থাকে।অ্যারের সূচক দিয়ে সরাসরি ডেটা অ্যাক্সেস (`arr[i]`)।
$O(\log n)$লগারিদমিক সময়প্রতি ধাপে ইনপুট অর্ধেক হয়ে যায়; অত্যন্ত দ্রুতগতির।সাজানো তালিকায় দ্বিমিক সন্ধান (Binary Search)।
$O(n)$রৈখিক সময় (Linear)ইনপুটের সমানুপাতিক হারে অপারেশনের সংখ্যা বাড়ে।সাধারণ রৈখিক সন্ধান (Linear Search)।
$O(n \log n)$লিনিয়ারিমিক সময়তুলনাভিত্তিক সাজানোর অ্যালগরিদমের সর্বোত্তম সময়।মার্জ সর্ট (Merge Sort), কুইক সর্ট।
$O(n^2)$দ্বিঘাত সময় (Quadratic)ইনপুট দ্বিগুণ হলে সময় চারগুণ বৃদ্ধি পায়; নেস্টেড লুপ।বাবল সর্ট (Bubble Sort), সিলেকশন সর্ট।
৬.৪ বাস্তব তুলনা: রৈখিক সন্ধান ($O(n)$) বনাম দ্বিমিক সন্ধান ($O(\log n)$)

ধরা যাক, একটি সাজানো ডেটাবেসে $N = ১০,৪৮,৫৭৬$ ($২^{২০}$) টি রেকর্ড রয়েছে:

  • রৈখিক সন্ধান (Linear Search): প্রথম থেকে শেষ পর্যন্ত একটি একটি করে খোঁজে। সবচেয়ে খারাপ ক্ষেত্রে ঠিক ১০,৪৮,৫৭৬ বার তুলনা করতে হবে।
  • দ্বিমিক সন্ধান (Binary Search): প্রতিবার মাঝের মানের সাথে তুলনা করে অর্ধেক বাদ দেয়। সবচেয়ে খারাপ ক্ষেত্রে মাত্র $\log_২(১০,৪৮,৫৭৬) = \mathbf{২০ ext{ বার}}$ তুলনা করলেই নির্দিষ্ট রেকর্ডটি নিশ্চিতভাবে খুঁজে পাওয়া যাবে!
  • উপসংহার: দ্বিমিক সন্ধান রৈখিক সন্ধানের চেয়ে ৫২,০০০ গুণেরও বেশি দ্রুত, যা প্রমাণ করে সঠিক অ্যালগরিদম নির্বাচন করা কম্পিউটিংয়ে কতটা অপরিহার্য।

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

দ্বিমিক সন্ধানের সর্বোচ্চ তুলনা সংখ্যা
$$C_{max} = lceil log_2(N) rceil$$
রৈখিক সন্ধানের সর্বনিকৃষ্ট তুলনা সংখ্যা
$$C_{worst} = N$$
প্রথম N সংখ্যক স্বাভাবিক সংখ্যার যোগফল (লুপ ধাপ)
$$S = sum_{i=1}^{N} i = frac{N(N + 1)}{2}$$
ফ্যাক্টোরিয়ালের রিকার্সিভ সংজ্ঞা
fact(n) = cases{ 1 & text{if } n = 0 text{ or } n = 1 cr n times fact(n - 1) & text{if } n > 1 }
ইউক্লিডীয় গসাগু রিকার্শন সূত্র
gcd(a, b) = cases{ a & text{if } b = 0 cr gcd(b, a bmod b) & text{if } b > 0 }
কল স্ট্যাকের মেমোরি গভীরতা
$$T_{stack} = O(D)$$

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

উদাহরণ 1
ধাপে ধাপে সমাধান / উত্তর:
গাণিতিক যুক্তি: যদি কোনো সংখ্যা N যৌগিক হয়, তবে তার অন্তত একটি উৎপাদক d এমন থাকবে যাতে ২ <= d <= sqrt(N)। এই সীমার মধ্যে কোনো উৎপাদক না পাওয়া গেলে N নিশ্চিতভাবেই মৌলিক।

ধাপভিত্তিক অ্যালগরিদম:
ধাপ ১: [শুরু] অ্যালগরিদম আরম্ভ করি।
ধাপ ২: [ইনপুট গ্রহণ] ব্যবহারকারীর কাছ থেকে পূর্ণসংখ্যা N গ্রহণ করি।
ধাপ ৩: [সীমাবদ্ধতা পরীক্ষা] যদি N < ২ হয়, তবে "মৌলিক নয়" প্রদর্শন করে ধাপ ৯-এ যাই।
ধাপ ৪: [২-এর পরীক্ষা] যদি N == ২ হয়, তবে "মৌলিক সংখ্যা" প্রদর্শন করে ধাপ ৯-এ যাই।
ধাপ ৫: [জোড় সংখ্যা পরীক্ষা] যদি N % ২ == ০ হয়, তবে "যৌগিক সংখ্যা" প্রদর্শন করে ধাপ ৯-এ যাই।
ধাপ ৬: [লুপের প্রারম্ভিকীকরণ] ভাজক d = ৩ সেট করি।
ধাপ ৭: [বিভাজ্যতা পরীক্ষা লুপ]
    যতক্ষণ (d * d <= N) থাকবে, ততক্ষণ সম্পাদন করি:
        যদি (N % d == ০) হয় তবে:
            "যৌগিক সংখ্যা" প্রদর্শন করি
            ধাপ ৯-এ গমন করি
        d = d + ২ সেট করি (কেবল বিজোড় সংখ্যা পরীক্ষা)
ধাপ ৮: [ফলাফল ঘোষণা] "মৌলিক সংখ্যা" প্রদর্শন করি।
ধাপ ৯: [সমাপ্তি] অ্যালগরিদমের কাজ সমাপ্ত করি।

ফ্লোচার্ট প্রতীকের ব্যবহার:
- ওভাল: শুরু (ধাপ ১) এবং শেষ (ধাপ ৯)।
- সামান্তরিক: ইনপুট N গ্রহণ (ধাপ ২) এবং বার্তা প্রদর্শন (ধাপ ৩, ৪, ৫, ৭, ৮)।
- ডায়মন্ড: শর্তসমূহ `N < ২`, `N == ২`, `N % ২ == ০`, `d * d <= N`, এবং `N % d == ০`।
- আয়তক্ষেত্র: প্রক্রিয়াকরণ `d = ৩` এবং `d = d + ২`।
উদাহরণ 2
ধাপে ধাপে সমাধান / উত্তর:
অ্যালগরিদম যুক্তি:
যতক্ষণ (B != ০) থাকবে:
    ভাগশেষ R = A % B
    A = B
    B = R
লুপ শেষে A-এর মানই হলো নির্ণেয় গসাগু।

ট্রেস টেবিল (Desk-Check):
ধাপ নম্বরশর্ত পরীক্ষা (B != ০)ভাগশেষ R = A % Bনতুন A (A = B)নতুন B (B = R)মন্তব্য ও বিবরণ
প্রারম্ভিক অবস্থা--৫৪২৪মেমোরিতে ইনপুট লোড হলো
প্রথম পুনরাবৃত্তি২৪ != ০ (সত্য)৫৪ % ২৪ = ৬২৪৬A হলো ২৪, B হলো ৬
দ্বিতীয় পুনরাবৃত্তি৬ != ০ (সত্য)২৪ % ৬ = ০৬০A হলো ৬, B হলো ০
তৃতীয় পুনরাবৃত্তি০ != ০ (মিথ্যা)-৬০শর্ত মিথ্যা হওয়ায় লুপ সমাপ্ত

চূড়ান্ত ফলাফল: গসাগু = ৬। মাত্র ২টি পুনরাবৃত্তিতে নির্ভুলভাবে ফলাফল নির্ধারিত হলো।
উদাহরণ 3
ধাপে ধাপে সমাধান / উত্তর:
প্রথম পর্যায়: ওয়াইন্ডিং ফেজ (স্ট্যাকে পুশ প্রক্রিয়া):
১. `fact(4)` কল: স্ট্যাক ফ্রেম ১ তৈরি হলো। প্যারামিটার `n = ৪`। অপেক্ষা করছে `৪ * fact(3)` এর জন্য।
২. `fact(3)` কল: স্ট্যাক ফ্রেম ২ তৈরি হলো। প্যারামিটার `n = ৩`। অপেক্ষা করছে `৩ * fact(2)` এর জন্য।
৩. `fact(2)` কল: স্ট্যাক ফ্রেম ৩ তৈরি হলো। প্যারামিটার `n = ২`। অপেক্ষা করছে `২ * fact(1)` এর জন্য।
৪. `fact(1)` কল: স্ট্যাক ফ্রেম ৪ তৈরি হলো। প্যারামিটার `n = ১`। ভিত্তি শর্ত সত্য হলো (`n == ১`), ফলে মান ১ ফেরত দেয়।

সর্বোচ্চ স্ট্যাক অবস্থা (Depth = ৪ ফ্রেম):
[শীর্ষবিন্দু] ফ্রেম ৪: fact(1) → ১ রিটার্ন করে সমাপ্ত
             ফ্রেম ৩: fact(2) → অপেক্ষারত
             ফ্রেম ২: fact(3) → অপেক্ষারত
[পাদদেশ]     ফ্রেম ১: fact(4) → অপেক্ষারত

দ্বিতীয় পর্যায়: আনওয়াইন্ডিং ফেজ (স্ট্যাক থেকে পপ প্রক্রিয়া):
১. ফ্রেম ৪ পপ হলো: ফ্রেম ৩-কে মান ১ ফেরত দিল।
২. ফ্রেম ৩ হিসাব করল: `২ * ১ = ২`। ফ্রেম ৩ পপ হয়ে ফ্রেম ২-কে মান ২ ফেরত দিল।
৩. ফ্রেম ২ হিসাব করল: `৩ * ২ = ৬`। ফ্রেম ২ পপ হয়ে ফ্রেম ১-কে মান ৬ ফেরত দিল।
৪. ফ্রেম ১ হিসাব করল: `৪ * ৬ = ২৪`। ফ্রেম ১ পপ হয়ে মূল প্রোগ্রামকে চূড়ান্ত ফলাফল ২৪ ফেরত দিল।
উদাহরণ 4
ধাপে ধাপে সমাধান / উত্তর:
প্রারম্ভিক মান: a = ৫, b = ৩, c = ২।

অপারেটর অগ্রাধিকার নিয়ম: পোস্টফিক্স (`b--`, `c++`), প্রিফিক্স (`++a`), গুণ ও ভাগ (`*`, `/`), যোগ ও বিয়োগ (`+`, `-`), অ্যাসাইনমেন্ট (`=`)।

ধাপভিত্তিক মূল্যায়ন:
১. প্রথম প্রিফিক্স `++a`: `a` এর মান ৫ থেকে বেড়ে ৬ হলো। রাশিতে মান ব্যবহৃত হলো = ৬।
২. পোস্টফিক্স `b--`: রাশিতে বর্তমান মান ৩ ব্যবহৃত হলো। এরপর `b` এর মান কমে ২ হলো।
৩. দ্বিতীয় প্রিফিক্স `++a`: `a` এর মান ৬ থেকে বেড়ে ৭ হলো। রাশিতে মান ব্যবহৃত হলো = ৭।
৪. পোস্টফিক্স `c++`: রাশিতে বর্তমান মান ২ ব্যবহৃত হলো। এরপর `c` এর মান বেড়ে ৩ হলো।
রাশিটি দাঁড়াল: `x = ৬ + ৩ * ৭ - ২ / ২`।
৫. গুণ ও ভাগ সম্পাদন করি (বাম থেকে ডানে):
    `৩ * ৭ = ২১`
    `২ / ২ = ১` (পূর্ণসংখ্যার ভাগ)
রাশিটি দাঁড়াল: `x = ৬ + ২১ - ১`।
৬. যোগ ও বিয়োগ সম্পাদন করি:
    `৬ + ২১ = ২৭`
    `২৭ - ১ = ২৬`।

চূড়ান্ত মানসমূহ: x = ২৬, a = ৭, b = ২, c = ৩।
উদাহরণ 5
ধাপে ধাপে সমাধান / উত্তর:
ত্রুটিযুক্ত কোড:
১:  BEGIN CalculateAverage
২:  INTEGER N, count = ০, sum = ০
৩:  INPUT N;
৪:  WHLE (count <= N) DO
৫:      INTEGER val
৬:      INPUT val
৭:      sum = sum + val
৮:  END WHILE
৯:  FLOAT avg = sum / N
১০: PRINT "গড় হলো: " + avg
১১: END

ত্রুটি বিশ্লেষণ ও সঠিক সমাধান:
১. সিনট্যাক্স ভুল (লাইন ৪): `WHLE` কিওয়ার্ডের বানান ভুল আছে।
    সংশোধন: `WHILE (count < N) DO` লিখতে হবে।
২. যৌক্তিক ভুল (লাইন ৪ ও ৭): `count <= N` শর্তের কারণে লুপটি N বারের জায়গায় N+১ বার চলবে (Off-by-One)। এছাড়া লুপের মধ্যে `count`-এর মান কখনোই বৃদ্ধি করা হয়নি, যার ফলে এটি একটি অসীম লুপে (Infinite Loop) পরিণত হবে!
    সংশোধন: শর্ত `count < N` করতে হবে এবং লাইন ৭-এর পর `count = count + ১` যোগ করতে হবে।
৩. রানটাইম ভুল (লাইন ৯): ব্যবহারকারী যদি $N = ০$ ইনপুট দেয়, তবে `sum / N` করার সময় শূন্য দিয়ে ভাগের (Division by Zero) কারণে প্রোগ্রাম ক্র্যাশ করবে।
    সংশোধন: শর্ত দিয়ে রক্ষা করতে হবে: `IF (N > ০) THEN avg = sum / N ELSE avg = ০.০`।
৪. যৌক্তিক ভুল (লাইন ৯): দুটি ইন্টিজারের ভাগফল সর্বদা ইন্টিজার হয়, ফলে দশমিক মান বাদ পড়ে যাবে ($১৫ / ৪ = ৩.০$ হবে)।
    সংশোধন: স্পষ্ট রূপান্তর করতে হবে: `avg = (FLOAT)sum / N`।
উদাহরণ 6
ধাপে ধাপে সমাধান / উত্তর:
অংশ ক: লিনিয়ার সার্চ বিশ্লেষণ:
লিনিয়ার সার্চের সময় জটিলতা O(N)। সবচেয়ে খারাপ ক্ষেত্রে সম্পূর্ণ তালিকা খুঁজতে হয়:
সর্বোচ্চ তুলনা = N = ১০,৪৮,৫৭৬ বার।

অংশ খ: বাইনারি সার্চ বিশ্লেষণ:
বাইনারি সার্চের সময় জটিলতা O(log2 N)। প্রতি ধাপে ইনপুট অর্ধেক হয়ে যায়:
সর্বোচ্চ তুলনা = ceil(log2(১০,৪৮,৫৭৬)) = ceil(log2(২^২০)) = ২০ বার।

অংশ গ: বাস্তব সময় হিসাব (প্রতি তুলনায় ৫ ন্যানোসেকেন্ড):
১. লিনিয়ার সার্চের সময় = ১০,৪৮,৫৭৬ * (৫ * ১০^-৯ সেকেন্ড) = ৫.২৪ মিলিসেকেন্ড।
২. বাইনারি সার্চের সময় = ২০ * (৫ * ১০^-৯ সেকেন্ড) = ১০০ * ১০^-৯ সেকেন্ড = ০.০০০১ মিলিসেকেন্ড (১০০ ন্যানোসেকেন্ড)।
উপসংহার: বাইনারি সার্চ ৫২,৪২৮ গুণ বেশি দ্রুত, যা প্রমাণ করে বৃহৎ ডেটাসেটের ক্ষেত্রে অ্যালগরিদমের উপযুক্ততা প্রসেসরের গতির চেয়েও বেশি গুরুত্বপূর্ণ।

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

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

অ্যাসাইনমেন্ট অপারেটর (=) এবং রিলেশনাল সমতা অপারেটর (==) গুলিয়ে ফেলা।

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

মান রাখতে `=` ব্যবহার করো (`x = 5`), এবং তুলনা করতে `==` ব্যবহার করো (`if (x == 5)`)। `if (x = 5)` লিখলে মান ৫ সেট হয়ে শর্তটি সর্বদা সত্য হয়ে যাবে!

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

while লুপের ভেতরে চলকের মান আপডেট করতে ভুলে যাওয়া।

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

লুপের বডিতে সর্বদা শর্তে ব্যবহৃত চলকটির মান পরিবর্তন (`i++`) নিশ্চিত করো, নতুবা অসীম লুপ তৈরি হবে।

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

do-while লুপ শূন্য বার চলতে পারে বলে মনে করা।

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

যেহেতু do-while লুপের শর্ত শেষে পরীক্ষা করা হয়, তাই শর্ত শুরুতে মিথ্যা হলেও এটি অন্তত একবার নিশ্চিতভাবে নির্বাহ হবে।

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

রিকার্শনের সময় ভিত্তি শর্ত (Base case) দিতে ভুলে যাওয়া।

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

প্রতিটি রিকার্সিভ ফাংশনে একটি অ-পুনরাবৃত্তিমূলক থামার শর্ত থাকা আবশ্যক, নতুবা স্ট্যাক ওভারফ্লো হয়ে প্রোগ্রাম ক্র্যাশ করবে।

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

দুটি পূর্ণসংখ্যার ভাগফলে ভগ্নাংশ আশা করা (যেমন ৫ / ২ = ২.৫ মনে করা)।

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

সি প্রোগ্রামিংয়ে দুটি ইন্টিজারের ভাগফল সর্বদা পূর্ণসংখ্যা হয় (৫ / ২ = ২)। দশমিক পেতে যেকোনো একটিকে ফ্লোটে কাস্ট করো: `(float)৫ / ২ = ২.৫`।

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

মূল বিষয় 1
দ্বিতীয় অধ্যায়ে প্রোগ্রামিংয়ের মূল ভিত্তি ও সমস্যা সমাধানের সমস্ত তাত্ত্বিক ও প্রয়োগিক দিক আলোচিত হয়েছে। আমরা পর্যালোচনা করেছি সমস্যা সমাধানের সম্পূর্ণ জীবনচক্র এবং ডোনাল্ড নুথের পাঁচটি শর্ত মেনে অ্যালগরিদম গঠন, যা প্রমিত ANSI ফ্লোচার্ট ও ট্রেস টেবিলের মাধ্যমে রূপায়িত হয়। আমরা বিশ্লেষণ করেছি বম-জ্যাকোপিনি উপপাদ্য এবং আয়ত্ত করেছি তিনটি মৌলিক কাঠামো: অনুক্রম, নির্বাচন (if-else, switch) ও পুনরাবৃত্তি (while, do-while, for)। আমরা দেখেছি মডুলার ডিজাইনে টপ-ডাউন নকশা, উচ্চ সংহতি ও নিম্ন সংযোগের ভূমিকা এবং কল বাই ভ্যালু বনাম কল বাই রেফারেন্সের মেমোরি আচরণ। আমরা রিকার্শনে রানটাইম কল স্ট্যাকের পুশ-পপ মেকানিজম, প্রি/পোস্ট ইনক্রিমেন্ট অপারেটরের সমীকরণ মূল্যায়ন, পিডিএলসির পর্যায়সমূহ এবং সফটওয়্যার ত্রুটির প্রকারভেদ পরীক্ষা করেছি। পরিশেষে আমরা বিগ-ও নোটেশনের মাধ্যমে অ্যালগরিদমের সময় ও স্থান জটিলতা মূল্যায়ন করেছি এবং দ্বিমিক সন্ধানের পরম উৎকর্ষ প্রত্যক্ষ করেছি।

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

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

1
কোন ফ্লোচার্ট প্রতীক শর্তাধীন শাখা পরীক্ষার জন্য ব্যবহৃত হয় যা সত্য ও মিথ্যা দুটি পথে বিভক্ত হয়?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: হীরক বা ডায়মন্ড (Diamond) প্রতীক, যা সিদ্ধান্ত গ্রহণ বোঝায়।
2
একটি while লুপের প্রাথমিক শর্ত যদি শুরুতেই মিথ্যা হয়, তবে লুপের বডি কয়বার নির্বাহ হবে?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: ঠিক ০ বার (একবারও না), কারণ while একটি প্রবেশ-নিয়ন্ত্রিত লুপ।
3
N উপাদানের সাজানো তালিকায় বাইনারি সার্চের সর্বোচ্চ সময় জটিলতা কত?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: O(log2 N) বা O(log N) লগারিদমিক সময়।
4
রিকার্সিভ ফাংশনে ভিত্তি শর্ত (Base case) না থাকলে কী পরিণতি হবে?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: ফাংশনটি অসীমভাবে চলতে থাকবে এবং মেমোরি কল স্ট্যাক পূর্ণ হয়ে গিয়ে রানটাইম স্ট্যাক ওভারফ্লো ক্র্যাশ ঘটবে।
5
যদি a = ১০ হয়, তবে b = a++ + ++a সমীকরণের মান কত এবং a-এর চূড়ান্ত মান কত?
উত্তর ও ব্যাখ্যা দেখুন
উত্তর: a++ দেয় ১০ (তারপর a হয় ১১); ++a মান বাড়িয়ে ১২ করে এবং দেয় ১২; ফলে b = ১০ + ১২ = ২২, এবং a-এর চূড়ান্ত মান ১২।
অধ্যায় পড়া শেষ হয়েছে?
অনুশীলন শুরু করো

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

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