Learn C++ STL

lesson ১ / ৯ · C থেকে যতটুকু C++ দরকার

Module ১ · C থেকে যতটুকু C++ দরকার

Hello, C++: একই program দুই ভাষায়

Freeপড়া

এই lesson-এ যা শিখবে

  • এমন একটা C++ program লিখে run করতে পারবে, যেটা std::cin দিয়ে দুইটা সংখ্যা পড়ে আর std::cout দিয়ে ওদের যোগফল print করে।
  • #include <iostream>, std::, std::cout, <<, std::cin আর >>, এদের প্রত্যেকটা কী করে, বুঝিয়ে বলতে পারবে।
  • প্রথম দিনেই কোন তিন জায়গায় C আর C++ আলাদা হয়ে যায়, GCC 12-এর বার্তা বা output দেখে চিনতে পারবে।

Bob রোজ C লেখে, আর STL-এ পৌঁছানোর জন্য ওর তর সইছে না। ও নিজের যোগের program-টা sum.cpp নামের একটা file-এ copy করে C++ হিসেবে compile করে। Compile হয়ে যায়, আর input 3 4 দিলে print করে 7। Bob জিজ্ঞেস করে, "তাহলে বদলাল কী?" এখনো কিছুই না। এই track-এর প্রথম কথাটাই এটা: বেশিরভাগ C আগে থেকেই C++।

Bob-এর C program আগে থেকেই C++

C track-এর জন্য Bob program-টা এভাবে লিখেছিল:

#include <stdio.h>

int main(void)
{
    int a = 0;
    int b = 0;

    scanf("%d %d", &a, &b);
    printf("%d\n", a + b);
    return 0;
}
7

ওই output-টা input 3 4-এর জন্য। Bob হুবহু একই লেখা sum.cpp নামে save করে g++ দিয়ে compile করেছে। এটা হলো GCC পরিবারের C++ compiler, যে পরিবার তোমাকে gcc-ও দেয়। GCC 12 কোনো বার্তা ছাড়াই compile করেছে, Playground-এর command line-এও, -Wall -Wextra-তেও। আর print করেছে সেই একই 7।

এটা কাকতালীয় না। Bjarne Stroustrup 1979 সালে Bell Labs-এ C++ শুরু করেছিলেন "C with Classes" নামে, আর ইচ্ছা করেই C-কে এর ভিতরে রেখে দিয়েছিলেন। তোমার loop, array, function, pointer, struct, সবই সঙ্গে চলে আসে। তাই একটা C program প্রায় একটা C++ program। এই "প্রায়" ঠিক কোথায় গিয়ে লাগে, সেটা এই lesson-এর পরের দিকে দেখবে।

একই program, C++-এর ভাষায়

এবার একই program, C++ programmer-রা যেভাবে লেখে। এটা পড়ে std::cin দিয়ে, আর print করে std::cout দিয়ে।

#include <iostream>

int main()
{
    int a = 0;
    int b = 0;

    std::cin >> a >> b;
    std::cout << a + b << '\n';
    return 0;
}
7

একই input, একই output। দুইটা program পাশাপাশি রেখে লাইন ধরে মেলাও, আলাদা শুধু চারটা লাইন।

C-তেC++-একী বদলাল
#include <stdio.h>#include <iostream>C++-এর input আর output stream-এর header; C++-এর নিজের header-এ কোনো .h থাকে না
int main(void)int main()C++-এ খালি bracket মানেই "কোনো parameter নেই"
scanf("%d %d", &a, &b);std::cin >> a >> b;format string নেই, &-ও নেই
printf("%d\n", a + b);std::cout << a + b << '\n';%d নেই; newline-টাও বাকি মানগুলোর মতোই পাঠানো হয়

Stream দিয়ে পড়া আর print করার গড়ন

std::cin >> variable >> variable ... ;
std::cout << value << value ... ;
  • std::cin হলো standard input stream, scanf-এর C++ সঙ্গী।
  • >> stream থেকে একটা মান পড়ে, ডান পাশের variable-এ রাখে।
  • std::cout হলো standard output stream, printf-এর C++ সঙ্গী।
  • << ডান পাশের মানটা stream-এ পাঠিয়ে দেয়। পরপর কয়েকটা থাকলে চলে বাঁ থেকে ডানে।

