c語言課程設計個人財務管理系統(tǒng)_第1頁
c語言課程設計個人財務管理系統(tǒng)_第2頁
c語言課程設計個人財務管理系統(tǒng)_第3頁
c語言課程設計個人財務管理系統(tǒng)_第4頁
c語言課程設計個人財務管理系統(tǒng)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、個人財政支出管理付欣 05計算機四班指導老師:梁新元一、問題描述及分析1二、實驗程序設計思想及功能描述13、主要函數模塊的設計思想和具體實現2三、實驗程序測試41、程序開始執(zhí)行時系統(tǒng)的所顯示的頁面:42、選擇退出系統(tǒng):53、選擇登陸,并且輸入的帳號和密碼都正確:54、用戶輸入的帳號不正確:55、用戶輸入的帳號正確,密碼不正確:6四、實驗程序自我評價7五、課程設計創(chuàng)新7六、課程設計總結7七、參考書目:7八、實驗程序源代碼8一、問題描述及分析編寫一個個人財政支出管理系統(tǒng),主要解決的問題是作為一個系統(tǒng)而言,它所要面對不只是某一個人而言,而是要面對很多的用戶。那么想要解決這一問題,就必須要求這個系統(tǒng)能

2、夠存儲許多用戶的基本信息和記錄。同時也要求系統(tǒng)能夠對不同的用戶的身份進行查找和驗證。在驗證通過之后,在對其進行用戶所要求的操作。作為一個財政支出系統(tǒng),那么就要求對于用戶關于金錢的每一項操作都要有相應的記錄,同時并允許用戶對于每一條整體的記錄進行操作,例如可以根據時間來查找某一確定日期是否進行了收入或者支出的操作,也可以根據特定的需要來刪除某一條整體的記錄。但不允許對每條記錄的單項數據進行更改,因為不管是收入還是支出,所涉及的金額都是固定的,時間也是固定的,所以系統(tǒng)不允許用戶對其進行操作。除此之外,還必須有足夠大的空間來存儲新的記錄。所以此程序就是基于這個思想而編寫出來的,基本滿足了用戶對于一個

3、財政支出管理系統(tǒng)所要求的相關功能。二、實驗程序設計思想及功能描述根據前面對于編寫一個個人財政支出管理系統(tǒng)的程序的問題描述和分析,確定了此程序的基本思想和相關功能。1、 基本思想首先定義一個結構體數組,這個數組的功能便是用來所有用戶的所有信息。它的成員為每個用戶的帳號(account)、密碼(code)、姓名(name)、記錄(record recmax),以及記錄的條數(rec_len)。其中記錄(record recmax)這個成員本身也是一個結構體數組。它包含了用戶所有的記錄(record),并且根據用戶的操作,記錄這個成員變量也會有所跟改,例如如果擁護增加了一條記錄,那么這一條記錄就會存

4、儲在此成員變量中。除了這個成員變量是動態(tài)變化之外,記錄的條數(rec_len)也會根據用戶的操作進行變化,例如如果用戶增加了一條記錄,則rec_len就會自加1,如果用戶刪除了一條記錄,則rec_len就會自減1。記錄(record recmax)這個成員變量是以后函數中操作的主要內容。除了這兩個成員變量之外,其它的成員變量則不會被改變,系統(tǒng)只允許用戶對其進行訪問,但不允許進行操作,因為這幾個成員變量的作用主要是用來驗證用戶的身份用的,所以不可以更改。其中的密碼(code)甚至只能別系統(tǒng)調用,而不能對用戶進行顯示的,也就是說密碼(code)對于用戶是不可預知的,這樣做的目的是為了系統(tǒng)自身的安全

5、性,以免用戶的信息被其他人看到。這就是這個結構體數組的功能和基本成員變量及各個成員變量的功能。定義了結構體數組之后,首先要做的就是要把所有的記錄都存入這個結構體數組中,以方便用戶的操作。所以在main函數中有系統(tǒng)自行調用了old_record這個函數來存入信息。在此之后進行的操作便是讓用戶選擇所要進行的是登陸系統(tǒng)的操作還是退出系統(tǒng)的操作。如果選擇登陸,則要輸入帳號和密碼。之后由系統(tǒng)來檢查帳號的存在性和密碼的正確性。如果這兩項都通過了系統(tǒng)的檢查,那么用戶便可以進行具體記錄的操作了。這便是這個程序的基本設計思想。2、各個函數模塊的功能(1)old_record( ):此函數由系統(tǒng)自行調用,作用是將

