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

C++習題與解析-模板

編輯:C++入門知識
01.分析以下程序的執行結果
  #include<iostream.h>
  template <class T>
  T max(T x,T y)
  {
  return (x>y?x:y);
  }
  void main()
  {
  cout<<max(2,5)<<","<<max(3.5,2.8)<<endl;
  }
  解:
  本題說明函數模板的使用方法。max()函數是一個函數模板,它返回兩個參數中的較大者。在調用時自動聯編相應的max()函數。所以輸出為:5,3.5
  注重:T為類型形式參數,可包含基本數據類型,也可以包含類類型,不能是普通的數據變量。
  
  -------------------------------------------------------
  
  02.分析以下程序的執行結果
  #include<iostream.h>
  template <class T>
  class Sample
  {
  T n;
  public:
  Sample(T i){n=i;}
  void operator++();
  void disp(){cout<<"n="<<n<<endl;}
  };
  template <class T>
  void Sample<T>::operator++()
  {
  n+=1; // 不能用n++;因為double型不能用++
  }
  void main()
  {
  Sample<char> s('a');
  s++;
  s.disp();
  }
  解:
  本題說明類模板的使用方法。Sample是一個類模板,由它產生模板類Sample<char>,通過構造函數給n賦初值,通過重載++運算符使n增1,這裡n由'a'增1變成'b'。
  所以輸出為:n=b
  
  -------------------------------------------------------
  
  03.編寫一個對具有n 個元素的數組x[]求最大值的程序,要求將求最大值的函數設計成函數模板。
  解:
  將max()函數設計成一個函數模板。
  本題程序如下:
  #include<iostream.h>
  template <class T>
  T max(T x[],int n)
  {
  int i;
  T maxv=x[0];
  for(i=1;i<n;i++)
  if(maxv<x[i])
  maxv=x[i];
  return maxv;
  }
  void main()
  {
  int a[]={4,5,2,8,9,3};
  double b[]={3.5,6.7,2,5.2,9.2};
  cout<<"a數組最大值:"<<max(a,6)<<endl;
  cout<<"b數組最大值:"<<max(b,5)<<endl;
  }
  本程序的執行結果如下:
  a 數組最大值:9
  b 數組最大值:9.2
  
  -------------------------------------------------
  
  04.編寫一個使用類模板對數組進行排序、查找和求元素和的程序。
  解:
  設計一個類模板template<class T>class Array,用於對T類型的數組進行排序、查找和求元素和,然後由此產生模板類Array<int>和Array<double>。
  本題程序如下:
  #include<iostream.h>
  #include<iomanip.h>
  template <class T>
  class Array
  {
  T *set;
  int n;
  public:
  Array(T *data,int i){set=data;n=i;}
  ~Array(){}
  void sort(); // 排序
  int seek(T key); // 查找指定的元素
  T sum(); // 求和
  void disp(); // 顯示所有的元素
  };
  template<class T>
  void Array<T>::sort()
  {
  int i,j;
  T temp;
  for(i=1;i<n;i++)
  for(j=n-1;j>=i;j--)
  if(set[j-1]>set[j])
  {
  temp=set[j-1];set[j-1]=set[j];set[j]=temp;
  }
  }
  template <class T>
  int Array<T>::seek(T key)
  {
  int i;
  for(i=0;i<n;i++)
  if(set[i]==key)
  return i;
  return -1;
  }
  template<class T>
  T Array<T>::sum()
  {
  T s=0;int i;
  for(i=0;i<n;i++)
  s+=set[i];
  return s;
  }
  template<class T>
  void Array<T>::disp()
  {
  int i;
  for(i=0;i<n;i++)
  cout<<set[i]<<" ";
  cout<<endl;
  }
  void main()
  {
  int a[]={6,3,8,1,9,4,7,5,2};
  double b[]={2.3,6.1,1.5,8.4,6.7,3.8};
  Array<int>arr1(a,9);
  Array<double>arr2(b,6);
  cout<<" arr1:"<<endl;
  cout<<" 原序列:"; arr1.disp();
  cout<<" 8在arr1中的位置:"<<arr1.seek(8)<<endl;
  arr1.sort();
  cout<<" 排序後:"; arr1.disp();
  cout<<"arr2:"<<endl;
  cout<<" 原序列:"; arr2.disp();
  cout<<" 8.4在arr2中的位置:"<<arr2.seek(8.4)<<endl;
  arr2.sort();
  cout<<" 排序後:"; arr2.disp();
  }
  本程序的執行結果如下:
  arr1:
  原序列:6 3 8 1 9 4 7 5 2
  8在arr1中的位置:2
  排序後:1 2 3 4 5 6 7 8 9
  arr2:
  原序列:2.3 6.1 1.5 8.4 6.7 3.8
  8.4在arr2中的位置:3
  排序後:1.5 2.3 3.8 6.1 6.7 8.4
  
   題1.分析以下程序的執行結果
  #include<iostream.h>
  template <class T>
  T abs(T x)
  {
  return (x>0?x:-x);
  }
  void main()
  {
  cout<<abs(-3)<<","<<abs(-2.6)<<endl;
  }
  解:
  abs()是一個函數模板,它返回參數的絕對值。在調用時自動聯編相應的abs()函數。
  所以輸出為:3,2.6
  
  ----------------------------------------------
  
  題2.分析以下程序的執行結果
  #include<iostream.h>
  template<class T>
  class Sample
  {
  T n;
  public:
  Sample(){}
  Sample(T i){n=i;}
  Sample<T>&operator+(consta Sample<T>&);
  void disp(){cout<<"n="<<n<<endl;}
  };
  template<class T>
  Sample<T>&Sample<T>::operator+(const Sample<T>&s)
  {
  static Sample<T> temp;
  temp.n=n+s.n;
  return temp;
  }
  void main()
  {
  Sample<int>s1(10),s2(20),s3;
  s3=s1+s2;
  s3.disp();
  }
  解:
  Sample為一個類模板,產生一個模板類Sample<int>,並建立它的三個對象,調用重載運算符+實現s1與s2的加法運算,將結果賦給s3。
  所以輸出為:n=30
  
  ----------------------------------------------------
  
  題3.編寫一個函數模板,它返回兩個值中的較小者,同時要求能正確處理字符串。
  解:
  這裡設計一個函數模板template<class T> T min(T a,T b),可以處理int、float和char 等數據類型,為了能正確處理字符串,添加一個重載函數專門處理字符串比較,即char *min(char *a,char *b)。
  本題程序如下:
  #include<iostream.h>
  #include<string.h>
  template<class T>
  T min(T a,T b)
  {
  return (a<b?a:b);
  }
  char *min(char *a,char *b)
  {
  return (strcmp(a,b)<0?a:b);
  }
  void main()
  {
  double a=3.56,b=8.23;
  char s1[]="Hello",s2[]="Good";
  cout<<"輸出結果:"<<endl;
  cout<<" "<<a<<","<<b<<"中較小者:"<<min(a,b)<<endl;
  cout<<" "<<s1<<","<<s2<<"中較小者:"<<min(s1,s2)<<endl;
  }
  輸出結果:
  3.56,8.23中較小者:3.56
  Hello,Good中較小者:Good
  
  ----------------------------------------------------
  
  題4.設計一個數組類模板Array<T>,其中包含重載下標運算符函數,並由此產生模板類Array<int>和Array<char>,使用一些測試數據對其進行測試。
  解:
  本題程序如下:
  #include<iostream.h>
  #include<iomanip.h>
  template <class T>
  class Array
  {
  T *elems;
  int size;
  public:
  Array(int s); // 構造函數
  ~Array();
  T& operator[](int); // 重載下標運算符
  void operator=(T); // 重載等號運算符
  };
  template <class T>
  Array<T>::Array(int s)
  {
  size=s;
  elems=new T[size];
  for(int i=0;i<size;i++)
  elems[i]=0;
  }
  template<class T>
  Array<T>::~Array()
  {
  delete elems;
  }
  template<class T>
  T& Array<T>::operator[](int index)
  {
  return elems[index];
  }
  template<class T>
  void Array<T>::operator=(T temp)
  {
  for(int i=0;i<size;i++)
  elems[i]=temp;
  }
  void main()
  {
  int i,n=10;
  Array<int> arr1(n); // 產生整型模板類及其對象arr1
  Array<char> arr2(n); // 產生字符型模板類及其對象arr2
  for(i=0;i<n;i++)
  {
  arr1[i]='a'+i; // 調用重載運算符
  arr2[i]='a'+i;
  }
  cout<<" ASCII碼 字符"<<endl;
  for(i=0;i<n;i++)
  cout<<setw(8)<<arr1[i]<<setw(8)<<arr2[i]<<endl;
  }
  本程序的執行結果如下:
  ASCII碼 字符
  97 a
  98 b
  99 c
  100 d
  101 e
  102 f
  103 g
  104 h
  105 i
  106 j
   三層交換技術 交換機與路由器密碼恢復 交換機的選購 路由器設置專題 路由故障處理手冊 數字化校園網解決方案
   題 5. 一個Sample類模板的私有數據成員為T n,在該類模板中設計一個operator==重載運算符函數 ,用於比較各對象的n數據是否相等。
  解:
  本題程序如下:
  #include<iostream.h>
  template <class T>
  class Sample
  {
  T n;
  public:
  Sample(T i){n=i;}
  int operator==(Sample &);
  };
  template <class T>
  int Sample<T>::operator==(Sample &s)
  {
  if(n==s.n)
  return 1;
  else
  return 0;
  }
  void main()
  {
  Sample<int> s1(2),s2(3);
  cout<<"s1與s2的數據成員"<<(s1==s2?"相等":"不相等")<<endl;
  Sample<double>s3(2.5),s4(2.5);
  cout<<"s3與s4的數據成員"<<(s3==s4?"相等":"不相等")<<endl;
  }
  本程序的運行結果如下:
  s1與s2的數據成員不相等
  s3與S4的數據成員相等
  
  ----------------------------------------------------
  
  題 6. 對第3章的例3.5進行修改,只設計一個Sample類,其數據和方法均包含在該類中,而且使用類模板的方式實現。
  #include<iostream.h>
  #define Max 100
  template <class T>
  class Sample
  {
  T A[Max];
  int n;
  void qsort(int l,int h); // 私有成員,由quicksort()成員調用
  public:
  Sample(){n=0;}
  void getdata(); // 獲取數據
  void insertsort(); // 插入排序
  void Shellsort(); // 希爾排序
  void bubblesort(); // 冒泡排序
  void quicksort(); // 快速排序
  void selectsort(); // 選擇排序
  void disp();
  };
  template <class T>
  void Sample<T>::getdata()
  {
  cout<<"元素個數:";
  cin>>n;
  for(int i=0;i<n;i++)
  {
  cout<<"輸入第"<<i+1<<"個數據:";
  cin>>A[i];
  }
  }
  template <class T>
  void Sample<T>::insertsort() // 插入排序
  {
  int i,j;
  T temp;
  for(i=1;i<n;i++)
  {
  temp=A[i];
  j=i-1;
  while(temp<A[j])
  {
  A[j+1]=A[j];
  j--;
  }
  A[j+1]=temp;
  }
  }
  template <class T>
  void Sample<T>::Shellsort() // 希爾排序
  {
  int i,j,gap;
  T temp;
  gap=n/2;
  while(gap>0)
  {
  for(i=gap;i<n;i++)
  {
  j=i-gap;
  while(j>=gap)
  if(A[j]>A[j+gap])
  {
  temp=A[j];
  A[j]=A[j+gap];
  A[j+gap]=temp;
  j=j-gap;
  }
  else j=0;
  }
  gap=gap/2;
  }
  }
  template <class T>
  void Sample<T>::bubblesort() // 冒泡排序
  {
  int i,j;
  T temp;
  for(i=0;i<n;i++)
  for(j=n-1;j>=i+1;j--)
  if(A[j]<A[j-1])
  {
  temp=A[j];
  A[j]=A[j-1];
  A[j-1]=temp;
  }
  }
  template <class T>
  void Sample<T>::quicksort() // 快速排序
  {
  qsort(0,n-1);
  }
  template<class T>
  void Sample<T>::qsort(int l,int h)
  {
  int i=l,j=h;
  T temp;
  if(l<h)
  {
  temp=A[l];
  do{
  while(j>i&&A[j]>=temp)
  j--;
  if(i<j)
  {
  A[i]=A[j];
  i++;
  }
  while(i<j&&A[i]<=temp)
  i++;
  if(i<j)
  {
  A[j]=A[i];
  j--;
  }
  }while(i<j);
  A[i]=temp;
  qsort(1,j-1);
  qsort(j+1,h);
  }
  }
  template <class T>
  void Sample<T>::selectsort() // 選擇排序
  {
  int i,j,k;
  T temp;
  for(i=0;i<n;i++)
  {
  k=i;
  for(j=i+1;j<=n-1;j++)
  if(A[j]<A[k])
  k=j;
  temp=A[i];
  A[i]=A[k];
  A[k]=temp;
  }
  }
  template <class T>
  void Sample<T>::disp()
  {
  for(int i=0;i<n;i++)
  cout<<A[i]<<" ";
  cout<<endl;
  }
  void main()
  {
  int sel=0;
  Sample<char> s; // 由類模板產生char型的模板類
  s.getdata();
  cout<<"原來序列:";
  s.disp();
  cout<<"0:插入排序 1:希爾排序 2:冒泡排序 3:快速排序 4:選擇排序 其它退出"<<endl;
  cout<<"選擇排序方法:";
  cin>>sel;
  switch(sel)
  {
  case 0:
  s.insertsort();
  cout<<"插入排序結果";
  break;
  case 1:
  s.Shellsort();
  cout<<"希爾排序結果:";
  break;
  case 2:
  s.bubblesort();
  cout<<"冒泡排序結果:";
  break;
  case 3:
  s.quicksort();
  cout<<"快速排序結果:";
  break;
  case 4:
  s.selectsort();
  cout<<"選擇排序結果:";
  break;
  }
  s.disp();
  }
  程序運行結果如下:
  
  
  ----------------------------------------------------
  
  題 7. 設計一個模板類Sample,用於對一個有序數組采用二分法查找元素下標。
  解:
  #include<iostream.h>
  #define Max 100
  template <class T>
  class Sample
  {
  T A[Max];
  int n;
  public:
  Sample(){}
  Sample(T a[],int i);
  int seek(T c);
  void disp()
  {
  for(int i=0;i<n;i++)
  cout<<A[i]<<" ";
  cout<<endl;
  }
  };
  template <class T>
  Sample<T>::Sample(T a[],int i)
  {
  n=i;
  for(int j=0;j<i;j++)
  A[j]=a[j];
  }
  template <class T>
  int Sample<T>::seek(T c)
  {
  int low=0,high=n-1,mid;
  while(low<=high)
  {
  mid=(low+high)/2;
  if(A[mid]==c)
  return mid;
  else if(A[mid]<c) low=mid+1;
  else high=mid-1;
  }
  return -1;
  }
  void main()
  {
  char a[]="acegkmpwxz";
  Sample<char>s(a,10);
  cout<<"元素序列:"; s.disp();
  cout<<"'g'的下標:"<<s.seek('g')<<endl;
  }
  程序運行結果如下:
  元素序列:a c e g k m p w x z
  元素'g'的下標: 3
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved