1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình nâng cao: Lớp - Trần Quốc Long

52 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Cấu trúc

  • Slide 1

  • Nội dung

  • Đặt vấn đề: đánh giá SimpleAI

  • Đặt vấn đề: đánh giá SimpleAI

  • Chung và riêng

  • Phân tích chức năng của guesser

  • Phân tích chức năng của guesser

  • Class

  • Cài đặt hàm trong MyClass.cpp

  • Sử dụng lớp

  • Sử dụng lớp

  • Cấu trúc lại SimpleAI (refactor)

  • Chức năng của guesser

  • Xây dựng lớp Guesser

  • Hàm khởi tạo

  • Hàm newGame()

  • Hàm receiveHostAnswer()

  • Hàm receiveHostAnswer()

  • Hàm receiveHostAnswer()

  • Hàm Guesser::isGoodMask()

  • Guesser::updateSecretWord()

  • Hàm getNextGuess()

  • Hàm getNextGuess()

  • Các hàm tiện ích

  • Các hàm tiện ích

  • Sử dụng lớp Guesser

  • Sử dụng lớp Guesser

  • Hàm render()

  • Getters

  • Hàm render()

  • Sử dụng lớp Guesser

  • playAnimation()

  • Hoàn thành đóng gói

  • Hangman 4.0

  • Nội dung

  • Đánh giá SimpleAI

  • Đánh giá SimpleAI - mã giả

  • Hàm main() mới

  • Hàm main() mới

  • Đánh giá trên nhiều bộ từ vựng

  • Thử dùng các bộ từ vựng

  • Assessment 1.0

  • Tiếp tục cấu trúc và tối ưu mã

  • Dữ liệu và hàm của Assessment

  • Hàm khởi tạo Assessment()

  • Hàm khởi tạo Assessment()

  • playSimulation(): máy chơi với máy

  • playSimulation(): máy chơi với máy

  • playSimulation(): sắp xếp kết quả

  • getAverageIncorrectGuess()

  • Assessment 2.0

  • Bài tập

Nội dung

Bài giảng Lập trình nâng cao: Lớp cung cấp cho người học các kiến thức: Đóng gói mô-đun Guesser, đánh giá SimpleAI (assessment), máy chơi với máy, đóng gói mô-đun Assessment, hàm khởi tạo, danh sách khởi tạo,... Mời các bạn cùng tham khảo.

