资源描述
《C++程序设计》课程设计报告
姓 名:***
班 级:09软件技术2班
学 号:0901030213
项目一 电子日历
一、 设计要求
设计并实现如下功能:
1、 设置日期,日期由键盘上输入。
2、 用日/月/年格式输出日期
3、 在输入日期合法的情况下可实现日期增加一天的操作
二、 设计思想
1、 类的结构图
Date
+Display():void
+AddOneDay():void
+SetDay():void
+Date(){year=0;month=0;day=0;}:void
+friend bool Legal(int y, int m, int d):void
#year:int
#month:int
#day:int
2、 程序主要功能说明
定义了一个设置时间函数SetDay(),用来实现日期的设置,Display()函数显示输入的日期,AddOneDay()函数实现加一天功能,对以上功能还加入了功能选择,用户可根据自己的需要,选择想要获得的功能,还能连续查询,手动控制程序的退出。
三、 源代码
#include <iostream>
using namespace std;
//Date类的定义
class Date
{
public:
Date(){year=0;month=0;day=0;}
void Display();//输出日期函数声明
void AddOneDay();//查询下一天函数声明
void SetDay();//日期设置函数声明
friend bool Legal(int y, int m, int d);//声明判断日期是否合法函数为友元函数,因为成员函数调用了该函数
protected:
int year;
int month;
int day;
};
void Date::Display()//实现日期的输出
{
cout<<"当前日期是:"<<endl;
cout <<day <<"/" <<month <<"/" <<year <<endl;
}
void Date::AddOneDay()//日期加一天函数
{
if(Legal(year,month,day+1))//只加号数
day++;
else if(Legal(year,month+1,1))//月份过度
month++,day=1;
else if(Legal(year+1,1,1))//年份过度
day=1,month=1,year++;
}
void Date::SetDay()
{
int y;
int m;
int d;
cout<<"请设置当前日期,年 月 日中间用空格隔开:"<<endl;
cin>>y>>m>>d;
while(!Legal(y,m,d))
{
cout<<"您输入的日期不合法,请重新设置:"<<endl;
cin>>y>>m>>d;
}
year=y;
month=m;
day=d;
}
bool Legal(int y, int m, int d)//判断输入日期是否合法,布尔函数
{
if(y>9999||y<1||d<1||m<1||m>12)
return false;
int dayLimit=31;//限制日期,避免输入不合法日期,4,6,9,11最大日期为30
switch(m)
{
case 4: case 6: case 9: case 11:
dayLimit--;
}
if(m==2) dayLimit = ((y%4==0&&y%100!=0)||y%400==0) ? 29 : 28;//判断平闰年,限制2月份最大日期为28或29
return (d>dayLimit)? false : true;
}
int main()
{
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆"<<endl;
cout<<"☆ 欢迎使用简单电子日历,请输入功能选择:(0-3) ★"<<endl;
cout<<"★ 0.退出 ☆"<<endl;
cout<<"☆ 1.设置日期 ★"<<endl;
cout<<"★ 2.输出日期 ☆"<<endl;
cout<<"☆ 3.日期加一天 ★"<<endl;
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆"<<endl;
int num;
Date date;
cin>>num;//输入功能选择
if(!(num==0 ||num==1 || num==2 || num==3))
{
cout<<"输入有误,请重新选择:(0-3)"<<endl;
cin>>num;
}
else
{
do
{
if(num==0) break;
if(num==1) date.SetDay();
if(num==2) date.Display();
if(num==3)
{
date.Display();
date.AddOneDay();//加一天
cout<<endl<<"下一天的日期是:"<<endl;
date.Display();
}
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆"<<endl;
cout<<"☆ 欢迎使用简单电子日历,请输入功能选择:(0-3) ★"<<endl;
cout<<"★ 0.退出 ☆"<<endl;
cout<<"☆ 1.设置日期 ★"<<endl;
cout<<"★ 2.输出日期 ☆"<<endl;
cout<<"☆ 3.日期加一天 ★"<<endl;
cout<<"★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆"<<endl;
cin>>num;
if(!(num==0 ||num==1 || num==2 || num==3))
{
cout<<"输入有误,请重新选择:(0-3)"<<endl;
cin>>num;
}
}while(num!=0); //手动选择退出
}
cout<<"\t欢迎下次使用!"<<endl;
return 0;
}
四、 测试结果
五、 总结
最开始设计时,没想太多,写到设置日期时发现了问题,设置年月好办,等到设置日期时,发现要考虑的方面太多而无从下手,设置号数要考虑月份,考虑月份的同时还要考虑平闰年,即要考虑2月这个特殊月份,对日期的算法也是后来到网上借鉴过来的,个人能力还有待提高。
项目二 人员信息管理系统
一、 设计要求
设计小型公司的人员信息管理系统,它涵盖了面向对象程序设计的基本方法,具有存储,查询功能,某小型公司,主要有4类人员:经理,兼职技术人员,销售经理和兼职推销员.现在,需要存储这些人员的姓名,编号,级别,当月薪水,计算月薪总额并显示全部信息.设计要求实现如下功能:
月薪计算方法:
经理拿固定工资8000
兼职技术人员按每小时100元领取月薪
兼职推销员的月薪按该推销员当月销售额的4%提成;
销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5%
设计说明:此程序首先设计一个雇员类employee,然后由雇员类派生出四类人员进行设计。
二、设计思想
1、 类的结构图
employee
#name:char[20]
#grbh:int
#jb:int
#yxze:float
#zdbh:int=1000
+employee()
+~employee()
<<abstract>>+pay():void
<<virtual>>+promote(increment:int=0):void
+szname(:char*):void
+dyname():char*
+tqbh():int
+tqjb():int
+tqyx():float
jzjs txyl jll
-mxscj:float #bfb:float #gdyx:float
-gzsj:int #xse:float +jll()
+jzjs() +txyl() +pay():void
+szgzsj(wh:int):void +setxse(sl:float):void +promote(:int):void
+pay():void +pay():void
+promote(:int):void +promote(:int):void
xsjl
+xsjl()
+pay():void
+promote(:int):void
2、程序功能说明
此程序包含如下功能:设置四类成员的姓名,级别并计算其应得工资为多少,计算工资按不同方法计算,设置姓名用到数组char name[20],设计出一个雇员基类employee类,然后派生出四个不同的类:jzjs、jll、txyl、xsjl,工资计算用pay()函数完成各自的工资计算,函数体中是各类员工工资结算的方法,最后的结果使用基类指针访问各派生类函数,完成结果的输出。
二、 源程序
#include<iostream>
#include<cstring>
using namespace std;
class employee
{
protected:
char name[20];
int grbh;
int jb;
float yxze;
static int zdbh;
public:
employee();
~employee();
virtual void pay()=0;
virtual void promote(int increment=0);
void szname(char *);
char * dyname();
int tqbh();
int tqjb();
float tqyx();
};
class jzjs:public employee
{
private:
float mxscj;
int gzsj;
public:
jzjs();
void szgzsj(int h);
void pay();
void promote(int);
};
class txyl:virtual public employee
{
protected:
float bfb;
float xse;
public:
txyl();
void setxse(float s);
void pay();
void promote(int);
};
class jll:virtual public employee
{
protected:
float gdyx;
public:
jll();
void pay();
void promote(int);
};
class xsjl:public jll,public txyl
{
public:
xsjl();
void pay();
void promote(int);
};
int employee::zdbh=1000;
employee::employee()
{ grbh=zdbh++;
jb=1;
yxze=0.0;
}
employee::~employee()
{}
void employee::promote(int increment)
{ jb+=increment; }
void employee::szname(char* names)
{ strcpy(name,names); }
char* employee::dyname()
{ return name;}
int employee::tqbh()
{ return grbh;}
int employee::tqjb()
{ return jb;}
float employee::tqyx()
{ return yxze;}
jzjs::jzjs()
{ mxscj=100;}
void jzjs::szgzsj(int h)
{ gzsj=h;}
void jzjs::pay()
{ yxze=mxscj*gzsj;}
void jzjs::promote(int)
{ employee::promote(2);}
txyl::txyl()
{ bfb=0.04;}
void txyl::setxse(float s)
{ xse=s;}
void txyl::pay()
{ yxze=xse*bfb;}
void txyl::promote(int)
{ employee::promote(0);}
jll::jll()
{ gdyx=8000;}
void jll::pay()
{ yxze=gdyx;}
void jll::promote(int )
{ employee::promote(3);}
xsjl::xsjl()
{ gdyx=5000;
bfb=0.05;
}
void xsjl::pay()
{ yxze=gdyx+bfb*xse;}
void xsjl::promote(int)
{ employee::promote(2);}
void main()
{ jll a;
jzjs b;
xsjl c;
txyl d;
char namestr[20];
employee *emp[4]={&a,&b,&c,&d};
int i;
for(i=0;i<4;i++)
{
cout<<"请输下一个雇员的姓名:";
cin>>namestr;
emp[i]->szname(namestr);
emp[i]->promote();
}
cout<<"请输入兼职技术人员"<<b.dyname()<<"本月的工作时数:";
int gs;
cin>>gs;
b.szgzsj(gs);
cout<<"请输入销售经理"<<c.dyname()<<"所管辖部门本月的销售总额:";
float ze;
cin>>ze;
c.setxse(ze);
cout<<"请输入推销员"<<d.dyname()<<"本月的销售额:";
cin>>ze;
d.setxse(ze);
for(i=0;i<4;i++)
{
emp[i]->pay();
cout<<emp[i]->dyname()<<"编号"<<emp[i]->tqbh()
<<"级别为"<<emp[i]->tqjb()<<"级,本月工资"<<emp[i]->tqyx()<<endl;
}
}
四、测试结果
五、总结
多文件结构掌握得不是很好,所以写成单文件结构,对照书本上的程序实例进行修改,改完后发现有一条报错,查找错误时却发现十几处错误,不知从哪里改起,最后还是对照书本改出来了,对整个程序完全看懂了,但是如果要自己写还有难度,因为思维不够缜密,很难写出完整的程序。
展开阅读全文