1. 自定义一个示意性的复数类型complex,其中含有若干个成员函数,使用该类可以完成复数的加法以及对复数的输出。请完成类定义,并编制主函数,说明complex类对象,对定义的各成员函数进行调用。
class complex{
double real; //复数实部
double imag; //复数虚部
public:
complex(); //无参构造函数
complex(double r, double i); //2参构造函数
complex addCom(complex c2); //调用者对象与对象c2相加,返回complex类对象
void outCom (); //输出调用者对象的有关数据(各分量)
};
进一步,在类中添加对复数进行其他基本运算(如,复数减、乘、除、取模等)的相应成员函数,并通过主函数处的调用来验证各函数的使用正确性。
#include
#include
using namespace std;
class complex
{
private:
double real;
double imag;
public:
complex(){real=0;imag=0.0;}
~complex(){};
complex(double r,double i)
{
real=r;
imag=i;
}
complex operator+(complex &c2);
complex operator-(complex &c2);
complex operator*(complex &c2);
complex operator/(complex &c2);
double x(complex &c);
void display();
void set();
};
double complex::x(complex &c)
{
return sqrt(c.real*c.real+c.imag*c.imag);
}
void complex::set()
{
cout<<"请输入实部"<cin>>real;
cout<<"请输入虚部"<cin>>imag;
}
void complex::display()
{
cout<<"("<}
complex complex::operator +(complex &c2)
{
return complex(real+c2.real,imag+c2.imag);
}
complex complex::operator -(complex &c2)
{
return complex(real-c2.real,imag-c2.imag);
}
complex complex::operator *(complex &c2)
{
return complex((real*c2.real-imag*c2.imag),(real*c2.real-imag*c2.imag));
}
complex complex::operator /(complex &c2)
{
return
complex((real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),(imag*c2.real-real*c2.i mag)/(c2.real*c2.real+c2.imag*c2.imag));
}
int main()
{
complex c1,c2,c7(0,0);
double x1,x2;
cout<<"";c1.set();
cout<<"";c2.set();
complex c3,c4,c5,c6;
c3=c1+c2;c4=c1-c2;c5=c1*c2;c6=c1/c2;
x1=c1.x(c1);
x2=c1.x(c2);
cout<<"相加得"<cout<<"相减得"<cout<<"相乘得"<cout<<"相除得"<cout<<"第一个数的模"<cout<<"第二个数的模"<return 0;
}
2./*自定义一个简单的日期类DateType,它具有数据成员y、m、d,用来表示当前日期的年、月、日。而后设计该类欲实现(完成)的功能,进而设计出相应的类成员函数。
例如,下面给出的"雏形"可用来实现对天的增加,比较两个日期是否相等,以及对日期的输出等操作。请完成各类成员函数,并编制主函数,说明DateType类对象,对定义的各成员函数进行调用,以验证它们的正确性。
class DateType { //自定义的日期类DateType int y,m,d; //数据成员,表示当前日期的年、月、日
public:
DateType(int y0=1, int m0=1, int d0=1);
//构造函数,设定年、月、日;并设置参数默认值void incrementDay(); //增加1天
bool equal(DateType dt2); //判断二日期是否相等
void printDate(); //屏幕输出日期对象的有关数据(年、月、日)
};
注意,当对日期增加1天后,也会涉及所谓的"进位"问题:首先算出本"日"所在的月份具有的天数N,若加1之后的"日"数值超过所在的月份具有的天数N时,"进位"到月,而月份若超过12时还要"进位"到年。
思考:可对该类增加你所考虑到的其他功能,如,对日期进行输入,计算二日期的间隔天数,计算某日期为星期几,打印对象当前数据的y年m月的月历,一次增加若干天,对两个日期进行其他比较运算等。
*/
#include
#include //输出流
#include //库函数
class DateType //自定义的日期类DateType
{
private: //数据成员,表示当前日期的年、月、日
int y,m,d;
public:
DateType(){y=1;m=1;d=1;} //构造函数,设定年、月、日;并设置参数默认值Init(int a,int b,int c)
{
y=a;m=b;d=c;
}
int IsLeapY ear(int y)
{
return((y%4==0&&y%100!=0)||y%400==0);
//判断是否为闰年
}
void incrementDay(); //增加1天
bool equal(DateType dt2)
{
if(dt2.d==d&&dt2.m==m&&dt2.y==y)
return true;
else return false; //判断二日期是否相等
}
void yueli(); // 打印月历
void printDate()
{
cout<} //屏幕输出日期对象的有关数据(年、月、日)
int isWrong(); //出错处理
};
void DateType::incrementDay()
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(m==2&&IsLeapY ear(y))
{
if(d==29)
{d=1;m++;} //第二次加一不正确。
else
d++;
}
else
{
if(dd++;
else
{
if(m==12)
{d=1;m=1;y++;}
else
{d=1;m++;}
}
}
}
int DateType::isWrong()
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(IsLeapY ear(y)) days[1]=29;
if(y<1||m<1||m>12||d<1||d>days[m-1])
return 1;
else
return 0;
}
//----------------------------------------------
void DateType::yueli()
{
int i,n;
int day;
int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
long int Y ear_days = 0;
int Y ear_Start = 1;
int Per_Y ear_Days;
while(Y ear_Start{
if(IsLeapY ear(Y ear_Start))
Per_Y ear_Days=366;
else
Per_Y ear_Days=365;
Y ear_days=Y ear_days+Per_Y ear_Days;
Y ear_Start++;
}
for(int j=1;jswitch(j)
{
case 1:
Y ear_days=Y ear_days+days[0];
break;
case 2:
if(IsLeapY ear(y))
Y ear_days=Y ear_days+29;
else
Y ear_days=Y ear_days+days[1];
break;
case 3:
Y ear_days=Y ear_days+days[2];
break;
case 4:
Y ear_days=Y ear_days+days[3];
break;
case 5:
Y ear_days=Y ear_days+days[4];
break;
case 6:
Y ear_days=Y ear_days+days[5];
break;
case 7:
Y ear_days=Y ear_days+days[6];
break;
case 8:
Y ear_days=Y ear_days+days[7];
break;
case 9:
Y ear_days=Y ear_days+days[8];
break;
case 10:
Y ear_days=Y ear_days+days[9];
break;
case 11:
Y ear_days=Y ear_days+days[10];
break;
}
}
i =Y ear_days%7;
cout<cout<<"Mon Tue Wed Thu Fri Sat Sun"<for(n=0;n
cout<<" ";
day=1;
if(IsLeapY ear(y)&&m==2)
{
while(day=29)
{
if(day>1)
if(Y ear_days%7==0)
cout<if(day>=10)
cout<else
cout<Y ear_days++;
day++;
}
}
else
while(day=days[m-1])
{
if(day>1)
if(Y ear_days%7==0)
cout<if(day>=10)
cout<else
cout<Y ear_days++;
day++;
}
cout<}//此函数不太对
/*#include
void main()
{
int n,x,y,a[32],i,j,k;
n=x=y=i=-1;
while(n<0)
{
printf("请输入年份:");
scanf("%d",&n);
}
while(x>7||x<1)
{
printf("请输入星期(1-7数字):");
scanf("%d",&x);
}
while(y<0||y>12)
{
printf("请输入月份:");
scanf("%d",&y);
}
while(i<31)
a[++i] = i;
n%400==0?k=1:n%4==0&&n%100!=0?k=1:k=0;//是否为闰年n=0;//初始化天数
switch(y-1)//某月末至1月1日有多少天
{
case 11:n+=334;i=0;break;
case 10:n+=304;i=1;break;
case 9:n+= 273;i=0;break;
case 8:n+= 243;i=0;break;
case 7:n+= 212;i=1;break;
case 6:n+= 181;i=0;break;
case 5:n+= 151;i=1;break;
case 4:n+= 120;i=0;break;
case 3:n+= 90;i=1;break;
case 2:n+= 59;i=0;break;
case 1:n+= 31;i=3;break;
case 0:i=0;break;
}
if(y>2)//2月以后
{
n=(n+k+x)%7;//求要输出的空格个数
}
else n=(n+x)%7;
if(y==2&&k==1)//闰月
i = 4;
for(y=0;n>0;n--)
{
printf(" ");
y++;
}
for(j=1;j<=31-i;j++)
{
if(y%7==0)
putchar('\n');
printf("%4d ",a[j]);
y++;
}
printf("\n");
}*/
//--------------------------------------------------------------------- void main()
{
int y,m,d,n;
DateType date; //定义类对象。
cout<<"输入年、月、日,设定为当前日期:"<cin>>y>>m>>d;
date.Init(y,m,d);
while(date.isWrong())
{
cout<<"输入有误!请重新输入!"<cin>>y>>m>>d;
date.Init(y,m,d);
}
DateType date2;
DateType date3;
while(!date.isWrong())
{
char op;int i;
cout<<"请选择操作:"<cout<<"----------1.屏幕输出当前日期"<cout<<"----------2.比较两日期是否相等"<cout<<"----------3.屏幕输出n天之后的日期"<cout<<"----------4.打印当月月历"<cout<<"----------5.退出程序"<cout<<"您选择的操作是:";
cin>>op;
switch(op)
{
case'1':
cout<<"屏幕输出当前日期:"<date.printDate();
break;
case'2':
cout<<"输入待比较的日期:"<cin>>y>>m>>d;
date2.Init(y,m,d);
while(date2.isWrong())
{
cout<<"输入有误!请重新输入!"<cin>>y>>m>>d;
date2.Init(y,m,d);
}
cout<<"屏幕输出待比较的日期:"<date2.printDate();
if(date.equal(date2))
cout<<"此日期与当前日期相等!"<else
cout<<"此日期与当前日期不等!"<break;
case'3':
date3=date;
cout<<"输入在当前日期之上要增加的天数:"<cin>>n;
for(i=0;i{
date3.incrementDay();
}
cout<<"增加"<date3.printDate();
break;
case'4':
date.yueli();
break;
case'5':
exit(1);
break;
default:
cout<<"您的操作有误,请重新选择操作!"<break;
}
}
;}
3. 利用虚函数手段,按照3种不同的计算方法来求出Fibonacci数列的第n项(的具体项值)并输出。具体地说,可通过在基类baseCla及其派生类fib1Cla、fib2Cla和fib3Cla中说明如下的同一个虚函数“virtual double fib(int n);”,来实现求Fibonacci数列第n项值并返回的3种不同求解方法。例如,可设计并使用已经在第4和第5章的练习中所实现的求解方法:简单变量“数据平移”法、使用数组的实现法以及使用递归函数的实现法。
下面给出具体的“实现程序骨架”。
class baseCla { //自定义的基类baseCla
public:
virtual double fib(int n)=0; //基类baseCla中说明了一个虚函数fib,且为纯虚函数
};
class fib1Cla:public baseCla { //由基类baseCla派生出的fib1Cla类
public:
virtual double fib(int n); //派生类中说明同一个虚函数fib(简单变量“数据平移”法)
};
class fib2Cla:public baseCla { //派生类fib2Cla
public:
virtual double fib(int n); //派生类中说明同一个虚函数fib(使用数组的求解法)
};
…
void fun(baseCla *p, int n) {
//自定义函数fun,形参p为指向基类的指针,其对应实参
//可为不同派生类对象的地址;n指明要求出数列的第n项
double d = p->fib(n); //根据p指针值的不同,将调用不同派生类的虚函数fib
cout.flags(ios::scientific);
cout.precision(15);
cout<<"fib("<}
void main() {
fib1Cla obj1; //fib1Cla类对象obj1
fib2Cla obj2; //fib2Cla类对象obj2
fib3Cla obj3; //fib3Cla类对象obj3
cout<<"------------ fib1Cla ------------"<fun(&obj1, 1476); //简单变量“数据平移”求解方法,求fib(1476)
cout<<"------------ fib2Cla ------------"<fun(&obj2, 888); //数组求解方法,求fib(888)
cout<<"------------ fib3Cla ------------"<fun(&obj3, 35); //递归求解方法,求fib(35)
}
程序执行后,屏幕显示结果为:
------------ fib1Cla ------------
fib(1476)=1.306989223763399e+308
------------ fib2Cla ------------
fib(888)=1.704274475850073e+185
------------ fib3Cla ------------
fib(35)=9.227465000000000e+006
自定义如下形式的一个称为point的类,其对象表示平面上的一个点(x,y),并通过类成员方式对该类重载二目运算符“+”和“^”,用来求出两个对象的和以及两个对象(平面点)的距离。各运算符的使用含义(运算结果)如下所示:
(1.2, -3.5) + (-1.5, 6) = (-0.3, 2.5);
(1.2, -3.5) ^ (-1.5, 6) = 9.87623。
并编制主函数,说明类对象,而后通过类对象实现所定义的相关运算(以验证其正确性)。
class point {
double x,y;
public:
point (double x0=0, double y0=0){x=x0; y=y0;} point operator + (point pt2);
double operator ^ (point pt2);
void display();
};
#include
using namespace std;
class baseCla {
public:
virtual double fib(int n)=0;
};
class fib1Cla:public baseCla {
public:
virtual double fib(int n);
};
class fib2Cla:public baseCla {
public:
virtual double fib(int n);
};
class fib3Cla:public baseCla {
public:
virtual double fib(int n);
};
void fun(baseCla *p, int n) {
double d = p->fib(n);
cout.flags(ios::scientific);
cout.precision(15);
cout<<"fib("<}
double fib1Cla::fib(int n)
{
double s1=1,s0=0;
for(int i=1;i<=n/2;i++)
{
s1=s1+s0;
s0=s1+s0;
}
return s0;
}
double fib2Cla::fib(int n)
{
double k;
double f[1000]={1,1};
for(int i=2;i<=n-1;i++)
{
f[i]=f[i-2]+f[i-1];
k=f[i];
}
return k;
}
double fib3Cla::fib(int n)
{
double m;
if(n==1||n==2) m=1;
else
m=fib(n-1)+fib(n-2);
return m;
}
void main() {
fib1Cla obj1;
fib2Cla obj2;
fib3Cla obj3;
cout<<"------------ fib1Cla ------------"<fun(&obj1, 1476);
cout<<"------------ fib2Cla ------------"<fun(&obj2, 888);
cout<<"------------ fib3Cla ------------"<fun(&obj3, 35);
}
/*4. 设计一个简单的计算器类(类型),要求:(1)从键盘读入算式。
(2)可以进行加、减、乘、除运算。
(3)运算要有优先级。
(4)用户可以按任何的运算符出现顺序进行输入。(5)不限定用户输入的计算式的长度。
(6)可以带有括号()。
(7)有排错功能,当用户输入错误的算式时提示用户。例如,如果用户输入:(3 + 4 )* 5 - 7,计算结果应为28。*/
#include
#include
#include
using namespace std;
int addsubt();
int multdiv();
int number();
void error();
static char a[81];
static int b;
int main()
int ans ;
do
{
b=0;
cout<<"Enter expression (0 to quit):"<cin>>a;
ans=addsubt();
if(a[b]!='\0')
error();
if(ans!=0) cout<}while (ans!=0);
return 0;
}
int addsubt()
{
int rtn=multdiv();
while(a[b]=='+'||a[b]=='-')
{
int op=a[b++];
int opr2=multdiv();
if(op=='+')rtn+=opr2;
else rtn-=opr2;
}
return rtn;
}
int multdiv()
{
int rtn=number();
while (a[b]=='*'||a[b]=='/')
int op=a[b++];
int opr2=number();
if(op=='*')rtn *=opr2;
else rtn /=opr2;
}
return rtn;
}
int number()
{
int rtn;
if(a[b]=='(')
{
b++;
rtn=addsubt();
if(a[b++]!=')')
error();
return rtn;
}
if(!isdigit(a[b]))
error();
rtn=atoi(a+b);
while(isdigit(a[b]))
b++;
return rtn;
}
void error ()
{
cout<<'\r';
while (b--)
cout<<' ';
cout<<"^syntax error "<exit(-1);
}
/*5. 设计一个类CStudent,类中包含一个学生的基本数据如下:
编号,姓名,性别,年龄,数学成绩,计算机成绩,外语成绩。
并假设编号为整数:如,且从1号往后连续编码;姓名为字符串,性别为字符。
1 LiPing m 18 89 98 94
请采用binary文件形式,并使用随机读写处理方式,对自定义CStudent类的对象数据进行存储与读写处理
(即是说,总按具有连续编码的编号num为"序"来对文件中的各对象数据进行随机读写处理)。
并设计该类的成员函数,
而且对输出运算符"<<"进行重载,使该运算符能够完成将一个学生的信息输出到屏幕上。要求成员函数完成以下功能:
(1)从键盘输入一个学生的有关信息,并将它们存入到数据文件中(按编号来确定写出位置)。
(2)按编号对学生信息进行检索并将检索结果显示在屏幕上。
(3)按姓名对学生信息进行检索并将检索结果显示在屏幕上。
(4)计算某编号学生的总成绩与平均成绩。
(5)列出所有总成绩超过n分的性别为s同学的有关信息(n,s由用户从键盘输入)。
思考:可进一步对上述程序进行扩充,如,添加学生基本数据(籍贯,专业,班级,其他各门成绩,奖惩记录等),并添加所需要的其他相关处理函数(如可通过咨询教学办公室管理人员后确立),进而将其编制成为一个简单而实用的小型学籍与成绩管理软件。
*/
#include
#include
#include
using namespace std;
class CStudent
{
int num;
char name[10];
char sex[10];
int age;
int math,com,eng,total;
double ave;
public:
void getdata()
{
cout<<"编号: ";
cin>>num;
cout<cin>>name;
cout<cin>>sex;
cout<cin>>ege;
cout<cin>>math;
cout<cin>>com;
cout<cin>>eng;
cout<}
void outdate()
{
total=math+com+eng;
ave=total/3;
cout<<