李軍玲 邵洪艷
摘要:本文針對NOIP競賽中學生普遍不重視養成良好程序設計習慣的問題,通過以競賽試題中閱讀程序為例,分析說明培養程序設計習慣的措施,提出正確使用程序設計工具,以達到養成良好的程序設計風格、加強良好程序設計習慣養成的目的,這對提高學生的程序設計能力具有較好的現實指導意義。
關鍵詞:信息學;奧林匹克競賽;程序設計;習慣
中圖分類號:G642 文獻標識碼:B
1現狀與對策
全國青少年信息學奧林匹克聯賽(National Olympiad in Informatics in Provinces,簡稱NOIP)是全國信息學奧林匹克競賽(NOI)系列活動中的一個重要組成部分,旨在向中學生普及計算機基礎知識。從早期只考核學生對程序設計語言的理解、熟悉程度以及編程技巧發展到模型設計、離散數學、動態規劃的思想及算法,由單純的培養學生學習興趣轉變為創造性地運用程序設計知識解決實際問題的能力。然而學生在程序設計習慣方面普遍重視不夠,為軟件項目開發埋下了巨大隱患。
1.1現實中存在的問題
信息學奧林匹克競賽上由于教學單位出現急功近利的思想,造成學生不能較好地正確掌握計算機程序設計過程,沒有養成良好的程序編程習慣。在現實中,程序設計普遍存在以下一些共性問題:
(1) 不愿意讀別人的程序。強調自己程序設計方法的優點,不愿意學習和借鑒他人的設計思路。
(2) 不畫流程圖。程序流程圖本來是程序設計的最簡單最直白書面表達,然而沒有得到足夠的重視與平時養成,學生不樂意用流程圖來表達設計思想與過程,實際上往往導致程序邏輯交叉,當程序出錯時排除費時費力。
(3) 不寫程序功能說明。程序設計過程中普遍存在只寫源代碼的語句,對程序實現的功能沒有描述,別人閱讀程序很難,有時編程者自己對程序的處理技術方法也遺忘。
(4) 不寫代碼的注釋。不對程序進行必要的注釋,造成閱讀困難,程序可讀性差。
(5) 忽視出錯處理。只完成程序功能的單一實現過程,對程序可能的具體出錯處理分析不夠。
(6) 忽視程序算法分析。程序算法對程序運行的效率影響是非常大的,程序算法的復雜度直接影響程序的時間和空間。
(7) 忽視程序設計過程中文檔資料的積累。普遍認為編程就是寫程序和調試過程,忽視文檔的書寫,其后果導致程序維護困難。
1.2對策
信息學奧林匹克競賽注重學生終生學習能力的培養,而不停留在唯競賽而學。在平時的教學中培養學生良好的程序設計習慣,使學生學會準確運用程序設計工具,養成良好的程序設計風格,將達到事半功倍的效果。
(1) 勤于思考、克服困難的習慣。由于學生對知識層次理解的深度有限,思維是發散而新穎,學生所編寫的程序必然有別于專業人員,但是要培養其具有專業人員的素養,要養成解決問題的好習慣,從解決方法和基本原理上勤于推敲。
(2) 與人協作的習慣。NOIP考試形式上看是學生個人的行為,而真實的軟件工程是多人合作、信息共享的活動,互學互助、取長補短、與人溝通、信息交流的好習慣將使學生受益終身。
(3) 培養全局規劃習慣。不論是程序語言的學習例題還是NOIP的考試命題,題目功能典型,學生要善于從短小的程序代碼中分析計算機解決問題的方式、途徑,將小代碼功能擴充完善,利用程序設計工具對問題從全局角度進行分析處理。
(4) 良好的代碼編寫習慣。包括程序流程圖、變量命名、代碼標注、功能注釋、捕獲代碼異常、測試樣例、文檔記錄等多個環節。如果在軟件開發和程序編寫過程中養成良好的習慣,那么程序中存在的漏洞就易于發現,為將來大型軟件項目的開發打下良好基礎。
(5) 養成善于總結分析、勤于記錄文檔資料的習慣。建立自己的知識庫,不僅有源程序代碼,還要有完備的文檔資料記錄。
2培養正確程序設計習慣的措施
學生在學習過程中主要接觸的是以掌握基本算法為主的程序例題和NOIP獨立命題題目,而軟件開發過程是一系列活動,包括方法、工具和過程三個要素。因此,如何讓學生以小見大,培養良好的程序設計習慣才是學習的根本。以第14屆NOIP提高組C++初賽題目閱讀程序4為例題,說明如何借助程序設計工具,養成良好的程序設計風格,培養良好的程序設計習慣,例題的源程序如下。
#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準確使用程序工具的習慣 學生在學習程序設計過程中不要過分強調上機調試運行,學會正確運用程序設計工具是根本。程序設計工具不僅能正確將程序分析過程轉變為程序實現,而且還能夠幫助學生快速分析源程序的語句功能,生成程序設計過程中所需要的文檔資料。 2.1.1數據字典 數據字典以字典式順序組織精確嚴格地定義了每個數據元素。通過讀例題源程序,得到例題的數據變量的數據字典,具體變量描述如表1所示,這有助于理解各變量在程序中的輸入、輸出、存儲和中間計算。 2.1.2N-S圖 N-S圖是適應結構化程序設計特點,逐步求精模塊化程序設計方法的有力工具。閱讀例題源程序語句可以快速畫出它的N-S圖(圖1),從而確定例題的程序順序結構功能,如圖2所示。 2.2良好程序書寫風格的養成 程序不僅要保證運行正確,也是讓別人讀的。程序書寫設計風格包括4個方面:源程序文檔化、數據說明、語句結構和輸入輸出方法。針對NOIP命題特點,學會從編碼原則提高程序的可讀性著手。由于例題已具有完好的縮進格式,只需要加入相關的序言性和語句注釋。程序部分修改內容如下。 /* 4.cpp 程序功能: */ /*首先,大小寫混合字母的字符串變成小寫字母;然后以26字母循環形式,逐個字符替換為其位置后的第3個字符;最后,重新賦值指定位置字符。*/ .... int main() { cin>>s; //字符串s初始化 len=strlen(s); //求s長度 for(i=0;i ... //逐字符轉換為其后面的第3個字符 for(i=0;i ... cout< //3次循環將s指定字符s[i]重新賦值s[i+j] for(j=1;j<4;j++) ... cout< return 0; //返回 }


