文件,結構體作業


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.小結

  分裝文件,最主要的是連接問題,每個文件如何的接好,這個問題處理好,成功了一大半,這也是最難的。很多功能,由於一開始自己的能力有限,沒有去思考,希望這次作業后,對文件結構體有所了解的基礎上,以后的類似問題,能夠擴展一些不一樣的功能。


免責聲明!

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



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