C++ 小型股票交易系统的设计及代码
VC++课程设计-股票交易系统
设计程序名称:股票交易系统
难易级别:A 级
选择这个程序,我主要考虑到以下方面的原因:
1. 本程序难度较大,在编写程序的过程当中可以更加深刻地理解VC++当中的相关知
识点,可以更好地通过实践了解编程的内涵。
2. 该课题所涉及到的内容和实际生活联系比较紧密,所以编写此程序意义较大。
3. 该课题是管理系统方面的小型程序,这类程序可以不断地扩充新的内容新的功能,
可塑性高,实用性好,有很好的实际意义。
程序设计要求:
本程序要求改变数据结构,每个用户的数据库中要增加现金数成员。
要求增加股票交易系统的接口设计:a. Add New Stock( ) 增加新的股票;b. Delete Old Stock( ) 删除旧的股票;c. Hang Up Stock( ) 挂起股票,停止交易;d. Modify Stock (Stock []) 修改股票的名称代码。要求的以上的修改都要输入密码,在输入正确的密码之后才能够进入数据库进行修改。
将股票数据的处理由数组变成链表,可以处理多只股票的交易,链表一交易代码的序号进行排序。
程序功能介绍:
股票交易系统是一个小型的管理程序,在这个系统里,可以管理至多 5 只股票的交易。首先用户要注册,注册完后方可登陆。在登陆的界面中,管理员登陆后可以删减股票,挂起股票,解挂股票等等,通过这些功能来管理股票。同时,用户还可以查看股票情况,帮助自己进行股票的有效交易。股票的市场情况可根据用户的使用情况而随之变化。
程序完成过程:
1、粗读程序
第一遍看程序时,发现程序太长了,只是对整个程序有一个大致的了解。程序的主要功能是实现用户对股票操作系统的自主可视操作,本完成用户和股票数据的存储,实现反复操作。程序主要通过类来完成功能,涉及到数组及输入输出流的使用。在主函数中调用类中方法,实现页面中的转换,对数据进行处理。一开始有一点畏难情绪。
2、细读程序
以下对程序中类及其函数进行分析
Stock 类:存放股票数据,类中方法对股票进行各项操作。
Void Hang Up Stock( ) ;//挂起股票void Un Hang Stock();//
解挂股票
void Modify Stock(Stock []);//修改股票
void Delete Stock();//删除股票void
Interface();//选择面板
void Stock Exchange Market();//显示信息
void Switch choice();//选择服务
void Input For New Stock();//加入新股票
void Market Analysis();//市场分析
void Save(Stock[]);//保存修改
Customer 类:存放用户信息,类中方法对用户进行各项操作。
Customer();//对用户初始化
void Log in(char *, char *,Customer) const;//登录
void Register(Customer *);//注册
void Stock Portfolio(Customer) const; // Portfolio--有价证券
程序功能为对用户的指令进行处理,模拟股市的操作,完成对股票和对用户的修改及存档。
在认清设计方向的基础上,反复细读程序,我分析了Stock和Customer类下数据与成员函
数的功能。程序反复声明了Stock和Customer类的同一对象,浪费了系统资源;在一些函数调
用中也存在缺陷,比如存在Input_For_New_Stock()方法,但是只有在第一次使用是才会调用,Customer 类中原有 Switch_function()也没有调用。在用户选择登录时,无法辨别用户名,只根据密码进行登录,当遇到密码相同的用户时,就分不清楚用户。密码是显示输入的不能有效的受到保护。
由于这是个小程序,数据通过数组存储,而不是通过指针,这使程序方便易懂,但限制了数据的空间,无法达到指针链表所能实现的不定长度存储。但是从现阶段的使用来看指针链表的形式过于麻烦反而会造成程序过度的复杂。
现对系统进行操作分析:首先进入界面,进行用户识别,在这里用户可以查看市场信息、注册新用户、登录用户和分析股票。然后若登录,显示下一股票操作界面,选其他有相应操作。在股票操作界面中,有买入、卖出、添加新股票、挂出股票,恢复交易、删除已有股、挂起股票, 停止交易、修改代码及名称、查看等操作选择,用户可根据提示,完成相应操作。其中添加新股票、挂出股票,恢复交易、删除已有股、挂起股票,停止交易、修改代码及名称操作只对管理员开放。
3、修改程序
首先,将重复声明的Stock 和Customer 类对象删除,使用Stock 类的全局对象temp 和
share[MAX]及Customer类的全局对象cust来实现数据的反复读取和存储,并修改因此引起的变动(如将Customer类中的 char share holding name [30] 改为 char share holding name[5][30];
char share holding code[5] 改为char share holding code[5][5]等)。
在类中方法中涉及到查询处添加打印股票清单细明项目:
(for(i=0;i { share[i].Stock Exchange_Market(); } )。 修改已存在的 Input For New Stock(),使其可在空位置存储新股票信息。 在理清了思路和对原来的源程序的分析思考,我对程序有了更为全面的了解,对所要添补或改进的程序有了大致的思路。然后对原程序一遍又一遍的阅读,不断地改进思路,调整想法。分析出的程序流程如下: 对于新的函数的增加完成情况: 新增加的函数完成的情况 (1)Input_For_New_Stock()——先对股票数据进行读取,显示股票信息,提示添加新股票输入股票代码,考虑到输入流读取时会出现的一些错 误,如输入回车,输入错误代码等,我对程序加入了 一些代码,从而解决这些异常。然后调用 Input_For_New_Stock(),提示输入股票的名称、代码、 流通股数量、发行价,同时随机生成股票上市价。最 后,在Stock_File.dat 的空位置插入存储新股票信息。 (1)Delete_Stock() ——删除旧先对股票数据进行读取,显示股票信息。然后股票调用 Delete_Stock(),提示输入要删除的股票代码,同 样考虑到输入流读取时会出现的一些错误,如输入回 车,输入错误代码等,我加入了一些代码,从而解决 这些异常。最后,存储修改后的信息。 Hang_Up_Stock()——挂起股票,停止交先对股票数据进行读取,显示股票信息。然后易调用 Hang_Up_Stock(),提示输入要挂起的股票代码, 同样考虑到输入流读取时会出现的一些错误,如输入 回车,输入错误代码等,我加入了一些代码,从而解 决这些异常。最后,存储修改后的信息。 Modify_Stock()——修改股票的名称、代先对股票数据进行读取,显示股票信息。然后码调用 Modify_Stock(),提示输入要修改的股票代码,同 样考虑到输入流读取时会出现的一些错误,如输入回 车,输入错误代码等,我加入了一些代码,从而解决 这些异常。最后,存储修改后的信息。 修改后的结果存入Stock_File.dat。通过 stock 成员函数 Save()来实现此要求。程序 创新: 1. 在程序设计要求外我添加了Un_Hang_Stock()——解挂股票,恢复交易。先对股票 数据进行读取,显示股票信息。然后调用Un_Hang_Stock(),提示输入要解挂的股 票代码,同样考虑到输入流读取时会出现的一些错误,如输入回车,输入错误代码 等,我加入了一些代码,从而解决这些异常。最后,存储修改后的信息。 2. 加入股票发行价、上市价和帐户总资产、余额、市值等数据,并进行计算、输出等 操作,加强系统功能,使系统更实用、逼真。 编程心得: 通过本课题,我复习了类和数组,更好的掌握了类间函数调用的关系以及如何实现类间复杂的相关调用。同时,我学习了输入输出流的使用,懂得了如何从特定的地址读取数据,如何正确将信息存储到特定的位置。此外,在调试的过程中我还碰到了一些问题,运行时经常出现一些意料之外的输出或无法输出预想的结果,症结在于没有合理的使用break、getch()、cin.get()等一些编程课本上未学过的函数。最后,通过翻阅资料与上机实践终于解决了这些问 题。 通过阅读本课题的程序,我掌握了一些阅读程序的技巧,培养了认真阅读程序的好习惯,并能够从较长的程序中找到程序的核心实现部分。 此次课程设计让我借此契机加深领悟了C++的内涵,让我对编程有了实质性的了解和大致掌握,在不断思考与上机调试的过程中,培养自己的耐心,也培养了自己的意志。最终,终于完成了课程设计的任务。 关键源代码及注解(修改后的代码用下划线标示) /* 股票交易系统--源代码及关键源代码注解如下:*/ #include #include #include #include #include #include #include #define MAX 5 int i=0,j=0,Hang,flag; int num_of_stock; int gushu; class Customer; class Stock { private: float faxing,shangshi;//股票发行价,上市价 char stock_name[20];//股票名称 char stock_code[6];//股票代码 char choice;//Interface()下选择 int hang;//是否挂起(1为是,0为否) long int stock_volume;//股票总股数 long int volume_available;//股票可流通量 public: Stock(); void Hang_Up_Stock();//挂起股票 void Un_Hang_Stock();//解挂股票 void Modify_Stock(Stock []);//修改股票 void Delete_Stock();//删除股票 void Interface();//选择面板 void Stock_Exchange_Market();//显示信息 void Switch_choice();//选择服务 void Input_For_New_Stock();//加入新股票 void Market_Analysis();//市场分析 void Save(Stock[]);//保存修改 friend class Customer; }; class Customer { friend class Stock; private: int gly;//是否管理员 char customer_name[30];//用户名 char password[10];//密码 char share_holding_name[5][30];//持有股票名称 char share_holding_code[5][5];//持有股票代码 long int share_holding_value[5];//持有股票数量 double money,shzh,zzch;//现金余额,市值,总资产public: Customer(); void Log_in(char *) const;//登录 void Register(Customer *);//注册 void Stock_Portfolio() const; // Portfolio--有价证券 }; Stock temp,share[MAX];//全局变量,声明股票对象Customer cust;//声明用户对象,全局变量 //Customer构造 Customer::Customer() { strcpy(Customer::customer_name,""); for(i=0;i { strcpy(Customer::share_holding_name[i],""); strcpy(Customer::share_holding_code[i],""); share_holding_value[i]=0; money=shzh=zzch=0; } } void Customer::Log_in(char *pass_word) const { if(strcmp(pass_word,password)==0)//核对密码 Stock_Portfolio(); else { cout< cout<<"密码错误..."< } } void Customer::Register(Customer *cust) { char ch; system("cls"); //执行系统命令:清屏=cls cin.get(); cout<<"欢迎进入************* 股票交易系统***********"< cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"< cout<<"输入用户名: "; cin.getline(customer_name,30); cout<<"输入您的密码(少于8 字): "< { char ch; int i=0; cout.flush(); ch=getch(); while(ch!=13) { password[i++]=ch; cout<<'*'; cout.flush(); ch=getch(); } password[i]=0; } cout< cout<<"输入您的资金:"; cin>>zzch; shzh=0; money=zzch; cout<<"是否设为管理员?(y/n)"< cin>>ch; if(ch=='y'||ch=='Y') { gly=1; cout<<"已设置..."; } else if(ch=='n'||ch=='N') gly=0; else cout<<"默认为非管理员..."; getch(); system("cls"); cout< cout<<"注册成功..."< cout<<"按任意键返回..."< getch(); } void Customer::Stock_Portfolio() const//用户交易操作系统 { int i,a; char ch,share_code[6],str[20]; long int volume; start: system("cls"); cout< cout<<"\t\t\t 欢迎使用!!!!!"< cout<<"\t\t************* 股票交易系统***********"< cout<<"\t\t-----------------------------------------"< cout<<"\t\t 用户: "< cout<<"\t\t 买入..........................[1]"< cout<<"\t\t 卖出..........................[2]"< cout<<"\t\t 添加新股票....................[3]"< cout<<"\t\t 挂出股票,恢复交易.............[4]"< cout<<"\t\t 删除已有股....................[5]"< cout<<"\t\t 挂起股票,停止交易.............[6]"< cout<<"\t\t 修改代码及名称................[7]"< cout<<"\t\t 查看..........................[8]"< cout<<"\t\t 退出..........................[0]"< cout< cin>>ch; if((ch!='1')&&(ch!='2')&&(ch!='3')&&(ch!='4')&&(ch!='5')&&(ch!='6')&&(ch!='7') &&(ch!='8')&&(ch!='0')) goto start; else { switch(ch) { case '3':{ //加入新股票 if(cust.gly==1) { for(i=0;i { if(strcmp(share[i].stock_name,"")==0)//在股票数据空处添加新的内容 { share[i].Input_For_New_Stock(); temp.Save(share);//写数据 getch(); goto start; } } } else { cout<<"您无权添加股票!"< getch(); break; } } case '5':{ //删除股票 if(cust.gly==1) { system("cls"); cout<<"\n\n\t\t************* 股票交易系统**********"< cout<<"\t\t-----------------------------------------"< cout<<" 公司\t\t代码\t流通股\t可动股\t发行价\t上市价"< for(i=0;i { share[i].Stock_Exchange_Market(); } cin.get(); temp.Delete_Stock(); cin.get(); break; } else { cout<<"您无权删除股票!"< getch(); break; } } case '4':{ //解挂股票 if(cust.gly==1) { system("cls"); cout<<"\n\n\t\t*********** 股票交易系统***********"< cout<<"\t\t-----------------------------------------"< cout<<" 公司\t\t代码\t流通股\t可动股\t发行价\t上市价"< for(i=0;i { share[i].Stock_Exchange_Market(); } cin.get(); temp.Un_Hang_Stock(); break; } else { cout<<"您无权恢复股票!"< getch(); break; } } case '6':{ //挂起股票 if(cust.gly==1) { system("cls"); cout<<"\n\n\t\t*********** 股票交易系统***********"< cout<<"\t\t-------------------------------------------"< cout<<" 公司\t\t代码\t流通股\t可动股\t发行价\t上市价"< for(i=0;i { share[i].Stock_Exchange_Market(); } cin.get(); temp.Hang_Up_Stock();//进行 break; } else { cout<<"您无权挂起股票!"< getch(); break; } } case '7':{//修改股票 if(cust.gly==1) { system("cls"); cout<<"\n\n\t\t************ 股票交易系统**********"< cout<<"\t\t------------------------------------------"< cout<<" 公司\t\t代码\t流通股\t可动股\t发行价\t上市价"< for(i=0;i { share[i].Stock_Exchange_Market(); } cin.get(); temp.Modify_Stock(share); break; } else { cout<<"您无权挂起股票!"< getch(); break; } } case '1':{//买入 system("cls"); cout<<"\n\n\t\t************* 股票交易系统**********"< cout<<"\t\t----------------------------------------------"< cout<<" 公司\t\t代码\t流通股\t可动股\t发行价上市价状态"< for(i=0;i { share[i].Stock_Exchange_Market();//显示市场信息 } cout<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"< cout<<" 持有股票市值\t可用资金\t总资产"< cout< cin.get(); cout< cin.getline(share_code,6); if(strcmp(share_code,"")!=0)//当输入回车时报错 { i=0; flag=0; while((i { if (strcmp(share[i].stock_code,share_code)==0) { if(share[i].hang==1) { cout<<"股票已挂起,停止交易!"< break; } else { gushu=int(cust.money/share[i].shangshi); cout<<"您最多可购买:"< flag=1; cout<<"输入购买量: "; cin>>volume; a=cin.rdstate(); while(a)//判断输入是否为整数 { cin.clear(); cin.getline(str,20); cout<<"非法输入,请重新输入一整数."< cin>>volume; a=cin.rdstate(); } if(share[i].volume_available>=volume&&cust.money>=volume*share[i].shangshi) {//改动各数据 cust.share_holding_value[i]=cust.share_holding_value[i]+volume; strncpy(cust.share_holding_name[i],share[i].stock_name,30); strcpy(cust.share_holding_code[i],share[i].stock_code); share[i].volume_available=share[i].volume_available-volume; cust.money-=share[i].shangshi*volume; cust.shzh+=share[i].shangshi*volume; system("cls"); cout<<"交易成功!"< cout< cout<<"\t\t************* 股票交易系统************"< cout<<"\t\t------------------------------------------"< cout<<" 公司\t\t代码\t流通股\t可动股\t发行价上市价状态"< for(i=0;i { cout<<" "< <<"\t"< <<"\t"< <<"\t "<<(share[i].hang==0?"未挂起":"已挂起")< } cout<<" 持有股票市值\t可用资金\t总资产"< cout< cin.get(); ofstream d ataFile (cust.customer_name,ios::binary); dataFile.write((char*)(&cust),sizeof(cust)); temp.Save(share); } else if(share[i].volume_available<=volume) { cout< <<"的可购股量少于您所要。"; cout< cout<<"退出... "; cout< getch(); system("cls"); goto start; } else if(cust.money<=volume*share[i].shangshi) { cout<<"资金不足!"; cout<<"退出... "; cout< getch(); system("cls"); goto start; } } } else { i++; while(i==MAX) { system("cls"); cout<<"您所输入代码错误..."< cout<<"退出... "< goto start; } } } } else cout< cin.get(); break; } case '2':{//卖出股票 system("cls"); cout<<"\t\t************* 股票交易系统************"< cout<<"\t\t------------------------------------------"< cout<<" 公司\t\t代码\t流通股\t可动股\t发行价上市价状态"< for(i=0;i { cout<<" "< <<"\t"< <<"\t"< <<"\t "<<(share[i].hang==0?"未挂起":"已挂起")< } cout<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"< cout<<" 持有股票市值\t可用资金\t总资产"< cout< cin.get(); cout< cin.getline(share_code,6); if(strcmp(share_code,"")!=0) { i=0; flag=0; while((i { if (strcmp(share[i].stock_code,share_code)==0) { if(share[i].hang==1) { cout<<"股票已挂起,停止交易!"< break; } else { flag=1; cout<<"输入卖出量: "; cin>>volume; a=cin.rdstate(); while(a){ cin.clear(); cin.getline(str,20); cout<<"非法输入,重新输入一整数."< cin>>volume; a=cin.rdstate(); } if(cust.share_holding_value[i]>=volume) { cust.share_holding_value[i]=cust.share_holding_value[i]-volume; share[i].volume_available=share[i].volume_available+volume; cust.money+=share[i].shangshi*volume; cust.shzh-=share[i].shangshi*volume; system("cls"); cout<<"交易成功!"< cout< cout<<"\t\t************* 股票交易系统************"< cout<<" 公司\t\t代码\t流通股\t可动股\t发行价上市价状态"< for(i=0;i { cout<<" "< <<"\t"< <<"\t"< <<"\t "<<(share[i].hang==0?"未挂起":"已挂起")< } cout<<" 持有股票市值\t可用资金\t总资产"< cout< ofstream data(cust.customer_name,ios::binary); data.write((char*)(&cust),sizeof(cust)); temp.Save(share); } else { cout<<"您没有足够股票可卖, "; cout<<"或您没有购买此股。按任意键返回"< cout<<"按任意键返回... "< getch(); break; } cin.get(); } } else { i++; while(i==MAX) { system("cls"); cout<<"您没有购买该股或您输入错误。"< cout<<"退出... "; getch(); goto start; } } } } else cout< cin.get(); break; } case '8':{ //查看信息 system("cls"); cout<<"\t\t************* 股票交易系统***********"< cout<<" 公司\t\t代码\t流通股\t可动股\t发行价上市价状态"< for(int i=0;i { cout<<" "< <<"\t"< <<"\t"< <<"\t "<<(share[i].hang==0?"未挂起":"已挂起")< } cout<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"< cout<<" 持有股票市值\t可用资金\t总资产"< cout< getch(); break; } //返回主页面 case '0':{ temp.Interface(); } } goto start; } } Stock::Stock() { num_of_stock=0; volume_available=stock_volume; } void Stock::Interface() { system("cls"); cout<<"\n\n\t\t************* 股票交易市场******************"< cout<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"< cout<<"\t\t 进入股票交易市场................[1]"< cout<<"\t\t 登陆用户........................[2]"< cout<<"\t\t 注册新用户......................[3]"< cout<<"\t\t 退出系统........................[0]"<