您的当前位置:首页C++课后答案

C++课后答案

2023-03-09 来源:爱问旅游网
第三章

//1.根据下面函数表达式编写一个程序,实现输入x的值后,能计算并输出相应的函数值y: #include void main(void) { double x,y; cout<<\"请输入x: \"; cin>>x; if(x<0) y=x*x; else if(x>=0&&x<1) y=2.5*x-1; else y=3*x+1; cout<<\"x=\"<//2.设计一个程序,要求:对从键盘输入的一个不多于5位的正整数,能输出它的位数并输出它的各位数字之和。 #include void main(void) { int x,count=0,sum=0;

cout<<\"请输入x: \"; cin>>x;

cout<//编程计算s=1! +2! +3! +...+ n! ,n的值从键盘输入,要求输出n和s的值。 #include void main(void) { int n; double t=1, s=0;

cout<<\"请输入n: \"; cin>>n; for(int i=1;i<=n;i++) { t=t*i; s=s+t; } cout<<\"n=\"<//编程求 之值,其中 是一个数字,n表示 的项数和其最后一项的位数。例如:2+22+222+2222+22222(此时n=5)。 #include void main(void) { int n,a; double s=0,t=0; cout<<\"请输入a和n: \"; cin>>a>>n; for(int i=1;i<=n;i++) { t=t*10+a; s=s+t; } cout<<\"s=\"<//5.利用公式:编程计算 的近似值,要求计算到最后一项的绝对值小于 为止。 #include #include void main(void) { int n=1,flag=1; double pi=1,t=1; while(fabs(t)>1e-5) { flag=-flag; t=flag*1.0/(2*n+1); pi=pi+t; n++; } cout<<\"pi=\"<<4*pi<}

//6.编程求出所有的\"水仙花数\"。所谓\"水仙花数\"是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为 。 #include void main(void) { int a,b,c; for(int i=100;i<1000;i++) { a=i/100; b=i/10%10; c=i%10; if(i==a*a*a+b*b*b+c*c*c) cout<//7.编程求满足以下条件的三位整数n,它除以11所得到的商等于n的各位数字的平方和,且其中至少有两位数字相同。例如,131除以11的商为11,各位数字的平方和为11,所以它是满足条件的三位数。 #include void main(void) { int a,b,c; for(int i=100;i<1000;i++) { a=i/100; b=i/10%10; c=i%10; if(i/11==a*a+b*b+c*c&&(a==b||b==c||a==c)) cout<//8.设计一个求两正整数m和n的最大公约数的程序。m和n的值由键盘输入。 #include void main(void) { int m,n; cout<<\"请输入两个整数: \";

}

cin>>m>>n;

for(int i=m;i>=1;i--) if(m%i==0&&n%i==0) break;

cout<第四章

//1. 设计一个程序,要求输入三个整数,能求出其中的最大数并输出。程序中必须用函数实现求两数中大数的功能 #include int max(int a,int b) { return a>b?a:b; }

void main(void) { int a,b,c,maxnumber; }

cout<<\"请输入三个整数: \"; cin>>a>>b>>c;

maxnumber=max(a,b);

maxnumber=max(maxnumber,c);

cout<//2. 设计一个程序,求出100~200之间的所有素数,要求每行输出5个素数。判断一个整数是否为素数用一个函数来实现。 #include int prime(int x) { for(int i=2;i<=x/2;i++) if(x%i==0) return 0; return 1; }

