【C++ 系列文章 -- 程序员考试 201811 下午场 C++ 专题 】

1.1 C++ 题目六

阅读下列说明和C++代码,填写程序中的空(1) ~(5),将解答写入答题纸的对应栏内。

【说明】
以下C++代码实现一个简单乐器系统,音乐类(Music)可以使用各类乐器(Instument)进行演奏和调音等操作。对部分乐器进行建模,其类图如图6-1所示,包括:乐器(Instrument)、打击乐器(Perussion)、 弦乐器(Stringed)、 管乐器( Wind)、木管乐器(Woodwind)、铜管乐器(Brass )。
在这里插入图片描述

#include<iostream>
#include<vector>
using namespace std;
enum Note{     /*枚举各种高调*/
    MIDDLE_C,C_SHARP,B_FLAT //其它略
}class Instrument {     /*抽象基类,乐器*/
    public:
         ( 1 )    ; //纯虚函数play
         virtual void adjust()=0; //adjust函数接口
};

class Wind:( 2 ) {
    public:
    void play(Note n){cout<< "Wind.play() "<<n<<endl; }
    void adjust(){cout<< "Wind.adjust() "<<endl; }
}/*类Percussion 和Stringed实现代码略*/

class Brass: (  3  ) {
    public:
        void play(Note n){cout<< "Brass.play() "<<n<<endl: }
        void adjust(){cout<< "Brass.adjust() "<<endl; }
};

class Woodwind:public Wind {
    public:
        void play(Note n){cout<< "Woodwind.play() "<<n<<endl: }
};

class Music{
    public:
        void tune(Instrument*i){ i->play(MIDDLE_C); }
        void adjust(Instrument*i){ i->adjust(); }
        void tuneAll( ( 4 ) v  )        {      /*为每个乐器定调*/
            vector<Instrument*>::iterator it;
            for(it=v.begin();it!=v.end();it++)  {
                    this->adjust(*it);
                    this->tune(*it);
            }
        }
}int main()
{
     ( 5 )   music=new Music();
    vector<Instrument*>orchestra;
    orchestra.push_back(new Wind());
    music->tuneAll(orchestra);
} 

1.1.1 填空(1)

由于空(1)已经注释为 存虚函数,所以我们知道,这个函数肯定会在它的子类中实现,所以只需要到子类中找到该该函数的参数类型及返回值类型即可。

class Instrument{     /*抽象基类,乐器*/
    public:
         ( 1 )    ; //纯虚函数play
         virtual void adjust()=0; //adjust函数接口
};

class Wind:   ( 2 )    {
    public:
    void play(Note n){cout<< "Wind.play() "<<n<<endl; }
    void adjust(){cout<< "Wind.adjust() "<<endl; }
}

所以空(1)virtual void plya(Note) { }=0;,因为类Wind 基层基类Instrument

1.1.2 填空(2)

由于类Wind 中实现了 类Instrucment 中定义的存虚函数,所以我们可以知道,WindInstrucment 的子类,所以空(2)应该填继承方式:public Instrument

1.1.3 填空(3)

有题目总中给出的图,我们也可以知道 BrassWind子类,所以空(3)也应该填写继承方式public Wind

class Wind:   ( 2 )    {
    public:
    void play(Note n){cout<< "Wind.play() "<<n<<endl; }
    void adjust(){cout<< "Wind.adjust() "<<endl; }
}/*类Percussion 和Stringed实现代码略*/

class Brass:    (  3  )    {
    public:
        void play(Note n){cout<< "Brass.play() "<<n<<endl: }
        void adjust(){cout<< "Brass.adjust() "<<endl; }
};

1.1.4 填空(4)

代码中可以看到Music 是一个基类,tuneAll((4)v)是一个成员函数,无法从上面代码得到有用信息,所以只能从函数内容获取有用信息,函数内部用到了类Instrument

class Music {
    public:
        void tune(Instrument*i){ i->play(MIDDLE_C); }
        void adjust(Instrument*i){ i->adjust(); }
        void tuneAll( ( 4 ) v  )        {      /*为每个乐器定调*/
            vector<Instrument*>::iterator it;
            for(it=v.begin();it!=v.end();it++)  {
                    this->adjust(*it);
                    this->tune(*it);
            }
        }
}

