+9

Bài 1: Giới thiệu Lập trình thi đấu và ngôn ngữ lập trình C++

I. Tổng quan về chương trình khối chuyên Tin

1. Mục tiêu đào tạo

Chương trình chuyên Tin học và đào tạo thi HSG Tin học hướng tới các mục tiêu sau:

  • Giúp học sinh hiểu rõ môn Tin học trong khối chuyên là gì, và làm thế nào để có phương pháp học tập tốt môn học. Tránh nhầm lẫn việc học trong lớp chuyên Tin là học Toán, là "lớp dễ hơn của chuyên Toán".
  • Trang bị cho học sinh các kiến thức về Ngôn ngữ lập trình, khái niệm về Lập trình thi đấu và các Thuật toán, nhằm giúp học sinh có khả năng giải các bài toán lập trình trên máy tính.
  • Hướng các bạn học sinh tới việc học tập chuyên sâu môn Tin học để tham gia các kì thi HSG Tin học cấp Trường, cấp Quận/Huyện, cấp Thành phố,...và xa hơn nữa.

2. Lợi ích của việc học tập chương trình chuyên Tin

Khi trở thành một học sinh trong khối chuyên Tin và tham gia các kì thi HSG Tin học, các bạn học sinh sẽ có những lợi thế sau đây:

  • Có cơ hội đạt được các giải HSG Tin học, làm đẹp học bạ, hồ sơ du học và là lợi thế lớn khi xét tuyển thẳng vào các trường Đại học liên quan tới khối ngành CNTT.
  • Được học tập chuyên sâu về các Thuật toán, từ đó sẽ có ưu thế lớn khi theo học các trường Đại học liên quan tới ngành CNTT, đặc biệt là ở năm 1, 2 đại học.
  • Gia tăng cơ hội được nhận vào các doanh nghiệp Công nghệ hàng đầu, bởi vì các doanh nghiệp thường phỏng vấn sinh viên mới ra trường bằng các bài test về thuật toán.
  • Học tốt được môn Toán trên lớp ở một số phần nhất định liên quan tới môn Tin.
  • Nếu đạt giải HSG quốc gia sẽ được tuyển thẳng vào các trường Đại học thuộc khối ngành Kĩ thuật.

Bảng học bổng Trường Đại học Công nghệ - ĐHQG Thành phố HCM cho giải HSG các môn văn hóa. Môn Tin học chiếm ưu thế hoàn toàn.

II. Chương trình đào tạo cụ thể

1. Ngôn ngữ lập trình

Trong chương trình HSG, ngôn ngữ chủ yếu được lựa chọn để minh họa sẽ là ngôn ngữ C++. Ngoài ra, ngôn ngữ Pascal cũng là một ngôn ngữ cho phép trong thi HSG, tuy nhiên gần như đã không còn được sử dụng, và sách giáo khoa Tin học hiện tại cũng đã bỏ ngôn ngữ này, do nó đã lỗi thời và không còn được nhà phát hành hỗ trợ.

Những năm gần đây, ngôn ngữ Python cũng là một ngôn ngữ mới được bổ sung vào danh sách các ngôn ngữ lập trình cho phép ở các kì thi HSG, tuy nhiên nó không có nhiều ưu thế như C++, nguồn tài liệu cũng khá ít nên C++ vẫn được ưa chuộng hơn.

2. Lập trình thi đấu (Competitive Programming)

Lập trình thi đấu (Competitive Programming) là một mảng khá thú vị của Công nghệ thông tin. Lĩnh vực này thường được đào tạo trong thời kỳ THPT và Đại học.

Đây là một sân chơi liên quan tới các thuật toán, với mục đích để các bạn học sinh - sinh viên và thậm chí là người đi làm thi đấu với nhau về khả năng giải quyết vấn đề thông qua phương tiện là máy tính và ngôn ngữ lập trình. Nói ngắn gọn lại, những người tham gia sân chơi này sẽ cùng nhau tìm cách giải 1 hoặc nhiều bài toán trong thời gian quy định, nhưng giải bằng cách lập trình ra lệnh cho máy tính, sao cho đạt được kết quả chính xác.

