張秀梅 王文君 沈熙
摘? 要:C++程序設(shè)計(jì)是軟件工程專業(yè)的專業(yè)基礎(chǔ)課,也是程序設(shè)計(jì)的入門(mén)課程,從2014年開(kāi)始對(duì)課程進(jìn)行教與學(xué)模式改革,主要做法有精講理論、強(qiáng)化實(shí)踐、注重編程能力,文章從實(shí)際應(yīng)用的角度,精選一定的實(shí)際案例,通過(guò)運(yùn)用STL的幾個(gè)容器進(jìn)行編寫(xiě)綜合案例,意在提高學(xué)生的編程能力和調(diào)試程序的能力,為后續(xù)的軟件項(xiàng)目開(kāi)發(fā)的系列課程學(xué)習(xí)打好基礎(chǔ)。
關(guān)鍵詞:C++程序設(shè)計(jì);容器;綜合案例;常規(guī)血型;幻方
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(標(biāo)準(zhǔn)模板庫(kù))是一個(gè)高效的C++程序庫(kù),它包含了許多計(jì)算機(jī)科學(xué)領(lǐng)域里所常用的基本數(shù)據(jù)結(jié)構(gòu)和基本算法。STL是現(xiàn)代C++的精髓,可以說(shuō),不會(huì)STL很難稱得上掌握了現(xiàn)代C++編程,STL是一種類型參數(shù)化的程序設(shè)計(jì)方法,通過(guò)STL的使用可以更好地實(shí)現(xiàn)代碼復(fù)用。在STL程序設(shè)計(jì)中,容器(container)就是通用的數(shù)據(jù)結(jié)構(gòu)。容器用來(lái)承載不同類型的數(shù)據(jù)對(duì)象,就如同現(xiàn)實(shí)生活中,人們使用容器用來(lái)裝載各種物品一樣,但C++中的容器還存在一定的數(shù)據(jù)加工能力,它如同一個(gè)對(duì)數(shù)據(jù)對(duì)象進(jìn)行加工的模具,可以把不同類型的數(shù)據(jù)放到這個(gè)模具中進(jìn)行加工處理,形成具有一定共同特性的數(shù)據(jù)結(jié)構(gòu)[1-4]。
1? 基礎(chǔ)知識(shí)介紹
1.1? vector
C++面向過(guò)程部分存儲(chǔ)一組相同類型的數(shù)據(jù)可以用一維數(shù)組來(lái)實(shí)現(xiàn),STL中的vector在內(nèi)存中占有一塊連續(xù)的空間,存儲(chǔ)一個(gè)元素序列,可以實(shí)現(xiàn)數(shù)組的功能,但當(dāng)需要增加數(shù)據(jù)元素時(shí),可以直接從vector容器尾端插入,所以vector可以看作一個(gè)可自動(dòng)擴(kuò)充的動(dòng)態(tài)數(shù)組,是一個(gè)封裝好的類,而且它提供越界檢查,并可用[]運(yùn)算符直接存取數(shù)據(jù)。
1.2? map
map是STL的一個(gè)關(guān)聯(lián)容器,是由{鍵(key),值(value)}對(duì)組成,并且元素按鍵排列的集合。第一個(gè)可以稱為關(guān)鍵字(key),每個(gè)關(guān)鍵字只能在map中出現(xiàn)一次,第二個(gè)則稱為該關(guān)鍵字的值(value)。其中key和value可以是任意需要的類型,map容器將數(shù)據(jù)元素存儲(chǔ)在一個(gè)有序的、類似于樹(shù)的數(shù)據(jù)結(jié)構(gòu)中。以下分別是關(guān)于map的兩個(gè)核心操作:插入和刪除。
(1)map數(shù)據(jù)插入有三種方式:
第1種:pair---mapname.insert(pair
第2種:value_type---mapname.insert(map
第3種:"array"方式---mapname[key] = value;
(2)map刪除與清空元素的三種方式:
第1種:用關(guān)鍵字刪除---Type de= mapname.erase("key");
第2種:迭代器刪除---Map
第3種:用迭代器范圍刪除---mapname.erase(mapname.begin(),mapname.end());//等同于mapname.clear()
另外,set是一個(gè)沒(méi)有重復(fù)的元素,并且元素按有序的方式存儲(chǔ)的集合,基本操作與map相似。
利用STL中容器已經(jīng)定義的算法和迭代器,可以方便靈活地存取容器中存儲(chǔ)的各種數(shù)據(jù)元素。
2? 綜合案例的設(shè)計(jì)
目前,學(xué)院的Online Judge System軟件平臺(tái)(簡(jiǎn)稱“OJ平臺(tái)”)上的實(shí)驗(yàn)項(xiàng)目數(shù)量雖近150個(gè),能夠體現(xiàn)各個(gè)教學(xué)知識(shí)點(diǎn),但并不能滿足不同層次學(xué)生的需求,尤其缺少STL部分的實(shí)驗(yàn)項(xiàng)目,鑒于此,選取貼近生活的案例,適合初學(xué)STL,并可以了解其使用的實(shí)驗(yàn)項(xiàng)目。
案例一:根據(jù)常規(guī)的血型配對(duì)表(如表1所示),選取合適的STL中的容器進(jìn)行設(shè)計(jì)。
分析血型配對(duì)表,它由三部分構(gòu)成,起主導(dǎo)作用的父母雙親的血型、分別會(huì)得到的子女可能或不可能的血型。對(duì)于父母雙親的血型采用容器向量vector進(jìn)行存儲(chǔ),對(duì)于子女可能出現(xiàn)的血型和不應(yīng)該出現(xiàn)的血型個(gè)數(shù)是不確定的,因此采用集合Set進(jìn)行存儲(chǔ),最后將父母血型和子女可能或不可能的血型三部分封裝起來(lái)采用map容器進(jìn)行存儲(chǔ)。
案例二:利用vector定義Matrix(矩陣類),實(shí)現(xiàn)奇偶幻方的顯示。
C++中矩陣用二維數(shù)組來(lái)實(shí)現(xiàn),本案例要求利用現(xiàn)成的STL容器來(lái)定義一個(gè)新的類,并對(duì)其進(jìn)行測(cè)試檢驗(yàn)。測(cè)試時(shí)需要輸出一個(gè)奇偶幻方,而幻方是指將1到n2個(gè)數(shù)字所組成的n*n階方陣,每條對(duì)角線,每行與每列的數(shù)字和都相等,并且和為n*(n2+1)/2。奇數(shù)幻方(如表2所示)和奇偶幻方(如表3所示)。設(shè)計(jì)提示:首先采用公有繼承vector定義一個(gè)矩陣類Matrix,并且實(shí)現(xiàn)輸出運(yùn)算符重載,然后運(yùn)用定義好的矩陣類進(jìn)行奇數(shù)幻方函數(shù)的編寫(xiě),最后通過(guò)調(diào)用奇數(shù)幻方函數(shù)實(shí)現(xiàn)奇偶幻方的顯示。
3? 結(jié)? 論
在線程序評(píng)測(cè)系統(tǒng)目前已成為程序教學(xué)中不可或缺的先進(jìn)手段。學(xué)生按照題目要求編寫(xiě)程序并提交源代碼,評(píng)測(cè)系統(tǒng)編譯運(yùn)行程序?;赟TL綜合案例的設(shè)計(jì),不僅完善了在線測(cè)試OJ平臺(tái)的實(shí)驗(yàn)項(xiàng)目,填充了STL這部分實(shí)驗(yàn)項(xiàng)目的空白,而且讓學(xué)生對(duì)C++程序設(shè)計(jì)有了更進(jìn)一步的認(rèn)識(shí),對(duì)面向?qū)ο笏枷胗辛烁畹睦斫猓踔劣械膶W(xué)生為了按時(shí)完成OJ平臺(tái)實(shí)驗(yàn)項(xiàng)目的提交,能夠提前預(yù)習(xí)新知識(shí),這有利于引導(dǎo)學(xué)生主動(dòng)去探索,培養(yǎng)學(xué)生學(xué)習(xí)興趣,提高對(duì)后續(xù)數(shù)據(jù)結(jié)構(gòu)課程的先知認(rèn)識(shí)。
參考文獻(xiàn):
[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] 沈顯君,楊進(jìn)才,張勇.C++語(yǔ)言程序設(shè)計(jì)教程:第3版 [M].北京:清華大學(xué)出版社,2015.
[6] 閆常友,王敏.C++ STL標(biāo)準(zhǔn)程序庫(kù)開(kāi)發(fā)指南:第2版 [M].北京:中國(guó)鐵道出版社,2017.
作者簡(jiǎn)介:張秀梅(1978—),女,漢族,遼寧鞍山人,講師,碩士研究生,研究方向:中文信息處理。