1.全面的MyString
输出:
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 /*使程序输出指定结果*/ 2 #include <cstdlib> 3 #include <iostream> 4 using namespace std; 5 int strlen(const char * s) 6 { int i = 0; 7 for(; s[i]; ++i); 8 return i; 9 } 10 11 void strcpy(char * d,const char * s) 12 { 13 int i = 0; 14 for( i = 0; s[i]; ++i) 15 d[i] = s[i]; 16 d[i] = 0; 17 18 } 19 20 int strcmp(const char * s1,const char * s2) 21 { 22 for(int i = 0; s1[i] && s2[i] ; ++i) { 23 if( s1[i] < s2[i] ) 24 return -1; 25 else if( s1[i] > s2[i]) 26 return 1; 27 } 28 return 0; 29 } 30 31 void strcat(char * d,const char * s) 32 { 33 int len = strlen(d); 34 strcpy(d+len,s); 35 } 36 37 class MyString 38 { 39 // 在此处补充你的代码 40 char *p; 41 public: 42 MyString(const char * s = NULL) { //擅于利用缺省的参数,不要再写一个 43 if(s) { 44 p = new char[strlen(s) + 1]; 45 strcpy(p,s); 46 } 47 else 48 p = NULL; 49 50 } 51 ~MyString() { if(p) delete [] p; } 52 MyString(const MyString & s){ 53 if(s.p==NULL) p = NULL; 54 else{ 55 p = new char[strlen(s.p) + 1]; 56 strcpy(p,s.p); 57 } 58 } 59 MyString & operator=(const MyString & s) { 60 if(p) delete [] p; 61 if(s.p==NULL){ 62 p = NULL; return * this; 63 } 64 p = new char[strlen(s.p)+1]; 65 strcpy(p, s.p); 66 return * this; 67 } 68 MyString & operator=(const char * s) { 69 if(p) delete [] p; 70 if(s==NULL){ 71 p = NULL; return * this; 72 } 73 p = new char[strlen(s)+1]; 74 strcpy(p, s); 75 return * this; 76 } 77 char & operator[](const int i){ 78 return p[i]; 79 } 80 friend MyString operator+(const MyString & a, const MyString & b){ 81 MyString ans; 82 ans.p = new char[strlen(a.p)+strlen(b.p)+1]; 83 strcpy(ans.p, a.p); 84 strcat(ans.p, b.p); //不能改变原来的a 85 return ans; 86 } 87 MyString & operator+=(const char * s) { 88 MyString temp(s); 89 *this = *this+temp; 90 return * this; 91 } 92 bool operator<(const MyString s){ 93 return (strcmp(p, s.p)==-1); 94 } 95 bool operator>(const MyString s){ 96 return (strcmp(p, s.p)==1); 97 } 98 bool operator==(const MyString s){ 99 return (strcmp(p, s.p)==0); 100 } 101 char * operator()(int start, int len){ 102 char *temp = new char[len+1]; 103 for (int i = start; i < start+len; i++){ 104 temp[i-start] = p[i]; 105 } 106 temp[len] = '\0'; 107 return temp; 108 } 109 friend ostream & operator<<(ostream & o, const MyString & s){ 110 if(s.p==NULL )return o; // 空指针就不输出了 111 o<<s.p; 112 return o; 113 } 114 115 }; 116 117 118 int CompareString( const void * e1, const void * e2) 119 { 120 MyString * s1 = (MyString * ) e1; 121 MyString * s2 = (MyString * ) e2; 122 if( * s1 < *s2 ) //重载小于号 123 return -1; 124 else if( *s1 == *s2) 125 return 0; 126 else if( *s1 > *s2 ) //重载大于号 127 return 1; 128 } 129 130 int main() 131 { 132 MyString s1("abcd-"),s2,s3("efgh-"),s4(s1); //构造函数、复制构造函数 133 MyString SArray[4] = {"big","me","about","take"}; 134 cout << "1. " <<s1<<s2<<s3<< s4<< endl; //重载流插入 不能读 空指针 135 s4 = s3; //重载等于号 136 s3 = s1 + s3; // 重载+号 137 cout << "2. " << s1 << endl; 138 cout << "3. " << s2 << endl; 139 cout << "4. " << s3 << endl; 140 cout << "5. " << s4 << endl; 141 cout << "6. " << s1[2] << endl; 142 s2 = s1; 143 s1 = "ijkl-"; //重载等于号 144 s1[2] = 'A' ; // 重载中括号 145 cout << "7. " << s2 << endl; 146 cout << "8. " << s1 << endl; 147 s1 += "mnop"; //重载+= 148 cout << "9. " << s1 << endl; 149 s4 = "qrst-" + s2; 150 cout << "10. " << s4 << endl; 151 s1 = s2 + s4 + " uvw " + "xyz"; 152 cout << "11. " << s1 << endl; 153 qsort(SArray,4,sizeof(MyString),CompareString); 154 for( int i = 0;i < 4;i ++ ) 155 cout << SArray[i] << endl; 156 //s1的从下标0开始长度为4的子串 157 cout << s1(0,4) << endl; //重载小括号 158 //s1的从下标5开始长度为10的子串 159 cout << s1(5,10) << endl; 160 return 0; 161 }
备注:这道题应该就是为了第二道题做铺垫,让我们感受一下继承的便捷。这道题的启发在于cout不能输出空指针!!!如果输出空指针,之后的输出就都输出不了了。
2.继承自string的MyString
1 #include <cstdlib> 2 #include <iostream> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 class MyString:public string 7 { 8 // 在此处补充你的代码 9 public: 10 MyString(): string() {} 11 MyString(const string s): string(s){} 12 MyString(const char * s): string(s){}//为什么要写这一行 13 string operator()(int start, int len){ 14 return substr(start, len); 15 } 16 }; 17 18 19 int main() 20 { 21 MyString s1("abcd-"),s2,s3("efgh-"),s4(s1); 22 MyString s5 = "abds"; 23 //MyString SArray[4] = {"big","me","about","take"}; 24 cout << "1. " << s1 << s2 << s3<< s4<< endl; 25 s4 = s3; 26 s3 = s1 + s3; 27 cout << "2. " << s1 << endl; 28 cout << "3. " << s2 << endl; 29 cout << "4. " << s3 << endl; 30 cout << "5. " << s4 << endl; 31 cout << "6. " << s1[2] << endl; 32 s2 = s1; 33 // s1 = "ijkl-"; 34 s1[2] = 'A' ; 35 cout << "7. " << s2 << endl; 36 cout << "8. " << s1 << endl; 37 s1 += "mnop"; 38 cout << "9. " << s1 << endl; 39 s4 = "qrst-" + s2; 40 cout << "10. " << s4 << endl; 41 s1 = s2 + s4 + " uvw " + "xyz"; 42 cout << "11. " << s1 << endl; 43 sort(SArray,SArray+4); 44 for( int i = 0;i < 4;i ++ ) 45 cout << SArray[i] << endl; 46 //s1的从下标0开始长度为4的子串 47 cout << s1(0,4) << endl; 48 //s1的从下标5开始长度为10的子串 49 cout << s1(5,10) << endl; 50 return 0; 51 }
备注:注意标黄的一行,如果少了会编译报错。问了助教学长,答复是,做MyString a="xxx"的时候,实际上先把"xxx"变成了string,然后再变成MyString,需要两步隐式的类型转换,而这个是不支持的。
3.魔兽世界2
1 #include <iostream> 2 #include <string> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 //武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值、攻击力这三种属性 7 //红方司令部按照iceman、lion、wolf、ninja、dragon的顺序循环制造武士。 8 //蓝方司令部按照lion、dragon、ninja、iceman、wolf的顺序循环制造武士。 9 //编程规范:变量名中间字母大写,类名、函数名首字母大写 10 //莫名其妙的问题看看循环的下标是不是写错了! 11 class Command; //复合关系 12 13 class Soldier{ //武士 14 private: 15 Command *com; //属于哪个司令部 16 int kind; //是哪种武士 17 int id; //编号 18 public: 19 Soldier(Command*p, int kindd, int idd); 20 void Print(int time); 21 static int life[5]; //生命值 22 static string weapon[3]; //新加武器 23 static string name[5]; //dragon 、ninja、iceman、lion、wolf 24 }; 25 26 class Command{ //司令部 27 private: 28 Soldier *mySoldier[1000]; //都有哪些士兵 29 int HP; //总血量 30 int color; //蓝方为1, 红方为0 31 int sNum[5]; //存放每种士兵的数量 32 int curID; //当前制造到了第curID个士兵 33 int curkind; //当前制造的种类(用在该颜色的order里是第几个表示,即相对编号) 34 bool flag; //用来记录生命值用完了没有 35 public: 36 static int order[2][5]; //制造顺序 37 void Init(int col, int life); 38 bool Creat(int time); 39 ~Command(); 40 friend class Soldier; //友元关系不可继承 41 friend class Dragon; 42 friend class Lion; 43 }; 44 45 class Dragon: public Soldier{ 46 string weap; //获得编号为n%3; 47 double morale; //降生后其司令部剩余生命元的数量除以造dragon所需的生命元数量 48 public: 49 Dragon(Command*p, int kindd, int idd):Soldier(p, kindd, idd),weap(weapon[idd%3]),morale(double(p->HP)/life[0]){} 50 void Printinfo(){ 51 printf("It has a %s,and it's morale is %.2lf\n",weap.c_str(),morale); 52 } 53 }; 54 55 class Ninja: public Soldier{ 56 string weap1, weap2; //获得编号为 n%3 和 (n+1)%3的武器 57 public: 58 Ninja(Command*p, int kindd, int idd):Soldier(p, kindd, idd),weap1(weapon[idd%3]), weap2(weapon[(idd+1)%3]){} 59 void Printinfo(){ 60 printf("It has a %s and a %s\n",weap1.c_str(), weap2.c_str()); 61 } 62 }; 63 64 class Iceman: public Soldier{ 65 string weap;//获得编号为 n%3 的武器 66 public: 67 Iceman(Command*p, int kindd, int idd):Soldier(p, kindd, idd),weap(weapon[idd%3]){} 68 void Printinfo(){ 69 printf("It has a %s\n",weap.c_str()); 70 } 71 }; 72 73 class Lion: public Soldier{ 74 int loyalty; //它降生后其司令部剩余生命元的数目 75 public: 76 Lion(Command*p, int kindd, int idd):Soldier(p, kindd, idd),loyalty(p->HP){} 77 void Printinfo(){ 78 printf("It's loyalty is %d\n", loyalty); 79 } 80 }; 81 82 class Wolf: public Soldier{ 83 84 }; 85 86 string Soldier::name[5]={"dragon","ninja","iceman","lion","wolf"}; 87 int Soldier::life[5]; 88 string Soldier::weapon[3] = {"sword", "bomb", "arrow"}; 89 int Command::order[2][5]={{2,3,4,1,0},{3,0,1,2,4}}; 90 91 Soldier::Soldier(Command *p, int kindd, int idd){ 92 com = p; 93 kind = kindd; 94 id = idd; 95 } 96 97 void Soldier::Print(int time){ 98 char color[6]; 99 if(com->color==1) strcpy(color, "blue"); //char字符串可以直接用=初始化,但不能这么赋值 100 else strcpy(color, "red"); 101 printf("%03d %s %s %d born with strength %d,%d %s in %s headquarter\n", 102 time, color, name[kind].c_str(), id, life[kind], com->sNum[kind],name[kind].c_str(),color); 103 } 104 105 void Command::Init(int col, int life){ //初始化 106 color = col; 107 HP = life; 108 flag = false; 109 curID = 1; 110 curkind = 0; 111 memset(sNum, 0, sizeof(sNum)); 112 } 113 114 //string Soldier::name[5]={"dragon","ninja","iceman","lion","wolf"}; 115 bool Command::Creat(int time){ 116 if(flag) return false; //已经不能再造了 117 int i, kind; 118 int orikind = curkind; 119 for(i = 0; i < 5; i++){ 120 curkind = (orikind+i)%5; //这块不能写成curkind = (curkind+i)%5;!!!!!注意!!!! 121 kind = order[color][curkind]; //这里是绝对编号 122 if(Soldier::life[kind]<=HP) break; 123 } 124 if(i >= 5){ //已经轮完一轮了,并且这是第一次不能制造新兵 125 flag = true; 126 if(color) printf("%03d blue headquarter stops making warriors\n",time); //格式化输出 127 else printf("%03d red headquarter stops making warriors\n",time); 128 return false; 129 } 130 //成功制造士兵 131 mySoldier[curID]=new Dragon(this, kind, curID); 132 sNum[kind]++; 133 HP-=Soldier::life[kind]; 134 mySoldier[curID]->Print(time); 135 switch(kind){ //case里不能定义局部变量,除非加作用域符号{} 136 case 0: 137 {Dragon d(this, kind, curID); d.Printinfo(); break;} 138 case 1: 139 {Ninja n(this, kind, curID); n.Printinfo(); break;} 140 case 2: 141 {Iceman ii(this, kind, curID); ii.Printinfo(); break;} 142 case 3: 143 {Lion l(this, kind, curID); l.Printinfo(); break;} 144 case 4: break; 145 } 146 //各种序号要+1 147 curkind = (curkind+1)%5; 148 curID++; 149 return true; 150 } 151 152 Command::~Command(){ 153 for(int i=0;i<curID;i++) 154 delete mySoldier[i]; 155 } 156 157 int main(){ 158 int T, M; 159 Command Blue, Red; 160 scanf("%d", &T); 161 for(int i = 1; i <= T; i++){ 162 printf("Case:%d\n",i); 163 scanf("%d",&M); 164 Blue.Init(1,M); 165 Red.Init(0,M); 166 for(int j = 0; j <= 4; j++) 167 scanf("%d", &Soldier::life[j]); 168 int time = 0; 169 while(1){ 170 bool flagred = Red.Creat(time); 171 bool flagblue = Blue.Creat(time); 172 time++; 173 if(!flagred&&!flagblue) break; 174 } 175 } 176 return 0; 177 }
备注:我没啥好说的……看注释吧。我也不知道我这种写法好不好orz
来源:https://www.cnblogs.com/fangziyuan/p/12546796.html