Bài giảng Lập trình nâng cao: Hàm cung cấp cho người học các kiến thức: Đoán số (guess it), chuyển hóa vấn đề thành chương trình, kỹ thuật sinh số ngẫu nhiên, kỹ thuật vòng lặp, điều kiện vòng lặp, kỹ thuật mô-đun hóa chương trình bằng hàm.
Game: Guess It - Hàm https://github.com/tqlong/advprogram Nội dung ● Game: Đoán số (Guess It) ● Chuyển hoá vấn đề thành chương trình ● Kỹ thuật: ○ Sinh số ngẫu nhiên ○ Vịng lặp, điều kiện vịng lặp ○ Mơ-đun hóa chương trình hàm Đốn số: Luật chơi ● Hai người: chủ trò - A, người chơi - B ● Người A chọn số từ 1-100 ● Người B đoán số ○ Nếu đúng, người B thắng ○ Nếu sai, người A trả lời số người B đoán lớn hay nhỏ Người B tiếp tục đoán số ● Cho trẻ em học Toán ● Giúp hiểu thuật toán quan trọng: Tìm kiếm nhị phân (Binary Search) Đốn số: Chương trình ● Giữa người (B) máy (chủ trò - A) ● Máy "nghĩ" số từ đến 100 ● Người chơi đoán số ○ Nếu đúng, người chơi thắng Nếu sai, máy trả lời số người chơi đoán lớn hay nhỏ số máy để người chơi tiếp tục đốn số ● Cách khác: người (chủ trị - A) máy (đốn - B) Ví dụ lần chơi 10 Your number is too small 20 10 Your number is too big Congratulation ! You win Nội dung ● Game: Đoán số (Guess It) ● Chuyển hố thành chương trình ● Kỹ thuật: ○ Sinh số ngẫu nhiên ○ Vòng lặp, điều kiện vòng lặp ○ Mơ-đun hóa chương trình hàm Mơ tả thành bước (bằng lời) ● ● ● ● Máy tính nghĩ số Nhập số người chơi đoán Máy chọn câu trả lời phù hợp Lặp lại người chơi chưa đốn Mơ tả thành bước (gần máy) B1: Máy tính nghĩ số B2: Nhập số người chơi đoán B3: Máy chọn câu trả lời phù hợp B4: Nếu người chơi đoán sai Quay lại B2 Nếu người chơi đoán Chuyển tới B5 ● B5: Kết thúc ● ● ● ● Chương trình (mã giả, gần máy) randomNumber = generateRandomNumber(); // B1 while (true) { number = getPlayerGuess(); // B2 printAnswer(number, randomNumber); // B3 if (number == randomNumber) break; // B4 // else continue; } // B5 Chương trình (ngơn ngữ C++) int randomNumber = generateRandomNumber(); { int number = getPlayerGuess(); printAnswer(number, randomNumber); } while (number != randomNumber); Guess It 1.1 in t m ain () { in t random N um ber = generateRandom N um ber(); in t num ber; { num ber = getPlayerG uess(); printAnsw er(num ber,random N um ber); } w h ile (num ber != random N um ber); void p rin tA n sw er(in t num ber, in t random N um ber) retu rn ; { } if (num ber > random N um ber) { cout < < "Your num ber is too big." < < endl; } else if (num ber < random N um ber) { cout < < "Your num ber is too sm all." < < endl; } else { cout < < "Congratulation! You w in." < < endl; } } Guess It 1.1 void p rin tA n sw er(in t num ber, in t random N um ber) { if (num ber > random N um ber) { cout < < "Your num ber is too big." < < endl; } else if (num ber < random N um ber) { cout < < "Your num ber is too sm all." < < endl; } else { cout < < "Congratulation! You w in." < < endl; } } Lặp lại (Game loop) ● Nếu người chơi đoán sai, lặp lại bước nhập ● Cần hỏi người chơi lần ● Vịng lặp … while Game loop { // N hập sốốngườichơiđoán // In câu tra ả lờiphù hợp } w h ile (num ber != random N um ber); Kết C:\softw are\cygw in64\hom e\doe\advprogram \lec2-guessit\G uessIt.exe Enter your num ber betw een and 100: 50 Your num ber is too big Enter your num ber betw een and 100: 25 Your num ber is too sm all Enter your num ber betw een and 100: 42 Congratulation! You w in Thực hành ● Hiển thị số lần đoán người chơi ● Điểm người chơi = 100 - số lần đoán ● Điểm người chơi = 10000 - x 100 - x 99 - … tùy theo số lần người chơi đoán ● Cho phép chơi nhiều ván ○ Hỏi người chơi có muốn chơi tiếp khơng ? ○ Gợi ý: đưa tồn mã hàm main() vào hàm playGuessIt() Cho phép chơi nhiều ván ● Bạn có nhận lần chạy chương trình, máy “nghĩ” lại số ● Tìm kiếm Google: “C++ random repeat” ● Câu lệnh: srand(time(0)); ● Khởi tạo “hạt giống” cho hàm rand() thời gian bắt đầu chạy chương trình ○ Lưu ý: cần gọi srand() lần ● Mỗi lần chạy, chương trình dùng hạt giống khác : thời gian hành Tổng kết ● Viết chương trình kể câu chuyện ● Chia nhỏ bước thành hàm lệnh ○ Mơ-đun hóa hàm ○ Truyền tham số giá trị ● Tìm kiếm, tra cứu kỹ thuật lập trình ○ Khơng thể thiếu tiếng Anh ● Sinh số (giả) ngẫu nhiên ● Lựa chọn if … else if … else ● Vòng lặp … while Máy chơi Guess It ● Đặt vấn đề: đảo vai trò người máy ○ Người làm chủ trò, nghĩ số từ đến 100 ○ Máy đốn số ○ Người “thơng báo” cho máy giá trị máy đoán lớn hơn, nhỏ hay giá trị cần tìm ● Có nhiều cách chơi (thuật tốn đoán) ○ Đoán ngẫu nhiên ○ Đoán từ đến 100 (hoặc ngược lại) ○ Đoán “đại” số, nhận trả lời người chơi để phán đoán lần sau nên đoán Thuật toán chung B1: select a number X in [1, 100] B2: ask for host’s answer on X B3: if X is right, exit (win) else goto B1 Thuật toán chung ch ar g etH ostA n sw er(in t X) { ch ar answ er; cout < < "Is " < < X < < " your num ber? "; cin > > answ er; retu rn answ er; } in t X, answ er; { X = selectN um ber(1, 100); answ er = getH ostAnsw er(X); if (answ er = = '= ') cout < < "Your num ber is " < < X < < endl; } w h ile (answ er != '= '); tùy thuộc vào hàm selectNumber() mà ta có cách đốn (thuật tốn đốn) khác Quy ước trả lời: answer >, : X lớn số cần đoán