Learn C Programming

lesson ৪ / ৮ · C-র সঙ্গে পরিচয়: প্রথম program, চিহ্ন ধরে ধরে

Module ১ · C-র সঙ্গে পরিচয়: প্রথম program, চিহ্ন ধরে ধরে

পুরো ASCII টেবিল, ১২৮টা সারিই

Freeপড়া

এই 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টা সংখ্যা শিখতে হবে না। চারটা লাগবে, আর বাকি সব হিসাব করে বেরিয়ে আসে।

CharacterCodeপুরো দলটা
'0'48অঙ্ক '0' থেকে '9' মানে 48 থেকে 57
'A'65বড় হাতের 'A' থেকে 'Z' মানে 65 থেকে 90
'a'97ছোট হাতের 'a' থেকে 'z' মানে 97 থেকে 122
একটা space32ছাপা যায় এমন সবার প্রথম character

এই চারটা থেকে তিনটা কৌশল বেরোয়, আর character নিয়ে তোমার আসল কাজের বেশিরভাগই ওতে হয়ে যায়।

  1. 32 দিয়ে case বদলাও। ছোট হাতের অক্ষর তার বড় হাতেরটার ঠিক 32 উপরে, তাই 'a' - 'A' মানে 32।
  2. অঙ্কের character থেকে অঙ্কের মান: '0' বিয়োগ করো। '7' - '0' মানে 7, কারণ 55 থেকে 48 বাদ দিলে 7।
  3. অক্ষর থেকে বর্ণমালার অবস্থান: '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-র আমলের নির্দেশ, মানে যে মেশিন তার দিয়ে লেখা পাঠাত। বেশিরভাগই এখন জাদুঘরের জিনিস। পাঁচটার এখনো দরকার আছে, আর ওগুলো মোটা হরফে।

DecHexনামপুরো নামযা করে
000NULNullএকটা C string শেষ করে, Module 10-এ যেটার সঙ্গে দেখা হবে
101SOHStart of headingTeleprinter-র heading চিহ্ন, আজ অব্যবহৃত
202STXStart of textবার্তা কোথায় শুরু, সেটা চিহ্নিত করত
303ETXEnd of textTerminal-এ Ctrl আর C একসঙ্গে চাপলে এটাই যায়
404EOTEnd of transmissionCtrl আর D চাপলে এটা যায়, input-র শেষ ধরা হয়
505ENQEnquiryঅন্য মেশিনকে উত্তর দিতে বলত
606ACKAcknowledgeঅন্য মেশিনের হ্যাঁ
707BELBellTerminal-র ঘণ্টা বাজায়। লেখা হয় \a
808BSBackspaceএক character পেছনে যায়। লেখা হয় \b
909HTHorizontal tabপরের tab-র ঘরে লাফ দেয়। লেখা হয় \t
100ALFLine feedLinux আর macOS-র newline। লেখা হয় \n
110BVTVertical tabকাগজে নির্দিষ্ট একটা দূরত্ব নিচে নামত
120CFFForm feedPrinter-এ পাতা বের করে দেয়। লেখা হয় \f
130DCRCarriage returnলাইনের শুরুতে ফেরে। Windows লেখে CR তারপর LF
140ESOShift outবিকল্প একটা character set-এ চলে যেত
150FSIShift inআবার আগেরটায় ফিরে আসত
1610DLEData link escapeLink-কে বলত, এর পরেরটা একটা command
1711DC1Device control 1একে XON-ও বলে: পাঠানো আবার শুরু করো
1812DC2Device control 2Device-র একটা বাড়তি সংকেত
1913DC3Device control 3একে XOFF-ও বলে: পাঠানো থামাও
2014DC4Device control 4Device-র একটা বাড়তি সংকেত
2115NAKNegative acknowledgeঅন্য মেশিনের না
2216SYNSynchronous idleসময় রাখতে চুপচাপ line ভরিয়ে রাখত
2317ETBEnd of transmission blockলম্বা বার্তার একটা block শেষ করত
2418CANCancelবলত, এর আগের data ভুল ছিল
2519EMEnd of mediumTape বা card শেষ হয়ে গেছে
261ASUBSubstituteWindows-এ Ctrl আর Z, file-র শেষ ধরা হয়
271BESCEscapeTerminal-র রঙের code শুরু করে। লেখা হয় \033
281CFSFile separatorচারটা separator-র মধ্যে সবচেয়ে বড়টা
291DGSGroup separatorFile-র ভেতরে group আলাদা করত
301ERSRecord separatorGroup-র ভেতরে record আলাদা করত
311FUSUnit separatorRecord-র ভেতরে field আলাদা করত
1277FDELDeleteকাগজের tape-এ সাতটা ফুটোই কাটা, মানে এটা বাদ দাও

মোটা হরফের পাঁচটাই তুমি সত্যিই লিখবে। NUL string শেষ করে, HT মানে \t আর LF মানে \n। CR হলো Windows-র লাইন শেষের অন্য অর্ধেক, আর ESC terminal-এ রঙ বসানোর code শুরু করে।

তাই একটাও control character নেই এমন একটা text file হতো একটাই অশেষ লাইন।

ছাপা যায় এমন অর্ধেক: 32 থেকে 126, পুরোটা

32 থেকে 126 পর্যন্ত প্রতিটার একটা দেখার মতো আকার আছে। Table-টা বাম থেকে ডানে চারটা খণ্ডে পড়ো। প্রথম খণ্ডের প্রথম ঘরটা space character, আর সেজন্যই ওটা ফাঁকা দেখায়।

DecHexCharDecHexCharDecHexCharDecHexChar
3220space563888050P10468h
3321!573998151Q10569i
3422"583A:8252R1066Aj
3523#593B;8353S1076Bk
3624$603C<8454T1086Cl
3725%613D=8555U1096Dm
3826&623E>8656V1106En
3927'633F?8757W1116Fo
4028(6440@8858X11270p
4129)6541A8959Y11371q
422A*6642B905AZ11472r
432B+6743C915B[11573s
442C,6844D925C\11674t
452D-6945E935D]11775u
462E.7046F945E^11876v
472F/7147G955F_11977w
483007248H9660`12078x
493117349I9761a12179y
50322744AJ9862b1227Az
51333754BK9963c1237B{
52344764CL10064d1247C|
53355774DM10165e1257D}
54366784EN10266f1267E~
55377794FO10367g

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 লাগে।

Example 1: একই byte, চার রকমে

পুরো ভাবনাটা দেখানোর সবচেয়ে ছোট 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-এ চালাও
Example 2: library ছাড়াই case বদল

এক নম্বর কৌশল, দুই দিকেই। ছোট হাতের দিকে নামতে 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 আসবে না।

Compiler-এ চালাও
Example 3: অঙ্কের character তার মান না

দুই নম্বর কৌশল, আর যে ভুলটা আটকাতে ওটা আছে। '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-র বেশিরভাগই তাই।

Compiler-এ চালাও
Example 4: ছাপা যায় এমন অর্ধেকটা নিজে ছেপে দেখো

এটায় একটা 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-এ পাবে।

Compiler-এ চালাও

এটা কোথায় কাজে লাগছে

  • তোমার মেশিনের প্রতিটা text file. একটা .c file, একটা .csv file আর এই 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-এ থেমে গেছে।

মাথা খাটাও

Kenji বলছে character তো সংখ্যাই, তাই দুইটা যোগ করলে সমস্যা হওয়ার কথা না। Zara পুরোপুরি মানছে না।

printf("%d\n", 'a' + 'b');
printf("[%c]\n", 'a' + 'b');

তিনটা প্রশ্নের উত্তর দাও। প্রথম লাইনটা কী ছাপে? দ্বিতীয় লাইনটা কী ছাপে, আর ওটা কেন কোনো অক্ষর না? আর ছাপা যায় এমন কোন দুইটা ASCII character-র সবচেয়ে বড় জোড়ার যোগফল এখনো ছাপা যায় এমন একটা ASCII character?

Table-এ দুইটা code দেখে নাও, আর কাগজে যোগ করো। তারপর ভাবো, table-র সবচেয়ে বড় code কত, আর তার চেয়ে বড় সংখ্যা নিয়ে একটা byte কী করে।

অনুশীলন ১সহজ

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 নামে।

Compiler-এ চালাও
অনুশীলন ২সহজ

কেবল হিসাব দিয়ে একটা অক্ষরের 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-এ বড় হাতের অক্ষরগুলো অবিচ্ছিন্ন।

Compiler-এ চালাও
অনুশীলন ৩মাঝারি

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 নামে।

Compiler-এ চালাও
অনুশীলন ৪কঠিন

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।

  • একটা char signed না 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