例题1 三角形相加
描述
写一个CTriangle 类,要求可以接受CTriangle(y,x)形式的构造。表示含义如下:A(0,y) B(0,0) C(x,0)。要求能够处理若干个三角形的相加(点B保持不变,两直角边相加)。
输入描述:
输入有若干行,每行两个数y,x,读到0表示结束。
输出描述:
输出一行表示三点坐标,格式参见样例。
输入:
10 20 1 31 0
输出:
A(0,11),B(0,0),C(51,0)
代码示例:
#include <bits/stdc++.h>
using namespace std;
class CTriangle{
public:
int x,y;
CTriangle(int yy,int xx):y(yy),x(xx){
}
CTriangle operator+(const CTriangle &a){ //运算符重载
return CTriangle (y+a.y,x+a.x);
}
};
int main(){
int x,y;
cin>>y>>x;
CTriangle a(y,x);
while(cin>>y>>x && y!=0){
CTriangle b(y,x);
a=a+b; //坐标会对应相加
}
if(y==0) cout<<"A(0,"<<a.y<<"),B(0,0),C("<<a.x<<",0)";
return 0;
}
例题2 直角三角形
描述
创建一个CTriangle 类,用3点来代表一个三角形,输入三个点的坐标,实现判断此三角形是不是直角三角形,并输出此三角形的周长。
输入描述:
输入第一行为样例数m,接下来m行每行6个整数分别表示三个点的横纵坐标。
输出描述:
对于每个样例输出两行,第一行根据是否直角三角形输出Yes或No,第二行输出三角形的周长,保留小数点后两位。
输入:
1 0 0 3 0 0 4
输出:
Yes 12.00
代码示例:
#include<iostream>
#include<cmath>
using namespace std;
class CTriangle {
public:
int x1, x2, x3, y1, y2, y3;
CTriangle(int _1x, int _1y, int _2x, int _2y, int _3x, int _3y) {
x1 = _1x;
y1 = _1y;
x2 = _2x;
y2 = _2y;
x3 = _3x;
y3 = _3y;
}
void fun() {
int d1 = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
int d2 = (x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3);
int d3 = (x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3);
if (d1 + d2 == d3){
cout << "Yes" << endl;
}
else{
cout << "No" << endl;
}
double c = sqrt(d1) + sqrt(d2) + sqrt(d3);
printf("%.2f\n", c);
}
};
int main() {
int m;
cin >> m;
for (int i = 0; i < m; i++) {
int x1, x2, x3, y1, y2, y3;
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
CTriangle c(x1, y1, x2, y2, x3, y3);
c.fun();
}
}
例题3 重载运算符
描述
建立一个角类,在这个类中重载减号运算符(角度相减),并实现求出角度的正弦值的函数。
输入描述:
输入第一行为样例数m,接下来有m行每行两个整数表示角度。
输出描述:
输出m行,表示两角相减的正弦值,保留小数点后两位。
输入:
1 60 30
输出:
0.50
代码示例:
// 重载运算符实现sin(a-b)
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double Pi = 3.1415926;
class Angle {
public:
int du;
Angle(int d): du(d) {}
Angle operator - (Angle a) {
this->du = this->du - a.du;
return *this;
}
void show() {
double res = sin(du / 180.0 * Pi); //角度要转化为弧度
printf("%.2f\n", res);
}
};
int main() {
int m;
cin >> m;
for (int i = 0 ; i < m; ++i) {
int du1, du2;
cin >> du1 >> du2;
Angle a(du1);
Angle b(du2);
Angle c = a - b;
c.show();
}
}
例四 复数相加
描述
编写一个复数类,有构造函数,能对复数初始化;重载加法操作符并按a+bi 的形式输出。
输入描述:
输入第一行表示测试用例的个数m,接下来m行每行有4个用空格隔开的整数,分别表示2个复数的实部和虚部。
输出描述:
输出m行。按a+bi或者a-bi的格式输出,表示两个复数相加的和。
输入:
1 3 4 1 -2
输出:
4+2i
代码示例:
// 复数相加
#include<iostream>
#include<cstdio>
using namespace std;
class Complex {
public:
int real;
int imag;
Complex(int re, int im): real(re), imag(im) {}
Complex operator + (Complex& a) {
this->real += a.real;
this->imag += a.imag;
return *this;
}
void show() {
if (imag > 0) {
printf("%d+%di\n", real, imag);
} else if (imag < 0) {
printf("%d%di\n", real, imag);
} else {
printf("%d\n", real);
}
}
};
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
Complex c1(x1, y1);
Complex c2(x2, y2);
Complex c3 = c1 + c2;
c3.show();
}
}
例题5 点的距离
描述
创建一个CPoint 类,代表平面直角坐标系中的点,创建构造函数和运算符重载函数,运算符重载为类重载(非友元重载),可以实现计算两个点之间的距离。要求:
1。输入两个点的坐标,输出两个点之间的距离;2。重载运算符“-”
输入描述:
输入第一行为样例数m,接下来m行每行4个整数分别表示两个点的横纵坐标。
输出描述:
输出m行,通过重载“-”运算输出两点的距离,保留小数点后两位。
输入:
1 0 0 2 0
输出:
2.00
代码示例:
// 点的距离
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
class CPoint{
public:
double x,y;
CPoint(double x1,double y1):x(x1),y(y1){}
void operator - (CPoint p){
double d1 = pow(x-p.x,2);
double d2 = pow(y-p.y,2);
double distance = sqrt(d1+d2);
printf("%.2f\n",distance);
}
};
int main(){
int n;
double x1,y1,x2,y2;
cin >> n;
for(int i = 0; i < n ; i++){
cin >> x1 >> y1 >> x2 >> y2;
CPoint c1(x1,y1);
CPoint c2(x2,y2);
c1 - c2;
}
}