প্রোগ্রামিংয়ের মজার দুনিয়া

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

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

প্রোগ্রামিং কী?

তোমাকে যদি একটা খুবই বোকা মানুষ দেওয়া হয়, যাকে তুমি যা-ই বলবে সে তাই করবে, তাহলে কি খুব মজা হতো না? তুমি চাইলেই তোমার সব বাড়ির কাজ তাকে দিয়ে করিয়ে নিতে পারতে, সব পড়াশোনা সে করে দিত, আর তুমি খালি মাঠে-ঘাটে খেলে বেড়াতে পারতে, তা-ই না?

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

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

ভাত রাঁধার অ্যালগরিদম

অ্যালগরিদম নামের একটা শব্দ তুমি হরহামেশাই প্রোগ্রামারদের মুখে শুনতে পাবে। অনেক সময় মজা করে বলা হয়, প্রোগ্রামার যখন তাঁর কাজ কী ব্যাখ্যা করতে পারেন না, তখন তিনি এই শব্দ বলে পাশ কাটাতে চান। কিন্তু অ্যালগরিদম কিন্তু খুবই স্বাভাবিক একটা প্রক্রিয়া। যেকোনো কাজ করার জন্য যে ধাপগুলো একটি একটি করে করতে হয়, সেই ধাপগুলোকেই বলা হয় সেই কাজ করার অ্যালগরিদম। যেমন আমার খুব প্রিয় উদাহরণ হলো ভাত রাঁধার অ্যালগরিদম।

১. চুলা জ্বালাও
২. হাঁড়িতে চাল দাও
৩. হাঁড়িতে চালের দ্বিগুণ পানি দাও
৪. হাঁড়ি চুলার ওপর বসাও
৫. ১৫ মিনিট পর চাল ফুটে উঠলে চুলা থেকে নামাও
৬. ভাতের মাড় ফেলে দাও

এখন অন্য কেউ যদি নিচের মতো একটা অ্যালগরিদম দেয়?

১. রাইস কুকারে চাল দাও
২. চালের দ্বিগুণ পানি দাও
৩. রাইস কুকার চালাও
৪. ঘণ্টা বাজলে ভাত নামাও

এই দুটোই ভাত রাঁধার দুটি অ্যালগরিদম। কিন্তু তোমাকে যদি জিজ্ঞেস করি কোনটা ভালো? ধাপের সংখ্যার কথা চিন্তা করলে দ্বিতীয়টা ভালো, কারণ সেখানে কম ধাপ। কিন্তু বিদ্যুত্ বিলের কথা চিন্তা করলে আবার প্রথমটা ভালো।

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

শুরুর কথা

অ্যালগরিদম শেখা শুরু করার আগে, আমাদের সামান্য প্রোগ্রামিং জানা থাকা প্রয়োজন। যেহেতু এখন কলেজের পাঠ্যক্রমে সি প্রোগ্রামিং ভাষা অন্তর্ভুক্ত করা হয়েছে এবং বেশির ভাগ প্রতিযোগিতাতেই সি/সি++ ভাষায় প্রোগ্রাম লিখতে হয়, তাই আমরা সিতেই বিভিন্ন প্রোগ্রাম লিখব। এটি শেখার জন্য বিভিন্ন উপায় আছে। ইংরেজিতে লেখা বিভিন্ন বই যেমন আছে, তেমনি বাংলাতেও আছে তামিম শাহরিয়ার সুবিনের লেখা কম্পিউটার প্রোগ্রামিং নামের একটি বই। শুরু করার জন্য, বইটি বেশ ভালো। যদি অনলাইনে এই বইটি পড়তে চাও, তবে যেতে পারো এই ঠিকানায়: http://cpbook.subeen.com

তবে যতই বই পড়ো না কেন, প্রোগ্রামিং শেখার একমাত্র উপায় হলো বেশি বেশি করে প্রোগ্রামিং করা। এ কাজের জন্য বেশ কিছু ওয়েবসাইট আছে, যেখানে গিয়ে তুমি বিভিন্ন প্রশ্ন বা সমস্যা পাবে। তোমাকে প্রোগ্রামিং করে এ সমস্যাগুলোর সমাধান করতে হবে। মজার ব্যাপার হলো, তোমার প্রোগ্রাম সঠিক নাকি ভুল, সেটার জন্য তোমাকে বেশিক্ষণ অপেক্ষা করতে হবে না। ওয়েবসাইটের স্বয়ংক্রিয় বিচারকই তোমার প্রোগ্রামকে বিচার করে সঙ্গে সঙ্গে বলে দেবে তোমার প্রোগ্রাম কি ঠিক নাকি ভুল। এ ধরনের একটি ওয়েবসাইট হলো কোডমার্শাল। এর ঠিকানা হলো: https://algo.codemarshal.org/problems

অ্যাকাউন্ট খুলে তুমিও এখানে রাখা বিভিন্ন সমস্যার সমাধান করতে পারবে।

নমুনা সমস্যা ও সমাধান

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

একটি শ্রেণিতে ঘটি ছাত্র আছে। কিছুদিন আগেই তারা একটি পরীক্ষা দিয়েছিল এবং আজকে তাদের পরীক্ষার খাতা দেখানো হচ্ছে। এখন শিক্ষক তাদের সবার মার্কের গড় জানতে চান। তোমাকে ঘ এবং ঘটি ছাত্রের পরীক্ষার মার্ক দেওয়া হয়েছে। তোমাকে তাদের গড় মার্ক গণনা করতে হবে।

ইনপুটের বর্ণনা

প্রথম লাইনে একটি ধনাত্মক সংখ্যা ঞ দেওয়া আছে, যেটি হলো কতগুলো কেস আছে তার মান। তারপরে ঞটি লাইন আছে, যার প্রথমে আছে একটি সংখ্যা, ঘ ( ১ <= ঘ <= ১০০ ), ছাত্রদের সংখ্যার মান। ঘ-এর পরে আছে ঘটি সংখ্যা যেগুলো হলো ছাত্রদের মার্ক। ছাত্ররা ০ থেকে ১০০ এর ভেতরেই মার্ক পেয়েছে।

আউটপুটের বর্ণনা

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

Sample Input

3
5 1 2 3 4 5
3 100 0 20
4 0 0 100 100

Sample Output

Case 1: 3
Case 2: 40
Case 3: 50

বি.দ্র.: গড়-এর মান সব কেসের জন্য পূর্ণসংখ্যা হবে নিশ্চিত করা হয়েছে।

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