লাইনটা শেষ হয় '\n' দিয়ে, একটা char, যার ভিতরে newline। অন্যদের code-এ তুমি std::endl-ও দেখবে। এটাও লাইন শেষ করে, তবে সাথে আরেকটা কাজ করে, যেটায় সময় খরচ হয়; lesson 02 সেটা মেপে দেখাবে। তাই C++ program-টাও সেই 7-ই print করে, বদলেছে শুধু পড়া আর print করার শব্দগুলো।

Stream: << পাঠায়, >> পড়ে

Stream হলো character-এর একটা সারি, যেটা এক দিকেই বয়ে যায়, পাইপের পানির মতো। তোমার program-এ একটা stream ঢোকে, standard input বা stdin। আরেকটা বের হয়, standard output বা stdout। Stdin হতে পারে তোমার keyboard, একটা file, বা Playground-এর input box; stdout হতে পারে screen, একটা file, বা একটা judge।

Stream-এর ছবি: std::cin হলো stdin-এর কল, std::cout হলো stdout-এর পাইপ একটা stream ঢোকে, একটা বের হয় stdin 3 4 \n keyboard, file, input box std::cin কল: >> পড়ে int a 3 int b 4 a + b 7 std::cout পাইপ: << পাঠায় stdout 7 \n screen, file, judge তোমার program থাকে মাঝখানে: কল থেকে মান টেনে নেয়, আর পাইপে মান ঠেলে দেয়।

std::cin হলো stdin-এর মুখে বসানো একটা কল। প্রতিটা >> সেখান থেকে পরের মানটা টেনে এনে একটা variable-এ রাখে। std::cout হলো stdout-এ যাওয়ার পাইপ, আর প্রতিটা << তাতে একটা মান ঠেলে দেয়। তীর-চিহ্ন দেখায় data কোন দিকে যায়: std::cin থেকে বাইরে, std::cout-এর ভিতরে।

C-তে যে তিনটা জিনিস Bob-এর সময় খেত, সেগুলো আর নেই। প্রথমত, format string নেই। Compiler জানে a একটা int, তাই >> একটা int পড়ে; ওটাকে double বানাও, একই লাইন তখন double পড়বে। Bob-এর পুরনো %d আর %lf গুলিয়ে ফেলার ভুল আর হতেই পারে না।

দ্বিতীয়ত, & নেই। std::cin variable-এর ঠিকানা না, variable-টাকেই হাতে পায়। এটা যে C++ feature দিয়ে হয়, তার নাম reference, আর lesson 03 পুরোটা ওটা নিয়েই। তৃতীয়ত, >> সংখ্যার আগের space আর newline বাদ দিয়ে যায়, ঠিক scanf-এর %d-এর মতো, তাই 3 4 এক লাইনে দাও বা দুই লাইনে, পড়া একই হয়।

std::cin >> a >> b শিকলটা আগে a পড়ে, তারপর b। প্রতিটা >> stream-টা পরেরটার হাতে তুলে দেয়। <<-ও একইভাবে জোড়া লাগে, বাঁ থেকে ডানে।

লেখার জন্য আরেকটা জিনিস লাগে। std::string হলো লেখা রাখার একটা variable, যেটা নিজে নিজেই বড় হয়; আসে <string> header থেকে, আর ঠিকমতো শেখাবে Module 3। >> এতে একটা শব্দ পড়ে, প্রথম space পর্যন্ত।

#include <iostream>
#include <string>

int main()
{
    std::string name;

    std::cin >> name;
    std::cout << "Hello, " << name << '\n';
    return 0;
}
Hello, Maria

ওই output-টা input Maria Lopez-এর জন্য: শব্দটা space-এ এসে থেমে গেছে, আর Lopez stream-এই রয়ে গেছে। তাই >> কী পড়বে, সেটা ঠিক করে variable-এর type, আর একটা শব্দ শেষ হয় space-এ।

