C++题目练习08

C++题目练习08

8.1 字符串类的实现 3

在《字符串类的实现 2》的基础上,增加 myString字符串类 的方法:

(指路 C++题目练习05 5.3)

  • 重载运算符 << :先输出 len ,然后一个空格,一个冒号,再一个空格,然后输出 data 所指字符数组。如果不含字符,则只输出一个 0。

  • 重载运算符 >> :读入字符串,存入 data 所指字符数组。注意:读入的一行字符串长度可能很大,建议先读入到一个 string 对象后再处理。

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

class myString {
	private:
		char *data;
		int len;

	public:
		myString() {
			data = nullptr;
			len = 0;
		}
		myString(char s[]) {
			len = strlen(s);
			data = new char[len + 1];
			strcpy(data, s);
		}

		~myString() {
			if (data != nullptr) {
				delete[] data;
			}
		}

		myString(const myString &b) {
			len = b.len;
			data = new char[len + 1];
			strcpy(data, b.data);
		}

		int size() {
			return len;
		}

		int set(char s[]) {
			if (data != nullptr) {
				delete[] data;
			}
			len = strlen(s);
			data = new char[len + 1];
			strcpy(data, s);
			return len;
		}

		myString &operator=(const myString &b) {
			if (this == &b) {
				return *this;
			}
            else
            {
			if (data != nullptr) {
				delete[] data;
			}
           
			len = b.len;
			data = new char[len + 1];
			strcpy(data, b.data);
            }
			return *this;
		}

		myString operator+(const myString &b) {
			myString temp;
			temp.len = len + b.len;
			temp.data = new char[temp.len + 1];
			strcpy(temp.data, data);
			strcat(temp.data, b.data);
			return temp;
		}

		myString sub( int start, int l ) {
			myString ms;
			ms.data = new char[l + 1];
			ms.len = l;
			for (int i = 0; i < l; i++)
				ms.data[i] = '\0';

			int j = 0;
			for (int i = start - 1; (i < start + l - 1) && (i < len); i++, j++) {
				ms.data[j] = data[i];
			}
			return ms;
		}

		void output() 
        {
        if (len == 0) 
             cout << "0";
        else 
            cout << len << " : " << data;
        
    }
		friend ostream &operator<<(ostream &out, const  myString &s) {
	        if(s.len==0)
                out<<"0";
            else
			 out << s.len << " " << ": " << s.data;
	        return out;
		}
		friend 	istream &operator>>(istream &is,  myString &s) {
			string input;
            getline(is,input);
			s.len = input.length();
			s.data = new char[s.len];
			strcpy(s.data, input.c_str());
			return is;
		}
};


int main() {

	myString a;

	int n;
	cin >> n;

	// 以下2行没有本质作用,仅用于吸收换行符,就是 n 后面那个换行符
	string tmp;
	getline( cin, tmp );

	for ( int i = 0; i < n; i++ ) {
		cin >> a;
		cout << a << endl;
	}

	return 0;
}

 8.2 字符串类的实现 4

在《字符串类的实现 3》的基础上,增加 myString字符串类 的方法:

  • 重载 小于比较运算符 < : a 和 b 两个字符串对象,从头到尾比较a和b的对应位置字符,当 a.data[i] < b.data[i] 时,表达式 a < b 为真

  • 重载 大于比较运算符 > : a 和 b 两个字符串对象,从头到尾比较a和b的对应位置字符,当 a.data[i] > b.data[i] 时,表达式 a > b 为真

  • 重载 不等于运算符 != : a 和 b 两个字符串对象,从头到尾比较a和b的对应位置字符,当 a.data[i] != b.data[i] 时,表达式 a != b 为真

  • 重载 等于比较运算符 == : 当 a 和 b 含字符个数相同且对应位置的字符相等时,表达式 a == b 为真

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

class myString {
	private:
		char *data;
		int len;

	public:
		myString() {
			data = nullptr;
			len = 0;
		}
		myString(char s[]) {
			len = strlen(s);
			data = new char[len + 1];
			strcpy(data, s);
		}

		~myString() {
			if (data != nullptr) {
				delete[] data;
			}
		}

		myString(const myString &b) {
			len = b.len;
			data = new char[len + 1];
			strcpy(data, b.data);
		}

		int size() {
			return len;
		}

		int set(char s[]) {
			if (data != nullptr) {
				delete[] data;
			}
			len = strlen(s);
			data = new char[len + 1];
			strcpy(data, s);
			return len;
		}

		myString &operator=(const myString &b) {
			if (this == &b) {
				return *this;
			}
            else
            {
			if (data != nullptr) {
				delete[] data;
			}
           
			len = b.len;
			data = new char[len + 1];
			strcpy(data, b.data);
            }
			return *this;
		}

		myString operator+(const myString &b) {
			myString temp;
			temp.len = len + b.len;
			temp.data = new char[temp.len + 1];
			strcpy(temp.data, data);
			strcat(temp.data, b.data);
			return temp;
		}

		myString sub( int start, int l ) {
			myString ms;
			ms.data = new char[l + 1];
			ms.len = l;
			for (int i = 0; i < l; i++)
				ms.data[i] = '\0';

			int j = 0;
			for (int i = start - 1; (i < start + l - 1) && (i < len); i++, j++) {
				ms.data[j] = data[i];
			}
			return ms;
		}

		void output() 
        {
        if (len == 0) 
             cout << "0";
        else 
            cout << len << " : " << data;
        
    }
		friend ostream &operator<<(ostream &out, const  myString &s) {
	        if(s.len==0)
                out<<"0";
            else
			 out << s.len << " " << ": " << s.data;
	        return out;
		}
		friend 	istream &operator>>(istream &is,  myString &s) {
			string input;
            getline(is,input);
			s.len = input.length();
			s.data = new char[s.len];
			strcpy(s.data, input.c_str());
			return is;
		}
		
		 bool operator<( myString &b) 
         {
            int min;
            if (len < b.len) 
              min = len;
            else 
              min = b.len;

        for (int i = 0; i < min; i++) {
            if (data[i] < b.data[i]) {
                return true;
            }
            else if (data[i] > b.data[i]) {
                return false;
            }
        }
        return len < b.len;
    }

    bool operator>(myString &b) {
        int min;
        if (len < b.len)
            min = len;
        else 
           min = b.len;

        for (int i = 0; i < min; i++) {
            if (data[i] > b.data[i]) {
                return true;
            }
            else if (data[i] < b.data[i]) {
                return false;
            }
        }
        return len > b.len;
    }

    bool operator!=(myString &b) {
        return !(*this == b);
    }

    bool operator==(myString &b) {
        if (len != b.len) {
            return false;
        }
        for (int i = 0; i < len; i++) {
            if (data[i] != b.data[i]) {
                return false;
            }
        }
        return true;
    }

};

int main() {
    myString a, b;

    cin >> a;
    cin >> b;

    if ( a == b ) {
        cout << "a == b" << endl;
    }
    else {
        if ( a > b ) {
            cout << "a > b" << endl;
        }
        else {
            if ( a < b ) {
                cout << "a < b" << endl;  
            }
        }
     }   

    return 0;
}



 8.3 字符串类的实现 5

在上一题基础上,增加 myString字符串类 的方法:

  • 重载 下标运算符[] : operator [] ( int i ) ,要求作为左操作数,即把一个字符写入数据成员 data[i] 中

  • 重载 下标运算符[] : operator [] ( int i ) ,要求作为右操作数,只读,即读取数据成员 data[i] 的值

  • 重载 MyString类 到 char * 类型的转换 :operator char * () ,这个的目的是给下面的 read() 函数用的

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

class myString {
	private:
		char *data;
		int len;

	public:
		myString() 
		{
			data = nullptr;
			len = 0;
		}
		myString(char s[])
		{
			len = strlen(s);
			data = new char[len + 1];
			strcpy(data, s);
		}

		~myString() {
			if (data != nullptr) 
			{
				delete[] data;
			}
		}

		myString(const myString &b) 
		{
			len = b.len;
			data = new char[len + 1];
			strcpy(data, b.data);
		}

		int size() 
		{
			return len;
		}

		int set(char s[]) 
		{
			if (data != nullptr) 
			{
				delete[] data;
			}
			len = strlen(s);
			data = new char[len + 1];
			strcpy(data, s);
			return len;
		}

		myString &operator=(const myString &b)
		 {
			if (this == &b)
			{
				return *this;
			}
            else
            {
			if (data != nullptr) 
			{
				delete[] data;
			}
           
			len = b.len;
			data = new char[len + 1];
			strcpy(data, b.data);
            }
			return *this;
		}

		myString operator+(const myString &b) {
			myString temp;
			temp.len = len + b.len;
			temp.data = new char[temp.len + 1];
			strcpy(temp.data, data);
			strcat(temp.data, b.data);
			return temp;
		}

		myString sub( int start, int l ) {
			myString ms;
			ms.data = new char[l + 1];
			ms.len = l;
			for (int i = 0; i < l; i++)
				ms.data[i] = '\0';

			int j = 0;
			for (int i = start - 1; (i < start + l - 1) && (i < len); i++, j++) {
				ms.data[j] = data[i];
			}
			return ms;
		}

		void output() 
        {
        if (len == 0) 
             cout << "0";
        else 
            cout << len << " : " << data;
        
    }
		friend ostream &operator<<(ostream &out, const  myString &s) {
	        if(s.len==0)
                out<<"0";
            else
			 out << s.len << " " << ": " << s.data;
	        return out;
		}
		friend 	istream &operator>>(istream &is,  myString &s) {
			string input;
            getline(is,input);
			s.len = input.length();
			s.data = new char[s.len];
			strcpy(s.data, input.c_str());
			return is;
		}
		
		 bool operator<( myString &b) 
         {
            int min;
            if (len < b.len) 
              min = len;
            else 
              min = b.len;

        for (int i = 0; i < min; i++) {
            if (data[i] < b.data[i]) {
                return true;
            }
            else if (data[i] > b.data[i]) {
                return false;
            }
        }
        return len < b.len;
    }

    bool operator>(myString &b) {
        int min;
        if (len < b.len)
            min = len;
        else 
           min = b.len;

        for (int i = 0; i < min; i++) {
            if (data[i] > b.data[i]) {
                return true;
            }
            else if (data[i] < b.data[i]) {
                return false;
            }
        }
        return len > b.len;
    }

    bool operator!=(myString &b) {
        return !(*this == b);
    }

    bool operator==(myString &b) {
        if (len != b.len) {
            return false;
        }
        for (int i = 0; i < len; i++) {
            if (data[i] != b.data[i]) 
			{
                return false;
            }
        }
        return true;
    }
    char &operator[](int i) {
    return data[i];
}

const char &operator[](int i) const {
    return data[i];
}

operator char*() {
    return data;
}

};


void read( char *p, int n ) {
    for ( int i = 0; i < n; i++ )
        cin >> p[i];
}

int main() {
    myString a;

    cin >> a;   /// 验证 流提取运算符的重载
    cout << a << endl;  /// 验证 流插入运算符的重载

    for ( int i = 0; i < a.size(); i ++ )
        cin >> a[i];   /// 验证下标运算符的重载

    string tmp;
    cin >> tmp; /// 吸收掉上一行剩余的内容,不至影响到下面的 read()

    for ( int i = 0; i < a.size(); i ++ )
        cout << a[i];
    cout << endl;
    
    read( a, 20 );  /// 验证 类型转换的重载

    cout << a << endl;

    return 0;
}


 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值