vector<Instrument*>::iterator it定义了一个迭代器it,这个迭代器用于遍历一个存储了Instrument指针vector容器。下面是对这个表达式的详细解释:

  • vector<Instrument*>:这是一个存储了 Instrument 类型指针的 vector容器。Instrument*是指向 Instrument类型对象的指针。
  • iterator:这是 vector 容器的一个内置类型,它是一个迭代器类型,用于遍历vector容器中的元素。
  • it:这是迭代器的实例的名称。

迭代器提供了一个统一的接口,用于访问容器中的元素,和这些元素的读取、修改等操作。在很多方面,迭代器的行为类似于指针。

由上面内容可以知道空(4)应该是一个向量指针,向量的类型为Instrument , 所以空(4)应该填 vector<Instrument*>

1.1.4.1 C++ vector

学习向量之前先了解下 什么是STL?

  • 1、STL(Standard Template Library),即标准模板库,是一个高效的C++程序库包含了诸多常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。

  • 2、从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)。在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。

  • 3、从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,基于模板(template)。

STL有六大组件,但主要包含容器迭代器和算法三个部分。

  • 容器(Containers):用来管理某类对象的集合。每一种容器都有其优点和缺点,所以为了应付程序中的不同需求,STL 准备了七种基本容器类型。
  • 迭代器(Iterators):用来在一个对象集合的元素上进行遍历动作。这个对象集合或许是个容器,或许是容器的一部分。每一种容器都提供了自己的迭代器,而这些迭代器了解该种容器的内部结构。
  • 算法(Algorithms):用来处理对象集合中的元素,比如 Sort,Search,Copy,Erase 那些元素。通过迭代器的协助,我们只需撰写一次算法,就可以将它应用于任意容器之上,这是因为所有容器的迭代器都提供一致的接口。

STL
的基本观念就是将数据和操作分离。数据由容器进行管理,操作则由算法进行,而迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作。这一篇博客暂时只介绍容器,下一篇介绍迭代器。

容器用来管理某类对象。为了应付程序中的不同需求,STL 准备了两类共七种基本容器类型

  • 序列式容器(Sequence containers),此为可序群集,其中每个元素均有固定位置—取决于插入时机和地点,和元素值无关。如果你以追加方式对一个群集插入六个元素,它们的排列次序将和插入次序一致。STL提供了三个序列式容器
    • 向量(vector)、
    • 双端队列(deque)、
    • 列表(list),
    • 此外你也可以把 string 和 array 当做一种序列式容器。
  • 关联式容器(Associative containers),此为已序群集,元素位置取决于特定的排序准则以及元素值,和插入次序无关。如果你将六个元素置入这样的群集中,它们的位置取决于元素值,和插入次序无关。STL提供了四个关联式容器:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。
1.1.4.2 vector(向量)

它是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而 vector 正好弥补了这个缺陷,当内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。

C++的初始化方法很多,各种初始化方法有一些不同。

  • (1): vector<int> ilist1;
    默认初始化,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。

  • (2): vector<int> ilist2(ilist);
    vector<int> ilist2 = ilist;
    两种方式等价 ,ilist2 初始化为ilist 的拷贝,ilist必须与ilist2 类型相同,也就是同为int的vector类型,ilist2将具有和ilist相同的容量和元素

  • (3): vector<int> ilist = {1,2,3.0,4,5,6,7};
    vector<int> ilist {1,2,3.0,4,5,6,7};
    ilist 初始化为列表中元素的拷贝,列表中元素必须与ilist的元素类型相容,本例中必须是与整数类型相容的类型,整形会直接拷贝,其他类型会进行类型转换。

  • 4): vector<int> ilist3(ilist.begin()+2,ilist.end()-1);
    ilist3初始化为两个迭代器指定范围中元素的拷贝,范围中的元素类型必须与ilist3 的元素类型相容,在本例中ilist3被初始化为{3,4,5,6}

  • 5): vector<int> ilist4(7);
    默认值初始化,ilist4中将包含7个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此ilist4被初始化为包含7个0。

  • (6):vector<int> ilist5(7,3);
    指定值初始化,ilist5被初始化为包含7个值为3的int

1.1.5 填空(5)

从下面代码中可以看到,在main 函数中创建了一个类型为Instrument*的向量orchestra, 然后通过push_back(new Wind())它向向量orchestra中插入元素。再调用成员函数tuneAll,由于这个函数只在Music 类中实现的,所以空(5)应该填Music *

int main()
{
     ( 5 )   music=new Music();
    vector<Instrument*>orchestra;
    orchestra.push_back(new Wind());
    music->tuneAll(orchestra);
} 

