Module ১ · C-র সঙ্গে পরিচয়: প্রথম program, চিহ্ন ধরে ধরে
চিহ্নের অভিধান: C-র প্রতিটা সাইন কী বলে
এই lesson-এ যা শিখবে
- C যে চিহ্নগুলো ব্যবহার করে, প্রতিটার আসল নাম আর একটা কাজ বলতে পারবে।
- চার রকম bracket দেখেই চিনতে পারবে, আর কোনটা কী কাজ করে বলতে পারবে।
- দেখতে একরকম ছয়টা জোড়া আলাদা করতে পারবে, শুরুটা single quote আর double quote দিয়ে।
Bob পর্দায় আঙুল রেখে Maria-কে জিজ্ঞেস করল, ওই আঁকাবাঁকা জিনিসটা কী করে। Maria জিজ্ঞেস করল, কোন আঁকাবাঁকা জিনিসটা। ওই লাইনে তিনটা আছে।
দুইজনের কেউই ওটা খুঁজে বের করতে পারছে না, কারণ কেউই জানে না ওটার নাম কী। এই lesson-টাই সেই অভিধান। এটা "ওই ছোট টুপির মতো জিনিসটা কী করে"-কে বানিয়ে দেয় "C-তে caret operator কী করে", যার উত্তর এক খোঁজেই মেলে।
Track-র বাকিটা করার সময় এই lesson খোলা রাখো। এটা দেখে নেওয়ার page, মুখস্থ করার chapter না।
Bracket আর brace: চারটা জোড়া, চারটা কাজ
C চার রকম bracket ব্যবহার করে, আর একটার জায়গায় আরেকটা বসে না। ভুল জোড়াটা ব্যবহার করা মানে সবচেয়ে দ্রুত একটা গোলমেলে message-এ পৌঁছানো।
| চিহ্ন | আসল নাম | একে আরও বলা হয় | C-তে কাজ | প্রথম দেখা |
|---|---|---|---|---|
( ) | Parentheses | round bracket, paren | Function call, parameter-র তালিকা, condition, দল বাঁধা, cast | M1 lesson 1 |
{ } | Braces | curly bracket, curly brace | Block, function-র body, initialiser-র তালিকা | M1 lesson 1 |
[ ] | Brackets | square bracket | Array ঘোষণা আর index করা | M9 |
< > | Angle brackets | chevron | System header include, আর ছোট-বড় মেলানো | M1 lesson 1 |
তাই parentheses call করে আর দল বাঁধে, brace block ধরে, bracket array-তে index করে, আর angle bracket সম্পর্কহীন দুইটা কাজ করে।
Arithmetic আর assignment
| চিহ্ন | আসল নাম | একে আরও বলা হয় | C-তে মানে | প্রথম দেখা |
|---|---|---|---|---|
+ | Plus sign | plus | যোগ, আর একক plus | M1 lesson 2 |
- | Minus sign | hyphen, dash | বিয়োগ, আর ঋণাত্মক করা | M1 lesson 4 |
* | Asterisk | star, times | গুণ; pointer ঘোষণা আর pointer ধরে যাওয়াও | M1 lesson 2 |
/ | Forward slash | slash, solidus | ভাগ; // আর /* comment-ও শুরু করে | M1 lesson 2 |
% | Percent sign | percent, mod | ভাগশেষ; printf-র placeholder-ও শুরু করে | M4 |
= | Equals sign | equals, gets | Assignment, কখনোই comparison না | M1 lesson 2 |
++ | Double plus | increment | এক যোগ করা | M4 |
-- | Double minus | decrement | এক বিয়োগ করা | M4 |
+= | Plus equals | যোগ করে বসানো | x += 3 মানে x = x + 3 | M4 |
=-কে মুখে পড়ো "পায়" বলে, "সমান" বলে না। ওই একটা অভ্যাসই গত lesson-র ফাঁদটা আটকে দেয়।
Comparison আর logic
| চিহ্ন | আসল নাম | একে আরও বলা হয় | C-তে মানে | প্রথম দেখা |
|---|---|---|---|---|
== | Double equals | equal to | সমান কি না; 1 বা 0 দেয় | M1 lesson 2 |
!= | Exclamation equals | not equal | সমান না কি না | M1 lesson 3 |
< > | Less-than, greater-than | angle bracket | মেলানো | M1 lesson 3 |
<= >= | Less-or-equal, greater-or-equal | মেলানো | M1 lesson 3 | |
&& | Double ampersand | logical AND | দুই দিকই সত্যি হলেই সত্যি | M5 |
|| | Double vertical bar | logical OR | যেকোনো এক দিক সত্যি হলেই সত্যি | M5 |
! | Exclamation mark | bang, logical NOT | সত্যিকে মিথ্যা আর মিথ্যাকে সত্যি করে | M5 |
এই table-র প্রতিটা চিহ্ন তোমাকে একটা সংখ্যা দেয়: সত্যির জন্য 1, মিথ্যার জন্য 0। নিচের Example 2 ছয়টা comparison-ই ছাপে।
Punctuation আর গঠনের চিহ্ন
| চিহ্ন | আসল নাম | একে আরও বলা হয় | C-তে কাজ | প্রথম দেখা |
|---|---|---|---|---|
; | Semicolon | Statement শেষ করে | M1 lesson 1 | |
, | Comma | Argument, declaration আর তালিকার জিনিস আলাদা করে | M1 lesson 1 | |
. | Full stop | period, dot | দশমিক বিন্দু, আর struct-র একটা member-এ পৌঁছানো | M12 |
: | Colon | Label, case, ?-র দ্বিতীয় অর্ধেক | M5 | |
? | Question mark | ternary | Conditional operator, :-র সঙ্গে জোড়ায় | M5 |
' | Single quote | apostrophe | একটা character: 'A' | M1 lesson 4 |
" | Double quote | quotation mark | একটা string: "Hello" | M1 lesson 1 |
\ | Backslash | reverse slash | \n-র মতো escape sequence শুরু করে | M1 lesson 1 |
# | Hash | number sign, pound | Preprocessor-র directive | M1 lesson 1 |
& | Ampersand | and sign | Address-of, আর bitwise AND | M1 lesson 1 |
| | Vertical bar | pipe | Bitwise OR | M4 |
^ | Caret | hat, circumflex | Bitwise XOR | M4 |
~ | Tilde | squiggle | Bitwise NOT | M4 |
_ | Underscore | low line | নামের ভেতরে চলে, আর শব্দ আলাদা করার চেনা উপায় | M1 lesson 5 |
-> | Arrow | Pointer ধরে struct-র একটা member | M12 |
Punctuation-র পুরো সেটটা এই। C-তে এমন আর কোনো চিহ্ন নেই যেটার সঙ্গে তোমার এখন পরিচয় হলো না।
দেখতে একরকম, এমন ছয়টা জোড়া
এই জোড়াগুলোই beginner-দের ঘণ্টার পর ঘণ্টা খায়। প্রতিটা সারিতে দুইটা চিহ্ন, যারা keyboard-এ পাশাপাশি বসে আর সম্পর্কহীন জিনিস বোঝায়।
| জোড়া | প্রথমটা | দ্বিতীয়টা | আলাদা রাখার উপায় |
|---|---|---|---|
'A' আর "A" | একটা character, 1 byte | একটা string, 2 byte: অক্ষরটা আর শেষের চিহ্নটা | Single quote-এ ঠিক একটা character থাকে |
= আর == | একটা মান বসায় | দুইটা মান মেলায় | একটাকে বলো "পায়", আরেকটাকে "সমান কি না" |
& আর && | Address-of, বা bitwise AND | Logical AND | দুইটা চিহ্ন মানে হ্যাঁ-না প্রশ্ন |
/ আর \ | ভাগ, আর comment-র শুরু | Escape sequence | যেটা সামনে হেলে আছে সেটা ভাগ করে |
*-র দুই কাজ | a * b গুণ করে | int *p একটা pointer ঘোষণা করে | বাঁয়ে একটা type থাকলে ওটা pointer |
<stdio.h> আর a < b | Include করার একটা header | একটা comparison | প্রথমটা কেবল #include লাইনেই বসে |
নিচের অনুশীলন 2-তে এমন একটা program আছে, যেটা এই ছয়টার চারটা পরপর ব্যবহার করে, আর তোমাকে আগেই বলতে বলে সেটা কী ছাপবে।
Escape sequence: আকারহীন character-গুলো
String-র ভেতরে একটা backslash একটা escape sequence শুরু করে। নিজের কোনো দেখার মতো আকার নেই এমন character, বা যেটা থাকলে string-টাই শেষ হয়ে যেত, সেটা লেখার উপায় এটাই।
| Escape | নাম | যা করে |
|---|---|---|
\n | Newline | পরের লাইনের শুরুতে যায় |
\t | Horizontal tab | পরের tab-র ঘরে লাফ দেয় |
\\ | Backslash | একটা আসল backslash ছাপে |
\" | Double quote | String শেষ না করে একটা quote ছাপে |
\' | Single quote | একটা আসল apostrophe ছাপে |
\0 | Null character | একটা C string-র শেষ চিহ্নিত করে |
\r | Carriage return | চলতি লাইনের শুরুতে ফেরে |
\a | Alert | Terminal-র ঘণ্টা বাজায় |
\b | Backspace | এক character পেছনে যায় |
%% | Percent, দুইবার | Escape না: printf এভাবেই একটা % ছাপে |
তুমি যতগুলোই লেখো, প্রতিটা escape output-এ একটা character। ওটা ঠিকঠাক গোনাই শেষের মাথা খাটানোর প্রশ্ন।
ছোট একটা program, যেটা C-র প্রতিটা bracket ব্যবহার করে, আর প্রতিটা কাজের নাম comment-এ বলা আছে।
#include <stdio.h> /* angle brackets: a system header */
int main(void) /* parentheses: the parameter list */
{ /* braces: the body of main */
int marks[3] = {90, 85, 77}; /* brackets declare, braces initialise */
printf("%d\n", marks[0]); /* parentheses call, brackets index */
return 0;
}
90
Array আসছে Module 9-এ, তাই marks[3] নিয়ে এখন ভাবতে হবে না। শুধু খেয়াল করো, চারটা আলাদা bracket এসেছে, আর এদের যেকোনো জোড়া অদলবদল করলেই program ভাঙে।
Comparison কোনো জাদু না। প্রতিটাই একটা expression, যার মান 1 বা 0, আর printf ওটাকে অন্য যেকোনো সংখ্যার মতোই ছাপতে পারে।
#include <stdio.h>
int main(void)
{
int a = 7;
int b = 4;
printf("a == b gives %d\n", a == b);
printf("a != b gives %d\n", a != b);
printf("a > b gives %d\n", a > b);
printf("a < b gives %d\n", a < b);
printf("a >= b gives %d\n", a >= b);
printf("a <= b gives %d\n", a <= b);
return 0;
}
a == b gives 0
a != b gives 1
a > b gives 1
a < b gives 0
a >= b gives 1
a <= b gives 0
b-কে 7 করে আবার চালাও। ছয়টার চারটা উত্তর উল্টে যায়, আর যে দুইটা যায় না, ওদের নাম তোমার বলতে পারা উচিত।
এই program-টা রেখে দাও। এটা tab দিয়ে আলাদা করা একটা table, quote-র ভেতরে একটা কথা, একটা Windows path আর একটা শতকরা ছাপে, আর তাতেই এই মাসে লাগবে এমন প্রতিটা escape চলে আসে।
#include <stdio.h>
int main(void)
{
printf("Name\tMarks\n");
printf("Zara\t92\n");
printf("Kenji\t87\n");
printf("She said \"well done\"\n");
printf("Path: C:\\progsity\\bin\n");
printf("Discount: 15%%\n");
return 0;
}
Name Marks
Zara 92
Kenji 87
She said "well done"
Path: C:\progsity\bin
Discount: 15%
Source-র শেষ দুইটা লাইন দেখো। দুইটা backslash একটা ছাপে, আর দুইটা percent চিহ্ন একটা ছাপে। আর সব জায়গায় জোড়ার প্রথমটাই নির্দেশ।
Compiler-এ চালাওএটা কোথায় কাজে লাগছে
- Compiler-র message পড়া।
expected '=', ',', ';', 'asm' or '__attribute__' before '-' tokenপড়া যায় না, যতক্ষণ তুমি বলতে না পারো "minus চিহ্নের আগে"। Message চিহ্নের নাম বলে, তাই তোমাকেও নামগুলো জানতে হয়। - সাহায্য চাওয়া। কোনো forum বা search engine "C-তে caret operator কী করে"-র উত্তর দেয়, আর "ওই ছোট টুপির মতো জিনিসটা কী করে"-র উত্তর দিতে পারে না। হুবহু শব্দ একটা debugging-র হাতিয়ার।
- Documentation পড়া। C standard library-র page-গুলো
printfবোঝায় percent চিহ্ন দিয়ে শুরু হওয়া conversion specification দিয়ে। এই lesson-র নামগুলোই ওই page-গুলোর নাম। - কাজে code review. "তোমার এখানে double ampersand দরকার, তুমি ampersand বসিয়েছ" এমন একটা বাক্য reviewer মুখেই বলে। এতে পাঠককে লাইনটা আবার পড়তে হয় না।
যে ভুলগুলো সবাই করে
১. Single quote দিয়ে একটা string লেখা।
printf('Hello\n');
GCC 12 দেয় warning: multi-character character constant, আর তারপর pointer-র জায়গায় integer পাঠানোর একটা warning। এটা build হয়, আর সাধারণত crash করে। Single quote-এ ঠিক একটা character থাকে; লেখার জন্য double quote লাগে।
২. একটা character-কে double quote-এ বসানো।
char grade = "A";
GCC 12-তে এটা warning: initialization of 'char' from 'char *' makes integer from pointer without a cast, আর GCC 14-তে error। তুমি এক byte-র বাক্সে একটা address রেখে দিলে। তুমি চেয়েছিলে 'A'।
৩. আসল backslash বোঝাতে একটা backslash লেখা।
printf("Path: C:\progsity\bin\n");
এখানে ভরসা করার মতো কোনো message নেই। \p হলো undefined behaviour, যেটা GCC চুপচাপ p হিসেবে ছাপে, আর \b একটা সত্যিকারের escape, backspace, যেটা তার আগের character খেয়ে ফেলে। Output দেখতে প্রায় ঠিক লাগে, আর ঠিক না। আসল backslash সব সময় দুইবার লেখো।
৪. নামের ভেতরে hyphen।
int total-marks = 90;
Message হলো error: expected '=', ',', ';', 'asm' or '__attribute__' before '-' token। C hyphen-টাকে বিয়োগ ধরে নিয়েছে, তারপর বিয়োগ করার মতো কিছু পায়নি। নামে underscore বসে, আর সেজন্যই পরের lesson ওটাকে total_marks বলে।
Zara হাতে নোট নিচ্ছিল, আর চিহ্নের বদলে চিহ্নগুলোর নাম লিখে ফেলেছে। আসল চিহ্নগুলো ফিরিয়ে দাও, যাতে program-টা expression আর তার মান ছাপে।
Input. এক লাইনে দুইটা integer a b।
Output. ঠিক এক লাইন: (a + b) * 2 = X, দুইটা সংখ্যা আর উত্তরটা বসানো অবস্থায়।
Constraints. 0 <= a, b <= 1000।
Sample. Input 7 4 দিলে আসে (7 + 4) * 2 = 22। Parentheses আর asterisk character হিসেবে ছাপা হয়, আর দ্বিগুণ করাটা সত্যিকারের হিসাব।
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d %d", &a, &b);
/* Print: open-paren, a, space, plus, space, b, close-paren,
space, asterisk, space, 2, space, equals, space, the value. */
printf("%d\n", 0);
return 0;
}
Hidden test সহ grading হয় এই module-র Problems lesson-এ, restore-symbols নামে।
এই program চার লাইন কী ছাপবে, চালানোর আগে কাগজে লিখে ফেলো। তারপর চালিয়ে মিলিয়ে দেখো।
#include <stdio.h>
int main(void)
{
int a = 6;
int b = 3;
char grade = 'A';
printf("%d\n", a & b);
printf("%d\n", a && b);
printf("%c\n", grade);
printf("%d\n", a / b);
return 0;
}
কী খেয়াল করবে। 1 আর 2 নম্বর লাইনের তফাত একটা character, আর উত্তর আলাদা। Bitwise AND আসছে Module 4-এ, তাই এখন শুধু দেখো যে দুইটা চিহ্ন এক চিহ্ন না।
নিজে যাচাই করো। দেখার আগে চার লাইনের প্রতিটার নাম লিখে ফেলো: bitwise AND, logical AND, একটা character, integer-র ভাগ। চারটার নামই বলতে পারলে এই lesson-র কাজ হয়ে গেছে।
Compiler-এ চালাওযে প্রশ্নগুলো সবার মনে আসে
এই সবগুলো মুখস্থ করতে হবে?
না। চারটা bracket-র নাম আর দেখতে একরকম ছয়টা জোড়া তোমার দরকার। বাকিটা ফিরে এসে দেখে নেওয়ার page, আর সেজন্যই শেষ column-টা বলে দেয় প্রতিটা চিহ্ন প্রথম কোথায় আসে।
C-তে এত punctuation কেন?
কারণ 1972 সালের একটা ধীর terminal-র জন্য এটা বানানো, যেখানে ছোট একটা চিহ্ন লম্বা একটা শব্দকে হারিয়ে দিত। Python কিছু কাজে শব্দ বেছেছে, যেটা পড়তে সহজ আর লিখতে বেশি।
"একে আরও বলা হয়" নামগুলো কি ভুল?
ওগুলো অনানুষ্ঠানিক, আর সবাই ব্যবহার করে। ইচ্ছা হলে curly bracket বলো, আর জেনে রাখো standard আর প্রতিটা error message ওদের brace বলে।
নামে কোন চিহ্নগুলো ব্যবহার করতে পারি?
অক্ষর, অঙ্ক আর underscore, আর নাম অঙ্ক দিয়ে শুরু হতে পারে না। এই table-র বাকি সবই operator বা punctuation, তাই ওগুলো নামটা শেষ করে দেয়।
অন্যের code-এ
<<-র মতো যা দেখি, সেগুলো?ওগুলো এখানকার চিহ্নগুলোরই জোড়া।
<<হলো দুইটা less-than চিহ্ন, আর মানে bit shift, আসছে Module 4-এ। টুকরোগুলোর নাম বলতে পারলে জোড়াটাও খুঁজে নিতে পারবে।
মূল কথা
- চার রকম bracket, চারটা কাজ: parentheses call করে, brace block বানায়, bracket index করে, angle bracket include করে বা মেলায়।
- প্রতিটা চিহ্নের একটা আসল নাম আছে, আর error message সেটাই ব্যবহার করে।
- Single quote-এ একটা character থাকে; double quote-এ একটা string।
&আর&&,=আর==,/আর\: দেখতে এক, মানে সম্পর্কহীন তিনটা জোড়া।- তুমি যতগুলোই লেখো, একটা escape sequence output-এ একটা character।
- দুইটা backslash একটা ছাপে, আর দুইটা percent চিহ্ন একটা ছাপে।
পরের lesson-এ দেখবে একটা character আসলে কেন ছোট একটা সংখ্যা, আর কোন character-র সংখ্যা কত, সেই পুরো table।
lesson ৩ শেষ
শেষ হলে চিহ্ন দিন, অগ্রগতি আপনার সাথে থাকবে।
পরেরটা: পুরো ASCII টেবিল, ১২৮টা সারিই