一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1390|回复: 8
收起左侧

【一】公开课全纪之程序设计实习@PKU

[复制链接] |试试Instant~ |关注本帖
数字媒体技术 发表于 2014-3-11 17:22:52 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
本帖最后由 数字媒体技术 于 2014-4-24 21:10 编辑

2014/2[Coursera]程序设计实习 / Practice on Programming  - 2014-02-24@北大

1.C++之父在TAMU
2.利用类进行矩形面积和周长的计算

  1. #include<iostream>
  2. using namespace std;

  3. class CRectangle
  4. {
  5. public:
  6.         int w, h;
  7.         void Init(int w_, int h_){
  8.                 w = w_; h = h_;
  9.         }
  10.         int Area(){
  11.                 return w*h;

  12.         }
  13.         int Perimeter(){
  14.                 return (w + h) * 2;
  15.         }


  16. };

  17. int main()

  18. {
  19.         int w, h;
  20.         CRectangle r;
  21.         cin >> w >> h;
  22.         r.Init(w, h);
  23.         cout << r.Area() << endl << r.Perimeter() << endl;
  24.         return 0;

  25. }
复制代码

引用只能引用变量,不能引用常量和表达式。

QQ截图20140412204433.png
 楼主| 数字媒体技术 发表于 2014-3-13 17:34:27 | 显示全部楼层
本帖最后由 数字媒体技术 于 2014-4-18 20:48 编辑

第二周:
  1. class A {
  2. int v;
  3. public:
  4. void Func();
  5. };
  6. A::void Func() { }
复制代码
最后一行:void A:: Func(){}
  1. #include<iostream>
  2. #include<string.h>
  3. using namespace std;
  4. class Stu{
  5. private:
  6.         int age,ave, g1, g2, g3, g4;
  7.         char numb[20], name[20],a;//a用来吸收“,”
  8. public:
  9.         void input(){
  10.                 cin.getline(name, 20, ',');
  11.                 cin >> age >> a;
  12.                 cin.getline(numb, 20, ',')//name[20]的数组,遇到“,”停止
  13.                 cin >> g1 >> a >> g2 >> a >> g3 >> a >> g4;
  14. }

  15.         void ave_(){
  16.         
  17.                 ave = (g1 + g2 + g3 + g4) / 4;
  18.         
  19.         
  20.         }


  21.         void output(){
  22.                 cout << name << a << age << a << numb << a << ave<< endl;
  23.         
  24.         
  25.         }




  26. };


  27. int main()
  28. {
  29.         Stu E;
  30.         E.input();
  31.         E.ave_();
  32.         E.output();
  33.         return 0;


  34. }
复制代码

for week2 discussion
if your objects were declared by new, you have to collection the memory space manually by calling delete;
if you declared objects without new, you don't need to delete it, because c++ will recycle the memeory space automatically when the lifecycle of the objects is over

  1. nt main(){
  2. class A { int v; };
  3. A a; a.v = 3; return 0;
  4. }
  5. 哪里错了?
复制代码

因为类的成员属性缺省为私有,不能在类以外的地方被直接访问
回复 支持 反对

使用道具 举报

 楼主| 数字媒体技术 发表于 2014-4-15 20:18:24 | 显示全部楼层
本帖最后由 数字媒体技术 于 2014-4-20 21:18 编辑

第三周 类和对象进阶class Demo
{   int id;
public:   
Demo( int i )   
  {    id = i;
   cout << “id=” << id << “ Constructed” << endl;   }
   ~Demo()   
{     cout << “id=” << id << “ Destructed” << endl;   } };

Demo d1(1);
void Func()
{  static Demo d2(2); //static 等main()结束才调用析构
Demo d3(3);
  cout << “Func” << endl; }
int main ()
{  Demo d4(4);  
d4 = 6;
   cout << “main” << endl;
  {    Demo d5(5);  }  
Func();
  cout << “main ends” << endl;
return 0; }


输出:
id=1 Constructed
id=4 Constructed
id=6 Constructed
id=6 Destructed
main
id=5
Constructed
id=5
Destructed
id=2
Constructed
id=3
Constructed
Func
id=3
Destructed
main ends
id=6 Destructed
id=2 Destructed
id=1 Destructed



回复 支持 反对

使用道具 举报

 楼主| 数字媒体技术 发表于 2014-4-15 20:18:34 | 显示全部楼层
第四周:
回复 支持 反对

使用道具 举报

 楼主| 数字媒体技术 发表于 2014-4-15 20:18:42 | 显示全部楼层
第五周:
回复 支持 反对

使用道具 举报

 楼主| 数字媒体技术 发表于 2014-4-15 20:18:51 | 显示全部楼层
本帖最后由 数字媒体技术 于 2014-4-15 20:21 编辑

第六周 多态和虚函数
  1. 下面程序的输出结果是:
  2. A::Fun
  3. C::Do
  4. 请填空
  5. #include <iostream >
  6. using namespace std;
  7. class A {
  8. private:
  9. int nVal;
  10. public:
  11. void Fun()
  12. { cout << "A::Fun" << endl; };
  13. void Do()
  14. {  cout << "A::Do" << endl; }
  15. };
  16. class B:public A {
  17. public:
  18. virtual void Do()
  19. { cout << "B::Do" << endl;}
  20. };
  21. class C:public B {
  22. public:
  23. void Do( )
  24. {  cout <<”C::Do”<<endl;  }
  25. void Fun()
  26. {  cout << "C::Fun" << endl; }
  27. };
  28. void Call( ___________ )  {
  29. p.Fun();  p.Do();
  30. }
  31. int main()  {
  32. C c;        Call( c);
  33. return 0;
  34. }
复制代码
p.Fun();  p.Do();
}
Call(c);
1. p.Fun(),   基类B中没有Fun,往上找,执行A.Fun()
2. p.Do(),   在基类B中DO是虚函数,那么就要看指向的是基类还是派生类,Call(c),c是派生类,所以调用C中的Do.

要去理解virtual的含义——会根据对象运行时类型来决定用哪个函数

回复 支持 反对

使用道具 举报

 楼主| 数字媒体技术 发表于 2014-4-17 21:13:08 | 显示全部楼层
本帖最后由 数字媒体技术 于 2014-4-17 21:48 编辑

第七周 模板类和模板函数 QQ__20140416214110.png
求问一下第二个选项错在哪?
类模板A有两个类型参数,第二个选项的构造函数中只写了一个,要么都写上,要么都不写,两种都可以编译通过
1)
A<T1, T2>(){}
2)
A(){}
  1. 下面的程序输出是:

  2. TomHanks

  3. 请填空。注意,不允许使用任何常量。

  4. #include <iostream>

  5. #include <string>

  6. using namespace std;

  7. template <class T>

  8. class myclass {

  9.        _________;

  10.        int nSize;

  11. public:

  12.        myclass ( ______________, int n)  {

  13.               p = new T[n];

  14.               for( int i = 0;i < n;++i )

  15.                      p[i] = a[i];

  16.               nSize = n;

  17.        }

  18.        ~myclass( ) {

  19.               delete [] p;

  20.        }

  21.        void Show()

  22.        {

  23.               for( int i = 0;i < nSize;++i ) {

  24.                      cout << p[i];

  25.               }

  26.        }

  27. };

  28. int main() {

  29.        char * szName = "TomHanks";

  30.        myclass<char >obj(________________);

  31.        obj.Show();  return 0;

  32. }
复制代码

答案:T *p
T *a
SzName,strlen(SzName)


  1. 实现一个三维数组模版CArray3D,可以用来生成元素为任意类型变量的三维数组,使得下面程序输出结果是:



  2. 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,

  3. 30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56

  4. ,57,58,59,



  5. 注意,只能写一个类模版,不能写多个

  6. int main()

  7. {

  8.                CArray3D<int> a(3,4,5);

  9.                int No = 0;

  10.                for( int i = 0; i < 3; ++ i )

  11.                                for( int j = 0; j < 4; ++j )

  12.                                               for( int k = 0; k < 5; ++k )

  13.                                                              a[i][j][k] = No ++;

  14.                for( int i = 0; i < 3; ++ i )

  15.                                for( int j = 0; j < 4; ++j )

  16.                                               for( int k = 0; k < 5; ++k )

  17.                                                              cout << a[i][j][k] << ",";

  18.                return 0;

  19. }

  20. 提示:类里面可以定义类,类模版里面也可以定理类模版。例如:

  21. class A

  22. {

  23.                class B {                     

  24.                };            

  25. };

  26. template <class T>

  27. class S

  28. {

  29.                T x;

  30.                class K {

  31.                                T a;

  32.                };

  33. };
