c++面向对象整合练习

郭炜老师的程序设计与算法(三)期末考试,填空部分
时间:2019国庆
题目网址:http://cxsjsxmooc.openjudge.cn/2019t3summerfinal/
交流可以联系:luxiwen1999@gmail.com

——————————————————————————————————

掐点截图

1.进制转换

#include <iostream>
#include <string>
using namespace std;
string dec2bin(int x)
{
    string s="";
    string s1;
    while(x)
    {
        if(x%2)    s1="1";
        else    s1="0";
        x/=2;
        s=s1+s;
    }
    int l=s.size();
    string s2="";
    s2.append(31-l,'0');
    return s2+s;
}

int main(){
    int n;
    cin >> n;
    while(n--) {
        int x;
        cin >> x;
        cout << dec2bin(x) << endl;
    }
    return 0;
}

2.统计动物数量

#include <iostream>
using namespace std;
class Animal{
    public:
    static int number;
    Animal(){number++;};
    virtual ~Animal(){--number;};//使用虚析构,为了删除c2调用cat的析构
};
int Animal::number=0;

class Dog:public Animal{
public:
    static int number;//为什么静态数据成员设为私有就错了
    Dog(){++number;}
    ~Dog(){--number;}
};
int Dog::number=0;

class Cat:public Animal{
public:
    static int number;
    Cat(){++number;}
    ~Cat(){--number;}
};
int Cat::number=0;
void print() {//这里使用类内作用域限定符不能访问私有数据吗?
    cout << Animal::number << " animals in the zoo, " << Dog::number << " of them are dogs, " << Cat::number << " of them are cats" << endl;
}

int main() {
    print();
    Dog d1, d2;
    Cat c1;
    print();
    Dog* d3 = new Dog();
    Animal* c2 = new Cat;
    Cat* c3 = new Cat;
    print();
    delete c3;
    delete c2;
    delete d3;
    print();
}

3.简单的计算(模板+重载了圆括号)

#include <iostream>
using namespace std;
template <class T>
class Add{
public:
    T m;
    Add(T g):m(g){
    };
    T operator()(T a1,T a2){
        return a1+a2-m;
    }
};

int main(){
    double f;
    int n;
    while( cin >> f >> n) {

        Add<double> a1(f);
        Add<int> a2(n);
        double x,y;
        int p,q;
        cin >> x >> y >> p >> q;
        cout << a1(x, y) << endl;
        cout << a2(p, q) << endl;
    }
    return 0;
}

4.MyClass(复制构造函数,不过乘了个倍数是最佳方法吗?)

#include <iostream>
using namespace std;
class CMyClassA {
    int val;
public:
    CMyClassA(int);
    void virtual print();
};
CMyClassA::CMyClassA(int arg) {
    val = arg;
    printf("A:%d\n", val);
}
void CMyClassA::print() {
    printf("%d\n", val);
    return;
}
class CMyClassB:public CMyClassA{
    int val;
public:
    CMyClassB(int a):CMyClassA(3*a){
        val=a;printf("B:%d\n",val);
    }
    void print(){printf("%d\n",val);
    }
};
int main(int argc, char** argv) {
    CMyClassA a(3), *ptr;
    CMyClassB b(5);
    ptr = &a; ptr->print();
    a = b;
    a.print();
    ptr = &b; ptr->print();
    return 0;
}

5.又见MyClass

#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
// 在此处补充你的代码
template<class T>
class CMyClass{
    T* p;//*位置一开始打错了。。
    int m;
public:
    CMyClass(T* q,int i){
        p=new T[i+1];
        for(int j=0;j<i;++j)p[j]=q[j];
    };
    T operator[](int j){
        return p[j];
    }
};
int  a[40];
int main(int argc, char** argv) {
    int t;
    scanf("%d",&t);
    while ( t -- ) {
        int m;
        scanf("%d",&m);
        for (int i = 0;i < m; ++i)
            scanf("%d",a+i);
        char s[100];
        scanf("%s",s);
        CMyClass<int> b(a, m);
        CMyClass<char> c(s, strlen(s));
        printf("%d %c\n", b[5], c[7]);
    }
    return 0;
}

6.去除重复元素并排序(给出了set容器直接就能完成了。。不知道copy是干什么)

#include <iterator>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <stack>
#include <iostream>
#include <set>
using namespace std;

int main() {
    int t;
    int  a[100];
    cin >> t;
    while(t--) {
        for(int i = 0;i < 12; ++i)
            cin >> a[i];
// 在此处补充你的代码
    set<int> b;
    int c[100];
    for(int i=0;i<12;++i)b.insert(a[i]);
    for(set<int>::iterator it=b.begin();it!=b.end();++it)cout<<*it<<" ";
std::copy(b.begin(), b.end(), c);
        cout << endl;

    }
    return 0;
}

8.还是Fun和Do(理顺继承关系以及函数的调用)

#include <iostream>
using namespace std;

