您的位置:首页 > 其它

南邮2015年程序设计周_个人股票信息管理系统

2015-12-04 22:23 459 查看
个人股票管理系统

一、 课题内容和要求

【问题描述】                              

该系统要求建立一个时间段内某股民的投资情况管理系统,并具有排序、查找、计算、显示等功能。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些算法思想的应用。

【功能要求】

(1)股票账户信息应包括:股票代码,股票名称,持仓数目,当前价,涨跌幅,浮动盈亏,账户总值,剩余资金等。

(2)需要实现的功能

1) 建立10支给定股票的信息结构数组,包括股票代码,股票名称,当前价,涨跌幅等。并在统计的时间段以当天的收盘价作为每只股票的当前价进行信息更新和显示

2) 实现用户的投资过程,记录买卖过程(通过持仓数目的变化显示)

3) 每天更新和显示用户的账户信息

4) 计算并显示给定时间段内的盈亏

5) 按盈亏大小进行排序

6) 按股票代码查找该股票的价格变化

7) 查找收益最大的股票代码

8) 将该时间段内每天的账户信息内容存为文件。

(3)界面友好,输入信息符合逻辑如股票买入数目必须为100的整数倍,剩余资金不能为负数、不可能有非数字的字符等。

一、 需求分析

(1)提供可操作的主菜单:输出主菜单,用于显示以从文件中加载的总客户信息和若干个可选的功能选项。根据客户输入的选项来运行不同的功能,运行不同的函数。

(2)进行文本信息的载入:可选择显示或输入股票信息。

(3)交易功能:通过持仓数目和当前价的变化显示记录买卖过程,实现用户投资过程。

(4)查询信息功能:查询价格变化,查找当前时间收益最大的股票并输出其信息。

(5)计算信息功能:计算某只股票的盈亏,进行盈亏排序。

(6)更改信息功能:重新输入某只股票的信息,以防止初次输入错误。

(7)存档功能:将当前的操作结果存入文档。

(8)清屏功能:将当前显示框中的内容清除。

三、概要设计 

1 主要类

class Stock                   //股票类

{

private:

int count; //持仓数

double price; //当前价

double fall_rise; //涨幅;

double profit; //浮动盈亏

double total_value; //单只股票总值

char name[20]; //股票名称

char number[20]; //股票代码

public:

Stock(); //构造函数

void Create(); //创建Stock类的对象

double Get_profit(); //提取并返回成员变量profit

double Get_price(); //提取并返回成员变量price

char * Get_number(); //提取并返回成员变量number

double Get_Total(); //提取并返回成员变量total_value

void operator =(Stock &s); //重载“=”运算符

void Busines(); //进行买卖交易的函数

double Profit_Rise(); //提取并返回浮动盈亏

void Update(); //更新信息

};

 

class StockManage       //股票管理系统类

{

private:

Stock stock[10]; //定义Stock类的对象

double total_surplus;       //剩余金额

double total_stock;         //十只股票的总值

void MaxProfit()    //计算最大盈利

void change();            //更新模块

void Search()             //按照股票代码查看价格变化 按照天数

void Sort();    //盈利排序 原函数在源数据上操作,改为操作临时数组;不能改变原数据

bool getInfo(char * filename,int n,Stock stock[])//读取信息,(文件名字,结构体个数,要输入的stock,)

bool putInfo(char * filename,int n,Stock stock[])//写入信息,将信息读到数组stock里

public :

StockManage()            //构造函数

void menu(); //显示菜单

void show();              //显示/输入信息模块

void operate(Stock &stock); //操作交易模块

void query();              //查询模块

void calculate();         //计算模块

void saveFile(int year ,int month,int day,int n,Stock stock[]);//存档

void getFile(int year,int month,int day,int n,Stock stock[]) ;//读档

void run();      //运行管理系统

};

