摘要:探討了switch分支結(jié)構(gòu)的常見錯(cuò)誤,分析了與嵌套、循環(huán)結(jié)構(gòu)的綜合使用,通過在計(jì)算機(jī)專業(yè)的卓越班和實(shí)驗(yàn)班的實(shí)踐證明,學(xué)生的綜合編程能力和動(dòng)手積極性得到進(jìn)一步提高。
關(guān)鍵詞:switch;嵌套;循環(huán);函數(shù)重載;教學(xué)實(shí)踐
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)35-0157-01
1 概述
在卓越班和實(shí)驗(yàn)班等基礎(chǔ)較好班級(jí)的教學(xué)過程中經(jīng)常遇到學(xué)生對(duì)switch語句執(zhí)行順序的種種困惑,在多次的上機(jī)考試和期末考試中丟分較多,本文針對(duì)與之相關(guān)的各種難點(diǎn)分析探討。
2 教學(xué)實(shí)踐
2.1使用背景
在分支結(jié)構(gòu)中我們常用if…else結(jié)構(gòu)實(shí)現(xiàn),但對(duì)表達(dá)式相同的進(jìn)行多次重復(fù)計(jì)算而毫無意義,switch語句正是恰好的解決方案。通過計(jì)算表達(dá)式的值,結(jié)合case語句實(shí)現(xiàn)到分支語句地跳轉(zhuǎn)來高效完成了多分支結(jié)構(gòu)的選擇功能。其語法形式如下:
switch(變量表達(dá)式)
fcase常量1:語句;break;
…
case常量n:語句;break;
default:語句;break;
}
2.2常見錯(cuò)誤
1)switch(表達(dá)式)中的表達(dá)式類型只能為int、char等離散的整型式類型。如:double x=2.36; switch(x){case 2:...}不符合要求。
2)case表達(dá)式具有唯一性。如:case 2:...case 2:...則錯(cuò)。
3)case分支中要有break否則繼續(xù)執(zhí)行該分支后繼續(xù)執(zhí)行下句而不跳出。
4)缺少default,則當(dāng)找不到匹配的case時(shí)程序出錯(cuò)。
2.3綜合舉例
例1 #include
main()
{ int iVarA=11,iVarB=12,iVarC=16;
switch(iVarA)
{case 11: switch(iVarB)
{case 12:printf("A");break;
case 13:printf("B");break;
case 14:pnntf("C");break;)
case 15: switch(iVarC)
{case 16;printf("D");
case 17:printf("E");}
default: printf("F");}}
上題的輸出結(jié)果是"ADEF"。本題出現(xiàn)switch嵌套結(jié)構(gòu),即在"case"分支中又出現(xiàn)"switch"語句。只要把分支中的復(fù)雜語句當(dāng)作該分支的一句復(fù)合語句來處理,則由繁到簡、方便求解。具體過程為:"iVarA"=11使得選擇"case 11",此分支中的"switch四句作為整體來處理即iVarB的值選擇"case 12"輸出"A"后遇到"break"跳出執(zhí)行"case 15"。此時(shí)的跳出不是"case11"的跳出,此時(shí)的"break"在"1"前,屬于"case 14"。故"case 11"不能跳出后執(zhí)行"case 15",由于"case 16"和"case 17"兩個(gè)分支都沒有;"break"故相繼輸出"DE",最后無跳轉(zhuǎn)執(zhí)行缺省語句輸出"F"。
例2 #include main()
{ char cMyVar;
while((cMyVar=getchar())!='\n')
switch(cMyVar-'1')
{case 0:
case 1:putchar(cMyVar+l);
case 2:putchar(cMyVar+2); break;
case 3:putchar(cMyVar+3);
default:putchar(cMyVar+4); break;}
printf("\n");}
上題是出錯(cuò)率很高的試題,當(dāng)輸入"2345"時(shí)輸出"345789"。下面分析解題過程:
"cMyVar"獲取輸入變量的第1個(gè)字符2,switch表達(dá)式計(jì)算得1此時(shí)分支對(duì)應(yīng)"case 1"輸出3,但該分支沒跳出語句故繼續(xù)執(zhí)行"case 2"輸出4遇到break而完成本次循環(huán);"cMyVar"獲取輸入的第2個(gè)字符3,計(jì)算后執(zhí)行"case 2"輸出5,遇到"break"而完成本次循環(huán);同理下2次循環(huán)依次得解。本題錯(cuò)點(diǎn):1)沒注意case分支中有的無break而提前跳出本次循環(huán);2)switch表達(dá)式中"cMyVar"減1但變量本身沒變,在處理分支結(jié)構(gòu)時(shí)有的把該變量減1后再輸出。
3 結(jié)論
switch分支結(jié)構(gòu)的跳轉(zhuǎn)語句讓不少初學(xué)者頭疼不已、錯(cuò)誤不斷,究其原因還是對(duì)缺省語句、"break"語句以及變量更改等不熟悉引起,本文結(jié)合幾個(gè)具體的綜合例子分析了上述易錯(cuò)原因。
參考文獻(xiàn):
[1]胡玲潔.《C++程序設(shè)計(jì)》中職教學(xué)中的易錯(cuò)分析[J].電腦知識(shí)與技術(shù),2019(02).
[2]譚浩強(qiáng).C++面向?qū)ο蟪绦蛟O(shè)計(jì)[M].北京:清華大學(xué)出版社,2006.
[3]呂鳳翥.C++語言基礎(chǔ)教程[M].北京:清華大學(xué)出版社.1999.
[4]Bjarne Stroustrup.C++程序設(shè)計(jì)語言:特別版[M].裘宗燕,譯.北京:機(jī)械工業(yè)出版社,2010.
[5]錢能.C++程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,1999.
[6]Stanley,B.Lippman,Barbara E.Moo.C++Primer中文版:第四版[M].李師賢,等譯.北京:人民郵電出版社,2006.
[7]陳維興,林小茶.C++面向?qū)ο蟪绦蛟O(shè)計(jì)教程[M].北京:清華大學(xué)出版社,2000.
[8]胡金錦.編程:一種觀察世界的新視角——以《冒泡排序》一課為例談?dòng)?jì)算思維[J].電腦知識(shí)與技術(shù),2017(35).
[9]張敏輝.將案例驅(qū)動(dòng)教學(xué)法運(yùn)用于程序設(shè)計(jì)類課程的實(shí)踐與成效[J].高等教育研究,2012,29(2).
【通聯(lián)編輯:王力】
收稿日期:2019-09-10
作者簡介:韓祥波(1975-),男,山東淄博人,講師,碩士,研究方向?yàn)橛?jì)算機(jī)軟件與理論。