Module ১ · C-র সঙ্গে পরিচয়: প্রথম program, চিহ্ন ধরে ধরে
পুরো ASCII টেবিল, ১২৮টা সারিই
এই lesson-এ যা শিখবে
- C-তে একটা
charআসলে কেন ছোট একটা integer, সেটা বোঝাতে পারবে। - চারটা নোঙর মনে রাখবে:
'0'মানে 48,'A'মানে 65,'a'মানে 97, আর একটা space মানে 32। - তিনটা হিসাবের কৌশল ব্যবহার করতে পারবে, আর নিচের পুরো table-র যেকোনো সারি পড়তে পারবে।
Computer সংখ্যা জমা রাখে। কেবল সংখ্যা। তাহলে সে A অক্ষরটা জমা রাখে কী করে?
সে একটা code-এ রাজি হয়। 1963 সালে একটা standard এই রাজি হওয়াটা লিখে রাখে: A মানে 65, B মানে 66, এভাবে 127 পর্যন্ত। ওটার নাম American Standard Code for Information Interchange, সংক্ষেপে ASCII। যে মেশিন এটা মানে, সে একই byte একই ভাবে পড়ে।
এই lesson একটা reference page, যার ভেতরে পুরো রাজিনামাটা ছাপা আছে, সঙ্গে ওটা ব্যবহার করা পাঁচটা ছোট program।
এক byte, দুই রকম পড়া
C-তে একটা char আসলে অক্ষর না। এটা ছোট একটা integer, যাকে পর্দায় অক্ষর হিসেবে দেখাতে তুমি রাজি হয়েছ।
সেজন্যই একই variable দুই রকমে ছাপা যায়। %c বলে "এই সংখ্যাটা যে character বোঝায়, ওটা দেখাও"। %d বলে "সংখ্যাটাই দেখাও"।
#include <stdio.h>
int main(void)
{
char letter = 'A';
printf("As a character: %c\n", letter);
printf("As a number: %d\n", letter);
return 0;
}
As a character: A
As a number: 65
ওই দুই লাইনের মাঝে কিছুই বদলে নেওয়া হয়নি। Memory-র byte-টা একবারও বদলায়নি। শুধু তুমি কোন কাচ দিয়ে ওটার দিকে তাকিয়েছ, সেটা বদলেছে।
চারটা নোঙর আর তিনটা কৌশল
তোমাকে 128টা সংখ্যা শিখতে হবে না। চারটা লাগবে, আর বাকি সব হিসাব করে বেরিয়ে আসে।
| Character | Code | পুরো দলটা |
|---|---|---|
'0' | 48 | অঙ্ক '0' থেকে '9' মানে 48 থেকে 57 |
'A' | 65 | বড় হাতের 'A' থেকে 'Z' মানে 65 থেকে 90 |
'a' | 97 | ছোট হাতের 'a' থেকে 'z' মানে 97 থেকে 122 |
| একটা space | 32 | ছাপা যায় এমন সবার প্রথম character |
এই চারটা থেকে তিনটা কৌশল বেরোয়, আর character নিয়ে তোমার আসল কাজের বেশিরভাগই ওতে হয়ে যায়।
- 32 দিয়ে case বদলাও। ছোট হাতের অক্ষর তার বড় হাতেরটার ঠিক 32 উপরে, তাই
'a' - 'A'মানে 32। - অঙ্কের character থেকে অঙ্কের মান:
'0'বিয়োগ করো।'7' - '0'মানে 7, কারণ 55 থেকে 48 বাদ দিলে 7। - অক্ষর থেকে বর্ণমালার অবস্থান:
'A'বা'a'বিয়োগ করো।'D' - 'A'মানে 3, তাই D চতুর্থ অক্ষর।
খেয়াল করো, তিনটাতেই একটা জিনিস মিল আছে। তুমি নিজের code-এ কখনো 48, 65 বা 97 লিখছ না। তুমি লিখছ '0', 'A' বা 'a', আর সংখ্যাটা compiler বসিয়ে দিচ্ছে, যাতে লাইনটা পড়া যায়।
তাই বিয়োগ করতে পারলেই তুমি একটাও library function ছাড়া case বদল, অঙ্ক পড়া আর বর্ণমালার অবস্থান বের করতে পারো।
Control character: 0 থেকে 31, আর 127
প্রথম 32টা code ছাপা যায় না। ওরা control character: teleprinter-র আমলের নির্দেশ, মানে যে মেশিন তার দিয়ে লেখা পাঠাত। বেশিরভাগই এখন জাদুঘরের জিনিস। পাঁচটার এখনো দরকার আছে, আর ওগুলো মোটা হরফে।
| Dec | Hex | নাম | পুরো নাম | যা করে |
|---|---|---|---|---|
| 0 | 00 | NUL | Null | একটা C string শেষ করে, Module 10-এ যেটার সঙ্গে দেখা হবে |
| 1 | 01 | SOH | Start of heading | Teleprinter-র heading চিহ্ন, আজ অব্যবহৃত |
| 2 | 02 | STX | Start of text | বার্তা কোথায় শুরু, সেটা চিহ্নিত করত |
| 3 | 03 | ETX | End of text | Terminal-এ Ctrl আর C একসঙ্গে চাপলে এটাই যায় |
| 4 | 04 | EOT | End of transmission | Ctrl আর D চাপলে এটা যায়, input-র শেষ ধরা হয় |
| 5 | 05 | ENQ | Enquiry | অন্য মেশিনকে উত্তর দিতে বলত |
| 6 | 06 | ACK | Acknowledge | অন্য মেশিনের হ্যাঁ |
| 7 | 07 | BEL | Bell | Terminal-র ঘণ্টা বাজায়। লেখা হয় \a |
| 8 | 08 | BS | Backspace | এক character পেছনে যায়। লেখা হয় \b |
| 9 | 09 | HT | Horizontal tab | পরের tab-র ঘরে লাফ দেয়। লেখা হয় \t |
| 10 | 0A | LF | Line feed | Linux আর macOS-র newline। লেখা হয় \n |
| 11 | 0B | VT | Vertical tab | কাগজে নির্দিষ্ট একটা দূরত্ব নিচে নামত |
| 12 | 0C | FF | Form feed | Printer-এ পাতা বের করে দেয়। লেখা হয় \f |
| 13 | 0D | CR | Carriage return | লাইনের শুরুতে ফেরে। Windows লেখে CR তারপর LF |
| 14 | 0E | SO | Shift out | বিকল্প একটা character set-এ চলে যেত |
| 15 | 0F | SI | Shift in | আবার আগেরটায় ফিরে আসত |
| 16 | 10 | DLE | Data link escape | Link-কে বলত, এর পরেরটা একটা command |
| 17 | 11 | DC1 | Device control 1 | একে XON-ও বলে: পাঠানো আবার শুরু করো |
| 18 | 12 | DC2 | Device control 2 | Device-র একটা বাড়তি সংকেত |
| 19 | 13 | DC3 | Device control 3 | একে XOFF-ও বলে: পাঠানো থামাও |
| 20 | 14 | DC4 | Device control 4 | Device-র একটা বাড়তি সংকেত |
| 21 | 15 | NAK | Negative acknowledge | অন্য মেশিনের না |
| 22 | 16 | SYN | Synchronous idle | সময় রাখতে চুপচাপ line ভরিয়ে রাখত |
| 23 | 17 | ETB | End of transmission block | লম্বা বার্তার একটা block শেষ করত |
| 24 | 18 | CAN | Cancel | বলত, এর আগের data ভুল ছিল |
| 25 | 19 | EM | End of medium | Tape বা card শেষ হয়ে গেছে |
| 26 | 1A | SUB | Substitute | Windows-এ Ctrl আর Z, file-র শেষ ধরা হয় |
| 27 | 1B | ESC | Escape | Terminal-র রঙের code শুরু করে। লেখা হয় \033 |
| 28 | 1C | FS | File separator | চারটা separator-র মধ্যে সবচেয়ে বড়টা |
| 29 | 1D | GS | Group separator | File-র ভেতরে group আলাদা করত |
| 30 | 1E | RS | Record separator | Group-র ভেতরে record আলাদা করত |
| 31 | 1F | US | Unit separator | Record-র ভেতরে field আলাদা করত |
| 127 | 7F | DEL | Delete | কাগজের tape-এ সাতটা ফুটোই কাটা, মানে এটা বাদ দাও |
মোটা হরফের পাঁচটাই তুমি সত্যিই লিখবে। NUL string শেষ করে, HT মানে \t আর LF মানে \n। CR হলো Windows-র লাইন শেষের অন্য অর্ধেক, আর ESC terminal-এ রঙ বসানোর code শুরু করে।
তাই একটাও control character নেই এমন একটা text file হতো একটাই অশেষ লাইন।
ছাপা যায় এমন অর্ধেক: 32 থেকে 126, পুরোটা
32 থেকে 126 পর্যন্ত প্রতিটার একটা দেখার মতো আকার আছে। Table-টা বাম থেকে ডানে চারটা খণ্ডে পড়ো। প্রথম খণ্ডের প্রথম ঘরটা space character, আর সেজন্যই ওটা ফাঁকা দেখায়।
| Dec | Hex | Char | Dec | Hex | Char | Dec | Hex | Char | Dec | Hex | Char |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 32 | 20 | space | 56 | 38 | 8 | 80 | 50 | P | 104 | 68 | h |
| 33 | 21 | ! | 57 | 39 | 9 | 81 | 51 | Q | 105 | 69 | i |
| 34 | 22 | " | 58 | 3A | : | 82 | 52 | R | 106 | 6A | j |
| 35 | 23 | # | 59 | 3B | ; | 83 | 53 | S | 107 | 6B | k |
| 36 | 24 | $ | 60 | 3C | < | 84 | 54 | T | 108 | 6C | l |
| 37 | 25 | % | 61 | 3D | = | 85 | 55 | U | 109 | 6D | m |
| 38 | 26 | & | 62 | 3E | > | 86 | 56 | V | 110 | 6E | n |
| 39 | 27 | ' | 63 | 3F | ? | 87 | 57 | W | 111 | 6F | o |
| 40 | 28 | ( | 64 | 40 | @ | 88 | 58 | X | 112 | 70 | p |
| 41 | 29 | ) | 65 | 41 | A | 89 | 59 | Y | 113 | 71 | q |
| 42 | 2A | * | 66 | 42 | B | 90 | 5A | Z | 114 | 72 | r |
| 43 | 2B | + | 67 | 43 | C | 91 | 5B | [ | 115 | 73 | s |
| 44 | 2C | , | 68 | 44 | D | 92 | 5C | \ | 116 | 74 | t |
| 45 | 2D | - | 69 | 45 | E | 93 | 5D | ] | 117 | 75 | u |
| 46 | 2E | . | 70 | 46 | F | 94 | 5E | ^ | 118 | 76 | v |
| 47 | 2F | / | 71 | 47 | G | 95 | 5F | _ | 119 | 77 | w |
| 48 | 30 | 0 | 72 | 48 | H | 96 | 60 | ` | 120 | 78 | x |
| 49 | 31 | 1 | 73 | 49 | I | 97 | 61 | a | 121 | 79 | y |
| 50 | 32 | 2 | 74 | 4A | J | 98 | 62 | b | 122 | 7A | z |
| 51 | 33 | 3 | 75 | 4B | K | 99 | 63 | c | 123 | 7B | { |
| 52 | 34 | 4 | 76 | 4C | L | 100 | 64 | d | 124 | 7C | | |
| 53 | 35 | 5 | 77 | 4D | M | 101 | 65 | e | 125 | 7D | } |
| 54 | 36 | 6 | 78 | 4E | N | 102 | 66 | f | 126 | 7E | ~ |
| 55 | 37 | 7 | 79 | 4F | O | 103 | 67 | g |
Table-টার ভেতরেই তিনটা নকশা দেখার মতো। অঙ্কগুলো একসঙ্গে, বড় হাতের অক্ষরগুলো একসঙ্গে, আর ছোট হাতেরগুলো একসঙ্গে বসে আছে, প্রতিটা দল অবিচ্ছিন্ন।
65 আর 97-র দিকে তাকাও। প্রতিটা সারিতেই বড় হাতের আর তার ছোট হাতেরটার ফাঁক 32, মানে এক নম্বর কৌশলটা চোখেই দেখা যাচ্ছে।
48 আর 57-র দিকে তাকাও। অঙ্কগুলো ফাঁক ছাড়া ক্রমে বসা, আর সেজন্যই দুই নম্বর কৌশল কেবল '7'-র জন্য না, প্রতিটা অঙ্কের জন্যই কাজ করে।
ASCII-র বাইরে, আর বাংলার জন্য এর মানে কী
ASCII কেবল 0 থেকে 127 ঠিক করে, কারণ এটা সাত bit-র জন্য বানানো। একটা byte-এ আট bit থাকে, তাই 128 থেকে 255 খালি পড়ে ছিল, আর প্রতিটা vendor সেটা নিজের মতো ভরেছে। ওই গোলমালটার নাম "extended ASCII", আর সেজন্যই একই file অন্য মেশিনে আবোলতাবোল দেখাত।
Unicode এটা সারিয়েছে প্রতিটা লিপির প্রতিটা character-কে নিজের একটা সংখ্যা দিয়ে, আর UTF-8 হলো ওই সংখ্যাগুলো byte হিসেবে রাখার উপায়। ASCII হলো তার প্রথম 128টা, অবিকল, আর সেজন্যই পুরনো file এখনো চলে।
এবার তোমার জন্য জরুরি অংশটা। UTF-8-এ একটা বাংলা অক্ষর নেয় তিন byte, এক না। "ঢাকা" শব্দটা চার অক্ষর আর বারো byte, আর strlen উত্তর দেয় 12।
তাই একটা char এক byte ধরে, এক অক্ষর না। তিনটা কৌশল ASCII-র অক্ষর আর অঙ্কে চলে। বাংলা লেখায় চলে না, কারণ 32 যোগ করার মতো একটামাত্র সংখ্যা ওখানে নেই। বাংলা লেখা নিয়ে সত্যিকারের কাজ Module 10-র বিষয়, আর তাতে একটা library লাগে।
পুরো ভাবনাটা দেখানোর সবচেয়ে ছোট program। একটা variable, চার লাইন ছাপা, আর কোথাও কিছু বদলে নেওয়া নেই।
#include <stdio.h>
int main(void)
{
char letter = 'A';
printf("As a character: %c\n", letter);
printf("As a number: %d\n", letter);
printf("Add 1: %c\n", letter + 1);
printf("Add 32: %c\n", letter + 32);
return 0;
}
As a character: A
As a number: 65
Add 1: B
Add 32: a
1 যোগ করায় বর্ণমালায় এক ঘর এগিয়েছে। 32 যোগ করায় বড় হাতের দল থেকে ছোট হাতের দলে লাফ দিয়েছে। দুইটাই 65 সংখ্যাটার উপর সাদামাটা হিসাব।
Compiler-এ চালাওএক নম্বর কৌশল, দুই দিকেই। ছোট হাতের দিকে নামতে 32 যোগ করো, বড় হাতের দিকে উঠতে 32 বিয়োগ করো।
#include <stdio.h>
int main(void)
{
char upper = 'M';
char lower = 'q';
/* A small letter is exactly 32 above its capital. */
printf("%c becomes %c\n", upper, upper + 32);
printf("%c becomes %c\n", lower, lower - 32);
return 0;
}
M becomes m
q becomes Q
Character-টা সত্যিই অক্ষর হলেই এটা চলে। '5'-র উপর চালিয়ে দেখো, পাবে code 21, একটা অদৃশ্য control character, আর একটাও warning আসবে না।
দুই নম্বর কৌশল, আর যে ভুলটা আটকাতে ওটা আছে। '7' character-টা আসলে 55 সংখ্যাটা, আর 7 সংখ্যাটা তোমাকে বের করে নিতে হয়।
#include <stdio.h>
int main(void)
{
char digit = '7';
int wrong = digit; /* 55, the ASCII code */
int right = digit - '0'; /* 7, the value it stands for */
printf("Wrong: %d\n", wrong);
printf("Right: %d\n", right);
printf("Squared: %d\n", right * right);
return 0;
}
Wrong: 55
Right: 7
Squared: 49
ওই - '0' লেখা থেকে অঙ্ক পড়া প্রায় প্রতিটা program-এ আসে, আর কিছু পড়ে এমন program-র বেশিরভাগই তাই।
এটায় একটা loop আছে, যেটা Module 6-র বিষয়। পড়ো, চালাও, আর এখনই নিজে লেখার কথা ভাবতে হবে না। আসল কথাটা হলো, উপরের table বিশ্বাস করার মতো একটা তথ্য না, ওটা তোমার মেশিনই তোমাকে ছেপে দিতে পারে।
#include <stdio.h>
int main(void)
{
for (int code = 32; code <= 126; code++) {
printf("%3d %c", code, code);
/* Start a new line after every eighth entry. */
if ((code - 31) % 8 == 0) {
printf("\n");
} else {
printf(" ");
}
}
printf("\n");
return 0;
}
32 33 ! 34 " 35 # 36 $ 37 % 38 & 39 '
40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 /
48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7
56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ?
64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G
72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O
80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W
88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _
96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g
104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o
112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w
120 x 121 y 122 z 123 { 124 | 125 } 126 ~
প্রথম ঘরটা ভাঙা মনে হয়, আর ভাঙা না। Code 32 হলো space character, তাই ওটা একটা space-ই ছাপে। %c-কে %x করে দিলে table-টা hexadecimal-এ পাবে।
এটা কোথায় কাজে লাগছে
- তোমার মেশিনের প্রতিটা text file. একটা
.cfile, একটা.csvfile আর এই page-র HTML, সবই এই code-গুলোর সার, আর 127-র উপরের সব কিছু সামলায় UTF-8। - HTTP.
GET /index.html HTTP/1.1-র মতো একটা request line হলো ASCII লেখা, শেষ হয়CRআরLFদিয়ে, মানে code 13 আর 10। সেজন্যই আলাদা ভাষায় লেখা browser আর server কথা বলতে পারে। - তোমার keyboard. Ctrl আর C চাপলে যায় code 3,
ETX, আর সেজন্যই তোমার laptop জন্মানোর অনেক আগে থেকেই ওই জোড়াটার মানে "থামো"। - নাম সাজানো. লেখা মেলানো মানে এই code-গুলো মেলানো, আর
'Z'হলো 90 যখন'a'হলো 97। তাই সাদামাটা একটা sort প্রতিটা বড় হাতের অক্ষরকে প্রতিটা ছোট হাতেরটার আগে বসায়, আর সেজন্যই সত্যিকারের software case না দেখা function দিয়ে sort করে।
যে ভুলগুলো সবাই করে
১. অঙ্কের character-কেই তার মান ধরে নেওয়া।
char digit = '7';
printf("%d\n", digit); /* prints 55, not 7 */
কোনো message নেই। GCC ঠিকই বলছে যে char ছোট একটা integer, আর 55 সেই সংখ্যাটাই যেটা তুমি চেয়েছ। মান চাইলে সব সময় '0' বিয়োগ করো।
২. অক্ষর না, এমন কিছুর উপর case-র হিসাব চালানো।
char d = '5';
printf("[%c]\n", d - 32); /* prints [ ] with an invisible control char */
এখানেও কোনো message নেই, warning-র কোনো স্তরেই। 53 থেকে 32 বাদ দিলে 21, মানে NAK, অদৃশ্য। Character-টা আগে যাচাই করার if পাবে Module 5-এ।
৩. একটা char-এ বাংলা অক্ষর বসানো।
char c = 'ঢ';
printf("%d\n", c);
GCC 12 তোমাকে দুইটা warning দেয়: warning: multi-character character constant আর warning: overflow in conversion from 'int' to 'char' changes value from '14722722' to '-94'। তারপর ছাপে -94। একটা char এক byte, আর ওই অক্ষরের লাগে তিন byte।
৪. char-এ ধরে না এমন একটা সংখ্যা রাখা।
char c = 300;
printf("%d\n", c); /* prints 44 */
GCC 12 বলে warning: overflow in conversion from 'int' to 'char' changes value from '300' to '44', আর তবুও build করে দেয়। এই মেশিনে একটা char -128 থেকে 127 ধরে, আর ঠিক সেজন্যই ASCII 127-এ থেমে গেছে।
Maria এমন একটা tool বানাচ্ছে, যেটা যেকোনো key-র code দেখায়। একটা character পড়ো, আর তার decimal code ছাপো।
Input. এক লাইনে ঠিক একটা character, যেটা space-ও হতে পারে।
Output. এক লাইনে ওটার decimal ASCII code।
Constraints. Character-টা ছাপা যায় এমন ASCII, code 32 থেকে 126।
Sample. Input A দিলে আসে 65। Input একটা space দিলে আসে 32।
#include <stdio.h>
int main(void)
{
char ch;
scanf("%c", &ch);
/* One printf. Which specifier do you need? */
return 0;
}
খেয়াল করো, scanf("%c", &ch)-তে %c-র আগে কোনো space নেই। এটা ইচ্ছা করেই: ওখানে একটা space থাকলে ওটা space character-টা এড়িয়ে যেত, আর space-ও একটা test case।
Hidden test সহ grading হয় এই module-র Problems lesson-এ, char-code নামে।
কেবল হিসাব দিয়ে একটা অক্ষরের case বদলাও। কোনো library function না, কোনো if না।
Input. এক লাইনে একটা বড় হাতের অক্ষর, 'A' থেকে 'Z'।
Output. এক লাইনে সেই অক্ষরটাই ছোট হাতে।
Constraints. Input সব সময় বড় হাতের অক্ষর, তাই কোনো যাচাই লাগবে না।
Sample. Input M দিলে আসে m।
#include <stdio.h>
int main(void)
{
char ch;
scanf("%c", &ch);
/* Trick one. Write the 32 as a difference of two characters if you can. */
return 0;
}
নিজে যাচাই করো। A আর Z দিয়ে দেখো, মানে দুই মাথা। দুইটাই চললে মাঝের প্রতিটা অক্ষরও চলবে, কারণ table-এ বড় হাতের অক্ষরগুলো অবিচ্ছিন্ন।
Amara এমন একটা form মেলাচ্ছে, যেখানে তিনটা অঙ্ক character হিসেবে আসে, মাঝে কিছু নেই। ওরা যা বোঝায়, সেগুলো যোগ করো।
Input. এক লাইনে ঠিক তিনটা অঙ্কের character, কোনো space নেই।
Output. এক লাইনে তিনটা অঙ্কের মানের যোগফল।
Constraints. প্রতিটা character '0' থেকে '9'।
Sample. Input 407 দিলে আসে 11, কারণ 4 আর 0 আর 7 মিলে 11।
#include <stdio.h>
int main(void)
{
char a, b, c;
scanf("%c%c%c", &a, &b, &c);
/* Trick two, three times. */
return 0;
}
নিজে যাচাই করো। 000 দিলে 0 আর 999 দিলে 27 আসতেই হবে। 000 দিয়ে 144 পেলে বুঝবে তুমি মানের বদলে code যোগ করেছ।
Grading হয় digit-sum-three নামে।
ROT13 হলো লেখা লুকানোর খুব পুরনো একটা উপায়: প্রতিটা অক্ষরের বদলে 13 ঘর পরের অক্ষরটা বসাও, আর z পেরিয়ে গেলে আবার a থেকে গোনো। একটা ছোট হাতের অক্ষরের জন্য এটা করো।
Input. এক লাইনে একটা ছোট হাতের অক্ষর, 'a' থেকে 'z'।
Output. এক লাইনে 13 ঘর পরের অক্ষরটা, বর্ণমালার ভেতরে ঘুরিয়ে আনা।
Constraints. Input সব সময় ছোট হাতের অক্ষর।
Sample. Input a দিলে আসে n। Input z দিলে আসে m।
কঠিন অংশটা হলো ঘুরে আসা। 'z'-তে 13 যোগ করলে বর্ণমালার বাইরে চলে যায়। এক লাইন হিসাবেই এটা সারে, ভাগশেষের operator % আর তিন নম্বর কৌশলের বর্ণমালার অবস্থান দিয়ে। ভাগশেষের operator Module 4-র, আর আগেই ওটা ব্যবহার করা চলবে।
নিজে যাচাই করো। a, m, n আর z দিয়ে চালাও। একই অক্ষরে তোমার program দুইবার চালালে অক্ষরটা ফিরে আসতে হবে, আর এই ধর্মটাই ROT13-কে জনপ্রিয় করেছিল।
যে প্রশ্নগুলো সবার মনে আসে
128টা code কেন, 256 কেন না?
ASCII সাত bit-র জন্য বানানো, এমন একটা সময়ে যখন অষ্টম bit ভুল যাচাইয়ে লাগত। 127-র উপরের খালি অর্ধেকটা প্রতিটা vendor আলাদা করে ভরেছে, আর ওই গোলমালের জায়গা নিয়েছে Unicode।
একটা
charsigned না unsigned?Standard এটা compiler-র হাতে ছেড়ে দিয়েছে, আর বেশিরভাগ মেশিনে এটা signed, মানে -128 থেকে 127। 0 থেকে 127-র code-র জন্য এতে কিছু আসে যায় না, আর ASCII তো ওটুকুই।
'A'-র বদলে 65 লেখা যায়?যায়, আর program হুবহু একই কাজ করে। লিখো না:
'A'তুমি যা বলতে চাও সেটাই বলে, ছয় মাস পরে পড়লেও টেকে, আর যেসব মেশিনে code আলাদা সেখানেও চলে।Table-এ hexadecimal-ও দেওয়া কেন?
কারণ tool তোমাকে byte দেখায় hex-এ। একটা memory dump, একটা network capture আর
\x41-র মতো একটা escape, সবই base 16 ব্যবহার করে। ওই জায়গাগুলোতে 65-র চেয়ে 41 চিনতে সহজ।তিনটা কৌশল কি বাংলা অক্ষরে চলে?
না। UTF-8-এ একটা বাংলা অক্ষর তিন byte, তাই 32 যোগ করার মতো একটামাত্র সংখ্যা নেই। একটা text library লাগবে, আর একটা C string কী পারে আর কী পারে না, সেটা বোঝায় Module 10।
মূল কথা
- একটা
charছোট একটা integer;%cআর%dহলো একই byte-র উপর দুইটা কাচ। - চারটা নোঙর পুরো table বইছে: 48, 65, 97 আর 32।
- বড় হাতের থেকে ছোট হাতে যেতে 32 যোগ; অঙ্কের character থেকে মান পেতে
'0'বিয়োগ; অক্ষর থেকে অবস্থান পেতে'A'বিয়োগ। - 0 থেকে 31 হলো control character, আর ওদের পাঁচটা এখনো রোজ ব্যবহার হয়।
- অঙ্ক, বড় হাতের আর ছোট হাতের অক্ষর, প্রতিটা দল অবিচ্ছিন্ন এক সারিতে বসা।
- ASCII থামে 127-এ; একটা বাংলা অক্ষর তিন UTF-8 byte, তাই কৌশলগুলো ওখানে পৌঁছায় না।
পরের lesson-এ তুমি এমন code লিখবে যেটা আরেকজন মানুষ পড়তে পারে। এই module-এ ওটাই একটামাত্র দক্ষতা, যেটা compiler তোমার হয়ে কখনো যাচাই করবে না।
lesson ৪ শেষ
শেষ হলে চিহ্ন দিন, অগ্রগতি আপনার সাথে থাকবে।
পরেরটা: Comment, whitespace আর মানুষের পড়ার মতো code