程序设计与算法(三)第04周测验

最近在复习C++,觉得北大的这个课程非常好,打算做些练习并记录。
下面直接放代码,如有问题,请指正。
001:MyString

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class MyString {
    char * p;
public:
    MyString(const char * s) {
        if( s) {
            p = new char[strlen(s) + 1];
            strcpy(p,s);
        }
        else
            p = NULL;

    }
    ~MyString() { if(p) delete [] p; }
    //补充代码
    MyString & operator =(const MyString & m)
    {
        if(p)
            delete [] p;
        if(m.p)
        {
                p=new char[strlen(m.p)+1];
                strcpy(p,m.p);
        }
        else
            p=NULL;
    }
    void Copy(const char *s)
    {
        if(p)
            delete [] p;
        if(s)
        {
            p=new char[strlen(s)+1];
            strcpy(p,s);
        }
        else
            p=NULL;
    }
    friend ostream & operator <<(ostream & o,const MyString & m )
    {
        if(m.p)
            cout<<m.p;
        return o;
    }
    MyString & operator =(const char * s)
    {
        if(p)
            delete [] p;
        if(s)
        {
            p=new char[strlen(s)+1];
            strcpy(p,s);
        }
        else
            p=NULL;
    }
    MyString(const MyString& s) {
		if (s.p) {
			p = new char[strlen(s.p) + 1];
			strcpy(p, s.p);
		}
		else
			p = NULL;
	}

};
int main()
{
    char w1[200],w2[100];
    while( cin >> w1 >> w2) {
        MyString s1(w1),s2 = s1;//第一个调用构造函数,第二个要重载”=“,参数是MyString&;同时调用了**复制构造函数**
        MyString s3(NULL);//调用构造函数
        s3.Copy(w1);//Copy函数
        cout << s1 << "," << s2 << "," << s3 << endl;//需要重载<<;

        s2 = w2;//需要重载=,参数为char*
        s3 = s2;
        s1 = s3;
        cout << s1 << "," << s2 << "," << s3 << endl;

    }
}

一开始写的代码出现了runtime error
看了别人的代码发现,没注意到复制构造函数的调用

002:看上去好坑的运算符重载

#include <iostream>
using namespace std;
class MyInt
{
    int nVal;
    public:
    MyInt( int n) { nVal = n ;}
    //补充代码
    MyInt & operator -(const int n)//连减需要返回值是类本身而不是临时类
    {
        nVal-=n;
        return *this;
    }
    operator int()
    {
        return nVal;
    }
};
int Inc(int n) {
    return n + 1;
}
int main () {
    int n;
    while(cin >>n) {
        MyInt objInt(n);
        objInt-2-1-3;//需要重载-
        cout << Inc(objInt);//需要重载类型转换运算符int
        cout <<",";
        objInt-2-1;
        cout << Inc(objInt) << endl;
    }
    return 0;
}

003:惊呆!Point竟然能这样输入输出

#include <iostream>
using namespace std;
class Point {
    private:
        int x;
        int y;
    public:
        Point() { };
    // 补充代码,这道题和课件里讲的差不多,就只是流输入输出运算符重载
    friend istream & operator >>(istream & i,Point & p)
    {
        int a,b;
        i>>a>>b;
        p.x=a;
        p.y=b;
        return i;
    }
    friend ostream & operator <<(ostream & o,const Point & p)
    {
        o<<p.x<<","<<p.y;//因为这里多了个endl结果Presentation Error了,oj真的严格
        return o;
    }

};
int main()
{
    Point p;
    while(cin >> p) {//需要重载>>
        cout << p << endl;//需要重载<<
        }
    return 0;
}

004:第四周程序填空题3
这一题我用了很久,主要是太长时间不用以前的知识都忘光了。
一开始想着建二维数组,但是很麻烦,才反应过来一维数组就可以了。这样大部分函数都和视频里面讲的差不多,模仿写就可以了。
但是关于[]到底如何重载的问题我想了很久,一直陷入了重载函数需要使用两次的思维怪圈。最后还是去参考了其他人的代码,才恍然大悟,果然大一学的C语言指针数组之类的都就饭吃了(-_-||)。下面是代码:

#include <iostream>
#include <cstring>
using namespace std;

class Array2 {
// 在此处补充你的代码
public:
    int size_m;
    int size_n;
    int *ptr;
Array2(int i=0,int j=0):size_m(i),size_n(j)
{
    if(size_m==0||size_n==0)
        ptr=NULL;
    else
        ptr=new int[size_m*size_n];
}
~Array2()
{
    if(ptr)
        delete [] ptr;
}
Array2(Array2 & a)
{
    if(!a.ptr)
    {
        size_m=size_n=0;
        ptr=NULL;
    }
    else
    {
        ptr=new int[a.size_m*a.size_n];
        memcpy(ptr,a.ptr,sizeof(int)*a.size_m*a.size_n);
        size_m=a.size_m;
        size_n=a.size_n;
    }
}
int * operator [](int i)
{
   return (ptr+i*size_n);
}
Array2 & operator =(const Array2 &a)
{
    if(a.ptr==ptr)
    {
        return *this;
    }
    if(!a.ptr)
    {
        if(ptr)
            delete [] ptr;
        size_m=size_n=0;
        ptr=NULL;
        return *this;
    }
    else
    {
        delete [] ptr;
        ptr=new int[a.size_m*a.size_n];
        memcpy(ptr,a.ptr,sizeof(int)*a.size_m*a.size_n);
        size_m=a.size_m;
        size_n=a.size_n;
        return *this;
    }
}
int  operator ()(int i,int j)
{
    return ptr[i*size_n+j];
}
};

int main() {
    Array2 a(3,4);//需要构造函数
    int i,j;
    for(  i = 0;i < 3; ++i )
        for(  j = 0; j < 4; j ++ )
            a[i][j] = i * 4 + j;//重载[]
    for(  i = 0;i < 3; ++i ) {
        for(  j = 0; j < 4; j ++ ) {
            cout << a(i,j) << ",";//重载()
        }
        cout << endl;
    }
    cout << "next" << endl;
    Array2 b;     b = a;//复制构造函数和需要=重载
    for(  i = 0;i < 3; ++i ) {
        for(  j = 0; j < 4; j ++ ) {
            cout << b[i][j] << ",";
        }
        cout << endl;
    }
    return 0;
}
发布了6 篇原创文章 · 获赞 0 · 访问量 334

猜你喜欢

转载自blog.csdn.net/vegetablee/article/details/104861274
今日推荐