国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一個(gè)經(jīng)典C語(yǔ)言程序的改進(jìn)

2020-02-22 03:35巨同升
電腦知識(shí)與技術(shù) 2020年36期
關(guān)鍵詞:可讀性結(jié)構(gòu)性

摘要:統(tǒng)計(jì)單詞個(gè)數(shù)的程序是一個(gè)經(jīng)典的C語(yǔ)言程序,傳統(tǒng)的寫(xiě)法存在結(jié)構(gòu)復(fù)雜、可讀性差的不足。通過(guò)對(duì)相鄰的兩個(gè)字符同時(shí)進(jìn)行判斷,即可簡(jiǎn)化程序結(jié)構(gòu),改善程序的可讀性。

關(guān)鍵詞:?jiǎn)卧~個(gè)數(shù);標(biāo)記變量;結(jié)構(gòu)性;可讀性

中圖分類(lèi)號(hào):TP312? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A

文章編號(hào):1009-3044(2020)36-0071-02

培養(yǎng)學(xué)生良好的編程能力是程序設(shè)計(jì)課程的核心目標(biāo)[1],而編程能力的培養(yǎng)離不開(kāi)一個(gè)個(gè)具體的案例程序。

在教學(xué)中選用優(yōu)質(zhì)的案例程序,對(duì)于培養(yǎng)學(xué)生的程序設(shè)計(jì)能力具有重要的示范引導(dǎo)作用[2-3],因此應(yīng)該選擇更加合理有效的程序?qū)崿F(xiàn)方法。不過(guò),在當(dāng)前的C語(yǔ)言程序設(shè)計(jì)教材中,仍有個(gè)別案例程序的寫(xiě)法存在改進(jìn)優(yōu)化的空間。

1 統(tǒng)計(jì)單詞個(gè)數(shù)的傳統(tǒng)程序

“統(tǒng)計(jì)一個(gè)字符串中單詞的個(gè)數(shù)(假定單詞之間以空格分隔)”是C語(yǔ)言程序設(shè)計(jì)中的一個(gè)經(jīng)典程序,是字符串處理部分的一個(gè)重要案例[4-5]。

下面的程序是在許多C語(yǔ)言教材中采用的一種傳統(tǒng)寫(xiě)法。

源程序1:

#include

#define IN 1? ? ? /*表示在一個(gè)單詞內(nèi)部*/

#define OUT 0? ? ? /*表示在一個(gè)單詞外部*/

int main(void)

{

char c;

int num,state;

state=OUT;? ? ? /*初始狀態(tài)位于單詞外部*/

num=0;

while((c=getchar())!='\n')

{

if(c==' ')

state=OUT;

else if(state==OUT)

{

state=IN;

num++;

}

}

printf("單詞個(gè)數(shù)=%d\n",num);

return 0;

}

這是一個(gè)經(jīng)典的程序,同時(shí)也是一個(gè)比較晦澀難懂的程序。由于第一個(gè)單詞之前可能有空格,同時(shí)兩個(gè)單詞之間也可能有多個(gè)空格,因此不能簡(jiǎn)單地通過(guò)統(tǒng)計(jì)空格的個(gè)數(shù)以得到單詞的個(gè)數(shù)。該程序的編程思路是依據(jù)相鄰的兩個(gè)字符進(jìn)行判斷,當(dāng)相鄰的兩個(gè)字符中,前一個(gè)是空格符(即處于單詞外部),而后一個(gè)是非空格字符(即處于單詞內(nèi)部)時(shí),說(shuō)明找到一個(gè)新的單詞的開(kāi)頭,從而將單詞的個(gè)數(shù)加一。

由于在每次循環(huán)中只對(duì)當(dāng)前讀入的一個(gè)字符進(jìn)行判斷,因此在讀入下一個(gè)字符之前,必須將當(dāng)前字符對(duì)應(yīng)的狀態(tài)記錄到標(biāo)記變量state中。若當(dāng)前字符是空格符(即處于單詞外部),則state取值為OUT;若當(dāng)前字符是非空格字符(即處于單詞內(nèi)部),則state取值為IN。當(dāng)然,在讀入任何字符之前,state也應(yīng)該取值為OUT,即處于單詞外部。

從而在讀入新字符時(shí),若state的值為OUT,則說(shuō)明前一個(gè)字符是空格符;若state的值為IN,則說(shuō)明前一個(gè)字符是非空格字符。因此,當(dāng)讀入的新字符是非空格字符,而state的值為OUT(即前一個(gè)字符是空格符)時(shí),說(shuō)明找到一個(gè)新的單詞的開(kāi)頭。

