[关闭]
@Pinetrie 2019-06-21T00:23:54.000000Z 字数 6702 阅读 905

实验五

1、 录入下面程序,并分析结果:

  1. #include <iostream>
  2. #include <complex>
  3. using namespace std;
  4. class Base
  5. {
  6. public:
  7. Base() {cout<<"Base-ctor"<<endl;}
  8. ~Base() {cout<<"Base-dtor"<<endl;}
  9. virtual void f(int){cout<<"Base::f(int)"<<endl;}
  10. virtual void f(double){cout<<"Base::f(double)"<<endl;}
  11. virtual void g(int i=10){cout<<"Base::g()"<<i<<endl;}
  12. };
  13. class Derived : public Base
  14. {
  15. public:
  16. Derived() {cout<<"Derived-ctor" <<endl;}
  17. ~Derived(){cout<<"Derived-dtor"<<endl;}
  18. void f(complex<double>) {
  19. cout<<"Derived::f(complex)"<<endl;
  20. }
  21. void g(int i=20){
  22. cout<<"Derived::g()"<<i<<endl;
  23. }
  24. };
  25. int main()
  26. {
  27. cout<<sizeof(Base)<<endl;
  28. cout<<sizeof(Derived)<<endl;
  29. Base b;
  30. Derived d;
  31. Base *pb=new Derived;
  32. b.f(1.0);
  33. d.f(1.0);
  34. pb->f(1.0);
  35. b.g();
  36. d.g();
  37. pb->g();
  38. delete pb;
  39. return 0;
  40. }

2、 录入下面程序,并分析结果:

  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. public:
  6. Base():data(count)
  7. {
  8. cout<<"Base-ctor"<<endl;
  9. ++count;
  10. }
  11. ~Base()
  12. {
  13. cout<<"Base-dtor"<<endl;
  14. --count;
  15. }
  16. static int count;
  17. int data;
  18. };
  19. int Base::count;
  20. class Derived : public Base
  21. {
  22. public:
  23. Derived():data(count),data1(data)
  24. {
  25. cout<<"Derived-ctor"<<endl;
  26. ++count;
  27. }
  28. ~Derived()
  29. {
  30. cout<<"Derived-dtor"<<endl;
  31. --count;
  32. }
  33. static int count;
  34. int data1;
  35. int data;
  36. };
  37. int Derived::count=10;
  38. int main()
  39. {
  40. cout<<sizeof(Base)<<endl;
  41. cout<<sizeof(Derived)<<endl;
  42. Base* pb = new Derived[3];
  43. cout<<pb[2].data<<endl;
  44. cout<<((static_cast<Derived*>(pb))+2)->data1<<endl;
  45. delete[] pb;
  46. cout<<Base::count<<endl;
  47. cout<<Derived::count<<endl;
  48. return 0;
  49. }

