Học qua ví dụ
Một trong những cách tốt nhất để học cách lập trình bằng một ngôn ngữ mới là xem tại rất nhiều chương trình mẫu. Tốt nhất bạn nên sao chép và dán từng chương trình dưới đây thành một tệp văn bản và biên dịch tệp đó. Sau đó, hãy thử các thử nghiệm. Bằng cách mở rộng các chương trình mẫu này, bạn sẽ làm quen với các khía cạnh khác nhau của C++ và bạn sẽ cảm thấy tự tin hơn khi viết chương trình từ đầu.
Ví dụ 1: Làm cho trình biên dịch của bạn hoạt động!
Nếu bạn chưa thực hiện, hãy sao chép và dán chương trình cổ điển sau thành một tệp văn bản và biên dịch tệp đó. Có hướng dẫn biên dịch tại đây.
Có khả năng bạn đã tìm hiểu chi tiết của chương trình này trong hướng dẫn, nên chúng tôi sẽ không cung cấp mô tả từng dòng ở đây. Có một vài điều cần lưu ý về khả năng đọc. Thuật ngữ này đề cập đến các bình luận và định dạng giúp làm cho chương trình dễ đọc, dễ hiểu và dễ duy trì.
- Mỗi chương trình chúng tôi viết đều bắt đầu với một nhận xét ở tiêu đề, cung cấp tên về tác giả, thông tin liên hệ của họ, mô tả ngắn và cách sử dụng (nếu thích hợp). Mỗi hàm bắt đầu bằng một nhận xét về hoạt động và cách sử dụng.
- Chúng tôi thêm nhận xét giải thích bằng cách sử dụng câu đầy đủ, bất cứ khi nào đoạn mã này không ghi lại chính nó, ví dụ: nếu quá trình xử lý phức tạp, không rõ ràng, thú vị hoặc quan trọng.
- Luôn sử dụng tên mô tả: biến là các từ viết thường được phân tách theo _, như trong my_variable. Tên hàm sử dụng chữ hoa để đánh dấu từ, như trong MyExciteFunction(). Hằng số bắt đầu bằng một chữ "k" và sử dụng chữ cái viết hoa để đánh dấu từ, như trong kDaysInWeek.
- Thụt lề là bội số của 2. Cấp đầu tiên là hai không gian; nếu tiếp tục cần thụt lề, chúng tôi sử dụng 4 dấu cách, 6 dấu cách, v.v.
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
Một số thử nghiệm nên thử:
- Điều quan trọng nhất là đảm bảo bạn có thể biên dịch và chạy chương trình này.
- Sửa đổi chương trình ở trên để xuất thông báo "Hello World!" 4 lần trên một dòng gồm 6 dòng, mỗi dòng được in trong một trường gồm 17 dấu cách. Sử dụng vòng lặp để làm việc này. Nhấp vào đây để tìm hiểu về cách định dạng đầu ra bằng cout. Nhấp vào đây để xem giải pháp.
- Bằng cách sử dụng chương trình bạn vừa hoàn thành, tìm ra cách in thông báo "Hello" (Xin chào) Thế giới!" căn trái trong các trường gồm 17 dấu cách (mặc định thường là căn phải). Hãy nhấp vào đây để xem giải pháp.
Ví dụ 2: Nhận thông tin đầu vào
Bạn có thể dễ dàng lấy thông tin đầu vào từ bàn phím trong C++ bằng cách sử dụng cin. Dưới đây là ví dụ:
// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.
#include <iostream>
using namespace std;
int main() {
int input_var = 0;
// Enter the do while loop and stay there until either
// a non-numeric is entered, or -1 is entered. Note that
// cin will accept any integer, 4, 40, 400, etc.
do {
cout << "Enter a number (-1 = quit): ";
// The following line accepts input from the keyboard into
// variable input_var.
// cin returns false if an input operation fails, that is, if
// something other than an int (the type of input_var) is entered.
if (!(cin >> input_var)) {
cout << "You entered a non-numeric. Exiting..." << endl;
break;
// exit the do while loop
}
if (input_var != -1) {
cout << "You entered " << input_var << endl;
}
} while (input_var != -1);
cout << "All done." << endl;
return 0;
}Thử nghiệm:
- Khi xảy ra lỗi nhập, luồng "ngắt" giá trị trả về cin
false và chương trình sẽ dừng. Việc đề phòng những lỗi như vậy là vô cùng quan trọng
như đã làm trong chương trình nói trên. Nhưng nếu chúng ta muốn khôi phục lại từ lỗi,
thay vì dừng chương trình? Có hai bước để khôi phục từ
một lỗi:
- Xoá lỗi bằng cin.clear().
- Hãy xoá các ký tự không chính xác khỏi luồng. Một cách để thực hiện việc này là dùng cin.ignore().
Viết một chương trình có thể khôi phục từ dữ liệu đầu vào không hợp lệ bằng hai bước sau. Sử dụng Google để tìm kiếm cách thức hoạt động của các phương pháp này. Giải pháp của chúng tôi là tại đây.
Ví dụ 3: Chương trình này cung cấp gì?
#include <iostream>
using namespace std;
int main() {
cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
for (int c = 1; c < 10; c++) {
cout << c << "| ";
for (int i = 1; i < 10; i++) {
cout << i * c << '\t';
}
cout << endl;
}
return 0;
} Ví dụ 4: Việc phân tách giúp mọi thứ dễ dàng hơn...
Đã đến lúc chúng ta bắt đầu viết trò chơi máy tính! Câu hỏi đầu tiên này sẽ hơi đơn giản một chút, nhưng đó là sự bắt đầu. Nhiệm vụ của chúng ta là viết một chương trình triển khai hoạt động đoán của bạn. Chương trình của chúng tôi tạo một số ngẫu nhiên từ 0 đến 100. Người chơi phải đoán số bí mật. Chương trình đưa ra các gợi ý như "quá cao" hoặc "đó là quá thấp" cho đến khi người chơi đoán được số bí mật.
Chúng ta sẽ làm trò chơi này qua 3 bước.
- Tìm hiểu cách tạo một số ngẫu nhiên trong một phạm vi giá trị cho trước.
- Tạo một hàm chính để xử lý một dự đoán của người chơi và cung cấp gợi ý.
- Thêm những gì chúng ta cần để cho phép nhiều người đoán cho đến khi người chơi đoán số điện thoại.
Quá trình phát triển này được gọi là phân ly, tức là phá vỡ một tác vụ thành các nhiệm vụ phụ, mỗi việc đều dễ thực hiện.
Bắt đầu từ bước 1, hãy tìm kiếm trên Google để xem cách tạo một số ngẫu nhiên sử dụng C++. Hãy thử tìm kiếm "rand C++". Đây là giải pháp của chúng tôi.
Đối với bước 2, chúng ta cần nhận được dữ liệu đầu vào bằng số nguyên từ người chơi (với kiểm tra lỗi trên cin) và kiểm tra số này với số bí mật. Thử và viết phần này của trò chơi trước khi kiểm tra chúng tôi .
Cuối cùng, chúng ta cần thêm một vòng lặp giúp thu thập từ người chơi đoán cho đến khi cuối cùng họ đoán được số bí mật. Sau khi hoàn tất phần này của bạn có thể xem giải pháp của chúng tôi.
Phân rã là một trong những kỹ năng quan trọng nhất mà một lập trình viên cần học. Có khả năng chia nhỏ một công việc thành các phần dễ quản lý, sau đó hoàn thành một công việc tại một thời điểm là rất quan trọng, bất kể dự án lớn hay nhỏ. Sau đây là một số những cơ hội khác để bạn thực hành phân tích.
- Nhiều công việc hằng ngày mang đến cơ hội rèn luyện kỹ năng trong quá trình phân huỷ.
Bạn có thể ngạc nhiên khi phát hiện ra rằng trí óc bạn hoạt động theo cách này!
Ví dụ: nếu tôi phải dọn dẹp một căn bếp bừa bộn (có lẽ một vài các em nhỏ vừa nướng bánh), tôi chia nhỏ công việc để lên kế hoạch, và để đảm bảo rằng tôi không phải làm lại công việc sau này. Tôi không muốn giặt nếu có đủ thứ đồ cần dọn dẹp ở quầy thu dọn – tôi sẽ có lẽ sau này sẽ phải gác sàn lại. Có lẽ tôi đã đặt tất cả nguyên liệu vắng mặt trước; chuyển tất cả bát đĩa vào bồn rửa; dọn dẹp quầy; rửa món ăn; và cuối cùng là dọn dẹp sàn nhà. Có những cách khác để thực hiện nhiệm vụ này, nhưng trước tiên, nó giúp tôi xác định một kế hoạch bạn sẽ không cần phải làm lại.
Hãy dùng các công việc hằng ngày làm ví dụ để phát triển kỹ năng phân huỷ. Ai mà biết được – việc này thậm chí còn có thể giúp bạn làm việc hiệu quả hơn ở nhà!
- Ước số chung lớn nhất của hai số nguyên là số lớn nhất
chia đều cả hai. Ví dụ: gcd(12, 18) = 6, gcd(−4, 14) = 2.
Cách hiệu quả nhất để tính gcd là sử dụng thuật toán Euclide. Ghi
một chương trình có hàm để tính gcd cho hai số nguyên. Hãy thử thực hiện
mà không có đệ quy trước. Điều này sẽ giúp bạn nắm được cách thuật toán
hoạt động.
Xác định rõ ràng các nhiệm vụ phụ, ví dụ: tìm mã cho phương thức Euclide thuật toán; tạo một hàm không đệ quy cho thuật toán; v.v. Đây là giải pháp của chúng tôi.
Ví dụ 5: Câu đố toán học
Một trong những sức mạnh của điện toán là có thể thực hiện tìm kiếm brute-force để một giải pháp cho một vấn đề. Phương pháp thử và sai hoạt động bình thường đối với một số vấn đề. Trên thực tế, máy tính có thể đặc biệt xử lý những vấn đề như vậy rất hiệu quả. Hãy cân nhắc những điểm sau:
Ngựa có giá 10 đô la, lợn có giá 3 đô la và thỏ chỉ có 0, 5 đô la. Một người nông dân mua 100 con vật với giá 100 đô la. Anh ấy đã mua bao nhiêu con vật mỗi con?
Có một giải pháp cực kỳ đơn giản cho vấn đề này. Xem liệu bạn có thể tìm thấy trước khi xem công cụ của chúng tôi.
Bạn có thể thử một trò chơi khác:
Có bao nhiêu cách sắp xếp 6 cuốn sách khác nhau từ trái sang phải trên một kệ?
Lần này chúng tôi sẽ chỉ cung cấp cho bạn giải pháp và cho phép bạn viết chương trình: 720.
Ví dụ 6: Các chuỗi cần cân nhắc
Chương trình sau đây tạo ra gì?
#include <iostream>
using namespace std;
int main() {
string str1 = "To be or not to be, that is the question";
string str2 = "only ";
string str3 = str1.substr(6, 12);
str1.insert(32, str2);
str1.replace(str1.find("to be", 0), 5, "to jump");
str1.erase(9, 4);
cout << str1 << endl;
for (int i = 0; i < str3.length(); i++)
cout << str3[i]; cout << endl;
}Nhấp chuột tại đây để được trợ giúp.
Ví dụ 7: Các bước tiếp theo trong quá trình phân rã – Ngày đầu tiên thực hiện công việc
Bạn vừa đạt được vị trí nhân viên bán hàng cho công ty ExerShoe, chuyên trong giày tập thể dục cao cấp có giá khoảng 225 đô la một đôi. Sếp đã giao cho bạn ba lựa chọn bồi thường mà bạn phải chọn trước khi bắt đầu ngày:
- Mức lương thẳng là 600 USD mỗi tuần;
- Mức lương $7.00 mỗi giờ cộng với 10% hoa hồng bán hàng;
- Không có lương, nhưng được hưởng 20% tiền hoa hồng và 20 đô la cho mỗi đôi giày bán được
Là một lập trình viên C++ chuyên nghiệp, bạn có thể viết một chương trình để giúp quyết định phương án đền bù tốt nhất.
Một phương pháp phổ biến để phân ly cho một chương trình lớn hơn là tạo một hàm chính giống như bố cục để giải bài tập. Sau đó: chúng ta sẽ viết các hàm để thực hiện từng tác vụ.
Dưới đây là lần đầu bạn tham gia chương trình chính:
GetInput(WeeklySales); CalcMethod1(WeeklySales); CalcMethod2(WeeklySales); CalcMethod3(WeeklySales);
Hãy xem liệu bạn có thể triển khai từng chức năng này hay không trước khi xem phần .
Ví dụ 8: Sản phẩm nào có sẵn ở đâu?
Kết quả của chương trình sau đây là gì?
// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes
#include <iostream>
using namespace std;
int a = 18;
int b = 6;
int function1(int a, int b) {
return a - b;
}
int function2() {
int c;
c = a + b;
return c;
}
int main() {
int b = 12;
int c = 0;
a = function1(b, a);
c = function2();
cout << "a: " << a << " b: " << b << " c: " << c << endl;
}Khi bạn đã tìm ra câu trả lời, hãy xem phiên bản mã nhận xét của chúng tôi tại đây.
Ví dụ 9: Xử lý tệp
Quá trình xử lý tệp trong C++ được thực hiện bằng fstream. Để lưu vào một tệp, chúng ta khai báo luồng và mở luồng bằng giá trị "out" . Kiểm tra điều này trong ví dụ sau.
// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;
int main() {
char first_name[30], last_name[30]; int age;
char file_name[20];
// Collect the data.
cout << "Enter First Name: "; cin >> first_name;
cout << "Enter Last Name: "; cin >> last_name;
cout << "Enter Age: "; cin >> age;
cout << endl << "Enter the name of the file: "; cin >> file_name;
// Create an ofstream called People, open the stream for output.
ofstream People(file_name, ios::out);
// Write the output to the stream.
People << first_name << endl << last_name << endl << age << endl; return 0;
} - Xem liệu bạn có thể tìm ra cách mở tệp vừa tạo và hiển thị dữ liệu.Đây là giải pháp của chúng tôi.
- Giờ hãy xem liệu bạn có thể sửa đổi chương trình này để cho phép người dùng nhập nhiều bản ghi dữ liệu bằng cách sử dụng vòng lặp. Chúng tôi cũng muốn đọc lại tất cả dữ liệu, một ghi mỗi lần.Đây là giải pháp của chúng tôi.
Bây giờ bạn đã sẵn sàng thử một số bài tập thể dục và của riêng bạn !
Sẽ như thế nào khi trở thành một kỹ sư phần mềm tại Google
Đọc về cách làm việc tại Google .
Bài tập và dự án
Các bài tập sau đây sẽ giúp bạn thực hành nhiều hơn với C++ cơ bản. Chúng tôi không cung cấp đáp án cho các bài tập này và dự án của bạn vì chúng tôi muốn bạn cộng tác với các học sinh khác trong khóa học.
- Thông thường, tiếng dế kêu tương xứng với nhiệt độ hiện tại.
Cộng 40 vào số lần con dế kêu trong một phút, sau đó chia
bằng 4 giá trị đó sẽ cho chúng ta nhiệt độ. Viết một chương trình làm dữ liệu đầu vào
số tiếng hót trong một phút và in nhiệt độ hiện tại. Cho
ví dụ:
Number of chirps: 120 The temperature is: 40.0 degrees.
- Viết một chương trình dùng để tính điểm cuối cùng của một khoá học lập trình
mà bạn đang thực hiện. Sau đây là hệ thống chấm điểm:
Final grades will be based on the following: 40% Assignments 15% Midterm Examination 35% Final Examination 10% Class Participation Grade
Chương trình của bạn nên yêu cầu người dùng cho điểm 4 bài tập, kết quả giữa kỳ, điểm cuối kỳ và điểm theo phần. Sau đó, hệ thống sẽ tính và in điểm cuối cùng. Để tính toán, bạn cần lấy tổng điểm của 4 bài tập tính trung bình rồi nhân với 0,4 (40%). Sau đó, bạn nhân điểm giữa kỳ là 0,15, điểm cuối cùng là 0,35 và điểm tham gia là 0,1. Sau đó, bạn cộng tất cả kết quả của các phép nhân này lại với nhau.
Sử dụng các hàm ở mọi nơi có thể trong chương trình này. Bạn có thể tạo một hàm để nhận dữ liệu đầu vào bằng cách truyền vào dưới dạng tham số, chuỗi sẽ được hiển thị trong một danh mục giải thích. Dưới đây là một ví dụ về lần chạy:
Enter the score for the first assignment. 75 Enter the score for the second assignment. 85 Enter the score for the third assignment. 82 Enter the score for the fourth assignment. 94 Enter the score for the midterm. 81 Enter the score for the final. 89 Enter the score for the section grade. 100 The final grade is: 86.9
- Khi đồng hồ bấm giờ điện tử ngày càng rẻ hơn và chính xác hơn, chúng tôi sẽ không
nghi ngờ sẽ được đo lường bằng các phép đo thời gian chính xác đến khó tin. Viết chương trình
lấy dữ liệu đầu vào trong một khoảng thời gian tính bằng giây rồi xuất ra số
giờ, phút và giây mà nó đại diện. Ví dụ:
Number of seconds: 3662 Hours: 1 Minutes: 1 Seconds: 2
- Giả sử chúng ta muốn in một biểu ngữ cho:
"SÁNG MIỄN PHÍ LÀM 3 THƯ GIÃN"
Chúng ta muốn các chữ cái khá lớn vì đây là biểu ngữ:
và hơn thế nữaFFFFF F FFF F F EEEEE E EEE E EEEEE
Là một người có khả năng phân tách vấn đề hiệu quả, có lẽ bạn sẽ nhận thấy rằng thay vì đặt tất cả nút này vào hàm chính, cách này sẽ hiệu quả hơn nhiều để đưa chúng vào hàm. Vì vậy, chúng ta có thể có "printE" hàm và "printZ" và v.v.
Viết một chương trình có các hàm tạo một biểu ngữ chứa một từ hoặc cụm từ với nhiều chữ cái lặp lại. Một số khả năng:
FREEZY BREEZE MAKES FLEAS SNEEZE TWEETLE BEETLE PADDLE BATTLE SIX SICK CHICKS KICK SUE SEWS SUE'S SOCKS BEN BENDS BIM'S BROOM
- Đây là "số ma thuật" vấn đề: Yêu cầu người dùng nhập ba chữ số
số có chữ số đầu tiên lớn hơn chữ số cuối của số đó. Chương trình của bạn sẽ đảo ngược
số đó rồi trừ đi sự đảo ngược từ số ban đầu. Cuối cùng,
đảo ngược số thu được và thêm số đó vào dạng đảo ngược. Xuất
kết quả cuối cùng. Số ban đầu mà người dùng nhập phải là số nguyên
loại (không phải ba ký tự). Hãy suy nghĩ về cách viết một hàm nhận
số nguyên làm dữ liệu đầu vào và trả về số nghịch đảo của số đó. Ví dụ:
input number: 901 reverse it: 109 subtract: 901 - 109 = 792 reverse it: 297 add: 297 + 792 = 1089
- Luật pháp yêu cầu nhà sản xuất thực phẩm phải đặt ngày hết hạn
trên sản phẩm của họ, nhưng có một lỗ hổng trong luật pháp:
ngày hết hạn dưới bất kỳ hình thức cụ thể nào. Vì vậy, nó có thể được viết bằng
Tiếng Swahili và vẫn hợp pháp.
Nadine, em họ thứ ba của chú giải khát Nader, là một gián điệp chất lượng thực phẩm. Cô ấy biết rằng nhiều nhà sản xuất thực phẩm đã bắt đầu mã hoá ngày hết hạn của sản phẩm để khách hàng không biết được sản phẩm cụ thể là như thế nào.
Nhưng loại mã hoá này không giúp các cửa hàng tạp hoá tìm ra ngày hết hạn nếu vì lý do nào đó, họ muốn.
Một phương thức mã hoá phổ biến:
- mã hoá các tháng từ tháng 1 đến tháng 12 dưới dạng 'A' thông qua 'L'
- mã hoá từng chữ số của ngày dưới dạng 'Q' đến 'Z'
- mã hoá năm thành "A" đến 'Z' có nghĩa là từ 1 đến 26, sau đó là thêm vào năm 1995.
Nadine tìm thấy một ổ bánh mì đặc biệt có vấn đề vào ngày này: ARZM. Viết một chương trình để xác định ngày tháng.
- Đây là một con số tương tự với trò lừa đảo nổi tiếng. Yêu cầu người dùng nhập một số có ba chữ số. Hãy coi các số là ABC (trong đó A, B, C là ba số) chữ số của số điện thoại). Bây giờ, hãy tìm số dư của các số được tạo bởi ABC, BCA và CAB khi chia cho 11. Chúng tôi sẽ gọi các số dư này là X, Y, Z. Thêm chúng theo tên X+Y, Y+Z, Z+X. Nếu bất kỳ tổng nào là lẻ, hãy tăng hoặc giảm xuống 11 (bất kỳ thao tác nào dẫn đến số dương ít hơn lớn hơn 20; lưu ý rằng nếu tổng là 9, thì bạn chỉ cần báo cáo điều này và dừng quy trình). Cuối cùng, chia từng tổng thành một nửa. Các chữ số thu được là A, B, C. Ghi một chương trình triển khai thuật toán này.
Trong phần tiếp theo, hãy phân ly trước khi viết chương trình. Sử dụng các hàm bất cứ khi nào có thể để tạo chương trình có cấu trúc hợp lý.
Ứng dụng: Trực quan hoá âm nhạc bằng ảnh động
Các kỹ sư phần mềm tạo ra nhiều ứng dụng thường thú vị và sáng tạo. Trong mỗi học phần của khoá học này, chúng tôi trình bày một ứng dụng khác nhau mà các kỹ sư được thiết kế và triển khai, giúp bạn hiểu tất cả các lĩnh vực khác nhau mà trong đó các kỹ sư làm việc.
Đây là một điều thú vị được thiết kế để trực quan hoá âm nhạc.