void main(void) { int k=0; for(int i=100;i<=200;i++) if(prime(i)) { cout<k++; if(k%5==0) cout<//3.回文数是指其各位数字左右对称的整数,例如12321是回文数。定义一个判断回文数的函数,并打印1000~2000之间的所有回文数。 #include int fun(int x) { int s=0; int i=x; while(i) { s=s*10+i%10; i=i/10; } if(s==x) return 1; else return 0; }

void main(void) { int k=0; for(int i=1000;i<=2000;i++) if(fun(i)) { cout<//4.用函数实现求两正整数的最大公约数的功能,并在主函数中调用该函数求出两正整数的最小公倍数。

#include int gys(int a, int b) { for(int i=a;i>=1;i--) if(a%i==0&&b%i==0) return i; return i; }

void main(void) { int a,b,t; cout<<\"请输入两个正整数: \"; cin>>a>>b; t=gys(a,b); cout<//5. 用递归函数实现Hermite多项式求值。当x>1时,Hermite多项式定义为输入实数x和整数n后,求出Hermite多项式前n项的值 #include

double hermite(double x,int n) { double y; if(n==0) y=1; else if(n==1) y=2*x; else y=2*x*hermite(x,n-1)-2*(n-1)*hermite(x,n-2); return y; }

void main() { double x,y; int n; cout<<\"请输入n和x: \"; cin>>n>>x; y=hermite(x,n); cout<<\"y=\"<//6.分别设计两个函数,一个实现整数的正序输出,另一个则实现反序输出。如输人一个整数3456,则输出3456和6543。 //算法提示:重复除以10求余,直到商为0为止。如3456%10的余数为6,商为345;345%10的余数为5,商为34; //34%10的余数为4,商为3;3%10的余数为3,商为0,至此结束。先输出余数,后递归,则为反序输出;

//先递归,后输出余数,则为正序输出。 #include void fun1(int n) { if(n==0)

return ; else fun1(n/10); cout<void fun2(int n) { if(n==0) return; else { cout<void main() { int n; cout<<\"请输入n: \"; cin>>n; fun1(n); cout<第五章

//编写一个宏MAX(a,b,c),求a,b,c中的最大值。a,b,c从键盘输入。 #include

#define max(a,b,c) (a>b?a:b)>c?(a>b?a:b):c main( ) { int a,b,c; int maxnumber; cout<<\"请输入三个数: \"; cin>>a>>b>>c; maxnumber=max(a,b,c); cout<<\"最大数为: \"<//已知三角形的三条边a, b, c,则三角形的面积为 #include

#include

#define s(a,b,c) ((a+b+c)/2)

#define area(a,b,c) s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c) void main( ) { double a,b,c; double ss; cout<<\"请输入三角形的三边: \"; cin>>a>>b>>c; ss=area(a,b,c); ss=sqrt(ss); cout<<\"三角形的面积为: \"<//求一个4×4矩阵两对角线元素之和。 #include void main() { int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; int i,j,s=0; for(i=0;i<4;i++) { for(j=0;j<4;j++) cout<//输出以下的杨辉三角形(要求输出8行) #include void main() { int a[10][10]; int i,j; for(i=0;i<8;i++) { a[i][0]=1; a[i][i]=1; }

}

for(i=2;i<8;i++) for(j=1;jfor(i=0;i<8;i++) { for(j=0;j<=i;j++) cout<//找出二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有鞍点。 #include void main() { int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; int i,j,k,mini,maxj,flag=0,max; for(i=0;i<4;i++) { max=a[i][0]; maxj=0; for(j=1;j<4;j++) { if(maxa[k][maxj]) { max=a[k][maxj]; mini=k; } } if(mini==i) { flag=1; cout<<\"鞍点是: \"<<\"a[\"<break; } }

if(flag==0)

cout<<\"没有鞍点!\"<//4.从键盘输入一个字符串,删除字符串中的所有空格后输出。 #include #include void main() { char str[80]; int i,j; cout<<\"请输入一行带空格的字符串: \"; cin.getline (str,80); i=0;

while(str[i]) { if(str[i]==' ') { j=i; while(str[j]) { str[j]=str[j+1]; j++; } i--; } i++; }

cout<<\"删除空格的字符串为: \"; cout<}

//5.从键盘将一个字符串输入到字符数组中,按反序存放。如,输入\"Abcd dcbA\"。

#include #include void main() { char str[80],ch; int i,j; cout<<\"请输入一行字符串: \";

e\",则输出\"e cin.getline (str,80); int n=strlen(str)-1; for(i=0,j=n;icout<<\"反序的字符串为: \"<//6.编写一个函数把一个10进制数转换成16进制数。 #include #include

void change(int n, char str[]) { int i=0,j; int x; char ch; while(n) { x=n%16; if(x<10) str[i]=x+'0'; else str[i]=x-10+'A'; n=n/16; i++; } str[i]='\\0'; for(i=0,j=strlen(str)-1;ivoid main() { int n; char str[80]; cout<<\"请输入一个十进制整数: \"; cin>>n; change(n,str);

cout<//编写一个函数:void strcpy(char a[ ], char b[]);将b中的字符串拷贝到数组a中。(要求不使用C++的库函数strcpy())。 #include //#include

void strcpy(char a[],char b[]) { int i=0,j=0; while(a[i++]=b[j++]); }

void main() { char a[80],b[80]; cout<<\"请输入一个字符串: \"; cin.getline (b,80); strcpy(a,b); cout<<\"字符串b为: \"<//编写一个函数:void strcat(char a[ ], char b[]);将b中的字符串拼接到数组a中的字符串的后面,构成一个字符串。(要求不使用C++的库函数strcat())。 #include //#include strcat(char a[],char b[]) { int i=0,j=0; while(a[i]) i++; while(a[i++]=b[j++]); }

void main() { char a[80],b[80]; cout<<\"请输入两个字符串: \"; cin.getline (a,80); cin.getline(b,80); cout<<\"字符串a为: \"<//用筛选取法求出2~200之间的所有素数。 #include //#include

void main() { int i,j,k; int a[1000]; for(i=2;i<=200;i++) a[i]=i; for(i=2;i<=200;i++) for(j=2;i*j<=200;j++) a[i*j]=0; for(i=2,k=0;i<=200;i++) if(a[i]!=0) { cout<//编写一个程序:从键盘输入一个整型数,把这个整型数的各位数按降序输出。例输入整型数34125,输出:54321。 #include //#include void sort(int a[],int n) { int i,j,k; int t; for(i=0;ivoid main() { int x; int i=0,n; int a[100]; }

cout<<\"请输入一个整数: \"; cin>>x; while(x) { a[i]=x%10; x=x/10; i++; } n=i;

sort(a,n);

for(i=0;i第七章

//将n个整数按输入顺序的逆序排列,要求应用带指针参数的函数实现。 #include void fun(int *p, int n) { int *q=p+n-1; int k; for(;pvoid main() { int a[100],n; cout<<\"请输入整数的个数: \"; cin>>n; cout<<\"请输入\"<>a[i]; fun(a,n);

cout<<\"逆序排列的数据为: \\n\"; for(i=0;i//编程输入一行文字,找出其中的大写字母,小写字母、空格、数字以及其他字符各有多少。 #include #include void main() { char str[100]; cout<<\"请输入字符串: \"; cin.getline (str,100); char *p; p=str; int daxie=0,xiaoxie=0,shuzi=0,kongge=0,qita=0; while(*p) { if(*p>='A'&&*p<='Z') daxie++; else if(*p>='a'&&*p<='z') xiaoxie++; else if(*p>='0'&&*p<='9') shuzi++; else if(*p==' ') kongge++; else qita++; p++; } cout<<\"大写字符: \"<//编写一个从n个字符串中寻找最长串的函数char *longstr(char *z[], int n), //其中z是指向多个字符串的指针数组,n是字符串的个数,数组返回值是最长串的首地址。 //同时编写main函数验证程序。 #include #include

char *longstr(char *z[], int n)

{ char *pmaxstr; int len,maxlen; pmaxstr=z[0]; maxlen=strlen(z[0]); for(int i=1;ivoid main() { char *pstr[]={\"Monday\ char *pmax; int n; n=sizeof(pstr)/sizeof(pstr[0]); pmax=longstr(pstr,n); cout<<\"最长的字符串是: \"<//编写一个将一个字符串插入到另一个字符串指定位置的函数。同时编写main函数验证程序。

#include #include

void insert(char str[], char substr[], int n)//将substr插入到str的第n个字符后 { char str1[100]; int len; len=strlen(str); if(n>=len-1) { strcat(str,substr); return ; } strcpy(str1,str+n); strcpy(str+n,substr); strcat(str,str1); }

void main() { int n; char str[100],substr[100]; }

cout<<\"请输入第一个字符串: \"; cin.getline(str,100);

cout<<\"请输入第二个字符串: \"; cin.getline(substr,100);

cout<<\"将字符串\"<>n;

insert(str,substr,n);

cout<<\"插入后的字符串为: \"<第八章

#include #include struct point{ double x; double y; };

void main() { point p1,p2; double dis; cout<<\"请输入平面上第一个点的坐标x和y: \"; cin>>p1.x>>p1.y; cout<<\"请输入平面上第二个点的坐标x和y: \"; cin>>p2.x>>p2.y; dis=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); cout<<\"点(\"<#include #include struct node { char ch; struct node *next; };

node *create(char *str) {

node *head,*p1,*p2; head=NULL; p1=p2=head; while(*str) { p1=new node; p1->ch=*str; if(head==NULL) head=p1; else p2->next=p1; p2=p1; str++; } p2->next=NULL; return head; }

int search(node *head, char ch, int a[]) { int i=0,k=0; node *p=head; while(p) { k++; if(p->ch==ch) a[++i]=k; p=p->next; } return i; }

void main() { node *head=NULL; char str[100],ch; int a[100];

cout<<\"请输入一行字符串: \"; cin.getline (str,100);

head=create(str); //建立链表 cout<<\"请输入一个字符: \"; cin>>ch;

int n=search(head,ch,a);//查找字符,返回出现次数, a中为出现位置 if(n==0) cout<<\"字符串\"<}

cout</建立一个链表,每个结点包括年龄和姓名,然后按年龄从小到大排序。 #include #include struct node { char name[20]; int age; struct node *next; };

node *insert(node *head,node *p0) { node *p1,*p2; p1=head; if(head==NULL) { head=p0; p0->next=NULL; } else { while(p0->age>p1->age&&p1->next !=NULL) { p2=p1; p1=p1->next ; } if(p0->age<=p1->age) { if(p1==head) { p0->next=head; head=p0; } else {

p0->next=p1; p2->next=p0; } } else { p1->next=p0; p0->next=NULL; } } return head; }

void print(node *head) { node *p=head; while(p) { cout<name<<'\'<age<next; } }

void main() { node *head=NULL; char name[20]; node *p; cout<<\"请输入姓名(输入0结束): \"; cin.getline(name,20); while(strcmp(name,\"0\")) { p=new node; strcpy(p->name,name); }

cout<<\"请输入\"<>p->age; cin.ignore (); head=insert(head,p); cout<<\"请输入姓名(输入0结束): \"; cin.getline(name,20); }

cout<<\"年龄排序的结果: \\n\"; print(head);

第九章

//5. 构建一个类,含有三个数据成员,分别表示一个长方体的长、宽、高;含有一个成员函数,用来计算长方体的体积。 #include class Cub { double l,w,h; public: void setcub(double length, double width,double height) { l=length; w=width; h=height; } double volume() { return l*w*h; } void show() { cout<<\"长方体的长、宽、高分别为: \"; cout<void main() { Cub cub; double len,wid,hei; cout<<\"请输入长方体的长、宽、高: \"; cin>>len>>wid>>hei; cub.setcub (len,wid,hei); cub.show (); }

//6. 设计一个学生类,包含学生的姓名、数学、物理、英语课程成绩,计算学生的平均成绩。 #include #include class Student { char name[20]; int math; int phy;

int eng; double ave; public: void SetScore(char *str,int m,int p,int e) { strcpy(name,str); math=m; phy=p; eng=e; } void Average() { ave=(math+phy+eng)/3.0; } void Show() {

cout<void main() { Student stu; int m,p,e; char name[20];

cout<<\"请输入学生的姓名: \"; cin.getline(name,20);

cout<<\"请输入数学、物理及英语的成绩: \"; cin>>m>>p>>e; stu.SetScore(name,m,p,e); stu.Average(); stu.Show(); } 7.

#include #define PI 3.1415926 class Nata { double r; public: Setr(double i) { r=i;

} double PeriPrice() { double l=r+3; double s=2*PI*r+2*PI*l; return s*35; } double AreaPrice() { double s; s=PI*((r+3)*(r+3)-r*r); return s*20; } };

void main() { Nata pol; double r; cout<<\"请输入游泳池的半径(米): \"; cin>>r; pol.Setr(r); cout<<\"栅栏价格: \"<第十章 5.

#include #include class Stu { char num[20]; int score; public: Stu(char *n, int s) { strcpy(num,n); score=s; } void Show() { cout<} int Getscore() { return score; } };

Stu * max(Stu *p, int n) { Stu *p1; p1=p; int maxscore=p->Getscore(); for(int i=1;iGetscore()) { maxscore=(p+i)->Getscore(); p1=p+i; } return p1; }

void main() { Stu stu[5]={Stu(\"001\ Stu *p=stu; for(;pShow(); p=max(stu,5); cout<<\"成绩最高的学生是: \\n\"; p->Show(); } 6

#include #define PI 3.1415926 class Circle { double Radius; public: Circle(double r=0) { Radius=r; } Circle(Circle& c) { Radius=c.Radius;

} double Peri() { return 2*PI*Radius; } double Area() { return Radius*Radius*PI; } void Show() { cout<<\"r=\"<void main() { double r; } /*

cout<<\"请输入圆的半径 : \"; cin>>r; Circle cir(r); cir.Show();

7、有16个数:{1,2,2,3,4,4,5,6,6,7,8,8,8,9,10,10},已按由小到大的顺序排好, 存于数组a中,试建立一个类ARR,完成将其中相同的数删得只剩一个。 经删除后,a数组中的内容 为{1,2,3,4,5,6,7,8,9,10}, 具体要求如下: (1) 私有数据成员

int n: 数组实际元素个数。

int a[100]:存放原始数组及结果数组。 (2) 公有成员函数

ARR(int x[ ], int size):构造函数,用size初始化n,用x初始化a数组。 void delsame():完成数组a中相同元素的删除工作。

void show(): 将结果数组以每行5个数的形式输出到屏幕上。

(3) 在主程序中定义数组int b[16],初值如上。定义一个类ARR的对象v,用b及数组元素的个数初始化该对象,然后按上述要求完成对该类的测试。 */

#include #include

class ARR //定义类, 类中的成员数据是一个数组和数组中存放的实际数据的项数 { int n; //数组中的实际元素个数 int a[100]; //数组, 定义的空间大一些

public: n

ARR(int x[], int size) //初始化类中的数据成员, 用形参数组x初始化a, 用形参size初始化{ }

n=size;

for(int i=0;ivoid delsame(void) //删除数组中相邻的相同的元素 {

for(int i=0;iif(a[i]==a[i+1]) //当前元素与后面相邻的元素相同 {

for(int j=i+1;jn--; //循环覆盖一次之后, 数组的有效元素个数减1

i--; //继续判断下一个元素是否与当前元素相同, 因下一条语句是i++; 所以先将i减1,以使i保持不变 } } } void show(void) //10个一行, 输出删除后的数组中的内容 { for(int i=0,k=0;ivoid main(void) { int b[]={1,2,2,3,4,4,5,6,6,7,8,8,8,9,10,10}; //先定义数组, 用此数组初始化类的对象中的数组成员 int n=sizeof(b)/sizeof(int); //计算b数组的元素长度 ARR v(b,n); //定义类的对象并用数组b和数据n初始化对象的成员 v.show (); //输出对象的数组成员中的数据(还未做删除操作, 输出的是初始化后的数据) cout<}

v.show (); //删除操作后输出对象的数组成员中的数据 cout<第十一章

//5. 有一个学生类,包括学生学号、姓名、三门功课的成绩。设计一个友元函数,

//输出按平均成绩对应的等级;大于等于90,A级;80~89,B级;60~79,C级;小于60,D级。

#include #include class Stu { char num[10]; char name[20]; int score[3]; public: Stu(char *number, char *na,int a[]) { strcpy(num,number); strcpy(name,na); for(int i=0;i<3;i++) score[i]=a[i]; } void Show() { cout<void grade(Stu &stu) { double average=0; char g; for(int i=0;i<3;i++) average+=stu.score [i]; average=average/3; if(average>=90) g='A'; else if(average>=80) g='B';

else if(average>=60) g='C'; else g='D'; stu.Show ();

cout<void main() { int i; char number[10]; char name[20]; int sc[3]; while(1) { cout<<\"请输入学生的学号(输入为0退出): \"; cin>>number; if(strcmp(number,\"0\")==0) break; cout<<\"请输入学生的姓名: \"; cin.ignore (); cin.getline (name,20); }

}

cout<<\"请输入\"<>sc[i];

Stu stu(number,name, sc); grade(stu);

第十二章

//定义复数类的加法与减法,使之能够执行下列运算: // Complex a(2,5), b(7, 8), c(0, 0); // c=a+b; // c=4.1+a; // c=b-5.6;

#include class Complex { double real; double image; public:

Complex(double r=0, double i=0) { real=r; image=i; } Complex operator+(Complex &c) { Complex com; com.real=real+c.real; com.image=image+c.image; return com; } Complex operator-(double x) { Complex com; com.real=real-x; com.image=image; return com; } friend Complex operator +(double x, Complex c) { Complex com; com.real=x+c.real; com.image=c.image; return com; } void Show() { cout<void main() { Complex a(2,5), b(7, 8), c(0, 0); c=a+b; c.Show(); c=4.1+a; c.Show(); c=b-5.6; c.Show(); }

//5. 设计一个2行3列的矩阵类,重载运算符\"+\"和\"-\",能实现矩阵类对象的加减运算; //重载流插入运算符\"<<\"和流提取运算符\">>\",使之能用于矩阵的输入和输出。

#include class Mat { double a[2][3]; public: Mat() { for(int i=0;i<2;i++) for(int j=0;j<3;j++) a[i][j]=0; } Mat(double b[][3]) { for(int i=0;i<2;i++) for(int j=0;j<3;j++) a[i][j]=b[i][j]; } Mat operator+(Mat &m) { Mat mat; for(int i=0;i<2;i++) for(int j=0;j<3;j++) mat.a[i][j]=a[i][j]+m.a[i][j]; return mat; } Mat operator-(Mat &m) { Mat mat; for(int i=0;i<2;i++) for(int j=0;j<3;j++) mat.a[i][j]=a[i][j]-m.a[i][j]; return mat; } friend istream& operator>>(istream&, Mat&); friend ostream& operator<<(ostream&, Mat&); };

istream& operator>>(istream &is, Mat &m) { cout<<\"请输入2行3列矩阵内容: \\n\"; for(int i=0;i<2;i++) for(int j=0;j<3;j++) is>>m.a[i][j]; return is; }

ostream& operator<<(ostream &os, Mat &m) { for(int i=0;i<2;i++) { for(int j=0;j<3;j++) os<void main() { Mat m1,m2,m3; cin>>m1>>m2; cout<<\"m1+m2=\"<//6. 定义一个人民币的类,其中成员数据包括元、角、分,成员函数包括构造及输出函数。 //要求增加适当的成员函数,重载+、-、+=、++、输入输出流,来实现人民币的直接运算。注意分、角、元的进位。 #include #include

class RMB{ //人民币类 private: int Yuan, Jiao, Fen;//私有数据 元 角 分 public: RMB(int yuan=0, int jiao=0, int fen=0) //构造函数 , 缺省构造为0元0角0分 { Yuan=yuan; Jiao=jiao; Fen=fen; } void Show() { cout<>(istream &is, RMB &);//只能用友元函数的形式重载输入运算

符 friend ostream &operator<<(ostream &os, RMB &);//只能用友元函数的形式重载输出运算符 };

RMB RMB::operator +(RMB &r) //用成员函数的形式重载加法运算符 { RMB rs; //加法的和, 为另一个人民币的对象, 缺省构造, 为0元0角0分 rs.Fen=Fen+r.Fen; //首先分相加, 即对象本身的分成员与形参r的分成员相加 while(rs.Fen>=10) //当分大于10时, 循环 { }

}

rs.Jiao++; //循环依次角加1,分减10 rs.Fen-=10;

rs.Jiao+=Jiao+r.Jiao; //角相加

while(rs.Jiao>=10) //同样角大于10, 循环 { rs.Yuan++; rs.Jiao-=10; }

rs.Yuan+=Yuan+r.Yuan;

return rs; //将结果作为函数值返回

RMB operator -(RMB &r1, RMB &r2) //用友元函数的形式重载减法运算符 {

RMB rs; //减法的差, 为另一个人民币的对象, 缺省构造, 为0元0角0分

if(r1.Yuancout<<\"钱不够, 不能付帐!\\n\"; return rs; //不能相减, 返回值为0的对象 }

if(r1.Yuan==r2.Yuan&&r1.Jiaocout<<\"钱不够, 不能付帐!\\n\"; return rs; }

if(r1.Yuan==r2.Yuan&&r1.Jiao==r2.Jiao&&r1.Fenrs.Yuan=r1.Yuan-r2.Yuan; //首先先减元 rs.Jiao=r1.Jiao-r2.Jiao;

while(rs.Jiao<0) //角相减为负值, 结果元减1, 角加10 {

}

rs.Yuan--; rs.Jiao+=10; }

rs.Fen=r1.Fen-r2.Fen;

while(rs.Fen<0) //分相减为负值 { rs.Jiao--; //角减1 if(rs.Jiao<0) //角若为负值 { rs.Yuan--; //元再减1 rs.Jiao+=10; } rs.Fen+=10; }

return rs;

RMB& RMB::operator+=(RMB &r) //只能用成员函数的形式重载+=运算符 { //该运算结果将对象本身的值改变, 所以返回对象本身的引用 Fen=Fen+r.Fen; //对象本身的分与形参的分相加, 再赋给对象本身 while(Fen>=10) { Jiao++; Fen-=10; } Jiao=Jiao+r.Jiao; while(Jiao>=10) { Yuan++; Jiao-=10; } Yuan=Yuan+r.Yuan; return *this; //返回对象本身的值 }

RMB& RMB::operator++(void) //对象本身加1分钱 { Fen=Fen+1; while(Fen>=10) { Jiao++; Fen-=10; } while(Jiao>=10) { Yuan++;

}

Jiao-=10; }

return *this;

istream & operator>>(istream &is, RMB &r) //只能用友元函数的形式重载输入运算符 { cout<<\"请分别输入元、角、分(整数之间用空格或回车间隔): \"; is>>r.Yuan>>r.Jiao>>r.Fen; //从键盘分别对形参对象的各个数据成员赋值 return is; //返回输入流的引用, 这样可以连续赋值 }

ostream& operator<<(ostream &os, RMB &r) //只能用友元函数的形式重载输出运算符 {

while(r.Fen>=10) //在输出前调整输出格式 { r.Jiao++; r.Fen-=10; }

while(r.Jiao>=10) { r.Yuan++; r.Jiao-=10; }

os<<\"¥\"<void main() { 0 }

RMB r1(14, 5 ,7),r2,r3; //定义三个人民币的对象, 其中两个调用缺省的构造, 构造为cout<<\"请输入一个人民币数值: \\n\";

cin>>r2; //调用重载的输入流输入对象的数值 r3=r1+r2; //调用重载的加法运算符 cout<cout<cout<//7.定义一个时间的类,其中成员数据包括小时、分、秒,成员函数为构造函数。要求增加适当的成员函数,

//重载+、-、+=及输入输出流,来实现时间类对象的直接输入输出及两个时间的运算。 #include #include #include class TIME{ //时间类 private:

int Hour, Minute, Second;//私有数据 小时 分钟 秒 public:

TIME(int hour=0, int minute=0, int second=0) //构造函数 , 缺省构造为0时0分0秒 { Hour=hour; Minute=minute; Second=second; }

TIME operator+(TIME &t); //用成员函数的形式重载加法运算符 friend double operator-(TIME &t1, TIME &t2); //用友元函数的形式重载减法运算符, 返回分钟 TIME& operator+=(TIME &t); //只能用成员函数的形式重载+=运算符 TIME& operator++(); //用成员函数的形式重载++运算符 friend istream &operator>>(istream &is, TIME &);//只能用友元函数的形式重载输入运算符 friend ostream &operator<<(ostream &os, TIME &);//只能用友元函数的形式重载输出运算符 };

TIME TIME::operator +(TIME &t) //用成员函数的形式重载加法运算符 { TIME tt; //加法的和, 为另一个时间的对象, 缺省构造, 为0时0分0秒 tt.Second=Second+t.Second; //首先秒相加, 即对象本身的秒成员与形参t的秒成员相加 while(tt.Second >=60) //当秒大于60时, 循环 { }

tt.Minute++; //循环依次分加1,秒减60 tt.Second-=60; }

tt.Minute+=Minute+t.Minute; //分相加

while(tt.Minute>=60) //同样分大于60, 循环 { tt.Hour++; tt.Minute-=60; }

tt.Hour+=Hour+t.Hour; if(tt.Hour>=24) tt.Hour-=24;

return tt; //将结果作为函数值返回

double operator -(TIME &t1, TIME &t2) //用友元函数的形式重载减法运算符, 返回分钟数 { double minute; //减法的差, 为分钟 if(t1.Hourcout<<\"不能相减!\\n\"; return 0; //不能相减, 返回值为0 }

if(t1.Hour==t2.Hour&&t1.Minutecout<<\"不能相减!\\n\"; return 0; }

if(t1.Hour==t2.Hour&&t1.Minute==t2.Minute&&t1.Secondminute=(t1.Hour-t2.Hour)*60; //首先先减小时, 再将其变成分钟 minute+=t1.Minute-t2.Minute; if(t1.Second-t2.Second<0) minute--; return minute;

TIME& TIME::operator+=(TIME &t) //只能用成员函数的形式重载+=运算符 { //该运算结果将对象本身的值改变, 所以返回对象本身的引用 Second=Second+t.Second; //对象本身的秒与形参的秒相加, 再赋给对象本身 if(Second>=60) { Minute++; Second-=60; } Minute=Minute+t.Minute; while(Minute>=60) { Hour++; Minute-=60; } Hour=Hour+t.Hour; if(Hour>=24) Hour=Hour-24; return *this; //返回对象本身的值 }

istream & operator>>(istream &is, TIME &t) //只能用友元函数的形式重载输入运算符

{ }

cout<<\"请输入时间(按提示逐个输入小时、分、秒): \\n\"; cout<<\"请输入小时(大于等于0, 小于等于23): \"; is>>t.Hour;

while(t.Hour>23||t.Hour<0) { cout<<\"输入小时的数值不对, 在0到23的范围内! 请重新输入! \"; is>>t.Hour; }

cout<<\"请输入分钟(大于等于0, 小于等于59): \"; is>>t.Minute;

while(t.Minute>59||t.Minute<0) { }

cout<<\"输入分钟的数值不对, 在0到59的范围内! 请重新输入! \"; is>>t.Minute;

cout<<\"请输入秒数(大于等于0, 小于等于59): \"; is>>t.Second;

while(t.Second>59||t.Second<0) {

cout<<\"输入秒数的数值不对, 在0到59的范围内! 请重新输入! \"; is>>t.Second; }

return is; //返回输入流的引用, 这样可以连续赋值

ostream& operator<<(ostream &os, TIME &t) //只能用友元函数的形式重载输出运算符 {

os<void main() {

struct tm *CurrentTime; //这两个变量是为了取得当前时间 time_t time_date; time_date=time(0); //获得当前时间 CurrentTime=localtime(&time_date);//设置当前时间 TIME currenttime(CurrentTime->tm_hour,CurrentTime->tm_min,CurrentTime->tm_sec); //将当前时间赋值时间类对象 cout<<\"\\n\\欢迎使用简易时间计算器! \\n\"; cout<<\"\\n\当前时间是: \"< }

{

cout<<\"\\n\\n\1. 时间加法\\n\"; cout<<\"\2. 时间减法\\n\";

cout<<\"\3. 时间自身加法(+=)\\n\"; cout<<\"\0. 退出时间计算器\\n\";

cout<<\"\\n\请选择操作您所需的操作: \"; cin>>Choice; //用户输入选择 switch(Choice) {

case 1: //选中加法操作 cout<<\"\\时间加法, 请按提示输入两个时间:\\n\\n\"; cin>>t1; cout<>t2;

t3=t1+t2; //重载加法运算符 cout<>t1; cout<>t2; m=t1-t2; cout<>t1; cout<>t2; cout<}while(Choice!=0); //选择退出后才能退出菜单循环 cout<<\"\\n\\n\欢迎再次使用简易时间计算器, 谢谢!\\n\";

第十三章

//7定义一个长方形Rect类,派生出长方体类Cub,计算派生类对象的表面积和体积。 #include class Rect { double len; double wid; public: Rect(double l=0,double w=0) { len=l; wid=w; } double Area() { return len*wid; } void Show() { cout<<\"length=\"<class Cub:public Rect { double hei; public: Cub(double l,double w,double h=0):Rect(l,w) { hei=h; } double Area() { return 2*(Rect::Area ()+wid*hei+len*hei); } double volume() { return Rect::Area ()*hei; } void Show() { cout<<\"length=\"<} };

void main() { Cub cub(2,3,4); cub.Show(); }

//8定义一个Shape基类,并派生出圆球体(Sphere)和立方体类(Cube), //分别求圆球体与立方体对象的表面积和体积。 #include #define PI 3.1415926 class Shape {

public: Shape(){} double Area(){} double Volume(){} void Show(){} };

class Sphere:public Shape { double r; public: Sphere(double rr):Shape() { r=rr; } double Area() { return 4*PI*r*r; } double Volume() { return 4*PI*r*r*r/3; } void Show() { cout<<\"r=\"<class Cube:public Shape { double len,wid,hei;

public: Cube(double l,double w,double h):Shape() { len=l; wid=w; hei=h; } double Area() { return 2*(len*wid+wid*hei+len*hei); } double Volume() { return len*wid*hei; } void Show() { cout<<\"length=\"<void main() { Sphere sph(5); sph.Show (); Cube cub(2,3,4); cub.Show (); }

因篇幅问题不能全部显示,请点此查看更多更全内容