std:: আর using namespace std

C++ standard library তোমাকে যত নাম দেয়, সবগুলো থাকে একটা namespace-এর ভিতরে, মানে নামওয়ালা একটা নামের বাক্সে। Standard library-র বাক্সটার নাম std। তাই std::cout মানে "std-এর ভিতরে যে cout থাকে, সেটা", আর :: হলো সেই operator, যেটা বাক্সের ভিতরে তাকায়। C-তে কোনো namespace নেই: stdio.h-এর প্রতিটা নামই সরাসরি global।

বারবার std:: টাইপ করতে হয় বলেই অনেক contest code এক লাইন বেশি দিয়ে শুরু হয়। সেই লাইনসহ Bob-এর program:

#include <iostream>

using namespace std;

int main()
{
    int a = 0;
    int b = 0;

    cin >> a >> b;
    cout << a + b << '\n';
    return 0;
}
7

ওই output-ও input 3 4-এর জন্য। using namespace std; বাক্সের সব নাম তোমার program-এ ঢেলে দেয়। মানে শত শত নাম, যেগুলো তুমি চোখেও দেখো না, যেমন count, max, sort আর size। নিজের কোনো variable-এর নাম ওগুলোর একটার মতো রাখলে compiler হয়তো বুঝবে না তুমি কোনটা বোঝাচ্ছ। তখন কী বার্তা আসে, দেখাবে lesson 07।

তাই এই track-এর নিয়ম একটাই। ছোট, এক file-এর contest program-এ লাইনটা চলে, আর সেজন্যই এত contest code-এ এটা দেখবে। কিন্তু header-এ কখনো না, মানে এমন .h file-এ, যেটা অন্য file-রা include করে, কারণ তখন সে std-কে ওদের প্রত্যেকের ভিতরে ঢেলে দেয়। এই module-এ আমরা প্রতিটা standard নামের আগে std:: লিখি, যাতে প্রতিটা নাম কোথা থেকে এল, সবসময় চোখে পড়ে।

তাই using namespace std;-এর পরের cout আর std::cout একই জিনিস। তফাত শুধু এটুকু, তুমি program-এ কয়টা নাম ঢুকতে দিলে।

প্রথম দিনেই C আর C++ যেখানে আলাদা হয়ে যায়

বেশিরভাগ C, C++ হিসেবে compile হয়, কিন্তু সব না। প্রথম সপ্তাহেই একজন C programmer তিনটা তফাতের মুখে পড়ে। প্রতিটা দেখানো হলো GCC 12-এর আসল বার্তা বা output দিয়ে।

১. void* নিজে নিজে অন্য pointer হয়ে যায় না। C-তে malloc ফেরত দেয় একটা void*, আর C চুপচাপ সেটাকে int* বানিয়ে নেয়। নিচের C program কোনো command line-এই কোনো বার্তা ছাড়া compile হয়।

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *marks = malloc(3 * sizeof(int));

    marks[0] = 72;
    printf("%d\n", marks[0]);
    free(marks);
    return 0;
}
72

একই লাইন C++ হিসেবে compile করো, <stdlib.h>-এর জায়গায় <cstdlib> দিয়ে, GCC 12 মানা করে দেবে, Playground-এর flag-এও, -Wall -Wextra-তেও।

int* marks = malloc(3 * sizeof(int));

বার্তাটা হলো error: invalid conversion from 'void*' to 'int*' [-fpermissive]। C++ চায় তুমি conversion-টা মুখ ফুটে বলো, একটা cast দিয়ে: (int*)malloc(3 * sizeof(int))। [-fpermissive] এমন একটা flag-এর নাম, যেটা error-টাকে আবার warning বানিয়ে দেয়; ওটা ব্যবহার কোরো না। বাস্তবে C++-এ তুমি malloc খুব কমই call করবে, কারণ Module 2-এর std::vector নিজের memory নিজেই সামলায়।