Những bài toán trong Lập trình thi đấu phần lớn đều mang tính lý thuyết, và luôn luôn có lời giải. Mặc dù các bài toán này không mang tính thực tế, nhưng lại có thể đánh giá được năng lực tư duy của người lập trình, từ đó trở thành mục tiêu cho những công ty công nghệ lớn săn đuổi và đào tạo trở thành các lập trình viên hàng đầu.

Những kỳ thi Lập trình thi đấu nổi tiếng của thế giới: ACM - ICPC, Google Code Jam, Shopee Code League, Facebook Hacker Cup, HSG Tin học khu vực châu Á - Thái Bình Dương (APIO), HSG Tin học HSG Tin học Quốc tế (IOI),...

Tại Việt Nam, các kỳ thi lập trình thi đấu được tổ chức thành các kỳ thi HSG các cấp: Trường, Quận/Huyện, Quốc gia. Ngoài ra, có thêm các kỳ thi như Tin học trẻ, Olympic 30/4, HSG Tin học Đồng bằng duyên hải Bắc Bộ,...

Các trang web luyện tập: codeforces.com, vnoi.info, codechef.com, hackerrank.com, topcoder.com,...

II. Khái niệm về chương trình và lập trình

1. Ngôn ngữ lập trình và chương trình dịch

Máy tính điện tử hoạt động dựa trên sự ra lệnh của con người, tuy nhiên nó không hiểu được ngôn ngữ thông thường của con người sử dụng. Để diễn tả các thuật toán cho máy tính hiểu được, người ta sử dụng một tập các lệnh được chuẩn hóa theo một hệ thống quy tắc riêng, được gọi là ngôn ngữ lập trình.

Có ba loại ngôn ngữ lập trình:

  • Ngôn ngữ máy (Machine language): Các lệnh được mã hóa bằng các kí hiệu 01,0 - 1, là ngôn ngữ mà máy tính sử dụng. Chương trình được viết bằng ngôn ngữ máy có thể được nạp vào bộ nhớ và sử dụng luôn.
  • Hợp ngữ (Assembly language): Còn gọi là ngôn ngữ lập trình bậc thấp, kết hợp giữa mã máy và các từ viết tắt tiếng Anh để diễn tả câu lệnh.
  • Ngôn ngữ lập trình bậc cao (High-level programming language): Là ngôn ngữ sử dụng các từ khóa gần với ngôn ngữ tiếng Anh để mô tả thuật toán. Ngôn ngữ lập trình bậc cao rất dễ viết do gần với ngôn ngữ tự nhiên. Tùy vào mức độ trừu tượng hóa mà ngôn ngữ lập trình bậc cao được định nghĩa là cao tới cấp nào. Trong khóa học này, chúng ta sẽ tập trung nghiên cứu ngôn ngữ lập trình bậc cao trung cấp, cụ thể là ngôn ngữ C++ (tiền thân là C, nên người ta thường viết C/C++).

Để chuyển đổi chương trình được viết bằng ngôn ngữ lập trình bậc cao sang chương trình mà máy tính có thể thực thi được, người ta sử dụng một chương trình đặc biệt gọi là chương trình dịch. Chương trình dịch nhận đầu vào là một chương trình viết bằng ngôn ngữ lập trình bậc cao, thực hiện chuyển đổi sang ngôn ngữ máy. Có hai loại chương trình dịch:

  • Chương trình thông dịch (Interpreter): Chương trình dịch sẽ kiểm tra tính đúng đắn của câu lệnh tiếp theo trong chương trình nguồn, sau đó chuyển đổi câu lệnh đó sang ngôn ngữ máy và thực thi nó. Như vậy, quá trình chuyển đổi được diễn ra luân phiên, chương trình dịch sẽ dịch và thực hiện từng câu lệnh một.
  • Chương trình biên dịch (Compiler): Chương trình dịch sẽ duyệt, phát hiện lỗi, kiểm tra tính đúng đắn của mọi câu lệnh trong chương trình nguồn, sau đó mới tiến hành dịch toàn bộ chương trình nguồn sang ngôn ngữ máy và có thể lưu trữ để sử dụng lại khi cần thiết.

Thông thường, các môi trường làm việc của các ngôn ngữ lập trình sẽ tích hợp sẵn chương trình dịch và các tính năng về soạn thảo, lưu trữ, theo dõi biến số,...Đối với C/C++, chúng ta có thể sử dụng các môi trường như: CodeBlocks, Sublime Text, Visual Studio Code,...đều được.

2. Thuật toán là gì?

Thuật toán hay còn gọi là giải thuật có khá nhiều định nghĩa khác nhau. Ta có thể hiểu thuật toán là dãy hữu hạn các bước, mỗi bước mô tả chính xác các phép toán hoặc hành động cần thực hiện, để giải quyết một vấn đề.

Thuật toán gồm có 6 đặc trưng dưới đây:

  • Đầu vào (Input): Thuật toán nhận dữ liệu vào từ một tập nào đó.
  • Đầu ra (Output): Với mỗi tập các dữ liệu đầu vào, thuật toán đưa ra các dữ liệu tương ứng với lời giải của bài toán.
  • Chính xác: Các bước của thuật toán được mô tả chính xác.
  • Hữu hạn: Thuật toán cần phải đưa được đầu ra sau một số hữu hạn (có thể rất lớn) bước với mọi đầu vào.
  • Đơn trị: Các kết quả trung gian của từng bước thực hiện thuật toán được xác định một cách đơn trị và chỉ phụ thuộc vào đầu vào và các kết quả của các bước trước.
  • Tổng quát: Thuật toán có thể áp dụng để giải mọi bài toán có dạng đã cho.

Để biểu diễn thuật toán có thể biểu diễn bằng danh sách các bước, các bước được diễn đạt bằng ngôn ngữ thông thường và các kí hiệu toán học; hoặc có thể biểu diễn thuật toán bằng sơ đồ khối. Tuy nhiên, để đảm bảo tính xác định của thuật toán, thuật toán cần được viết bằng các ngôn ngữ lập trình.

3. Khái niệm về lập trình

Mọi bài toán có thuật toán đều có thể giải được bằng máy tính điện tử. Các bước để giải một bài toán trên máy tính gồm có: Xác định bài toán, Xây dựng hoặc lựa chọn thuật toán khả thi, và sau cùng là lập trình.

Lập trình là việc sử dụng cấu trúc dữ liệu và tập các lệnh của ngôn ngữ lập trình cụ thể để mô tả dữ liệu và diễn đạt các thao tác của thuật toán, nhằm mục đích giải một bài toán nào đó bằng ngôn ngữ lập trình.

III. Giới thiệu ngôn ngữ lập trình C++

1. C++ là gì

Ngôn ngữ lập trình C++, được phát triển bởi Bjarne Stroustrup vào năm 19791979 là một ngôn ngữ lập trình bậc cao (nhưng là thấp nhất và khó nhất trong các ngôn ngữ lập trình bậc cao), cung cấp khả năng lập trình hướng cấu trúc và hướng đối tượng. Thực ra, C++ là một bản nâng cấp của ngôn ngữ C, được phát triển dựa trên chính ngôn ngữ C nên nó vẫn mang phong cách lập trình hướng cấu trúc như C và hỗ trợ thêm phong cách lập trình hướng đối tượng. Vì thế, người ta thường gọi hai ngôn ngữ này bởi một cái tên chung là C/C++.