Main函数:
#include"StockManage.h"
int main()
{
system("color F1");                    //更改界面颜色
StockManage manage;                  //创建股票管理类对象manage
manage.run();                         //调用函数run
return 0;
}
#ifndef INCLUDE_STOCK_H_
#define INCLUDE_STOCK_H_
#endif
Stock.h文件:
#include <iostream>
#include <iomanip>
#include<cstdlib>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
class Stock                      //股票类
{
private:
int count;                   //持仓数
double price;                //当前价
double fall_rise;            //涨幅
double profit;               //盈亏
double total_value;          //单只股票总值
char name[20];               //股票名称
char number[20];             //股票代码
public:
Stock();                     //构造函数
void Create();               //创建股票信息
double Get_profit();         //返回盈亏
double Get_price();          //返回当前价
char * Get_number();         //返回股票代码
char * Get_name();           //返回股票名称
double Get_Total();          //返回单只股票总值
void operator =(Stock &s);   //重载运算符
void Busines();              //进行股票交易
double Profit_Rise();        //计算浮动盈利函数
void Update();               //更新显示个人股票信息
};

Stock::Stock()                           //构造函数
{
strcpy(number,"000");
strcpy(name,"000");
count=0.0;
price=0;
fall_rise=0;
profit=0;
total_value=0;
}

void Stock::Create()                      //创建股票信息
{
cout<<"请输入股票代码(用数字表示)"<<endl;
cin>>number;
cout<<"请输入股票名称"<<endl;
cin>>name;
cout<<"请输入当前价"<<endl;
cin>>price;
cout<<"请输入持仓数"<<endl;
cin>>count;
}

double Stock::Get_Total()     //返回单只股票总值
{
return total_value;
}

double Stock::Get_profit()    //返回盈利
{
return profit;
}

char *Stock::Get_number()    //返回股票代码
{
return number;
}

char *Stock::Get_name()    //返回股票名称
{
return name;
}

double Stock::Get_price()      //返回当前价
{
return price;
}

void Stock::operator =(Stock &s)  //重载 =运算符 使两个股票类对象之间可以进行赋值
{
strcpy(number,s.number);
strcpy(name,s.name);
count=s.count;
price=s.price;
fall_rise=s.fall_rise;
profit=s.profit;
total_value=s.total_value;
}

//输出股票基本信息
void Stock::Update()     //更新显示股票信息
{
cout<<setw(10)<<left<<number;              //域宽为10,左对齐,保证格式一致
cout<<setw(10)<<left<<name;
cout<<setw(10)<<left<<price;
cout<<setw(10)<<left<<count;
cout<<setw(10)<<left<<fall_rise;
cout<<setw(10)<<left<<profit;
cout<<setw(10)<<left<<total_value<<endl;
}

void Stock::Busines()          //记录买卖过程,进行股票交易
{
int num,k=1;
double p;
cout<<"请输入买入(售出)股票数目:"<<endl;
cout<<"注:买入股票数目只能为100的整数倍"<<endl;
do
{
cin>>num;
k=1;
if(num>0)
{
if(num%100!=0)
{
cout<<"输入错误,买入股票数目只能为100的整数倍。"<<endl;
k=0;
}
}
else
{
if(-num>count)
{
cout<<"输入错误,售出股票数目不能大于已持股票数目。"<<endl;
k=0;
}
}
}while(k==0);
cout<<"请输入买入(售出)价格:"<<endl;
cin>>p;
count=count+num;
fall_rise=p-price;
profit=fall_rise*num-(num*p*0.0003+num*p*0.0003);/*买入num股之后的盈利*/
price=p;
total_value=count*price;
}