pop_back()&push_back(elem)实例在容器最后移除和插入数据,如下:

#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
 
int main()
{
    vector<int>obj;//创建一个向量存储容器 int
    for(int i=0;i<10;i++) // push_back(elem)在数组最后添加数据 
    {
        obj.push_back(i);
        cout<<obj[i]<<",";    
    }
 
    for(int i=0;i<5;i++)//去掉数组最后一个数据 
    {
        obj.pop_back();
    }
 
    cout<<"\n"<<endl;
 
    for(int i=0;i<obj.size();i++)//size()容器中实际数据个数 
    {
        cout<<obj[i]<<",";
    }
 
    return 0;
}

输出结果为

0,1,2,3,4,5,6,7,8,9,

0,1,2,3,4,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/111728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

防雷接地测试方法完整方案

防雷接地是保障电力系统、电子设备和建筑物安全的重要措施&#xff0c;防雷接地测试是检验防雷接地装置是否合格的必要手段。本文介绍了防雷接地测试的原理、方法和注意事项&#xff0c;以及如何编写防雷接地测试报告。 地凯科技防雷接地测试的原理 防雷接地测试的基本原理是…

驱动开发11 编写iic驱动-读取温湿度数据

头文件 head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define GET_HUM _IOR(m, 1, int) #define GET_TEM _IOR(m, 0, int) #endif 应用程序 si7006.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #inc…

高效学习工具之AnkiMobile新手入门指南(ios端,包括ipad、ihpone设备)————创建、使用、备份、设置参数、相关资料

文章目录 0 背景0.1 闭环学习0.2 什么是anki0.3 anki践行者经验分享 1 开始使用1.1 导入1.2 创建空白组1.3 创建卡片1.3.1 利用anki创建卡片的两种方法1.3.2 复习材料分类 1.4 筛选&#xff08;做减法&#xff0c;拆分学习&#xff08;做子卡牌集合&#xff09;&#xff09;&am…

4.1 继承

思维导图&#xff1a; 第4章 面向对象(下) 学习目标: 了解面向对象中的继承特性&#xff0c;掌握继承的概念与特点。掌握方法的重写&#xff0c;能够在子类中重写父类方法。掌握super关键字&#xff0c;明白如何在类中使用super访问父类成员。理解final关键字的作用&#xff0…

微信小程序如何使用地球半径计算两组经纬度点之间的距离(自身位置与接口返回位置)【上】

目录 1.配置位置权限 2.获取当前自身经纬度 3. 请求接口拿到返回经纬 4. 循环取每一项的经纬 5.如何判断是否打开了定位权限 6.进行距离计算操作 7.运行效果 8.完整代码 首先在使用小程序时&#xff0c;请求的接口一定要去配置合法域名&#xff0c;才能够进行接下来…

缓存击穿只会逻辑过期 OR 互斥锁?深入思考 == 鹤立鸡群

网上但凡看得见的文章&#xff0c;大部分在说缓存穿透时都是无脑分布式锁 / 逻辑过期&#xff0c;分布式锁一点问题都没有么&#xff1f;逻辑过期一点问题都没有么&#xff1f;还能不能再进一步优化&#xff1f; 在聊聊缓存击穿的双重判定锁之前&#xff0c;我们将按照循循渐进…

双十一首日捷报 | 德施曼率先破亿,再度蝉联智能锁品类第一

10月31日晚8:00&#xff0c;各大平台迎来了双十一第一波现货开售。其中&#xff0c;在智能锁类目中德施曼势头最为迅猛&#xff0c;此前&#xff0c;德施曼凭借“全民换锁季”主题活动&#xff0c;在预售期间就已经全面引爆消费者换锁热潮&#xff0c;随着此次现货开售&#xf…

cut 命令

cut [选项参数] filename #默认分隔符是制表符 选项参数&#xff1a; -d delimiter 分隔符 -f field 场地、领域&#xff08;第几列&#xff09; 命令使用&#xff1a; cut -d " " -f 1 cut.txt #空格为分隔符截取第1列cut -d " " -f 2,3 cut.txt #截…

百度上传自己个人简介攻略,个人介绍百度百科怎么做?

个人介绍要展示在百度百科上该怎么操作&#xff0c;我们都清楚百度百科词条是需要申请才能拥有的&#xff0c;但是没有百度上传自己个人简介的攻略&#xff0c;很多人是不知从何下手的。下面洛希爱做百科网带着大家一起来了解。 一、了解百度百科词条的创建规则 1. 词条名称规…

