}
4.找出100到200之间满足用3除余2且用5除余3且用7除余2的所有整数。
【解答】
#include
void main()
{
int i;
for( i=100; i<=200; i++ )
{
if ( ( i % 3 == 2) && ( i % 5 == 3 ) && ( i % 7 == 2 ) )
cout << i << endl;
}
}
5.如果一个整数恰好等于它的所有因子之和,则这个数称为完数。例如,6=1+2+3,所以6为完数。求1000之内的所有完数。
【解答】
#include
void main()
{
int i,j,s;
for( i=1; i<=1000; i++ )
{
s = 0;
for( j=1; j
if ( i % j == 0 ) s = s + j;
if ( i == s ) cout << i << endl;
}
}
6.在屏幕上输出如下图案:
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
【解答】
#include
void main()
{
int i,j,k;
for( i=1; i<=5; i++ )
{
for( k=1; k<=5-i; k++ ) cout << " ";
for( j=1; j<=2*i-1; j++ ) cout << "*";
cout << endl;
}
}
3(1)编写函数,定义两个unsigned short int型的参数,返回两个参数的商,其数据类型为short int。如果第二个参数为0,输出错误提示信息。
【源程序】
#include
short int Divider(unsigned short int a, unsigned short int b)
{
if (b == 0)
return -1;
else
return a/b;
}
int main()
{
unsigned short int one, two;
short int answer;
cout << "Enter two numbers.\n Number one: ";
cin >> one;
cout << "Number two: ";
cin >> two;
answer = Divider(one, two);
if (answer > -1)
cout << "Answer: " << answer;
else
cout << "Error, can't divide by zero!";
return 0;
}
运行结果为:
Enter two numbers.
Number one:8↙
Number two:2↙
Answer: 4
(2)编写函数,输入一个华氏温度,将华氏温度转换为摄氏温度输出,公式为C=(F-32)*5/9,其中F为华氏温度,C为摄氏温度。
【源程序】
#include
#include
void main()
{
double f,c,b;
cout<<"请输入华氏温度:"<cin>>f;
cout<<"对应的摄氏温度为:"<c=f-32;
b=5.00/9;
c=b*c;
cout<}
运行结果为:
请输入华氏温度:
80↙
对应的摄氏温度为:
26.67
(3)编写函数,判断一个数是否是质数。
【源程序】
#include
#include
int prime(int i); //判断一个数是否是质数的函数
void main()
{
int i;
cout << "请输入一个整数:";
cin >> i;
if (prime(i))
cout << i << "是质数。" << endl;
else
cout << i << "不是质数。" << endl;
}
int prime(int i)
{
int j,k,flag;
flag = 1;
k = sqrt(i);
for (j = 2; j <= k; j++)
{
if(i%j == 0)
{
flag = 0;
break;
}
}
if (flag)
return 1;
else
return 0;
}
运行结果为:
请输入一个整数:1151↙
1151是质数。
(4)编写函数,求两个整数的最大公约数和最小公倍数。
【源程序】
#include
#include
int fn1(int i,int j); //求最大公约数的函数
void main()
{
int i,j,x,y;
cout << "请输入一个整数:";
cin >> i ;
cout << "请输入另一个整数:";
cin >> j ;
x = fn1(i,j);
y = i * j / x;
cout << i << "和" << j << "的最大公约数是:" << x << endl;
cout << i << "和" << j << "的最小公倍数是:" << y << endl;
}
int fn1(int i, int j)
{
int temp;
if (i < j)
{
temp = i;
i = j;
j = temp;
}
while(j != 0)
{
temp = i % j;
i = j;
j = temp;
}
return i;
}
运行结果为
请输入一个整数:120↙
请输入另一个整数:72↙
120和72的最大公约数是:24
120和72的最小公倍数是:360
(5)编写递归函数,计算x的y(y>0)次幂。
【源程序】
#include
long GetPower(int x,int y);
int main()
{
int number, power;
long answer;
cout << "Enter a number: ";
cin >> number;
cout << "To what power? ";
cin >> power;
answer = GetPower(number,power);
cout << number << " to the " << power << "th power is " <return 0;
}
long GetPower(int x, int y)
{
if(y==1)
return x;
else
return (x * GetPower(x,y-1));
}
运行结果为:
Enter a number: 3↙
To what power? 4↙
3 to the 4th power is 81
(6)编写程序,要求输人四位数的年份、两位数的月份和日期,把它们按“年月日”的格式输出,并计算它是这一年的第几天。
【源程序】
#include
#include
daynum(int,int,int);
void date(int year,int month,int day)
{
cout<cout<cout<cout<cout<}
daynum(int year,int month,int day)
{
int i,sum=0;
for(i=1;i{
switch (i)
{
case 1: //1、3、5、7、8、10、12月有31天
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:sum+=31;break;
case 4: //4、6、9、11月有30天
case 6:
case 9:
case 11:sum+=30;break;
case 2:if (((year%4==0 && year%100!=0)||year%400==0)) //闰年2月有29天
sum+=29;
else //平年2月有28天
sum+=28;
}
}
sum+=day;
return sum;
}
void main()
{
int year,month,day;
cout<<"请输入年/月/日:";
cin>>year>>month>>day;
date(year,month,day);
}
运行结果为:
请输入年/月/日:1984 03 05↙
1 9 8 4 0 3 0 5
65
4(1)编写程序,使用指针实现两个字符串的首尾连接(提示:将字符串str2接到str1的后面时,str1后面的'\0'被取消)。
#include
void strcat(char *str1,char *str2)
{
int i,m=0;
while(str1[m]!='\0') m++; //求数组str1长度
i=0;
while(str2[i]!='\0')
{
str1[m+i]=str2[i];
i++;
} //将字符串str2中有字符依次装入字符串str1中
str1[m+i]='\0';
}
void main()
{
char str1[16]="Chinese",str2[]="English";
strcat(str1,str2);
cout<}
(2)编写程序,实现从多个字符串中寻找最长串。
#include
#include
char *maxstr(char *str[],int n)
{
int i,len,j=0;
len=strlen(str[j]); //求数组str[0]长度并赋给变量len
//从第2个字符串开始,只要字符串长度大于len,就赋给len并保留其下标
for(i=1;iif(strlen(str[i])>len)
{
j=i;
en= strlen(str[i]) ;
}
return str[j];
}
void main()
{
char *a[4]={"China","England","American","Canada"};
cout<}
(3)编写程序,实现两个字符串变量的交换。例如,交换前:
char *ap="hello";
char *bp="how are you";
则交换后使ap和bp指向的内容别是:
ap:how are you
bp:hello
#include
#include
void swap(char *p,char *q)
{
char temp[20];
strcpy(temp,p);
strcpy(p,q);
strcpy(q,temp);
}
void main()
{
char a[20]="hello",*ap=a;
char b[20]="how are you",*bp=b;
cout<<"交换前字符串值:\n";
cout<<"ap= "<cout<<"bp= "<swap(ap,bp);
cout<<"交换后字符串值:\n";
cout<<"ap= "<cout<<"bp= "<}
5(1)编写程序,实现从终端输入学生信息,根据学号查询并输出相应学生的信息。学生信息包括:学号no、姓
名name、政治分数politic、数学分数maths、英语分数english 和专业课分数special。
【参考代码】
结构体类型数组及指针的应用。
#include
struct stu
{
unsigned no;
char name[10];
int politic;
int maths;
int english;
int special;
};
void input(struct stu *q,int i)
{
cout<<"input student information:"<for(int k=0;k
{
cin>>q->no;
cin>>q->name;
cin>>q->politic;
cin>>q->maths;
cin>>q->english;
cin>>q->special;
}
}
void enquire(struct stu *q,int j,unsigned a)
{
for(int i=0;iif(q->no==a)
{
cout<no<<" ";
cout<name<<" ";
cout<politic<<" ";
cout<maths<<" ";
cout<english<<" ";
cout<special<<" ";
}
}
void main()
{
struct stu stud[30],*p=stud;
unsigned num;
input(p,30);
cout<<"input enquiring no:"<cin>>num;
enquire(p,30,num);
}
(2)假设某公司有员工200人,员工的信息包括编号、姓名、基本工资、补贴、奖金和应扣款。编写程序,实现对员工工资信息的管理,包括查询和打印工资明细、应发工资和实发工资。
参考代码如下:
本题是在上题的基础上,加了一些控制功能,由此可见程序的编写其实是很实际简单的事。
#include
struct member
{
unsigned no;
char name[10];
float basewage;
float extrawage;
float bonus;
float decrease;
};
void input(member *q,int j)
{
cout<<"input member wage information:"<for(int i=0;i{
cout<<"no.: ";
cin>>q->no;cout<cout<<"name:";
cin>>q->name;cout<cout<<"basewage:";
cin>>q->basewage;cout<cout<<"extrawage:";
cin>>q->extrawage;cout<cout<<"bonus:";
cin>>q->bonus;cout<cout<<"decrease:";
cin>>q->decrease;cout<}
}
void enquire(member *q,int j,unsigned a)//查询函数
{
for(int i=0;iif(q->no==a)
{
cout<<"no"<<"name
"<<"basewage"<<"extrawage";//表头
cout<<"bonus "<<"decrease "<<"totalwage ";
cout<<"realwage"<cout<no<<" ";
cout<name<<" ";
cout<basewage<<" ";
cout<extrawage<<" ";
cout<bonus<<" ";
cout<decrease<<" ";
cout<basewage+q->extrawage+q->bonus<<" ";
cout<basewage+q->extrawage+q->bonus-q->decrease<}
}
void print(member *q,int j,unsigned a)//打印函数
{
if(a==0)
{
cout<<"no "<<"name "<<"basewage "<<" extrawage";//表头
cout<<"bonus "<<"decrease "<<"totalwage "; //
cout<<"realwage"<for(int i=0;i{
cout<no<<" ";
cout<name<<" ";
cout<basewage<<" ";
cout<extrawage<<" ";
cout<bonus<<" ";
cout<decrease<<" ";
cout<basewage+q->extrawage+q->bonu s<<" ";
cout<basewage+q->extrawage+q->bonu s-q->decrease<}
}
else
for(int i=0;iif(q->no==a)
{
cout<<"no "<<"name "<<"basewage "<<"extrawage ";//表头
cout<<"bonus "<<"decrease "<<"totalwage "<<"realwage "
<cout<no<<" ";
cout<name<<" ";
cout<basewage<<" ";
cout<extrawage<<" ";
cout<bonus<<" ";
cout<decrease<<" ";
cout<basewage+q->extrawage+q->bonu s<<" ";
cout<basewage+q->extrawage+q->bonu s-q->decrease<}
}
void main()
{
member member[200],*p=member;
char n;int m;
input(p,200);
cout<<"enquire or print(e or p):";
cin>>n;
if(n=='e')
{
cout<<"enter the no.:"<cin>>m;
enquire(p,200,m);
}
else if(n=='p')
{
int l;
cout<<"all or one(0 or one's no.):";
cin>>l;
print(p,200,l);
}
else
cout<<"WRONG OPERATOR!";
}
(3)编写程序,实现对学生和教师信息的输入、查询、删除和更新等操作。其中,学生信息包括学号、姓名、性别、班级和院系,教师信息包括编号、姓名、性别、职称、院系。
参考代码如下:
该数组长度设置应足够大,以便插入元素,删除元素只学号或代号置零,并不真正删除,相应的一些操作加浏览等要有条件判断使为零的学号或代号不显示。本题的插入操作是一次性的,可以试着更改程序,使其需要时再插入。
#include
struct member
{
unsigned no;
char name[10];
char sex;
char dep[20];
union{ //共同体,实现内存共享
char clas[20];
char position[20];
}level;
};
void construction(struct member *q,int j)//数组建设函数
{
cout<<"input person information(student's no>10000):"<for(int i=0;i{
cin>>q->no;
cin>>q->name;
cin>>q->sex;
cin>>q->dep;
if(q->no>10000)//学号大于10000,证明是学生
cin>>q->level.clas;
else
cin>>q->level.position;
}
}
void enquire(struct member *q,int j,unsigned a)//查询函数
{
for(int i=0;iif(q->no==a)
{
cout<no<<" ";
cout<name<<" ";
cout<sex<<" ";
cout<dep<<" ";
if(a>10000)
cout<level.clas;
else
cout<level.position;
}
}
void alter(struct member *q,int j,unsigned a)//更新函数
{
for(int i=0;iif(q->no==a)
{
cin>>q->no;
cin>>q->name;
cin>>q->sex;
cin>>q->dep;
if(q->no>10000)
cin>>q->level.clas;
else
cin>>q->level.position;
}
}
void browser(struct member *q,int j)//浏览函数
{
for(int i=0;iif(q->no!=0) //不显示学号或代号为0的记录
{
cout<no<<" ";
cout<name<<" ";
cout<sex<<" ";
cout<dep<<" ";
if(q->no>10000)
cout<level.clas;
else
cout<level.position;
cout<}
}
void delet(struct member *q,int j,unsigned a)//删除记录函数
{
for(int i=0;iif(q->no==a)
{q->no=0;} //将学号或代号置0
}
void main()
{
member person[2];
unsigned num;
char x,y;
construction(person,2);
cout<<"want to operate?";//询问是否对数组操作
cin>>y;//'y'为操作,其他为不操作
while(y=='y')//循环询问操作
{
cout<<"want to enquire?"<cin>>x;
if(x=='y')
{
cout<<"input no(student's no>10000):"<cin>>num;
enquire(person,2,num);
cout<}
cout<<"wangt to alter record?"<cin>>x;
if(x=='y')
{
cout<<"input no(student's no>10000):"<cin>>num;
alter(person,2,num);
cout<}
cout<<"want to browser records?"<cin>>x;
if(x=='y')
{
browser(person,2);
cout<}
cout<<"want to delete record?"<cin>>x;
if(x=='y')
{
cout<<"input no(student's no>10000):"<cin>>num;
delet(person,2,num);
cout<}
cout<<"want to operate?"<cin>>y;//由变量y中的字符判断
}
}
6(1)构造一个日期时间类Timedate,实现对日期(年、月、
日)、时间(时、分、秒)的设置及输出。
解:
#include
#include
enum YR{Y2000,Y2001,Y2002,Y2003,Y2004,Y2005};
enum
MT{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};
class Timedate{
private:
YR year;
MT month;
int date;
int hh;
int mm;
int ss;
public:
Timedate(){year=Y2000;month=Jan;date=1;hh=0; mm=0;ss=0;}
Timedate(YR a,MT b,int c)
{
year=a;
month=b;
date=c;
hh=12;mm=30;ss=0;
}
void getdate(YR &,MT &,int &);//使用引用一次取得3个数值
void gettime(int &,int &,int &);
void putdate(YR ,MT ,int );
void puttime(int ,int ,int );
void list();
};
void Timedate::getdate(YR &y,MT &m,int &d)
{
y=year;
m=month;
d=date;
}
void Timedate::gettime(int &a,int &b,int &c)
{
a=hh;
b=mm;
c=ss;
}
void Timedate::putdate(YR a,MT b,int c)
{
year=a;
month=b;
date=c;
}
void Timedate::puttime(int a,int b,int c){
hh=a;
mm=b;
ss=c;
}
void Timedate::list()//成员函数,直接访问私有的数据成员
{
cout<<"year/month/date :";
switch(year){
case Y2000:cout<<"2000";break;
case Y2001:cout<<"2001";break;
case Y2002:cout<<"2002";break;
case Y2003:cout<<"2003";break;
case Y2004:cout<<"2004";break;
case Y2005:cout<<"2005";break;
}
switch(month)
{
case Jan:cout<<'/'<<"Jan";break;
case Feb:cout<<'/'<<"Feb";break;
case Mar:cout<<'/'<<"Mar";break;
case Apr:cout<<'/'<<"Apr";break;
case May:cout<<'/'<<"May";break;
case Jun:cout<<'/'<<"Jun";break;
case Jul:cout<<'/'<<"Jul";break;
case Aug:cout<<'/'<<"Aug";break;
case Sep:cout<<'/'<<"Sep";break;
case Oct:cout<<'/'<<"Oct";break;
case Nov:cout<<'/'<<"Nov";break;
case Dec:cout<<'/'<<"Dec";break;
}
cout<<'/'<cout<<"hour:minite:second :";
cout<}
void main(int argc, char* argv[])
{
Timedate A(Y2004,Mar,3),B;
A.list();
B.list();
B.putdate(Y2005,Oct,18);
B.puttime(17,30,00);
B.list();
}
运行结果:
year/month/date :2004/Mar/3
hour:minute:second :12:30:0
year/month/date :2000/Jan/1
hour:minute:second :0:0:0
year/month/date :2005/Oct/18
hour:minute:second :17:30:0
(2)构造一个矩形类Rectangle,数据成员为矩形的左下角与右上角的坐标,并利用成员函数实现对矩形周长与面积的计算。
解:这里的矩形的4边分别与x轴y轴平行,为最简单的情况。注意参数有缺省值的函数的声明和定义格式。
#include
#include
class Rectangle
{
double left, top ;
double right, bottom;
public:
Rectangle(double l=0, double t=0, double r=0, double b=0);
~ Rectangle(){}; //析构函数,在此函数体为空
void Assign(double l,double t,double r,double b);
double getLeft(){ return left;} // 以下四个函数皆为内联成员函数
double getRight(){ return right;}
double getTop(){return top;}
double getBottom(){return bottom;}
void Show();
double Area();
double Perimeter();
};
// 构造函数,带缺省参数,缺省值为全0,在声明中指定
Rectangle::Rectangle(double l , double t, double r, double b) {
left = l; top = t;
right = r; bottom = b;
}
void Rectangle::Assign(double l, double t, double r, double b) //赋值
{
left = l; top = t;
right = r; bottom = b;
}
void Rectangle::Show()//成员函数直接使用私有的数据成员
{
cout<<"left-top point is
("<cout<<"right-bottom point is
("<}
double Rectangle::Area()
{
return fabs((right-left)*(bottom-top));
}
double Rectangle::Perimeter()
{
return 2*(fabs(right-left)+fabs(bottom-top));
}
int main()
{
Rectangle rect;
rect.Show();
rect.Assign(100,200,300,400);
rect.Show();
Rectangle rect1(0,0,200,200);
rect1.Show();
Rectangle rect2(rect1);
rect2.Show();
cout<<"面积"<"<return 0;
}
运行结果:
left-top point is (0,0)
right-bottom point is (0,0)
left-top point is (100,200)
right-bottom point is (300,400)
left-top point is (0,0)
right-bottom point is (200,200)
left-top point is (0,0)
right-bottom point is (200,200)
面积40000 周长800
(3)构造一个圆类Circle,属性为半径radius、圆周长和面积,实现根据输入的半径计算周长和面积并输出。要求定义以半径为参数、缺省值为0的构造函数,且周长和面积的计算在构造函数中实现。
解:通常所有数据成员都在构造函数中赋初值。拷贝构造函数以本类的引用为参数。
#include
#include
class Circle
{
double r,Area,Circumference;
public:
Circle(double a=0);
Circle(Circle &);
void SetR(double R);
double GetR(){return r;}
double GetAreaCircle(){return Area;}
double GetCircumference(){return Circumference;}
};
Circle::Circle(double a)
{
r=a;
Area=r*r*3.14159265;
Circumference=2*r*3.14159265;
}
Circle::Circle(Circle & cl)
{
r=cl.r;
Area=cl.Area;
Circumference=cl.Circumference;
}
void Circle::SetR(double R)
{
r=R;
Area=r*r*3.14159265;
Circumference=2*r*3.14159265;
}
int main()
{
Circle cl1(2),cl2,cl3=cl1;
cout<<"圆半径:"<<<'\t'<<"圆面
积:"<cl2.SetR(4);
cout<<"圆半径:"<<<'\t'<<"圆面
积:"<return 0;
}
运行结果:
圆半径:2 圆周长:12.5664 圆面积:
12.5664
圆半径:4 圆周长:25.1327 圆面积:
50.2655
(4)构造一个学校在册人员类Person,数据成员包括身份证号(IdPerson),姓名(Name),性别(Sex),生日(Birthday)和家庭住址(HomeAddress),实现对人员信息的录入和显示。
解:为指出构造函数等的调用,加了一些提示语句。
#include
#include
enum Tsex{mid,man,woman};
class Person
{
char IdPerson[19]; //身份证号,18位数字
char Name[20]; //姓名
Tsex Sex; //性别
int Birthday; //生日,格式1986年8月18日写作19860818
char HomeAddress[50]; //家庭地址public:
Person(char *,char *,Tsex,int,char *);
Person(Person &);
Person();
~Person();
void PrintPersonInfo();
void inputPerson();
//其他接口函数
};
Person::Person(char *id,char *name,Tsex sex,int birthday,char *homeadd)
{
cout<<"构造Person"<strcpy(IdPerson,id);
strcpy(Name,name);
Sex=sex;
Birthday=birthday;
strcpy(HomeAddress,homeadd);
}
Person::Person()
{
cout<<"缺省构造Person"<IdPerson[0]='\0';Name[0]='\0';Sex=mid;
Birthday=0;HomeAddress[0]='\0';
}
Person::Person(Person & Ps)
{
cout<<"拷贝构造Person"<strcpy(IdPerson,Ps.IdPerson);
strcpy(Name,https://www.doczj.com/doc/237178494.html,);
Sex=Ps.Sex;
Birthday=Ps.Birthday;
strcpy(HomeAddress,Ps.HomeAddress);
}
Person::~Person()
{
cout<<"析构Person"<}
void Person::inputPerson()
{
char ch;
cout<<"请输入身份证号,18位数字:"<cin.getline(IdPerson,19);
cout<<"请输入姓名:"<cin.getline(Name,20);
cout<<"请输入性别m或w:"<cin>>ch;
if(ch=='m') Sex=man;
else Sex=woman;
cout<<"请输入生日,格式1986年8月18日写作19860818:"<cin>>Birthday;
cin.get(); //吸收回车符,否则地址输不进去
cout<<"请输入地址:"<cin.getline(HomeAddress,50);
}
void Person::PrintPersonInfo()
{
int i;
cout<<"身份证号:"<if(Sex==man)cout<<"男"<<'\n';
else if(Sex==woman)cout<<"女"<<'\n';
else cout<<" "<<'\n';
cout<<"出生年月日:";
i=Birthday;
cout<
i=i%10000;
cout<
}
int main()
{
Person Ps1("320102*********","朱海鹏
",man,19811226,"南京市黄浦路1号"),
Ps2(Ps1),Ps3;
Ps1.PrintPersonInfo();
Ps2.PrintPersonInfo();
Ps3.inputPerson();
Ps3.PrintPersonInfo();
return 0;
}
运行结果:
构造Person
拷贝构造Person
缺省构造Person
身份证号:320102*********
姓名:朱海鹏
性别:男
出生年月日:1981年12月26日
家庭住址:南京市黄浦路1号
身份证号:320102*********
姓名:朱海鹏
性别:男
出生年月日:1981年12月26日
家庭住址:南京市黄浦路1号
请输入身份证号,18位数字:
320102*********↙
请输入姓名:
张红↙
请输入性别m或w:
w↙
请输入生日,格式1986年8月18日写作19860818:
19820405↙
请输入地址:
南京市幸福路12号↙
身份证号:320102*********
姓名:张红
性别:女
出生年月日:1982年4月5日
家庭住址:南京市幸福路12号
析构Person
析构Preson
析构Preson
7(1)先定义一个点类Point,包含数据成员x和y(坐标点)。以Point类为基类,派生出矩形类Rectangle和圆类Circle。假设矩形水平放置,在Rectangle类中,继承来的基类中的点作为矩形左下方的顶点,在派生类中增加数据成员长和宽;在Circle类中,继承来的基类中的点作为圆心,在派生类中增加数据成员半径。
要求判断给定点位于矩形和圆的什么位置。
解:
#include
#include
const double PI=3.1415926535;
class Point{
private:
double x,y;
public:
Point(){x = 0; y = 0; }
Point(double xv,double yv){x = xv;y = yv;}
Point(Point& pt){ x = pt.x; y = pt.y; }
double getx(){return x;}
double gety(){return y;}
double Area(){return 0;}
void Show(){cout<<"x="<'<<"y="<};
class Circle :public Point{
double radius;
public:
Circle(){radius = 0;}
Circle(double xv,double yv,double
vv):Point(xv,yv){radius = vv;}
Circle(Circle& cc):Point(cc){radius = cc.radius;} //拷贝构造函数
double Area(){return PI*radius*radius;}
void Show(){//注意怎样访问基类的数据成员cout<<"x="<}
int position(Point &pt){
double distance =
sqrt((getx()-pt.getx())*(getx()-pt.getx())
+(gety()-pt.gety())*(gety()-pt.gety()));
double s=distance-radius;
if(s==0) return 0; //在圆上
else if(s<0) return -1;
//在圆内
else return 1;
//在圆外
}
};
class Rectangle:public Point{
double width,length;
public:
Rectangle(){width=0; length=0; }
Rectangle(double xv,double yv,double wv,double lv):Point(xv,xv) {
width = wv;
length= lv;
}
Rectangle(Rectangle& rr):Point(rr){
width = rr.width;
length = rr.length;
}
double Area(){return width*length;}
void Show(){
cout<<"x="<cout<<"width="<}
int position(Point &pt);
};
int Rectangle::position(Point &pt){
double s1,s2;
s1 = (pt.getx()-getx()); s2=(pt.gety()-gety());
if(((s1==0||s1==width)&&s2<=length)||((s2==0||s2 ==length)&&s1<=width)) return 0;
else if(s1else return 1;
//1在矩形外
}
int main(){
Circle cc1(3,4,5),cc2,cc3(cc1);
Rectangle rt1(0,0,6,8),rt2,rt3(rt1);
Point p1(0,0),p2(6,8),p3(3,3),p4(8,4),p5(8,8);
cc1.Show();
cc2.Show();
rt1.Show();
rt2.Show();
cout<<"点p1:";
p1.Show();
cout<<"矩形rt3:"<<'\t';
rt3.Show();
switch(rt3.position(p1)){
case 0:cout<<"在矩形上"<cout<<"圆cc3:"<<'\t';
cc3.Show();
switch(cc3.position(p1)){
case 0:cout<<"在圆上"<}
cout<<"点p2:";
p2.Show();
cout<<"矩形rt3:"<<'\t';
rt3.Show();
switch(rt3.position(p2)){
case 0:cout<<"在矩形上"<cout<<"圆cc3:"<<'\t';
cc3.Show();
switch(cc3.position(p2)){
case 0:cout<<"在圆上"<}
cout<<"点p3:";
p3.Show();
cout<<"矩形rt3:"<<'\t';
rt3.Show();
switch(rt3.position(p3)){
case 0:cout<<"在矩形上"<cout<<"圆cc3:"<<'\t';
cc3.Show();
switch(cc3.position(p3)){
case 0:cout<<"在圆上"<}
cout<<"点p4:";
p4.Show();
cout<<"矩形rt3:"<<'\t';
rt3.Show();
switch(rt3.position(p4)){
case 0:cout<<"在矩形上"<cout<<"圆cc3:"<<'\t';
cc3.Show();
switch(cc3.position(p4)){
case 0:cout<<"在圆上"<}
cout<<"点p5:";
p5.Show();
cout<<"矩形rt3:"<<'\t';
rt3.Show();
switch(rt3.position(p5)){
case 0:cout<<"在矩形上"<cout<<"圆cc3:"<<'\t';
cc3.Show();
switch(cc3.position(p5)){
case 0:cout<<"在圆上"<case -1:cout<<"在圆内"<case 1:cout<<"在圆外"<}
return 0;
}
运行结果:
x=3 y=4 radius=5
x=0 y=0 radius=0
x=0 y=0 width=6 length=8
x=0 y=0 width=0 length=0
点p1:x=0 y=0
矩形rt3:x=0 y=0 width=6
length=8
在矩形上
圆cc3:x=3 y=4 radius=5
在圆上
点p2:x=6 y=8
矩形rt3:x=0 y=0 width=6
length=8
在矩形上
圆cc3:x=3 y=4 radius=5
在圆上
点p3:x=3 y=3
矩形rt3:x=0 y=0 width=6
length=8
在矩形内
圆cc3:x=3 y=4 radius=5
在圆内
点p4:x=8 y=4
矩形rt3:x=0 y=0 width=6
length=8
在矩形外
圆cc3:x=3 y=4 radius=5
在圆上
点p5:x=8 y=8
矩形rt3:x=0 y=0 width=6
length=8
在矩形外
圆cc3:x=3 y=4 radius=5
在圆外
(2)先定义一个Person类,包含数据成员姓名、性别和出生日期,以该类为基类,派生出学生类和职工类。在学生类中增加数据成员学号、成绩;在职工类中增加数据成员职工号和工资。其中,出生日期是日期类的对象。
要求计算学生的平均成绩和职工的平均工资。
#include
#include
#include
class Date
{
int year,month,day;
public:
Date(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void show_date()
{
cout<}
};
class Person
{
protected:
char name[20];
char sex;
Date birthday;
public:
Person(char *nam,char s,int y,int m,int d):birthday(y,m,d)
{
strcpy(name,nam);
sex=s;
}
void show_person()
{
cout<birthday.show_date();
}
};
class Student:public Person
{
public:
Student(char *nam,char s,int y,int m,int d,int cn,float sco):Person(nam,s,y,m,d),cno(cn),score(sco)
{
++count;
sum+=score;
avg=sum/count;
};
void show_student()
{
show_person();
cout<}
void show_count_avg()
{
cout<cout<}
private:
int cno;
float score;
static int count;
static float sum;
static float avg;
};
class Employee:public Person
{
public:
Employee(char *nam,char s,int y,int m,int d,int cn,float sy):Person(nam,s,y,m,d),emyno(cn),salary(sy)
{
++count;
sum+=salary;
avg=sum/count;
};
void show_employee()
{
show_person();
cout<}
void show_count_avg()
{
cout<cout<}
private:
int emyno;
float salary;
static int count;
static float sum;
static float avg;
};
int Student::count=0;
float Student::sum=0.0;
float Student::avg=0.0;
int Employee::count=0;
float Employee::sum=0.0;
float Employee::avg=0.0;
void main()
{
Student stu[3]={Student("Li Jing",'F',86,10,6,101,79),Student("Wang
Ping",'M',87,5,10,102,88),Student("Zhang
Li",'F',89,11,21,103,64)};
cout<for(int i=0;i<3;i++)
stu[i].show_student();
cout<e"<stu[0].show_count_avg();
Employee emy[3]={Employee("Zhao
Ting",'F',75,7,15,201,2100),Employee("Wang
Peng",'M',74,3,1,202,1950),Employee("Li
Qiang",'M',77,12,19,203,2200)};
cout<cout<"sex"<