--- title Những kiến thức cơ bản (Phần 1) --- Những kiến thức cơ bản (Phần 1) === --- ###### ✍️ Author: 2School Guideline ###### 📋 Content: [TOC] --- # Lời nói đầu ## 1. Giới thiệu chung Tin học - Công nghệ thông tin là một lĩnh vực phổ biến trong thế giới hiện đại ngày nay, bao gồm nhiều mảng lớn như Big Data, Computer Science, AI,... Các ngành nghề dựa trên những mảng kiến thức này đóng góp một phần không nhỏ vào sự phát triển của nhân loại trong kỷ nguyên mới, cũng như tạo công việc ổn định và thu nhập tốt cho người lao động. Nhằm bồi dưỡng kiến thức Tin học chuyên sâu cho những bạn học sinh có đam mê và năng khiếu, một số trường Trung học Phổ thông đã và đang mở các lớp chuyên Tin, tuyển học sinh thông qua các kì thi. Ngoài ra, hằng năm, các đơn vị Sở Giáo dục và Đào tạo tỉnh thành cũng tổ chức kì thi chọn Học sinh giỏi cấp Tỉnh/Thành phố và được đông đảo sự ủng hộ đến từ học sinh yêu thích môn Tin học trên khắp các quận/huyện. Vì lý do đó, bạn Học thuật môn Tin của dự án 2SCHOOL GUIDELINE được thành lập với mục đích giúp đỡ các bạn trong cuộc hành trình chinh phục Tin chuyên, từ những bước đầu tiên. Trước hết, chúng ta cần nắm rõ hướng tiếp cận đối với môn chuyên Tin học, đó là **lập trình thi đấu**. **Lập trình thi đấu** chính là vận dụng tri thức về cấu trúc dữ liệu và giải thuật để giải quyết các bài toán Tin học được đặt ra. Một bài toán gồm có đầu vào và đầu ra, và nhiệm vụ của chúng ta là tìm phương pháp giải mang tính tổng quát, đưa đến đúng đầu ra yêu cầu với mọi đầu vào (đầu vào thường được biểu diễn dưới dạng các testcase). Một lời giải được coi là đúng nếu như thỏa mãn về tính đúng đắn của ý tưởng thuật toán, không có lỗi cài đặt cũng như không vượt quá giới hạn thời gian/bộ nhớ của đề bài. Nếu không thỏa mãn các yêu cầu trên, bài giải đó sẽ không được tính điểm. Đối với thể thức lập trình thi đấu sử dụng trong các kì thi HSG/TS10 hiện nay, một đoạn code có thể được đánh giá đúng hoàn toàn (Accepted) hoặc một phần (Partially Accepted). Dưới đây là ví dụ một đề bài mẫu trích từ Free Contest Testing Round 55 - VNOJ: ![](https://hackmd.io/_uploads/SyboepTJ6.png) Để giải các bài toán lập trình thi đấu một cách hiệu quả, ta cần trang bị cho mình vốn hiểu biết về thuật toán chắc chắn, cùng với kĩ năng tiếp cận và xử lý vấn đề, sự linh động trong tư duy và một góc nhìn đa chiều. Thông qua quá trình nghiên cứu lý thuyết và áp dụng vào thực hành, những kĩ năng trên được tôi rèn và ngày càng phát triển. ## 2. Lộ trình học chuyên Tin Vậy, câu hỏi đặt ra là: Học chuyên Tin như thế nào? Việc tìm hiểu về một chủ đề, lĩnh vực mới cần được thực hiện có mục tiêu và quy trình các bước. Giải thuật nói riêng và lập trình thi đấu nói chung là một mảng tri thức vô cùng rộng lớn, vì vậy, xác lập điểm bắt đầu và hướng đi là rất cần thiết. Dưới đây, chúng mình đưa ra một lộ trình kiến thức thuật toán đề xuất, với đối tượng chính là học sinh bắt đầu tiếp xúc với lập trình và có nguyện vọng tham gia các kì thi Học sinh giỏi cấp Trung học Cơ sở, cũng như có được tấm vé vào học lớp chuyên Tin của các trường chuyên. ![](https://hackmd.io/_uploads/SJikjv316.png) Một số kĩ thuật, kĩ năng khác: - Tiếp cận bài toán - Giải các bài toán adhoc - Vét cạn (duyệt trâu) - Sinh test, soát và sửa lỗi code ## 3. Một số nguồn tài liệu tham khảo ### 3.1. Kiến thức C++ cơ bản - [W3Schools C++ Tutorial](https://www.w3schools.com/cpp/default.asp): Đây là một trang web hướng dẫn tự học C++ cho người mới bắt đầu, với các bài học bao hàm các kiến thức cơ bản nhất của ngôn ngữ lập trình C++, cùng ví dụ trực quan và bài tập thực hành. Trang web này có ngôn ngữ hiển thị chính là tiếng Anh, từ vựng sử dụng tương đối đơn giản, giúp người học tiếp cận và làm quen các từ ngữ xoay quanh chủ đề lập trình, thuận tiện cho việc tìm hiểu bằng các tài liệu tiếng Anh sau này. - [learncpp.com](https://www.learncpp.com/): Một trang web bằng tiếng Anh cũng viết về căn bản ngôn ngữ C++. Tuy nhiên, bạn phải có khả năng chắt lọc chủ đề trên trang để nghiên cứu, vì ở đây có một số đơn vị kiến thức mà bạn chưa cần dùng tới trong quá trình ôn thi chuyên Tin. - [HowKteam - Khóa học Lập trình C++ căn bản](https://howkteam.vn/course/khoa-hoc-lap-trinh-c-can-ban-4): Một khởi đầu tốt cho những bạn bắt đầu học C++, và là nguồn bổ sung kiến thức ngôn ngữ bổ ích cho các bạn thi lập trình thi đấu. Khóa học được viết bằng tiếng Việt, hoàn toàn miễn phí, và bạn có thể truy cập vào học bất cứ lúc nào. Mỗi đơn vị bài học gồm tài liệu pdf lý thuyết có code mẫu và video bài giảng chi tiết, dễ hiểu. - [2SG - Giới thiệu về ngôn ngữ C++](https://www.facebook.com/groups/560852219201586): Nhóm học tập ban Tin - dự án học thuật 2SG cung cấp cho các bạn những hiểu biết về ngôn ngữ C++ cần thiết cho việc học và thi Tin chuyên thông qua chuỗi bài đăng **Giới thiệu về ngôn ngữ C++** được biên soạn bởi mentor là các bạn học sinh đang theo học ở lớp chuyên Tin tại các trường chuyên trong thành phố Hồ Chí Minh. ### 3.2. Cấu trúc dữ liệu và giải thuật #### 3.2.1. Tài liệu lý thuyết - **Sách** [Competitive Programmer's Handbook - Antti Laaksonen](https://cses.fi/book/book.pdf): Một cuốn sách đáng đọc trên hành trình chinh phục tri thức Tin học của bạn. Sách có các chủ đề được sắp xếp từ cơ bản (độ phức tạp thuật toán, sắp xếp, tìm kiếm,..) đến nâng cao (lý thuyết đồ thị, cây,...) và lối giải thích rõ ràng, dễ hiểu, thân thiện với người mới học. Tuy vậy, để việc tiếp thu kiến thức trong sách đạt được hiệu quả tốt nhất, bạn phải có vốn tiếng Anh chắc từ trước. - **Sách** [Principles of Algorithmic Problem Solving - Johan Sannemo](https://usaco.guide/PAPS.pdf): Cuốn sách **2 trong 1** - vừa phục vụ bổ túc kiến thức nền C++, vừa hỗ trợ trong việc lĩnh hội tri thức thuật toán. Sách được trình bày bằng tiếng Anh, gồm các đơn vị bài học đa dạng, sắp xếp theo thứ tự hợp lý, từng bước hướng dẫn người học nhập môn lập trình cũng như nâng cao trình độ. - **Bộ ba cuốn sách** [Giáo khoa chuyên Tin](https://sachhoc.com/tai-lieu-giao-khoa-chuyen-tin-quyen-1-2-3): Bộ tài liệu "gối đầu giường" của những người đam mê lập trình thi đấu nói riêng và Tin học nói chung. Bộ sách cung cấp kiến thức nền tảng về giải thuật lập trình cho người học cũng như đáp ứng nhu cầu nghiên cứu chuyên sâu của một số bạn đọc. Đây cũng là bộ tài liệu thuật toán được chọn giảng dạy chính của bộ môn Cấu trúc dữ liệu và giải thuật trong một số trường chuyên. - [2SG - Chuỗi bài đăng về thuật toán](https://www.facebook.com/groups/560852219201586): Những bài đăng trọng tâm trong nhóm học tập của dự án 2SG sẽ là bài viết về các cấu trúc dữ liệu và thuật toán cần lưu tâm trong việc luyện tập cho các kì thi Học sinh giỏi Thành phố, Tuyển sinh 10 chuyên. Các bài viết có nội dung chi tiết về các đơn vị kiến thức trong phác đồ học tập chúng mình đã giới thiệu ở trên và được đăng vào tối Chủ nhật hằng tuần. - Các trang web giải thuật tham khảo: * [CP Algorithms](https://cp-algorithms.com/index.html) * [GeeksforGeeks](https://www.geeksforgeeks.org/learn-data-structures-and-algorithms-dsa-tutorial/) * [VNOI Wiki](https://vnoi.info/wiki/Home) * [USACO Guide](https://usaco.guide/dashboard/) #### 3.2.2. Nguồn bài luyện tập Trong Tin học, việc áp dụng kiến thức vào thực hành vô cùng quan trọng, đòi hỏi khả năng tư duy và tính linh hoạt trong suy nghĩ. Những điều này có thể đạt được thông qua việc luyện tập bằng các bài tập lập trình. Dưới đây là những nguồn đề bài tham khảo với đa dạng các kiểu bài, giúp các bạn tăng kinh nghiệm "thực chiến", sẵn sàng cho các kì thi. - [VDCoder](https://vinhdinhcoder.net/Problem/List) - [GDOJ](https://gdoj.eu.org/) - [LHPOJ](http://lhpoj.lehongphong.edu.vn/) - [CSES](https://cses.fi/problemset/) - [LeetCode](https://leetcode.com/problemset/all/) - [Codeforces](https://codeforces.com/) - [VNOJ](https://oj.vnoi.info/) # Kiến thức cơ bản dành cho C++ 14 ## 1. Thư viện trong C++ 14 ### 1.1. Thư viện tiêu chuẩn - STL C++ chính là một thư viện chứa những template của cấu trúc dữ liệu cũng như thuật toán được xây dựng một cách tổng quát nhất, nhằm hỗ trợ cho người dùng trong quá trình lập trình. Có thể nói, điều làm nên sức mạnh của ngôn ngữ C++ chính là STL, thư viện này giúp việc lập trình có tính khái quát hóa rất cao, đồng thời giúp việc lập trình trở nên dễ dàng hơn nhiều. Một số thư viện minh họa: - <$iostream$>: Cho nhập/xuất dữ liệu từ/đến luồng (stream) như cin, cout. - <$vector$>: Đối tượng mảng động, linh hoạt và mạnh mẽ. - <$string$>: Xử lý chuỗi ký tự. - <$algorithm$>: Cung cấp các thuật toán phổ biến như sắp xếp, tìm kiếm, và nhiều thuật toán khác. - <$map$> và <$set$>: Các cấu trúc dữ liệu ánh xạ và tập hợp. - <$queue$> và <$stack$>: Các cấu trúc dữ liệu hàng đợi và ngăn xếp. ### 1.2. Cách sử dụng thư viện Để sử dụng một thư viện trong C++ 14, bạn cần bao gồm tên thư viện bằng cách sử dụng lệnh #include. Sau đó, bạn có thể sử dụng các đối tượng và hàm từ thư viện trong mã của mình. **Ví dụ:** ```cpp= #include <iostream> #include <vector> ``` ### 1.3. Thư viện bits/stdc++.h **"bits/stdc++.h"** không phải là một phần của tiêu chuẩn **C++**. Thay vào đó, nó là một tệp tiện ích mà nhiều người dùng sử dụng để bao gồm tất cả các thư viện tiêu chuẩn phổ biến vào một tệp duy nhất. **VD sử dụng thư viện bits/stdc++.h**: ```cpp= #include <bits/stdc++.h> ``` ## 2. Kiểu dữ liệu, biến, hằng số và một số phép tính cơ bản ### 2.1. Kiểu dữ liệu Kiểu dữ liệu xác định loại dữ liệu mà một biến có thể lưu trữ. C++ hỗ trợ nhiều kiểu dữ liệu khác nhau, như sau: - $int$: Kiểu số nguyên, ví dụ: $1$, $-5$, $100$. - $float$: Kiểu số thực (số chấm động), ví dụ: $3.14$, $-0.5$. - $double$: Kiểu số thực với độ chính xác cao hơn so với $float$, ví dụ: $3.14159265359$. - $char$: Kiểu ký tự, ví dụ: $'A'$, $'b'$,... - $bool$: Kiểu logic, chỉ có hai giá trị là $true$ hoặc $false$. ![](https://hackmd.io/_uploads/Bk4KETpy6.png) ### 2.2. Biến Biến là tên được sử dụng để tham chiếu đến vùng lưu trữ dữ liệu trong bộ nhớ. Để khai báo biến trong C++, bạn sử dụng cú pháp sau: **<kiểu dữ liệu> <tên biến>;** VD ```cpp= int age; // Biến age lưu trữ kiểu số nguyên float salary; // Biến salary lưu trữ kiểu số thực char grade; // Biến grade lưu trữ kiểu ký tự bool isPassed; // Biến isPassed lưu trữ kiểu logic ``` ### 2.3. Hằng số Hằng số là giá trị không thay đổi trong suốt quá trình chạy của chương trình. C++ hỗ trợ hai loại hằng số chính: - **const:** Hằng số được khai báo bằng từ khóa $const$ và không thể thay đổi giá trị sau khi đã gán. VD: ```cpp= const int MAX_VALUE = 100; const float PI = 3.14159265359; ``` - **#define:** Hằng số được định nghĩa bằng tiền xử lý (#define) và có thể được sử dụng trước khi chương trình biên dịch. ```cpp= #define MAX_VALUE 100 #define PI 3.14159265359 ``` ### 2.4. Phép tính cơ bản C++ hỗ trợ các phép tính cơ bản như sau: - **Phép cộng (+):** Dùng để cộng hai giá trị với nhau. - **Phép trừ (-):** Dùng để trừ giá trị bên trái cho giá trị bên phải. - **Phép nhân (*):** Dùng để nhân hai giá trị với nhau. - **Phép chia (/):** Dùng để chia giá trị bên trái cho giá trị bên phải. - **Phép chia lấy dư (%):** Dùng để lấy phần dư khi chia giá trị bên trái cho giá trị bên phải. VD ```cpp= int a = 10; int b = 5; int sum = a + b; // sum = 15 int difference = a - b; // difference = 5 int product = a * b; // product = 50 int quotient = a / b; // quotient = 2 int remainder = a % b; // remainder = 0 ``` ### 2.5. Ép kiểu và các toán tử dịch bit #### 2.5.1. Ép kiểu Ép kiểu là quá trình chuyển đổi giá trị của một biến từ kiểu dữ liệu này sang kiểu dữ liệu khác. Có hai loại ép kiểu trong C++: Ép kiểu ngầm định (Implicit Type Casting): C++ tự động thực hiện việc chuyển đổi kiểu dữ liệu một cách an toàn mà không cần phải khai báo rõ ràng. Ví dụ: ```cpp= int num1 = 5; double num2 = num1; // Ép kiểu ngầm định từ int sang double ``` Ép kiểu tường minh (Explicit Type Casting): C++ cho phép bạn chuyển đổi kiểu dữ liệu bằng cách sử dụng các toán tử ép kiểu tường minh như static_cast, dynamic_cast, const_cast, và reinterpret_cast. Ví dụ: ```cpp= double num1 = 3.14; int num2 = static_cast<int>(num1); // Ép kiểu tường minh từ double sang int ``` #### 2.5.2. Toán tử dịch bit: Phép dịch bit là các toán tử cho phép bạn thao tác trên các bit của một số nguyên. **A. Dịch phải (>>)** Toán tử dịch phải bit sẽ dịch tất cả các bit sang phải bởi một số nhất định ```cpp= 212 = 11010100 (Số nhị phân) 212>>2 = 00110101 (Số nhị phân) (Dịch sang phải 2 bits) 212>>7 = 00000001 (Số nhị phân) (Dịch sang phải 7 bits) 212>>8 = 00000000 (Số nhị phân) (Dịch sang phải 8 bits) 212>>0 = 11010100 (Giữ nguyên) ``` **B. Dịch trái bit (<<)** Toán tử dịch trái bit sẽ dịch tất cả các bit sang trái bởi một số nhất định ```cpp= 212 = 11010100 (Số nhị phân) 212<<1 = 11010100 (Số nhị phân) (Dịch sang trái 1 bít) 212<<0 = 11010100 (Giữ nguyên) 212<<4 = 11010100 (Số nhị phân) (Dịch sang trái 4 bít) ``` **Code minh họa** ```cpp= #include <iostream> using namespace std; int main() { int num = 212, i; for(i = 0; i<=2; i++) { cout << "Dịch sang phải " << i << " bits: " << (num>>i) << "\n"; } cout << "\n"; for(i = 0; i<=2; i++) { cout << "Dịch sang trái " << i << " bits: " << (num<<i) << "\n"; } return 0; } ``` **Output** ```cpp= Dịch sang phải 0 bits: 212 Dịch sang phải 1 bits: 106 Dịch sang phải 2 bits: 53 Dịch sang trái 0 bits: 212 Dịch sang trái 1 bits: 424 Dịch sang trái 2 bits: 848 ``` ## 3. Toán tử logic - Lệnh điều kiện ### 3.1. Toán tử logic Toán tử logic là các phép toán được sử dụng để thao tác và kiểm tra các biểu thức logic. Các toán tử logic chính trong C++ bao gồm: ![](https://hackmd.io/_uploads/BJc-gA6JT.png) **VD** ```cpp= #include <bits/stdc++.h> using namespace std; int main() { int a = 5; int b = 10; // Toán tử so sánh == if (a == b) { cout << "a bằng b." << endl; } else { cout << "a không bằng b." << endl; } // Toán tử so sánh >= if (a >= b) { cout << "a lớn hơn hoặc bằng b." << endl; } else { cout << "a nhỏ hơn b." << endl; } // Toán tử so sánh <= if (a <= b) { cout << "a nhỏ hơn hoặc bằng b." << endl; } else { cout << "a lớn hơn b." << endl; } // Toán tử so sánh > if (a > b) { cout << "a lớn hơn b." << endl; } else { cout << "a không lớn hơn b." << endl; } // Toán tử so sánh < if (a < b) { cout << "a nhỏ hơn b." << endl; } else { cout << "a không nhỏ hơn b." << endl; } // Toán tử so sánh != if (a != b) { cout << "a không bằng b." << endl; } else { cout << "a bằng b." << endl; } return 0; } ``` ### 3.2. Câu lệnh điều kiện Câu lệnh điều kiện là cách thực hiện các hành động khác nhau dựa trên giá trị của biểu thức điều kiện. C++ hỗ trợ hai loại câu lệnh điều kiện chính: - 1. if (Câu lệnh if): Sử dụng để kiểm tra một điều kiện và thực hiện một khối mã nếu điều kiện đúng. - 2. if-else (Câu lệnh if - else): Sử dụng để kiểm tra một điều kiện và thực hiện một khối mã nếu điều kiện đúng, và một khối mã khác nếu điều kiện sai. Cú pháp cơ bản: ```cpp= if (điều_kiện) { // Thực hiện khi điều kiện đúng } else { // Thực hiện khi điều kiện sai (tuỳ chọn) } ``` **VD tìm số lớn hơn trong hai số a và b:** ```cpp= #include <bits/stdc++.h> using namespace std; int main() { int num1, num2; // Nhập hai số từ người dùng cout << "Nhập số thứ nhất: "; cin >> num1; cout << "Nhập số thứ hai: "; cin >> num2; // Sử dụng câu lệnh điều kiện để tìm số lớn hơn if (num1 > num2) { cout << num1 << " là số lớn hơn " << num2 << endl; } else if (num2 > num1) { cout << num2 << " là số lớn hơn " << num1 << endl; } else { cout << "Hai số bằng nhau." << endl; } return 0; } ``` ## 4. Vòng lặp ### 4.1. Vòng lặp for Vòng lặp for trong C++ cho phép bạn thực hiện một khối mã nhiều lần dựa trên một biểu thức điều kiện. ```cpp= for (biểu_thức_khởi_đầu; biểu_thức_điều_kiện; biểu_thức_tăng_giảm) { // Khối mã thực hiện } ``` ```cpp= #include <iostream> using namespace std; int main() { // In ra các số từ 1 đến 5 for (int i = 1; i <= 5; i++) { cout << i << " "; } return 0; } ``` ### 4.2. Vòng lặp while Vòng lặp while cho phép bạn thực hiện một khối mã khi một biểu thức điều kiện cụ thể là đúng. ```cpp= while (biểu_thức_điều_kiện) { // Khối mã thực hiện } ``` ```cpp= #include <iostream> using namespace std; int main() { // In ra các số từ 1 đến 5 int i = 1; while (i <= 5) { cout << i << " "; i++; } return 0; } ``` ### 4.3. Vòng lặp Do while Trong ngôn ngữ lập trình C++, vòng lặp do-while được sử dụng để thực hiện một khối mã nguồn ít nhất một lần và kiểm tra điều kiện sau mỗi lần thực hiện. Nó giúp bạn lặp lại một phần mã cho đến khi một điều kiện cụ thể không còn đúng nữa. **Cú pháp** ```cpp= do { // Các câu lệnh bạn muốn thực hiện } while (điều_kiện); ``` **VD: Hãy xem xét một ví dụ đơn giản sử dụng vòng lặp do-while để nhập số từ người dùng cho đến khi số đó lớn hơn 10:** ```cpp= #include <iostream> int main() { int number; do { std::cout << "Nhập một số lớn hơn 10: "; std::cin >> number; } while (number <= 10); std::cout << "Bạn đã nhập số " << number << " lớn hơn 10. Kết thúc chương trình."; return 0; } ``` ### 4.4. Câu lệnh break và continue Câu lệnh continue được sử dụng để bỏ qua phần còn lại của vòng lặp hiện tại và chuyển đến vòng lặp tiếp theo (trong trường hợp vòng lặp for hoặc while). ```cpp= #include <iostream> using namespace std; int main() { // In ra các số từ 1 đến 5, nhưng bỏ qua số 3 for (int i = 1; i <= 5; i++) { if (i == 3) { continue; } cout << i << " "; } return 0; } ``` Câu lệnh break được sử dụng để thoát khỏi vòng lặp ngay lập tức, dù điều kiện vòng lặp vẫn còn đúng. ```cpp= #include <iostream> using namespace std; int main() { // In ra các số từ 1 đến 5, nhưng kết thúc khi gặp số 3 for (int i = 1; i <= 5; i++) { if (i == 3) { break; } cout << i << " "; } return 0; } ``` ## 5. Hàm ### 5.1. Khái niệm Hàm (function) là một khối mã độc lập có thể được gọi từ một nơi khác trong chương trình. Hàm thực hiện một tác vụ cụ thể và có thể trả về một giá trị. Thư viện hàm (function library) là một tập hợp các hàm đã được định nghĩa trước, như cout và cin trong thư viện <iostream> của C++. ### 5.2. Định nghĩa Hàm Định nghĩa hàm là việc cung cấp khối mã thực hiện các hoạt động của hàm. Đây là nơi bạn xác định cách hàm hoạt động và trả về giá trị (nếu có). ```cpp= // Định nghĩa hàm int add(int a, int b) { int sum = a + b; return sum; } ``` ### 5.3. Gọi Hàm Để gọi một hàm, bạn chỉ cần sử dụng tên hàm cùng với tham số thích hợp (nếu có). Kết quả trả về (nếu có) có thể được lưu trữ trong một biến hoặc được sử dụng trực tiếp. ```cpp= int result = add(5, 3); // Gọi hàm add và lưu kết quả vào biến result cout << "Kết quả là: " << result << endl; ``` ### 5.4. Tham số và Giá trị trả về Tham số (parameters) là các giá trị được truyền vào hàm khi gọi nó. Tham số giúp hàm làm việc với dữ liệu cụ thể. Giá trị trả về (return value) là giá trị mà hàm trả về sau khi hoàn thành công việc của nó. Một hàm có thể trả về một giá trị duy nhất (trong trường hợp kiểu không phải là void) hoặc không trả về gì (void). ```cpp= int add(int a, int b) { int sum = a + b; return sum; // Hàm trả về giá trị sum } ``` ### Thủ tục (void) Trong ngôn ngữ lập trình C++, void là một kiểu dữ liệu đặc biệt được sử dụng để chỉ ra rằng một hàm không trả về bất kỳ giá trị nào. Cụ thể, kiểu dữ liệu void được sử dụng khi bạn định nghĩa một hàm mà không cần trả về giá trị hoặc khi bạn muốn chỉ định một con trỏ không trỏ đến bất kỳ kiểu dữ liệu cụ thể nào. **Cú pháp** ```cpp= void ten_ham(parameters) { // Các câu lệnh của hàm } ``` **VD: Tìm số lớn nhất trong một mảng dùng thủ tục** ```cpp= #include <bits/stdc++.h> // Hàm void để tìm số lớn nhất trong mảng void findMax(int arr[], int length) { if (length <= 0) { cout << "Mảng rỗng." << endl; return; } int max = arr[0]; // Giả sử số đầu tiên là số lớn nhất for (int i = 1; i < length; i++) { if (arr[i] > max) { max = arr[i]; // Cập nhật số lớn nhất nếu tìm thấy một số lớn hơn } } cout << "Số lớn nhất trong mảng là: " << max << endl; } int main() { int numbers[] = {12, 45, 6, 78, 90, 42, 56}; int length = sizeof(numbers) / sizeof(numbers[0]); // Gọi hàm findMax để tìm số lớn nhất trong mảng findMax(numbers, length); return 0; } ``` # Tham khảo :::info [[1] SẢN PHẨM SỐ 1 – CHIẾN THUẬT THI TIN CHUYÊN - CLB Tin học TĐN](https://docs.google.com/document/d/1uNbPBEB1RV4X2-RYlWUdbWT69G065Sy1YUdHR9h5eEw/edit?usp=sharing) [[2] Thư viện STL C++](https://viblo.asia/p/lap-trinh-c-co-ban-bai-10-thu-vien-stl-c-GrLZDr6n5k0) [[4] GeeksforGeeks](https://www.geeksforgeeks.org/functions-in-cpp/) [3] Sách giáo trình C++ cơ bản và nâng cao