码迷,mamicode.com
首页 > 编程语言 > 详细

c++mooc平台第五章小测

时间:2020-05-31 13:07:35      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:stop   style   friend   标记   tin   keyword   编写   输出   first   

第五章 测验

单选(1分)

1) 如果多种事物,有一些共同的特点,又有一些各自不同的特点,如何编写类来代表这些事物比较合适?    

 

  • A.

    B) 写一个类代表其中一种事物,代表其他事物的类,都从这个类派生出来

  • B.

    C) 概括所有事物的共同特点,写一个基类。然后为每种事物写一个类,都从基类派生而来

    1.00/1.00
  • C.

    D) 一共就写一个类,包含所有事物的所有特点,然后用一个成员变量作为标记来区分不同种类的事物

  • D.

    A) 为每种事物独立编写一个类,各类之间互相无关

2
单选(1分)

2) 以下哪种派生关系是合理的

  • A.

    B) 从“点”类派生出“圆”类

  • B.

    D) 从“爬行动物”类派生出“哺乳动物”类

  • C.

    A) 从“虫子”类派生出“飞虫”类

    1.00/1.00
  • D.

    C) 从“狼”类派生出“狗”类

3
单选(1分)

3) 派生类和基类有同名同参数表的成员函数,这种现象:

  • A.

    C) 叫覆盖。在派生类中基类的同名函数就没用了

  • B.

    D) 叫覆盖。体现了派生类对从基类继承得到的特点的修改

    1.00/1.00
  • C.

    B) 叫函数的重载

  • D.

    A) 叫重复定义,是不允许的

4
单选(1分)

4) 以下说法正确的是:

  • A.

    C) 派生类和基类的同名成员函数必须参数表不同,否则就是重复定义

  • B.

    D) 派生类和基类的同名成员变量存放在相同的存储空间

  • C.

    B) 派生类的成员函数中,可以调用基类的同名同参数表的成员函数

    1.00/1.00
  • D.

    A) 派生类可以和基类有同名成员函数,但是不能有同名成员变量

5
单选(1分)

5) 以下说法正确的是:

  • A.

    A) 派生类对象生成时,派生类的构造函数先于基类的构造函数执行

  • B.

    B) 派生类对象消亡时,基类的析构函数先于派生类的析构函数执行

  • C.

    D) 在派生类的构造函数中部可以访问基类的成员变量

  • D.

    C) 如果基类有无参构造函数,则派生类的构造函数就可以不带初始化列表

    1.00/1.00

通过编译,是accepted,但通过码提交作业是错的,不知道原因(郁闷ing):

技术图片

技术图片

 

 

6,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
{
private:
char* p; // 字符串指针 动态分配空间
int len; // 字符串长度
public:
// 字符串构造函数
MyString(const char* a)
{
len = strlen(a);
p = new char[len + 1];
strcpy(p, a);
}
// 无参数构造函数
MyString()
{
len = 1;
p = new char[1];
strcpy(p, "");
}
// 拷贝构造函数
MyString(const MyString& a)
{
len = strlen(a.p);
p = new char[len + 1];
strcpy(p, a.p);
}
// 输出运算符重载
friend ostream& operator<<(ostream& o, const MyString& a)
{
o << a.p;
return o;
}
// 赋值运算符重载
MyString& operator=(const MyString& a)
{
if (p == a.p)
{
return *this;
}
if (p)
delete p;
len = strlen(a.p);
p = new char[len + 1];
strcpy(p, a.p);
return *this;
}
// [] 运算符重载
char& operator[](int i)
{
return p[i];
}
// 字符串+的重载
friend MyString operator+(const MyString& a, const MyString& b)
{
int l = b.len + a.len;
char *c = new char[l + 1];
strcpy(c, a.p);
int i;
int j = 0;
for (i = a.len; i <= l - 1; ++i, ++j)
c[i] = b.p[j];
c[i] = 0;
return MyString(c);
}
// 字符串+=的重载
void operator +=(const char *a)
{
// 注意,不能直接拼接的原因是空间不够,需要先删除p
// 申请一个更大的空间,在拼接
int i = len;
char *b = new char[len + 1];
strcpy(b, p);
delete p;
len = len + strlen(a);
p = new char[len + 1];
strcpy(p, b);
int j = 0;
for (; i <= len - 1; i++, j++) {
p[i] = a[j];
}
p[i] = 0;
}
// 比较字典序的重载
friend bool operator<(const MyString& a, const MyString& b)
{
if (strcmp(b.p, a.p) == 1) {
return 1;
}
return 0;
}
// 比较字典序的重载
friend bool operator>(const MyString& a, const MyString& b) {
if (strcmp(a.p, b.p) == 1) {
return 1;
}
return 0;
}
// 比较字典序的重载
friend bool operator==(const MyString& a, const MyString& b) {
if (strcmp(a.p, b.p) == 0) {
return 1;
}
return 0;
}
// ()运算符的重载,取出字典字串
char* operator()(int a, int l) {
char* c = new char[l + 1];
int j = 0;
for (int i = a; i<a + l; i++, j++) {
c[j] = p[i];
}
c[j] = 0;
return c;
}
};


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;
}

 

7,继承自string的MyString 通过码:

#include <cstdlib>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class MyString :public string
{
// 在此处补充你的代码
public:
MyString():string() {}
MyString(const char *s):string(s) {}
MyString(const MyString & s):string(s){}
MyString(const string & s):string(s) {}
MyString operator()(int start, int end)
{
return substr(start, end);
}

};


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;
system("pause");
return 0;
}

 

8,魔兽世界2源代码:

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

int M;//两大阵营开始都有M个生命元
int r_maker[5] = {2,3,4,1,0};
int b_maker[5] = {3,0,1,2,4};
string weapon[3] = {"sword","bomb","arrow"};
int HP[5];
/*
dragon: 0
ninja : 1
iceman: 2
lion  : 3
wolf  : 4
*/

/*
red :0
blue:1
*/
class Warrior {
    private:
        int num;//勇士编号 
        int hp;//勇士生命值 
    public:
        Warrior(int from,int name,int warrior_t,int left_t);
};

Warrior::Warrior(int from,int name,int warrior_t,int left_t)
{
    //阵营名 
    string camp_name;
    if(from == 0)
        camp_name = "red";
    else 
        camp_name = "blue";
    //武士名
    string warrior_name;
    switch (name) 
    {
        case 0:warrior_name = "dragon";break;
        case 1:warrior_name = "ninja";break;
        case 2:warrior_name = "iceman";break;
        case 3:warrior_name = "lion";break;
        case 4:warrior_name = "wolf";break;
    }
    //武士编号
    int warrior_num = warrior_t;
    //生命值
    int life = HP[name];
    //各自阵营left
    int left = left_t;
    //输出所有的信息 
    cout<<camp_name<<‘ ‘<<warrior_name<<‘ ‘<<warrior_num<<‘ ‘;
    cout<<"born with strength "<<life<<‘,‘<<left<<‘ ‘<<warrior_name;
    cout<<" in "<<camp_name<<" headquarter"<<endl;
    //最后设置该warrior的参数 
    num = warrior_num;
    hp = life;
}

class Dragon : public Warrior
{
    private:
        double morale;
        int weapon_num;
        string weapon_name;
    public:
        Dragon(int mark,int num1,int num2,int before_left);
};

Dragon::Dragon(int mark,int num1,int num2,int before_left):Warrior(mark,0,num1,num2)
{
    int left = before_left-HP[0];
    morale = (double)left/HP[0];
    int cur_num = num1;//当前的编号 
    weapon_num = cur_num%3;
    weapon_name = weapon[weapon_num];
    //输出Dragon特有的信息
    cout<<"It has a "<<weapon_name<<‘,‘<<"and it‘s morale is ";
    printf("%.2f\n",morale);
}

class Ninja : public Warrior
{
    private:
        int weapon_num1,weapon_num2;
        string weapon_name1,weapon_name2;
    public:
        Ninja(int mark,int num1,int num2);
};

Ninja::Ninja(int mark,int num1,int num2):Warrior(mark,1,num1,num2)
{
    int cur_n = num1;//当前武士编号 
    weapon_num1 = cur_n%3;
    weapon_num2 = (cur_n+1)%3;
    weapon_name1 = weapon[weapon_num1];
    weapon_name2 = weapon[weapon_num2];
    //输出Ninja特有的信息
    cout<<"It has a "<<weapon_name1<<" and a "<<weapon_name2<<endl; 
}

class Iceman : public Warrior
{
    private:
        int weapon_num;
        string weapon_name;
    public:
        Iceman(int mark,int num1,int num2); 
};

Iceman::Iceman(int mark,int num1,int num2):Warrior(mark,2,num1,num2)
{
    int cur_n = num1;
    weapon_num = cur_n%3;
    weapon_name = weapon[weapon_num];
    //输出Ninja特有的信息
    cout<<"It has a "<<weapon_name<<endl;
}

class Lion : public Warrior
{
    private:
        int loyalty;
    public:
        Lion(int mark,int num1,int num2,int before_left);
};

Lion::Lion(int mark,int num1,int num2,int before_left):Warrior(mark,3,num1,num2)
{
    loyalty = before_left-HP[3];
    //输出Ninja特有的信息
    cout<<"It‘s loyalty is "<<loyalty<<endl; 
}

classWolf:public Warrior
{
    public:
        Wolf(int mark,int num1,int num2):Warrior(mark,4,num1,num2){} 
}; 

classCamp {
    private:
        int mark;//阵营标记 
        int M_left[2];//两个阵营剩余的生命元
        int state;
        int num[2];//两个阵营分别现有的武士数量 
        int w_num[5][2];//两个阵营各个武士的现有数量 
    public:
        Camp(int nn,int m);
        ~Camp();
        void change(int name);//make完一个warrior后要改变相应的参数 
        void make(int from,int name);//核心函数,制造新的武士 
        int alive();
        int get(int mark);
}; 

Camp::Camp(int nn,int m)
{
    mark = nn;
    M_left[nn] = m;
    state = 1;
    num[0] = num[1] = 1;
    for(int i = 0;i < 5;i++) 
        for(int j = 0;j < 2;j++) 
            w_num[i][j] = 0; 
}

Camp::~Camp() 
{
    state = 0;
    if(mark == 0) 
        cout<<"red headquarter stops making warriors"<<endl;
    else 
        cout<<"blue headquarter stops making warriors"<<endl;
}

void Camp::make(int from,int name)
{
    int n3,n4;
    n3 = num[mark];//当前阵营现有的武士数量 
    n4 = w_num[name][mark]+1;//当前阵营该武士现有的数量 
    if(name == 0)
        Dragontmp(from,n3,n4,M_left[from]);
    else if(name == 1)
        Ninjatmp(from,n3,n4);
    else if(name == 2)
        Icemantmp(from,n3,n4);
    else if(name == 3)
        Liontmp(from,n3,n4,M_left[from]);
    else 
        Wolftmp(from,n3,n4);
//    Warrior tmp(from,name,n3,n4); 
    change(name);
}

void Camp::change(int name)
{
    num[mark]++;
    M_left[mark] -= HP[name];
    w_num[name][mark]++;
}

int Camp::get(int mark) {
    return M_left[mark];
}

int Camp::alive()
{
    return state;
}

int main()
{
    int C = 0;//Case:测试样例的数量 
    int T;
    cin>>T;
    while(T--)
    {
        int order[2]={0,0};//两大阵营现在分别造到第几个 
        cin>>M;
        for(int i = 0;i < 5;i++)
            cin>>HP[i];
        cout<<"Case:"<<++C<<endl;
        //创建两个阵营
        Camp* R = new Camp(0,M);
        Camp* B = new Camp(1,M);
        Camp* P;
        //默认进行999秒循环,内部中止 
        for(int T = 0;T <= 999;T++)
        {
            if(!R && !B) break;
            for(int j = 0;j < 2;j++)
            { 
                //确定阵营 
                if(j == 0) P = R;
                else P = B;
                if(P->alive()) {
                    //确定本次要创建新士兵 
                    int flag = 0;
                    int nn;
                    int cur,tmp;
                    int left = P->get(j);
                    int tt = (order[j]+5)%5;
                    if(j == 0) 
                        tmp = r_maker[tt];
                    else 
                        tmp = b_maker[tt];
                    if(left >= HP[tmp]) 
                        cur = tmp;
                    else {
                        int cnt = 1;
                        for(int i = tt+1;cnt <= 4;i++,cnt++) {
                            nn = (i+5)%5;
                            int n;
                            if(j == 0) 
                                n = r_maker[nn];
                            else 
                                n = b_maker[nn];
                            if(left >= HP[n]) {
                                cur = n;
                                flag = 1;
                                break;
                            }
                        }
                        if(cnt == 5) {
                            printf("%03d ",T);
                            delete P;
                            continue;
                        }
                    }
                    //创建这个士兵并做好相应数据的记录
                    printf("%03d ",T);
                    P->make(j,cur);
                    if(flag) order[j] = nn+1;
                    else order[j]++;//当前阵营下一个要创造的武士 
                }
            }
        }
    } 
    return 0;
}



 

 

c++mooc平台第五章小测

标签:stop   style   friend   标记   tin   keyword   编写   输出   first   

原文地址:https://www.cnblogs.com/gongsuiqing/p/12996857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!