zoukankan      html  css  js  c++  java
  • 作业5-继承和派生

    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] = '';
    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
    ",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
    ",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
    ",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
    ", 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
    ",
    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
    ",time); //格式化输出 
    127         else printf("%03d red headquarter stops making warriors
    ",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
    ",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

  • 相关阅读:
    Orchard1.4发布
    13个MVC的扩展
    不完全接触Node.js
    mac软件
    在Apworks框架中解除NHibernateContext与NHibernateRepository的依赖关系
    mac下我常用的一些软件
    在.NET应用程序中访问Excel的几种方式
    Visual Studio 11 Beta 官方下载地址
    欢迎使用 Windows 8 – Consumer Preview
    PHP学习系列之 环境配置
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/12546796.html
Copyright © 2011-2022 走看看