jdk官网下载(详细步骤)

jdk全部版本下载网址 Java Archive | Oraclehttps://www.oracle.com/java/technologies/downloads/archive/ 下载之前先建立oracle账号(免费创建)&#xff0c;不用特意去搜&#xff0c;你点击下载jdk的时候会自动弹出来&#xff0c;自己建立一个账号就能下载了 找到自己要下载…

【产品体验】OA办公系统

一、演示地址 http://admin.dianshixinxi.com:90/index 二、办公管理功能 1.我的待办&#xff1a;当前登录用户&#xff0c;办理任务 2.通知公告&#xff1a;通知与公告&#xff0c;已发布通知公告会显示在首页 3.自定义表单&#xff1a;自定义表单&#xff0c;托拉拽的形式…

iZotope RX 10(音频修复和增强工具)

iZotope RX 10是一款音频修复和增强软件&#xff0c;主要特点包括&#xff1a; 声音修复&#xff1a;iZotope RX 10可以去除不良噪音、杂音、吱吱声等&#xff0c;使音频变得更加清晰干净。音频增强&#xff1a;iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等…

IDEA 使用技巧

文章目录 语言支持简化编写 有问题&#xff0c;可暂时跳过 个人常用快捷键插件主题插件功能插件 碰到过的问题 除了一些在Linux上用vim开发的大佬&#xff0c;idea算是很友好的集成开发工具了&#xff0c;功能全面&#xff0c;使用也很广泛。 记录一下我的 IDEA 使用技巧&#…

解密人工智能:KNN | K-均值 | 降维算法 | 梯度Boosting算法 | AdaBoosting算法

文章目录 一、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 二、KNN三、K-均值四、降维算法五、梯度Boosting算法和AdaBoosting算法六、结语 一、机器学习算法简介 机器学习算法是一种基于数据和经验的算法&#xff0c;通过对大量数据的学习和分析&…

虹科示波器 | 汽车免拆检修 | 2013款大众途观车发动机加速无力

一、故障现象 一辆2013款大众途观车&#xff0c;搭载CGM发动机&#xff0c;累计行驶里程约为12.6万km。车主进厂反映&#xff0c;发动机加速无力。 二、故障诊断 接车后试车&#xff0c;发动机怠速运转正常&#xff1b;原地将加速踏板踩到底&#xff0c;发动机转速最高只能达到…

AQS面试题总结

一&#xff1a;线程等待唤醒的实现方法 二&#xff1a; 介绍一下LockSupport 三&#xff1a;AQS是什么 AQS使用一个volatile的int类型的成员变量来表示同步状态&#xff0c;通过内置的FIFO队列完成资源获取排队工作&#xff0c;将每条要去抢占资源的线程封装成一个NODE节点来…

抛开八股——实际业务下如何设计缓存与数据库一致性解决方案

前言 对于缓存与数据库一致性的八股文也是老生常谈了&#xff0c;但是所谓没有最好的方案&#xff0c;只有最合适的方案&#xff0c;如果我们一味的去硬啃八股文&#xff0c;很容易就丧失了对于业务的基本分析能力&#xff0c;更别说针对业务来设计出合理合适的解决方案&#x…

Flutter笔记:完全基于Flutter绘图技术绘制一个精美的Dash图标(下)

Flutter笔记 完全基于Flutter绘图技术绘制一个精美的Dart吉祥物Dash 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/arti…

2015年亚太杯APMCM数学建模大赛A题海上丝绸之路发展战略的影响求解全过程文档及程序

2015年亚太杯APMCM数学建模大赛 A题 海上丝绸之路发展战略的影响 原题再现 一带一路不是实体或机制&#xff0c;而是合作与发展的理念和主张。凭借现有有效的区域合作平台&#xff0c;依托中国与有关国家现有的双边和多边机制&#xff0c;利用古丝绸之路的历史象征&#xff0…

如何看待将本增效?

如何看待将本增效&#xff1f; 么是降本增效&#xff1f;就是公司里&#xff0c;增进收益的动作要多做&#xff0c;无效的动作要少做&#xff0c;甚至不做。什么叫有效&#xff1f;回到公司的经营目标上去&#xff0c;企业的管理就是目标管理。降本&#xff0c;需要卓越运营&a…