• 18.03.21 继承作业


    A:全面的MyString

    描述

    程序填空,输出指定结果

    #include <cstdlib>
    #include <iostream>
    using namespace std;
    int strlen(const char * s) 
    {    int i = 0;
        for(; s[i]; ++i);
        return i;
    }
    void strcpy(char * d,const char * s)
    {
        int i = 0;
        for( i = 0; s[i]; ++i)
            d[i] = s[i];
        d[i] = 0;
            
    }
    int strcmp(const char * s1,const char * s2)
    {
        for(int i = 0; s1[i] && s2[i] ; ++i) {
            if( s1[i] < s2[i] )
                return -1;
            else if( s1[i] > s2[i])
                return 1;
        }
        return 0;
    }
    void strcat(char * d,const char * s)
    {
        int len = strlen(d);
        strcpy(d+len,s);
    }
    class MyString
    {
    // 在此处补充你的代码
    };
    
    
    int CompareString( const void * e1, const void * e2)
    {
        MyString * s1 = (MyString * ) e1;
        MyString * s2 = (MyString * ) e2;
        if( * s1 < *s2 )
        return -1;
        else if( *s1 == *s2)
        return 0;
        else if( *s1 > *s2 )
        return 1;
    }
    int main()
    {
        MyString s1("abcd-"),s2,s3("efgh-"),s4(s1);
        MyString SArray[4] = {"big","me","about","take"};
        cout << "1. " << s1 << s2 << s3<< s4<< endl;
        s4 = s3;
        s3 = s1 + s3;
        cout << "2. " << s1 << endl;
        cout << "3. " << s2 << endl;
        cout << "4. " << s3 << endl;
        cout << "5. " << s4 << endl;
        cout << "6. " << s1[2] << endl;
        s2 = s1;
        s1 = "ijkl-";
        s1[2] = 'A' ;
        cout << "7. " << s2 << endl;
        cout << "8. " << s1 << endl;
        s1 += "mnop";
        cout << "9. " << s1 << endl;
        s4 = "qrst-" + s2;
        cout << "10. " << s4 << endl;
        s1 = s2 + s4 + " uvw " + "xyz";
        cout << "11. " << s1 << endl;
        qsort(SArray,4,sizeof(MyString),CompareString);
        for( int i = 0;i < 4;i ++ )
        cout << SArray[i] << endl;
        //s1的从下标0开始长度为4的子串
        cout << s1(0,4) << endl;
        //s1的从下标5开始长度为10的子串
        cout << s1(5,10) << endl;
        return 0;
    }

    输入

    输出

    1. abcd-efgh-abcd-
    2. abcd-
    3. 
    4. abcd-efgh-
    5. efgh-
    6. c
    7. abcd-
    8. ijAl-
    9. ijAl-mnop
    10. qrst-abcd-
    11. abcd-qrst-abcd- uvw xyz
    about
    big
    me
    take
    abcd
    qrst-abcd-样例输入

    样例输出

    1. abcd-efgh-abcd-
    2. abcd-
    3. 
    4. abcd-efgh-
    5. efgh-
    6. c
    7. abcd-
    8. ijAl-
    9. ijAl-mnop
    10. qrst-abcd-
    11. abcd-qrst-abcd- uvw xyz
    about
    big
    me
    take
    abcd
    qrst-abcd-
    

    来源Guo Wei

     1     char *p;
     2 public:
     3     //构造函数
     4     MyString(const char *a){
     5         //if(p)delete[]p;
     6         p=new char[strlen(a)+1];
     7         strcpy(p,a);
     8     }
     9     MyString(){
    10         p=new char[1];
    11         p[0]='';
    12     }
    13     //copy
    14     MyString(const MyString&s){
    15         p=new char[strlen(s.p)+1];
    16         strcpy(p,s.p);
    17     }
    18     //destruct
    19     ~MyString(){if(p)delete[]p;}
    20     //cout
    21     friend ostream&operator<<(ostream&os,MyString &a){
    22         os<<a.p;
    23         return os;
    24     }
    25     //class+class
    26     friend MyString operator+(const MyString &a,const MyString &b){
    27         char *res=new char[strlen(b.p)+strlen(a.p)+1];
    28         strcpy(res,a.p);
    29         strcat(res,b.p);
    30         return MyString(res);
    31     }
    32     //[]
    33     char&operator[](int x){
    34         return p[x];
    35     }
    36     //class=class
    37     MyString& operator=(const MyString&a){
    38         if(p)delete[]p;
    39         p=new char[strlen(a.p)+1];
    40         strcpy(p,a.p);
    41         return *this;
    42     }
    43     //class=char
    44     MyString& operator=(char *s){
    45         if(p)delete[]p;
    46         p=new char[strlen(s)+1];
    47         strcpy(p,s);
    48         return *this;
    49     }
    50     //class+=char
    51     MyString operator +=(const char *s){
    52         *this=*this+MyString(s);
    53         return *this;
    54     }
    55     //char+class
    56     friend MyString operator +(char *s,MyString&a){
    57         return MyString(s)+a;
    58     }
    59     //class+char
    60     MyString operator +(char*s){
    61         return *this+MyString(s);
    62     }
    63     //<
    64     friend bool operator<(MyString&a,MyString&b){
    65         return (strcmp(a.p,b.p)==-1);
    66     }
    67     //>
    68     friend bool operator>(MyString&a,MyString&b){
    69         return (strcmp(a.p,b.p)==1);
    70     }
    71     //=
    72     friend bool operator==(MyString&a,MyString&b){
    73         return (strcmp(a.p,b.p)==0);
    74     }
    75     //()
    76     char*operator()(int x,int y){
    77        char *ptr=new char[y+1];
    78        for(int i=0;i<y;i++){
    79            ptr[i]=p[i+x];
    80        }
    81        ptr[y]='';
    82        return ptr;
    83     }
    View Code

    去掉了if(p)delete[]p;一行就过了??emmm……不知道是什么情况

    以及vs里不好调……空手调bug

    加个分析

     1 int main()
     2 {
     3     MyString s1("abcd-"),s2,s3("efgh-"),s4(s1);//构造函数和复制函数
     4     MyString SArray[4] = {"big","me","about","take"};
     5     cout << "1. " << s1 << s2 << s3<< s4<< endl;//输出流重载
     6     s4 = s3;
     7     s3 = s1 + s3;//加号重载 连接字符串
     8     cout << "2. " << s1 << endl;
     9     cout << "3. " << s2 << endl;
    10     cout << "4. " << s3 << endl;
    11     cout << "5. " << s4 << endl;
    12     cout << "6. " << s1[2] << endl;//重构[] 返回引用
    13     s2 = s1;//重载赋值
    14     s1 = "ijkl-";//不知可否用构造函数直接解决
    15     s1[2] = 'A' ;
    16     cout << "7. " << s2 << endl;
    17     cout << "8. " << s1 << endl;
    18     s1 += "mnop";//重构+=
    19     cout << "9. " << s1 << endl;
    20     s4 = "qrst-" + s2;//全局函数重载+
    21     cout << "10. " << s4 << endl;
    22     s1 = s2 + s4 + " uvw " + "xyz";//又一个全局函数重载+ 并且重载都返MyString& 不对 临时不能返&
    23     cout << "11. " << s1 << endl;
    24     qsort(SArray,4,sizeof(MyString),CompareString);//重载<>==
    25     for( int i = 0;i < 4;i ++ )
    26     cout << SArray[i] << endl;
    27     //s1的从下标0开始长度为4的子串 重载()
    28     cout << s1(0,4) << endl;
    29     //s1的从下标5开始长度为10的子串
    30     cout << s1(5,10) << endl;
    31     return 0;
    32 }
    View Code

    B:继承自string的MyString

    描述

    程序填空,输出指定结果

    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    class MyString:public string
    {
    // 在此处补充你的代码
    };
    
    
    int main()
    {
        MyString s1("abcd-"),s2,s3("efgh-"),s4(s1);
        MyString SArray[4] = {"big","me","about","take"};
        cout << "1. " << s1 << s2 << s3<< s4<< endl;
        s4 = s3;
        s3 = s1 + s3;
        cout << "2. " << s1 << endl;
        cout << "3. " << s2 << endl;
        cout << "4. " << s3 << endl;
        cout << "5. " << s4 << endl;
        cout << "6. " << s1[2] << endl;
        s2 = s1;
        s1 = "ijkl-";
        s1[2] = 'A' ;
        cout << "7. " << s2 << endl;
        cout << "8. " << s1 << endl;
        s1 += "mnop";
        cout << "9. " << s1 << endl;
        s4 = "qrst-" + s2;
        cout << "10. " << s4 << endl;
        s1 = s2 + s4 + " uvw " + "xyz";
        cout << "11. " << s1 << endl;
            sort(SArray,SArray+4);
        for( int i = 0;i < 4;i ++ )
        cout << SArray[i] << endl;
        //s1的从下标0开始长度为4的子串
        cout << s1(0,4) << endl;
        //s1的从下标5开始长度为10的子串
        cout << s1(5,10) << endl;
        return 0;
    }

    输入

    输出

    1. abcd-efgh-abcd-
    2. abcd-
    3. 
    4. abcd-efgh-
    5. efgh-
    6. c
    7. abcd-
    8. ijAl-
    9. ijAl-mnop
    10. qrst-abcd-
    11. abcd-qrst-abcd- uvw xyz
    about
    big
    me
    take
    abcd
    qrst-abcd-样例输入

    样例输出

    1. abcd-efgh-abcd-
    2. abcd-
    3. 
    4. abcd-efgh-
    5. efgh-
    6. c
    7. abcd-
    8. ijAl-
    9. ijAl-mnop
    10. qrst-abcd-
    11. abcd-qrst-abcd- uvw xyz
    about
    big
    me
    take
    abcd
    qrst-abcd-
    

    提示提示 1:如果将程序中所有 "MyString" 用 "string" 替换,那么除
    了最后两条红色的语句编译无法通过外,其他语句都没有问题,而且输出和前
    面给的结果吻合。也就是说,MyString 类对 string 类的功能扩充只体现在最
    后两条语句上面。 

    提示 2: string 类有一个成员函数 string substr(int start,int 
    length); 能够求从 start 位置开始,长度为 length 的子串 

    提示 3: C++中,派生类的对象可以赋值给基类对象,因为,一个派生
    类对象,也可看作是一个基类对象(大学生是学生)。反过来则不行(学生未
    必是大学生) 同样,调用需要基类对象作参数的函数时,以派生类对象作为实参,也是没有问题的来源Guo Wei

     1 public:
     2     //construct
     3     MyString():string(""){}
     4     MyString(const char*s):string(s){}
     5     MyString(const MyString&a):string(a){}
     6     //+
     7     MyString operator+(const char *b){
     8         string str=*this;
     9         str+=b;
    10         return MyString(str.c_str());
    11     }
    12     MyString operator+(const MyString&a){
    13         string str1=*this,str2=a;
    14         str1+=a;
    15         return MyString(str1.c_str());
    16     }
    17 
    18     friend MyString operator+(const char*s,const MyString &a){
    19         string str1=a,str2=s;
    20         str2+=str1;
    21         return MyString(str2.c_str());
    22     }
    23     //+=
    24     MyString& operator+=(const char*s){
    25         *this=*this+s;
    26         return *this;
    27     }
    28     //()
    29     string operator()(int x,int y){
    30         string str;
    31         for(int i=0;i<y;i++)
    32             str+=(*this)[x+i];
    33         return MyString(str.c_str());
    34     }
    View Code

    早点看到提示就好了……

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    十大最容易找工作的编程语言
    阿里云主机优惠购买后试用感受(送阿里云代金券)
    【目录】整理
    【git】关联远程分支
    【java】java基本用法记录
    【svn】本地文件夹同步到SVN
    【算法】Bert预训练源码阅读
    【算法】Attention is all you need
    【算法】Normalization
    【算法】BILSTM+CRF中的条件随机场
  • 原文地址:https://www.cnblogs.com/yalphait/p/8618195.html
Copyright © 2020-2023  润新知