资源描述
第二阶段 面向对象程序设计
1.题目:
自定义一个示意性的复数类型complex,其中含有若干个成员函数,使用该类可以完成复数的加减乘除法以及对复数的输出。请完成类定义,并编制主函数,说明complex类对象,对定义的各成员函数进行调用。
源代码:
#include <iostream>
using namespace std;
class complex{ //定义一个complex类,里面包含所需要的基本数据和基本函数
private:
double real;
double imag;
public:
complex();
complex(double r,double i);
complex jiaCom(complex c2);
complex jianCom(complex c2);
complex chengCom(complex c2);
complex chuCom(complex c2);
complex moCom(complex c2);
void out();
void outCom();
};
complex::complex() {real=0;imag=0;} //类外定义析构函数
complex::complex(double r,double i):real(r),imag(i){}
void complex::out() //定义复数的输出函数
{cout<<"原复数为:("<<real<<"+"<<imag<<"i)"<<endl;}
complex complex::jiaCom(complex c2) //定义复数的加法函数
{
real=real+c2.real;imag=imag+c2.imag;
cout<<"两复数进行加法运算后的负数为:";
return complex(real,imag);
}
complex complex::jianCom(complex c2) //定义复数的减法函数
{
real=real-c2.real;imag=imag-c2.imag;
cout<<"两复数进行减法运算后的负数为:";
return complex(real,imag);
}
complex complex::chengCom(complex c2) //定义复数的乘法函数
{
double x,y;
x=real;y=imag;
real=x*c2.real-y*c2.imag;
imag=c2.real*y+x*c2.imag;
cout<<"两复数进行乘法运算后的负数为:";
return complex(real,imag);
}
complex complex::chuCom(complex c2) //定义复数的除法函数
{
double x,y;
x=real;y=imag;
real=(x*c2.real+y*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
imag=(c2.real*y-x*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
cout<<"两复数进行除法运算后的负数为:";
return complex(real,imag);
}
void complex::outCom() //运算函数输出
{cout<<"("<<real<<"+"<<imag<<"i)"<<endl<<endl<<endl;}
int main()
{
while(1)
{
complex c1(2,4),c2(6,10);
int a;
c1.out();
c2.out();
cout<<"请输入复数的运算方式:"<<endl;
cout<<"(其中用数字1代表进行加运算,数字2代表进行减运算,"<<
"数字3代表进行乘运算,数字4代表进行除运算)"<<endl;
cin>>a;
if(a!=1&&a!=2&&a!=3&&a!=4) {cout<<"不符合要求。"<<endl;break;} //调用复数的加减乘除函数
if(a==1) c1.jiaCom(c2);
if(a==2) c1.jianCom(c2);
if(a==3) c1.chengCom(c2);
if(a==4) c1.chuCom(c2);
c1.outCom();
}
return 0;
}
2. 自定义一个简单的日期类DateType,它具有数据成员y、m、d,用来表示当前日期的年、月、日。而后设计该类欲实现(完成)的功能,进而设计出相应的类成员函数。
源代码:
#include<iostream>
using namespace std;
class DateType{
private:
int y,m,d;
public:
DateType(int yo=1,int m0=1,int d0=1); //定义一个天类,包含一些基本的函数
void incrementDay();
bool equal(DateType dt2);
void printDate();
void set_DateType();
};
DateType::DateType(int y0,int m0,int d0):y(y0),m(m0),d(d0){}
void DateType::set_DateType()
{cin>>y>>m>>d;}
void DateType::incrementDay() //对输入的日期加一天
{
if(d==28&&m==2)
{
if((y%4==0&&y%100!=0)||y%400==0) d++;
else {d=0;m=3;}
}
if(d==29&&m==2)
{
if((y%4==0&&y%100!=0)||y%400==0) {d=1;m=3;}
}
if(d==30)
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12) d++;
else {d=1;m++;}
}
if(d==31)
{
if(m==12) {d=1;m=1;y++;}
else {d=1;m++;}
}
else d++;
}
bool DateType::equal(DateType dt2) //判断该日期是否和系统预设的日期相同,并返回一定值
{
if(y==dt2.y&&m==dt2.m&&d==dt2.d) return true;
else return false;
}
void DateType::printDate()
{
cout<<"此时该天的日期是:"<<y<<"年"<<m<<"月"<<d<<"日"<<endl;
}
int main()
{
DateType dt1(2011,1,1),dt2,dt3;
cout<<"系统预设:";
dt1.printDate();
cout<<"输入两个不同的日期:"<<endl; //输入不同的日期,并对其输出
dt2.set_DateType();
dt3.set_DateType();
cout<<"系统输入为:";dt2.printDate();
cout<<"系统输入为:";dt3.printDate();
dt2.incrementDay(); //调用加一天的函数
dt3.incrementDay();
cout<<"输入日期加后:"<<endl;
dt2.printDate();
dt3.printDate();
if(dt2.equal(dt1))
cout<<"系统输入与系统预设日期相同。"<<endl; //比较是否相同并输出比较结果
else
cout<<"系统输入与系统预设日期不相同。"<<endl;
if(dt3.equal(dt1))
cout<<"系统输入与系统预设日期相同。"<<endl;
else
cout<<"系统输入与系统预设日期不相同。"<<endl;
return 0;
}
源代码:
#include<iostream>
#include<iomanip>
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);
};
double fib1Cla::fib(int n)
{
long double a=1,b=1;
for(int i=1;i<=n/2;i++)
{a=a+b;b=a+b;}
return b;
}
double fib2Cla::fib(int n)
{
long double a[2000]={1,1};
double b;
if(n>2000) cout<<"error!"<<endl;
for(int i=2;i<=n;i++)
{a[i]=a[i-1]+a[i-2];b=a[i];}
return b;
}
double fib3Cla::fib(int n)
{
long double a;
if(n==1||n==0) a=1;
else a=fib(n-1)+fib(n-2);
return a;
}
void fun(baseCla *p,int n)
{
long double d=p->fib(n-1);
cout.flags(ios::scientific);
cout.precision(15);
cout<<"fib("<<n<<")="<<d<<endl;
}
void main()
{
fib1Cla obj1;
fib2Cla obj2;
fib3Cla obj3;
cout<<"--------------fib1Cla--------------"<<endl;
fun(&obj1,1476);
cout<<"--------------fib2Cla--------------"<<endl;
fun(&obj2,888);
cout<<"--------------fib3Cla--------------"<<endl;
fun(&obj3,35);
}
3(2).自定义如下形式的一个称为point的类,其对象表示平面上的一个点(x,y),并通过类成员方式对该类重载二目运算符“+”和“^”,用来求出两个对象的和以及两个对象(平面点)的距离。各运算符的使用含义(运算结果)如下所示:
(1.2, -3.5) + (-1.5, 6) = (-0.3, 2.5);
(1.2, -3.5) ^ (-1.5, 6) = 9.87623。
并编制主函数,说明类对象,而后通过类对象实现所定义的相关运算(以验证其正确性)。
源代码:
#include<iostream>
#include<cmath>
using namespace std;
class point
{
private:
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();
};
point point::operator + (point &pt2)
{
point c;
c.x=x+pt2.x;
c.y=y+pt2.y;
return c;
};
double point::operator ^ (point &pt2)
{
double c;
c=sqrt((x-pt2.x)*(x-pt2.x)+(y-pt2.y)*(y-pt2.y));
return c;
};
void point::display()
{
cout<<"("<<x<<","<<y<<")";
};
int main()
{
point pt,pt1(1.2,-3.5),pt2(-1.5,6);
double c;
pt=pt1+pt2;
c=pt1^pt2;
pt1.display();
cout<<"+";
pt2.display();
cout<<"=";
pt.display();
cout<<endl;
pt1.display();
cout<<"^";
pt2.display();
cout<<"="<<c<<endl;
return 0;
}
6.编写一个具有如下样式的类模板tmplt,用于实现所谓的反序输出问题,其中使用了类型参数T(使所处理的元素类型可变化)以及普通参数n(元素个数也可变化):
源代码:
#include<iostream>
using namespace std;
template <class T,int n>
class tmplt
{
T arr[n];
public:
void dateIn();
void reverseOut();
};
template <class T,int n>
void tmplt<T,n>::dateIn()
{
for(int i=0;i<n;i++)
cin>>arr[i];
}
template <class T,int n>
void tmplt<T,n>::reverseOut()
{
cout<<"该位数的反序数为:";
for(int i=n-1;i>=0;i--)
cout<<arr[i]<<" ";
cout<<endl;
}
int main()
{
tmplt<int,8> t1;
cout<<"请输入个整型数:"<<endl;
t1.dateIn();
t1.reverseOut();
tmplt<float,8> t2;
cout<<"请输入个浮点型数:"<<endl;
t2.dateIn();
t2.reverseOut();
tmplt<char,8> t3;
cout<<"请输入个字符:"<<endl;
t3.dateIn();
t3.reverseOut();
return 0;
}
5.设计一个类CStudent,类中包含一个学生的基本数据如下:
编号,姓名,性别,年龄,数学成绩,计算机成绩,外语成绩。
并假设编号为整数,且从1号往后连续编码;姓名为字符串,性别为字符。如:
1 LiPing m 18 89 98 94
请采用binary文件形式,并使用随机读写处理方式,对自定义CStudent类的对象数据进行存储与读写处理(即是
说,总按具有连续编码的编号num为"序"来对文件中的各对象数据进行随机读写处理)。并设计该类的成员函数,
而且对输出运算符"<<"进行重载,使该运算符能够完成将一个学生的信息输出到屏幕上。要求成员函数完成以下功能:
(1) 从键盘输入一个学生的有关信息,并将它们存入到数据文件中(按编号来确定写出位置)。
(2) 按编号对学生信息信息进行检索并将检索结果显示在屏幕上。
(3) 计算某编号学生的总成绩。
源代码:
#include<fstream>
#include<iostream>
#include<iomanip>
using namespace std;
class CStudent
{
int Num;
char Name[10];
char Sex[10];
int Age;
int Math,Com,Eng,Total;
public:
void getdata() //输入类元素
{
cout<<"编号: ";
cin>>Num;
cout<<endl<<"姓名: ";
cin>>Name;
cout<<endl<<"性别: ";
cin>>Sex;
cout<<endl<<"年龄: ";
cin>>Age;
cout<<endl<<"数学成绩: ";
cin>>Math;
cout<<endl<<"计算机成绩:";
cin>>Com;
cout<<endl<<"外语成绩: ";
cin>>Eng;
cout<<endl;
}
void outdate() //输出类元素
{
Total=Math+Com+Eng;
cout<<setw(5)<<Num<<setw(5)<<Name<<setw(5)<<Sex<<setw(5)<<Age<<setw(8)
<<Math<<setw(10)<<Com<<setw(8)<<Eng<<setw(8)<<Total<<endl;
}
};
void get() //把类数据输入到磁盘中
{
ofstream outfile("stud.dat");
CStudent s;
int n;
cout<<"输入数据:"<<endl;
cout<<"学生人数:";
cin>>n;
for(int i=0;i<n;i++)
{
cout<<"第"<<i+1<<"个学生:"<<endl;
s.getdata();
outfile.write((char*)&s,sizeof(s));
};
outfile.close();
}
void put() //把类数据从磁盘中输出
{
ifstream infile("stud.dat");
CStudent s;
cout<<"输出数据:"<<endl;
cout<<" 编号姓名性别年龄数学成绩计算机成绩外语成绩总分"<<endl;
infile.read((char *)&s,sizeof(s));
while(infile)
{
s.outdate();
infile.read((char*)&s,sizeof(s));
};
infile.close();
}
int main()
{
int a;
do //选择应执行程序
{
cout<<"选择:1:输入数据2:输出数据其他退出:";
cin>>a;
switch(a)
{
case 1:get();break; //输入数据
case 2:put();break; //输出数据
default:cout<<"error"<<endl;break;
}
}while(a==1||a==2);
return 0;
}
第 11 页 共 11 页
展开阅读全文