程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++習題與解析-重載

C++習題與解析-重載

編輯:C++入門知識

  01.分析以下程序執行結果
  #include<iostream.h>
  int add(int x,int y)
  {
  return x+y;
  }
  double add(double x,double y)
  {
  return x+y;
  }
  void main()
  {
  int a=4,b=6;
  double c=2.6,d=7.4;
  cout<<add(a,b)<<","<<add(c,d)<<endl;
  }
  解:
  本題說明函數重載的使用方法, 這裡有兩個add()函數,一個add()函數的參數與返回值為int型,另一個的參數與返回值為double型,它們是根據參數類型自動區分的。
  所以輸出為: 10,10 -----------------------------------------------
  
  02.分析以下程序的執行結果
  #include<iostream.h>
  class Sample
  {
  int i;
  double d;
  public:
  void setdata(int n){i=n;}
  void setdata(double x){d=x;}
  void disp()
  {
  cout<<"i="<<i<<",d="<<d<<endl;
  }
  };
  void main()
  {
  Sample s;
  s.setdata(10);
  s.setdata(15.6);
  s.disp();
  }
  解:
  本題說明重載成員函數的使用方法。setdata()成員函數有兩個,根據其參數類型加以區分。
  所以輸出為:i=10, d=15.6
  
  -----------------------------------------------
  
  03.分析以下程序的執行結果
  #include<iostream.h>
  class Sample
  {
  int n;
  public:
  Sample(){}
  Sample(int i){n=i;}
  Sample &operator =(Sample);
  void disp(){cout<<"n="<<n<<endl;}
  };
  Sample &Sample::operator=(Sample s)
  {
  Sample::n=s.n;
  return *this;
  }
  void main()
  {
  Sample s1(10),s2;
  s2=s1;
  s2.disp();
  }
  解:
  本題說明重載運算符(=)的使用方法。operator=成員函數實現兩個對象的賦值。
  所以輸出為: n=10
  
  -------------------------------------------------
  
  04.設計一個點類Point,實現點對象之間的各種運算。
  解:
  Point類提供了6個運算符重載函數(參加程序中的代碼和注釋),以實現相應的運算。
  本題程序如下:
  #include<iostream.h>
  class Point
  {
  int x,y;
  public:
  Point(){x=y=0;}
  Point(int i,int j){x=i;y=j;}
  Point(Point &);
  ~Point(){}
  void offset(int,int); // 提供對點的偏移
  void offset(Point); // 重載,偏移量用Point類對象表示
  bool operator==(Point); // 運算符重載,判定兩個對象是否相同
  bool operator!=(Point); // 運算符重載,判定兩個對象是否不相同
  void operator+=(Point); // 運算符重載,將兩個點對象相加
  void operator-=(Point); // 運算符重載,將兩個點對象相減
  Point operator+(Point ); // 運 算符重 載,相加並將結果放在左操作數中
  Point operator-(Point); // 運算符重載,相減並將結果放在左操作數中
  int getx(){return x;}
  int gety(){return y;}
  void disp()
  {
  cout<<"("<<x<<","<<y<<")"<<endl;
  }
  };
  Point::Point(Point &p)
  {
  x=p.x; y=p.y;
  }
  void Point::offset(int i,int j)
  {
  x+=i; y+=j;
  }
  void Point::offset(Point p)
  {
  x+=p.getx(); y+=p.gety();
  }
  bool Point::operator==(Point p)
  {
  if(x==p.getx()&&y==p.gety())
  return 1;
  else
  return 0;
  }
  bool Point::operator!=(Point p)
  {
  if(x!=p.getx()y!=p.gety())
  return 1;
  else
  return 0;
  }
  void Point::operator+=(Point p)
  {
  x+=p.getx(); y+=p.gety();
  }
  void Point::operator-=(Point p)
  {
  x-=p.getx(); y-=p.gety();
  }
  Point Point::operator+(Point p)
  {
  this->x+=p.x; this->y+=p.y;
  return *this;
  }
  Point Point::operator-(Point p)
  {
  this->x-=p.x;this->y-=p.y;
  return *this;
  }
  void main()
  {
  Point p1(2,3),p2(3,4),p3(p2);
  cout<<"1:"; p3.disp();
  p3.offset(10,10);
  cout<<"2:"; p3.disp();
  cout<<"3:"<<(p2==p3)<<endl;
  cout<<"4:"<<(p2!=p3)<<endl;
  p3+=p1;
  cout<<"5:"; p3.disp();
  p3-=p2;
  cout<<"6:"; p3.disp();
  p3=p1+p3; // 先將p1+p3的結果放在p1中,然後賦給p3,所以p1=p3
  cout<<"7:"; p3.disp();
  p3=p1-p2;
  cout<<"8:"; p3.disp();
  }
  
  本程序的執行結果如下:
  1:(3,4)
  2:(13,14)
  3:0
  4:1
  5:(15,17)
  6:(12,13)
  7:(14,16)
  8:(11,12)
  
  ----------------------------------------------------
  
   05.設計一個日期類Date,包括年、月、日等私有數據成員。要求實現日期的基本運算,如一日期加上天數、一日期減去天數、兩日期相差的天數等。
  解:
  在Date類中設計如下重載運算符函數:
  Date operator+(int days); 返回一日期加一天數得到的日期
  Date operator-(int days); 返回一日期減去天數得到的日期
  int operator-(Date &b); 返回兩日期相差的天數
  在實現這些重載運算符函數調用以下私有成員函數:
  leap(int); 判定指定的年份是否為閏年
  dton(Date &); 將指定日期轉換為從0年0月0日起的天數
  ntod(int); 將指定的0年0月0日起的天數轉換為對應的日期
  本題程序如下:
  #include<iostream.h>
  int day_tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
  {31,29,31,30,31,31,30,31,30,31}};
  // day_tab 二維數組存放各月天數,第一行對應非閏年,第二行對應閏年
  class Date
  {
  int year,month,day;
  int leap(int);
  int dton(Date &);
  Date ntod(int);
  public:
  Date(){}
  Date(int y,int m,int d)
  {
  year=y;month=m;day=d;
  }
  void setday(int d){day=d;}
  void setmonth(int m){month=m;}
  void setyear(int y){year=y;}
  int getday(){return day;}
  int getmonth(){return month;}
  int getyear(){return year;}
  Date operator+(int days)
  {
  static Date date;
  int number=dton(*this)+days;
  date=ntod(number);
  return date;
  }
  Date operator-(int days)
  {
  static Date date;
  int number=dton(*this);
  number-=days;
  date=ntod(number);
  return date;
  }
  int operator-(Date &b)
  {
  int days=dton(*this)-dton(b)-1;
  return days;
  }
  void disp()
  {
  cout<<year<<"."<<month<<"."<<day<<endl;
  }
  };
  int Date::leap(int year)
  {
  if(year%4==0&&year%100!=0year%400==0) // 是閏年
  return 1;
  else // 不是閏年
  return 0;
  }
  int Date::dton(Date &d)
  {
  int y,m,days=0;
  for(y=1;y<=d.year;y++)
  if(leap(y))
  days+=366;
  else
  days+=365;
  for(m=0;m<d.month-1;m++)
  if(leap(d.year))
  days+=day_tab[1][m];
  else
  days+=day_tab[0][m];
  days+=d.day;
  return days;
  }
  Date Date::ntod(int n)
  {
  int y=1,m=1,d,rest=n,lp;
  while(1)
  {
  if(leap(y))
  {
  if(rest<=366)
  break;
  else
  rest-=366;
  }
  else
  {
  if(rest<=365)
  break;
  else
  rest-=365;
  }
  y++;
  }
  y--;
  lp=leap(y);
  while(1)
  {
  if(lp)
  {
  if(rest>day_tab[1][m-1])
  rest-=day_tab[1][m-1];
  else
  break;
  }
  else
  {
  if(rest>day_tab[0][m-1])
  rest-=day_tab[0][m-1];
  else
  break;
  }
  m++;
  }
  d=rest;
  return Date(y,m,d);
  }
  void main()
  {
  Date now(2002,6,12),then(2003,2,10);
  cout<<"now:"; now.disp();
  cout<<"then:"; then.disp();
  cout<<"相差天數:"<<(then-now)<<endl;
  Date d1=now+100,d2=now-100;
  cout<<"now+100:"; d1.disp();
  cout<<"now-100:"; d2.disp();
  }
  
  本程序的執行結果如下:
  now:2002.6.12
  then:2003.2.10
  相差天數:242
  now+100:2002.9.20
  now-100:2002.3.4
  
   題1.分析以下程序的執行結果
  #include<iostream.h>
  int add(int x,int y)
  {
  return x+y;
  }
  int add(int x,int y,int z)
  {
  return x+y+z;
  }
  void main()
  {
  int a=4,b=6,c=10;
  cout<<add(a,b)<<","<<add(a,b,c)<<endl;
  }
  解:
  本題說明重載函數的使用方法。這裡有兩個add()函數,一個的參數是2個,另一個的參數是3個,它們是根據參數個數自動區分的。
  所以輸出為: 10,20
  
  -------------------------------------------------
  
  題2.分析以下程序的執行結果
  #include<iostream.h>
  class Sample
  {
  int i;
  double d;
  public:
  void setdata(int n){i=n;d=0;}
  void setdata(int n,double x)
  {
  i=n;d=x;
  }
  void disp()
  {
  cout<<"i="<<i<<",d="<<d<<endl;
  }
  };
  void main()
  {
  Sample s;
  s.setdata(10);
  s.disp();
  s.setdata(2,15.6);
  s.disp();
  }
  解:
  本題說明重載函數的使用方法。setdata()成員函數有2個,根據其參數個數自動加以區分。
  所以輸出為:
  i=10,d=0
  i=2,d=15.6
  
  ------------------------------------------------
  
  題3.分析以下程序的執行結果
  #include<iostream.h>
  class Sample
  {
  int n;
  public:
  Sample(){}
  Sample(int i){n=i;}
  friend Sample operator-(Sample &,Sample &);
  friend Sample operator+(Sample &,Sample &);
  void disp(){cout<<"n="<<n<<endl;}
  };
  Sample operator-(Sample &s1,Sample &s2)
  {
  int m=s1.n-s2.n;
  return Sample(m);
  }
  Sample operator+(Sample &s1,Sample &s2)
  {
  int m=s1.n+s2.n;
  return Sample(m);
  }
  void main()
  {
  Sample s1(10),s2(20),s3;
  s3=s2-s1;
  s3.disp();
  s3=s2+s1;
  s3.disp();
  }
  解:
  本題說明重載運算符-和+的使用。operator-和operator+兩個友元函數實現兩個對象的減法和加法。所以輸出為:
  n=10 // s2-s1
  n=30 // s2+s1
  
  ---------------------------------------------------
  
  題4.分析以下程序的執行結果
  #include<iostream.h>
  class Sample
  {
  int A[10][10];
  public:
  int &operator()(int,int);
  };
  int &Sample::operator()(int x,int y)
  {
  return A[x][y];
  }
  void main()
  {
  Sample a;
  int i,j;
  for(i=0;i<10;i++)
  for(j=0;j<10;j++)
  a(i,j)=i+j;
  for(i=0;i<10;i++)
  cout<<a(i,1)<<" ";
  cout<<endl;
  }
  解:
  本題說明重載下標運算符的使用方法。通過重載下標運算符,使得對於對象a,有a(i,j)等於a.A[i][j]。
  所以輸出為: 1 2 3 4 5 6 7 8 9 10
  
  ------------------------------------------------
  
  題5.分析以下程序的執行結果
  #include<iostream.h>
  class Sample
  {
  int n;
  public:
  Sample(int i){n=i;}
  operator++(){n++;} // 前綴重載運算符
  operator++(int){n+=2;} // 後綴重載運算符
  void disp()
  {
  cout<<"n="<<n<<endl;
  }
  };
  void main()
  {
  Sample A(2),B(2);
  A++; // 調用後綴重載運算符
  ++B; // 調用前綴重載運算符
  A.disp();
  B.disp();
  }
  解:
  本題說明重載運算符++的使用方法。operator++()為前綴重載運算符,operator++(int)為後綴重載運算符。A++的語句調用後綴重載運算符,++B語句調用前綴重載運算符。
  所以輸出為:
  n=4
  n=3
  
   題6.設計一個三角形類Triangle,包含三角形三條邊長的私有數據成員,另有一個重載運算符“+”,以實現求兩個三角形對象的面積之和。
  解:
  在Triangle類中設計一個友元函數operator+(Triangle t1,Triangle t2),它重載運算符"+",返回t1和t2兩個三角形的面積之和。
  本題程序如下:
  #include<iostream.h>
  #include<math.h>
  class Triangle
  {
  int x,y,z;
  double area;
  public:
  Triangle(int i,int j,int k)
  {
  double s;
  x=i;y=j;z=k;
  s=(x+y+z)/2.0;
  area=sqrt(s*(s-x)*(s-y)*(s-z));
  }
  void disparea()
  {
  cout<<"Area="<<area<<endl;
  }
  friend double operator+(Triangle t1,Triangle t2)
  {
  return t1.area+t2.area;
  }
  };
  void main()
  {
  Triangle t1(3,4,5),t2(4,5,6);
  double s;
  cout<<"t1:"; t1.disparea();
  cout<<"t2:"; t2.disparea();
  s=t1+t2;
  cout<<"總面積="<<s<<endl;
  }
  本程序執行結果如下:
  t1:Area=6
  t2:Area=9.92157
  總面積=15.9216
  
  -----------------------------------------------------------
  
  題7.習題6的重載運算符“+”友元函數只能返回兩個三角形的面積之和,不能計算三個三角形的面積之和,改進一下,使之能計算任意多個三角形的面積之和。
  解:
  習題6的重載運算符為什麼不能計算3個三角形的面積之和呢?對於式子:s=t1+t2+t3,先計算t1+t2,返回一個double數然後再進行該double數+t3的計算,顯然沒有這樣的重載運算符“+”友元函數,只需要添加這樣重載運算符“+”友元函數即可。
  本題程序如下:
  #include<iostream.h>
  #include<math.h>
  class Triangle
  {
  int x,y,z;
  double area;
  public:
  Triangle(int i,int j,int k)
  {
  double s;
  x=i;y=j;z=k;
  s=(x+y+z)/2.0;
  area=sqrt(s*(s-x)*(s-y)*(s-z));
  }
  void disparea()
  {
  cout<<"Area="<<area<<endl;
  }
  friend double operator+(Triangle t1,Triangle t2)
  {
  return t1.area+t2.area;
  }
  friend double operator+(double d,Triangle t)
  {
  return d+t.area;
  }
  };
  void main()
  {
  Triangle t1(3,4,5),t2(4,5,6),t3(5,6,7),t4(6,7,8);
  double s;
  cout<<"t1:"; t1.disparea();
  cout<<"t2:"; t2.disparea();
  cout<<"t3:"; t3.disparea();
  cout<<"t4:"; t4.disparea();
  s=t1+t2+t3+t4;
  cout<<"總面積="<<s<<endl;
  }
  本程序的執行結果如下:
  t1:Area=6
  t2:Area=9.92157
  t3:Area=14.6969
  t4:Area=20.3332
  總面積=50.9517
  
  -------------------------------------------------------
  
  題8.設計一個學生類student,包括姓名和三門課程成績,利用重載運算符”+“將所有學生的成績相加放在一個對象中,再對該對象求各門課程的平均分。
  解:
  #include<iostream.h>
  #include<iomanip.h>
  #include<string.h>
  class student
  {
  char name[10];
  int deg1,deg2,deg3;
  public:
  student(){}
  student(char na[],int d1,int d2,int d3)
  {
  strcpy(name,na);
  deg1=d1;deg2=d2;deg3=d3;
  }
  friend student operator+(student s1,student s2)
  {
  static student st;
  st.deg1=s1.deg1+s2.deg1;
  st.deg2=s1.deg2+s2.deg2;
  st.deg3=s1.deg3+s2.deg3;
  return st;
  }
  void disp()
  {
  cout<<setw(10)<<name<<setw(5)<<deg1<<setw(5)<<deg2<<setw(5)<<deg3<<endl;
  }
  friend void avg(student &s,int n)
  {
  cout<<setw(10)<<"平均分"<<setw(5)<<s.deg1/n<<setw(5)<<s.deg2/n<<setw(5)<<s.deg3/n<<endl;
  }
  };
  void main()
  {
  student s1("Li",78,82,86),s2("Zheng",75,62,89);
  student s3("Ma",89,87,95),s4("Xu",54,78,66),s;
  cout<<"輸出結果"<<endl;
  s1.disp();
  s2.disp();
  s3.disp();
  s4.disp();
  s=s1+s2+s3+s4; // 調用重載運算符
  avg(s,4); // 友元函數求平均分
  }
  本程序的執行結果如下:
  輸出結果:
  Li 78 82 86
  Zheng 75 62 89
  Ma 89 87 95
  Xu 54 78 66
  平均分 74 77 84
  
  ------------------------------------------------------------
  
  題9.在Time類中設計如下重載運算符函數:
  Time operator+(Time); 返回一時間加上另一時間得到的新時間
  Time operator-(Time); 返回一時間減去另一時間得到的新時間
  本題程序如下:
  #include<iostream.h>
  class Time
  {
  int hour,minute,second;
  public:
  Time(){}
  Time(int h,int m,int s)
  {
  hour=h;minute=m;second=s;
  }
  Time(int h,int m)
  {
  hour=h;minute=m;second=0;
  }
  void sethour(int h){hour=h;}
  void setminute(int m){minute=m;}
  void setsecond(int s){second=s;}
  int gethour(){return hour;}
  int getminute(){return minute;}
  int getsecond(){return second;}
  Time operator+(Time);
  Time operator-(Time);
  void disp()
  {
  cout<<hour<<":"<<minute<<":"<<second<<endl;
  }
  };
  Time Time::operator+(Time t)
  {
  int carry,hh,mm,ss;
  ss=getsecond()+t.getsecond();
  if(ss>60)
  {
  ss-=60;
  carry=1; // 進位標記
  }
  else carry=0;
  mm=getminute()+t.getminute()+carry;
  if(mm>60)
  {
  mm-=60;
  carry=1;
  }
  else carry=0;
  hh=gethour()+t.gethour()+carry;
  if(hh>24)
  hh=24;
  static Time result(hh,mm,ss);
  return result;
  }
  Time Time::operator-(Time t)
  {
  int borrow,hh,mm,ss;
  ss=getsecond()-t.getsecond();
  if(ss<0)
  {
  ss+=60;
  borrow=1; // 借位標記
  }
  else borrow=1;
  mm=getminute()-t.getminute()-borrow;
  if(mm<0)
  {
  mm+=60;
  borrow=1;
  }
  else borrow=0;
  hh=gethour()-t.gethour()-borrow;
  if(hh<0)
  hh+=24;
  static Time result(hh,mm,ss);
  return result;
  }
  void main()
  {
  Time now(2,24,39);
  Time start(17,55);
  Time t1=now-start,t2=now+start;
  cout<<"輸出結果:"<<endl;
  cout<<" now: "; now.disp();
  cout<<" start:"; start.disp();
  cout<<" 相差: "; t1.disp();
  cout<<" 相加: "; t2.disp();
  }
  本程序的執行結果如下:
  輸出結果:
  now:2:24:39
  start:17:55:0
  相差:8:28:39
  相加:20:19:39
  
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved