張秀梅 王文君 沈熙



摘? 要: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
第2種:value_type---mapname.insert(map
第3種:"array"方式---mapname[key] = value;
(2)map刪除與清空元素的三種方式:
第1種:用關鍵字刪除---Type de= mapname.erase("key");
第2種:迭代器刪除---Map
第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? 結? 論
在線程序評測系統目前已成為程序教學中不可或缺的先進手段。學生按照題目要求編寫程序并提交源代碼,評測系統編譯運行程序?;赟TL綜合案例的設計,不僅完善了在線測試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—),女,漢族,遼寧鞍山人,講師,碩士研究生,研究方向:中文信息處理。