Bởi vì là ngôn ngữ được phát triển từ C, nên ngôn ngữ C++ vẫn có đầy đủ các câu lệnh và cú pháp của ngôn ngữ C. Trong khi lập trình C++, nhiều trường hợp chúng ta vẫn sử dụng các cú pháp của C và đặc biệt, trong lập trình thi đấu thì phong cách lập trình hướng cấu trúc của C (chia chương trình ra thành nhiều hàm nhỏ - mỗi hàm phụ trách một công việc cụ thể) vẫn được giữ nguyên vì tính đơn giản và phát huy được tốc độ trong quá trình giải các bài toán. Các file được viết bằng ngôn ngữ C++ đều có phần mở rộng là .cpp.

2. Tại sao lại lựa chọn C++ trong lập trình thi đấu

Học sinh - sinh viên thường chọn hai ngôn ngữ chủ đạo trong lập trình thi đấu là Pascal và C++. Tuy nhiên, trong những năm trở lại đây thì xu hướng sử dụng Pascal ngày càng giảm, ngược lại số lượng người sử dụng C++ ngày càng tăng lên. Có một vài nguyên nhân chính khiến cho C++ được ưa chuộng trong lập trình thi đấu nói riêng và trong lập trình nói chung:

  • Dễ tiếp cận: Cú pháp của C++ rất dễ để tiếp cận, gần với ngôn ngữ đời thường và rất tường minh. Học sinh - sinh viên khi mới học lập trình khi tiếp cận với C++ phần lớn sẽ cảm thấy đơn giản hơn khi sử dụng C++ làm phương tiện để tiếp nhận các kiến thức về thuật toán.
  • Hiệu năng cực kỳ cao: Đây là ưu thế lớn của C++, đặc biệt là trong lập trình thi đấu khi các bài toán đều có ràng buộc về thời gian thực thi chương trình, yêu cầu có một ngôn ngữ hiệu quả về thời gian chạy. Đối chiếu với một người bạn của nó là Python, ta sẽ thấy ngay tốc độ chạy của hai ngôn ngữ này là khác biệt, mặc dù Python là một ngôn ngữ có cú pháp rất ngắn gọn nhưng tốc độ chạy lại lâu hơn C++.
  • Thư viện hỗ trợ người dùng: Trong C++ có rất nhiều thư viện cung cấp các hàm dựng sẵn, hỗ trợ người dùng tối đa trong khi lập trình, đặc biệt là các thuật toán và cấu trúc dữ liệu. Việc sử dụng thành thạo các thư viện trong C++ sẽ "nối dài khả năng lập trình" của học sinh - sinh viên.

Ngoài ra, Python cũng là một ngôn ngữ mới được đưa vào trong Lập trình thi đấu gần đây. Tuy nhiên, Python không thể so sánh với C++ về ưu thế tốc độ, ngoài ra có một số cấu trúc dữ liệu chỉ được hỗ trợ trong C++ mà không có trong Python. Cộng thêm một yếu tố quan trọng là các tài liệu thuật toán phần lớn đều viết bằng ngôn ngữ C++ (có lẽ lên tới khoảng 90%), vì vậy C++ vẫn là lựa chọn tối ưu nhất cho Lập trình thi đấu.

IV. Cài đặt môi trường lập trình Code::Blocks và tạo chương trình đầu tiên

1. Cài đặt Code::Blocks

Để lập trình ngôn ngữ C++, chúng ta sẽ cần có một chương trình soạn thảo và chương trình biên dịch ngôn ngữ. Phần mềm Code::Blocks vừa tích hợp việc soạn thảo ngôn ngữ C++ và trình biên dịch, đồng thời có giao diện khá đẹp nên được rất nhiều học sinh - sinh viên lựa chọn sử dụng. Trong giáo án này, các bạn sẽ được hướng dẫn các thao tác lập trình C++ bằng Code::Blocks.

Đầu tiên, truy cập vào địa chỉ sau: https://www.codeblocks.org/ - là trang chủ của phần mềm Code::Blocks. Giao diện của trang web sẽ hiện lên như hình bên dưới. Bấm vào mục Dowloads ở góc bên trái màn hình.

Chọn vào dòng Dowload the binary release:

Lựa chọn phiên bản phù hợp cho hệ điều hành máy tính của bạn. Trong giáo trình này sử dụng hệ điều hành Windows, đối với các hệ điều hành khác các bạn làm hoàn toàn tương tự:

Danh sách các bản cài đặt sẽ hiện ra sau khi bạn lựa chọn hệ điều hành. Hãy tải về file cài đặt có tích hợp trình biên dịch mingw của C++. Nếu hệ điều hành máy tính của bạn là 64 bit, lựa chọn đường link phía trên; nếu là 32 bit thì lựa chọn đường link phía dưới. Bạn có thể sử dụng một trong hai nguồn tải là FossHub hoặc Sourceforge.net đều được. Nhấn vào link, chờ khoảng 5s là các bạn có thể tải về file cài đặt.

Sau khi tải về, các bạn khởi chạy file cài đặt Code::Blocks.

Bấm Next để tiếp tục.

Bước này bấm vào I Agree để chấp nhận điều khoản cài đặt và tiếp tục.

Bước này cần lựa chọn các option cài đặt. Các bạn cứ để mặc định rồi bấm vào Next.

Bây giờ các bạn hãy lựa chọn thư mục mà bạn muốn cài đặt Code::Blocks vào:

  • Thư mục (1)(1) là vị trí cài đặt mặc định tại ổ C: C:\Program Files\CodeBlocks.
  • Phần (2)(2): Các bạn bấm vào Browse để thay đổi thư mục cài đặt.
  • Cuối cùng bấm vào Install (3)(3) để bắt đầu cài đặt.

Quá trình cài đặt mất khoảng vài phút. Sau khi cài đặt xong, các bạn bấm vào Finish để kết thúc cài đặt.

2. Tạo project và chương trình C++ đầu tiên

Sau khi cài đặt xong Code::Blocks, các bạn khởi chạy chương trình và sẽ thấy giao diện như hình bên dưới. Khi chạy Code::Blocks lần đầu, phần mềm sẽ hỏi các bạn có muốn đặt luôn nó làm phần mềm mặc định cho các file C++ hay không. Lời khuyên là các bạn nên chọn No (dòng đầu tiên), vì biết đâu sau này chúng ta sẽ chuyển sang dùng một phần mềm soạn thảo C++ khác.

Kế đến, các bạn chọn File \rightarrow New \rightarrow Project để tạo một dự án trong CodeBlocks.

Một khung như hình bên dưới sẽ hiện ra. Các bạn cần lựa chọn loại dự án của mình. Trong Code::Blocks hỗ trợ lập trình rất nhiều dự án khác nhau. Đối với lập trình thi đấu, các bạn hãy lựa chọn Console Application - tức là khi chạy chương trình sẽ hiển thị kết quả ra màn hình.

Lựa chọn ngôn ngữ là C++ rồi nhấn Next.

Điền tên của dự án vào mục Project title. Sau đó chọn nơi lưu trữ dự án bằng cách nhấn vào dấu ... ở bên cạnh phần Folder to create project in. Các bạn nên chọn một folder cố định làm nơi lưu trữ các dự án C++ của mình, sau đó sẽ tạo các dự án mới hoặc buổi học mới trong một folder cố định đó thôi, để tránh dữ liệu bị lưu trữ lộn xộn. Tiếp tục nhấn Next.

Nhấn vào finish để tiến hành tạo dự án.

Giao diện chương trình sẽ hiện ra như hình bên dưới. Ở đây do mình để chế độ màn hình màu đen nên mới có giao diện đen. Còn ban đầu khi cài đặt thì mặc định Code::Blocks sẽ có giao diện nền trắng. Các bạn quan sát ở thanh công cụ bên trái:

  • Phần C++_First_Program chính là tên dự án mà mình vừa tạo ra.
  • Mục Sources bên trong chứa các file chương trình của dự án. Mặc định sẽ có một filemain.cpp, các bạn bấm vào file này sẽ hiện ra một chương trình như bên dưới.

Để chạy chương trình, trước tiên các bạn nhấn tổ hợp phím Ctrl - F9 để biên dịch chương trình, sau đó nhấn tổ hợp phím Ctrl - F10 để chạy chương trình. Hoặc các bạn có thể chỉ nhấn phím F9 để vừa biên dịch và chạy chương trình đồng thời. Giao diện phần chạy chương trình sẽ hiện lên như sau:

Các bạn cũng có thể loại bỏ file main.cpp này ra khỏi project và tạo ra những file chương trình mới của mình để làm những bài mới chẳng hạn. Để làm điều đó, các bạn nhấn chuột phải vào tên file chương trình hiện tại, chọn Remove file from project.

Sau đó nhấn tổ hợp phím Ctrl - Shift - N để tạo ra một file chương trình mới. Chọn Yes để thêm file này vào project và nhớ lưu tên file với phần mở rộng là .cpp nhé!

3. Vài lưu ý nhỏ khi lập trình C++ với Code::Blocks

Để lập trình hiệu quả, khoa học với Code::Blocks, đặc biệt là với các bạn mới học, tôi có một số lời khuyên đúc kết từ kinh nghiệm cá nhân như sau:

  • Đừng ngại tạo ra các project mới khi làm việc. Chẳng hạn, với những bạn mới học, thì mỗi buổi học các bạn nên tạo ra một project mới, và lưu các file bài tập mình làm trong buổi học đó ở project tạo ra. Làm như vậy sẽ giúp các bạn kiểm soát tốt bài tập của mỗi buổi và không cần tìm kiếm mất thời gian mỗi khi cần xem lại.
  • Đừng để nhiều file chương trình trong thư mục Sources. Đôi khi điều này sẽ gây ra những lỗi biên dịch không đáng có.
  • Các bạn có thể chỉnh sửa giao diện của Code::Blocks theo ý mình. Hãy chọn mục Settings \rightarrow Editor và điều chỉnh giao diện theo ý mình. Có rất nhiều thứ có thể điều chỉnh như: Font chữ, cỡ chữ, điều chỉnh màu chữ và màu cho các từ khóa của hệ thống,..Nhưng hãy để cỡ chữ khoảng 1414 để dễ nhìn code, từ đó dễ dàng chỉnh sửa các lỗi sai của mình.

V. Cấu trúc chương trình C++

1. Cấu trúc tổng thể của một chương trình

Một chương trình được viết bằng ngôn ngữ lập trình bậc cao, nhìn chung sẽ gồm hai phần: phần khai báophần thân:

  • Phần khai báo: Hình dung chúng ta chuyển nhà tới một địa điểm mới, và sau đó cần khai báo các thông tin cá nhân cho công an địa phương. Tương tự như vậy, trước khi đi vào lập trình một chương trình, ta cần khai báo những thứ mà mình sẽ sử dụng trong chương trình đó, bao gồm: Tên chương trình, thư viện, các hằng, biến và chương trình con. Đối với ngôn ngữ C/C++, có một cải tiến rất thuận lợi đó là người dùng được quyền khai báo ở bất kỳ đâu trong chương trình, miễn là khai báo trước khi sử dụng một thứ gì đó.
  • Phần thân: Bao gồm các dãy lệnh được đặt trong một cặp kí hiệu mở đầu và kết thúc. Các câu lệnh phải được phân tách với nhau bằng dấu ;. Đối với C/C++, các lệnh được đặt trong cặp dấu ngoặc nhọn {}.

2. Các thành phần của một chương trình C++

2.1. Phần khai báo

Khai báo thư viện

Định nghĩa thư viện: Một ngôn ngữ lập trình thường có sẵn một số thư viện cung cấp các chương trình đã được xây dựng sẵn. Để sử dụng chúng, cần khai báo thư viện chứa các chương trình đó.

Cú pháp khai báo:

#include <{Tên_thư_viện}>

Ví dụ:

#include <iostream>

