
This course includes our updated coding exercises so you can practice your skills as you learn.
See a demo
Đạt là Embdded Software Engineer với hơn 5 năm kinh nghiệm, trong đó hơn 2 năm đầu làm việc ở Việt Nam và 3 năm, hiện nay, ở Singapore. Công việc chính của mình là nghiên cứu và phát triển các dự án Embedded viết bằng C/C++ và một số ngôn ngữ khác.
Ngoài thời gian đi làm, Đạt còn là một giảng viên Online. Trong khoảng hơn 3 năm gần đây Đạt bắt đầu dạy lập trình online trên Youtube. Các bạn có thể xem qua một số khóa học Đạt dạy trên Youtube. Các khóa học trên Youtube bao gồm C/C++ và Python với hơn 12k người sub và hơn 1.5 triệu views.
Mục tiêu dạy học của Đạt là đem đến kiến thức thực dụng cho mọi người, giúp cho các bạn học sinh, sinh viên định hướng được tương lai. Đồng thời các khóa học của mình còn có thể giúp cho các bạn ngành khác muốn chuyển ngành sang lập trình hoặc muốn ôn lại kiến thức lập trình. Qua quá trình dạy học, đã có nhiều người gửi email cảm ơn vì nhờ các khóa học đã giúp họ tìm được việc làm. Đạt mong muốn trong tương lai sắp tới mình có thể giúp được nhiều người hơn nữa.
Ngoài ra, Đạt còn là người sáng lập cộng đồng Dạy Nhau Học ở địa chỉ DayNhauHoc Com với mục tiêu mang đến kiến thức cho tất cả mọi người. Hướng mọi thành viên dạy cho người khác học. Bởi vì dạy chính là học.
Trong khóa học này, Đạt hi vọng sẽ mang đến các kiến thức tổng quan về ngôn ngữ C++ để làm nền tảng cho các khóa học C++ sắp tới.
Khóa học này bao gồm 5 khóa học nhỏ
Hướng dẫn cách cài dặt VS 2015 chi tiết
Hướng dẫn cách cài dặt Code::Blocks chi tiết
Hướng dẫn cách sử dụng c9.io
Cài đặt Code::Blocks trên Linux và XCode trên Mac
* C++ hiện đại
Ta có nhiều phiên bản C++
C++98 - chuẩn hóa năm 98, được dùng nhiều
C++11 - các project mới đang được chuyển dần sang
C++14 - là phiên bản extend(mở rộng) của C++11.
Khóa học này có sử dụng C++14
C++17 - là phiển bản tương lai, đang được chuẩn bị :)
Mỗi phiên bản là một sự thay đổi, bổ sung, lượt bớt để phù hợp với thời đại.
C++ vẫn đang phát triển không ngừng ...
C++ Standard Library
Hay còn gọi là thư viện chuẩn hoặc STL
C++ có một bộ thư viện chuẩn thuộc dạng khủng nhất trong các ngôn ngữ lập trình
Trong các cuộc thi giải thuật trên thế giới, thí sinh thường chọn C++ vì lý do
Tốc độ xử lý nhanh
Có bộ thư viện đầy đủ
tính toán
xử lý chuỗi
sắp xếp, tìm kiếm
quản lý dữ liệu
nhập xuất
Phân tích chương trình hello world
Biên dịch(compile) chương trình
Liên kết (linking) chương trình
Giải bài tập cho chương trình đầu tiên
Giải bài tập cho chương trình đầu tiên phần tiếp theo
* Namespace
Một project lớn sẽ có nhiều hàm khác nhau, các hàm này có thể bị trùng tên.
Điều này dẫn đến việc chương trình của mình sẽ gọi nhầm hàm :)
Ví dụ bạn có thể viết một hàm tên là sort. Nhưng trong thư viện chuẩn cũng có hàm sort. Khi bạn gọi sort, có thể là thư viện chuẩn được gọi.
Để tránh điều này, ta cần namespace
* namespace std
Namespace được đặt trước tên hàm trong namespace đó
Đó là lý do tại sao ta hay viết std::cout, std::endl
Bởi vì std là namespace
cout và endl thuộc về namespace std
Dấu :: được gọi là “scope resolution operator” dịch là
toán tử phân giải phạm vi
Nếu mình muốn có một đối tượng cũng tên là cout, thì mình có thể tạo namespace riêng.
Ví dụ dnh::cout ...
* Tạo namespace như thế nào?
namespace dnh {
// Tất cả mọi hàm, biến được khai báo trong
// cặp ngoặc nhọn này đều thuộc về namespace dnh
// Ví dụ nếu ta có hàm foo trong này
// thì gọi hàm foo bằng dnh::foo
int foo() { /* do something sily */ }
}
* Hàm main trong namespace?
Không được !!! Ngôn ngữ C++ không cho phép cho main() vào namespace
Vậy main() có thuộc namespace nào không?
Có, main() thuộc về namespace toàn cục, hay còn gọi là global namespace
Tất cả mọi thứ được khai báo mà không thuộc vào namespace nào sẽ thuộc về global namespace. Có thể gọi mà không cần một cái name gì đặt ở phía trước :)
* Số Thập Phân
Hàng ngày ta sử dụng hệ thập phân, ví dụ như 113, 911
Mình đọc lên mấy số này và hiểu ngay là
Một trăm Mười Ba
Chín trăm Mười Một
Mình hiểu được như thế là bởi vì mình biết
113 = 1 * 10^2 + 1 * 10^1 + 3 * 10^0
100 + 10 + 3
911 = 9 * 10^2 + 1 * 10^1 + 1 * 10^0
900 + 10 + 1
Ta gọi đây là hệ số 10, thấy ở đâu cũng có số 10 không :D
* Số Nhị Phân
Tuy nhiên máy tính thì không có 10 ngón tay như mình để có thể dùng hệ số 10 :D
Máy tính chỉ hiểu 2 tín hiệu, on hoặc off. Thế nên máy tính rành hệ nhị phân hơn
Ví dụ số 101 với máy tính sẽ là số 5 bởi vì
101 = 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 1*2*2 + 0*2 + 1*1
= 4 + 0 + 1 = 5 ...
* Đổi số thập phân ra nhị phân
Dùng máy tính :) Bấm Win + gõ calculator
Học thuộc lòng các giá trị thông dụng
* Đổi bằng tay
Cách này mình được học ở bậc phổ thông
cho số n là hệ 10, để đổi sang hệ 2 mình làm như sau
lấy n(5) chia lấy dư (mod) cho 2 => 5 % 2 = 1
Dư ghi lại (1)
gán n bằng n / 2 (bỏ phần dư) => 5 / 2 = 2
lặp lại các bước trên cho tới khi n = 0
2 % 2 = 0 => dư ghi lại (0)
n = 2 / 2 = 1
1 % 2 = 1 => dư ghi lại (1)
n = 1 / 2 = 0 -- ngừng
Ghi ngược số dư, ta được hệ 2 của 5 là: 101
Biến là gì?
Có thể làm gì với biến
Có mấy kiểu biến
ví dụ về các kiểu dữ liệu
Một số điều cần biết
Sửa bài tập:
Các phép toán trên số nguyên và số thực
Giới thiệu các phép so sánh
Giới thiệu phép nối chuỗi với kiểu dữ liệu string
Khóa học này được thực hiện chung với nội dung bài viết hướng dẫn trên Dạy Nhau Học. Một số videos cần ra trước khi bài viết chuẩn bị xong cho nên Đạt quay trước.
Phần còn lại của bài viết đã được cập nhật trên diễn đàn, phần tiếp theo của khóa học sẽ được quay cùng với nội dung trên diễn đàn.
Điều này sẽ giúp cho các bạn có cơ hội đọc thêm tài liệu, hỏi trực tiếp trên mỗi bài học, ôn lại bài cũ, hướng dẫn người khác.
Đây là cách học hiệu quả nhất.
Bài này sẽ đi qua nội dung bài hướng dẫn được chuẩn bị bởi Vũ. Thông qua các bài hướng dẫn mình sẽ học ngôn ngữ C++. Thảo luận và hỏi đáp ở các topic ấy.
Ở bài này mình sẽ đi qua nhanh tài liệu chương trình đầu tiên với C++
Phần này mình đi qua lại cấu trúc cơ bản của một chương trình CPP, điểm qua một số bài tập và .. hết :D
Trong bài này mình học tới khái niệm một lệnh là gì. Một lệnh nói ngắn gọn là một dòng code.
Khối lệnh là nhiều dòng code, mà khối lệnh nó có một đặt điểm riêng mà Đạt sẽ nói sau.
Giới thiệu cho các bạn biết một số từ khóa trong ngôn ngữ C++
Trong bài này mình sẽ học khá nhiều thứ về std::cout, trong videos tiếp theo của videos này, bạn sẽ học thêm về các ký tự đặc biệt trong C++ mà ta có thể dùng std::cout để tương tác.
Ngoài ra, cout còn có thể được dùng để in ra kết quả của các phép toán.
Trong phần này ta sẽ học về các ký tự đặt biệt, dùng cout để in ra kết quả các phép toán.
Ôn tập và làm bài tập :)
Giới thiệu khái niệm Debug cùng các kiểu dữ liệu, nói thêm về kích thước của chúng.
* Các phép toán cơ bản
Học cách sử dụng các phép toán cơ bản như phép cộng, trừ, nhân, chia, chia lấy phần dư, căn bậc 2, lũy thừa, giá trị tuyệt đối
sử dụng thêm thư viện cmath để tính các phép toán phức tạp như căn bậc hai, lũy thừa, ...
* Toán tử một ngôi và hai ngôi
unary operators
binary operators
Thư viện cmath định nghĩa cho chúng ta một số hàm tính toán và chuyển đổi toán học cơ bản
Tăng giảm một biến với toán tử ++ và --
Trong bài này mình tìm hiểu về khái niệm độ ưu tiên. Mình chỉ cần nhớ độ ưu tiên cơ bản, không cần phải học thuộc bảng này.
* Yêu cầu cần thiết
Đã biết qua C++ hoặc vừa mới học xong khóa C++ cơ bản
Khoái lập trình và muốn cải thiện kỹ năng của mình
* Mục tiêu khóa học
Củng cố kỹ năng lập trình với C++
Luyện code
Code tốt hơn với Unit Test
Cải tiến code :)
Dựa trên nền tảng HackerRank
* HackerRank là gì?
Hacker là gì?
Là người khoái ngâm cứu cái mới :)
HackerRank là gì?
Là nơi dân lập trình vào luyện code
Giống như nơi luyện cấp
* HackerRank có gì hay?
Có hệ thống compiler online
Đỡ mất công cài compiler trên máy
Có hàng loạt các bài (quyền) code để ta luyện
Có sẵn Unit Test để có thể biết được ta làm đúng hay sai
Có các bài thi tuyển để vào làm các công ty to đầu trên thế giới
Và hàng loạt cái hay khác ...
* Vào HackerRank thôi !!!
Các bạn gõ vào browser ưa thích của mình đường dẫn: https://www.hackerrank.com/
Nếu chưa có tài khoản thì các bạn bấm vào Sign UP
Để nhanh chóng tạo tài khoản thì các bạn bấm Connect with
Facebook - Google - Github
Chọn cái nào cũng được
* Chọn khu vực luyện công :)
Click vào Domains
Chọn: 30 Days of Code
30 Days of Code là một hệ thống luyện tập trong vòng 30 ngày để có thể giúp bạn học lập trình cơ bản
Đây là 30 bài khác nhau, nói về những vấn đề cơ bản nhất trong lập trình
Bây giờ mình vào xem vòng vòng 30 Days of Code xem thử nó có gì
* 30 Days of Code
Sẽ mở từng bài mỗi ngày
Sẽ cho mình thời gian vui chơi nhảy múa :)
Học xong một bài thì chờ ngày hôm sau ta học tiếp
Đạt có đăng ký 30 days of code chơi thử, nhưng mà cũng không có thời gian làm hết
Thế nên Đạt sẽ vừa làm khóa học, vừa hoàn thành 30 days of code với các bạn
* Bắt tay vào luyện công nào :)
Việc đầu tiên là bấm vào solve challenge
Vì Đạt đã học xong một số bài rồi, nên trong phần 30 days of code của Đạt nó sẽ hiện nút Try Again
* Giao diện bài học
Problem: Miêu tả vấn đề cần giải quyết
Submissions: Lịch sử các giải pháp của mình
Leaderboad: Bản xếp hạng, nó nhảm lắm =))
Discussions: Chém gió, chia sẻ “bí kíp”, không nên xem trước khi làm bài =))
Editorial: Bài giải, chưa giải được bài thì nó sẽ có cái khóa. Nếu cố tình xem bài giải thì bài đấy không được tính điểm
Tutorial: Giáo trình, nhưng quên nó đi, Đạt sẽ chém gió giúp các bạn phần đấy
* Ngày 0: Hello, Wolrd!
Vũ như cẩn, Hello, Wolrd! là bài đầu tiên
Mục tiêu: của bài này là giúp ta làm quen với HackerRank
Nhiệm vụ:
Đọc vào một dòng từ stdinput, HackerRank sẽ tự đồng truyền vào giúp mình, quá phẻ ^_^
Sau đó mình sẽ in ra 2 dòng
Hello, Wolrd
Dòng vừa mới nhập vào từ stdin
* Xem lòng vòng ngày 0
Nếu các bạn tự học, thì cái đầu tiên cần xem là task
Nó sẽ cho bạn biết mình cần phải làm gì
Trong bài này thì mình đã biết là nhập vào một chuỗi
In ra Hello, Wolrd và chuỗi vừa nhập
Sau đó là xem thêm các phần còn lại
Đạt thấy quan trọng nhất là Sample Input và Sample Output. Vì nó cho mình biết được dữ liệu nhập vào là gì, yêu cầu in ra là gì?
Phần quan trọng nhất là Editor
* Run code và submit code
Run code: dùng để test thử code chạy đúng chưa với một vài test case đơn giản
Submit Code: Dùng để gửi code lên test toàn bộ các test case xem có pass được bài học không
Test Case: Là một bộ test bao gồm dữ liệu đầu vào và dữ liệu mong muốn đầu ra. Do HackerRank họ làm sẵn. Đây chính là giá trị của HackerRank. Làm bộ test này rất mất thời gian. Ta cố tận dụng bộ test này để luyện code nhé
* Ngày 1: Kiểu dữ liệu
Mục tiêu: Ôn lại kiểu dữ liệu trong C++
Nhiệm vụ:
Bài này mình có sẵn 3 biến: i, d, s
Mình cần khai báo 3 kiểu dữ liệu: int, double và string
Sau đó mình sẽ in ra 3 dòng
Tổng của biến i và biến int mình tạo ra
Tổng của biến d và biến double mình tạo ra
Nối chuỗi s và chuỗi mình tạo ra ...
* Giải pháp 1
// Declare second integer, double, and String variables.
int my_int;
double my_double;
std::string my_string;
// Read and save an integer, double, and String to your variables.
std::cin >> my_int;
std::cin >> my_double;
std::getline(std::cin, my_string);
// Print the sum of both integer variables on a new line.
std::cout << my_int + i << std::endl;
// Print the sum of the double variables on a new line.
std::cout << my_double + d << endl;
// Concatenate and print the String variables on a new line
// The 's' variable above should be printed first.
std::cout << s + my_string << std::endl;
* Giải pháp 2
// Declare second integer, double, and String variables.
int my_int;
double my_double;
std::string my_string;
// Read and save an integer, double, and String to your variables.
std::cin >> my_int;
std::cin >> my_double;
// remove whitespace
std::getline(std::cin, my_string);
// Print the sum of both integer variables on a new line.
std::cout << my_int + i << std::endl;
// Print the sum of the double variables on a new line.
std::cout << std::fixed << std::setprecision(1) << my_double + d << endl;
// Concatenate and print the String variables on a new line
// The 's' variable above should be printed first.
std::cout << s + my_string << std::endl;
* Giải pháp final
// Declare second integer, double, and String variables.
int my_int;
double my_double;
std::string my_string;
// Read and save an integer, double, and String to your variables.
std::cin >> my_int;
std::cin >> my_double;
// remove whitespace
std::getline(std::cin >> std::ws, my_string);
// Print the sum of both integer variables on a new line.
std::cout << my_int + i << std::endl;
// Print the sum of the double variables on a new line.
std::cout << std::fixed << std::setprecision(1) << my_double + d << endl;
// Concatenate and print the String variables on a new line
// The 's' variable above should be printed first.
std::cout << s + my_string << std::endl;
* Mục tiêu: Ôn lại các phép toán trong C++
* Nhiệm vụ:
Tính tổng tiền của một bữa ăn
HackerRank sẽ truyền vào giá bữa ăn, tiền tip và thuế
Sau đó mình sẽ in ra tổng giá tiền của bữa ăn ...
* Đề bài
Đề bài nhập vào 3 biến double: mealCost, tipPercent, taxPercent
Mình cần in ra tổng giá trị của bữa ăn ...
* Giải pháp 1
double mealCost;
double tipPercent;
double taxPercent;
cin >> mealCost >> tipPercent >> taxPercent;
double tip = mealCost * tipPercent / 100;
double tax = mealCost * taxPercent / 100;
double totalCost = mealCost + tip + tax;
cout << "The total meal cost is " << totalCost << " dollars.";
* Giải pháp Final
double mealCost;
double tipPercent;
double taxPercent;
cin >> mealCost >> tipPercent >> taxPercent;
double tip = mealCost * tipPercent / 100;
double tax = mealCost * taxPercent / 100;
double totalCost = mealCost + tip + tax;
cout << "The total meal cost is " << round(totalCost) << " dollars.";
return 0;
* Mục tiêu: Phân biệt sự khác nhau giữa class và thực thể
* Nhiệm vụ:
HackerRank sẽ khai báo sẵn một class cho mình
Mình sẽ khai báo hàm dựng, hàm kiểm tra tuổi, và hàm tăng tuổi
Hàm kiểm tra tuổi
Nếu tuổi < 13 => in ra You are young ..
Nếu tuổi >= 13 và <= 18 thì là You are teenager ..
ngược lại là You are Old
* Đề bài:
Đề bài nhập vào số lượng test cases, theo sau là số tuổi
* Solution:
class Person{
public:
int age;
Person(int initialAge);
void amIOld();
void yearPasses();
};
Person::Person(int initialAge){
// Add some more code to run some checks on initialAge
if (initialAge > 0 )
this->age = initialAge;
else {
this->age = 0;
std::cout << "Age is not valid, setting age to 0." << std::endl;
}
}
void Person::amIOld(){
// Do some computations in here and print out the correct statement to the console
if (this->age < 13)
std::cout << "You are young." << std::endl;
else if (this->age < 18)
std::cout << "You are a teenager." << std::endl;
else
std::cout << "You are old." << std::endl;
}
void Person::yearPasses(){
// Increment the age of the person in here
this->age ++;
}
* Mục tiêu: Ôn lại Mảng
* Nhiệm vụ:
HackerRank nhập vào một mảng
Mình sẽ in ra mảng đó, nhưng là in ngược
* Mục tiêu: Ôn lại dictionaries và maps
* Nhiệm vụ:
HackerRank vào tên một người
Mình sẽ in ra số điện thoại của người đó trong danh bạ điện thoại, hoặc in ra “Not Found”
Mình sẽ tìm hiểu boolean là gì, computer hiểu gì về thế giới :)
Các toán tử thao tác với kiểu boolean
Giới thiệu lệnh halt, jump, loop và exceptions
Làm quen với lệnh if, tìm hiểu các cách sử dụng của lệnh if
Giới thiệu cách viết tắt của lệnh if
* Mục tiêu: Ôn lại điều kiện if
* Nhiệm vụ:
HackerRank tryền vào một con số
Nếu đó là số lẻ, in ra chữ “Weird”
Nếu là số chẵn, mà nằm trong đoạn [2,5] in ra chữ “Not Weird”
Nếu là số chẵn, mà nằm trong đoạn [6,20] in ra chữ “Weird”
Nếu là số chẵn, mà lớn hơn 20 in ra chữ “Not Weird”
Số này nằm trong đoạn [1, 100] tức
1 <= n <= 100
* Đề bài
Đề bài nhập vào 1 số n với 1 <= n <= 100
Mình cần in ra "Weird" hoặc "Not Weird"
* Giải pháp 1
if(N%2==0){
if(N>20){
cout<<"Not Weird";
}
if(N>=2 && N<=5){
cout<<"Not Weird";
}
if(N>=6 && N<=20){
cout<<"Weird";
}
}else{
cout<<"Weird";
}
* Giải pháp Final
bool isOdd(int N) {
return N & 1;
}
bool isWeird(int N) {
bool weird = true;
bool notWeird = !weird;
if ( isOdd(N) )
return weird;
if (2 <= N && N <= 5)
return notWeird;
if (6 <= N && N <= 20)
return weird;
return notWeird;
}
int main(){
int N;
cin >> N;
isWeird(N) ? cout << "Weird" : cout << "Not Weird";
return 0;
}
Lệnh switch case để thay thế cho lệnh if khi có nhiều trường hợp tương tự nhau cần sử lý.
Cấu trúc vòng lặp khiến chương trình thực hiện lặp đi lặp lại một chuỗi các câu lệnh cho đến khi không còn thõa mãn một điều kiện nào đó.
Một biến thể của vòng lặp While. Khác While ở một điểm là vòng lặp này sẽ thực hiện ít nhất một lần. Trong khi while có thể sẽ không thực hiện lần nào nếu điều kiện đầu vào sai.
Vòng lặp for được sử dụng rất phổ biến, có thể dùng để thay thế while và do ... while. Tuy nhiên, chọn vòng lặp nào phù hợp cho mỗi công việc là tốt nhất. Để biết cách chọn các bạn cần hiểu bản chất, mục đích của mỗi vòng lặp và kinh nghiệm lập trình.
Tiếp tục giới thiệu một số cách sử dụng của vòng lặp for
Cách sử dụng lệnh break và continue để thay đổi luồng của vòng lặp
* Mục tiêu: Ôn lại vòng lặp
* Nhiệm vụ:
HackerRank nhập vào một số
Mình sẽ in ra bảng cửu chương của số đó
* Mục tiêu: Ôn lại vòng lặp (nâng cao)
* Nhiệm vụ:
HackerRank nhập vào chuỗi
Mình sẽ in ra chuỗi đó với các ký tự chỉ số chẵn bên trái, lẻ bên phải và cách nhau bằng một khoảng trắng
Đây là thư viện chuẩn <cstdint> được mang từ C sang để hỗ trợ code chuẩn hơn với kiểu dữ liệu nguyên
Giới thiệu khái niệm ép kiểu, tại sao lại có ép kiểu và cách máy tính suy nghĩ thế nào về ép kiểu
Đi vào chi tiết giải thích với ví dụ chứng minh ép kiểu
Trong bài này mình sẽ hiểu cơ bản về địa chỉ của biến, đủ để học tiếp reference và sau này là con trỏ
Reference là alias hay là tên gọi khác của một biến, reference có thể thay thế biến khác.
Cũng giống như HackerRank, CodeFights là một nền tảng giúp mình luyện code hằng ngày. Điểm khác biệt là codeFights được xây dựng như một mạng xã hội nên sẽ có nhiều tương tác giữa người chơi với nhau.
Đây là bài thứ hai của CodeFights, tính số lớn nhất có n chữ số
Cho n trẻ và m kẹo, cho rằng mọi đứa trẻ được ăn số kẹo là như nhau và kẹo thì không thể bẻ nhỏ ra được. Tính xem số kẹo tối đa mà số trẻ này có thể ăn được là bao nhiêu? Giả sử trẻ ăn bao nhiêu cũng hết :D
Bài này mình sẽ lần đầu tiên khai báo mảng một chiều
Trong bài này mình sẽ đi tìm hiểu về cách thao tác trên mảng một chiều
Đây là một dạng container giống như array ở bài trước, container này chứa chuỗi hay có thể hiểu là một dạng nâng cao của mảng character.
Khóa học này mang lại khái niệm cơ bản về lập trình. Sử dụng ngôn ngữ C++ làm ngôn ngữ chính. Không yêu cầu kiến thức về lập trình trước khi học khóa học này.
Các bạn sẽ được học từ biến, vòng lặp, câu lệnh rẽ nhánh, con trỏ, kiểu dữ liệu tự định nghĩa... Sau khóa học này các bạn sẽ biết cách sử dụng ngôn ngữ lập trình C++ và đồng thời có khả năng tự học các ngôn ngữ khác.