Assessment 10&11 - Lớp = Dữ liệu + Hàm https://github.com/tqlong/advprogram Nội dung ● Lớp (Class) = Dữ liệu + Hàm ○ ● Đánh giá SimpleAI (assessment) ○ ○ ● Đóng gói mơ-đun Guesser Máy chơi với máy Đóng gói mơ-đun Assessment Kỹ thuật ○ ○ ○ ○ class Hàm khởi tạo, danh sách khởi tạo Hàm public, hàm private, hàm const Sắp xếp với sort Đặt vấn đề: đánh giá SimpleAI Một số câu hỏi cho SimpleAI ● ● Các tập từ vựng khác có cho kết khác ? Nên chọn tập từ vựng ? Các thay đổi thuật tốn đốn kí tự có thực giúp việc đốn từ xác ? Cần có đánh giá định lượng (số hố) ● ● Giúp trả lời rõ câu hỏi Lựa chọn chương trình đốn từ xác Đặt vấn đề: đánh giá SimpleAI Cần suy nghĩ ● Cách đánh giá SimpleAI ○ ● Cách tính điểm Cách tổ chức chương trình ○ ○ Đánh giá tự động tập từ vựng Cho phép máy tự động chơi nhiều lần ghi lại kết chơi (từ cần đoán, số lần đoán, số chữ đoán …) Chung riêng SimpleAI có mơ-đun ● ● Giao diện, Util, Draw Guesser ○ ○ Chương trình cần biết khai báo getNextGuess() → public Bản thân cài đặt getNextGuess() hàm khác (độ thơng minh thuật tốn), chương trình khơng cần biết → private Có thể tách guesser liệu liên quan thành mơ-đun riêng Phân tích chức guesser Các chức ● ● ● Bắt đầu ván chơi newGame() với độ dài từ cho trước Đoán ký tự getNextGuess() Nhận trả lời chủ trò receiveHostAnswer() Phía ngồi (chủ trị, hệ thống) cần biết chức guesser bên ● ● guesser đốn khơng cần biết guesser quản lý liệu khơng cần biết Phân tích chức guesser HOST GUESSER new G am e(4) -getN extG uess() = ‘a’ hand receiveH ostAnsw er(‘a’,“-a ”) -a-getN extG uess() = ‘n’ receiveH ostAnsw er(‘n’,“ n-”) -an- secretWord incorrectGuess previousGuesses stop Class ● ● C++ hỗ trợ chế đóng gói hàm liệu Ví dụ: tệp MyClass.h class M yC lass { p rivate: Các đối tượng thuộc lớp MyClass có liệu kiểu nguyên value in t value; b ool ch eckN ew V alu e(in t new Value); p u b lic: hàm dành riêng cho đối tượng lớp, bên ngồi khơng dùng M yClass(); void setV alu e(in t new Value); in t getV alu e(); }; hàm “của cơng”, bên ngồi gọi Cài đặt hàm MyClass.cpp Thêm phạm vi MyClass:: vào trước tên hàm # include "M yC lass.h" M yC lass::M yC lass() void M yC lass::setValue(in t new Value) { if (checkN ew Value(new Value)) { value = 0; } b o ol M yC lass::checkN ew Value(in t new Value) { retu rn new Value > = ; } value = new Value; } in t M yC lass::getValue() { retu rn value; } Sử dụng lớp M yC lass obj; // gọihàm khở itạo M yC lass::M yC lass() cout < < obj.getValue() < < endl; // obj.setValue(5); cout < < obj.getValue() < < endl; // obj.setValue(-5); cout < < obj.getValue() < < endl; // 5, không thay đôở i cout < < obj.checkN ew Value(50 ); // lôỗ ibiên dịch cout < < obj.value < < endl; // lôỗ ibiên dịch Ở bên ● ● cần biết hàm setValue(), getValue() không cần biết checkNewValue() ○ Là xử lý nội bên MyClass Hàm main() in t m ain (in t argc, ch ar* argv[]) { string testFile = argc > ? argv[1 ] : "data/O gden_Picturable_200.txt"; vector< string> testW ordList = readW ordListFrom File(testFile); d o u b le totalG uess = ; fo r (con st string& w ord : testW ordList) { G uesser guesser; guesser.new G am e(w ord.length()); Chuyển hàm main() cũ thành hàm { ch ar guess = guesser.getN extG uess(); if (guess = = ) { // guesser chịu thua playHangman() ● Lưu lại code chơi Hangman cũ để sau có totalG uess + = guesser.M AX_G U ESSES; b reak; } thể cần dùng lại tham khảo cách dùng Guesser Hàm main() guesser.receiveH ostA nsw er(guess,getM ask(guess, w ord)); if (guesser.isStop()) totalG uess + = guesser.getIncorrectG uess(); } w h ile (!guesser.isStop()); } cout < < "For testFile " < < testFile < < ",average num ber of guesses = " < < totalG uess / testW ordList.size() < < endl; retu rn 0; Máy chơi với máy - sinh mặt nạ từ guess word } Chạy thử thấy string g etM ask(ch ar guess,con st string& w ord) { string m ask(w ord.length(), '-'); số 1.885 for (u n sig n ed in t i= 0; i< w ord.length(); i+ + ) if (tolow er(w ord[i]) = = guess) m ask[i] = guess; từ vựng sẵn có retu rn m ask; } Đánh giá nhiều từ vựng ● Guesser dùng từ vựng ○ ○ ● Ogden_Picturable_200.txt Xem hàm khởi tạo Guesser::Guesser() Để tăng “trí tuệ” Guesser ○ ○ Cho phép khởi tạo wordList với từ vựng khác Dùng hàm khởi tạo có tham số tên tệp guesser.h p u b lic: G uesser::G uesser(con st string& w ordFile) { w ordList = readW ordListFrom File(w ordFile); G uesser(con st std::string& w ordFile); } guesser.cpp Thử dùng từ vựng ● Thay khai báo Guesser guesser; Bằng khai báo Guesser guesser("data/dictionary.txt"); Download https://github.com/mrdziuban/Hangman/blob/master/dictionary.txt ● Thử nghiệm xong, dùng tham số dòng lệnh để nhập tên tệp từ vựng Assessment 1.0 https://github.com/tqlong/advprogram/archive/faf729381c8ecb47578a170cad022102841e53b1 zip in t m ain (in t argc, ch ar* argv[]) { string testFile = argc > ? argv[1 ] : "data/O gden_Picturable_200.txt"; string dictFile = argc > ? argv[2] : "data/dictionary.txt"; fo r (co n st string& w ord : testW ordList) { G uesser guesser(dictFile); Tiếp tục cấu trúc tối ưu mã Trong phần ● ● Đóng gói đoạn mã đánh giá thành lớp Assessment vào assessment.* Cho phép liệt kê từ theo thứ tự giảm dần số lần đoán sai ○ ● Biết từ khó đốn Cải tiến tốc độ guesser Dữ liệu hàm Assessment Dữ liệu Các hàm public testWordList Assessment(testFile, guesser) guesser playSimulation() → danh sách từ số lần đoán sai theo thứ tự Assessment dach sách từ số lần đoán sai giảm dần getAverageIncorrectGuess() → trung bình cộng số lần đốn sai Hàm khởi tạo Assessment() # pragm a once assessment.h # include < string> # include < vector> # include "guesser.h" đưa tham chiếu class A ssessm en t { std::vector< std::string> testW ordList; G uesser& guesser; p u b lic: Assessm ent(con st std::string& testFile, G uesser& guesser_); }; vào phần liệu Hàm khởi tạo Assessment() assessment.cpp # include "assessm ent.h" # include "util.h" u sin g n am esp ace std; Assessm ent::Assessm ent(con st string& testFile,G uesser& guesser_) : guesser(guesser_) tạo liệu lớp { testW ordList = readW ordListFrom File(testFile); } danh sách khởi playSimulation(): máy chơi với máy ● Cần lưu số lần đoán sai từ ○ ○ Định nghĩa struct WordCount gồm từ số đếm struct giống class mặc định public stru ct W ordC ount { std::string w ord; in t count; assessment.h assessment.h class A ssessm en t { p rivate: W ordC ount( st std::string& w ord_, in t count_) std::vector< W ordC ount > w ordIncorrectG uess; p u b lic: : w ord(w ord_), count(count_) {} }; void playSim ulation(); }; lưu số lần đoán sai từ playSimulation(): máy chơi với máy assessment.cpp vo id Assessm ent::playSim ulation() { w ordIncorrectG uess.clear(); for (co n st string& w ord : testW ordList) { guesser.new G am e(w ord.length()); { dùng hàm khởi tạo để tạo đối tượng WordCount ch ar guess = guesser.getN extG uess(); if (guess = = 0) { w ordIncorrectG uess.push_back(W ordC ount(w ord,guesser.M AX_G U ESSES)); b reak; } Đưa hàm getMask thành private guesser.receiveH ostAnsw er(guess,getM ask(guess,w ord)); if (guesser.isStop()) w ordIncorrectG uess.push_back(W ordC ount(w ord,guesser.getIncorrectG uess())); } w h ile (!guesser.isStop()); } } Assessment playSimulation(): xếp kết ● ● Sử dụng hàm sort Cần làm hàm so sánh hai WordCount ○ http://stackoverflow.com/questions/4892680/sorting-a-vector-of-structs assessment.cpp # include < algorithm > b o ol g reaterW o rd C o u n t(con st W ordC ount& a, co n st W ordC ount& b) { retu rn a.count > b.count; Sửa thành nhỏ < để xếp tăng dần } vo id Assessm ent::playSim ulation() { w ordIncorrectG uess.clear(); for (con st string& w ord : testW ordList) { } sort(w ordIncorrectG uess.begin(),w ordIncorrectG uess.end(),greaterW ordC ount); } getAverageIncorrectGuess() Dùng vòng lặp for duyệt wordIncorrectGuess assessment.h assessment.cpp d o u b le Assessm ent::getAverageIncorrectG uess() { d o u b le totalG uess = 0; p u b lic: for (co n st W ordC ount& p : w ordIncorrectG uess) d ou b le getAverageIncorrectG uess(); totalG uess + = p.count; retu rn totalG uess / w ordIncorrectG uess.size(); } Assessment 2.0 https://github.com/tqlong/advprogram/archive/cf6e81dbcd38b1960225fbe4881145e9 # include < iostream > 0a0d81bc.zip # include "guesser.h" # include "assessm ent.h" u sin g n am esp ace std; Bỏ hết #include thừa, xóa hàm khơng cịn cần thiết in t m ain (in t argc,ch ar* argv[]) { string testFile = argc > ? argv[1 ] : "data/O gden_Picturable_200.txt"; string dictFile = argc > ? argv[2 ] : "data/dictionary.txt"; G uesser guesser(dictFile); Assessm ent assessm ent(testFile,guesser); assessm ent.playSim ulation(); cout < < "U sing dictFile " < < dictFile < < endl < < "on testFile " < < testFile < < endl < < "average # incorrect guesses = " < < assessm ent.getAverageIncorrectG uess() < < endl; retu rn 0; } Sử dụng hai mơ-đun đóng gói Bài tập ● Sử dụng map thay cho vector để lưu số lần đoán sai từ ○ ● map wordIncorrectGuess; Cải tiến tốc độ Guesser ○ ○ ○ Mỗi lần lọc từ, dùng vector chậm Thay vector số từ hợp lệ Mỗi lần lọc từ hợp lệ lần đốn trước ■ Khơng lọc lại từ danh sách từ ban đầu ... guesser HOST GUESSER new G am e(4) -getN extG uess() = ‘a’ hand receiveH ostAnsw er(‘a’,“-a ”) -a-getN extG uess() = ‘n’ receiveH ostAnsw er(‘n’,“ n-”) -an- secretWord incorrectGuess previousGuesses... guesser.* Sử dụng lớp Guesser Lúc ● ● ● guesser.* khai báo cài đặt lớp Guesser Nếu dịch, thấy báo lỗi khơng tìm thấy hàm getNextGuess() main.cpp Cần sử dụng lớp Guesser main.cpp Sử dụng lớp Guesser... Cần làm hàm so sánh hai WordCount ○ http://stackoverflow.com/questions/4892680/sorting-a-vector-of-structs assessment.cpp # include < algorithm > b o ol g reaterW o rd C o u n t(con st W ordC

Ngày đăng: 08/05/2021, 12:19