1、简易股票投资管理系统882020年5月29日文档仅供参考 組長 : 89214020 潘國成組員 : 88214028 簡維新 88214034 王宏民 88214040 童世遠 簡易股票投資管理系統一 系統功能、輸入與輸出的資料: 在台灣股市可為全民運動,加上現今投資理財的風氣十分盛行,股票市場幾乎是最大規模的資本市場,記錄股票的賣出買入及損益,若無電腦輔助可謂事倍功半,費心費力,因此我們這次的作業作的就是股票管理系統,幫助投資人處理惱人的資料和紀錄過去的交易狀況,並且可在系統上知道最新的股市資訊,還可立即計算當時的資產變動情況,損益和報酬。本系統採用會員制度,會員可享用完整的功能,非會員也
2、擁有查詢股市的功能,十分的方便。這個系統包含以下幾種的基本功能:查詢: 查詢方面,提供使用者查詢個股資訊,並能够細部查詢個股之詳細資料。可供查詢之項目分別為:股票代碼、股票名稱、股票價格、股本、EPS、本益比、每股淨值。另外也提供了以上名詞的簡易解釋,有助於使用者在基本面的選股判斷。管理: 管理方面,可提供使用者紀錄各項交易記錄。透過儲存之交易檔案,能够為使用者整合多項資訊。如:已實現損益、未實現損益、股票購入歷史價格、買賣張數、買賣價格等。幫助使用者瞭解投資之狀況,以評估未來之投資決策。以下列出系統所處理的輸入及輸出檔案介紹及欄位說明:程式所需輸入之資料檔案如下:1. 股票資訊檔:stock
3、.log(程式預設數量20)股票的資訊檔案。包含下例欄位: 股票代碼:證交所每支股票都有其編號,以方便交易。 股票名稱 價格 股本 :每股稅後盈餘 本益比 每股淨值:例 :含有3筆資料的股票資訊檔代碼 名稱 (某日)現價 股本 EPS(估) 每股淨值1101 台泥 10.65 249.2 0.7 18.171216統一 9.85 344.2 0.4 12.111301臺塑 44.6 453.4 2.63 22.072. 會員資料檔:club.txt(程式預設數量2)提供系統執行身份認證時,檢查會員之帳號、密碼。Id 姓名 密碼88214040童小遠 123488214034王小民 5678-1
4、unused -1-1unused -1-1unused -1程式輸出之資料檔案如下:(僅會員擁有)1. 個人投資組合(主要用來計算損益):my_pfo1.txt, my_pfo2.txt記錄了投資組合種類個數、股票代碼、股票名稱、擁有張數、歷史平均價格、現價、個股之買進價格、已實現損益。(程式預設數量20)2. 個人交易記錄(主要用來記錄交易狀況):trade1.txt,trade2.txt個人所有之交易記錄。包括:交易個數、股票代碼、股票名稱、買進張數、買進價格、賣出張數、賣出價格。 (程式預設數量100)二、 應用層面說明 此系統除了可運用在個人股票的管理外,還能够運用在入口網站會員的自
5、選股票交易管理上,用來記錄大量的會員股市交易和損益。三 、 資料結構說明 在程式當中我們使用了4種資料結構(data structure);1. 股票的資料結構(STOCKINFO),用來儲存股票的資料。股票資料(STOCKINFO)欄位意義欄位名稱股票代碼int code股票名稱char name80價格float price股本float equityEPSfloat EPS本益比int ratio每股淨額char netvalue102. 會員的資料結構會員資料(CLUB)欄位意義欄位名稱會員idint code會員名稱char name80會員密碼float price3. 會員手中持
6、有投資組合結構(PORTFOLIO)。 投資組合結構(PORTFOLIO)欄位意義欄位名稱股票代碼int code股票名稱char name80張數int mount買入歷史平均價float price_avg個股現價float price_now買入的價格float price_buy504. 交易記錄的資料結構檔(REPORT):用來存放每次交易的資料。交易記錄(REPORT)欄位意義欄位名稱股票代碼int code股票名稱char name80買入張數int mount_buy買入價格loat price_buy賣出張數int mount_sell賣出價格float price_sell
7、三、 程式說明 寫在前頭、重要須知:此程式有幾點需要事先說明,有助於對程式的瞭解。第一:此程式的stock.log檔必須隨著時間每日更新,特别是股票(stockinfo)的現價欄,如此一來在計算未實現損益時方才有意義。第二:此程式計算損益上,暫時不考慮證券交易稅以及買賣的手續費,主要因為手續費會隨著交易券商的規定而有所改變.。第三:在計算損益上,會計學上有三種法則:先進先出法、後進先出法、平均成本法,而我們程式所採用的是較為折衷的平均成本法,也就是說當時間點不同,有重複買進單一個股的紀錄時,程式會記錄下買進的價格,利用買進的價格來計算買進歷史平均價,而當有賣出動作時,則計算賣出價格與歷史平均價
8、之間的差價來作為損益的計算。第四:關於買賣股票的最小單位為1張,而1張為1000股,假設買進A股票面額10元,實際所付出的成本為10000元,又假設賣出價格為11元,則實收金額為11000元,也就是賺了1000元的差價。 1主程式 main(). 說明:先載入股票的資料檔,和會員的個人資料檔,最後依據使用者的選項做相對應的動作 參數 :無 傳回值:無 流程圖 :管理者部分輸入管理者密碼輸入選項密碼8888 ?NO離開程式AddQuitDel使用者部分副程式 user_exam :檢驗會員id 與 password通過檢驗則會傳回 會員id值副程式 user_main :根據會員id值開啟其個人
9、記錄檔,並帶入選單之中離開程式guest部分副程式 view_info:查詢股票資訊離開程式程式碼部分main()/*FILE*/FILE *stock_file;FILE *club_file; /*定義四大arrry*/struct STOCKINFO stockSTOCK_NUM+1;struct PORTFOLIO my_pfoPFO_NUM+1;struct REPORT tradeTRADE_NUM+1;struct CLUB clubsCLUB_NUM+1;char choice; /主選單之選項int pwd; /輸入選項用_passwordint user_id;/輸入選項用
10、_user_id/*open stock file*/if(stock_file = fopen(stock.log, r)load_stock(stock,stock_file);/呼叫副程式:讀入股票檔內容elseprintf(無法開啟股票資料檔,程式終結!n);exit(1); /離開程式fclose(stock_file); /關閉讀檔/*open club file*/if(club_file=fopen(club.txt,r)load_club(clubs,club_file);/呼叫副程式:讀入會員檔內容elseprintf(無法開啟會員資料檔,程式終結!n);exit(1);
11、fclose(club_file); /關閉讀檔printf(=);printf(n);printf( 歡迎使用簡易個人股票管理系統 ); printf(n);printf(請選擇登入身分 1.系統管理員 2.會員 3.guest );printf(n);printf(請選擇);scanf(%c,&choice); /輸入選項switch(choice)case 1:printf(請輸入管理者passward:);fflush(stdin);scanf(%d,&pwd);if(pwd=8888)/預設管理者password = 8888manager_main(); /呼叫副程式manager
12、_mainelseprintf(密碼輸入錯誤!請輸入正確密碼n);break;case 2:user_id=user_exam(clubs); /呼叫副程式 user_examuser_main(user_id,stock,my_pfo,trade); /呼叫副程式 user_amin break;case 3: printf(歡迎使用此系統,請繼續n); view_info(stock); /呼叫副程式 view_info break; default: printf(無效的選項n);break; 2. 副程式 manager_main (管理者主要功能區)void manager_main
13、()char choice; /輸入選項之用printf(管理者順利登入);printf(n);printf(=main menu=); printf(n);printf( a. 新增會員);printf(n); printf( d. 刪除會員);printf(n);printf( q. 儲存資料並跳出);printf(n);printf(=);printf(n);printf(請選擇);fflush(stdin); /清空緩衝區 scanf(%c,&choice); /輸入選項switch(choice) case a: for(i=1;i); scanf(%d,&id); result=s
14、earch_club(clubs,id); if(result!=-1) printf(會員ID重複輸入,新增失敗,請重新登入n); exit(1); else clubsi.id=id; printf(請輸入新增會員的姓名:); scanf(%s,&clubsi.name); printf(請輸入新增會員的密碼:); scanf(%d,&clubsi.pwd); break; save_club(clubs);/呼叫副程式:儲存結果 break; case d: printf(請輸入欲刪除會員ID:); fflush(stdin); scanf(%d,&id); printf(n); res
15、ult=search_club(clubs,id); /呼叫副程式:查詢是否在會員名單中,正確傳回該index if(result=-1) printf(會員ID輸入錯誤,請重新執行n); exit(1); else clubsresult.id=-1; save_club(clubs);/呼叫副程式:儲存結果 break;default: printf(無效的選項n);break; user_exam(檢驗會員ID,密碼)int user_exam(struct CLUB clubs)int i;int id,passwd; /輸入選項用int result; /儲存search副程式傳回值
16、printf(請輸入會員ID:); scanf(%d,&id); printf(n); result=search_club(clubs,id); /呼叫副程式:檢驗該id是否為會員 if(result= -1) printf(錯誤的會員IDn); /會員id輸入錯誤 exit(1); else for(i=1;i);scanf(%d,&passwd);if (passwd=clubsresult.pwd) /密碼登入正確printf(n會員順利登入,請繼續使用n);return result; /傳回會員index printf(登入錯誤超過3次,請重新登入n); exit(1); user
17、_main (為使用者介面主要核心)副程式開啟開啟會員投資組合檔,交易記錄檔輸入選項Save_portfolioSave_tradeprint_portfolioview_infoprint_stockPrint_portfolioPrint_tradetrade_selltrade_buyvoid user_main(int index,struct STOCKINFO stock,struct PORTFOLIO my_pfo,struct REPORT trade)FILE *pfo_file; /開啟投資組合記錄檔FILE *trade_file; /開啟交易記錄檔int profit
18、_pre;/重要數值_紀錄未實現損益char choice; /輸入選項用if(index=1)/*開啟投資組合檔*/if(pfo_file = fopen(pfo1.txt, r)rec_pfo=load_pfo(my_pfo,pfo_file)/呼叫副程式:loadelsepfo_file = fopen(pfo1.txt, w);/開一新檔案rec_pfo=0;/投資組合種類初始值=0profit_real=0;/已實現損益初始值=0fclose(pfo_file);/關閉讀檔/*開啟交易記錄檔*/if(trade_file = fopen(trade1.txt, r)rec_trade
19、=load_trade(trade,trade_file);/呼叫副程式elsetrade_file = fopen(trade1.txt, w);/開一新檔案rec_trade=0;/投資組合種類初始值=0fclose(trade_file);/關閉讀檔while (1)printf(=主選單=);printf(n); printf(=);printf(n);printf(v. 觀看個股資訊);printf(n);printf(b. 紀錄買進個股);printf(n);printf(s. 紀錄賣出個股);printf(n);printf(l. 列出買賣紀錄資料);printf(n);prin
20、tf(q. 儲存結果並結束);printf(n);printf(=);printf(n);printf(請選擇 );fflush(stdin); /清除之前輸入殘留值scanf(%c, &choice);/讀入輸入值printf(n);switch(choice)case v:view_info(stock);/副程式:觀看個股資訊break; case b:print_stock(stock);/副程式:印出基本個股資訊trade_buy(stock,my_pfo,trade);/副程式:記錄買進行為break;case s:print_portfolio(my_pfo);/副程式:印出手中
21、持有投資組合trade_sell(stock,my_pfo,trade);/副程式:記錄賣出行為break; case l:profit_pre=calculate_pfo(my_pfo);/副程式:計算未實現損益printf(列印投資組合結果t列印交易記錄結果n請選擇);fflush(stdin);scanf(%c,&choice);printf(n);switch(choice)case p:print_portfolio(my_pfo); /副程式:印出持有投資組合printf(未實現損益=%dt,profit_pre);printf(已實現損益=%dn,profit_real);ffl
22、ush(stdin);Pause();break;case t:print_trade(trade); /副程式:印出交易記錄break;default:printf(無效的選項n);break;break;case q:/*儲存投資組合結果*/save_portfolio(my_pfo,index);/*儲存交易記錄結果*/save_trade(trade,index);/*結束程式*/exit(1); default:printf(無效的選項n);break; trade_buy 說明:紀錄買入股票的資料。 參數: struct STOCKINFO stock:儲存資料的陣列。 struc
23、t PORTFOLIO my_pfo:儲存資料的陣列。 struct REPORT trade:儲存資料的陣列。 傳回值:無 流程圖: trade_sell() 說明:紀錄賣出股票的資料。 參數: struct STOCKINFO stock:儲存資料的陣列。 struct PORTFOLIO my_pfo:儲存資料的陣列。 struct REPORT trade:儲存資料的陣列。 傳回值:無 流程圖: 【Load】副程式程式功能說明參數傳回值void load_stock載入股票資料struct STOCKINFO stock:儲存資料的陣列FILE *fp:儲存資料的檔案無void loa
24、d_club載入會員資料struct CLUB clubs:儲存資料的陣列FILE *fp:儲存資料的檔案int load_pfo載入投資組合資料struct PORTFOLIO my_pfo:儲存資料的陣列FILE *fp:儲存資料的檔案投資組合種類個數Int load_trade載入交易紀錄資料。struct REPORT trade:儲存資料的陣列FILE *fp:儲存資料的檔案交易記錄個數程式碼:在此僅舉int load_trade為例,其它程式與其類似int load_trade(struct REPORT trade,FILE *fp)int i;int num; /記錄用_交易個
25、數fscanf(fp,%d,&num);/讀入交易記錄個數for(i=1 ; i=num ;i+ ) /依序從檔案讀入資料fscanf(fp,%d,&tradei.code);fscanf(fp,%s,&tradei.name);fscanf(fp,%d,&tradei.mount_buy);fscanf(fp,%f,&tradei.price_buy);fscanf(fp,%d,&tradei.mount_sell);fscanf(fp,%f,&tradei.price_sell);return num;/傳回交易記錄個數 【Search】.副程式程式功能說明參數傳回值Int search_
26、stock搜尋股票資料struct STOCKINFO stock:儲存資料的陣列int choice:欲被搜尋的資料搜尋正確,則傳回該輸入代碼之pointer,搜尋不到該代碼,傳回-1int search_club搜尋會員資料struct CLUB clubs:儲存資料的陣列int choice:欲被搜尋的資料(同上)int search_pfo搜尋投資組合內的股票資料struct PORTFOLIO my_pfo:儲存資料的陣列int choice:欲被搜尋的資料(同上)程式碼:在此僅舉int search_stock為例,其它程式與其類似int search_stock(struct S
27、TOCKINFO stock,int choice)int i;for(i=1 ;i=STOCK_NUM ;i+ )if(stocki.code=choice)return i;/搜尋正確,則傳回該輸入代碼之pointerreturn -1;/搜尋不到該代碼,傳回-1 【Print】副程式程式功能說明參數傳回值view_info()列印個股詳細資料struct STOCKINFO stock:儲存資料的陣列無print_stock()列印個股基本資訊struct STOCKINFO stock:儲存資料的陣列無print_portfolio( )列印投資組合struct PORTFOLIO m
28、y_pfo:儲存資料的陣列無print_trade( )列印交易記錄struct REPORT trade:儲存資料的陣列無程式碼:在此僅舉print_stock為例,其它程式與其類似void print_stock(struct STOCKINFO stock)/列印個股基本資訊int i;printf(代碼t名稱t代碼t名稱t代碼t名稱t代碼t名稱n);for(i=1 ; i=STOCK_NUM ;i+ )printf(%dt,stocki.code); /列印代碼printf(%st,stocki.name); /列印名稱if (i%4)=0)/檢查i4的餘數是否為0printf(n);
29、/假如其餘數為0,則斷行printf(n);流程圖:在此僅舉view_info(),此為查詢的主要功能 【Save】副程式程式功能說明參數傳回值save_portfolio( )儲存投資組合紀錄struct REPORT trade:儲存資料的陣列int index:無save_trade( )儲存交易記錄struct REPORT trade:儲存資料的陣列int index:程式碼void save_portfolio(struct PORTFOLIO my_pfo,int index)/儲存手中持有投資組合FILE *pfo_file;int i,j;if (index=1) /假如會員
30、id為1pfo_file = fopen(pfo1.txt, w); /則開啟pfo1.txt來儲存else if (index=2) /假如會員id為2pfo_file = fopen(pfo1.txt, w); /則開啟pfo2.txt來儲存fprintf(pfo_file,%dn,rec_pfo);/儲存投資組合種類個數for(i=1 ; i=rec_pfo ;i+ )fprintf(pfo_file,%dt,my_pfoi.code); /儲存代碼fprintf(pfo_file,%st,my_pfoi.name); /儲存名稱fprintf(pfo_file,%dt,my_pfoi.
31、mount); /儲存張數fprintf(pfo_file,%ft,my_pfoi.price_avg); /儲存買進歷史平均價fprintf(pfo_file,%.2fn,my_pfoi.price_now); /儲存現價for(j=1;j=my_pfoi.mount;j+)fprintf(pfo_file,%.2f ,my_pfoi.price_buyj); /根據張數,逐一儲存買進價格fprintf(pfo_file,n);fprintf(pfo_file,%dn,profit_real);/儲存已實現損益fprintf(pfo_file,n);fclose(pfo_file); /關閉
32、檔案 【其它】int calculate_pfo(struct PORTFOLIO my_pfo)程式功能:計算未實現損益主要計算公式:(現價-歷史平均價)*張數*1000參數:struct PORTFOLIO my_pfo傳回值:temp_sum加總後之值程式碼:int calculate_pfo(struct PORTFOLIO my_pfo)/計算未實現投資損益int i;int temp_sum=0;/temp用_加總for(i=1 ; i=rec_pfo ;i+ )temp_sum=temp_sum+(my_pfoi.price_now-my_pfoi.price_avg)*my_pfoi.mount*1000;/(現價-平均價)*張數*1000return temp_sum;/傳回加總後之值char Pause();程式功能:按下繼續程式碼:char Pause()char c;printf(n按繼續.);scanf(%c,&c);while(c!=n)/若不是按下Enter,而按下其它鍵,則傳回該鍵return c;/唯有按下Enter