C++面向对象程序设计上机测验二

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;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值