Johnny850807 / Coding-GYM

自己菜鳥階段時在練習Java物件導向、設計模式時,所設計的題庫,此專案庫目前用來讓我的同學/學生 (欠調教的) 們提交程式碼來進行Review,欲參考OOP題目者可直接到Projects區觀看,題目皆(85%)擁有示範解答程式碼。ISSUE放的都是Code Review嘴砲。(物件導向設計學分兩階段→JAVA→設計模式)
24 stars 6 forks source link

魔王題:單字複習系統 #104

Open Johnny850807 opened 6 years ago

Johnny850807 commented 6 years ago

難度:2

想要利用所學大展身手的請寫這題! 此題目訓練重點:例外、I/O、資料結構、系統架構第三方套件 (這一題,請你撰寫出你認為最漂亮的程式。)

你終於要來開發一個英文單字複習系統啦, 在這個系統中,使用者可以管理自己的單字庫,並用此單字庫進行完整的複習。 系統互動如下,(假設使用者已經新增了些許單字,你不一定要跟以下互動完全一致,但基本功能要做到,你也可以開發出更強的複習系統~): ($ 代表螢幕上印出的字, : 代表使用者輸入的字 )

$ 您好,歡迎來到英文單字複習系統 v1.0 $ (1) 管理單字 (2) 進行複習 (3) 離開 : 1 $ 您的單字: $ apple, banana, orange, secret, sleep $ (1) 新增單字 (2) 刪除單字 (3) 返回 : 1 $ 請輸入要新增的單字: : favorite $ 單字:favorite $ 詞性:ADJ $ 意思: $ 1 : preferred above all others and treated with partiality $ 2 : appealing to the general public $ 詞性:N $ 意思: $ 1 : something regarded with special favor or liking $ 2 : a special loved one $ 3 : a competitor thought likely to win $ 完成! $ apple, banana, orange, secret, sleep, favorite $ (1) 新增單字 (2) 刪除單字 (3) 返回 : 2 $ 請輸入要刪除的單字: : apple $ 完成! $ banana, orange, secret, sleep, favorite $ (1) 新增單字 (2) 刪除單字 (3) 返回 : 1 $ 請輸入要新增的單字: : asdasdhasd $ 錯誤,找不到該單詞。 $ (1) 新增單字 (2) 刪除單字 (3) 返回 : 3 $ (1) 管理單字 (2) 進行複習 (3) 離開 : 2 $ 複習開始! $ a_e : (n.) fruit with red or yellow or green skin and sweet to tart crisp whitish flesh $ 請輸入答案: : appce $ 錯誤,剩下兩次機會。 : appae $ 錯誤,剩下一次機會。 : apple $ 答對! $ sp : (v.) be asleep $ 請輸入答案: : slaaa $ 錯誤,剩下兩次機會。 : $ 錯誤,剩下一次機會。 : 123 $ 失敗!請多複習!答案為sleep! $ (1) 管理單字 (2) 進行複習 (3) 離開 : 3 $ 歡迎再來。

(如果一直成功,就把整個單字list都考完,並印出恭喜你成功了!)

單字當然要儲存在硬碟上,別懷疑。但至於文件的格式是什麼,自己設計吧。

複習題目的出題順序

Java的Date物件可以處理日期,請不要大費周章寫一堆早就被Java內建的日期操作。


此時你會非常好奇,我要怎麼得到單字的所有解釋? 不用擔心,請把資源區/單字複習系統中兩個jar檔案加進專案依賴庫。(若您找不到檔案,請確認您已同步Github雲端。)

image

其中jsoup是爬蟲套件,幫助您分析網頁內容,而vocabulary_crawler則是我們使用jsoup來爬取Vocabulary.com 的工具!兩者缺一不可!

您只要使用我們的工具就能一行取得單字定義! 以下為使用範例!以下程式會印出:

單字:favorite 詞性:ADJ 意思: 1 : preferred above all others and treated with partiality 2 : appealing to the general public 詞性:N 意思: 1 : something regarded with special favor or liking 2 : a special loved one 3 : a competitor thought likely to win

程式:

public static void main(String[] args) {
    Crawler crawler = new CrawlerVocabularycom();
    String wordStr = "favorite";
    try {
        Word word = crawler.crawlWord(wordStr); //爬蟲程式會開始從Vocabulary.com上抓取此單字的意思
        Map<PartOfSpeech, List<String>> definitions = word.getDefinitions(); //此單字的詞性→定義之資料結構
        System.out.println("單字:" + word.getWord());
        for (PartOfSpeech pos : definitions.keySet()) //走訪此單字的所有詞性並印出不同詞性下的所有定義
        {
            System.out.println("詞性:" + pos);
            System.out.println("意思:");
            List<String> definitionsOfPos = definitions.get(pos);
            for (int i = 0; i < definitionsOfPos.size(); i ++)
                System.out.println((i+1) + " : " + definitionsOfPos.get(i));
        }
    } catch (WordNotExistException e) {
        //若該單字在字典中不存在
        System.out.println("找不到該單詞。");
    }
}

試著思考:

  1. 你想如何儲存使用者的單字庫?
  2. 你想如何設計你的系統架構?
  3. 我們給予你的套件中的CrawlerVocabularycom,是如何幫你取得單字定義的? (雖然不是你開發的,但你可以想像!)
  4. 如果 CrawlerVocabularycom 內部設計沒有丟出例外的話,則使用它的人會難以知道單詞是否存在!