1.输出运算符重载之复数类
试题描述
定义复数Complex类,并重载输出运算符<<函数为Complex类的友元函数。类有两个保护数据成员,分别是int类型的real、image代表实部和虚部。类有一个构造函数(两个参数,参数默认值均为0,在初始化列表中将形参赋给对应的数据成员)。
int main()
{
…… //输入两个整数a和b,再使用这两个整数创建复数对象z1
cout << z1 << endl; //输出z1对象
return 0;
}
注意:1.请务必提交完整的程序代码,不要修改代码框架。2.请不要修改试题描述中的所有标识符,注意大小写敏感。
输入
输入两个整数,用一个空格隔开。
输出
输出一个复数表达式。
输入示例1
2 -5
输出示例1
2-5i
输入示例2
2 0
输出示例2
2
数据范围
输入为int范围的整数
代码实现
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
class Complex
{
protected:
int real,image;
public:
Complex(int r=0,int i=0):real(r),image(i){}
friend ostream operator<<(ostream& out,const Complex& z);
};
ostream operator<<(ostream& out,const Complex& z)
{
if(z.real==0&&z.image==0) out<<"0"<<endl;
else if(z.real==0) out<<z.image<<"i"<<endl;
else if(z.image==0) out<<z.real<<endl;
else if(z.image>0) out<<z.real<<"+"<<z.image<<"i"<<endl;
else if(z.image<0) out<<z.real<<z.image<<"i"<<endl;
}
int main()
{
int a,b; //输入两个整数a和b,再使用这两个整数创建复数对象z1
cin>>a>>b;
Complex z1(a,b);
cout << z1 << endl; //输出z1对象
return 0;
}
2.函数模板之互换问题
试题描述
阅读下面main()函数体代码结构并仔细观察输入输出示例,请定义互换函数模板void Exchange(……),定义日期Date类(保护的int类型的数据成员year、month、day)。
从main()函数体可知,为保证程序正确执行,必须为Date类定义恰当的构造函数、重载‘<<’输出运算符,但是不必为Date类重载赋值运算符函数,可以使用默认赋值运算符函数。
int main()
{
int a, b; //定义整型变量
double c, d; //定义浮点型变量
int y1, m1, d1, y2, m2, d2;
cin >> a >> b >> c >> d >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
Date day1(y1, m1, d1), day2(y2, m2, d2); //定义Date型变量
……//参照输出示例,输出互换前a与b的值
Exchange(a, b); //调用模板函数void Exchange(int,int)
……//参照输出示例,输出互换后a与b的值
…… //参照输出示例,输出互换前c与d的值,要求小数点后必须保留2位有效数字(四舍五入),不足补零
Exchange(c, d); //调用模板函数void Exchange(double,double)
…… //参照输出示例,输出互换后c与d的值,要求小数点后必须保留2位有效数字(四舍五入),不足补零
…… //参照输出示例,输出互换前day1与day2的值
Exchange(day1, day2); //调用模板函数void Exchange(Date,Date)
…… //参照输出示例,输出互换后day1与day2的值
return 0;
}
注意:1.请务必提交完整的程序代码,不要修改代码框架。2.请不要修改试题描述中的所有标识符,注意大小写敏感。3.为了在不同编译平台下保证代码正确性,请加入头文件。
输入
输入两个整数、两个浮点数、六个非负整数(日期数据),相邻两项之间以空格隔开。
输出
依据题意输出若干行。每行的两个值之间用一个逗号和一个空格隔开,浮点数输出要求小数点后必须保留2位有效数字(四舍五入),不足补零。
输入示例
11 22 33.312 44.4 1949 10 1 2005 1 15
输出示例
互换前a与b为:11, 22
互换后a与b为:22, 11
互换前c与d为:33.31, 44.40
互换后c与d为:44.40, 33.31
互换前day1与day2为:1949年10月1日, 2005年1月15日
互换后day1与day2为:2005年1月15日, 1949年10月1日
数据范围
输入int范围的整数、double范围的浮点数、正确的日期数据
代码实现
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
template <class T>
void Exchange(T& a,T& b)
{
T c=a;
a=b;
b=c;
}
class Date
{
protected:
int year,month,day;
public:
Date(int y,int m,int d):year(y),month(m),day(d){}
friend ostream& operator<<(ostream& dout,const Date& d);
};
ostream& operator<<(ostream& dout,const Date& d)
{
dout<<d.year<<"年"<<d.month<<"月"<<d.day<<"日";
return dout;
}
int main()
{
int a, b; //定义整型变量
double c, d; //定义浮点型变量
int y1, m1, d1, y2, m2, d2;
cin >> a >> b >> c >> d >> y1 >> m1 >> d1 >> y2 >> m2 >> d2;
Date day1(y1, m1, d1), day2(y2, m2, d2); //定义Date型变量
cout<<"互换前a与b为:"<<a<<","<<b<<endl;//参照输出示例,输出互换前a与b的值
Exchange(a, b); //调用模板函数void Exchange(int,int)
cout<<"互换前a与b为:"<<a<<","<<b<<endl;//参照输出示例,输出互换后a与b的值
cout<<"互换前c与d为:"<<setprecision(2)<<setiosflags(ios::fixed)<<c<<","<<d<<endl;//参照输出示例,输出互换前c与d的值,要求小数点后必须保留2位有效数字(四舍五入),不足补零
Exchange(c, d); //调用模板函数void Exchange(double,double)
cout<<"互换前c与d为:"<<setprecision(2)<<setiosflags(ios::fixed)<<c<<","<<d<<endl;//参照输出示例,输出互换后c与d的值,要求小数点后必须保留2位有效数字(四舍五入),不足补零
cout<<"互换前day1与day2为:"<<day1<<","<<day2<<endl;//参照输出示例,输出互换前day1与day2的值
Exchange(day1, day2); //调用模板函数void Exchange(Date,Date)
cout<<"互换前day1与day2为:"<<day1<<","<<day2<<endl;//参照输出示例,输出互换后day1与day2的值
return 0;
}
3.类模板之堆栈问题
试题描述
根据下面的main()函数以及程序执行结果,请定义堆栈类模板Stack。类模板Stack的成员描述如表1所示。

int main()
{
Stack <int, 100> stk1; //创建对象
Stack <double, 100> stk2; //创建对象
int n, m;
cin >> n >> m;
…… //输入n个整数,并压入堆栈stk1中
…… //输入m个浮点数,并压入堆栈stk2中
int a;
if (stk1.Pop(a))
cout << a << endl;
if (stk1.Pop(a))
cout << a << endl;
double x;
if (stk2.Pop(x))
cout << x << endl;
if (stk2.Pop(x))
cout << x << endl;
return 0;
}
注意:1.请务必提交完整的程序代码,不要修改代码框架。2.请不要修改试题描述中的所有标识符,注意大小写敏感。3.为了在不同编译平台下保证代码正确性,请加入头文件。
输入
输入包含三行:
第一行包括两个整数n和m,用一个空格隔开,且1 < n, m <= 100。
第二行为n个整数,邻近两数之间用一个空格隔开。
第三行为m个浮点数,邻近两数之间用一个空格隔开。
输出
输出两行,分别为弹出stk1栈、stk2栈的数据,最后两个数据输出要求小数点后必须保留2位有效数字(四舍五入),不足补零。
输入示例
3 2
10 20 30
0.33 3.14
输出示例
30
20
3.14
0.33
数据范围
输入为int范围的整数和double范围的浮点数
代码实现
#include <iostream>
#include <iomanip>
using namespace std;
template <class T,int n>
class Stack
{
protected:
T* m_data;
int m_count;
public:
Stack()
{
m_data=new T[n];
Clear();
}
~Stack()
{
delete []m_data;
}
void Clear()
{
m_count=0;
}
void Push(T a)
{
m_data[m_count++]=a;
}
bool Pop(T& a)
{
if(m_count==0) return 0;
a=m_data[--m_count];
return 1;
}
};
int main()
{
Stack <int, 100> stk1; //创建对象
Stack <double, 100> stk2; //创建对象
int n, m;
cin >> n >> m;
for(int i=0;i<n;i++)//输入n个整数,并压入堆栈stk1中
{
int x;
cin>>x;
stk1.Push(x);
}
for(int i=0;i<m;i++)//输入m个浮点数,并压入堆栈stk2中
{
double x;
cin>>x;
stk2.Push(x);
}
int a;
if (stk1.Pop(a))
cout << a << endl;
if (stk1.Pop(a))
cout << a << endl;
double x;
if (stk2.Pop(x))
cout << x << endl;
if (stk2.Pop(x))
cout << x << endl;
return 0;
}
本文详细介绍了复数类的定义与运算符重载,展示了如何通过模板函数实现不同类型数据的交换,以及堆栈类模板的设计与应用。通过具体代码实例,深入解析了C++中的高级特性。

921

被折叠的 条评论
为什么被折叠?