這種寫(xiě)法之所以結(jié)構(gòu)復(fù)雜、可讀性差,不容易為初學(xué)者理解和掌握,其主要原因就在于每次循環(huán)只對(duì)當(dāng)前一個(gè)字符進(jìn)行判斷,而不是對(duì)相鄰的兩個(gè)字符同時(shí)進(jìn)行判斷。

2 改進(jìn)的程序

如何改進(jìn)這個(gè)程序呢?其實(shí),只需要利用兩個(gè)字符變量存儲(chǔ)相鄰的兩個(gè)字符,并在循環(huán)體中同時(shí)對(duì)相鄰的兩個(gè)字符的值進(jìn)行判斷,就可以取消標(biāo)志變量state,從而降低程序的復(fù)雜度。

為了便于編寫(xiě)程序,可以設(shè)想在整個(gè)字符串之前添加一個(gè)空格,這并不影響單詞個(gè)數(shù)的統(tǒng)計(jì)結(jié)果。

下面是改進(jìn)之后的C語(yǔ)言源程序。

源程序2:

#include

int main(void)

{char c0,c;

int num;

num=0;

c0=' ';? ?/*設(shè)想在整個(gè)字符串之前添加一個(gè)空格*/

while((c=getchar())!='\n')? ?/*輸入一個(gè)字符并存入變量c中*/

{

if(c0==' ' && c!=' ')? /*相鄰的兩個(gè)字符中,前一個(gè)是空格符,后一個(gè)是非空格字符*/

num++;? ?/*說(shuō)明找到一個(gè)新的單詞的開(kāi)頭,將單詞的個(gè)數(shù)加一*/

c0=c;? ? /*將變量c的值轉(zhuǎn)存到變量c0中,為輸入下一個(gè)字符做好準(zhǔn)備*/

}

printf("單詞個(gè)數(shù)=%d\n",num);

return 0;

}

程序運(yùn)行結(jié)果:

在該程序中,利用兩個(gè)字符變量c0和c存儲(chǔ)相鄰的兩個(gè)字符,其中c0存儲(chǔ)前一個(gè)字符,c存儲(chǔ)后一個(gè)字符。這樣,只需要同時(shí)對(duì)c0和c的值進(jìn)行判斷,即可確定是否找到一個(gè)新的單詞。也就是當(dāng)c0的值是空格符,而c的值是非空格字符時(shí),說(shuō)明找到一個(gè)新的單詞的開(kāi)頭,從而將單詞的個(gè)數(shù)加一。

可以發(fā)現(xiàn),經(jīng)過(guò)改進(jìn)之后,程序在結(jié)構(gòu)性和可讀性方面均有較大程度的優(yōu)化,從而降低了程序的復(fù)雜度,提高了學(xué)習(xí)者的接受度。

3 利用字符數(shù)組實(shí)現(xiàn)的程序

在前面的程序中,利用getchar函數(shù)逐個(gè)輸入字符,利用兩個(gè)字符變量的值不斷交替,存儲(chǔ)相鄰的兩個(gè)字符。

還有一種處理方式,就是利用一個(gè)字符型數(shù)組存儲(chǔ)字符串。由于在第一個(gè)單詞之前有可能沒(méi)有空格符,因此若仍然采用查找一個(gè)單詞的開(kāi)頭的方式,實(shí)現(xiàn)起來(lái)將會(huì)不甚方便。不過(guò),可以變換一下思路,改為查找一個(gè)單詞的末尾。

可以發(fā)現(xiàn),在除了最后一個(gè)單詞之外的每個(gè)單詞之后至少有一個(gè)空格符,而在最后一個(gè)單詞之后可能跟一個(gè)空格符,也可能直接跟一個(gè)空字符'\0',因此可以將判斷規(guī)則修改為“當(dāng)相鄰的兩個(gè)字符中,前一個(gè)是非空格字符,而后一個(gè)是空格符或空字符'\0'時(shí),說(shuō)明找到一個(gè)新的單詞”[6]。

下面是利用字符數(shù)組實(shí)現(xiàn)的C語(yǔ)言源程序。

源程序3:

#include

#include

int main(void)

{char a[200];

int i,n,c=0;

printf("請(qǐng)輸入一行以空格分隔的單詞:\n");

gets(a);

n=strlen(a);

for(i=0;i<=n-1;i++)

{if(a[i]!=' '&&(a[i+1]==' '||a[i+1]=='\0'))

c++;

/*若第i個(gè)字符不是空格符,第i+1個(gè)字符是空格符或'\0',則表示找到一個(gè)單詞的末尾*/

}

printf("單詞個(gè)數(shù)=%d\n",c);

return 0;

}

可以發(fā)現(xiàn),相對(duì)于前面的程序,利用字符型數(shù)組統(tǒng)計(jì)單詞個(gè)數(shù)的程序在結(jié)構(gòu)性和可讀性方面均有進(jìn)一步的改進(jìn)。

