Giới thiệu về phát triển C++
Trước khi chúng ta có thể viết và thực thi chương trình C++ đầu tiên, chúng ta cần hiểu chi tiết hơn về cách các chương trình C++ được phát triển. Sau đây là sơ đồ phác thảo một cách tiếp cận đơn giản:
Bước 1: Xác định vấn đề bạn muốn giải quyết
Đây là bước “what?”, nơi bạn tìm ra vấn đề bạn định giải quyết. Đưa ra ý tưởng ban đầu cho những gì bạn muốn lập trình có thể là bước dễ nhất hoặc khó nhất. Nhưng về mặt khái niệm, đây là bước đơn giản nhất. Tất cả những gì bạn cần là một ý tưởng có thể được định nghĩa rõ ràng và bạn đã sẵn sàng cho bước tiếp theo.
Sau đây là một số ví dụ:
- “Tôi muốn viết một chương trình cho phép tôi nhập nhiều số, sau đó tính giá trị trung bình.”
- “Tôi muốn viết một chương trình tạo ra một mê cung 2 chiều và cho phép người dùng điều hướng qua đó. Người dùng sẽ thắng nếu họ đến đích.”
- “Tôi muốn viết một chương trình có thể đọc dữ liệu giá cổ phiếu và dự đoán giá cổ phiếu sẽ tăng hay giảm.”
Bước 2: Xác định cách bạn sẽ giải quyết vấn đề
Đây là bước “how?”, nơi bạn xác định cách bạn sẽ giải quyết vấn đề mà bạn đưa ra ở bước 1. Đây cũng là bước bị bỏ qua nhiều nhất trong quá trình phát triển phần mềm. Vấn đề cốt lõi là có nhiều cách để giải quyết một vấn đề — tuy nhiên, một số giải pháp này là tốt và một số thì không. Thông thường, một lập trình viên sẽ nảy ra ý tưởng, ngồi xuống và ngay lập tức bắt đầu mã hóa một giải pháp. Điều này thường tạo ra một giải pháp rơi vào loại không tốt.
Thông thường, các giải pháp tốt có những đặc điểm sau:
- Chúng rất đơn giản (không quá phức tạp hoặc khó hiểu).
- Chúng được ghi chép đầy đủ (đặc biệt là xung quanh bất kỳ giả định hoặc hạn chế nào được đưa ra).
- Chúng được xây dựng theo dạng mô-đun, do đó các bộ phận có thể được tái sử dụng hoặc thay đổi sau này mà không ảnh hưởng đến các bộ phận khác của chương trình.
- Chúng có thể phục hồi bình thường hoặc đưa ra thông báo lỗi hữu ích khi có điều gì đó bất ngờ xảy ra.
Khi bạn ngồi xuống và bắt đầu viết mã ngay, bạn thường nghĩ “Tôi muốn làm điều gì đó ”, vì vậy bạn triển khai giải pháp giúp bạn đạt được mục tiêu nhanh nhất. Điều này có thể dẫn đến các chương trình dễ hỏng, khó thay đổi hoặc mở rộng sau này hoặc có nhiều lỗi. Lỗi là bất kỳ loại lỗi lập trình nào ngăn chương trình hoạt động đúng.
Ngoài ra…
Thuật ngữ bug lần đầu tiên được Thomas Edison sử dụng vào những năm 1870! Tuy nhiên, thuật ngữ này đã trở nên phổ biến vào những năm 1940 khi các kỹ sư phát hiện ra một con bướm đêm thực sự bị kẹt trong phần cứng của một máy tính đời đầu, gây ra hiện tượng đoản mạch. Cả sổ ghi chép trong đó lỗi được báo cáo và con bướm đêm hiện đều là một phần của Bảo tàng Lịch sử Hoa Kỳ Smithsonian. Có thể xem tại đây.
Nhiều nghiên cứu đã chỉ ra rằng trên các hệ thống phần mềm phức tạp, chỉ có 10-40% thời gian của một lập trình viên thực sự dành cho việc viết chương trình ban đầu. 60-90% còn lại dành cho việc bảo trì, có thể bao gồm gỡ lỗi (loại bỏ lỗi), cập nhật để đối phó với những thay đổi trong môi trường (ví dụ để chạy trên phiên bản hệ điều hành mới), cải tiến (những thay đổi nhỏ để cải thiện khả năng sử dụng hoặc khả năng) hoặc cải tiến nội bộ (để tăng độ tin cậy hoặc khả năng bảo trì) 1 .
Do đó, bạn nên dành thêm một chút thời gian trước khi bắt đầu viết mã để suy nghĩ về cách tốt nhất để giải quyết vấn đề, những giả định bạn đang đưa ra và cách bạn có thể lập kế hoạch cho tương lai, để tiết kiệm thời gian và công sức sau này.
Chúng ta sẽ nói thêm về cách thiết kế giải pháp hiệu quả cho các vấn đề trong bài học sau.
Bước 3: Viết chương trình
Để viết chương trình, chúng ta cần hai thứ: Thứ nhất, chúng ta cần kiến thức về ngôn ngữ lập trình — đó là mục đích của những hướng dẫn này! Thứ hai, chúng ta cần một trình soạn thảo văn bản để viết và lưu các chương trình C++ của mình. Tập hợp các lệnh C++ mà chúng ta nhập vào trình soạn thảo văn bản được gọi là mã nguồn của chương trình (thường được viết tắt là code ). Có thể viết chương trình bằng bất kỳ trình soạn thảo văn bản nào bạn muốn, thậm chí là một thứ đơn giản như notepad của Windows hoặc vi hoặc pico của Unix.
Một chương trình được nhập vào trình soạn thảo văn bản cơ bản sẽ trông giống như thế này:
#include <iostream>
int main(){ std::cout << "Here is some text."; return 0;}
Tuy nhiên, chúng tôi thực sự khuyên bạn nên sử dụng trình soạn thảo được thiết kế cho lập trình (gọi là code editor). Đừng lo nếu bạn chưa có. Chúng tôi sẽ hướng dẫn cách cài đặt trình soạn thảo mã ngay sau đây.
Một trình soạn thảo thông thường được thiết kế để mã hóa có một số tính năng giúp việc lập trình dễ dàng hơn nhiều, bao gồm:
- Đánh số dòng. Đánh số dòng hữu ích khi trình biên dịch đưa ra lỗi, như một lỗi biên dịch thông thường sẽ nêu: một số mã lỗi/thông báo, dòng 64. Nếu không có trình soạn thảo hiển thị số dòng, việc tìm dòng 64 có thể thực sự rắc rối.
- Tô sáng và tô màu cú pháp. Tô sáng và tô màu cú pháp thay đổi màu sắc của nhiều phần khác nhau trong chương trình của bạn để giúp bạn dễ dàng xác định các thành phần khác nhau của chương trình.
- Phông chữ rõ ràng, có chiều rộng cố định (thường được gọi là “phông chữ đơn cách”). Phông chữ không lập trình thường khiến việc phân biệt giữa số 0 và chữ O, hoặc giữa số 1, chữ l (chữ L thường) và chữ I (chữ i hoa) trở nên khó khăn. Một phông chữ lập trình tốt sẽ đảm bảo các ký hiệu này được phân biệt trực quan để đảm bảo ký hiệu này không vô tình bị sử dụng thay cho ký hiệu kia. Tất cả các trình soạn thảo mã nên bật tính năng này theo mặc định, nhưng trình soạn thảo văn bản tiêu chuẩn có thể không bật. Sử dụng phông chữ có chiều rộng cố định (trong đó tất cả các ký hiệu có cùng chiều rộng) giúp định dạng và căn chỉnh mã của bạn dễ dàng hơn.
Sau đây là ví dụ về chương trình C++ có đánh số dòng, tô sáng cú pháp và phông chữ có độ rộng cố định:
#include <iostream>
int main(){ std::cout << "Here is some text."; return 0;}
Lưu ý rằng điều này dễ hiểu hơn nhiều so với phiên bản không được tô sáng. Mã nguồn mà chúng tôi trình bày trong hướng dẫn này sẽ có cả đánh số dòng và tô sáng cú pháp để làm cho mã đó dễ theo dõi hơn.
Dành cho người đọc nâng cao
Vì mã nguồn được viết bằng ký tự ASCII, ngôn ngữ lập trình sử dụng một lượng nhất định nghệ thuật ASCII để biểu diễn các khái niệm toán học. Ví dụ,
≠
không phải là một phần của bộ ký tự ASCII, vì vậy ngôn ngữ lập trình thường sử dụng!=
để biểu diễn bất đẳng thức toán học thay thế.
Một số phông chữ lập trình, chẳng hạn như Fira Code, sử dụng chữ ghép để kết hợp “nghệ thuật” đó trở lại thành một ký tự duy nhất. Ví dụ, thay vì hiển thị !=
, Fira Code sẽ hiển thị ≠(sử dụng cùng chiều rộng với phiên bản hai ký tự). Một số người thấy điều này dễ đọc hơn, những người khác thích gắn bó với cách diễn giải theo nghĩa đen hơn của các ký tự cơ bản.
Nhiều chương trình C++ đơn giản chỉ có một tệp mã nguồn, nhưng các chương trình C++ phức tạp có thể có hàng trăm hoặc thậm chí hàng nghìn tệp mã nguồn.
Mỗi tệp mã nguồn trong chương trình của bạn sẽ cần được lưu vào đĩa, nghĩa là mỗi tệp mã nguồn cần có tên tệp. C++ không có bất kỳ yêu cầu nào về việc đặt tên tệp. Tuy nhiên, tiêu chuẩn thực tế là đặt tên cho tệp nguồn đầu tiên/chính được tạo cho một chương trình main.cpp
. Tên tệp ( main) giúp dễ dàng xác định tệp nào là tệp mã nguồn chính và phần mở rộng .cpp
cho biết tệp đó là tệp mã nguồn C++.
Thỉnh thoảng bạn có thể thấy tệp mã nguồn đầu tiên/chính được đặt tên theo tên của chương trình (ví dụ calculator.cpp
: , poker.cpp
). Thỉnh thoảng bạn cũng có thể thấy các phần mở rộng khác được sử dụng (ví dụ: .cc
hoặc .cxx
).
Sau khi bạn đã viết xong chương trình, các bước tiếp theo là chuyển đổi mã nguồn thành thứ có thể chạy được, sau đó xem nó có hoạt động không! Chúng ta sẽ thảo luận về các bước đó (4-7) trong bài học tiếp theo.