999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2020-02-22 03:35:44巨同升
電腦知識與技術(shù) 2020年36期

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

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

中圖分類號:TP312? ? ? ? 文獻(xiàn)標(biāo)識碼:A

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

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

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

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

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

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

源程序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è)空格,因此不能簡單地通過統(tǒng)計(jì)空格的個(gè)數(shù)以得到單詞的個(gè)數(shù)。該程序的編程思路是依據(jù)相鄰的兩個(gè)字符進(jìn)行判斷,當(dāng)相鄰的兩個(gè)字符中,前一個(gè)是空格符(即處于單詞外部),而后一個(gè)是非空格字符(即處于單詞內(nèi)部)時(shí),說明找到一個(gè)新的單詞的開頭,從而將單詞的個(gè)數(shù)加一。

由于在每次循環(huán)中只對當(dāng)前讀入的一個(gè)字符進(jìn)行判斷,因此在讀入下一個(gè)字符之前,必須將當(dāng)前字符對應(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,則說明前一個(gè)字符是空格符;若state的值為IN,則說明前一個(gè)字符是非空格字符。因此,當(dāng)讀入的新字符是非空格字符,而state的值為OUT(即前一個(gè)字符是空格符)時(shí),說明找到一個(gè)新的單詞的開頭。

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

2 改進(jìn)的程序

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

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

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

源程序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++;? ?/*說明找到一個(gè)新的單詞的開頭,將單詞的個(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存儲相鄰的兩個(gè)字符,其中c0存儲前一個(gè)字符,c存儲后一個(gè)字符。這樣,只需要同時(shí)對c0和c的值進(jìn)行判斷,即可確定是否找到一個(gè)新的單詞。也就是當(dāng)c0的值是空格符,而c的值是非空格字符時(shí),說明找到一個(gè)新的單詞的開頭,從而將單詞的個(gè)數(shù)加一。

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

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

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

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

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

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

源程序3:

#include

#include

int main(void)

{char a[200];

int i,n,c=0;

printf("請輸入一行以空格分隔的單詞:\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),相對于前面的程序,利用字符型數(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)符號分隔,如何應(yīng)對這個(gè)問題呢?其實(shí),只需要對源程序3稍加修改,就可以適應(yīng)這種新的要求。

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

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

源程序4:

#include

#include

#include

int main(void)

{char a[200];

int i,n,c=0;

printf("請輸入一行以空格或標(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é)論

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

參考文獻(xiàn):

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

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

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

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

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

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

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

主站蜘蛛池模板: 91久久精品日日躁夜夜躁欧美| 最新痴汉在线无码AV| 97国产精品视频人人做人人爱| 呦系列视频一区二区三区| 2019年国产精品自拍不卡| a毛片在线免费观看| 国产美女在线观看| 欧美亚洲一区二区三区导航| 日韩无码视频专区| 国产黄在线免费观看| 国产亚洲精品97AA片在线播放| 亚洲天堂精品视频| 久久亚洲黄色视频| 二级特黄绝大片免费视频大片| 国产成人精品18| 国产香蕉一区二区在线网站| 熟妇人妻无乱码中文字幕真矢织江| 国产波多野结衣中文在线播放| 99精品影院| 国产一区二区三区视频| 国产乱子伦精品视频| 欧美不卡视频一区发布| 在线观看国产精品日本不卡网| 日本一区二区三区精品国产| 欧美一级99在线观看国产| 伊大人香蕉久久网欧美| 久久国产精品夜色| 麻豆精品国产自产在线| 免费高清自慰一区二区三区| 免费在线看黄网址| 性网站在线观看| 伊人成人在线视频| 国产激情无码一区二区APP| 97久久人人超碰国产精品| 久无码久无码av无码| AV老司机AV天堂| av在线无码浏览| 玩两个丰满老熟女久久网| 无码专区国产精品第一页| 欧美成人精品一级在线观看| 欧美在线网| 国产欧美亚洲精品第3页在线| 青青草原国产| 色网站在线视频| www亚洲天堂| 亚洲高清中文字幕| 青草精品视频| 免费看美女自慰的网站| 天天综合网色中文字幕| 欧美在线黄| 日韩一级二级三级| 国产成人AV男人的天堂| 国产精品久线在线观看| 亚洲大尺码专区影院| 天天综合天天综合| 国产精品福利尤物youwu| 久久成人18免费| 色综合久久综合网| 91福利国产成人精品导航| 五月天久久婷婷| 国产精品视频3p| 999国内精品久久免费视频| 欧美色伊人| 这里只有精品国产| 在线免费不卡视频| 国产噜噜噜| 国产网站免费看| 成色7777精品在线| 亚洲三级片在线看| 97视频免费在线观看| 中文字幕精品一区二区三区视频| 福利小视频在线播放| 久久精品国产电影| 亚洲精品欧美日本中文字幕| 成人福利在线视频| 国产综合精品一区二区| 国内老司机精品视频在线播出| 色呦呦手机在线精品| 亚洲无线视频| 国产精品一老牛影视频| 精品人妻一区二区三区蜜桃AⅤ | 国产视频一区二区在线观看|