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

news2025/2/25 0:38:52

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,

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装2023年10月更新后,继续在Win10上使用IE的方法

简介 由于微软一直试图让Win10的用户迁移到Edge浏览器&#xff0c;因此不断地对Win10上的IE使用加以限制。 先前我们还可以通过金庸IEToEdge BHO的方式继续使用IE。 通过禁用IEToEdge BHO&#xff0c;禁止IE自动跳转&#xff08;重定向&#xff09;到EDGEhttps://blog.csdn.…

5.2 参照完整性

思维导图&#xff1a; 5.2.1 定义参照完整性 5.2 参照完整性笔记&#xff1a; 一、概念 参照完整性 (Referential Integrity)&#xff1a;确保关系数据库中的数据表间的关系始终保持一致性。外键 (Foreign Key)&#xff1a;一个表中的列或列组&#xff0c;用于标识另一个表中…

QMI8658A_QMC5883L(9轴)-EVB 评估板-使用说明书

文章目录 0.前言 1.硬件准备 1.1 I2C 接口 1.2 USART 接口 2.运行程序 2.1 QMI8658A 常值零偏校准 2.2 QMC5883L地磁传感器校准 2.3 校准步骤 3.与 example-algo-visualizer.exe 上位机通信协议 0.前言 【相关博文】 【QMI8658 - 姿态传感的零偏(常值零偏)标定】 【QMC5883L-磁…

计算机毕业设计选题推荐-大学生心理健康测评微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

[学习笔记]TypeScript查缺补漏(二):类型与控制流分析

文章目录 类型约束基本类型联合类型 控制流分析instanceof和typeof类型守卫和窄化typeof判断instanceof判断in判断内建函数&#xff0c;或自定义函数赋值布尔运算 保留共同属性 字面量类型&#xff08;literal type&#xff09;as const 作用 类型约束 TypeScript中的类型是一…

产品经理一定要学会的原型交互规范设计

一、主级按钮 序号1、序号2&#xff1a;主级按钮 一个按钮区最多一个主级按钮&#xff0c;也可以没有 二、线框按钮 序号3&#xff1a;如果不是非常为了突出“完成”、“推荐”的操作&#xff0c;可以多采用线框按钮 三、红色按钮 序号4&#xff1a;红色按钮不需要选中颜色这…

Vue3.0插槽:VOA模式

用法&#xff1a; 父组件App.vue <template><div><!--将html代码插入到子组件中带默认名称的插槽中--><AChild><!--这段html会插入到AChild组件中<slot></slot>插槽中--><!-- 注意&#xff1a;写在父组件中的html代码只能在父组…

Redis之持久化(RDB和AOF)

文章目录 前言一、RDB1.介绍2.redis.config有关配置3.触发4.恢复5.优缺点 二、AOF1.介绍2.redis.config配置3.启动4.恢复5.重写6.优缺点 总结 前言 Redis 是内存数据库&#xff0c;即数据存储在内存。 如果不将内存中的数据保存到磁盘&#xff0c;一旦服务器进程退出&#xff…

uniapp js-sdk插件之js实用工具包

插件介绍 插件为uniapp前端js工具包&#xff0c;工具包包含了众多模块&#xff0c;数组、颜色、日期、加解密、函数、数字、对象、请求、字符串、验证等模块&#xff0c;可以让您的开发得心应手&#xff0c;不需要为了一个功能需要花费大量的时间从网上再去搜索&#xff0c;本…

什么是覆盖索引?

覆盖索引是指一个索引包含了查询语句所需的所有数据&#xff0c;不仅能够提供索引的搜索能力&#xff0c;还可以完全覆盖查询需求&#xff0c;避免了回表操作&#xff08;即根据索引查找到主键&#xff0c;再根据主键获取数据的额外操作&#xff09;&#xff0c;从而提高查询性…

【AI数学】三维视觉中的四种坐标系

三维视觉中&#xff0c;需要掌握四种坐标系&#xff1a;世界坐标系、相机视角坐标系、NDC坐标系、屏幕坐标系。 世界坐标系&#xff08;World coordinate system&#xff09; 物体或者场景在真实世界中的位置。 相机视角坐标系&#xff08;Camera view coordinate system&…

数字孪生技术:强化紧急响应与决策

随着科技的不断进步&#xff0c;数字孪生技术已经逐渐渗透到了各个行业&#xff0c;其中包括了灾害管理领域。在灾害管理中&#xff0c;数字孪生提供了极大的帮助&#xff0c;使决策者更好地理解和应对各种灾害&#xff0c;包括自然灾害和人为灾害。本文带大家一起探索数字孪生…

WhatsApp Business为什么会被封号?该如何解决

目前&#xff0c;作为全球即时通讯领域的重要平台之一的WhatsApp已成为企业在营销和与客户沟通时的首选工具。但是长时间、高强度的营销行为很容易导致WhatsApp Business账户突然被封禁&#xff0c;无法再使用账号。即使后续再去进行申诉&#xff0c;要求官方解封该账户&#x…

LeetCode----124. 二叉树中的最大路径和

题目 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回其 最大路径和 。 示…

延时摄影视频制作工具 LRTimelapse mac中文版特点介绍

lrTimelapse mac是一款适用于 Windows 和 macOS 系统的延时摄影视频制作软件&#xff0c;可以帮助用户创建高质量的延时摄影视频。该软件提供了直观的界面和丰富的功能&#xff0c;支持多种时间轴摄影工具和文件格式&#xff0c;并具有高度的可定制性和扩展性。 lrTimelapse ma…

计算机从内存中读取数组元素

在计算机中&#xff0c;我们可以把内存看成是一些排列好的格子&#xff0c;每个格子对应一个内存地址&#xff0c;那么数据会分散的存储在不同的格子中&#xff1a; 对于数组&#xff0c;计算机会在内存中为其申请一段连续的空间&#xff0c;并且会记下索引为0处的内存地址&…

HTML和CSS的基础-前端扫盲

想要写出一个网页&#xff0c;就需要学习前端开发&#xff08;写网页代码&#xff09;和后端开发&#xff08;服务器代码&#xff09;。 对于前端的要求&#xff0c;我们不需要了解很深&#xff0c;仅仅需要做到扫盲的程度就可以了。 写前端&#xff0c;主要用到的有&#xf…

大厂面试题-网络四元组

四元组&#xff0c;简单理解就是在TCP协议中&#xff0c;去确定一个客户端连接的组成要素&#xff0c;它包括源 IP地址、目标IP地址、源端口号、目标端口号。 正常情况下&#xff0c;我们对于网络通信的认识可能是这样(如图)。 服务端通过Server Socket建立一个对指定端口号…

WebDAV之π-Disk派盘 + 记得倒数日

推荐一款帮你记录一生中重要日子的倒计时App记得倒数日,帮您记录纪念日、生日、倒数日、正数日、传统节日、倒数拾光等,成为你生活小帮手,及时提醒你日子的到来,还支持连接葫芦儿派盘服务。 【记得倒数日特色】 1.一款实用的生活工具,记得日子致力于做优秀的倒数日。 2.结…

Python笔记——pyChram连接linux子系统,使用linux下的Python进行编译

Python笔记——pyChram连接linux子系统&#xff0c;使用linux下的Python进行编译 Linux子系统安装与配置安装前准备安装Linux子系统安装Python3.8配置pyCharm 最近要跑的实验里&#xff0c;python有个机器学习的库windows环境下是没有的&#xff0c;在linux环境下有。虚拟机又不…