double Stock::Profit_Rise()      //计算浮动盈亏
{
return profit;
}
StockManage.h文件:
#include"stock.h"
class StockManage                //股票管理系统类
{
private:
Stock stock[10];             //股票类对象数组
double total_stock;           //总值
double total_surplus;         //剩余金额
void MaxProfit();            //计算最大盈利
void Search();               //按照股票代码查看价格变化(按照天数)
void Sort();                 //盈利排序(原函数在源数据上操作,改为操作临时数组;不能改变原数据)
bool getInfo(char * filename,int n,Stock stock[]);//读取信息 (文件名字,结构体个数,要输入的stock)
bool putInfo(char * filename,int n,Stock stock[]);//写入信息,将信息读到数组stock里
public :
StockManage();                     //构造函数
void menu();                       //显示菜单
void show() ;                       //显示/输入信息模块
void operate(Stock &stock);           //操作交易模块
void query();                       //查询模块
void calculate();                    //计算模块
void change();                      //更新模块
bool saveFile(int year ,int month,int day,int n,Stock stock[]);//存档
bool getFile(int year,int month,int day,int n,Stock stock[]); //读档
void run();                         //运行管理系统
};

StockManage::StockManage()           //构造函数
{
total_stock=0;
total_surplus=100000;
}

void StockManage::Search()             //按照股票代码查看价格变化 按照天数
{
char num[20];
int i;
char choise;
int flag=0;
do
{
cout<<"请输入股票代码:\n";
cin>>num;
for(i=0;i<10;i++)
{
flag=0;
if(strcmp(num,stock[i].Get_number())==0)
{
flag=1;
cout<<"请核对股票名称"<<endl;
cout<<stock[i].Get_name()<<endl;
cout<<"请核对信息是否正确,若信息正确请输入t,若错误请输入f。"<<endl;
cin>>choise;
if(choise=='f')
{
cout<<"信息错误"<<endl;
cout<<"查询失败"<<endl;
return ;
}
break;
}
}
if(flag==0)
{
cout<<"抱歉,这只股票不存在,请重新输入:"<<endl;
}
}while(flag==0);
cout<<"请输入你想要查询起始的时间段(年/月/日/之间以空格隔开)"<<endl;
int day1,day2,month1;
int month2,year1,year2;
cout<<"请输入时间起点:\n";
cout<<"请输入起点年份:"<<endl;
cin>>year1;
cout<<"请输入起点月份:(请以两位数输入01-12之间的数字)"<<endl;
cin>>month1;
cout<<"请输入起点日期:(请以两位数输入01-31之间的数字)"<<endl;
cin>>day1;
cout<<"请输入时间终点:\n";
cout<<"请输入终点年份:"<<endl;
cin>>year2;
cout<<"请输入终点月份:(请以两位数输入01-12之间的数字)"<<endl;
cin>>month2;
cout<<"请输入终点日期:(请以两位数输入01-31之间的数字)"<<endl;
cin>>day2;
Stock temp[10];
getFile(year1,month1,day1,10,temp);     //读档
cout<<"股票"<<temp[i].Get_number()<<"  "<<temp[i].Get_name()<<"在"<<year1<<"-"<<month1<<"-"<<day1<<"的价格为"<<temp[i].Get_price()<<endl;
getFile(year2,month2,day2,10,temp);     //读档
cout<<"股票"<<temp[i].Get_number()<<"  "<<temp[i].Get_name()<<"在"<<year2<<"-"<<month2<<"-"<<day2<<"的价格为"<<temp[i].Get_price()<<endl;
}

void StockManage::Sort()   //盈利排序 原函数在源数据上操作,改为操作临时数组;不能改变原数据
{
Stock q;
Stock temp[10];             //临时数组
for(int j=0;j<10;j++)
{
temp[j]=stock[j];
}
for(int i=0;i<10;i++)         //进行冒泡排序
{
for(int j=i+1;j<10;j++)
{
if(temp[i].Get_profit()>temp[j].Get_profit())
{
q=temp[i];
temp[i]=temp[j];
temp[j]=q;
}
}
}
cout<<"股票代码  "<<"股票名称  "<<"价格      ";
cout<<"持仓数    "<<"涨幅      "<<"盈亏      ";
cout<<"总值      "<<endl;
for(int k=0;k<10;k++)
{
temp[k].Update();
}
}