২. bool ভাষার ভিতরেই আছে। C17-এ bool, true আর false আসে <stdbool.h> থেকে। Header-টা ভুলে গেলে GCC 12 -std=c17-এ থেমে যায়।

bool passed = true;

C compiler বলে error: unknown type name 'bool', তারপর error: 'true' undeclared (first use in this function), প্রতিটার সাথে একটা note, যেটা <stdbool.h>-এর কথা মনে করিয়ে দেয়। C++-এ bool ভাষারই নিজের একটা type, কোনো header লাগে না।

#include <iostream>

int main()
{
    bool passed = true;

    std::cout << passed << '\n';
    return 0;
}
1

std::cout একটা bool-কে print করে 1 বা 0 হিসেবে। C23-এ bool keyword হয়ে গেছে ঠিকই, কিন্তু GCC 12-এর C তো C23 না।

৩. Character literal একটা char। C-তে 'a'-এর type হলো int। C++-এ এর type char। sizeof-কে জিজ্ঞেস করো, দুই ভাষা দুই রকম উত্তর দেবে। আগে C:

#include <stdio.h>

int main(void)
{
    printf("%zu\n", sizeof('a'));
    return 0;
}
4

এবার C++, সাথে আরেকটা লাইন, যেটা দেখায় ব্যাপারটা কেন গুরুত্বপূর্ণ।

#include <iostream>

int main()
{
    std::cout << sizeof('a') << '\n';
    std::cout << 'a' << ' ' << 'a' + 1 << '\n';
    return 0;
}
1
a 98

std::cout type দেখে print করে। 'a' একটা char, তাই অক্ষরটাই print হয়। 'a' + 1 হলো হিসাব, আর হিসাবের আগে char-টা int হয়ে যায়, তাই print হয় 98, মানে b-এর ASCII code। তাই C++-এ একটা character ততক্ষণ character-ই থাকে, যতক্ষণ না তুমি ওটা দিয়ে হিসাব করো।

g++ -std=c++17 দিয়ে compile করা

C++ file-এর নাম শেষ হয় .cpp দিয়ে। নিজের মেশিনে g++ দিয়ে compile করো, আর standard-টার নাম বলে দাও: g++ -std=c++17 -Wall -Wextra sum.cpp -o sum। তারপর ./sum run করে input টাইপ করো। এই track শেখায় C++17, মানে C++ standard-এর 2017 সালের সংস্করণ।

Playground-এ C++ বেছে নাও, আর version id c++17, যেটা আগে থেকেই বাছা থাকে। বাকি id দুইটা হলো c++14 আর c++20। Runner compile করে g++ -O2 -std=c++17 দিয়ে, GCC 12-এ, কোনো -Wall ছাড়া। তাই যে warning-এর জন্য -Wall লাগে, সেটা ওখানে কখনো আসে না। এজন্যই এই track সবসময় বলে দেয়, কোন command line কোন বার্তা দিয়েছে।

একটা নতুন জিনিস আমাদের compiler-এ এখনো নেই। C++20-এর std::format একটা format string থেকে লেখা বানায়, printf-এর মতো, কিন্তু type-ও মিলিয়ে দেখে; এর জন্য GCC 13 লাগে, তাই আমাদের compiler-এ এখনো নেই। তাই একই .cpp file তোমার মেশিনে আর Playground-এ দুই জায়গাতেই compile হয়; আলাদা হতে পারে শুধু কোন warning চোখে পড়ে।

Example 1: সবচেয়ে ছোট C++ program

একটা include, একটা main, output-এর একটা লাইন।

#include <iostream>

int main()
{
    std::cout << "Hello, C++\n";
    return 0;
}
Hello, C++

String literal নিজের ভিতরেই \n রাখতে পারে, ঠিক C-এর মতো। std::cout character-গুলো যেমন আছে তেমনই পাঠিয়ে দেয়।

Run in Compiler
Example 2: Alice-এর দোকান, দুই type, কোনো format string নেই

Alice খাতা বিক্রি করে। ও একটা সংখ্যা পড়ে, কয়টা খাতা, একটা int; আর একটা দাম, একটা double; তারপর বিল print করে।