2.3程序算法分析的習慣
算法的空間復雜度和時間復雜度是分析一個程序算法的執行效率與存儲需求,可以有效避免只強調偏僻技巧而忽略算法復雜性。
int main()
{ cin>>s; //執行次數1
len=strlen(s); //執行次數1
for(i=0;i ... for(i=0;i ... for(j=1;j<4;j++) //執行次數4 for((i=0;i s[i]=s[i+j] //執行次數4*n cout< } 通過對例題的基本語句執行次數分析,得出程序的時間復雜度為O(n2)。 2.4面向對象程序設計的習慣 目前面向對象的程序設計技術在軟件開發中占據主導地位,是指導學生學習軟件的發展方向。根據例題程序的功能實現,通過定義一個obj類,含有實現程序功能的4個成員函數,將例題的面向過程編程改寫為面向對象的程序設計,使數據和操作具有封裝性。改寫后的程序源代碼如下。 #include #include using namespace std; class obj //定義obj類 {public: //定義公有成員函數 obj( ) {*s=NULL;len=0;} //定義構造函數 void input( ); //輸入函數 void change( ); //字符轉換函數 void setvalue( ); //字符重賦值函數 //定義輸出函數 void print(){cout<<"s="< private: //定義私有成員變量 char s[50]; //字符串s int len; //字符串長度len }; void obj::input( ) //定義輸入函數 {cout<<"inputs="; cin>>s; len=strlen(s); } void obj::change( ) //定義轉換函數 { 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 ( ) //定義字符重賦值函數 { for(int j=1;j<4;j++) { for(int i=0;i s[i]=s[i+j];} } int main( ) //主函數 { obj x; //obj類的對象x x.input ( ); x.change ( ); x.setvalue ( ); x.print ( ); return 0; } 3結語 NOIP重點是培養學生學習計算機的興趣,使學生對信息技術的一些核心內容有更多的了解,提高創造性地運用程序設計知識解決實際問題的能力,而不是一味學習專業教材。因此,只有開始養成一個良好的程序設計習慣,才能為將來的軟件開發打下好基礎,而不是追求唯競賽而學的短期效果。 參考文獻: [1] 馬苗,田紅鵬. “面向對象程序設計與C++”教學中的問題與思考[J]. 計算機教育,2008(6):81-82. [2] 楊顯霞. 信息學奧林匹克競賽教學模式初探[J]. 西南農業大學學報:社會科學版,2008(4):169-171. [3] 林小華. 計算機程序設計風格探討[J]. 軟件導刊,2006(17):33-35. [4] 譚浩強. C++程序設計[M]. 北京:清華大學出版社,2004. [5] 覃征,何堅,高洪江,等. 軟件工程與管理[M]. 北京:清華大學出版社,2005.