1. (24分) C+±S3-1 Location類
題目描述
設計一個用來表示直角座標系的Location類,有兩個double型私有數據成員x,y;主程序中,輸入相應的值,創建類Location的兩個對象a和b,要求a的座標點在第3 象限,b的座標點在第2象限;分別採用成員函數和友元函數計算給定兩個座標點之間的距離。
【提示】類Location的參考框架如下:
class Location
{
public:
Location(double a,double b);//構造函數
double getX(); //成員函數,取x座標的值
double getY(); //成員函數,取y座標的值
double distance1(Location &);//成員函數,求給定兩點之間的距離
//友元函數,求給定兩點之間的距離
friend double distance1(Location &,Location&);
private:
double x,y;
};
輸入描述
二行,每行分別爲一個點的座標
輸出描述
四行:
第一、二行分別爲第一個點、第二個點的座標
第三行爲調用成員函數求出的點之間的距離
第四行爲調用友元函數求出的點之間的距離
輸入樣例
1 2
6 7
輸出樣例
第一個點:A(1,2)
第二個點:B(6,7)
調用成員函數,Distance=7.07107
調用友元函數,Distance=7.07107
用戶代碼
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
class Location
{
public:
Location(double a,double b):x(a),y(b){}; //構造函數
double getX(){return x;}; //成員函數,取x座標的值
double getY(){return y; }; //成員函數,取y座標的值
double distance1(Location &c); //成員函數,求給定兩點之間的距離
friend double distance1(Location &,Location&); //友元函數,求給定兩點之間的距離
private:
double x,y;
};
double Location::distance1(Location &c){
return sqrt(pow(this->x - c.x,2)+pow(this->y - c.y ,2));
}
double distance1(Location &c,Location &d)
{
return sqrt(pow(c.x-d.x,2)+pow(c.y-d.y ,2) );
}
int main()
{
double a,b;
cin>>a>>b;
Location s1(a,b);
cin>>a>>b;
Location s2(a,b);
cout<<"第一個點:A("<<s1.getX()<<","<<s1.getY()<<")"<<endl;
cout<<"第二個點:B("<<s2.getX()<<","<<s2.getY()<<")"<<endl;
cout<<"調用成員函數,Distance="<<s1.distance1(s2)<<endl;
cout<<"調用友元函數,Distance="<<distance1(s1,s2)<<endl;
return 0;
}
2. (24分) C++ -S3-2 Payroll類
題目描述
設計一個計算薪水的類Payroll,數據成員包括:單位小時工資、周工作小時、每週應付工資,其中每週應付工資=單位小時工資*周工作小時。要求:定義構造函數、析構函數、拷貝構造函數,常成員函數output()用來輸出對象的數據成員值。主函數中定義兩個對象:第一個對象的單位小時工資、周工作小時由鍵盤輸入,第二個對象定義爲常對象,他的單位小時工資爲第一個對象的1.5倍,周工作小時相同,輸出每個對象的信息。
輸入描述
一行:第一個對象的單位小時工資、周工作小時
輸出描述
兩個對象的小時工資、周工作時數、周應付工資
函數調用的相關信息
輸入樣例
25 38
輸出樣例
Constructor is called!
小時工資:25 周工作時數:38 周應付工資:950
Copy constructor is called!
小時工資:37.5 周工作時數:38 周應付工資:1425
Destructor is called!
Destructor is called!
用戶代碼
#include <iostream>
using namespace std;
class Salary
{
public:
Salary(double m,double h):money(m),hour(h){
cout<<"Constructor is called!"<<endl;
};
Salary(const Salary &c)
{
money=c.money*1.5;
hour=c.hour;
cout<<"Copy constructor is called!"<<endl;
}
~Salary(){
cout<<"Destructor is called!"<<endl;
};
void f(void) const
{
cout<<"小時工資:"<<money<<" 周工作時數:"<<hour<<" 周應付工資:"<<money*hour<<endl;
}
private:
double money,hour;
};
int main()
{
double a,b;
cin>>a>>b;
Salary s1(a,b);
s1.f();
Salary s2(s1);
s2.f();
return 0;
}
3. (30分) C+±S3-3 組合類:Triangle類與Point類
題目描述
定義一個平面座標系下的點類Point,有整型數據成員x,y座標值。成員函數包括:(1)帶默認值的構造函數,默認值均爲0;(2)拷貝構造函數;(3)置x,y座標值;(4)取x,y的座標值,參數爲兩個整型量的引用,分別用於獲取x,y座標值。(5)輸出函數,用於輸出x,y座標值。(6)求兩個點之間距離的函數,參數是Point類的對象引用。
定義一個平面座標系下的三角形類Triangle,數據成員爲三個Point類的對象p1、p2、p3。成員函數包括:(1)帶參數的構造函數,參數爲整型量x1,y1,x2,y2,x3,y3,分別是三角形三個頂點的座標。(2)帶參數的構造函數,參數是三個Point類對象的引用。(3)求三角形周長。(4)求三角形面積。(5)輸出三角形的三個頂點座標、周長和麪積。
定義一個普通函數:判斷三個頂點座標能否構成三角形。
main()中,從鍵盤輸入三個點座標,判斷這三個點能否構成三角形,不能,則提示重新輸入,並重新輸入點座標;能,則輸出三個頂點座標、周長和麪積。
輸入描述
三個點的座標,如果不能構成三角形,再重新輸入三個點的座標
輸出描述
三個頂點座標
三角形周長、三角形面積
輸入樣例
0 0
1 1
2 2
0 0
5 6
3 0
輸出樣例
頂點座標不正確,不能構成三角形!請重新輸入座標!
三角形三個頂點座標爲:
(0,0) (5,6) (3,0)
三角形周長爲:17.1348,面積爲:9
用戶代碼
#include <iostream>
#include <cmath>
using namespace std;
class Point
{
public:
Point(int x_=0,int y_=0):x(x_),y(y_)//1)帶默認值的構造函數,默認值均爲0;
{
}
void fxy(int a,int b)
{
x=a;
y=b;
}
Point(const Point &n) //(2)拷貝構造函數;
{
x=n.x;
y=n.y;
}
int get_x(){ //3)置x,y座標值;
return x;
}
int get_y(){
return y;
}
void print()
{
cout<<"("<<x<<","<<y<<")"<<" ";
}
double length(Point &n)
{
return sqrt(pow(x-n.x,2)+pow(y-n.y ,2) );
}
private:
int x,y;
};
class Tri
{
public:
Tri(int x1,int y1,int x2,int y2,int x3,int y3)
{
p1.fxy(x1,y1);
p2.fxy(x2,y2);
p3.fxy(x3,y3);
}
void fuzhi(int x1,int y1,int x2,int y2,int x3,int y3)
{
p1.fxy(x1,y1);
p2.fxy(x2,y2);
p3.fxy(x3,y3);
}
bool f()
{
if(p1.length(p2)+p1.length(p3)>p2.length(p3) && p1.length(p2)-p1.length(p3)<p2.length(p3)
&& ( p2.get_y()-p1.get_y() ) *1.0/ ( p2.get_x()-p1.get_x()) != (p3.get_y()-p1.get_y() ) *1.0/ p3.get_x()-p1.get_x() )
return true;
else return false;
}
double zhouchang()
{
return p1.length(p2)+p1.length(p3)+p2.length(p3);
}
double mianji()
{
double p=1.0/2*( p1.length(p2)+p1.length(p3)+p2.length(p3) );
return sqrt(p* (p-p1.length(p2)) * (p-p1.length(p3)) * (p-p2.length(p3) ));
}
void print()
{
p1.print();
p2.print();
p3.print();
cout<<endl;
}
private:
Point p1,p2,p3;
};
int main()
{
int a,b,c,d,e,f;
cin>>a>>b>>c>>d>>e>>f;
Tri D(a,b,c,d,e,f);
while(!D.f() )
{
cout<<"頂點座標不正確,不能構成三角形!請重新輸入座標!"<<endl;
cin>>a>>b>>c>>d>>e>>f;
D.fuzhi(a,b,c,d,e,f);
}
cout<<"三角形三個頂點座標爲:"<<endl;
D.print();
cout<<"三角形周長爲:"<<D.zhouchang() <<",面積爲:"<<D.mianji() ;
return 0;
}
4. (22分) C+±S3-4 標準類string的使用
題目描述
使用C++中的string標準類,將5個字符串按由小到大順序輸出(注意:使用string類中封裝的成員函數)。
說明:查閱C++類庫中的string類,瞭解類中的成員函數和運算符。
輸入描述
五個字符串
輸出描述
按由小到大排列的5個字符串
輸入樣例
string month attack price hello
輸出樣例
排序後的結果爲:
attack hello month price string
用戶代碼
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s[5];
for(int i=0;i<5;i++)
cin>>s[i];
int i,j;
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
if(s[i]>s[j])
{
string t;
t=s[i];s[i]=s[j];s[j]=t;
}
}
cout<<"排序後的結果爲:";
for(int i=0;i<5;i++)
cout<<s[i]<<" ";
return 0;
}