প্রোগ্রামিং শেখার সবচেয়ে বড় সুবিধা হলো কম্পাইলার। ভুল করলে সাথে সাথে লাল দাগ দিয়ে বলে দেয় কোথায় ভুল।
পরীক্ষার হলে সেই সুবিধাটা নেই। খাতায় লিখতে হয়, আর সেমিকোলন বাদ পড়লে কেউ বলে দেবে না।
তাই এই অধ্যায়ে প্রস্তুতির ধরনটা আলাদা হওয়া দরকার। সিনট্যাক্স আলাদা করে মুখস্থ করার চেয়ে কয়েকটা প্রোগ্রাম এত বার হাতে লেখো যে আঙুল নিজেই মনে রাখে।
C একটি স্ট্রাকচার্ড প্রোগ্রামিং ভাষা, যেখানে প্রতিটি প্রোগ্রাম main() ফাংশন থেকে চলা শুরু করে এবং প্রতিটি স্টেটমেন্ট সেমিকোলন দিয়ে শেষ হয়।
যে কাঠামোটা প্রতিবার লিখতে হবে
#include <stdio.h>
int main()
{
// এখানে কাজ
return 0;
}
প্রথম লাইনটা হেডার ফাইল, যেটা printf আর scanf ব্যবহারের অনুমতি দেয়। এটা বাদ দিলে প্রোগ্রাম চলবেই না — অথচ তাড়াহুড়োয় বাদ পড়ে খুব।
অভ্যাস করে ফেলো, খাতায় বসেই আগে এই কাঠামোটা লিখে নাও। তারপর ভেতরে কাজ ভরো। এতে অন্তত কাঠামোর নম্বরটা নিশ্চিত থাকে, ভেতরের যুক্তি ভুল হলেও।
প্রথম প্রোগ্রাম: যোগফল
বোর্ডে সবচেয়ে বেশি আসা প্রোগ্রামগুলোর একটা — ১ থেকে n পর্যন্ত যোগফল।
#include <stdio.h>
int main()
{
int n, i, sum = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
sum = sum + i;
}
printf("Sum = %d", sum);
return 0;
}
এই ছোট্ট প্রোগ্রামটার ভেতরে গোটা অধ্যায়ের অর্ধেক আছে — ভেরিয়েবল ঘোষণা, ইনপুট, লুপ, হিসাব, আউটপুট। তাই এটাকে ভালো করে বুঝে নিলে বাকি প্রোগ্রামগুলো এর রূপভেদ মাত্র।
দুটো জিনিস লক্ষ করো। scanf-এ n-এর আগে & আছে — এটা বাদ পড়া সবচেয়ে সাধারণ ভুল। আর sum-এর প্রাথমিক মান 0 দেওয়া হয়েছে, কারণ যোগ করছি।
এখন ফ্যাক্টরিয়াল লিখতে গেলে প্রায় একই কোড, শুধু দুটো বদল — sum = sum + i হয়ে যাবে fact = fact * i, আর প্রাথমিক মান 0-এর বদলে 1। গুণ করছি বলে 0 দিলে উত্তর সবসময় শূন্য আসবে।
এই একটা জায়গায় প্রতি বছর নম্বর যায়।
ডেটা টাইপ ও ফরম্যাট
int পূর্ণসংখ্যার জন্য, ফরম্যাট %d। float দশমিকের জন্য, %f। char একটা অক্ষরের জন্য, %c। double বড় দশমিকের জন্য, %lf।
ফরম্যাট ভুল হলে প্রোগ্রাম চলে, কিন্তু আউটপুট উদ্ভট আসে। int-এর জায়গায় %f লিখলে সংখ্যাটাই বদলে যাবে — আর কম্পাইলার এটা ধরবে না, কারণ ব্যাকরণগতভাবে ভুল নয়।
যেখানে = আর == আলাদা
একটা সমান চিহ্ন মানে মান বসানো। দুটো সমান চিহ্ন মানে তুলনা করা।
if (n % 2 == 0)
printf("Even");
else
printf("Odd");
এখানে n % 2 = 0 লিখলে অর্থ দাঁড়াত “n%2-এর মান 0 বসাও”, যা অর্থহীন। শর্তে সবসময় দুটো সমান চিহ্ন।
আর % চিহ্নটা ভাগশেষ দেয়, শুধু পূর্ণসংখ্যার সাথে কাজ করে। জোড়-বিজোড়, ভাজ্যতা, শেষ অঙ্ক বের করা — সবই এই এক চিহ্ন দিয়ে।
তিনটে সংখ্যার বৃহত্তম
if (a > b && a > c)
printf("%d", a);
else if (b > c)
printf("%d", b);
else
printf("%d", c);
&& মানে এবং — দুটো শর্তই সত্য হতে হবে। || মানে অথবা — যেকোনো একটা হলেই চলবে।
লুপ কোনটা কখন
কতবার ঘুরবে জানা থাকলে for। শর্ত সত্য থাকা পর্যন্ত চলবে, কতবার জানা নেই — তখন while। আর অন্তত একবার চলতেই হবে, শর্ত পরে দেখা হবে — do-while।
do-while আর while-এর পার্থক্যের প্রশ্ন আসে নিয়মিত। উত্তরটা এক লাইনে — while শর্ত আগে দেখে, do-while কাজ আগে করে।
অ্যারে
একই ধরনের অনেকগুলো মান এক নামে রাখার ব্যবস্থা। ইনডেক্স শুরু হয় শূন্য থেকে।
int marks[5];
marks[0] = 80;
পাঁচ ঘরের অ্যারেতে ইনডেক্স চলে ০ থেকে ৪ পর্যন্ত। marks[5] বলে কিছু নেই — সীমার বাইরে। এই শূন্য থেকে শুরুর ব্যাপারটা প্রথমে অস্বাভাবিক লাগে, কিন্তু অভ্যাস হয়ে যায়।
খাতায় নম্বর বাঁচানোর কয়েকটা কথা
সেমিকোলন বাদ পড়া নিয়ে সবাই সতর্ক করে। কিন্তু উল্টো ভুলটাও হয় — for বা if-এর শর্তের বন্ধনীর পরেই সেমিকোলন বসিয়ে দেওয়া। for (i=1; i<=n; i++); লিখলে লুপটা খালি ঘুরবে, ভেতরের কাজ একবারও হবে না।
ভেরিয়েবল ঘোষণা না করে ব্যবহার করা যায় না। শুরুতেই int বা float দিয়ে ঘোষণা করে নাও।
ইনডেন্ট রাখো। পরীক্ষক পড়তে পারলে নম্বর দিতে সুবিধা হয়, আর নিজেরও ব্র্যাকেট মেলাতে সুবিধা হয়।
আর কোড ভুলে গেলে ফাঁকা রেখে এসো না। যতটুকু পারো লেখো — কাঠামো, ভেরিয়েবল ঘোষণা, ইনপুট। আংশিক নম্বর আছে।
যেগুলো নিজে লিখে দেখতে হবে
- দুটি সংখ্যার যোগফল
- ১ থেকে ১০০ পর্যন্ত জোড় সংখ্যার যোগফল
- একটি সংখ্যা মৌলিক কিনা যাচাই
- n সংখ্যক পদের ফিবোনাচি ধারা
- পাঁচজনের নম্বরের গড় (অ্যারে ব্যবহার করে)
খাতায় লেখো, কম্পিউটারে নয়। কম্পিউটারে লিখলে ভুলগুলো কম্পাইলার ধরে ফেলবে আর তুমি শিখবে না কোথায় তোমার হাত ভুল করে। বোর্ডেও তো খাতাতেই লিখতে হবে।