bool StockManage::getInfo(char * filename,int n,Stock stock[])//读取信息,(文件名字,结构体个数,要输入的stock,)
{
FILE * file=fopen(filename,"rb");
if(file==NULL)
{
cout<<"打开文件:"<<filename<<"失败!"<<endl;
return false;
}
else
{
fread(stock,sizeof(Stock),n,file);          //块数据读取
fclose(file);
return true;
}
}

bool StockManage::putInfo(char * filename,int n,Stock stock[])//写入信息,将信息读到数组stock里
{
FILE * file=fopen(filename,"wb");
if(file==NULL)
{
cout<<"打开文件:"<<filename<<"失败!"<<endl;
return false;
}
else
{
fwrite(stock,sizeof(Stock),n,file);                    //块数据写入
fclose(file);
return true;
}
}

void StockManage::menu()                                //显示主菜单
{
cout<<"               "<<"====================================="<<endl;
cout<<"               "<<"====================================="<<endl;
cout<<"               "<<"            个人股票管理系统         "<<endl;
cout<<"               "<<"1----------显示/输入股票信息---------"<<endl;
cout<<"               "<<"2---------------交易-----------------"<<endl;
cout<<"               "<<"3---------------查询信息-------------"<<endl;
cout<<"               "<<"4---------------计算信息-------------"<<endl;
cout<<"               "<<"5---------------更改信息-------------"<<endl;
cout<<"               "<<"6---------------存档-----------------"<<endl;
cout<<"               "<<"7---------------退出-----------------"<<endl;
cout<<"               "<<"8---------------清屏-----------------"<<endl;
cout<<"               "<<"====================================="<<endl;
cout<<"               "<<"====================================="<<endl;
}

void StockManage::show()                        //显示/输入股票信息模块
{
char p_t;
int j=0;
bool judge_file=true;
do                     //选择进行创建还是进行查看功能
{
cout<<"输入t创建股票信息"<<endl;
cout<<"输入p查看股票信息"<<endl;
cout<<"请输入您想查看的信息的日期(t/p):"<<endl;
cin>>p_t;
}while (!(p_t =='p' || p_t== 't'));
if(p_t=='p')
{
int day,month,year;
cout<<"请输入您想查看的日期:"<<endl;
cout<<"请输入年份"<<endl;
cin>>year;
cout<<"请输入月份"<<endl;
cin>>month;
cout<<"请输入日期"<<endl;
cin>>day;
if(!getFile(year,month,day,10,stock))
{
judge_file=false;
}
}
else
{
for(int i=0;i<10;i++)
{
stock[i].Create();
}
}
if(judge_file==true)
{
cout<<"股票代码  "<<"股票名称  "<<"价格      ";
cout<<"持仓数    "<<"涨幅      "<<"盈亏      ";
cout<<"总值      "<<endl;
for(int i=0;i<10;i++)
{
stock[i].Update();
}
cout<<endl;
for(j=0;j<10;j++)
{
total_stock+=stock[j].Get_Total();
}
total_surplus=100000-total_stock;
cout<<"股票总值为:"<<total_stock<<endl;
cout<<"剩余金额为:"<<total_surplus<<endl;
}
}
void StockManage::operate(Stock &stock)                                   //操作交易模块
{
stock.Busines();
}

void StockManage::query()                                                 //查询模块
{
cout<<"1------------股票价格变化---------------"<<endl;
cout<<"2------------查找收益最大的股票---------"<<endl;
int choose;
cout<<"请选择操作项前的数字:"<<endl;
cin>>choose;
switch(choose)
{
case 1:
Search();
break;
case 2:
MaxProfit();
break;
}
}

void StockManage::calculate()                                            //计算模块
{
cout<<"1--------------计算盈亏----------------"<<endl;
cout<<"2------------计算盈亏排序--------------"<<endl;
int choose,i;
cout<<"请选择操作项前的数字:"<<endl;
cin>>choose;
switch(choose)
{
case 1:
for(i=0;i<10;i++)
{
cout<<"股票 "<<stock[i].Get_number()<<stock[i].Get_name()<<"的收益为:"<<stock[i].Profit_Rise()<<endl;
}
break;
case 2:
Sort();
break;
}
}

