李軍玲 邵洪艷
摘要:本文針對(duì)NOIP競(jìng)賽中學(xué)生普遍不重視養(yǎng)成良好程序設(shè)計(jì)習(xí)慣的問(wèn)題,通過(guò)以競(jìng)賽試題中閱讀程序?yàn)槔?分析說(shuō)明培養(yǎng)程序設(shè)計(jì)習(xí)慣的措施,提出正確使用程序設(shè)計(jì)工具,以達(dá)到養(yǎng)成良好的程序設(shè)計(jì)風(fēng)格、加強(qiáng)良好程序設(shè)計(jì)習(xí)慣養(yǎng)成的目的,這對(duì)提高學(xué)生的程序設(shè)計(jì)能力具有較好的現(xiàn)實(shí)指導(dǎo)意義。
關(guān)鍵詞:信息學(xué);奧林匹克競(jìng)賽;程序設(shè)計(jì);習(xí)慣
中圖分類(lèi)號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:B
1現(xiàn)狀與對(duì)策
全國(guó)青少年信息學(xué)奧林匹克聯(lián)賽(National Olympiad in Informatics in Provinces,簡(jiǎn)稱(chēng)NOIP)是全國(guó)信息學(xué)奧林匹克競(jìng)賽(NOI)系列活動(dòng)中的一個(gè)重要組成部分,旨在向中學(xué)生普及計(jì)算機(jī)基礎(chǔ)知識(shí)。從早期只考核學(xué)生對(duì)程序設(shè)計(jì)語(yǔ)言的理解、熟悉程度以及編程技巧發(fā)展到模型設(shè)計(jì)、離散數(shù)學(xué)、動(dòng)態(tài)規(guī)劃的思想及算法,由單純的培養(yǎng)學(xué)生學(xué)習(xí)興趣轉(zhuǎn)變?yōu)閯?chuàng)造性地運(yùn)用程序設(shè)計(jì)知識(shí)解決實(shí)際問(wèn)題的能力。然而學(xué)生在程序設(shè)計(jì)習(xí)慣方面普遍重視不夠,為軟件項(xiàng)目開(kāi)發(fā)埋下了巨大隱患。
1.1現(xiàn)實(shí)中存在的問(wèn)題
信息學(xué)奧林匹克競(jìng)賽上由于教學(xué)單位出現(xiàn)急功近利的思想,造成學(xué)生不能較好地正確掌握計(jì)算機(jī)程序設(shè)計(jì)過(guò)程,沒(méi)有養(yǎng)成良好的程序編程習(xí)慣。在現(xiàn)實(shí)中,程序設(shè)計(jì)普遍存在以下一些共性問(wèn)題:
(1) 不愿意讀別人的程序。強(qiáng)調(diào)自己程序設(shè)計(jì)方法的優(yōu)點(diǎn),不愿意學(xué)習(xí)和借鑒他人的設(shè)計(jì)思路。
(2) 不畫(huà)流程圖。程序流程圖本來(lái)是程序設(shè)計(jì)的最簡(jiǎn)單最直白書(shū)面表達(dá),然而沒(méi)有得到足夠的重視與平時(shí)養(yǎng)成,學(xué)生不樂(lè)意用流程圖來(lái)表達(dá)設(shè)計(jì)思想與過(guò)程,實(shí)際上往往導(dǎo)致程序邏輯交叉,當(dāng)程序出錯(cuò)時(shí)排除費(fèi)時(shí)費(fèi)力。
(3) 不寫(xiě)程序功能說(shuō)明。程序設(shè)計(jì)過(guò)程中普遍存在只寫(xiě)源代碼的語(yǔ)句,對(duì)程序?qū)崿F(xiàn)的功能沒(méi)有描述,別人閱讀程序很難,有時(shí)編程者自己對(duì)程序的處理技術(shù)方法也遺忘。
(4) 不寫(xiě)代碼的注釋。不對(duì)程序進(jìn)行必要的注釋,造成閱讀困難,程序可讀性差。
(5) 忽視出錯(cuò)處理。只完成程序功能的單一實(shí)現(xiàn)過(guò)程,對(duì)程序可能的具體出錯(cuò)處理分析不夠。
(6) 忽視程序算法分析。程序算法對(duì)程序運(yùn)行的效率影響是非常大的,程序算法的復(fù)雜度直接影響程序的時(shí)間和空間。
(7) 忽視程序設(shè)計(jì)過(guò)程中文檔資料的積累。普遍認(rèn)為編程就是寫(xiě)程序和調(diào)試過(guò)程,忽視文檔的書(shū)寫(xiě),其后果導(dǎo)致程序維護(hù)困難。
1.2對(duì)策
信息學(xué)奧林匹克競(jìng)賽注重學(xué)生終生學(xué)習(xí)能力的培養(yǎng),而不停留在唯競(jìng)賽而學(xué)。在平時(shí)的教學(xué)中培養(yǎng)學(xué)生良好的程序設(shè)計(jì)習(xí)慣,使學(xué)生學(xué)會(huì)準(zhǔn)確運(yùn)用程序設(shè)計(jì)工具,養(yǎng)成良好的程序設(shè)計(jì)風(fēng)格,將達(dá)到事半功倍的效果。
(1) 勤于思考、克服困難的習(xí)慣。由于學(xué)生對(duì)知識(shí)層次理解的深度有限,思維是發(fā)散而新穎,學(xué)生所編寫(xiě)的程序必然有別于專(zhuān)業(yè)人員,但是要培養(yǎng)其具有專(zhuān)業(yè)人員的素養(yǎng),要養(yǎng)成解決問(wèn)題的好習(xí)慣,從解決方法和基本原理上勤于推敲。
(2) 與人協(xié)作的習(xí)慣。NOIP考試形式上看是學(xué)生個(gè)人的行為,而真實(shí)的軟件工程是多人合作、信息共享的活動(dòng),互學(xué)互助、取長(zhǎng)補(bǔ)短、與人溝通、信息交流的好習(xí)慣將使學(xué)生受益終身。
(3) 培養(yǎng)全局規(guī)劃習(xí)慣。不論是程序語(yǔ)言的學(xué)習(xí)例題還是NOIP的考試命題,題目功能典型,學(xué)生要善于從短小的程序代碼中分析計(jì)算機(jī)解決問(wèn)題的方式、途徑,將小代碼功能擴(kuò)充完善,利用程序設(shè)計(jì)工具對(duì)問(wèn)題從全局角度進(jìn)行分析處理。
(4) 良好的代碼編寫(xiě)習(xí)慣。包括程序流程圖、變量命名、代碼標(biāo)注、功能注釋、捕獲代碼異常、測(cè)試樣例、文檔記錄等多個(gè)環(huán)節(jié)。如果在軟件開(kāi)發(fā)和程序編寫(xiě)過(guò)程中養(yǎng)成良好的習(xí)慣,那么程序中存在的漏洞就易于發(fā)現(xiàn),為將來(lái)大型軟件項(xiàng)目的開(kāi)發(fā)打下良好基礎(chǔ)。
(5) 養(yǎng)成善于總結(jié)分析、勤于記錄文檔資料的習(xí)慣。建立自己的知識(shí)庫(kù),不僅有源程序代碼,還要有完備的文檔資料記錄。
2培養(yǎng)正確程序設(shè)計(jì)習(xí)慣的措施
學(xué)生在學(xué)習(xí)過(guò)程中主要接觸的是以掌握基本算法為主的程序例題和NOIP獨(dú)立命題題目,而軟件開(kāi)發(fā)過(guò)程是一系列活動(dòng),包括方法、工具和過(guò)程三個(gè)要素。因此,如何讓學(xué)生以小見(jiàn)大,培養(yǎng)良好的程序設(shè)計(jì)習(xí)慣才是學(xué)習(xí)的根本。以第14屆NOIP提高組C++初賽題目閱讀程序4為例題,說(shuō)明如何借助程序設(shè)計(jì)工具,養(yǎng)成良好的程序設(shè)計(jì)風(fēng)格,培養(yǎng)良好的程序設(shè)計(jì)習(xí)慣,例題的源程序如下。
#include
#include
using namespace std;
int i,j,len;
char s[50];
int main()
{ cin>>s;
len=strlen(s);
for(i=0;i {if (s[i]>='A'&&s[i]<='Z') s[i]- ='A'-'a';} for(i=0;i {if(s[i]<'x') s[i]+=3;else s[i]+= -23;} cout< for(j=1;j<4;j++) { for(i=0;i {s[i]=s[i+j];} } cout< return 0; } 2.1準(zhǔn)確使用程序工具的習(xí)慣 學(xué)生在學(xué)習(xí)程序設(shè)計(jì)過(guò)程中不要過(guò)分強(qiáng)調(diào)上機(jī)調(diào)試運(yùn)行,學(xué)會(huì)正確運(yùn)用程序設(shè)計(jì)工具是根本。程序設(shè)計(jì)工具不僅能正確將程序分析過(guò)程轉(zhuǎn)變?yōu)槌绦驅(qū)崿F(xiàn),而且還能夠幫助學(xué)生快速分析源程序的語(yǔ)句功能,生成程序設(shè)計(jì)過(guò)程中所需要的文檔資料。 2.1.1數(shù)據(jù)字典 數(shù)據(jù)字典以字典式順序組織精確嚴(yán)格地定義了每個(gè)數(shù)據(jù)元素。通過(guò)讀例題源程序,得到例題的數(shù)據(jù)變量的數(shù)據(jù)字典,具體變量描述如表1所示,這有助于理解各變量在程序中的輸入、輸出、存儲(chǔ)和中間計(jì)算。 2.1.2N-S圖 N-S圖是適應(yīng)結(jié)構(gòu)化程序設(shè)計(jì)特點(diǎn),逐步求精模塊化程序設(shè)計(jì)方法的有力工具。閱讀例題源程序語(yǔ)句可以快速畫(huà)出它的N-S圖(圖1),從而確定例題的程序順序結(jié)構(gòu)功能,如圖2所示。 2.2良好程序書(shū)寫(xiě)風(fēng)格的養(yǎng)成 程序不僅要保證運(yùn)行正確,也是讓別人讀的。程序書(shū)寫(xiě)設(shè)計(jì)風(fēng)格包括4個(gè)方面:源程序文檔化、數(shù)據(jù)說(shuō)明、語(yǔ)句結(jié)構(gòu)和輸入輸出方法。針對(duì)NOIP命題特點(diǎn),學(xué)會(huì)從編碼原則提高程序的可讀性著手。由于例題已具有完好的縮進(jìn)格式,只需要加入相關(guān)的序言性和語(yǔ)句注釋。程序部分修改內(nèi)容如下。 /* 4.cpp 程序功能: */ /*首先,大小寫(xiě)混合字母的字符串變成小寫(xiě)字母;然后以26字母循環(huán)形式,逐個(gè)字符替換為其位置后的第3個(gè)字符;最后,重新賦值指定位置字符。*/ .... int main() { cin>>s; //字符串s初始化 len=strlen(s); //求s長(zhǎng)度 for(i=0;i ... //逐字符轉(zhuǎn)換為其后面的第3個(gè)字符 for(i=0;i ... cout< //3次循環(huán)將s指定字符s[i]重新賦值s[i+j] for(j=1;j<4;j++) ... cout< return 0; //返回 }
2.3程序算法分析的習(xí)慣
算法的空間復(fù)雜度和時(shí)間復(fù)雜度是分析一個(gè)程序算法的執(zhí)行效率與存儲(chǔ)需求,可以有效避免只強(qiáng)調(diào)偏僻技巧而忽略算法復(fù)雜性。
int main()
{ cin>>s; //執(zhí)行次數(shù)1
len=strlen(s); //執(zhí)行次數(shù)1
for(i=0;i ... for(i=0;i ... for(j=1;j<4;j++) //執(zhí)行次數(shù)4 for((i=0;i s[i]=s[i+j] //執(zhí)行次數(shù)4*n cout< } 通過(guò)對(duì)例題的基本語(yǔ)句執(zhí)行次數(shù)分析,得出程序的時(shí)間復(fù)雜度為O(n2)。 2.4面向?qū)ο蟪绦蛟O(shè)計(jì)的習(xí)慣 目前面向?qū)ο蟮某绦蛟O(shè)計(jì)技術(shù)在軟件開(kāi)發(fā)中占據(jù)主導(dǎo)地位,是指導(dǎo)學(xué)生學(xué)習(xí)軟件的發(fā)展方向。根據(jù)例題程序的功能實(shí)現(xiàn),通過(guò)定義一個(gè)obj類(lèi),含有實(shí)現(xiàn)程序功能的4個(gè)成員函數(shù),將例題的面向過(guò)程編程改寫(xiě)為面向?qū)ο蟮某绦蛟O(shè)計(jì),使數(shù)據(jù)和操作具有封裝性。改寫(xiě)后的程序源代碼如下。 #include #include using namespace std; class obj //定義obj類(lèi) {public: //定義公有成員函數(shù) obj( ) {*s=NULL;len=0;} //定義構(gòu)造函數(shù) void input( ); //輸入函數(shù) void change( ); //字符轉(zhuǎn)換函數(shù) void setvalue( ); //字符重賦值函數(shù) //定義輸出函數(shù) void print(){cout<<"s="< private: //定義私有成員變量 char s[50]; //字符串s int len; //字符串長(zhǎng)度len }; void obj::input( ) //定義輸入函數(shù) {cout<<"inputs="; cin>>s; len=strlen(s); } void obj::change( ) //定義轉(zhuǎn)換函數(shù) { for(int i=0;i {if (s[i]>='A'&&s[i]<='Z') s[i]- ='A'-'a';} for(i=0;i {if(s[i]<'x') s[i]+=3;else s[i]+= -23;} } void obj::setvalue ( ) //定義字符重賦值函數(shù) { for(int j=1;j<4;j++) { for(int i=0;i s[i]=s[i+j];} } int main( ) //主函數(shù) { obj x; //obj類(lèi)的對(duì)象x x.input ( ); x.change ( ); x.setvalue ( ); x.print ( ); return 0; } 3結(jié)語(yǔ) NOIP重點(diǎn)是培養(yǎng)學(xué)生學(xué)習(xí)計(jì)算機(jī)的興趣,使學(xué)生對(duì)信息技術(shù)的一些核心內(nèi)容有更多的了解,提高創(chuàng)造性地運(yùn)用程序設(shè)計(jì)知識(shí)解決實(shí)際問(wèn)題的能力,而不是一味學(xué)習(xí)專(zhuān)業(yè)教材。因此,只有開(kāi)始養(yǎng)成一個(gè)良好的程序設(shè)計(jì)習(xí)慣,才能為將來(lái)的軟件開(kāi)發(fā)打下好基礎(chǔ),而不是追求唯競(jìng)賽而學(xué)的短期效果。 參考文獻(xiàn): [1] 馬苗,田紅鵬. “面向?qū)ο蟪绦蛟O(shè)計(jì)與C++”教學(xué)中的問(wèn)題與思考[J]. 計(jì)算機(jī)教育,2008(6):81-82. [2] 楊顯霞. 信息學(xué)奧林匹克競(jìng)賽教學(xué)模式初探[J]. 西南農(nóng)業(yè)大學(xué)學(xué)報(bào):社會(huì)科學(xué)版,2008(4):169-171. [3] 林小華. 計(jì)算機(jī)程序設(shè)計(jì)風(fēng)格探討[J]. 軟件導(dǎo)刊,2006(17):33-35. [4] 譚浩強(qiáng). C++程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,2004. [5] 覃征,何堅(jiān),高洪江,等. 軟件工程與管理[M]. 北京:清華大學(xué)出版社,2005.