6、所有用戶信息存入系統(tǒng)。(2)void save( ): 此函數的作用是將結構體數組中的信息寫入文件存儲,由系統(tǒng)調用。(3)load( ):此函數的作用是將結構體數組中寫入文件的信息讀出,由系統(tǒng)調用。(4)lookup_accounts( ):此函數的作用是將用戶輸入的帳號與系統(tǒng)中的所有帳號進行對比,查看系統(tǒng)中是否有此帳號。(5) check_code( ):此函數是作用是在系統(tǒng)查詢到了帳號之后,對用戶輸入的帳號和密碼進行檢驗,看是否相對應。(6)print_message( ):此函數的功能是在系統(tǒng)檢查了用戶輸入的帳號和密碼之后,如果用戶通過了系統(tǒng)的檢查,在此顯示用戶可見的基本信息。(7)fi

7、nd_record( ):此函數的作用是根據用戶輸入的日期進行查找操作。(8)insert_record( ):此函數的功能是在記錄中增加一條新的記錄,這個記錄由用戶輸入。(9)del_record( ):此函數的功能是根據用戶的輸入的位置,將相應位置的記錄刪除。(10)sum_num( ):此函數的功能是計算所有收入和支出的總和,計算全部的收入的總合,計算全部輸出的總合。(11)打印輸出記錄的函數:在本程序中一共有三個打印輸出記錄的函數,分別為all_print( )、acc_print( )、pay_print( )這三個函數。它們的功能依次是打印輸出全部記錄,打印輸出輸入記錄,打印輸出支

8、出記錄。(12)mian( ):在主函數中,可以根據用戶的選擇來操作系統(tǒng)允許用戶使用的功能,也可以隨時退出這個系統(tǒng)。3、主要函數模塊的設計思想和具體實現(1)void save( )函數 和load( )函數。這兩個函數的功能是在系統(tǒng)調用了old_record( )這個函數之后,結構體內就有了所有用戶的所有信息。save( )函數的作用是將所有的信息都存入文件中,便于數據的保存和讀取。load( )函數的作用則是把存入的文件中的信息讀出來。這兩個函數所涉及的知識點為文件的讀入和寫出。主要是freadhe和fwrite兩個函數的應用。它們的一般調用形式為:fread(buffer,size,co

9、unt,fp);fwrite(buffer,size ,count,fp);其中:buffer:是一個指針,對fread來說,它是讀入數據的存放地址。對fwrite來說,是要輸出數據的地址。size:要讀寫的字節(jié)數。count:要進行讀寫多少個size字節(jié)的數據項。fp;文件型指針。調用這兩個函數之后,如果調用成功,則函數返回值為count的值,即輸入或輸出數據項的完整個數。(2)lookup_accounts( )函數和 check_code( )函數:這兩個函數的功能主要是用來核對用戶的身份。系統(tǒng)先檢驗的是axxounts這個函數。根據用戶輸入的帳號與系統(tǒng)中所有的帳號進行比較,查找看是否有

10、相同的。如果找到了,則進行對密碼進行檢驗,看密碼與帳號是否對應。在檢驗帳號的時候,如果用戶輸入的帳號在系統(tǒng)中不存在,系統(tǒng)則會給出提示要求用戶從新輸入。但如果用戶輸入了三次體統(tǒng)都找不到帳號的時候,系統(tǒng)則會強制要求用戶退出系統(tǒng),此時則顯示結束語的歡迎詞。而如果帳號找到了,但用戶輸入的密碼與原有密碼不一致,系統(tǒng)也會給出提示信息要求用戶再次輸入。同樣的,如果用戶輸入三次體統(tǒng)都檢驗到不是正確的密碼的時候,系統(tǒng)則會強制要求用戶退出系統(tǒng),此時則顯示結束語的歡迎詞。在這兩個函數中主要用到的知識點就是對字符串的相關操作。如果帳號和密碼都通過檢驗之后,此函數則將返回struct list_record類型的數據。

11、字符串處理的函數主要有以下幾個:puts函數:其一般形式為puts(字符數組)。其作用是將一個字符串輸出到終端。gets函數:其一般形式為gets (字符數組)。其作用是從終端輸入一個字符串到字符數組,并且得到一個函數值。該函數值是字符數組的起始地址。stract函數:其一般形式為strcat(字符數組1,字符數組2)。strcat是字符串連接的縮寫。其作用是連接兩個字符數組中的字符串,把字符串2接到字符串1的后面,結果放在字符數組1 中,函數調用后得到一個函數值字符數組1的地址。strcpy函數:其一般形式為strcpy(字符數組1,字符數組2)。strcpy是字符串復制的簡寫。它的作用是將

12、字符串2復制到字符數組1中去。在本程序中。用到的最多的便是此函數。strcmp 函數:其一般形式為strcmp(字符串1,字符串2)。strcmp是字符串比較的縮寫。它的作用是比較字符串1和字符串2,比較的結果有函數值帶回。如果字符串1=字符串2,則函數值為0;如果字符串1大于字符串2,則函數值為一個正整數,否則則為負整數。(3)find_record( )函數:此函數的功能是根據用戶輸入的時間查找當天的記錄。這個函數的參數為一個指向結構體的指針和一個字符串。字符串是用語輸入的日期,指向結構體的指針指向的則是用戶輸入的帳號的這個結構體。如果找到了用戶輸入的日期,則輸出當天的所以記錄。如果找不到

13、,則顯示無此日的記錄。(4)insert_record( )函數和del_record( )函數:這兩個函數的功能是增加新的記錄和刪除用戶指定的記錄。在insert_record( )函數中,此函數的參數是一個指向struct list_record的指針和一個指向struct record的指針還有一個選擇插入位置的整形變量。在主函數中,先定義一個struct record的結構體。這個結構體的內容是由用戶輸入的,也就是用戶所要向struct list_record這個結構體中輸入的新的記錄的內容。然后再在主函數中定義一個指向struct record結構體的指針,并指向已經輸入記錄的結構體

14、,最后將此指針作為實參傳入函數。由于向函數中傳如是指針,所以在函數中記錄更改之后,返回主函數的是更改后的記錄。在del_record( )函數中,有用戶在主函數中輸入要刪除的記錄的位置,然后調用此函數,那么就會執(zhí)行刪除該記錄的操作。與insert_record函數一樣,參數傳遞的也是指針,所以在函數中更改的記錄,返回主函數后依舊是更改后的記錄。(5)sum_num( )函數:此函數的功能是用來計算用戶所有記錄中的錢數的總和,以方便用戶對于系統(tǒng)的操作,同時也可以使用戶對自己的帳戶有更深入的了解。除此之外,該函數還能會對用戶所有的收入和所有的支出進行求和,使用戶能夠知道自己的所有的收入的總和和所有

15、支出的總和,這樣也方便了用戶進行下一步的操作。(6)打印輸出函數: 在此程序中,打印輸出函數共有三個,分別是輸出全部記錄,輸出收入記錄和輸出支出記錄。在這里定義三個輸出函數是為了方便用戶能夠更容易的進行操作。假設只有一個輸出全部記錄的函數,那么如果用戶只想查看收入的記錄或者支出的記錄,此時用戶只能自己一條一條的去查看,這樣就會讓用戶感到不方便。一個良好的管理系統(tǒng)的目的就是能盡可能的滿足用戶的所有需要,分工越是精確越好,所以為了滿足此項要求,在此定義了三個輸出函數。(7)main( )函數:在一個程序中,main( )函數是最為重要的一個函數,因為它是所有程序執(zhí)行的入口。同時函數也是以main(

16、 )函數的結束作為結束的,由此可見main( )函數的重要性。在本程序中,所以的功能模塊函數都是在main( )函數中調用的,這樣做的目的是為了是整個程序的結構簡單緊湊,同時也是為了程序的調試方便。但這樣也就相對的增加了main( )函數的復雜性。在本程序中,main( )函數中涉及的語法知識包括循環(huán)的嵌套使用,分之結構的嵌套使用,指針的應用,指向結構體指針的應用等許多語法結構。因為main( )函數在本程序中有著至關重要的作用,所以在此詳細說明。在程序開始執(zhí)行之后,首先由用戶來選擇是要登陸系統(tǒng)還是要推出系統(tǒng)。如果是退出系統(tǒng),那么程序便會結束。如果選擇登陸,那么系統(tǒng)便會要求用戶輸入帳號和密碼。

17、系統(tǒng)先會對帳號進行檢查,如果檢查通過了,則要對密碼進行檢查,如果通過了,則會顯示用戶信息,同時也允許用戶對記錄進行操作,而所有的操作都是由用戶自行隨意選擇的,直到用戶選擇退出系統(tǒng)之后,程序便會結束。這是在用戶輸入的帳號和密碼都通過檢查的情況。如果帳號沒有通過檢查,系統(tǒng)便會要求用戶重新輸入,然后系統(tǒng)再對其進行檢查,通過了就繼續(xù),通不過則還要重新輸入,但用戶輸入帳號的次數最多只有三次。三次之后,系統(tǒng)變會自行推出。如果帳號通過了檢查,而密碼沒有通過,那么系統(tǒng)也會要求用戶重新輸入,同樣輸入的次數不會超過三次,否則系統(tǒng)便會自行退出。這便是main( )函數的具體設計思想和具體的功能的描述。三、實驗程序測

18、試1、程序開始執(zhí)行時系統(tǒng)的所顯示的頁面:2、選擇退出系統(tǒng):3、選擇登陸,并且輸入的帳號和密碼都正確:4、用戶輸入的帳號不正確:5、用戶輸入的帳號正確,密碼不正確:6、用戶進行具體操作:四、實驗程序自我評價在這個程序中,我認為我已經完成了所要求的基本操作,同時也增加了相應的功能模塊來讓用戶操作。設計的基本原則就是盡可能的滿足用戶的所有要求,同時也能盡可能方便的使用戶對系統(tǒng)進行操作。雖然這個程序可能還有不足之處,但我對于這個程序還是比較滿意的。五、課程設計創(chuàng)新本程序主要模仿是是銀行的atm機的相關功能,除此之外,還增加了允許用戶對于記錄的一些操作。而不是只允許用戶進行查看,這樣就增加了系統(tǒng)的靈活性

19、。六、課程設計總結本程序在編寫是,主要就是基于用戶的角度去分析該如何設計此程序,和編寫功能模塊的。在編寫程序時,所有的數據都是對結構體進行的操作,在此過程中,我發(fā)現了自己在對指針操作的時候,尤其是對指向結構體數組的指針和指向結構體的指針的操作都不夠熟練。但在編寫完此程序之后,我感覺自己對語法的應用有了明顯的提高。七、參考書目:1、c程序設計(第三版) 譚浩強 清華大學出版社2、數據結構(c語言版)譚浩強 清華大學出版社3、程序設計基礎(c語言版) 龍昭華 王玉柱 重慶大學出版社八、實驗程序源代碼#include#include#define null 0#define max 20#defin

20、e ok 1 struct record char date20; char operate20; int num; struct list_record char account20; char code20; char name20; int rec_len; struct record recmax;rmax; /系統(tǒng)原有數據,用戶不可知int old_record( struct list_record r) int i; for(i=0;i3;i+) ri.rec_len=4; strcpy(r0.account,1001); strcpy(r1.account,1002); str

21、cpy(r2.account,1003); strcpy(r0.code,111111); strcpy(r1.code,222222); strcpy(r2.code,333333); strcpy( ,wang); strcpy( ,li); strcpy( ,zhang); strcpy(r0.rec0.date,07-01-01); strcpy(r0.rec1.date,07-02-01); strcpy(r0.rec2.date,07-03-01); strcpy(r0.rec3.date,07-04-01); strcpy(r1.rec0

22、.date,07-01-02); strcpy(r1.rec1.date,07-02-02); strcpy(r1.rec2.date,07-03-02); strcpy(r1.rec3.date,07-04-02); strcpy(r2.rec0.date,07-01-03); strcpy(r2.rec1.date,07-02-03); strcpy(r2.rec2.date,07-03-03); strcpy(r2.rec3.date,07-04-03); strcpy(r0.rec0.operate,in); strcpy(r0.rec1.operate,out); strcpy(r0

23、.rec2.operate,in); strcpy(r0.rec3.operate,out); strcpy(r1.rec0.operate,out); strcpy(r1.rec1.operate,in); strcpy(r1.rec2.operate,out); strcpy(r1.rec3.operate,in); strcpy(r2.rec0.operate,in); strcpy(r2.rec1.operate,out); strcpy(r2.rec2.operate,in); strcpy(r2.rec3.operate,out); r0.rec0.num=3000; r0.rec

24、1.num=-1500; r0.rec2.num=2500; r0.rec3.num=-1000; r1.rec0.num=-3000; r1.rec1.num=5000; r1.rec2.num=-1000; r1.rec2.num=2000; r2.rec0.num=1000; r2.rec1.num=-1500; r2.rec2.num=3000; r2.rec2.num=-500; return ok;/將數據寫入文件void save( )file *fp; int i; if(fp=fopen(wenjian,wb)=null) printf(can not open the fi

25、le.n); return; for(i=0;imax;i+) if(fwrite(&ri,sizeof(struct list_record),1,fp)!=1) printf(file write error.n); fclose(fp);/文件讀出void load( )file *fp; int i; if(fp=fopen(wenjian,rb)=null) printf(can not open infile.n); return; for(i=0;imax;i+) if(fread(&ri,sizeof(struct list_record),1,fp)!=1) if(feof(

26、fp) (fclose(fp); return; fclose(fp);/將用戶輸入的帳號與系統(tǒng)中原有帳號比較,查找用戶帳號int lookup_accounts( struct list_record r,char acc) int i; for(i=0;i3;i+) if(strcmp(ri.account,acc)=0) return ok; printf(帳號不存在,請重新輸入!n); return null; /檢查密碼函數 struct list_record check_code(struct list_record r,char acc,char c) int i; struc

27、t list_record a; strcpy(a.account,0); strcpy(a.code,0); a.rec_len=0; for(i=0;ia.rec_len;i+) strcpy(a.reci.date,0); strcpy(a.reci.operate,0); a.reci.num=0; for(i=0;iname); printf(帳號:%sn,(*p).account); /根據用戶輸入的日期,查找記錄int find_record( struct list_record *p,char d) int i; for(i=0;i(*p).rec_len;i+) if(st

28、rcmp(*p).reci.date,d)=0) printf(date operate moneyn); printf(%s ,(*p).reci.date); printf(%s ,(*p).reci.operate); printf(%d n,(*p).reci.num); return ok; if(i=(*p).rec_len) printf(the date is not exit!n); return null; /插入函數,根據用戶輸入的信息,增加記錄int insert_record( struct list_record *p,struct record *p1,int l

29、op) int i; if(lop(*p).rec_len+1) printf(the position is wrong.n); return 0; else for(i=(*p).rec_len;ilop-1;i-) strcpy(*p).reci.date,(*p).reci-1.date); strcpy(*p).reci.operate,(*p).reci-1.operate); (*p).reci.num=(*p).reci-1.num; strcpy(p-reci.date,p1-date); strcpy(*p).reci.operate,(*p1).operate); (*p

30、).reci.num=(*p1).num; (*p).rec_len+; return ok;/ 刪除記錄函數int del_record( struct list_record *p,int lop2) int i; if(lop2(*p).rec_len) printf(the position is wrong.n); return null; else for(i=lop2-1;i(*p).rec_len-1;i+) strcpy(*p).reci.date,(*p).reci+1.date); strcpy(*p).reci.operate,(*p).reci+1.operate);

31、 (*p).reci.num=(*p).reci+1.num; (*p).rec_len-; return ok; /輸出全部記錄函數 void all_print( struct list_record *p) int i; printf(date operate numn); for(i=0;i(*p).rec_len;i+) printf(%s ,(*p).reci.date); printf(%s ,(*p).reci.operate); printf(%d ,(*p).reci.num); printf(n); /計算總的錢數int sum_num( struct list_reco

32、rd *p) int i; int sum=0; int sum_in=0; int sum_out=0; for(i=0;i0) sum_in+=(*p).reci.num; if(*p).reci.num0) sum_out+=(*p).reci.num; printf(總金額為: %dn,sum); printf(總收入為: %dn,sum_in); printf(總支出為: %dn,sum_out); return ok;/輸出收入記錄int acc_print( struct list_record *p) int i; int sum_acc=0; printf(date oper

33、ate numn); for(i=0;i0) sum_acc+=(*p).reci.num; printf(%s ,(*p).reci.date); printf(%s ,(*p).reci.operate);printf(%d ,(*p).reci.num); printf(n); printf(總收入金額為: %dn,sum_acc); return ok; if(sum_acc=0) printf(there is no account.n); return null;/輸出支出記錄 int pay_print( struct list_record *p)int i; int sum_pay=0; printf(date operate numn); for(i=0;irec_len;i+) if(*p).reci.num0) sum_pay+=(*p).reci.num; printf(%s ,(*p).reci.date); printf(%s ,(*p).reci.operate);printf(%d ,(*p).reci.num); printf(n); printf(總的支出為: %dn,sum_pay); return ok; if(sum_pay=0) printf(there is no payout.n);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論