ch15_7.cpp
资源名称:c.rar [点击查看]
上传用户:puke2000
上传日期:2022-07-25
资源大小:912k
文件大小:2k
源码类别:

C#编程

开发平台:

Visual C++

  1. //**********************
  2. //**    ch15_7.cpp    **
  3. //**********************
  4. #include <iostream.h>
  5. #include <stdlib.h>
  6. class Vector{
  7. public:
  8.   Vector(int);
  9.   ~Vector(){ delete[]v; }         //将堆中数组空间返还
  10.   Vector(Vector & );
  11.   int Size(){ return sz; }
  12.   void Display();
  13.   int& Elem(int);                 //返回向量元素
  14. protected:
  15.   int* v;                         //指向一个数组,表示向量
  16.   int sz;                         //元素个数
  17. };
  18. Vector::Vector(int s)
  19. {
  20.   if(s<=0){
  21.     cerr <<"bad Vector size.n";
  22.     exit(1);
  23.   }
  24.   sz=s;
  25.   v =new int[s];                  //从堆中分配一个数组存放向量元素
  26. }
  27. int& Vector::Elem(int i)          //引用返回的目的是返回值可以作左值
  28. {
  29.   if(i<0||sz<=i){
  30.     cerr <<"Vector index out of range.n";
  31.     exit(1);
  32.   }
  33.   return v[i];
  34. }
  35. Vector::Vector(Vector& vec)
  36. {
  37.   v = new int[sz=vec.sz];
  38.   memcpy((void*)v,(void*)vec.v,sz*sizeof(int));
  39. }
  40. void Vector::Display()
  41. {
  42.   for(int i=0; i<sz; i++)
  43.     cout <<v[i] <<" ";
  44.   cout <<endl;
  45. }
  46. class Matrix{
  47. public:
  48.   Matrix(int,int);
  49.   Matrix(Matrix & );
  50.   ~Matrix(){ delete[]m; }
  51.   int SizeL(){ return szl; }
  52.   int SizeR(){ return szr; }
  53.   int& Elem(int,int);
  54. protected:
  55.   int* m;
  56.   int szl;
  57.   int szr;
  58. };
  59. Matrix::Matrix(int i,int j)
  60. {
  61.   if(i<=0||j<=0){
  62.     cerr <<"bad Matrix size.n";
  63.     exit(1);
  64.   }
  65.   szl=i;
  66.   szr=j;
  67.   m =new int[i*j];
  68. }
  69. Matrix::Matrix(Matrix& mat)
  70. {
  71.   szl=mat.szl;
  72.   szr=mat.szr;
  73.   m=new int[szl*szr];
  74.   memcpy((void*)m,(void*)mat.m, szl*szr*sizeof(int));
  75. }
  76. int& Matrix::Elem(int i,int j)      //引用返回的目的是返回值可以作左值
  77. {
  78.   if(i<0||szl<=i||j<0||szr<=j){
  79.     cerr <<"Matrix index out of range.n";
  80.     exit(1);
  81.   }
  82.   return m[i*szr+j];
  83. }
  84. Vector Multiply(Matrix& m, Vector& v)  //矩阵乘向量的普通函数
  85. {
  86.   if(m.SizeR()!=v.Size()){
  87.     cerr <<"bad multiply Matrix with Vector.n";
  88.     exit(1);
  89.   }
  90.   Vector r(m.SizeL());       //创建一个存放结果的空向量
  91.   for(int i=0; i<m.SizeL(); i++){
  92.     r.Elem(i)=0;
  93.     for(int j=0; j<m.SizeR(); j++)
  94.       r.Elem(i) +=m.Elem(i,j)*v.Elem(j);
  95.   }
  96.   return r;
  97. }
  98. void main()
  99. {
  100.   Matrix ma(4,3);
  101.   ma.Elem(0,0)=1;  ma.Elem(0,1)=2;  ma.Elem(0,2)=3;
  102.   ma.Elem(1,0)=0;  ma.Elem(1,1)=1;  ma.Elem(1,2)=2;
  103.   ma.Elem(2,0)=1;  ma.Elem(2,1)=1;  ma.Elem(2,2)=3;
  104.   ma.Elem(3,0)=1;  ma.Elem(3,1)=2;  ma.Elem(3,2)=1;
  105.   Vector ve(3);
  106.   ve.Elem(0)=2;  ve.Elem(1)=1;  ve.Elem(2)=0;
  107.   Vector va =Multiply(ma,ve);
  108.   va.Display();
  109. }