哦、、原來寒假早已通過了嗎,有點迷html
做業連接ios
本次做業的github連接git
有 Microsoft Visual Studio 2017 的同窗,能夠直接打開 四則運算/四則運算.sln 這個項目。否則的話麻煩請本身從新用本身的編譯器編譯啦,並把對應的文件放好!github
趙暢 111500206 http://www.cnblogs.com/ZCplayground/數組
胡緒佩 031602114 http://www.cnblogs.com/heihuifei/函數
此次做業的思路不難理解。同一個軟件的各類語言版本,不該該寫在代碼裏,而是要把這些語句抽出來造成「資源文件」,並且這是頗有必要作的一件事情。學習
在看做業時,老師給了一條參考連接How to: Create a Localized Version of a Resource File,在連接的底部,有一個提示,讓咱們參考CultureInfo類。若是點進去看的話,就進入了無限的大坑……我和王源同窗同樣,一開始也是一頭扎進msdn的文檔中……不少都是.Net和C#的東西。啃API的時候,也強行啃了一些代碼。例如:測試
這裏贊一下王源同窗,王源同窗看文檔學習的能力很是強!他最後是經過啃文檔,調用這些API,完成了任務,並且效果很是的不錯!然而我卻看不下去這些API了,因而乎就和棟哥聊了一會天……ui
什麼,簡單的方式???編碼
仔細一想,確實也不該該爲剛剛學C++的同窗們佈置有着這麼奇奇怪怪完成方式的任務,是我一開始的思路就被文檔下面的那個CultureInfo類給導偏了。
因而乎,在C語言文件操做的基礎上,我就簡單地學習了一下C++的文件流操做,而且想了一些辦法實現了經過文件讀寫來達到本次做業要求的最核心的一條要求:
當每增長一種語言時,是不可經過修改源代碼及重編譯的方式實現
這不只讓咱們全部與用戶交互的顯示內容不能寫在代碼裏,並且須要咱們想出一種新思路——不只可以讓程序自動識別支持哪些語言,還能能夠調用它們、顯示給用戶。
在代碼項目的文件夾下,我新建了一個文件夾,名爲 LangResourses。其中有一個文本文件叫作 LanguageList.txt,其內容如圖所示,裏面包含着所支持各類語言的名字。用戶能夠經過輸入這些語言的名字來選擇須要的版本。程序識別用戶輸入的語言後,能夠打開對應的文件,調用對應的「資源」(雖然沒放到.rc文件中)。
而下面的是文本文件 中文.txt 和 English.txt 的內容。同一行的內容意思是同樣的,只不過是所使用的語言不一樣(這是一個核心操做)。其他的文件中是其餘語言的翻譯版本(你們能夠clone下來看看)。
我主要是在以前的版本上進行迭代。會顯示與用戶交互信息的一些函數都有作修改,例如輸入檢測、答案斷定、結果輸出等等。最重要的是多了一個頭文件LanguageResource.h。其中包含了如下內容:
最重要的關鍵一步是得到某個語言資源中的文件。原本我是這樣想的:因爲fgets這個函數,使用過一次,可使得光標停留在下一行開頭。下一次調用fgets時,就能夠讀取下一行。因此說,我能夠在txt文件中按照順序排列好一些文段,而後不斷地使用fgets就能夠。可是,在我以前的代碼中包括了輸入檢測的模塊,這就意味着不能按照上面那個思路來(由於可能屢次輸出相同的內容)。我也不想放棄這個輸入檢測模塊,這個模塊對於要給用戶使用的程序來講很是重要。更況且,用戶輸入的題目數量也不必定,用fgets直接一行行輸出的思路是行不通的。
最後,我想到了預先讀取txt文件中的內容,把內容存到一個指針數組裏。經過控制下標i,讓相同的下標表明相同的內容。對應在不一樣的文件中,就是相同的行數表明相同的內容,只是語言版本的不一樣。核心代碼以下:
/*根據正確的語言文檔路徑,取得其中的內容以便使用。存放到全局指針數組Resource中*/ void GetResource(char * filepath) { fstream File; File.open(filepath, ios::in); char one_Line[MAXLEN]; /*將每行文件的內容放到Resource[i]中,這樣能夠經過下標i訪問各類語句*/ int i; for (i = 0; File.getline(one_Line, MAXLEN); i++) { Resource[i] = (char *)malloc(MAXLEN * sizeof(char)); strcpy_s(Resource[i], MAXLEN * sizeof(char), one_Line); } File.close(); }
(這裏的對齊,簡直強迫症福利,但傳到github上就亂了,心很累)
3)程序實現和結果測試的截圖
第一個圖展現了中文版本。上個版本已有的輸入檢測就不展現截圖了。(在尚未選擇語言的時候,使用的界面語言是英語)
第二個圖展現了日文版本,順帶一提,輸入語言時我也寫了輸入檢測,若是用戶輸入了不支持的語言或者輸入錯誤,會讓用戶從新輸入一次。但也能夠經過輸入e來退出。
4)提交日誌截圖
5)兩位同窗的分工和協做證據截圖
衚衕窗因爲文件操做沒時間學會,又臨近deadline,因此此次的全部工做都是由我來完成的。
上面也提到了,一開始被文檔的導向吸引,因此思路很狹窄。後面也是跟棟哥聊天才發現不對……最後想出來一個還不錯的方式。經過這種方式能夠比較好的學習C++文件流,也能夠複習(若是不會的話就是學習)一下指針數組的用法。
此次完成的做業一樣有不足。原本是有想出來一個問題的:
因此有考慮尋找一下C語言或者C++中,可以支持Unicode編碼的方法。然而查找了不少資料,試過了不少方法,依舊失敗。最坑爹(浪費了不少精力)的當屬wfstream流和wchar_t(寬字符)。對於寬字符的正確輸出方式,雖然說網上有不少人寫了轉換函數之類,然而這東西涉及編碼規則,有不少位運算。在對Unicode編碼不是特別瞭解的狀況下,最後我仍是放棄使用這種機制。後來王源同窗找到msdn文檔說fopen有打開Unicode文本文件的功能,我編碼一番確實能夠。但從文件輸出文字依然困擾着我,因而我就放棄了。
最後的解決方案:在法語翻譯的時候,用了不是特別標準的(百度)翻譯,內容是ANSI字符的(其餘用的是Google翻譯)。
在編碼時,有一點體會:在上一次做業時,把接口寫好、模塊分好。在此基礎上,給本身迭代版本時帶來了必定的方便性。若是偷懶不把這塊工做作好(例如註釋、接口什麼的),那麼軟件的可維護性會不好。
另外,把嵌在代碼中的用戶交互語言刪除,換成調用資源的寫法,讓整個代碼看起來清爽許多,而且若是要添加新的語言的版本,更新資源的內容便可。
如下是msdn文檔的一些API:
一些文件操做:
其餘: