Please enable JavaScript.
Coggle requires JavaScript to display documents.
CHƯƠNG 1: TỔNG QUAN VỀ KỸ THUẬT LẬP TRÌNH - Coggle Diagram
CHƯƠNG 1: TỔNG QUAN VỀ KỸ THUẬT LẬP TRÌNH
1.1. Chương trình máy tính
Phương pháp giải quyết vấn đề bằng máy tính là quá trình chuyển một bài toán thực tế thành một chương trình mà máy tính có thể thực hiện được.
Để xây dựng chương trình, người lập trình cần phân tích bài toán, xác định dữ liệu đầu vào, dữ liệu đầu ra và xây dựng phương pháp giải quyết phù hợp.
Sau khi có giải thuật, người lập trình tiến hành cài đặt bằng một ngôn ngữ lập trình, sau đó dịch, thực thi và kiểm tra chương trình.
Chương trình sau khi hoàn thiện cần được đánh giá, sửa lỗi, tối ưu và bảo trì để đáp ứng yêu cầu sử dụng.
1.1.1. Xác định và phát biểu bài toán
Phát biểu bài toán là bước đầu tiên trong quá trình xây dựng chương trình nhằm xác định chính xác vấn đề cần giải quyết.
Một bài toán cần mô tả rõ mục đích, đối tượng xử lý, dữ liệu cần sử dụng, kết quả cần đạt được và các điều kiện ràng buộc.
Việc phát biểu bài toán càng rõ ràng thì quá trình xây dựng giải thuật và chương trình càng chính xác và ít xảy ra sai sót.
Yêu cầu của bài toán có thể bao gồm yêu cầu chức năng và yêu cầu phi chức năng liên quan đến cách hệ thống hoạt động.
1.1.2. Xác định dữ liệu vào và dữ liệu ra
Dữ liệu vào là những thông tin mà chương trình tiếp nhận để thực hiện quá trình xử lý và tạo ra kết quả.
Dữ liệu vào cần được xác định rõ về tên dữ liệu, kiểu dữ liệu, miền giá trị, đơn vị và các điều kiện hợp lệ.
Dữ liệu ra là những kết quả mà chương trình cần cung cấp sau khi thực hiện các thao tác xử lý trên dữ liệu đầu vào.
Mối quan hệ giữa dữ liệu vào, quá trình xử lý và dữ liệu ra thường được mô tả theo mô hình Input → Process → Output.
1.1.3. Mô hình hóa bài toán
Mô hình hóa bài toán là quá trình chuyển vấn đề thực tế thành một mô hình đơn giản và phù hợp để máy tính có thể xử lý.
Trong quá trình mô hình hóa, người lập trình cần xác định những đối tượng, dữ liệu, quan hệ và thao tác quan trọng của bài toán.
Những thông tin không cần thiết cho quá trình xử lý có thể được loại bỏ để giảm độ phức tạp của bài toán.
Một mô hình tốt giúp người lập trình hiểu rõ bài toán và tạo cơ sở thuận lợi cho việc xây dựng giải thuật.
1.1.4. Xây dựng giải thuật
Giải thuật là phương pháp mô tả các bước cần thực hiện để giải quyết một bài toán theo một trình tự xác định.
Người lập trình cần xây dựng giải thuật trước khi viết chương trình để xác định rõ cách thức xử lý dữ liệu.
Giải thuật có thể được mô tả bằng ngôn ngữ tự nhiên, giả mã hoặc lưu đồ để dễ kiểm tra và hoàn thiện.
Sau khi giải thuật được xác định, nó có thể được chuyển thành chương trình bằng một ngôn ngữ lập trình cụ thể.
1.1.5. Cài đặt chương trình
Cài đặt chương trình là quá trình chuyển giải thuật thành các câu lệnh bằng một ngôn ngữ lập trình cụ thể.
Trong quá trình cài đặt, người lập trình phải tuân thủ cú pháp, kiểu dữ liệu và các quy tắc của ngôn ngữ được lựa chọn.
Chương trình nên được tổ chức thành các hàm hoặc mô-đun có nhiệm vụ rõ ràng để dễ đọc, kiểm tra và bảo trì.
Việc cài đặt cần đảm bảo chương trình thực hiện đúng giải thuật và đáp ứng các yêu cầu của bài toán.
1.1.6. Dịch và thực thi chương trình
Chương trình nguồn cần được xử lý bởi trình biên dịch hoặc môi trường thực thi trước khi máy tính có thể thực hiện.
Đối với ngôn ngữ biên dịch, chương trình có thể trải qua các bước như tiền xử lý, biên dịch, tạo mã đối tượng và liên kết.
Sau khi quá trình xây dựng hoàn thành, chương trình được nạp vào bộ nhớ và bộ xử lý thực hiện các câu lệnh.
Nếu xảy ra lỗi trong quá trình dịch hoặc thực thi, người lập trình cần xác định nguyên nhân và sửa chương trình.
1.1.7. Kiểm tra và hoàn thiện chương trình
Kiểm tra chương trình là quá trình sử dụng các dữ liệu và trường hợp khác nhau để xác định chương trình có hoạt động đúng hay không.
Việc kiểm tra cần bao gồm các trường hợp thông thường, trường hợp đặc biệt, dữ liệu biên và dữ liệu không hợp lệ.
Khi phát hiện kết quả sai, người lập trình cần tìm nguyên nhân, sửa lỗi và thực hiện kiểm tra lại.
Sau khi chương trình đáp ứng yêu cầu, cần tiếp tục hoàn thiện tài liệu, tối ưu và chuẩn bị cho quá trình bảo trì.
1.2. Giải thuật
Giải thuật là một dãy hữu hạn các bước được xác định rõ ràng nhằm giải quyết một bài toán hoặc thực hiện một nhiệm vụ cụ thể.
Giải thuật đóng vai trò trung gian giữa bài toán và chương trình vì nó mô tả cách giải quyết trước khi được chuyển thành mã nguồn.
Một giải thuật tốt phải đảm bảo các yêu cầu về tính xác định, tính hữu hạn, tính đúng đắn và khả năng thực hiện.
Khi thiết kế giải thuật, ngoài việc đảm bảo kết quả đúng, người lập trình còn cần quan tâm đến hiệu quả sử dụng thời gian và bộ nhớ.
1.2.1. Tính xác định
Tính xác định yêu cầu mỗi bước của giải thuật phải được mô tả rõ ràng và không gây ra nhiều cách hiểu khác nhau.
Với cùng một dữ liệu đầu vào và cùng một trạng thái, giải thuật phải xác định được bước xử lý tiếp theo.
Tính xác định giúp con người hoặc máy tính có thể thực hiện giải thuật một cách thống nhất.
Nếu một bước của giải thuật quá mơ hồ thì không thể đảm bảo chương trình được xây dựng từ giải thuật đó hoạt động chính xác.
1.2.2. Tính hữu hạn
Tính hữu hạn yêu cầu giải thuật phải kết thúc sau một số hữu hạn bước khi được áp dụng cho dữ liệu hợp lệ.
Các vòng lặp trong giải thuật phải có điều kiện dừng và quá trình xử lý phải tiến dần đến điều kiện kết thúc.
Một giải thuật thực hiện vô hạn mà không tạo ra kết quả hoặc không có điều kiện dừng thì không đáp ứng yêu cầu về tính hữu hạn.
Tính hữu hạn giúp đảm bảo quá trình thực hiện giải thuật có thể hoàn thành trong thực tế.
1.2.3. Tính đúng đắn
Tính đúng đắn yêu cầu giải thuật phải tạo ra kết quả phù hợp với yêu cầu của bài toán khi được thực hiện với dữ liệu hợp lệ.
Một giải thuật có thể thực hiện hết các bước và kết thúc nhưng vẫn không đúng nếu kết quả tạo ra không đáp ứng đặc tả.
Để đánh giá tính đúng đắn, cần kiểm tra giải thuật với nhiều trường hợp dữ liệu khác nhau.
Tính đúng đắn là yêu cầu cơ bản nhất vì một giải thuật nhanh nhưng cho kết quả sai thì không có giá trị sử dụng.
1.2.4. Tính khả thi và tính tổng quát
Tính khả thi yêu cầu mọi bước trong giải thuật phải là những thao tác có thể thực hiện được bởi con người hoặc máy tính.
Tính tổng quát yêu cầu giải thuật có thể áp dụng cho nhiều bộ dữ liệu khác nhau thuộc phạm vi của bài toán.
Một giải thuật không nên chỉ giải quyết được một trường hợp cụ thể mà cần có khả năng giải quyết một lớp các bài toán tương tự.
Hai đặc tính này giúp giải thuật có khả năng được cài đặt và sử dụng trong các chương trình thực tế.
1.2.5. Biểu diễn giải thuật
Giải thuật có thể được biểu diễn bằng ngôn ngữ tự nhiên để mô tả các bước xử lý theo cách gần với ngôn ngữ con người.
Giải thuật cũng có thể được biểu diễn bằng giả mã nhằm mô tả logic xử lý rõ ràng mà không phụ thuộc hoàn toàn vào một ngôn ngữ lập trình.
Lưu đồ sử dụng các hình khối và mũi tên để thể hiện trực quan trình tự xử lý, điều kiện và hướng đi của giải thuật.
Sau khi hoàn thiện, giải thuật có thể được chuyển thành mã nguồn bằng một ngôn ngữ lập trình cụ thể.
1.2.6. Độ phức tạp của giải thuật
Độ phức tạp thời gian phản ánh lượng thời gian hoặc số lượng thao tác mà giải thuật cần thực hiện khi kích thước dữ liệu tăng lên.
Độ phức tạp không gian phản ánh lượng bộ nhớ mà giải thuật cần sử dụng trong quá trình thực hiện.
Khi có nhiều giải thuật cùng giải quyết một bài toán, người lập trình thường lựa chọn giải thuật có hiệu quả tốt hơn về thời gian và bộ nhớ.
Độ phức tạp thường được biểu diễn bằng ký hiệu Big-O như O(1), O(log n), O(n), O(n log n) và O(n²).
1.3. Ngôn ngữ lập trình
Ngôn ngữ lập trình là phương tiện được sử dụng để con người mô tả dữ liệu, thuật toán và các thao tác mà máy tính cần thực hiện.
Mỗi ngôn ngữ lập trình có hệ thống cú pháp và ngữ nghĩa riêng để quy định cách viết và ý nghĩa của chương trình.
Các ngôn ngữ lập trình có thể khác nhau về mức độ gần với phần cứng, cách thực thi, cấu trúc và phạm vi ứng dụng.
Việc lựa chọn ngôn ngữ lập trình cần dựa trên yêu cầu của bài toán, hiệu năng, môi trường sử dụng và khả năng phát triển chương trình.
1.3.1. Cú pháp và ngữ nghĩa
Cú pháp là tập hợp các quy tắc quy định cách viết và cách kết hợp các thành phần trong một chương trình.
Ngữ nghĩa quy định ý nghĩa của các câu lệnh và các cấu trúc được sử dụng trong chương trình.
Vi phạm cú pháp thường tạo ra lỗi được phát hiện trong quá trình dịch hoặc phân tích chương trình.
Một chương trình có thể đúng cú pháp nhưng vẫn sai về logic nếu các câu lệnh không thực hiện đúng yêu cầu của bài toán.
1.3.2. Các mức của ngôn ngữ lập trình
Ngôn ngữ máy sử dụng các mã lệnh ở mức thấp và gần trực tiếp với phần cứng nhưng rất khó đọc và khó viết đối với con người.
Hợp ngữ sử dụng các ký hiệu gợi nhớ thay cho mã máy nên dễ sử dụng hơn nhưng vẫn phụ thuộc nhiều vào kiến trúc phần cứng.
Ngôn ngữ bậc cao cung cấp các cấu trúc gần với cách tư duy của con người và giúp chương trình dễ viết, dễ đọc và dễ bảo trì hơn.
Các ngôn ngữ như C, C++, Java và Python là những ví dụ phổ biến của ngôn ngữ lập trình bậc cao.
1.3.3. Phương pháp thực thi
Ngôn ngữ biên dịch thường chuyển chương trình nguồn thành mã đối tượng hoặc dạng mã phù hợp trước khi chương trình được thực hiện.
Ngôn ngữ thông dịch sử dụng một môi trường hoặc trình thông dịch để phân tích và thực hiện chương trình.
Một số ngôn ngữ có thể kết hợp quá trình biên dịch thành mã trung gian với việc thực thi thông qua máy ảo.
Cách thức thực thi ảnh hưởng đến hiệu năng, môi trường chạy và cách chương trình được triển khai.
1.3.4. Các thành phần cơ bản
Ngôn ngữ lập trình có các thành phần như từ khóa, định danh, biến, hằng, kiểu dữ liệu, toán tử, biểu thức và câu lệnh.
Kiểu dữ liệu quy định loại dữ liệu mà chương trình có thể lưu trữ và cách dữ liệu được xử lý.
Toán tử và biểu thức được sử dụng để thực hiện các phép tính và tạo ra các giá trị trong chương trình.
Hàm và mô-đun giúp chia chương trình thành các thành phần nhỏ hơn nhằm tăng khả năng tái sử dụng và bảo trì.
1.4. Môi trường lập trình và các bước xây dựng chương trình
Môi trường lập trình là tập hợp các công cụ hỗ trợ người lập trình trong quá trình viết, dịch, thực thi, kiểm thử và sửa lỗi chương trình.
IDE là môi trường phát triển tích hợp trong đó trình soạn thảo, trình biên dịch, trình gỡ lỗi và nhiều công cụ khác được kết hợp trong cùng một môi trường.
Quá trình xây dựng chương trình thường bắt đầu từ phân tích bài toán, xây dựng giải pháp và cài đặt giải thuật thành mã nguồn.
Sau khi cài đặt, chương trình cần được dịch, thực thi, kiểm thử, gỡ lỗi và bảo trì trong suốt vòng đời của phần mềm.
1.4.1. Các thành phần của môi trường lập trình
Trình soạn thảo mã nguồn cho phép người lập trình viết và chỉnh sửa chương trình đồng thời hỗ trợ một số tính năng như tô màu cú pháp và gợi ý mã.
Trình biên dịch hoặc trình thông dịch có nhiệm vụ chuyển đổi hoặc thực hiện chương trình theo cơ chế phù hợp với ngôn ngữ.
Trình liên kết có nhiệm vụ kết hợp các mô-đun và thư viện cần thiết để tạo thành chương trình hoàn chỉnh.
Trình gỡ lỗi hỗ trợ người lập trình theo dõi quá trình thực hiện, quan sát biến và xác định nguyên nhân gây ra lỗi.
1.4.2. Phân tích và thiết kế chương trình
Phân tích bài toán nhằm xác định rõ yêu cầu, dữ liệu đầu vào, dữ liệu đầu ra và các điều kiện mà chương trình phải đáp ứng.
Sau khi phân tích, người lập trình xây dựng giải pháp bằng cách lựa chọn cấu trúc dữ liệu và xây dựng giải thuật phù hợp.
Giải thuật có thể được mô tả bằng giả mã hoặc lưu đồ trước khi chuyển thành chương trình.
Việc thiết kế tốt giúp giảm lỗi và tạo nền tảng cho quá trình cài đặt chương trình.
1.4.3. Cài đặt, dịch và thực thi
Cài đặt là quá trình chuyển giải thuật thành mã nguồn bằng ngôn ngữ lập trình đã lựa chọn.
Chương trình nguồn sau đó được biên dịch hoặc thông dịch để tạo ra hoặc thực hiện dạng chương trình phù hợp.
Nếu quá trình dịch phát hiện lỗi, người lập trình phải sửa mã nguồn trước khi tiếp tục thực thi.
Khi chương trình được xây dựng thành công, nó được nạp và thực hiện với dữ liệu đầu vào để tạo ra kết quả.
1.4.4. Kiểm thử, gỡ lỗi và bảo trì
Kiểm thử là quá trình chạy chương trình với nhiều dữ liệu khác nhau để phát hiện những trường hợp chương trình hoạt động không đúng.
Gỡ lỗi là quá trình xác định nguyên nhân, sửa lỗi và kiểm tra lại chương trình sau khi sửa.
Bảo trì bao gồm sửa lỗi, cập nhật, cải thiện hiệu năng và bổ sung chức năng trong quá trình chương trình được sử dụng.
Vì vậy, quá trình phát triển chương trình không kết thúc khi chương trình chạy được mà tiếp tục trong suốt vòng đời của phần mềm.
1.5. Các phương pháp lập trình
Phương pháp lập trình là cách tiếp cận được sử dụng để phân tích, thiết kế và tổ chức các thành phần của chương trình.
Mỗi phương pháp có cách tổ chức dữ liệu, cách chia nhỏ bài toán và cách quản lý quá trình xử lý khác nhau.
Các phương pháp phổ biến gồm lập trình tuyến tính, thủ tục, cấu trúc, hướng đối tượng, hàm, hướng sự kiện, đệ quy và mô-đun.
Trong thực tế, một chương trình có thể kết hợp nhiều phương pháp lập trình khác nhau để phù hợp với từng phần của hệ thống.
1.5.1. Lập trình tuyến tính
Lập trình tuyến tính tổ chức chương trình theo một trình tự trong đó các câu lệnh được thực hiện lần lượt từ đầu đến cuối.
Phương pháp này phù hợp với những chương trình nhỏ có số lượng thao tác ít và luồng xử lý đơn giản.
Ưu điểm của lập trình tuyến tính là dễ hiểu và dễ bắt đầu đối với người mới học lập trình.
Khi chương trình trở nên lớn, cách tổ chức tuyến tính có thể khiến mã nguồn dài và khó quản lý.
1.5.2. Lập trình thủ tục
Lập trình thủ tục chia chương trình thành các thủ tục hoặc hàm, trong đó mỗi thành phần đảm nhiệm một nhiệm vụ cụ thể.
Cách tổ chức này giúp tránh việc viết toàn bộ chương trình thành một khối lệnh lớn.
Các hàm có thể được gọi lại nhiều lần nên giúp giảm mã nguồn trùng lặp và tăng khả năng tái sử dụng.
Phương pháp thủ tục phù hợp với những chương trình có quá trình xử lý rõ ràng và có thể chia thành các chức năng riêng biệt.
1.5.3. Lập trình cấu trúc
Lập trình cấu trúc tổ chức chương trình dựa trên ba cấu trúc điều khiển cơ bản là tuần tự, lựa chọn và lặp.
Cấu trúc tuần tự cho phép các câu lệnh được thực hiện theo thứ tự từ trước đến sau.
Cấu trúc lựa chọn cho phép chương trình lựa chọn hướng xử lý dựa trên điều kiện, còn cấu trúc lặp cho phép thực hiện một nhóm câu lệnh nhiều lần.
Phương pháp này giúp luồng điều khiển rõ ràng hơn và làm chương trình dễ đọc, dễ kiểm tra và dễ bảo trì.
1.5.4. Lập trình hướng đối tượng
Lập trình hướng đối tượng tổ chức chương trình xoay quanh các lớp và đối tượng có thuộc tính và hành vi.
Đóng gói giúp kết hợp dữ liệu với các phương thức xử lý và kiểm soát quyền truy cập vào dữ liệu.
Kế thừa cho phép xây dựng lớp mới dựa trên lớp đã có, trong khi đa hình cho phép cùng một giao diện có thể có nhiều cách thực hiện.
Trừu tượng giúp tập trung vào những đặc điểm quan trọng của đối tượng và che giấu các chi tiết không cần thiết.
1.5.5. Lập trình hàm
Lập trình hàm xem việc xử lý chương trình chủ yếu là sự kết hợp và áp dụng của các hàm.
Một đặc điểm quan trọng của phương pháp này là hạn chế việc thay đổi trạng thái và các tác dụng phụ trong quá trình thực hiện.
Các hàm thuần thường cho cùng một kết quả khi nhận cùng dữ liệu đầu vào nên có thể giúp chương trình dễ kiểm thử và suy luận.
Nhiều ngôn ngữ lập trình hiện đại hỗ trợ các đặc điểm của lập trình hàm và có thể kết hợp chúng với các phương pháp khác.
1.5.6. Lập trình hướng sự kiện
Lập trình hướng sự kiện tổ chức chương trình dựa trên các sự kiện phát sinh trong quá trình hoạt động của hệ thống.
Sự kiện có thể xuất phát từ thao tác của người dùng, sự thay đổi dữ liệu hoặc các tín hiệu từ hệ thống bên ngoài.
Khi một sự kiện xảy ra, chương trình sẽ gọi bộ xử lý tương ứng để thực hiện công việc cần thiết.
Phương pháp này được sử dụng phổ biến trong các ứng dụng giao diện người dùng và các ứng dụng web.
1.5.7. Lập trình đệ quy
Lập trình đệ quy là phương pháp trong đó một hàm gọi lại chính nó để giải quyết một bài toán con có cùng dạng với bài toán ban đầu.
Một thuật toán đệ quy phải có điều kiện cơ sở để quá trình gọi hàm có thể dừng lại.
Đệ quy thường được sử dụng trong các bài toán có cấu trúc tự lặp như duyệt cây hoặc một số thuật toán chia để trị.
Nếu sử dụng không phù hợp, đệ quy có thể làm tăng lượng bộ nhớ sử dụng do các lần gọi hàm được lưu trong ngăn xếp.
1.5.8. Lập trình mô-đun
Lập trình mô-đun chia một chương trình lớn thành nhiều mô-đun nhỏ hơn và mỗi mô-đun đảm nhiệm một nhiệm vụ tương đối độc lập.
Cách tổ chức này giúp giảm độ phức tạp của chương trình và cho phép phát triển từng phần một cách rõ ràng.
Một mô-đun tốt nên có tính kết dính cao, nghĩa là các thành phần bên trong cùng tập trung vào một nhiệm vụ rõ ràng.
Các mô-đun cũng nên có mức liên kết thấp để giảm sự phụ thuộc và giúp chương trình dễ kiểm thử, bảo trì và mở rộng.
1.5.9. Lựa chọn phương pháp lập trình
Việc lựa chọn phương pháp lập trình cần dựa trên loại bài toán, quy mô hệ thống và yêu cầu cụ thể của chương trình.
Với chương trình nhỏ có luồng xử lý đơn giản có thể sử dụng phương pháp tuyến tính hoặc thủ tục, trong khi hệ thống lớn thường cần tổ chức theo mô-đun hoặc hướng đối tượng.
Những chương trình có nhiều tương tác với người dùng có thể sử dụng lập trình hướng sự kiện, còn những bài toán có cấu trúc tự lặp có thể sử dụng đệ quy.
Trong thực tế, các phương pháp lập trình không nhất thiết loại trừ nhau mà có thể được kết hợp để tạo ra chương trình phù hợp và dễ bảo trì.