Bài 2. Cấu trúc của một chương trình C++
Hello các bạn! Trong bài viết trước chúng ta đã cùng nhau viết chương trình C++ đầu tiên và như mình đã nói ở bài viết trước, hôm nay chúng ta sẽ cùng nhau tìm hiểu ý nghĩa và công dụng của từng câu lệnh. Ok! Start…
2.1. Cấu trúc cơ bản của một chương trình C++.
Để có thể hiểu và tự tay viết chương trình C++ điều đầu tiên các bạn cần phải biết đó là cấu trúc cơ bản của một chương trình.
Một chương trình C++ cơ bản sẽ gồm 3 thành phần sau:
- Các câu lệnh và biểu thức (Statements and expressions).
- Hàm (Functions).
- Thư viện chuẩn C++.
2.1.1. Câu lệnh và biểu thức.
- Các câu lệnh và biểu thức là thành phần nhỏ nhất để cấu thành lên một chương trình.
- Một chương trình có thể gồm rất nhiều câu lệnh nhưng cũng có thể không có câu lệnh nào (phần này mình sẽ nói sau).
- Mỗi một câu lệnh sẽ yêu cầu chương trình thực hiện một nhiệm vụ nhất định.
- Câu lệnh phải kết thúc bằng dấu chấm phẩy “ ; ”.
Ví dụ:
int x; x = 5 * 2; cout << "Xin chao cac ban!";
Phân tích ví dụ:
Dòng 1: Câu lệnh khai báo biến có tên là x.
Dòng 2: Là câu lệnh gán giá trị cho biến x. Ở đây biến x được gán giá trị bằng kết quả của biểu thức 5 * 2;
Dòng 3: Câu lệnh có nhiệm vụ đưa dữ liệu lên màn hình.
2.1.2. Hàm (Functions).
- Hàm là một nhóm các câu lệnh được tập hợp lại để thực hiện một nhiệm vụ nào đó.
- Với bất cứ một chương trình C++ nào cũng đều phải có ít nhất là một hàm main().
2.1.3. Thư viện chuẩn C++ (C++ Standard Library).
Thư viện là một tập hợp các mã được biên dịch sẵn, được đóng gói lại để lập trình viên sử dụng, mà không cần phải viết lại. Chẳng hạn: bạn viết một chương trình tính toán, bạn có thể include thư viện toán học…
Ví dụ:
#include <iostream> #include <math.h> #include <fstream>
Phân tích chút:
Dòng 1: Khai báo thư viện có tên iostream. Thư viện này cung cấp cho chúng ta khả năng nhập xuất dữ liệu cơ bản với chương trình.
Dòng 2: Khai báo thư viện toán học. Khi chúng ta cần dùng đến căn bậc 2 hay bình phương….. Thư viện này sẽ giúp chúng ta làm được điều đó.
Dòng 3: Khai báo thư viện fstream. Giúp chúng ta có thể làm việc với các file nằm ngoài chương trình.
Thư viện là một phần không thể thiếu với người lập trình. Có thư viện công việc của các bạn sẽ trở nên dễ dàng hơn.
Vậy thôi. Các bạn cứ tạm hiểu thế nhé. Qua từng bài viết mình sẽ giải thích chi tiết hơn những thành phần này.
2.2. Tại sao máy tính có thể hiểu được chương trình của chúng ta???
Giả sử đứng trước bạn đang là một người nước Anh, người này giao tiếp bằng tiếng Anh và không hiểu tiếng Việt bạn thì ngược lại giao tiếp bằng tiếng Việt và lại không hiểu tiếng Anh (đính chính lại đây chỉ là giả sử). Vậy làm sao để hai người có thể nói chuyện được với nhau. Tất nhiên là muốn giao tiếp thì một trong hai người phải đi học ngôn ngữ của người còn lại, cách nhanh hơn là gì nhỉ. Ummm chúng ta sẽ cần một người phiên dịch có thể hiểu được cả hai ngôn ngữ, khi đó hai người có thể giao tiếp với nhau thông qua người phiên dịch. Nói nhiều quá quên mất bài. Quay trở lại vấn đề nào, thực ra máy tính không hề hiểu những dòng lệnh của các bạn, cũng giống như trường hợp giả sử của mình ở trên. Máy tính chỉ có thể nhận dữ liệu là các bit dưới dạng nhị phân 0 và 1. Vì thế mà Compiler ra đời, giống như người phiên dịch, Compiler sẽ dịch toàn bộ code của chúng ta sang dạng nhị phân để máy tính có thể hiểu và thực hiện được.
Việc bạn nhấn F11 để chạy chương trình thực ra gồm hai công việc là Compiler và Run: (hình)
Đầu tiên chương trình sẽ được sẽ được Compiler biên dịch sang mã máy tính. Khi máy tính đã có thể hiểu được thì chương trình sẽ chạy. Việc chương trình của các bạn không chạy chính là do Compiler không thể biên dịch được chương trình.
Một điều nữa nè. Chúng ta đang học lập trình cơ bản C++ nên toàn bộ màn hình làm việc để chạy chương trình sẽ là màn hình Console. Thực sự thì màn hình này không đẹp tí nào cả, một màu đen ảm đạm vì vậy các bạn hãy tập chấp nhận điều này đi. 😀
2.3. Trở lại với “Hello World”.
Như đã hứa, mình sẽ giải thích từng câu lệnh cụ thể. Nhưng nếu các bạn đã hiểu những gì ở trên rồi thì mình nghĩ phần này hơi thừa. Không sao một lần viết là một lần nhớ, một lần đọc là một lần thêm hiểu.
Các bạn khởi động Dev C++ và mở chương trình Hello World giúp mình nào.
Chọn File → Open hộp thoại Open hiện ra, các bạn tìm tới nơi lưu chương trình của mình bên trái, tìm chương trình cần mở (mở tệp cpp nhé). Sau đó chọn Open để mở. (hình):
Đây là chương trình mà lần trước chúng ta đã viết: (hình).
2.3.1. Hàm main().
Tập trung ngay vào hàm main() nào. Tại sao mình lại bắt đầu từ hàm main() ư. Như mình đã nói ở trên mọi chương trình đều phải có ít nhất một hàm main(). Mình sẽ chứng tỏ cho các bạn vì sao nó lại quan trọng. Các bạn tạo một chương trình mới và viết lại giống mình nhé:
int main() { }
Lưu lại chương trình với tên tuỳ ý và f11 chạy chương trình. Kết quả: (hình)
Các bạn thấy đó mặc dù không một câu lệnh, không có thư viện, chương trình của chúng ta vẫn chạy. Trường hợp ngược lại các bạn tiếp tục tạo một chương trình mới và viết theo mình:
#include <iostream> using namespace std; cout << "Hello cac ban!";
Lưu và chạy chương trình. Kết quả: (hình).
Chương trình bị lỗi. Đến đây chắc các bạn đã hiểu tầm quan trọng của hàm main() rồi chứ.
Vâng, hàm main() chuẩn của chúng ta sẽ có dạng:
int main() { }
- Main() là tên của hàm, các bạn đừng nghĩ đến chuyện đổi tên cho hàm main() nhé.
- Các câu lệnh của chúng ta sẽ nằm trong dấu ngoặc nhọn “{ }“. Khi chương trình chạy thì những câu lệnh sẽ được thực hiện tuần tự từ trên xuống dưới.
- Ơ. thế cái int là gì vậy? Một hàm của chúng ta sẽ gồm 2 thành phần đó là tên hàm và kiểu dữ liệu mà hàm trả về. Ở đây main() là tên hàm rồi vậy chắc chắn int là kiểu dữ liệu mà hàm trả về (mình sẽ nói cụ thể hơn ở bài Hàm).
- Các bạn có thể thấy người khác viết là void main() nhưng cách viết int main() là các viết tiêu chuẩn nhất. Vì vậy tất cả chúng ta sẽ dùng void main() à lộn int main().
2.3.2. Dòng 1 và dòng 5: Khai báo thư viện, câu lệnh xuất dữ liệu.
Thư viện chỉ là một công cụ của lập trình viên (nói thế thôi thử không có xem mệt lắm đấy). Ở đây mình khai báo thư viện có tên là iostream. Thư viện này cung cấp cho chúng ta khả năng nhập, xuất dữ liệu ví dụ:
Vẫn là Hello World nhé, bây giờ các bạn xoá thư viện đi và nhấn f11. Có thấy thông báo gì không. Lỗi là cái chắc: (hình)
Xem Dev C++ thông báo gì cho chúng ta kìa (phần ô màu đỏ): [Error] ‘cout’ was not declared in this scope. Dịch ra nghĩa là cout chưa được khai báo. Vậy là biết rồi nha. Toán tử cout cho phép chúng ta xuất dữ liệu lên màn hình, mà giờ chương trình lại báo “cout” chưa được khai báo. Kết luận “cout” thuộc về thư viện iostream. Từ nay mỗi khi nhập hay xuất dữ liệu các bạn hãy nhớ khai báo thư viện này nhé.
2.3.3. Dòng 2: Using namespace std.
Lạ lẫm quá. Giờ mình thử xoá dòng này đi xem có gì xảy ra không nhé: (hình)
Tập trung vào ô đỏ đầu tiên. Sao Dev C++ vẫn “nhắn nhủ” là cout chưa được khai báo nhỉ rõ ràng là mình đã khai báo thư viện rồi mà.
Thực ra thư viện iostream gồm rất nhiều công cụ không chỉ riêng nhập xuất đâu. Vì vậy người tạo ra thư viện đã chia thư viện iostream ra thành các không gian khác nhau. Toán tử cout dùng để xuất dữ liệu ra màn hình đang nằm ở một không gian nào đó mà khi chương trình chạy, nó không thể tìm ra không gian mà cout đang ở đó, điều này dẫn đến chương trình bị lỗi và lỗi kia xuất hiện. Câu lệnh “Using namespace std;” giúp chương trình có thể tìm được không gian cho toán tử “cout” trong thư viện iostream. Bạn cũng có thể dùng cách khác để khắc phục trường hợp lỗi này. Nhìn vào ô đỏ thứ 2. Chúng ta sẽ định danh ngay tên không gian là “std” đằng trước toán tử “cout”. Việc làm này hoàn toàn đúng nhưng với chương trình lên tới hàng nghìn dòng code chắc chắn mình nghĩ bạn sẽ không muốn làm vậy đâu.
Ok. Vậy là chúng ta đã kết thúc bài 2. Mình sẽ quay lại với các bạn trong các bài học tiếp theo. Good bye! See you again.