APP下载

基于STL容器的C++课程综合案例的设计与实现

2020-08-14张秀梅王文君沈熙

现代信息科技 2020年8期
关键词:程序设计容器

张秀梅 王文君 沈熙

摘  要:C++程序设计是软件工程专业的专业基础课,也是程序设计的入门课程,从2014年开始对课程进行教与学模式改革,主要做法有精讲理论、强化实践、注重编程能力,文章从实际应用的角度,精选一定的实际案例,通过运用STL的几个容器进行编写综合案例,意在提高学生的编程能力和调试程序的能力,为后续的软件项目开发的系列课程学习打好基础。

关键词:C++程序设计;容器;综合案例;常规血型;幻方

Abstract:C++ program design is a professional basic course in software engineering,is also an introductory course of program design,starting from 2014 mode of teaching and learning reform of the course,the main methods include elaborating theory,strengthening practice and paying attention to programming ability,from the point of view of practical application,this paper selected some actual cases,using STL (standard template library) to write a few container integrated case,intended to improve the ability of the studentsability of programming and debugging process,lay a good foundation for the following series of courses of software project development.

Keywords:C++ programming;container;comprehensive cases;conventional blood type;magic square

0  引  言

STL(標准模板库)是一个高效的C++程序库,它包含了许多计算机科学领域里所常用的基本数据结构和基本算法。STL是现代C++的精髓,可以说,不会STL很难称得上掌握了现代C++编程,STL是一种类型参数化的程序设计方法,通过STL的使用可以更好地实现代码复用。在STL程序设计中,容器(container)就是通用的数据结构。容器用来承载不同类型的数据对象,就如同现实生活中,人们使用容器用来装载各种物品一样,但C++中的容器还存在一定的数据加工能力,它如同一个对数据对象进行加工的模具,可以把不同类型的数据放到这个模具中进行加工处理,形成具有一定共同特性的数据结构[1-4]。

1  基础知识介绍

1.1  vector

C++面向过程部分存储一组相同类型的数据可以用一维数组来实现,STL中的vector在内存中占有一块连续的空间,存储一个元素序列,可以实现数组的功能,但当需要增加数据元素时,可以直接从vector容器尾端插入,所以vector可以看作一个可自动扩充的动态数组,是一个封装好的类,而且它提供越界检查,并可用[]运算符直接存取数据。

1.2  map

map是STL的一个关联容器,是由{键(key),值(value)}对组成,并且元素按键排列的集合。第一个可以称为关键字(key),每个关键字只能在map中出现一次,第二个则称为该关键字的值(value)。其中key和value可以是任意需要的类型,map容器将数据元素存储在一个有序的、类似于树的数据结构中。以下分别是关于map的两个核心操作:插入和删除。

(1)map数据插入有三种方式:

第1种:pair---mapname.insert(pair(key,value))

第2种:value_type---mapname.insert(map::value_ type(key, value))

第3种:"array"方式---mapname[key] = value;

(2)map删除与清空元素的三种方式:

第1种:用关键字删除---Type de= mapname.erase("key");

第2种:迭代器删除---Map::iteratoriter = mapname.find("key"); mapname.erase(iter);

第3种:用迭代器范围删除---mapname.erase(mapname.begin(),mapname.end());//等同于mapname.clear()

另外,set是一个没有重复的元素,并且元素按有序的方式存储的集合,基本操作与map相似。

利用STL中容器已经定义的算法和迭代器,可以方便灵活地存取容器中存储的各种数据元素。

2  综合案例的设计

目前,学院的Online Judge System软件平台(简称“OJ平台”)上的实验项目数量虽近150个,能够体现各个教学知识点,但并不能满足不同层次学生的需求,尤其缺少STL部分的实验项目,鉴于此,选取贴近生活的案例,适合初学STL,并可以了解其使用的实验项目。

案例一:根据常规的血型配对表(如表1所示),选取合适的STL中的容器进行设计。

分析血型配对表,它由三部分构成,起主导作用的父母双亲的血型、分别会得到的子女可能或不可能的血型。对于父母双亲的血型采用容器向量vector进行存储,对于子女可能出现的血型和不应该出现的血型个数是不确定的,因此采用集合Set进行存储,最后将父母血型和子女可能或不可能的血型三部分封装起来采用map容器进行存储。

案例二:利用vector定义Matrix(矩阵类),实现奇偶幻方的显示。

C++中矩阵用二维数组来实现,本案例要求利用现成的STL容器来定義一个新的类,并对其进行测试检验。测试时需要输出一个奇偶幻方,而幻方是指将1到n2个数字所组成的n*n阶方阵,每条对角线,每行与每列的数字和都相等,并且和为n*(n2+1)/2。奇数幻方(如表2所示)和奇偶幻方(如表3所示)。设计提示:首先采用公有继承vector定义一个矩阵类Matrix,并且实现输出运算符重载,然后运用定义好的矩阵类进行奇数幻方函数的编写,最后通过调用奇数幻方函数实现奇偶幻方的显示。

3  结  论

在线程序评测系统目前已成为程序教学中不可或缺的先进手段。学生按照题目要求编写程序并提交源代码,评测系统编译运行程序。基于STL综合案例的设计,不仅完善了在线测试OJ平台的实验项目,填充了STL这部分实验项目的空白,而且让学生对C++程序设计有了更进一步的认识,对面向对象思想有了更深的理解,甚至有的学生为了按时完成OJ平台实验项目的提交,能够提前预习新知识,这有利于引导学生主动去探索,培养学生学习兴趣,提高对后续数据结构课程的先知认识。

参考文献:

[1] kaizen.STL容器之map [EB/OL].(2017-02-21).https: //www.cnblogs.com/Braveliu/p/6427050.html.

[2] ParaFeel.常用容器Map的四种遍历方式 [EB/OL].(2017 -03-29).https://blog.csdn.net/wh4656438/article/details/ 68104507.

[3] Keyu_.C++ map容器用法 [EB/OL].(2018-09-22).https://blog.csdn.net/zhuochuyu7096/article/details/82817 197.

[4] WilliamYan12138.C++迭代器操作 [EB/OL].(2019-03 -29).https://blog.csdn.net/baidu_34884208/article/details/ 88362823.

[5] 沈显君,杨进才,张勇.C++语言程序设计教程:第3版 [M].北京:清华大学出版社,2015.

[6] 闫常友,王敏.C++ STL标准程序库开发指南:第2版 [M].北京:中国铁道出版社,2017.

作者简介:张秀梅(1978—),女,汉族,辽宁鞍山人,讲师,硕士研究生,研究方向:中文信息处理。

猜你喜欢

程序设计容器
基于OBE的Java程序设计个性化教学研究
基于Electron.js的风向玫瑰图绘制程序设计与实现
项目化教学在Python程序设计课程中的应用
C++程序设计课程教学改革研究
医学专业“Python程序设计”课程教学改革总结与思考
“C语言程序设计”课程混合教学探索
难以置信的事情
怎样量出4升水
从容器的形状看压强
液体对容器底及容器对桌面的压力和压强