题目描述
某小学二年级的数学老师在教学生整数加减法运算时发现:班上的同学可以分成三类,第一类可以正确地完成加减法运算(GroupA);第二类可以正确地完成加法运算,但对于减法运算来说,总是忘记借位的处理(GroupB);第三类总是忘记加法的进位,也总是忘记减法的借位(GroupC)。(提示:小学二年级还没学负数。)
现在请模拟当老师在课堂提问某位同学时,同学会给出的回答。
实现时请基于下面的基类框架:
class Group
{
public:
virtual int add(int x, int y)=0;//输出加法的运算结果
virtual int sub(int x, int y)=0;//输出减法的运算结果
}
构建出GroupA, GroupB和GroupC三个派出类:
并编写主函数,要求主函数中有一个基类Group指针,通过该指针统一地进行add和sub运算。
输入
第一行表示测试次数。从第二行开始,每个测试用例占一行,每行数据意义如下:学生类别(1为第一类学生,2为第二类学生,3为第三类学生)、第一个数、第二个数。
输出
运算后的结果
输入样例:
3
1 79+81
2 81-79
3 183+69
输出样例:160
12
142
class Group
{
public:
virtual int add(int x, int y)=0;//输出加法的运算结果
virtual int sub(int x, int y)=0;//输出减法的运算结果
};
class GroupA: public Group{
public:
virtual int add(int x,int y){
return x+y;
}
virtual int sub(int x,int y){
return x-y;
}
};
class GroupB: public Group{
public:
virtual int add(int x,int y){
return x+y;
}
virtual int sub(int x,int y){
int x1=x,y1=y;
int re=0;
int flag=0;
while(1){
if(x1%10==0 && y1%10==0)
return re;
else{
if(x1%10 > y1%10)
re += (x1%10 -y1%10)*pow(10,flag);
else{
re += (x1%10+10 - y1%10)*pow(10,flag);
}
x1/=10;
y1/=10;
flag++;
}
}
}
};
class GroupC: public Group{
public:
virtual int add(int x,int y){
int x1=x,y1=y;
int re=0;
int flag = 0;
while(1){
if(x1%10==0 && y1%10==0)
return re;
else{
if(x1%10 + y1%10 >=10)
re += (x1%10+y1%10-10)*pow(10,flag);
else{
re += (x1%10 + y1%10)*pow(10,flag);
}
x1/=10;
y1/=10;
flag++;
}
}
}
virtual int sub(int x,int y){
int x1=x,y1=y;
int re=0;
int flag = 0;
while(1){
if(x1%10==0 && y1%10==0)
return re;
else{
if(x1%10 > y1%10)
re += (x1%10 -y1%10)*pow(10,flag);
else{
re += (x1%10+10 - y1%10)*pow(10,flag);
}
x1/=10;
y1/=10;
flag++;
}
}
}
};
int main(){
int t;
cin >> t;
Group *p;
while(t--){
int flag;
cin >> flag;
int x,y;
char t;
cin >> x >> t >> y;
if(flag==1){
p = new GroupA;
if(t=='+')
cout << p->add(x,y) << endl;
else
cout << p->sub(x,y) << endl;
}
if(flag==2){
p = new GroupB;
if(t=='+')
cout << p->add(x,y) << endl;
else
cout << p->sub(x,y) << endl;
}
if(flag==3){
p = new GroupC;
if(t=='+')
cout << p->add(x,y) << endl;
else
cout << p->sub(x,y) << endl;
}
}
}
重点在于在add和sub函数中,一位一位的判断(while操作),进行不进位或不退位
终止条件为:x1%10==0 && y1%10==0 (因为可能位数不一样,所以要有&&)
记得先*pow()——对应位数,再加起来
由于不需要参数,可以不写构造函数(用系统默认的)——节省代码量