#include <iostream>

int main()
{
    int quantity = 0;
    double price = 0.0;

    std::cin >> quantity >> price;
    std::cout << quantity << " x " << price << " = " << quantity * price << '\n';
    return 0;
}
3 x 2.5 = 7.5

ওই output-টা input 3 2.50-এর জন্য। একই >> প্রথমে একটা int, তারপর একটা double পড়েছে। std::cout 2.50-কে print করেছে 2.5: নিজে থেকে সে ছয়টা পর্যন্ত significant digit দেখায়, আর শেষের শূন্যগুলো ফেলে দেয়।

Run in Compiler
Example 3: Amara-র তিনটা নম্বর

Amara তিনটা নম্বর পড়ে, তারপর মোট আর গড় print করে। C++-এর প্রথম দিনে একজন C programmer ঠিক এই program-টাই লেখে।

#include <iostream>

int main()
{
    int m1 = 0;
    int m2 = 0;
    int m3 = 0;

    std::cin >> m1 >> m2 >> m3;
    int total = m1 + m2 + m3;
    std::cout << "total: " << total << '\n';
    std::cout << "average: " << total / 3.0 << '\n';
    return 0;
}
total: 217
average: 72.3333

ওই output-টা input 72 65 80-এর জন্য। 3-এর বদলে 3.0 দিয়ে ভাগ করলে ভগ্নাংশটা থেকে যায়, C-এর মতোই। Zara অভ্যাসমতো আগে খালি input দিয়ে চালায়। Program print করে total: 0 আর average: 0, কারণ read-গুলো কিছুই পায়নি, আর প্রতিটা variable শুরু হয়েছিল 0 দিয়ে।

Run in Compiler

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

  • LLVM। LLVM compiler project-এর coding standard ওদের library code-এ #include <iostream> নিষেধ করে, কারণ এটা প্রতিটা file-এ program শুরুর সময়ের বাড়তি কাজ জুড়ে দেয়। LLVM print করে নিজের stream, raw_ostream দিয়ে, যেটা এখানে শেখা <<-এর চেহারাটাই রাখে।
  • Unreal Engine। এর logging macro, UE_LOG, printf-এর ধাঁচের format string নেয়, যেমন "Score: %d"। Game-এর code এখনো রোজ format string লেখে।
  • {fmt} আর std::format। Open-source {fmt} library printf-এর ছোট format string আর stream-এর type check, দুইটাকে এক করেছে। সেটাই হয়েছে C++20-এর std::format, আর এজন্যই দুই ধরনই টিকে আছে।

যে ভুলগুলো সবাই করে

১. std:: ভুলে যাওয়া।

cout << "hello\n";

দুই command line-এই error, Playground-সহ: error: 'cout' was not declared in this scope; did you mean 'std::cout'?। GCC 12 ঠিক করার উপায়টাও বলে দেয়। লেখো std::cout। তুমি এটা ভুলবে, কারণ C-তে library-র প্রতিটা নাম global।

২. তীর-চিহ্ন উল্টো দিকে।

int a = 0;

std::cin << a;

দুই command line-এই error: error: no match for 'operator<<' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'int')। Compiler Explorer-এ পুরো বার্তাটা 119 লাইন লম্বা হয়েছে, যার 43টা note, যেগুলো বলে << কী কী পারে। পড়ো শুধু প্রথম লাইনটা: input stream << নিতে পারে না। লেখো std::cin >> a;। ছবিটা মাথায় না বসা পর্যন্ত তুমি এগুলো উল্টাবে: data বের হয় std::cin থেকে, আর ঢোকে std::cout-এ।

৩. scanf থেকে আনা Bob-এর &।

int a = 0;

std::cin >> &a;

দুই command line-এই error: error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'int*')। -Wall -Wextra-তে GCC 12 সাথে এই warning-ও দেয়: warning: the address of 'a' will never be NULL [-Waddress]। &a একটা pointer, আর >> কোনো pointer-এ পড়তে জানে না। &-টা মুছে দাও। Bob কয়েক সপ্তাহ ধরে এটা টাইপ করবে, কারণ scanf ওর আঙুলকে এভাবেই অভ্যস্ত করেছে।

