簡易版AI英文問答程序解決


第四章的作業和實踐題要論印象深刻無疑就是AI的那道題了。不得不說一開始看到題目的時候,我真的蒙了很久。

 本題要求你實現一個簡易版的 AI 英文問答程序,規則是:

1.無論用戶說什么,首先把對方說的話在一行中原樣打印出來;

2.消除原文中多余空格:把相鄰單詞間的多個空格換成 1 個空格,把行首尾的空格全部刪掉,把標點符號前面的空格刪掉;

3.把原文中所有大寫英文字母變成小寫,除了 I

4.把原文中所有獨立的 I me 換成 you

5.把原文中所有的問號 ? 換成驚嘆號 !

6.把原文中所有獨立的 can you 換成 I can —— 這里獨立是指被空格或標點符號分隔開的單詞;

7.在一行中輸出替換后的句子作為 AI 的回答

 

以上就是這道題的題目了。是不是有點蒙?雖然說是說一道題,實際上說是六道題都不誇張。

 

星期一下午上完課,我就打開了電腦開始琢磨這道題。在這里跟大家分享一下我一開始的思路。有一些不足,大家也見諒一下哈哈哈。

 首先要確定一下數據結構。看到這道題,我思考了一下,要用字符串來做的,這顯而易見。

但也從題目看到,這道題是有好幾行的輸入,而且是針對每一行進行處理的因此,我們很有必要逐行逐行地輸入,方便后面的處理。在這時我權衡了一下,一個辦法就是弄一個二維數組,另一個辦法則是重新定義一個類型。這個結構體中就可以打包一個數組或一個string 類的型。最終我決定使用后一個辦法,畢竟比起二維的數組,一維的思路會更加清晰一點。

                                                                                                          

 

接下來就是進行一些簡單的操作,逐行輸入字符和完成第一個小要求輸出字符串了。這操作比較簡單我也就不多說了。但有一個比較重要的點。如圖下:

        

 

 在第一行輸出后會有一個回車,此時如果沒有將這個回車用字符吸掉,那么后面就會錯亂了。因為運行時會將回車當做第一個字符串。一開始我就犯了這個錯誤,怎么樣都是只能輸入五行的字符。找了很久也沒找到問題所在。這也還是我之前博客中提到的細節問題了。

 接下來就開始處理其他的條件了。我粗略地看了一下,覺得空格的問題會在很大程度上影響后面的操作,而解決之后就不用再考慮空格問題,首先解決這個問題應該會比較划算。這么想着我就開始了。

消去空格有三個地方要消,一個是前面一個是中間,還有就是最后面的空格。

前面和中間的方法我就還是想了出來。一開始想的是數組移動,一次解決掉兩個問題。后來發現實在是太繁瑣了,要判斷很多條件,而且前面空格和中間符號前空格並沒有太大的關系。倒不如分開來進行解決,采取另一種移動的形式,從一個數組移到另一個數組。

1.消掉前面的空格可以理解為從非空格的字符開始移動到另一個數組。要找的就是非空格字符的首坐標。

 

2.消掉中間的空格,首先要消掉多余的空格,加下來要消掉符號前的空格。

我的想法就是先把第一個空格存儲起來,再判斷下一個字符,增加下標,直到下一個不為空格為止。如此就可以消掉多余的空格了。接下來就繼續判斷當前這個是不是為標點符號,倘若是就可以將新的字符數組下標減1這里可以理解為刪去了存進去的空格字符

 

這里給的判斷標點符號的方法實在有些蠢。但通過老師上課講,我也進行了改進,可以利用判斷是否獨立的條件再加上該符號不是空格這兩個條件就可以了

 

3.對於最后面的空格我實在沒想到怎么處理。哈哈哈,不過上了課我現在還是可以一本正經地會了。經過前面對空格的處理,此時最后面的空格一定也只存儲了一個,所以只需判斷第j-1個字符是否為空格就行了。如果是空格就進行覆蓋,不是就繼續存儲即可。

 

 接下來就是解決大小寫的問題了。這里要求把除了I’之外的所有大寫字母變為小寫。變為小寫的函數之前學了strlwr函數,上課老師也講了tolower函數。這都不是大問題。關鍵是需要判斷‘I’的條件。開始我是先將全部變為小寫,再遍歷將‘i’改為‘I’。而這樣做確是行不通的,因為題目是需要把原來本來為I’的字符保留不變,而現在卻是把所有的i’都變為了‘I因此,需要在改小寫時進行判斷是否為大寫字符且不為I’。

 

(如圖:並非所有的i都是I

 

對於剩下的三個要求,其實基本上就是同一類的問題的,同樣的道理,也就可以一起解決了。

沒聽課的時候,我自己還是如除去空格一樣的思路,就將原字符數組進行遍歷判斷修改后存進新的字符組中。而后來老師上課帶我們嘗試了直接判斷后輸出的方式,比起再建數組要更加簡潔明了。

主要的思路就是對字符串進行遍歷,看是否為題目所說的特殊條件,若是就進行特別輸出,不是就直接輸出。

當然這其中有很多細節要處理

1.對於是否獨立的問題,前面也已經給出,采用isalone函數進行判斷。只要前后都不是數字或者字母即為獨立。

 2.對於k-1k+1,等條件要關注是否越界的問題。

如當k0時,k-1就越界了。

 

 

說到這里,這道題總的思路就算是縷清了。其實細細分析了之后,也就沒那么迷茫了。明白了題目的要求,條件與條件之間的關系,解決問題的順序,使得思路更加地清晰明了。

通過解決對這道題的得到的收獲還是挺多的吧,我覺得解決問題最重要的是明白自己究竟想要干什么知道自己的目的,然后找到解體的方法,可能有多種,但通過對比也會發現某一種做法會更加的簡單明了。通過不斷對自己的思路和代碼的改進也是在進步。當然光有思路也是不行的,很多細節都要注意到往往出錯的也都是細節。

 

上一次的目標我應該算實現了一部分吧,之前寒假寫的推箱子的游戲中間有一個問題一直沒解決,就是關於換地圖的問題,需要讀取text的文件進行更改。網上查到的函數我一直不太明白如何正確使用。而上課的時候老師講了freopen函數(解決病毒問題中講到的)

我就對我的代碼修改了一下,也算解決了一個問題。上次說是想寫一個新的小游戲,沒實現,但解決了之前的問題也算還可以吧。

下一次的目標,我希望我可以掌握一下kmp算法以及將病毒的問題的程序學習一下並實踐一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM