简易股票投资管理系统说明_第1页
简易股票投资管理系统说明_第2页
简易股票投资管理系统说明_第3页
简易股票投资管理系统说明_第4页
简易股票投资管理系统说明_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

年4月19日简易股票投资管理系统说明文档仅供参考組長:89214020潘國成組員:88214028簡維新88214034王宏民88214040童世遠簡易股票投資管理系統

一系統功能、輸入與輸出的資料:在台灣股市可為全民運動,加上現今投資理財的風氣十分盛行,股票市場幾乎是最大規模的資本市場,記錄股票的賣出買入及損益,若無電腦輔助可謂事倍功半,費心費力,因此我們這次的作業作的就是股票管理系統,幫助投資人處理惱人的資料和紀錄過去的交易狀況,並且可在系統上知道最新的股市資訊,還可立即計算當時的資產變動情況,損益和報酬。本系統採用會員制度,會員可享用完整的功能,非會員也擁有查詢股市的功能,十分的方便。這個系統包含以下幾種的基本功能:查詢:查詢方面,提供使用者查詢個股資訊,並能够細部查詢個股之詳細資料。可供查詢之項目分別為:股票代碼、股票名稱、股票價格、股本、EPS、本益比、每股淨值。另外也提供了以上名詞的簡易解釋,有助於使用者在基本面的選股判斷。管理:管理方面,可提供使用者紀錄各項交易記錄。透過儲存之交易檔案,能够為使用者整合多項資訊。如:已實現損益、未實現損益、股票購入歷史價格、買賣張數、買賣價格等。幫助使用者瞭解投資之狀況,以評估未來之投資決策。以下列出系統所處理的輸入及輸出檔案介紹及欄位說明:程式所需輸入之資料檔案如下:股票資訊檔:stock.log (程式預設數量20)股票的資訊檔案。包含下例欄位:股票代碼:證交所每支股票都有其編號,以方便交易。股票名稱價格股本EPS:每股稅後盈餘本益比每股淨值:例:含有3筆資料的股票資訊檔代碼名稱(某日)現價股本EPS(估)每股淨值1101 台泥 10.65 249.2 0.7 18.171216 統一 9.85 344.2 0.4 12.111301 臺塑 44.6 453.4 2.6322.07 會員資料檔:club.txt (程式預設數量2)提供系統執行身份認證時,檢查會員之帳號、密碼。Id姓名密碼88214040 童小遠 123488214034 王小民 5678-1 unused -1-1 unused -1-1 unused -1程式輸出之資料檔案如下:(僅會員擁有)個人投資組合(主要用來計算損益):my_pfo1.txt,my_pfo2.txt記錄了投資組合種類個數、股票代碼、股票名稱、擁有張數、歷史平均價格、現價、個股之買進價格、已實現損益。 (程式預設數量20)個人交易記錄(主要用來記錄交易狀況):trade1.txt,trade2.txt個人所有之交易記錄。包括:交易個數、股票代碼、股票名稱、買進張數、買進價格、賣出張數、賣出價格。(程式預設數量100)應用層面說明此系統除了可運用在個人股票的管理外,還能够運用在入口網站會員的自選股票交易管理上,用來記錄大量的會員股市交易和損益。三、資料結構說明在程式當中我們使用了4種資料結構(datastructure);股票的資料結構(STOCKINFO),用來儲存股票的資料。股票資料(STOCKINFO)欄位意義欄位名稱股票代碼intcode股票名稱charname[80]價格floatprice股本floatequityEPSfloatEPS本益比intratio每股淨額charnetvalue[10]會員的資料結構會員資料(CLUB)欄位意義欄位名稱會員idintcode會員名稱charname[80]會員密碼floatprice會員手中持有投資組合結構(PORTFOLIO)。投資組合結構(PORTFOLIO)欄位意義欄位名稱股票代碼intcode股票名稱charname[80]張數intmount買入歷史平均價floatprice_avg個股現價floatprice_now買入的價格floatprice_buy[50]交易記錄的資料結構檔(REPORT):用來存放每次交易的資料。交易記錄(REPORT)欄位意義欄位名稱股票代碼intcode股票名稱charname[80]買入張數intmount_buy買入價格loatprice_buy賣出張數intmount_sell賣出價格floatprice_sell程式說明寫在前頭、重要須知:此程式有幾點需要事先說明,有助於對程式的瞭解。第一:此程式的stock.log檔必須隨著時間每日更新,特别是股票(stockinfo)的現價欄,如此一來在計算未實現損益時方才有意義。第二:此程式計算損益上,暫時不考慮證券交易稅以及買賣的手續費,主要因為手續費會隨著交易券商的規定而有所改變.。第三:在計算損益上,會計學上有三種法則:先進先出法、後進先出法、平均成本法,而我們程式所採用的是較為折衷的平均成本法,也就是說當時間點不同,有重複買進單一個股的紀錄時,程式會記錄下買進的價格,利用買進的價格來計算買進歷史平均價,而當有賣出動作時,則計算賣出價格與歷史平均價之間的差價來作為損益的計算。第四:關於買賣股票的最小單位為1張,而1張為1000股,假設買進A股票面額10元,實際所付出的成本為10000元,又假設賣出價格為11元,則實收金額為11000元,也就是賺了1000元的差價。1主程式main().說明:先載入股票的資料檔,和會員的個人資料檔,最後依據使用者的選項做相對應的動作參數:無傳回值:無流程圖:管理者部分管理者部分輸入管理者密碼輸入管理者密碼輸入選項密碼=8888?輸入選項密碼=8888?NONO離開程式離開程式AddQuitDelAddQuitDel使用者部分使用者部分副程式副程式user_exam:檢驗會員id與password通過檢驗則會傳回會員id值副程式user_main:根據會員id值開啟其個人記錄檔,並帶入選單之中副程式user_main:根據會員id值開啟其個人記錄檔,並帶入選單之中離開程式離開程式guest部分guest部分副程式view_info:查詢股票資訊副程式view_info:查詢股票資訊離開程式離開程式程式碼部分main(){ /******FILE******/ FILE*stock_file; FILE*club_file; /******定義四大arrry******/ structSTOCKINFOstock[STOCK_NUM+1]; structPORTFOLIOmy_pfo[PFO_NUM+1]; structREPORTtrade[TRADE_NUM+1]; structCLUBclubs[CLUB_NUM+1]; charchoice; //主選單之選項 intpwd; //輸入選項用_password intuser_id; //輸入選項用_user_id /**********************openstockfile************/ if(stock_file=fopen("stock.log","r")) { load_stock(stock,stock_file); //呼叫副程式:讀入股票檔內容 } else { printf("無法開啟股票資料檔,程式終結!\n"); exit(1); //離開程式 } fclose(stock_file); //關閉讀檔 /**********************openclubfile************/ if(club_file=fopen("club.txt","r")) { load_club(clubs,club_file); //呼叫副程式:讀入會員檔內容 } else { printf("無法開啟會員資料檔,程式終結!!\n"); exit(1); } 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=8888 { manager_main();//呼叫副程式manager_main } else { printf("密碼輸入錯誤!!!!請輸入正確密碼\n"); } break; case'2': user_id=user_exam(clubs);//呼叫副程式user_exam user_main(user_id,stock,my_pfo,trade);//呼叫副程式user_amin break; case'3': printf("歡迎使用此系統,請繼續\n"); view_info(stock);//呼叫副程式view_infobreak;default:printf("無效的選項\n");break;}}副程式Ⅰmanager_main(管理者主要功能區)voidmanager_main(){charchoice;//輸入選項之用printf("管理者順利登入");printf("\n");printf("====================mainmenu=====================");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<=CLUB_NUM;i++) { if(clubs[i].id==-1) { printf("會員新增資料將建立在第%d位置\n",i); printf("請輸入新增會員的ID:>"); scanf("%d",&id); result=search_club(clubs,id); if(result!=-1) { printf("會員ID重複輸入,新增失敗,請重新登入\n"); exit(1); } else { clubs[i].id=id; printf("請輸入新增會員的姓名:>"); scanf("%s",&clubs[i].name); printf("請輸入新增會員的密碼:>"); scanf("%d",&clubs[i].pwd); } break; } } save_club(clubs); //呼叫副程式:儲存結果 break;case'd': printf("請輸入欲刪除會員ID:>"); fflush(stdin); scanf("%d",&id); printf("\n"); result=search_club(clubs,id);//呼叫副程式:查詢是否在會員名單中,正確傳回該index if(result==-1) { printf("會員ID輸入錯誤,請重新執行\n"); exit(1); } else { clubs[result].id=-1; } save_club(clubs); //呼叫副程式:儲存結果 break; default:printf("無效的選項\n"); break; }} Ⅱuser_exam(檢驗會員ID,密碼)intuser_exam(structCLUBclubs[]){inti;intid,passwd;//輸入選項用intresult;//儲存search副程式傳回值printf("請輸入會員ID:>");scanf("%d",&id);printf("\n");result=search_club(clubs,id);//呼叫副程式:檢驗該id是否為會員if(result==-1){printf("錯誤的會員ID\n");//會員id輸入錯誤 exit(1);}else{ for(i=1;i<=3;i++) { printf("請輸入會員密碼:>"); scanf("%d",&passwd); if(passwd==clubs[result].pwd)//密碼登入正確 { printf("\n會員順利登入,請繼續使用\n"); returnresult;//傳回會員index } } printf("登入錯誤超過3次,請重新登入\n"); exit(1);}}Ⅲuser_main(為使用者介面主要核心)副程式開啟副程式開啟開啟會員投資組合檔,交易記錄檔開啟會員投資組合檔,交易記錄檔輸入選項輸入選項Save_portfolioSave_tradeprint_portfolioview_infoprint_stock Save_portfolioSave_tradeprint_portfolioview_infoprint_stock Print_portfolioPrint_tradetrade_selltrade_buyPrint_portfolioPrint_tradetrade_selltrade_buyvoiduser_main(intindex,structSTOCKINFOstock[],structPORTFOLIOmy_pfo[],structREPORTtrade[]){ FILE*pfo_file;//開啟投資組合記錄檔 FILE*trade_file; //開啟交易記錄檔 intprofit_pre; //重要數值_紀錄未實現損益 charchoice;//輸入選項用 if(index==1) { /*****開啟投資組合檔***********/ if(pfo_file=fopen("pfo1.txt","r")) { rec_pfo=load_pfo(my_pfo,pfo_file) //呼叫副程式:load } else { pfo_file=fopen("pfo1.txt","w"); //開一新檔案 rec_pfo=0; //投資組合種類初始值=0 profit_real=0; //已實現損益初始值=0 } fclose(pfo_file); //關閉讀檔 /****開啟交易記錄檔***************/ if(trade_file=fopen("trade1.txt","r")) { rec_trade=load_trade(trade,trade_file); //呼叫副程式 } else { trade_file=fopen("trade1.txt","w"); //開一新檔案 rec_trade=0; //投資組合種類初始值=0 } fclose(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"); printf("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); //副程式:印出手中持有投資組合 trade_sell(stock,my_pfo,trade);//副程式:記錄賣出行為 break; case'l': profit_pre=calculate_pfo(my_pfo);//副程式:計算未實現損益 printf("<p>列印投資組合結果\t<t>列印交易記錄結果\n請選擇>"); fflush(stdin); scanf("%c",&choice); printf("\n"); switch(choice) { case'p': print_portfolio(my_pfo);//副程式:印出持有投資組合 printf("未實現損益=%d\t",profit_pre); printf("已實現損益=%d\n",profit_real); fflush(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●說明:紀錄買入股票的資料。參數:structSTOCKINFOstock[]:儲存資料的陣列。structPORTFOLIOmy_pfo[]:儲存資料的陣列。structREPORTtrade[]:儲存資料的陣列。傳回值:無流程圖:Ⅴtrade_sell()●說明:紀錄賣出股票的資料。參數:structSTOCKINFOstock[]:儲存資料的陣列。structPORTFOLIOmy_pfo[]:儲存資料的陣列。structREPORTtrade[]:儲存資料的陣列。傳回值:無流程圖:Ⅵ【Load】副程式程式功能說明參數傳回值voidload_stock載入股票資料structSTOCKINFOstock[]:儲存資料的陣列FILE*fp:儲存資料的檔案無voidload_club載入會員資料structCLUBclubs[]:儲存資料的陣列FILE*fp:儲存資料的檔案intload_pfo載入投資組合資料structPORTFOLIOmy_pfo[]:儲存資料的陣列FILE*fp:儲存資料的檔案投資組合種類個數Intload_trade載入交易紀錄資料。structREPORTtrade[]:儲存資料的陣列FILE*fp:儲存資料的檔案交易記錄個數程式碼:在此僅舉intload_trade為例,其它程式與其類似intload_trade(structREPORTtrade[],FILE*fp){ inti; intnum;//記錄用_交易個數 fscanf(fp,"%d",&num); //讀入『交易記錄個數』 for(i=1;i<=num;i++) {//依序從檔案讀入資料 fscanf(fp,"%d",&trade[i].code); fscanf(fp,"%s",&trade[i].name); fscanf(fp,"%d",&trade[i].mount_buy); fscanf(fp,"%f",&trade[i].price_buy); fscanf(fp,"%d",&trade[i].mount_sell); fscanf(fp,"%f",&trade[i].price_sell); } returnnum; //傳回『交易記錄個數』}Ⅶ【Search】.副程式程式功能說明參數傳回值Intsearch_stock搜尋股票資料structSTOCKINFOstock[]:儲存資料的陣列intchoice:欲被搜尋的資料搜尋正確,則傳回該輸入代碼之pointer,搜尋不到該代碼,傳回-1intsearch_club搜尋會員資料structCLUBclubs:儲存資料的陣列intchoice:欲被搜尋的資料(同上)intsearch_pfo搜尋投資組合內的股票資料structPORTFOLIOmy_pfo[]:儲存資料的陣列intchoice:欲被搜尋的資料(同上)程式碼:在此僅舉intsearch_stock為例,其它程式與其類似intsearch_stock(structSTOCKINFOstock[],intchoice){ inti; for(i=1;i<=STOCK_NUM;i++) { if(stock[i].code==choice) { returni; //搜尋正確,則傳回該輸入代碼之pointer } } return-1; //搜尋不到該代碼,傳回-1}Ⅷ【Print】副程式程式功能說明參數傳回值view_info()列印個股詳細資料structSTOCKINFOstock[]:儲存資料的陣列無print_stock()列印個股基本資訊structSTOCKINFOstock[]:儲存資料的陣列無print_portfolio()列印投資組合structPORTFOLIOmy_pfo[]:儲存資料的陣列無print_trade()列印交易記錄structREPORTtrade[]:儲存資料的陣列無程式碼:在此僅舉print_stock為例,其它程式與其類似voidprint_stock(structSTOCKINFOstock[]) //列印個股基本資訊{ inti; printf("代碼\t名稱\t代碼\t名稱\t代碼\t名稱\t代碼\t名稱\n"); for(i=1;i<=STOCK_NUM;i++) { printf("%d\t",stock[i].code);//列印代碼 printf("%s\t",stock[i].name);//列印名稱 if((i%4)==0) //檢查i÷4的餘數是否為0 { printf("\n"); //假如其餘數為0,則斷行 } } printf("\n");}流程圖:在此僅舉view_info(),此為查詢的主要功能Ⅸ【Save】副程式程式功能說明參數傳回值save_portfolio()儲存投資組合紀錄structREPORTtrade[]:儲存資料的陣列intindex:無save_trade()儲存交易記錄structREPORTtrade[]:儲存資料的陣列intindex:程式碼voidsave_portfolio(structPORTFOLIOmy_pfo[],intindex) //儲存手中持有投資組合{ FILE*pfo_file; inti,j; if(index==1)//假如會員id為1 { pfo_file=fopen("pfo1.txt","w");//則開啟pfo1.txt來儲存 } elseif(index==2)//假如會員id為2 { pfo_file=fopen("pfo1.txt","w");//則開啟pfo2.txt來儲存 } fprintf(pfo_file,"%d\n",rec_pfo); //儲存投資組合種類個數 for(i=1;i<=rec_pfo;i++) { fprintf(pfo_file,"%d\t",my_pfo[i].code);//儲存代碼 fprintf(pfo_file,"%s\t",my_pfo[i].name);//儲存名稱 fprintf(pfo_file,"%d\t",my_pfo[i].mount);//儲存張數 fprintf(pfo_file,"%f\t",my_pfo[i].price_avg);//儲存買進歷史平均價 fprintf(pfo_file,"%.2f\n",my_pfo[i].price_now);//儲存現價 for(j=1;j<=my_pfo[i].mount;j++) { fprintf(pfo_file,"%.2f",my_pfo[i].price_buy[j]);//根據張數,逐一儲存買進價格 } fprintf(pfo_file,"\n"); } fprintf(pfo_file,"%d\n",profit_real); //儲存已實現損益 fprintf(pfo_file,"\n"); fclose(pfo_file);//關閉檔案}Ⅹ【其它】intcalculate_pfo(structPORTFOLIOmy_pfo[])程式功能:計算未實現損益主要計算公式:Σ(現價-歷史平均價)*張數*1000參數:structPORTFOLIOmy_pfo[]傳回值:temp_sum加總後之值程式碼:intcalculate_pfo(structPORTFOLIOmy_pfo[]) //計算未實現投資損益{ inti; inttemp_sum=0; //temp用_加總 for(i=1;i<=rec_pfo;i++) { temp_sum=temp_sum+(my_pfo[i].price_now-my_pfo[i].price_avg)*my_pfo[i].mount*1000; //(現價-平均價)*張數*1000 } returntemp_sum; //傳回加總後之值}charPause();程式功能:按下<Enter>繼續程式碼:charPause(){ charc; printf("\n按<Enter>繼續..."); scanf("%c",&c); while(c!='\n') //若不是按下Enter,而按下其它鍵,則傳回該鍵 { returnc; } //唯有按下Enter,程式繼續執行}完整程式碼#include<stdio.h>#defineSTOCK_NUM20 //定義:股票數量20#definePFO_NUM20 //定義:投資組合數量20#defineTRADE_NUM100 //定義:交易記錄數量100#defineCLUB_NUM5 //定義:會員資料100structSTOCKINFO { intcode; charname[80]; floatprice; floatequity; floatEPS; intratio; charnetvalue[10]; };structPORTFOLIO { intcode; charname[80]; intmount; floatprice_avg; floatprice_now; floatprice_buy[50]; };structREPORT { intcode; charname[80]; intmount_buy; floatprice_buy; intmount_sell; floatprice_sell; }; structCLUB{ intid; charname[80]; intpwd; };/*******************************定義下列副程式*********************************/voidmanager_main(structCLUBclubs[]);intuser_exam(structCLUBclubs[]);voiduser_main(intindex,structSTOCKINFOstock[],structPORTFOLIOmy_pfo[],structREPORTtrade[]);voidtrade_buy(structSTOCKINFOstock[],structPORTFOLIOmy_pfo[],structREPORTtrade[]);voidtrade_sell(structSTOCKINFOstock[],structPORTFOLIOmy_pfo[],structREPORTtrade[]);voidload_stock(structSTOCKINFOstock[],FILE*fp);voidload_club(structCLUBclubs[],FILE*fp);intload_pfo(structPORTFOLIOmy_pfo[],FILE*fp);intload_trade(structREPORTtrade[],FILE*fp);intsearch_stock(structSTOCKINFOstock[],intchoice);intsearch_club(structCLUBclubs[],intchoice);intsearch_pfo(structPORTFOLIOmy_pfo[],intchoice);voidview_info(structSTOCKINFOstock[]);voidprint_stock(structSTOCKINFOstock[]);voidprint_portfolio(structPORTFOLIOmy_pfo[]);voidprint_trade(structREPORTtrade[]);voidsave_club(structCLUBclubs[]);voidsave_portfolio(structPORTFOLIOmy_pfo[],intindex);voidsave_trade(structREPORTtrade[],intindex);charPause();intcalculate_pfo(structPORTFOLIOmy_pfo[]);/******************************GlbalVariables*****************************/intprofit_real; //記錄已實現損益intrec_pfo; //紀錄手中持有投資組合的種類intrec_trade; //紀錄交易記錄的次數main(){ FILE*stock_file; FILE*club_file; structSTOCKINFOstock[STOCK_NUM+1]; structPORTFOLIOmy_pfo[PFO_NUM+1]; structREPORTtrade[TRADE_NUM+1]; structCLUBclubs[CLUB_NUM+1]; charchoice; //主選單之選項 intpwd; //輸入選項用_password intuser_id; //輸入選項用_user_id /*************openstockfile****************************/ if(stock_file=fopen("stock.log","r")) { load_stock(stock,stock_file); //呼叫副程式:讀入股票檔內容 } else { printf("無法開啟股票資料檔,程式終結!\n"); //無法開啟,程式終結 exit(1); //離開程式 } fclose(stock_file); //關閉讀檔 /*************openclubfile****************************/ if(club_file=fopen("club.txt","r")) { load_club(clubs,club_file); } else { printf("開檔失敗,程式終結!\n"); exit(1); } 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=8888 { manager_main(clubs);//呼叫副程式manager_main } else { printf("密碼輸入錯誤!!!!請輸入正確密碼\n"); } break; case'2': user_id=user_exam(clubs);//副程式:檢查會員ID密碼 user_main(user_id,stock,my_pfo,trade);//副程式:進入使用者功能選項 break; case'3': printf("歡迎使用此系統,請繼續\n"); view_info(stock);//副程式:查詢功能break;default:printf("無效的選項\n");break;}}voidmanager_main(structCLUBclubs[]){ charchoice; //輸入選項用 inti; intid; //輸入選項用 intresult; //儲存傳回值 printf("管理者順利登入"); printf("\n");printf("====================mainmenu=====================");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<=CLUB_NUM;i++) { if(clubs[i].id==-1)//-1:尚未使用 { printf("會員新增資料將建立在第%d位置\n",i); printf("請輸入新增會員的ID:>"); scanf("%d",&id); result=search_club(clubs,id);//在會員資料中找尋,若有重複輸入 if(result!=-1)//回傳直將不會是-1 { printf("會員ID重複輸入,新增失敗,請重新登入\n"); exit(1); } else { clubs[i].id=id; printf("請輸入新增會員的姓名:>"); scanf("%s",&clubs[i].name); printf("請輸入新增會員的密碼:>"); scanf("%d",&clubs[i].pwd); printf("會員ID新增完成\n"); } break; } } save_club(clubs); //呼叫副程式:儲存結果 break;case'd': printf("請輸入欲刪除會員ID:>"); fflush(stdin); scanf("%d",&id); printf("\n"); result=search_club(clubs,id);//呼叫副程式:查詢是否在會員名單中 if(result==-1) { printf("會員ID輸入錯誤,請重新執行\n"); exit(1); } else { clubs[result].id=-1; printf("會員ID刪除完成\n"); } save_club(clubs); //呼叫副程式:儲存結果 break; case'q': exit(1);break; default:printf("無效的選項\n"); break; }}intuser_exam(structCLUBclubs[])//副程式功能:檢驗會員ID密碼{ inti; intid,passwd;//輸入選項用 intresult;//儲存傳回值 printf("請輸入會員ID:>");scanf("%d",&id);if(id>0)//若id=-1為非正確會員{ result=search_club(clubs,id);//呼叫副程式:查詢是否在會員名單中if(result==-1) { printf("錯誤的會員ID\n"); exit(1); } else { for(i=1;i<=3;i++) { printf("請輸入會員密碼:>"); scanf("%d",&passwd); if(passwd==clubs[result].pwd) { printf("順利登入,%s先生請繼續使用\n",clubs[result].name); returnresult;//會員登入正確,傳回其index } } printf("登入錯誤超過3次,請重新登入\n"); exit(1); }}else{ printf("錯誤的會員ID\n"); exit(1);}}voiduser_main(intindex,structSTOCKINFOstock[],structPORTFOLIOmy_pfo[],structREPORTtrade[]){ FILE*pfo_file; FILE*trade_file; intprofit_pre; //紀錄未實現損益 charchoice;//輸入選項用 if(index==1)//會員位置1 { /****************開啟投資組合記錄檔************/ if(pfo_file=fopen("pfo1.txt","r")) { rec_pfo=load_pfo(my_pfo,pfo_file);//呼叫副程式:讀取組合個數與內容 } else { pfo_file=fopen("pfo1.txt","w"); //先前並無存檔記錄,開一新檔案 rec_pfo=0; //投資組合種類初始值=0 profit_real=0; //已實現損益初始值=0 } fclose(pfo_file); //關閉讀檔 /*******************開啟交易紀錄***************/ if(trade_file=fopen("trade1.txt","r")) { rec_trade=load_trade(trade,trade_file);//呼叫副程式:讀取交易紀錄與內容 } else { trade_file=fopen("trade1.txt","w"); //先前並無存檔記錄,開一新檔案 rec_trade=0; //投資組合種類初始值=0 } fclose(trade_file); //關閉讀檔 }註:會員位置2~5開檔方式同上,故略,以省篇幅 while(1) { printf("===========主選單======================"); printf("\n"); printf("======================================"); printf("\n"); printf("v.觀看個股資訊"); printf("\n"); printf("b.紀錄買進個股"); printf("\n"); printf("s.紀錄賣出個股"); printf("\n"); printf("l.列出買賣紀錄資料"); printf("\n"); printf("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); //印出手中持有投資組合 trade_sell(stock,my_pfo,trade); //記錄賣出行為 break; case'l': profit_pre=calculate_pfo(my_pfo);//計算未實現損益 printf("<p>列印投資組合結果\t<t>列印交易記錄結果\n請選擇>"); fflush(stdin); scanf("%c",&choice); printf("\n"); switch(choice) { case'p': print_portfolio(my_pfo);//列印投資組合結果 printf("未實現損益=%d\t",profit_pre); printf("已實現損益=%d\n",profit_real); fflush(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; } }}voidload_stock(structSTOCKINFOstock[],FILE*fp) //讀入個股資訊{ inti; for(i=1;i<=STOCK_NUM;i++) { fscanf(fp,"%d",&stock[i].code); //個股代碼 fscanf(fp,"%s",&stock[i].name); //個股名稱 fscanf(fp,"%f",&stock[i].price); //個股現價 fscanf(fp,"%f",&stock[i].equity); //股本(億) fscanf(fp,"%f",&stock[i].EPS); //EPS stock[i].ratio=stock[i].price/stock[i].EPS; //本益比=現價÷EPS fscanf(fp,"%s",&stock[i].netvalue); //個股淨值 }}voidload_club(structCLUBclubs[],FILE*fp){ inti; for(i=1;i<=CLUB_NUM;i++) { fscanf(fp,"%d",&clubs[i].id);//讀入會員ID fscanf(fp,"%s",&clubs[i].name); //讀入會員名稱 fscanf(fp,"%d",&clubs[i].pwd); //讀入會員密碼 }}intload_pfo(structPORTFOLIOmy_pfo[],FILE*fp){ inti,j; intnum; fscanf(fp,"%d",&num); //讀入投資組合種類個數 for(i=1;i<=num;i++) { fscanf(fp,"%d",&my_pfo[i].code); fscanf(fp,"%s",&my_pfo[i].name); fscanf(fp,"%d",&my_pfo[i].mount); fscanf(fp,"%f",&my_pfo[i].price_avg); //讀入個股買進歷史平均價 fscanf(fp,"%f",&my_pfo[i].price_now); //讀入個股現價 for(j=1;j<=my_pfo[i].mount;j++) { fscanf(fp,"%f",&my_pfo[i].price_buy[j]); //讀入個股之買進價格 } } fscanf(fp,"%d",&profit_real); //讀入『已實現損益』 returnnum; //傳回『投資組合種類個數』}intload_trade(structREPORTtrade[],FILE*fp){ inti; intnum; fscanf(fp,"%d",&num); //讀入『交易記錄個數』 for(i=1;i<=num;i++) { fscanf(fp,"%d",&trade[i].code); fscanf(fp,"%s",&trade[i].name); fscanf(fp,"%d",&trade[i].mount_buy); fscanf(fp,"%f",&trade[i].price_buy); fscanf(fp,"%d",&trade[i].mount_sell); fscanf(fp,"%f",&trade[i].price_sell); } returnnum; //傳回『交易記錄個數』}intsearch_stock(structSTOCKINFOstock[],intchoice){ inti; for(i=1;i<=STOCK_NUM;i++) { if(stock[i].code==choice) { returni; //搜尋正確,則傳回該輸入代碼之pointer } } return-1; //搜尋不到該代碼,傳回-1}intsearch_club(structCLUBclubs[],intchoice){ inti; for(i=1;i<=CLUB_NUM;i++) { if(clubs[i].id==choice) { returni; //搜尋正確,則傳回該輸入代碼之pointer } } return-1; //搜尋不到該代碼,傳回-1}intsearch_pfo(structPORTFOLIOmy_pfo[],intchoice){ inti; for(i=1;i<=rec_pfo;i++) { if(my_pfo[i].code==choice) { returni; //搜尋正確,則傳回該輸入代碼之pointer } } return-1; //搜尋不到該代碼,傳回-1}voidtrade_buy(structSTOCKINFOstock[],structPORTFOLIOmy_pfo[],structREPORTtrade[]){ inti; intcode; //輸入用_股票代號 intresult1,result2; //結果值_儲存Search傳回值 floatprice_buy; //輸入用_買進價格 intm;//輸入用_張數 inttemp; //temp用 floattemp_sum=0; //temp用_加總 printf("請輸入股票代碼>"); scanf("%d",&code); printf("請輸入購買價格>"); scanf("%f",&price_buy); printf("請輸入購買張數(若不購買請輸入-1)>"); scanf("%d",&m); printf("\n"); result1=search_pfo(my_pfo,code); //搜尋投資組合中是否有該代碼 if(result1==-1) { result2=search_stock(stock,code); //搜尋股票資料中是否有該代碼 if(result2==-1) { printf("無此代碼,請從新選擇\n"); } else { if(m>0&&price_buy>0) //價格,張數是否合理 { /***************在投資組合中記錄買進動作**********/ rec_pfo=rec_pfo+1; //投資組合種類+1 my_pfo[rec_pfo].code=stock[result2].code; strcpy(my_pfo[rec_pfo].name,stock[result2].name); my_pfo[rec_pfo].mount=m; //記錄買進張數my_pfo[rec_pfo].price_now=stock[result2].price; /*記錄買進個股現價:計算未實現損益用*/ for(i=1;i<=m;i++) { my_pfo[rec_pfo].price_buy[i]=price_buy; //記錄買進價格 } my_pfo[rec_pfo].price_avg=price_buy; //記錄買進歷史平均價 /***************在交易記錄檔中記錄買進動作**********/ rec_trade=rec_trade+1; //交易記錄+1 trade[rec_trade].code=stock[result2].code; strcpy(trade[rec_trade].name,stock[result2].name); trade[rec_trade].mount_buy=m; trade[rec_trade].price_buy=price_buy; printf("紀錄順利,請繼續使用\n"); } else { printf("請重新選擇\n"); } } } else { if(m>0&&price_buy>0)//價格,張數是否合理 { /***************在投資組合中記錄買進動作**********/ temp=my_pfo[result1].mount+1; my_pfo[result1].mount=my_pfo[result1].mount+m; //修改買進張數 for(i=temp;i<=my_pfo[result1].mount;i++) { my_pfo[result1].price_buy[i]=price_buy; //記錄買進價格 } for(i=1;i<=my_pfo[result1].mount;i++) //計算買進歷史平均價 { temp_sum=temp_sum+my_pfo[result1].price_buy[i]; } my_pfo[result1].price_avg=temp_sum/my_pfo[result1].mount;/*記錄買進歷史平均價*/ /***************在交易記錄檔中記錄買進動作**********/ rec_trade=rec_trade+1; trade[rec_trade].code=my_pfo[result1].code; strcpy(trade[rec_trade].name,my_pfo[result1].name); trade[rec_trade].mount_buy=m; trade[rec_trade].price_buy=price_buy; printf("紀錄順利,請繼續使用\n"); } else { printf("請重新選擇\n"); } }}voidtrade_sell(structSTOCKINFOstock[],structPORTFOLIOmy_pfo[],st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论