蔣 靜
(廣西師范大學(xué)計算機科學(xué)與信息工程學(xué)院,廣西 桂林 541004)
C語言是廣泛使用的計算機語言之一,并且有著較好的應(yīng)用前景。C語言是計算機二級考試要求的課程之一,它是高等學(xué)校理工科本科專業(yè)的一門重要基礎(chǔ)課程。C語言作為程序設(shè)計的語言被專業(yè)程序員設(shè)計操作系統(tǒng)、實時控制系統(tǒng)及許多應(yīng)用軟件,如目前的UNIX操作系統(tǒng)、Windows操作系統(tǒng)就是用C/C++設(shè)計的。
對于數(shù)學(xué)專業(yè)的學(xué)生來說,在教學(xué)上應(yīng)注重知識應(yīng)用能力的培養(yǎng)。如果能將某些數(shù)學(xué)問題注入到C語言的學(xué)習(xí)中,讓學(xué)生使用C語言編寫簡單的程序來解決這些數(shù)學(xué)問題,那么學(xué)生就能更快、更好地掌握所學(xué)的知識,更能提高學(xué)生的思維能力和利用所學(xué)知識來解決實際問題的能力。
C語言有三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。對于這三種結(jié)構(gòu)的學(xué)習(xí)和掌握,是C語言中非常重要的任務(wù)[1-4]。為了讓數(shù)學(xué)專業(yè)的學(xué)生能夠更牢固地掌握這三種結(jié)構(gòu),本文將利用編寫搜索一個經(jīng)典的數(shù)學(xué)結(jié)構(gòu)的程序來加深學(xué)生對這三種基本結(jié)構(gòu)的了解,同時也培養(yǎng)了學(xué)生運用知識的能力。
在C語言教學(xué)中,如果教師給出一個有趣的數(shù)學(xué)結(jié)構(gòu),那么對于數(shù)學(xué)專業(yè)的學(xué)生來說,不僅能夠引起他們的好奇心,更能集中他們的注意力,這也有利于教師展開課堂教學(xué)。因此,我們首先可以給出一個簡單而有趣的例子。
例1設(shè)集合D={0,1,3},則
設(shè)Z7為模7剩余類環(huán)。若D={0,1,3}?Z7,則{xy|x,y∈D}={1,2,3,4,5,6}=Z7{0}。
通過以上的例子,我們要引導(dǎo)學(xué)生思考一個問題:對于一般的正整數(shù)k,v,是否存在集合D?Zv,使D中恰有k個元素,且{x-y|x,y∈D}=Zv{0}。若存在,我們能否用程序搜索出來。學(xué)生帶著這樣的問題思考一段時間后,我們再給出這種結(jié)構(gòu)的精確定義。
定義1[5]設(shè)G為v階Abel群,其運算為加法。設(shè)D是G的一個k元子集,λ為給定的正整數(shù)。若對中任意非零元g,都有λ個序?qū)?x,y),其中x,y∈G,使g=x-y,則稱D為G中的一個(v,k,λ)-Abel差集或簡稱差集。
差集是組合設(shè)計理論中一個非常重要的概念,在很多領(lǐng)域有著重要的應(yīng)用。對于本科生,上述定義較難理解。因此,我們可以考慮一個比較簡單的情況,便于學(xué)生理解,進而更容易進行程序的編寫。
定義2設(shè)Zv為模v剩余類環(huán),D是Zv的一個k元子集。若{x-y|x,y∈D}=Zv{0},則稱D為Zv中的一個(v,k,1)-差集。
在給出這樣一個較為簡單的定義以后,為了便于學(xué)生理解,將其與例1作比較,我們可以再給出一個差集的例子。
例2設(shè)D={0,1,4,6}?Z13。因為{x-y|x,y∈D}={1,2,3,4,5,6,7,8,9,10,11,12}=Z13{0}
所以稱D為Z13中的一個(13,4,1)-差集。
差集的存在性在文獻[6]中給出了詳細(xì)的說明,在這里我們不需要給出,而只需考慮比較簡單的情況,即k∈[3,10]的情況。
定理1[6]對任意的整數(shù)k∈[3,10]{7},存在一個(k(k-1)+1,k,1)-差集。
到目前為止,我們可以將問題描述為:利用C語言的三種基本結(jié)構(gòu)編寫程序,找到定理1中所有的差集,即(k(k-1)+1,k,1)-差集,其中k∈[3,10]{7}。
在本節(jié)中,我們將介紹如何用C語言的三種基本結(jié)構(gòu)編寫程序來解決上一節(jié)所提出的問題。
顯然,在此程序中,我們需要用到的變量為正整數(shù)k,v,循環(huán)控制變量i,以及大小為k的集合D。C語言的語句如下:
根據(jù)定理1,程序的輸入應(yīng)為一個正整數(shù),且滿足k∈[3,10]{7}。我們可以利用一個循環(huán)語句,來控制輸入,即當(dāng)輸入的值屬于[3,10]{7}時,結(jié)束循環(huán)。因此我們可以利用“do-while”循環(huán)語句來實現(xiàn)。C語言語句如下:
因為程序是依次找出滿足要求的元素D[i],0≤i≤k-1,所以我們可以利用while循環(huán)語句,來控制此循環(huán)。另外,在檢驗集合D中的元素所產(chǎn)生的差不相同時,可以利用以下函數(shù)來判斷:
C語言語句如下:
從上述過程我們可以看出:此程序運用了三種基本結(jié)構(gòu),其中選擇結(jié)構(gòu)有if語句和if-else語句,讓學(xué)生能在實踐中進一步理解這兩種語句的不同之處;循環(huán)結(jié)構(gòu)有do-while語句、while語句和for語句,讓學(xué)生能更好地發(fā)現(xiàn)這三種語句的區(qū)別與聯(lián)系。
在本文中,我們根據(jù)數(shù)學(xué)專業(yè)學(xué)生的特點,首先提出了一個有趣的數(shù)學(xué)問題,讓學(xué)生們產(chǎn)生了對此問題的興趣,進而激起了他們編寫C語言程序的興趣。然后我們根據(jù)給出的數(shù)學(xué)結(jié)構(gòu)的特點,結(jié)合C語言的語句的特點,讓學(xué)生們在編寫程序的過程中體會這三種基本結(jié)構(gòu)的特點和用途,讓學(xué)生能更好的掌握這三種基本結(jié)構(gòu)。
參考文獻(References):
[1]譚浩強.C程序設(shè)計(第四版)[M].清華大學(xué)出版社,2010.
[2]蘇小紅,孫志剛,陳惠鵬等.C語言大學(xué)實用教程(第4版)[M].電子工業(yè)出版社,2017.
[3]王仕勛,佘鳳.C語言程序設(shè)計項目教程[M].科學(xué)出版社,2011.
[4]烏云高娃,沈翠新,楊淑萍.C語言程序設(shè)計(第3版)[M].高等教育出版社,2015.
[5]沈灝.組合設(shè)計理論[M].上海交通大學(xué)出版社,2008.
[6]Charles J.Colbourn and Jeffrey H.Dinitz.The CRC Handbook ofCombinatorial Designs(Second Edition)[M].FL:Chapman&Hall/CRC,2007.