3、 录入下面程序,修改错误。

  1. #include <iostream>
  2. #include <new>
  3. #include <assert.h>
  4. using namespace std;
  5. class Abstract
  6. {
  7. public:
  8. Abstract() {cout << "in Abstract()"<<endl;}
  9. virtual void f() = 0;
  10. };
  11. class Subclass : public Abstract
  12. {
  13. public:
  14. Subclass() {cout << "in Subclass()"<<endl;}
  15. void f() {cout << "Subclass::f()"<<endl;}
  16. };
  17. int main()
  18. {
  19. Abstract *p = new Subclass;
  20. p->f();
  21. return 0;

4、 定义基类shape类为一个表示形状的抽象类

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. const double PI = 3.14;
  5. class shape
  6. {
  7. public:
  8. virtual double area() = 0;
  9. };
  10. class triangle:public shape
  11. {
  12. public:
  13. triangle(double a,double b,double c):a(a),b(b),c(c) {}
  14. double area()
  15. {
  16. double p = (a + b + c) / 2;
  17. return sqrt(p * (p - a) * (p - b) * (p - c));
  18. }
  19. private:
  20. double a,b,c;
  21. };
  22. class circles:public shape
  23. {
  24. public:
  25. circles(double r):r(r) {}
  26. double area()
  27. {
  28. return r * r * PI;
  29. }
  30. private:
  31. double r;
  32. };
  33. int main()
  34. {
  35. shape *p;
  36. triangle t(3,4,5);
  37. circles c(10);
  38. p=&t;
  39. cout<<"triangle area:"<<p->area()<<endl;
  40. p=&c;
  41. cout<<"circles area:"<<p->area()<<endl;
  42. return 0;
  43. }

5、 定义一个抽象类Base和派生类Derived

  1. #include <iostream>
  2. using namespace std;
  3. class Base
  4. {
  5. public:
  6. virtual void abstractMethod() = 0;
  7. };
  8. class Derived:public Base
  9. {
  10. public:
  11. void abstractMethod()
  12. {
  13. cout<<"Derived::abstractMethod is called"<<endl;
  14. }
  15. };
  16. int main()
  17. {
  18. Base* pBase = new Derived;
  19. pBase->abstractMethod();
  20. delete pBase;
  21. return 0;
  22. }

第六次作业

1、 教材习题6_20:实现一个简单圆类

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. const double Pi = 3.14;
  5. class SimpleCircle
  6. {
  7. public:
  8. void init(double r) {p = &r;}
  9. void showarea() {cout<<(*p) * (*p) * Pi;}
  10. void showr() {cout<<*p;}
  11. private:
  12. double *p = NULL;
  13. };
  14. int main()
  15. {
  16. SimpleCircle A;
  17. A.init(10);
  18. cout<<"Area:";
  19. A.showarea();
  20. //A.showr();//
  21. return 0;
  22. }

2、教材习题7_5:Shape类派生Rectangle和Circle类

  1. #include <iostream>
  2. using namespace std;
  3. class Shape
  4. {
  5. public:
  6. Shape(double a,double b):a(a),b(b) {}
  7. Shape(double a):a(a) {}
  8. double geta() {return a;}
  9. double getb() {return b;}
  10. private:
  11. double a,b;
  12. };
  13. class Rectangle:public Shape
  14. {
  15. public:
  16. Rectangle(double a,double b):Shape(a,b) {}
  17. double getArea()
  18. {
  19. return geta() * getb();
  20. }
  21. };
  22. class Circle:public Shape
  23. {
  24. public:
  25. Circle(double a):Shape(a) {}
  26. double getArea()
  27. {
  28. return geta() * geta() * 3.14;
  29. }
  30. };
  31. int main()
  32. {
  33. double a,b,r;
  34. cout<<"Input a,b:";
  35. cin>>a>>b;
  36. cout<<"Input r:";
  37. cin>>r;
  38. Rectangle X(a,b);
  39. Circle Y(r);
  40. cout<<"Rectangle Area:"<<X.getArea()<<",Circle Area:"<<Y.getArea()<<endl;
  41. return 0;
  42. }

3、 教材习题7_6:哺乳动物类Mammal派生出狗类Dog

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Mammal
  5. {
  6. public:
  7. Mammal(string name):name(name) {cout<<"Con.Mammal"<<endl;}
  8. ~ Mammal() {cout<<"Des.Mammal"<<endl;}
  9. string getname() {return name;}
  10. private:
  11. string name;
  12. };
  13. class Dog:public Mammal
  14. {
  15. public:
  16. Dog(string name):Mammal(name) {cout<<"Con.dog:"<<getname()<<endl;}
  17. ~ Dog() {cout<<"Des.dog:"<<getname()<<endl;}
  18. };
  19. int main()
  20. {
  21. cout<<"Input Dog Name:";
  22. string name;
  23. cin>>name;
  24. Dog A(name);
  25. return 0;
  26. }

第11次作业

1、教材习题9_1:利用数组类模板Array解决学生成绩问题

  1. #include <cassert>
  2. #include <iostream>
  3. using namespace std;
  4. //数组类模板定义
  5. template <class T>
  6. class Array {
  7. private:
  8. T* list; //T类型指针,用于存放动态分配的数组内存首地址
  9. int size; //数组大小(元素个数)
  10. public:
  11. Array(int sz = 50); //构造函数
  12. Array(const Array<T> &a); //复制构造函数
  13. ~Array(); //析构函数
  14. Array<T> & operator = (const Array<T> &rhs); //重载"="使数组对象可以整体赋值
  15. T & operator [] (int i); //重载"[]",使Array对象可以起到C++普通数组的作用
  16. const T & operator [] (int i) const; //"[]"运算符的const版本
  17. operator T * (); //重载到T*类型的转换,使Array对象可以起到C++普通数组的作用
  18. operator const T * () const; //到T*类型转换操作符的const版本
  19. int getSize() const; //取数组的大小
  20. void resize(int sz); //修改数组的大小
  21. };
  22. //构造函数
  23. template <class T>
  24. Array<T>::Array(int sz) {
  25. assert(sz >= 0); //sz为数组大小(元素个数),应当非负
  26. size = sz; // 将元素个数赋值给变量size
  27. list = new T [size]; //动态分配size个T类型的元素空间
  28. }
  29. //析构函数
  30. template <class T>
  31. Array<T>::~Array() {
  32. delete [] list;
  33. }
  34. //拷贝构造函数
  35. template <class T>
  36. Array<T>::Array(const Array<T> &a) {
  37. //从对象x取得数组大小,并赋值给当前对象的成员
  38. size = a.size;
  39. //为对象申请内存并进行出错检查
  40. list = new T[size]; // 动态分配n个T类型的元素空间
  41. //从对象X复制数组元素到本对象
  42. for (int i = 0; i < size; i++)
  43. list[i] = a.list[i];
  44. }
  45. //重载"="运算符,将对象rhs赋值给本对象。实现对象之间的整体赋值
  46. template <class T>
  47. Array<T> &Array<T>::operator = (const Array<T>& rhs) {
  48. if (&rhs != this) {
  49. //如果本对象中数组大小与rhs不同,则删除数组原有内存,然后重新分配
  50. if (size != rhs.size) {
  51. delete [] list; //删除数组原有内存
  52. size = rhs.size; //设置本对象的数组大小
  53. list = new T[size]; //重新分配n个元素的内存
  54. }
  55. //从对象X复制数组元素到本对象
  56. for (int i = 0; i < size; i++)
  57. list[i] = rhs.list[i];
  58. }
  59. return *this; //返回当前对象的引用
  60. }
  61. //重载下标运算符,实现与普通数组一样通过下标访问元素,并且具有越界检查功能
  62. template <class T>
  63. T &Array<T>::operator[] (int n) {
  64. assert(n >= 0 && n < size); //检查下标是否越界
  65. return list[n]; //返回下标为n的数组元素
  66. }
  67. template <class T>
  68. const T &Array<T>::operator[] (int n) const {
  69. assert(n >= 0 && n < size); //检查下标是否越界
  70. return list[n]; //返回下标为n的数组元素
  71. }
  72. //重载指针转换运算符,将Array类的对象名转换为T类型的指针,
  73. //指向当前对象中的私有数组。
  74. //因而可以象使用普通数组首地址一样使用Array类的对象名
  75. template <class T>
  76. Array<T>::operator T * () {
  77. return list; //返回当前对象中私有数组的首地址
  78. }
  79. template <class T>
  80. Array<T>::operator const T * () const {
  81. return list; //返回当前对象中私有数组的首地址
  82. }
  83. //取当前数组的大小
  84. template <class T>
  85. int Array<T>::getSize() const {
  86. return size;
  87. }
  88. // 将数组大小修改为sz
  89. template <class T>
  90. void Array<T>::resize(int sz) {
  91. assert(sz >= 0); //检查sz是否非负
  92. if (sz == size) //如果指定的大小与原有大小一样,什么也不做
  93. return;
  94. T* newList = new T [sz]; //申请新的数组内存
  95. int n = (sz < size) ? sz : size; //将sz与size中较小的一个赋值给n
  96. //将原有数组中前n个元素复制到新数组中
  97. for (int i = 0; i < n; i++)
  98. newList[i] = list[i];
  99. delete[] list; //删除原数组
  100. list = newList; // 使list指向新数组
  101. size = sz; //更新size
  102. }
  103. int main()
  104. {
  105. int n;
  106. cout<<"Input n:";
  107. cin>>n;
  108. Array<double> a(n);
  109. cout<<"Input scores:";
  110. for(int i = 0;i < n;i++) cin>>a[i];
  111. double sum = 0;
  112. for(int i = 0;i < n;i++) sum += a[i];
  113. cout<<"Average:"<<sum / n<<endl;
  114. return 0;
  115. }

2、教材习题9_10:利用插入排序函数模板进行排序

  1. #include <iostream>
  2. using namespace std;
  3. //用直接插入排序法对数组A中的元素进行升序排列
  4. template <class T>
  5. void insertionSort(T a[], int n) {
  6. int i, j;
  7. T temp;
  8. //将下标为1~n-1的元素逐个插入到已排序序列中适当的位置
  9. for (int i = 1; i < n; i++) {
  10. //从a[i - 1]开始向a[0]方向扫描各元素,寻找适当位置插入a[i]
  11. int j = i;
  12. T temp = a[i];
  13. while (j > 0 && temp < a[j - 1]) {
  14. //逐个比较,直到temp >= a[j - 1]时,j便是应插入的位置。
  15. //若达到j == 0,则0是应插入的位置。
  16. a[j] = a[j - 1]; //将元素逐个后移,以便找到插入位置时可立即插入。
  17. j--;
  18. }
  19. //插入位置已找到,立即插入。
  20. a[j] = temp;
  21. for(int k=0;k<n;k++)
  22. {
  23. cout<<a[k]<<" ";
  24. }
  25. cout<<endl;
  26. }
  27. }
  28. int main()
  29. {
  30. int data[]={1,3,5,7,9,11,13,15,17,19,2,4,6,8,10,12,14,16,18,20};
  31. insertionSort(data,20);
  32. return 0;
  33. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注