1.本章學習總結
1.1 思維導圖
1.2 本章學習體會及代碼量學習體會
這一章的內容,可以說是學習c語言以來,最懵逼的一章的學習。結構體的知識,上課的時候聽不懂,還是在練習了幾道pta題目才有點了解,尤其是對結構體數組的應用,定義結構體后,如何把數據存入結構體數組中,在練習了題目,以及反復分析書上代碼,才知道了如何去存放。文件這一節,我剛開始學習的時候不知道它有什么作用,感覺他好像沒什么用處,學習的時候也覺得看上去好像非常簡單,就是開文件,對文件進行操作,關文件這幾個步驟。實際上運用起來感覺很麻煩,這次的大作業,也是問了好幾個同學,關於文件這方面的知識,還有參考書本上的東西,才完成的。過程可以說有點困難,但是后面還是大體上完成了。這次的作業讓我明白了書本的代碼的重要性,真的很多東西都可以學習書本,比如結構體數組的排序問題,書本上也有類似的代碼,文件用戶的檢驗問題,書本上也有,這2部分就解決了這次大作業最難的2部分,所以參考書本,這次的大作業其實也不怎么難完成。再者,我懂得要多問優秀同學,他們很多的東西都學的比我們好,分享他們的學習經驗,自己雖然可以簡化自己思考過程,但是剛剛開始的時候,如果不多請教,一個人懵懵懂懂的開始工作,效率會很低。我問了他們一些文件的知識,以及參考了他們在構建這個大作業的思路,本來我是想在處理排名的問題上,一個用戶寫完,就排一次,就寫入。問了幾個同學,他們都是先寫完所有的用戶,最后在處理排名,我想了下,后面這種方法,書上也好像有類似的對結構體數組的排序問題,所以就改變了我的排名處理方法。如果用一開始我的想法,可能這次大作業處理起來,沒這么順利了。
2.大作業
先把5個用戶存儲在文件中(沒有設計注冊新用戶的步驟)
2.1文件介紹:
1.頭文件:
介紹:
1.頭文件主要定義了結構體student,其中4個變量分別存儲用戶名,密碼,和訓練的題目量,還有練習的正確率,
2.還有定義了6個函數,每個函數的作用分別寫在了函數后面。
2.其他文件介紹
1.main.c文件
主函數中
1.定義了結構題數組。分別存放5個用戶的數據。
定義等級變量rank,用戶練習變量num,循環變量I,以及算術式數組exp;
2.設計思路:輸入用戶名,密碼,調用函數checkUsers,根據返回值1/0判斷用戶是否合法,不合法一直提醒用戶輸入。
輸入合法后,調Begin函數,生產友好界面,並提醒用戶輸入等級和練習數量,之后用戶輸入等級和練習題目數量。
把結構體的地址,算術式數組地址,等級,練習數量,傳入生成運算符,計算函數CreateExp中。
3.等所有用戶都完成練習后,調用Rank函數把上面所有的結構體數組中的數據進行排序。
4.最后把排序后的結構體調用一個printfRank函數,寫入文件中。
截圖:
2.userschcck.c文件
這個文件主要放了判斷用戶合法性和放了一個生成界面的函數。
判斷合法性函數參考書本:
1.定義3個字符數組,把輸入的用戶和密碼,分別存入,並且用函數去連接起來,
2.在把原來use文件中的用戶和密碼用fgets讀到一個字符數組中。
3.把這2個字符數組比較,相同就返回1;不同就說明用戶不合法,返回0;
截圖:
3.CreateExp.c文件
根據上次大作業生成運算符並且其中調用計算函數計算出結果,代碼都一樣沒有變化;
這次這個文件函數加了一步賦值:
把運算正確率,和練習的題目,存入結構體數組中,便於排序和寫入文件。
4.ComputeExp.c文件
代碼還是上次作業的代碼:
判斷是否為數字字符,是進行m語句的運算。
否則就一定是運算符,分情況進行運算。
截圖:
由於結果其余函數要用,所以設計了返回值,
5.writeRank.c文件
這個文件放了2個函數,排序函數,和把結果讀入文件中的函數;
排序函數主要運用選擇法,把之前存好的結構體數組的地址傳入,用選擇法根據正確率的大小排序。
讀入文件的函數:
定義文件指針,開文件,用循環fprintf寫入排序好的結構體數組。
截圖:
2.2.運行結果
登錄:判斷用戶合法性的運行截圖:
根據用戶文件用戶1對應的密碼是A,所以顯示不合法。要求重新輸入:
再次輸入1和A符合用戶和密碼,啟動運算軟件。
用戶1:
用戶2:
用戶3:
用戶4:
用戶5:
2.所有用戶運算結束,打開排名文件:
2.3改進大作業總結和碰到問題及解決辦法:
改進這次大作業,基本上對文件的處理有個大體的了解了,可以熟練的掌握了文件的讀寫,還學習到了檢驗用戶合法性,和結構體數組排序的方法,這2個種思路在處理結構體問題中,應該是比較常用。這次的大作業,還鞏固了我對結構體數組的認識,而且考驗了我對函數傳參數的認識,由於這次的代碼分了好幾塊,所以在處理上就必須考慮好每一塊之間的連接問題,就是函數的傳參數的問題。參數怎么傳,傳對了才可以連接好每一塊的代碼,在這個連接上,也是我這次處理大作業的最大困難。比如:
這個函數,我一開始是這樣傳:
試了很多遍,運行不了,我去問了同學,同學告訴我要這樣傳:
我就有點不解。我記得結構體數組明明是可以直接傳數組名,為啥這里要帶上&符號?
還有賦值這里,我一開始是想用過一個函數:把這幾個數據通過函數參數傳進去,從函數里面去賦值,但是在傳參數的時候又遇見了問題:
為什么這里又是傳s,不是&s。我很難理解,所以就直接取消了這個函數,直接在后面:
這樣也成功的把數據存到結構體了。
主要是這2個地方的連接,花了很長時間,其余的連接,還是很順利。排序函數,打印文件函數簡單的用結構體的數組名傳入就行。
2.小結
分裝文件,最主要的是連接問題,每個文件如何的接好,這個問題處理好,成功了一大半,這也是最難的。很多功能,由於一開始自己的能力有限,沒有去思考,希望這次作業后,對文件結構體有所了解的基礎上,以后的類似問題,能夠擴展一些不一樣的功能。