class A {
    public:
        virtual void Fun() {
            cout << "A::Fun" << endl;
        };
        virtual void Do() {
            cout << "A::Do" << endl;
        }
};
class B:public A{
public:
//  void Fun(){
//      cout<<"B::Fun"<<endl;
//  }
    void Do(){
        cout<<"B::Do"<<endl;
    }
};

class C:public B{
public:
    void Fun(){
        cout<<"C::Fun"<<endl;
    }
    void Do(){
        cout<<"C::Do"<<endl;
    }
};
template<class T>
void Call1(T p)
{
    p.Fun();
    p.Do();
}
void Call2(B p) {
    p.Fun();
    p.Do();
}



int main() {
    C c;
    B b;
    Call1(b);
    Call1(c);
    Call2(c);
    return 0;
}

9.简单 的对象(常对象只能调用常成员函数)

#include <iostream>
using namespace std;
class A
{
    static int num;
public:
    A(){num+=1;}
    void func()
    {
        cout<< num <<endl;
    }
void func()const{
num--;cout<<num<<endl;}
};

int A::num=1;

int main()
{
    A a1;
    const A a2 = a1;
    A & a3 = a1;
    const A & a4 = a1;

    a1.func();
    a2.func();
    a3.func();
    a4.func();

    return 0;
}

10.回调函数(这几题挺简单。。库给的好多啊)

#include <algorithm>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cmath>
#include <map>
#include <set>

using namespace std;
class MyFunc
{
int c;

public:
MyFunc(int i):c(i){};
int operator()(int m){
return pow(m,c);
};
};
int main()
{
    int n;
    cin >> n;
    while(n--) {
        vector<MyFunc> v;
        for (int i = 0; i < 5; ++i)
            v.push_back(MyFunc(i+1));
        int ans = 1;
        for (int i = 0; i < 5; ++i)
        {
            int m;
            cin >> m;
            ans += v[i](m);
        }
        cout << ans <<endl;
    }
}

11.前k大的偶数(熟练掌握容器真的方便)

#include <algorithm>
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <string>
#include <map>
#include <set>

using namespace std;
class MyQueue
{
// 在此处补充你的代码
int k;
public:
    vector<int> s;
    MyQueue(int m):k(m){
    };
    friend void operator>>(istream &i,MyQueue &q){
        int t;i>>t;q.s.push_back(t);
    }
    friend void operator<<(ostream &o,MyQueue &q){
        sort(q.s.begin(),q.s.end());
        int l=q.s.size();
        typename vector<int>::iterator it=q.s.end();
        for(int i=0;i<q.k;++i){
            --it;
            if(*it%2==0)o<<*it<<" ";
            else --i;
        }
    }

};
int main()
{
    int t;
    cin >> t;
    while(t--) {
        int n, k;
        cin >> n >> k;
        MyQueue q(k);
        for (int i = 0; i < n; ++i)
            cin >> q;
        cout<<q;
        cout << endl;
    }
    return 0;
}

12.Printer(遍历执行遍函数)

#include<iostream>
#include<algorithm>
#include<vector>
#include<bitset>

using namespace std;


class Printer{
public:
    int x;
    Printer(int _x):x(_x){}
    void operator()(int a) {
        if (a > x)
            cout << a << ",";
    }
    void operator()(string a) {
        if (a.length() > x)
            cout << a << ",";
    }
};
int main(){

    int t;
    cin >> t;
    while(t--) {
        int n,x;
        cin>>x>>n;
        
        vector<int> intVec;
        for(int i = 0;i < n; ++i) {
            int y;
            cin >> y;
            intVec.push_back(y);
        }
        for_each(intVec.begin(), intVec.end(), Printer(x));
        cout<<endl;
        
        vector<string> strVec;
        for(int i = 0;i < n; ++i) {
            string str;
            cin >> str;
            strVec.push_back(str);
        }
        for_each(strVec.begin(), strVec.end(), Printer(x));
        cout<<endl;
    }
    return 0;
}

13.三生三世(这题很像奥运排序,可以改进奥运排序,有函数类)

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

class TV_Drama{
    public:
    char name[100];
    int actor;
    int story;
    int acting_skill;
TV_Drama(char *_name, int _actor, int _story, int _ac) :actor(_actor), story(_story), acting_skill(_ac) {
        int len = 0;
        for (int i = 0; _name[i] != '\0'; i++) {
            name[i] = _name[i];
            len++;
        }
        name[len] = '\0';
    }
    bool operator<(TV_Drama&l) {
        return actor > l.actor;
    }
};
void Printer(TV_Drama x) {
    cout << x.name << ";";
}
bool comparator_1(TV_Drama &x1,TV_Drama &x2) {
    return x1.story > x2.story;
}
class comparator_2{
public:
    comparator_2() {}
    bool operator() (TV_Drama &x1, TV_Drama &x2) {
        return x1.acting_skill > x2.acting_skill;
    }
};
int main(){
    list<TV_Drama> lst;
    int n;
    
    cin>>n;
    char  _name[100];
    int _actor, _story, _acting_skill;
    for (int i=0; i<n; i++){
        cin.ignore();
        cin.getline(_name,100);
        cin>>_actor>>_story>>_acting_skill;
        lst.push_back(TV_Drama(_name, _actor, _story, _acting_skill));
    }

    lst.sort();
    for_each(lst.begin(), lst.end(), Printer);    
    cout<<endl;

    lst.sort(comparator_1);
    for_each(lst.begin(), lst.end(), Printer);    
    cout<<endl;

    lst.sort(comparator_2());
    for_each(lst.begin(), lst.end(), Printer);    
    cout<<endl;

    return 0;
}

14.又见模板

#include <iostream>
#include <string>
using namespace std;
template<class T,int n>
class A{
T* p;
public:
A(T* b){
    p=new T[n+1];//一开始遗漏这句开辟空间,使得后面虽然可以通过地址访问,但是sum出错
    for(int i=0;i<n;++i)p[i]=b[i];
}

T operator[](int i){return p[i];}

T sum(){T s=p[0];//这里要注意给出它的初值,如果不,会出错
for(int i=1;i<n;++i)s+=p[i];
return s;
}
};

int main() {

    int t;
    cin >> t;
    while( t -- ) {
        int b1[10];
        for(int i = 0;i < 10; ++i)

            cin >> b1[i];
        A<int, 10> a1 = b1;//这里的=调用的还是构造函数
        cout << a1[2] << endl;


        double b2[5] ;
        for(int i = 0;i < 5; ++i)
            cin >> b2[i];

        A<double, 5> a2 = b2;
        cout << a2.sum() << endl;


        string b3[4] ;
        for(int i = 0;i < 4; ++i)
            cin >> b3[i];

        A<string, 4> a3 = b3;
        cout << a3.sum() << endl;
    }
    return 0;
}

15.矩形排序(自定义容器的比较函数,要使用友元<,友元函数类)

#include <iostream>
#include <set>
using namespace std;
// 在此处补充你的代码
class Rectangle{
    int a,b;
    
public:
    int m,c;
    Rectangle(int _a,int _b):a(_a),b(_b){
        m=a*b;c=2*(a+b);
    };
    friend bool operator<(const Rectangle& u,const Rectangle& r){
        if(u.m==r.m)return u.c>r.c;
        else
            return u.m>r.m;
    }
    //friend class Comp;
    friend ostream& operator<<(ostream &o,const Rectangle &a){
        o<<a.m<<" "<<a.c;
        return o;
    }
    
};
struct Comp{
bool operator()(const Rectangle &a,const Rectangle &b){
    if(a.c==b.c)return a.m<b.m;
    else
        return a.c<b.c;
}
};

int main() {
    multiset<Rectangle> m1;
    multiset<Rectangle, Comp> m2;
    int n, a, b;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a >> b;
        m1.insert(Rectangle(a, b));
        m2.insert(Rectangle(a, b));
    }
    for (multiset<Rectangle>::iterator it = m1.begin(); it != m1.end(); it++) {
        cout << *it << endl;
    }
    cout << endl;
    for (multiset<Rectangle>::iterator it = m2.begin(); it != m2.end(); it++) {
        cout << *it << endl;
    }
    return 0;
}

16.维护平面点
这题放在最后一题,应该是新题,毫无资料。果然在思考怎样给pair排序时想了很久。
最后选择将以右下为小方向,分开判断是正常情况,还是带-1的查找情况

#include <set>
#include <iostream>
#include <string>
using namespace std;
// 在此处补充你的代码
struct myComp{
    bool operator()(const pair<int,int> &a,const pair<int,int> &b){
        //小于判断谁在右下方,因为数据保证,此处可以简单点,只判断x
        //这样不行,查询的时候,数据显然不满足,因为-1的干扰
        if(a.first>0&&a.second>0&&b.first>0&&b.second>0){
            return a.first>b.first;
        }
        else{
            if(a.first<0||b.first<0){
                return a.second<b.second;
            }
            else if(a.second<0||b.second<0){
                return a.first>b.first;
            }
        }
    }
};
int main() {
    string cmd;
    set<pair<int, int>, myComp> S;
    while (cin >> cmd) {
        if (cmd == "A") {
            int x, y;
            cin >> x >> y;
            S.insert(make_pair(x, y));
        } else if (cmd == "Qx") {
            int x;
            cin >> x;
            cout << S.lower_bound(make_pair(x, -1))->second << endl;
        } else if (cmd == "Qy") {
            int y;
            cin >> y;
            cout << S.lower_bound(make_pair(-1, y))->first << endl;
        } else {
            int x, y;
            cin >> x >> y;
            S.erase(make_pair(x, y));
        }
    }
    return 0;
}

7.按要求输出(选对容器map即完,话说。。map的迭代器在元素更改之后仍然有效,真不错)

#include <iterator>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <stack>
#include <iostream>
#include <set>
using namespace std;
int  a[10] = {0, 6, 7, 3, 9, 5, 8, 6, 4, 9};
int  b[10] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
int main(int argc, char** argv) {

    map<int, int>c;
    map<int, int>::iterator it;
for(int i=0; i<10; i++) 
        c[a[i]] = b[i];
    for(it=c.begin(); it!=c.end(); it++) 
        cout<<it->second<<" ";
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容