Trong C++ có rất nhiều thư viện khác nhau, mỗi thư viện có tác dụng riêng. Tuy nhiên, đối với lập trình thi đấu chúng ta chỉ sử dụng một số thư viện. Một cách nhanh để khai báo tất cả các thư viện trong C++, đó là cú pháp #include <bits/stdc++.h>.

Khai báo không gian tên (namespace)

Định nghĩa namespace: Về bản chất, namespace định nghĩa một phạm vi sử dụng hàm. Giả sử trong khi lập trình, người dùng gọi ra một hàm FF nào đó, nhưng có tới 22 thư viện có chung hàm tên là FF (tất nhiên với chức năng khác nhau). Vậy làm sau để chương trình biết rằng người dùng cần sử dụng hàm FF nào? Khái niệm namespace ra đời để phục vụ cho mục đích phân biệt ngữ cảnh sử dụng một hàm, một cái tên nào đó. C/C++ cung cấp một namespace tiêu chuẩn (std) đã được xây dựng sẵn để giúp người dùng sử dụng các hàm và lệnh trong thư viện chuẩn của C++.

Cú pháp khai báo:

using namespace {Tên_namespace}

Ví dụ:

using namespace std; 

2.2. Phần thân

Bao gồm các hàm của chương trình, trong đó bắt buộc có duy nhất một hàm main(), hay còn gọi là hàm thực thi. Trong quá trình biên dịch, chương trình dịch sẽ đi vào dịch các câu lệnh trong hàm main() đầu tiên, vì vậy mọi hàm con của chương trình đều phải được gọi ra trong hàm main() nếu như muốn được thực thi.

Các câu lệnh trong phần thân chương trình luôn luôn kết thúc bằng dấu ;.

Trong các hàm sẽ bao gồm các lệnh đơn hoặc các khối lệnh. Một khối lệnh là một cụm gồm các lệnh liên quan tới nhau, được đặt trong một cặp ngoặc {}. Thuật ngữ câu lệnh được sử dụng để chỉ chung cho câu lệnh đơn và khối lệnh.

Đôi khi chúng ta cần chú thích cho một đoạn chương trình nào đó để diễn giải cho người đọc, khi đó ta sử dụng comment. Có hai dạng comment: Dạng khối - được đặt trong cặp dấu /**/, và dạng dòng đơn - bắt đầu bằng cặp dấu //. Khi biên dịch, những gì viết trong comment sẽ được trình biên dịch bỏ qua.

3. Chương trình C++ đầu tiên

Chương trình dưới đây là một chương trình C++ in ra dòng thông báo Hello World trên màn hình chương trình. Bạn đọc chưa cần hiểu ý nghĩa thực sự của các câu lệnh, chỉ cần đọc để biết cấu trúc một chương trình C++ trông sẽ như thế nào!

/*
    Đây là comment dạng khối.
    Những gì viết trong này sẽ được bỏ qua khi biên dịch.
*/
// Đây là comment dòng đơn.

#include <iostream> // Khai báo thư viện, iostream là thư viện nhập xuất.
#define program_name "example" // Khai báo định nghĩa cho tên program_name

using namespace std; // Khai báo không gian tên.

int main() // Hàm thực thi.
{  
    cout << "Hello World!"; // Một lệnh đơn.

    return 0; // Trả ra giá trị cho hàm, sẽ học ở một bài khác.  
} 

Biên dịch và chạy chương trình trên sẽ cho ra kết quả như sau:

Hello World!

VI. Toán tử số học và Toán hạng

Toán tử là các biểu tượng, các kí hiệu mà chỉ cho chương trình dịch biết rằng nó cần thực hiện thao tác toán học hay logic nào. C++ cung cấp rất nhiều toán tử có sẵn, cụ thể được chia làm 6 loại:

  • Toán tử số học.
  • Toán tử quan hệ.
  • Toán tử logic.
  • Toán tử gán.
  • Toán tử so sánh bit.
  • Toán tử hỗn hợp.

Trong phần này, chúng ta sẽ nghiên cứu về một số loại toán tử số học trong ngôn ngữ C++.