4 進(jìn)一步改進(jìn)的程序

在前面的程序中均假定單詞之間是以空格符分隔的,而在現(xiàn)實(shí)中單詞之間也可以用標(biāo)點(diǎn)符號(hào)分隔,如何應(yīng)對(duì)這個(gè)問(wèn)題呢?其實(shí),只需要對(duì)源程序3稍加修改,就可以適應(yīng)這種新的要求。

由于單詞之間是以空格符或標(biāo)點(diǎn)符號(hào)分隔的,而標(biāo)點(diǎn)符號(hào)是不便于一一判斷區(qū)分出來(lái)的,因此可以通過(guò)判斷一個(gè)字符是不是字母或數(shù)字來(lái)確定是否處于單詞內(nèi)部。也就是當(dāng)相鄰的兩個(gè)字符中,前一個(gè)是字母或數(shù)字(即處于單詞內(nèi)部)而后一個(gè)不是字母或數(shù)字(即處于單詞外部)時(shí),說(shuō)明找到一個(gè)新的單詞的末尾[6]。要判斷一個(gè)字符是不是字母或數(shù)字,可以直接調(diào)用C語(yǔ)言中的isalnum庫(kù)函數(shù)。

從而可以寫(xiě)出如下進(jìn)一步改進(jìn)的源程序。

源程序4:

#include

#include

#include

int main(void)

{char a[200];

int i,n,c=0;

printf("請(qǐng)輸入一行以空格或標(biāo)點(diǎn)分隔的單詞:\n");

gets(a);

n=strlen(a);

for(i=0;i<=n-1;i++)

{if(isalnum(a[i])&&!isalnum(a[i+1]))

c++;

/*若第i個(gè)字符是字母或數(shù)字,第i+1個(gè)字符不是字母或數(shù)字,則表示一個(gè)單詞結(jié)束*/

}

printf("單詞個(gè)數(shù)=%d\n",c);

return 0;

}

程序運(yùn)行結(jié)果:

5 結(jié)論

通過(guò)以上程序的改進(jìn)過(guò)程可以發(fā)現(xiàn),只要不迷信于教材中的經(jīng)典案例,勇于改進(jìn),勇于創(chuàng)新,就能夠向?qū)W生傳授更加科學(xué)合理的知識(shí)和技能。而這個(gè)案例的改進(jìn)過(guò)程本身,也是對(duì)學(xué)生進(jìn)行創(chuàng)新教育的一個(gè)很好的樣板。

參考文獻(xiàn):

[1] 陳濤. 面向編程能力培養(yǎng)的C語(yǔ)言教學(xué)模式研究[J].計(jì)算機(jī)教育,2020(1):100-103.

[2] 薛小鋒.案例教學(xué)在非計(jì)算機(jī)專(zhuān)業(yè)“C語(yǔ)言程序設(shè)計(jì)”教學(xué)中的應(yīng)用[J].江蘇技術(shù)師范學(xué)院學(xué)報(bào),2010(4):80-82,88.

[3] 丁海燕.高級(jí)語(yǔ)言程序設(shè)計(jì)案例教學(xué)模式的探討[J].計(jì)算機(jī)教育,2011(8):65-68.

[4] 譚浩強(qiáng).C程序設(shè)計(jì)[M].5版.北京:清華大學(xué)出版社,2017.

[5] 田淑清.全國(guó)計(jì)算機(jī)等級(jí)考試二級(jí)教程——C語(yǔ)言程序設(shè)計(jì)(2016年版)[M].北京:高等教育出版社,2015.

[6] 巨同升.C語(yǔ)言程序設(shè)計(jì)新思路[M].北京:科學(xué)出版社,2020.

【通聯(lián)編輯:王力】

猜你喜歡
可讀性結(jié)構(gòu)性
基于應(yīng)力結(jié)構(gòu)性參數(shù)的典型黃土結(jié)構(gòu)性試驗(yàn)研究
新時(shí)代關(guān)于供給側(cè)結(jié)構(gòu)性改革的思考
切實(shí)抓好去產(chǎn)能促進(jìn)供給側(cè)結(jié)構(gòu)性改革
以黨報(bào)“主流觀點(diǎn)”引領(lǐng)正確輿論導(dǎo)向——淺析黑龍江日?qǐng)?bào)三組系列評(píng)論的思想性可讀性號(hào)召力
對(duì)推進(jìn)供給側(cè)結(jié)構(gòu)性改革的思考
關(guān)于結(jié)構(gòu)性改革一二三
對(duì)增強(qiáng)吸引力可讀性引導(dǎo)力的幾點(diǎn)思考
淺談對(duì)提高黨報(bào)可讀性的幾點(diǎn)看法