复制代码
答案:
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. template <class T>   
  5. class CArray3D {  
  6.     template <class T>   
  7.     class CArray2D {  
  8.         template <class T>   
  9.         class CArray1D {  
  10.         public:  
  11.             CArray1D():p(NULL){}  
  12.             void set(T a)  
  13.             {  
  14.                 p = new T[a];  
  15.                 _a = a;  
  16.             }  
  17.             inline T& operator[]( long elem ) const   
  18.             {   
  19.                 //  assert( elem >= 0 && elem < _a );   
  20.                 return p[elem];   
  21.             }   
  22.   
  23.             ~CArray1D()  
  24.             {  
  25.                 delete[] p;  
  26.             };  
  27.   
  28.         private:  
  29.             T* p;  
  30.             T _a;  
  31.         };  
  32.         public:  
  33.             CArray2D():p(NULL){}  
  34.             void set(T a, T b){  
  35.                 p = new CArray1D<T>[a];  
  36.                 for(int i=0; i<a; i++){  
  37.                     p[i].set(b);  
  38.                 }  
  39.                 _b = b;  
  40.             }  
  41.   
  42.             inline CArray1D<T>& operator[]( long elem ) const   
  43.             {   
  44.                 //  assert( elem >= 0 && elem < _b );   
  45.                 return p[elem];   
  46.             }   
  47.   
  48.             ~CArray2D()  
  49.             {  
  50.                 delete[] p;  
  51.             }  
  52.   
  53.         private:  
  54.             CArray1D<T>* p;  
  55.             T _b;  
  56.     };  
  57.   
  58. public:  
  59.     CArray3D(T a, T b, T c){  
  60.         p = new CArray2D<T>[a];   
  61.         for(int i=0; i<a; i++){  
  62.             p[i].set(b, c);  
  63.         }  
  64.         _c = c;  
  65.     }  
  66.   
  67.     inline CArray2D<T>& operator[]( long elem ) const   
  68.     {   
  69.         //  assert( elem >= 0 && elem < _c );   
  70.         return p[elem];   
  71.     }   
  72.   
  73.     ~CArray3D()  
  74.     {  
  75.         delete[] p;  
  76.     }  
  77.   
  78. private:  
  79.     CArray2D<T>* p;  
  80.     T _c;  
  81. };  
  82.   
  83.   
  84. int main()  
  85.   
  86. {  
  87.   
  88.     CArray3D<int> a(3,4,5);  
  89.   
  90.     int No = 0;  
  91.   
  92.     for( int i = 0; i < 3; ++ i )  
  93.   
  94.         for( int j = 0; j < 4; ++j )  
  95.   
  96.             for( int k = 0; k < 5; ++k )  
  97.   
  98.                 a[i][j][k] = No ++;  
  99.   
  100.     for( int i = 0; i < 3; ++ i )  
  101.   
  102.         for( int j = 0; j < 4; ++j )  
  103.   
  104.             for( int k = 0; k < 5; ++k )  
  105.   
  106.                 cout << a[i][j][k] << ",";  
  107.   
  108.     return 0;  
  109.   
  110. }
复制代码







回复 支持 反对

使用道具 举报

 楼主| 数字媒体技术 发表于 2014-4-24 21:08:54 | 显示全部楼层
本帖最后由 数字媒体技术 于 2014-4-24 21:42 编辑

第八周 STL
  1. 写出输出结果:
  2. #include <vector>

  3. #include <iostream>

  4. using namespace std;

  5. class A {

  6.     private :

  7.          int nId;

  8.     public:

  9.     A(int n) {   nId = n;

  10.     cout << nId << " constructor" << endl;  }

  11.     ~A( )

  12.      {cout << nId << " destructor" << endl; }

  13. };

  14. int main()  {

  15.     vector<A*> vp;

  16.     vp.push_back(new A(1));

  17.     vp.push_back(new A(2));

  18.     vp.clear(); A a(4);

  19.     return 0;

  20. }
复制代码
答案:
1constructor
2constructor
4constructor
4destructor


//Vector中clear函数作用是清掉vector中的所有元素。


  1. 输出结果:
  2. Tom,Jack,Mary,John,

  3. 程序:
  4. #include <vector>
  5. #include <iostream>
  6. #include <string>
  7. using namespace std;
  8. template <class T>
  9. class MyClass
  10. {
  11.         vector<T>  array;
  12.         public:
  13.                 MyClass _(T*begin,int n):array(n)____________________
  14.                 {
  15.                         copy( begin, begin + n, array.begin());
  16.                 }
  17.                 void List() {
  18.                         ___vector<T>;;iterator i___________________;
  19.                         for( i = array.begin(); i != array.end();i ++)
  20.                                 cout << * i << "," ;
  21.                 }
  22. };
  23. main()
  24. {
  25.         string array[4] = { "Tom","Jack","Mary","John"};
  26.   __Myclass<string>obj(array,4)_______________________;
  27.         obj.List();
  28. }

复制代码
答案:
/*
( T * begin,int n ):array(n)
vector<T>::iterator i
MyClass<string> obj(array,4)

*/

  1. 输出结果:
  2. A::Print: 1
  3. B::Print: 2
  4. B::Print: 3

  5. 程序:
  6. template <class T>
  7. void PrintAll( const T & c )
  8. {
  9.         T::const_iterator i;
  10.         for( i = c.begin(); i != c.end(); i ++ )
  11.   __(*i)->print()_____________;
  12. };
  13. class A {
  14.         protected:
  15.         int nVal;
  16.         public:
  17.                 A(int i):nVal(i) { }
  18.                 virtual void Print() { cout << "A::Print: " << nVal << endl; }
  19. };

  20. class B:public A {
  21.         public:
  22.                 B(int i):A(i) { }
  23.                 void Print() { cout << "B::Print: " << nVal << endl; }
  24. };
  25. main()
  26. {
  27.         ____vector<A*> v______________;
  28.         v.push_back( new A(1));
  29.         v.push_back (new B(2));
  30.         v.push_back (new B(3));
  31.         PrintAll( v);

  32. }

复制代码
答案:
/*

( * i ) ->Print()
vector<A *> v
*/
回复 支持 反对

使用道具 举报

 楼主| 数字媒体技术 发表于 2014-5-8 21:47:33 | 显示全部楼层
本帖最后由 数字媒体技术 于 2014-5-8 21:52 编辑

第十周 C++11

1.?:任意字符1次或0次  *:任意字符0次或者相同字符多次 X+:X出现1次或者多次 \\s:空格 \\1:与第一项出现的内容一样
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-3 12:49

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表