মাথা খাটাও

Kenji 1 আর 2-এর যোগফল print করতে চায়, আর ও ছোট code পছন্দ করে।

#include <iostream>

int main()
{
    std::cout << 1 << 2 << '\n';
    return 0;
}

এটা কোনো command line-এই কোনো বার্তা ছাড়া compile হয়। কিন্তু 3 print করে না। এটা কী print করে, আর কেন? আর bracket দিলে, std::cout << (1 << 2) << '\n';, তখন কী print করবে?

std::cout-এর পরের প্রতিটা << পড়ো "এটা পাঠাও" হিসেবে, বাঁ থেকে ডানে। তারপর মনে করো, C-তে দুইটা সংখ্যার মাঝে << কী বোঝাত।

অনুশীলন ১সহজ

Bob তিনটা lap-এর সময় লিখে রেখেছে, যে ক্রমে দৌড়েছে সেই ক্রমে। এখন ও চায় শেষ lap থেকে পিছিয়ে প্রথমটা পর্যন্ত।

Input. এক লাইনে তিনটা পূর্ণসংখ্যা।

Output. তিনটা পূর্ণসংখ্যা উল্টো ক্রমে, এক লাইনে, মাঝে একটা করে space।

Constraints. প্রতিটা পূর্ণসংখ্যা -1000000000 থেকে 1000000000-এর মধ্যে।

Sample. Input 4 9 2 দিলে 2 9 4।

#include <iostream>

int main()
{
    int a = 0;
    int b = 0;
    int c = 0;

    // Read the three integers with std::cin, then print them
    // in reverse order with std::cout, separated by single spaces.

    return 0;
}

আলাদা করে গ্রেড হয় না। std::cin দিয়ে পড়ার কাজটা অনুশীলন ৩ গ্রেড করে।

Run in Compiler
অনুশীলন ২সহজ

স্কুলের library প্রতিটা নতুন card-এ একটা স্বাগত লাইন ছাপে। একটা নাম আর একটা বয়স পড়ো, তারপর একটা বাক্য print করো।

Input. এক লাইনে একটা নাম (একটাই শব্দ, শুধু অক্ষর) আর বয়স, একটা পূর্ণসংখ্যা।

Output. এক লাইন: নাম, তারপর is, বয়স আর years old., মাঝে একটা করে space।

Constraints. নামে 1 থেকে 20টা অক্ষর। 1 <= age <= 120।

Sample. Input Maria 15 দিলে Maria is 15 years old.

#include <iostream>
#include <string>

int main()
{
    std::string name;
    int age = 0;

    // Read the name and the age with one std::cin line.
    // Print the sentence with one std::cout line.

    return 0;
}

আলাদা করে গ্রেড হয় না। এটা std::string আর নানা type মেশানো <<-এর শিকলের হাত পাকায়।

Run in Compiler
অনুশীলন ৩সহজ

একটা tournament-এ Kenji যত game খেলে, প্রতিটার score লিখে রাখে। ও জানতে চায় সবচেয়ে ভালো score কত, আর সেটা কোন game থেকে এসেছে। Game গোনা হয় 1 থেকে, মানুষ যেভাবে গোনে।

Input. প্রথম লাইনে একটা পূর্ণসংখ্যা n। দ্বিতীয় লাইনে n-টা পূর্ণসংখ্যা, game যে ক্রমে খেলা হয়েছে সেই ক্রমে score-গুলো।

Output. এক লাইনে দুইটা পূর্ণসংখ্যা, মাঝে একটা space: সবচেয়ে বড় score, তারপর তার অবস্থান (প্রথম score-এর অবস্থান 1)। সবচেয়ে বড় score একাধিকবার এলে, যে অবস্থানে প্রথম এসেছে সেটা print করো।

Constraints. 1 <= n <= 80000। প্রতিটা score -1000000000 থেকে 1000000000-এর মধ্যে। Time limit: প্রতিটা test-এ 1 সেকেন্ড।

Sample. Input 5 আর 4 9 2 9 1 দিলে 9 2। সবচেয়ে বড় score 9; সেটা আছে অবস্থান 2 আর 4-এ, আর এদের প্রথমটা 2।

#include <iostream>

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int n = 0;
    std::cin >> n;

    // Read the n integers. Print the largest one and its position
    // (the first integer is position 1), separated by one space.
    // If the largest appears more than once, print its first position.

    return 0;
}

main-এর শুরুর লাইন দুইটা lesson 02-এর; ওগুলো রেখে দাও, program কী print করে তাতে ওরা কিছু বদলায় না। max-and-position নামে গ্রেড হয়। Hidden test-এ আছে n = 1, সব score সমান, সব score negative, আর n = 80000।

Run in Compiler

সচরাচর যে প্রশ্নগুলো আসে

  • C++-এ কি scanf আর printf লেখা চালিয়ে যেতে পারি?

    পারো। <cstdio> include করো, ওরা কাজ করবে, আর দ্রুতও। Bob চাইলে রেখে দিতে পারে। সীমা দুইটা: ওরা সরাসরি std::string পড়তে বা print করতে পারে না, আর একই program-এ কেন ওদের std::cin আর std::cout-এর সাথে মেশানো যাবে না, সেটা দেখাবে lesson 02।

  • <iostream>-এ .h নেই কেন?

    C++ standard-এর নিজের header-গুলোতে .h থাকে না। পুরনো বইয়ে লেখা থাকত <iostream.h>, আর GCC 12 সেটা মানে না: fatal error: iostream.h: No such file or directory। C-এর header-গুলোরও একটা C++ রূপ আছে, যেমন <cstdio> আর <cmath>: সামনে একটা c, আর .h নেই।

  • std::cout 2.50-কে 2.5 print করল কেন?

    নিজে থেকে সে ছয়টা পর্যন্ত significant digit দেখায়, আর শেষের শূন্য ফেলে দেয়। একই কারণে Compiler Explorer-এ 1234567.0 print হয়েছে 1.23457e+06। কোনো problem দশমিকের পরে ঠিক কয় ঘর চাইলে <iomanip>-এর std::fixed আর std::setprecision(2) সেটা করে দেয়।

  • আর কোনো C program কি আছে, যেটা C++ program না?

    অল্প কয়েকটা। C++-এ C-এর চেয়ে keyword বেশি, যেমন new, class আর delete। int new = 5; C-তে ঠিক আছে, কিন্তু C++-এ GCC 12 বলে error: expected unqualified-id before 'new'। Variable-টার নাম বদলে সামনে এগোও।

মূল কথা

  • বেশিরভাগ C কিছু না বদলেই C++ হিসেবে compile হয়; Bob-এর যোগের program হয়েছে, output-ও একই।
  • std::cin >> a >> b; পড়ে আর std::cout << a + b << '\n'; print করে, format string ছাড়া, & ছাড়া।
  • std::cin হলো stdin-এর কল আর std::cout stdout-এর পাইপ; তীর-চিহ্ন দেখায় data কোন দিকে যায়।
  • std:: হলো standard library-র namespace; using namespace std; ছোট contest program-এর জন্য, header-এ কখনো না।
  • C++-এর প্রথম দিন: void*-এর জন্য cast লাগে, bool-এর জন্য header লাগে না, আর 'a' একটা char।
  • Compile করো g++ -std=c++17 দিয়ে; Playground-এর c++17 চালায় g++ -O2 -std=c++17, GCC 12-এ, -Wall ছাড়া।

এরপর Kenji-র ঠিকঠাক program এক মিলিয়ন সংখ্যায় গিয়ে সময়ে কুলাতে পারে না, আর lesson 02 মেপে দেখে কোন দুইটা লাইন সেটা সারায়।

lesson ১ শেষ

শেষ হলে চিহ্ন দিন, অগ্রগতি আপনার সাথে থাকবে।

পরেরটা: দ্রুত input-output: contest-এর code একই লাইন দিয়ে শুরু হয় কেন