Toán tử số học là các toán tử thực hiện các tính toán số học, còn toán hạng đơn giản chỉ là đối tượng thực hiện tính toán số học. Kết quả của phép toán sẽ được tự động gán theo kiểu dữ liệu của các toán hạng. Giả sử ta có hai số kiểu thực a=5.0,b=10.0\text{a} = 5.0, \text{b} = 10.0 (gọi là các toán hạng), các toán tử số học sẽ tính toán chúng theo bảng dưới đây:

Lưu ý, đối với toán tử tăng ++ và toán tử giảm--, có sự khác biệt khi ta đặt chúng đằng trước hay đằng sau toán hạng:

  • Đặt đằng trước (dạng prefix): Việc tăng/giảm toán hạng sẽ được thực hiện trước câu lệnh.
  • Đặt đằng sau (dạng postfix): Việt tăng/giảm toán hạng sẽ được thực hiện sau câu lệnh.

Ví dụ dưới đây sẽ phân tích điểm khác nhau giữa dạng prefix và dạng postfix:

int main()
{
    int a = 20;

    cout << ++a << endl; // a tăng lên 21 trước rồi mới in ra.

    cout << a++;  // in ra a trước, sau đó tăng a lên 22.
    cout << a; // a lúc này mới mang giá trị 22.

    return 0;
}

Chạy chương trình trên sẽ cho ra kết quả:

21
21
22

VII. Các loại toán tử khác

Ngoài toán tử số học, trong C++ còn có nhiều loại toán tử khác. Tuy nhiên, do phạm vi kiến thức của bài học này nên tôi sẽ chỉ giới thiệu sơ qua các loại toán tử cùng với một số ví dụ rất đơn giản. Cách sử dụng chi tiết của các loại toán tử này sẽ được đề cập đến trong những bài học khác chuyên sâu hơn.

1. Toán tử quan hệ

Các loại toán tử quan hệ sẽ xác định quan hệ giữa các toán hạng, và trả ra kết quả là quan hệ đó đúng (true) hay không đúng (false). Bảng dưới đây thể hiện các quan hệ giữa hai toán hạng a=5,b=10a=5, b=10:

2. Toán tử logic

Các toán tử logic sẽ xác định quan hệ về mặt đúng/sai giữa các toán hạng logic. Giả sử ta có hai toán hạng logic A=trueA=\text{true}B=falseB=\text{false}, bảng dưới đây thể hiện quan hệ logic giữa chúng:

3. Toán tử so sánh bit

Dữ liệu trong máy tính đều được mã hóa sang dạng các bit nhị phân 010 - 1. Các toán tử so sánh bit sẽ làm việc trên các bit nhị phân. Bảng dưới đây thể hiện ý nghĩa của các toán tử so sánh bit với các cặp bit 010-1:

Giả sử ta có hai toán hạng aabb, toán tử so sánh bit sẽ đổi aabb sang hệ nhị phân và tiến hành so sánh từng bit với nhau, sau đó gộp kết quả lại và trả ra kết quả ứng với kiểu dữ liệu của aabb. Lấy ví dụ với a=60,b=13a = 60, b=13, ta có:

  • a=001101002a = 0011 0100_2.
  • b=000011012b = 0000 1101_2.

Bảng dưới đây thể hiện kết quả so sánh bit giữa aabb:

4. Toán tử gán

Toán tử gán cho phép gán một biến bằng một biểu thức nào đó. Các toán tử gán được thể hiện trong bảng dưới đây:

5. Toán tử hỗn hợp

Ngoài 55 loại toán tử kể trên, còn có một số toán tử hỗn hợp được hỗ trợ trong C++. Dưới đây là bảng liệt kê các toán tử hỗn hợp quan trọng, chi tiết về cách hoạt động của chúng sẽ được đề cập trong các bài học cụ thể:

VIII. Tài liệu tham khảo


©️ Tác giả: Vũ Quế Lâm từ Viblo.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.