void StockManage::change()                         //更新模块
{
char num[20];
cout<<"请输入需要更改的股票代码:\n";
cin>>num;
int i;
for(i=0;i<10;i++)
{
if(strcmp(num,stock[i].Get_number())==0)     //找到对应的股票
{
stock[i].Create();
break;
}
}
for(i=0;i<10;i++)
{
stock[i].Update();
}
}

bool StockManage::saveFile(int year ,int month,int day,int n,Stock stock[])//存档
{
char filename[100];
sprintf(filename,"stock%d-%d-%d.dat",year,month,day);
if(putInfo(filename,n,stock))
{
cout<<"存档成功"<<endl;
return true;
}
return false;
}

bool StockManage::getFile(int year,int month,int day,int n,Stock stock[]) //读档
{
char filename[100];
sprintf(filename,"stock%d-%d-%d.dat",year,month,day);
if(getInfo(filename,n,stock))
{
cout<<"读档成功"<<endl;
return true;
}
return false;
}

void StockManage::run()      //运行管理系统
{
int k=0;
double to=0,su=0;
bool run=true;
while(run==true)
{
Stock temp[10];
menu();
int choose;
cout<<"请选择操作项前的数字:"<<endl;
cin>>choose;
switch(choose)
{
case 1:
show();
break;
case 2:
char response;
int i,j;
do
{
k=0;
to=0;
cout<<"请输入股票代码:"<<endl;
char n[20];
cin>>n;
for(i=0;i<10;i++)
{
if(strcmp(n,stock[i].Get_number())==0)
{
k=1;
break;
}
}
if(k==0)
{
cout<<"抱歉,这只股票不存在,请重新输入:"<<endl;
}
else                              //找到股票后进行操作
{
for(j=0;j<10;j++)               //对temp进行赋值,保证原数据的安全性
{
temp[j]=stock[j];
}
operate(temp[i]);
for(j=0;j<10;j++)
{
to+=temp[j].Get_Total();
}
su=100000-to;
if(su<=0)
{
cout<<"交易金额已超出剩余金额"<<endl;
}
else
{
for(j=0;j<10;j++)
{
stock[j]=temp[j];
}
}
cout<<"是否还需要进行交易(y/n)"<<endl;
cin>>response;
}
}while(response=='y'||response=='Y'|| k==0);
total_stock=0;
cout<<"股票代码  "<<"股票名称  "<<"价格      ";
cout<<"持仓数    "<<"涨幅      "<<"盈亏      ";
cout<<"总值      "<<endl;
for(i=0;i<10;i++)
{
total_stock+=stock[i].Get_Total();
stock[i].Update();
}
cout<<endl;
total_surplus=100000-total_stock;
cout<<"股票总值为:"<<total_stock<<endl;
cout<<"剩余金额为:"<<total_surplus<<endl;
break;
case 3:
query();
break;
case 4:
calculate();
break;
case 5:
change();
break;
case 6:
cout<<"请输入年份"<<endl;
int day,year,month;
cin>>year;
cout<<"请输入月份"<<endl;
cin>>month;
cout<<"请输入日期"<<endl;
cin>>day;
saveFile(year,month,day,10,stock);
break;
case 7:
run=false;                    //退出系统
break;
case 8:
system("cls");                 //清屏功能
break;
}
}
}

void StockManage::MaxProfit()               //计算最大盈利
{
int max=0;
for(int i=1;i<10;i++)
{
if(stock[max].Get_profit()<stock[i].Get_profit())
{
max=i;
}
}
cout<<"收益最大的股票代码为"<<endl;
cout<<stock[max].Get_number()<<endl;
cout<<"收益最大的股票名称为"<<endl;
cout<<stock[max].Get_name()<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: