c語言程序范文
時間:2023-03-14 06:54:08
導語:如何才能寫好一篇c語言程序,這就需要搜集整理更多的資料和文獻,歡迎閱讀由公務員之家整理的十篇范文,供你借鑒。
篇1
從程序流程的角度來看,程序可以分為三種基本結構,即順序結構、分支結構、循環(huán)結構。這三種基本結構可以組成所有的各種復雜程序。c語言提供了多種語句來實現(xiàn)這些程序結構。本章介紹這些基本語句及其應用,使讀者對c程序有一個初步的認識,為后面各章的學習打下基礎。
c程序的語句
c程序的執(zhí)行部分是由語句組成的。程序的功能也是由執(zhí)行語句實現(xiàn)的。
C語句可分為以下五類:
1.表達式語句
2.函數(shù)調用語句
3.控制語句
4.復合語句
5.空語句
1.表達式語句
表達式語句由表達式加上分號“;”組成。其一般形式為:表達式;執(zhí)行表達式語句就是計算表達式的值。例如:x=y+z;賦值語句y+z;加法運算語句,但計算結果不能保留,無實際意義i++;自增1語句,i值增1
2.函數(shù)調用語句
由函數(shù)名、實際參數(shù)加上分號“;”組成。其一般形式為:函數(shù)名(實際參數(shù)表);執(zhí)行函數(shù)語句就是調用函數(shù)體并把實際參數(shù)賦予函數(shù)定義中的形式參數(shù),然后執(zhí)行被調函數(shù)體中的語句,求取函數(shù)值。(在第五章函數(shù)中再詳細介紹)例如printf("CProgram");調用庫函數(shù),輸出字符串。
3.控制語句
控制語句用于控制程序的流程,以實現(xiàn)程序的各種結構方式。
它們由特定的語句定義符組成。c語言有九種控制語句。可分成以下三類:
(1)條件判斷語句
if語句,switch語句
(2)循環(huán)執(zhí)行語句
dowhile語句,while語句,for語句
(3)轉向語句
break語句,goto語句,continue語句,return語句
4.復合語句
把多個語句用括號{}括起來組成的一個語句稱復合語句。在程序中應把復合語句看成是單條語句,而不是多條語句,例如
{
x=y+z;
a=b+c;
printf(“%d%d”,x,a);
}
是一條復合語句。復合語句內的各條語句都必須以分號“;”結尾,在括號“}”外不能加分號。
5.空語句
只有分號“;”組成的語句稱為空語句。空語句是什么也不執(zhí)行的語句。在程序中空語句可用來作空循環(huán)體。例如while(getchar()!=''''\n'''');本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。這里的循環(huán)體為空語句。
賦值語句
賦值語句是由賦值表達式再加上分號構成的表達式語句。其一般形式為:變量=表達式;賦值語句的功能和特點都與賦值表達式相同。它是程序中使用最多的語句之一。在賦值語句的使用中需要注意以下幾點:
1.由于在賦值符“=”右邊的表達式也可以又是一個賦值表達式,因此,下述形式變量=(變量=表達式);是成立的,從而形成嵌套的情形。其展開之后的一般形式為:變量=變量=…=表達式;
例如:
a=b=c=d=e=5;按照賦值運算符的右接合性,因此實際上等效于:
e=5;
d=e;
c=d;
b=c;
a=b;
2.注意在變量說明中給變量賦初值和賦值語句的區(qū)別。給變量賦初值是變量說明的一部分,賦初值后的變量與其后的其它同類變量之間仍必須用逗號間隔,而賦值語句則必須用分號結尾。
3.在變量說明中,不允許連續(xù)給多個變量賦初值。如下述說明是錯誤的:inta=b=c=5必須寫為inta=5,b=5,c=5;而賦值語句允許連續(xù)賦值
4.注意賦值表達式和賦值語句的區(qū)別。賦值表達式是一種表達式,它可以出現(xiàn)在任何允許表達式出現(xiàn)的地方,而賦值語句則不能。
下述語句是合法的:if((x=y+5)>0)z=x;語句的功能是,若表達式x=y+5大于0則z=x。下述語句是非法的:if((x=y+5;)>0)z=x;因為=y+5;是語句,不能出現(xiàn)在表達式中。
數(shù)據(jù)輸出語句
本小節(jié)介紹的是向標準輸出設備顯示器輸出數(shù)據(jù)的語句。在c語言中,所有的數(shù)據(jù)輸入/輸出都是由庫函數(shù)完成的。因此都是函數(shù)語句。本小節(jié)先介紹printf函數(shù)和putchar函數(shù)。printf函數(shù)printf函數(shù)稱為格式輸出函數(shù),其關鍵字最末一個字母f即為“格式”(format)之意。其功能是按用戶指定的格式,把指定的數(shù)據(jù)顯示到顯示器屏幕上。在前面的例題中我們已多次使用過這個函數(shù)。
一、printf函數(shù)調用的一般形式
printf函數(shù)是一個標準庫函數(shù),它的函數(shù)原型在頭文件“stdio.h”中。但作為一個特例,不要求在使用printf函數(shù)之前必須包含stdio.h文件。printf函數(shù)調用的一般形式為:printf(“格式控制字符串”,輸出表列)其中格式控制字符串用于指定輸出格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數(shù)據(jù)的類型、形式、長度、小數(shù)位數(shù)等。如“%d”表示按十進制整型輸出,“%ld”表示按十進制長整型輸出,“%c”表示按字符型輸出等。后面將專門給予討論。
非格式字符串在輸出時原樣照印,在顯示中起提示作用。輸出表列中給出了各個輸出項,要求格式字符串和各輸出項在數(shù)量和類型上應該一一對應。
voidmain()
{
inta=88,b=89;
printf("%d%d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
}
a<--8,b<--89
printf("%d%d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
本例中四次輸出了a,b的值,但由于格式控制串不同,輸出的結果也不相同。第四行的輸出語句格式控制串中,兩格式串%d之間加了一個空格(非格式字符),所以輸出的a,b值之間有一個空格。第五行的printf語句格式控制串中加入的是非格式字符逗號,因此輸出的a,b值之間加了一個逗號。第六行的格式串要求按字符型輸出a,b值。第七行中為了提示輸出結果又增加了非格式字符串。
二、格式字符串
在TurboC中格式字符串的一般形式為:[標志][輸出最小寬度][.精度][長度]類型其中方括號[]中的項為可選項。各項的意義介紹如下:
1.類型類型字符用以表示輸出數(shù)據(jù)的類型,其格式符和意義下表所示:
表示輸出類型的格式字符格式字符意義
d以十進制形式輸出帶符號整數(shù)(正數(shù)不輸出符號)
o以八進制形式輸出無符號整數(shù)(不輸出前綴O)
x以十六進制形式輸出無符號整數(shù)(不輸出前綴OX)
u以十進制形式輸出無符號整數(shù)
f以小數(shù)形式輸出單、雙精度實數(shù)
e以指數(shù)形式輸出單、雙精度實數(shù)
g以%f%e中較短的輸出寬度輸出單、雙精度實數(shù)
c輸出單個字符
s輸出字符串
2.標志
標志字符為-、+、#、空格四種,其意義下表所示:
標志格式字符標志意義
-結果左對齊,右邊填空格
+輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號
#對c,s,d,u類無影響;對o類,在輸出時加前
綴o對x類,在輸出時加前綴0x;對e,g,f類當結果有小數(shù)時才給出小數(shù)點
3.輸出最小寬度
用十進制整數(shù)來表示輸出的最少位數(shù)。若實際位數(shù)多于定義的寬度,則按實際位數(shù)輸出,若實際位數(shù)少于定義的寬度則補以空格或0。
4.精度
精度格式符以“.”開頭,后跟十進制整數(shù)。本項的意義是:如果輸出數(shù)字,則表示小數(shù)的位數(shù);如果輸出的是字符,則表示輸出字符的個數(shù);若實際位數(shù)大于所定義的精度數(shù),則截去超過的部分。
5.長度
長度格式符為h,l兩種,h表示按短整型量輸出,l表示按長整型量輸出。
voidmain(){
inta=15;
floatb=138.3576278;
doublec=35648256.3645687;
chard=''''p'''';
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
printf("c=%lf,%f,%8.4lf\n",c,c,c);
printf("d=%c,%8c\n",d,d);
}a<--15
b<--138.3576278
c<--35648256.3645687
d<--''''p''''main()
{
inta=29;
floatb=1243.2341;
doublec=24212345.24232;
charc=''''h''''
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
printf("c=%lf,%f,%8.4lf\n",c,c,c);
printf("d=%c,%8c\n",d,d);
}
本例第七行中以四種格式輸出整型變量a的值,其中“%5d”要求輸出寬度為5,而a值為15只有兩位故補三個空格。第八行中以四種格式輸出實型量b的值。其中“%f”和“%lf”格式的輸出相同,說明“l(fā)”符對“f”類型無影響。“%5.4lf”指定輸出寬度為5,精度為4,由于實際長度超過5故應該按實際位數(shù)輸出,小數(shù)位數(shù)超過4位部分被截去。第九行輸出雙精度實數(shù),“%8.4lf”由于指定精度為4位故截去了超過4位的部分。第十行輸出字符量d,其中“%bc”指定輸出寬度為8故在輸出字符p之前補加7個空格。
使用printf函數(shù)時還要注意一個問題,那就是輸出表列中的求值順序。不同的編譯系統(tǒng)不一定相同,可以從左到右,也可從右到左。TurboC是按從右到左進行的。如把例2.13改寫如下述形式:
voidmain(){
inti=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i--,i++,-i--);
}i<--8
這個程序與例2.13相比只是把多個printf語句改一個printf語句輸出。但從結果可以看出是不同的。為什么結果會不同呢?就是因為printf函數(shù)對輸出表中各量求值的順序是自右至左進行的。在式中,先對最后一項“-i--”求值,結果為-8,然后i自減1后為7。再對“-i++”項求值得-7,然后i自增1后為8。再對“i--”項求值得8,然后i再自減1后為7。再求“i++”項得7,然后I再自增1后為8。再求“--i”項,i先自減1后輸出,輸出值為7。最后才求輸出表列中的第一項“++i”,此時i自增1后輸出8。但是必須注意,求值順序雖是自右至左,但是輸出順序還是從左至右,因此得到的結果是上述輸出結果。
字符輸出函數(shù)
putchar函數(shù)
putchar函數(shù)是字符輸出函數(shù),其功能是在顯示器上輸出單個字符。其一般形式為:putchar(字符變量)例如:
putchar(''''A'''');輸出大寫字母A
putchar(x);輸出字符變量x的值
putchar(''''\n'''');換行對控制字符則執(zhí)行控制功能,不在屏幕上顯示。使用本函數(shù)前必須要用文件包含命令:
#include<stdio.h>
#include<stdio.h>
voidmain(){
chara=''''B'''',b=''''o'''',c=''''k'''';
putchar(a);putchar(b);putchar(b);putchar(c);putchar(''''\t'''');
putchar(a);putchar(b);
putchar(''''\n'''');
putchar(b);putchar(c);
}
數(shù)據(jù)輸入語句
c語言的數(shù)據(jù)輸入也是由函數(shù)語句完成的。本節(jié)介紹從標準輸入設備—鍵盤上輸入數(shù)據(jù)的函數(shù)scanf和getchar。scanf函數(shù)scanf函數(shù)稱為格式輸入函數(shù),即按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變量之中。
一、scanf函數(shù)的一般形式
scanf函數(shù)是一個標準庫函數(shù),它的函數(shù)原型在頭文件“stdio.h”中,與printf函數(shù)相同,c語言也允許在使用scanf函數(shù)之前不必包含stdio.h文件。scanf函數(shù)的一般形式為:scanf(“格式控制字符串”,地址表列);其中,格式控制字符串的作用與printf函數(shù)相同,但不能顯示非格式字符串,也就是不能顯示提示字符串。地址表列中給出各變量的地址。地址是由地址運算符“&”后跟變量名組成的。例如,&a,&b分別表示變量a和變量b的地址。這個地址就是編譯系統(tǒng)在內存中給a,b變量分配的地址。在c語言中,使用了地址這個概念,這是與其它語言不同的。應該把變量的值和變量的地址這兩個不同的概念區(qū)別開來。變量的地址是C編譯系統(tǒng)分配的,用戶不必關心具體的地址是多少。變量的地址和變量值的關系如下:&a--->a567a為變量名,567是變量的值,&a是變量a的地址。在賦值表達式中給變量賦值,如:a=567在賦值號左邊是變量名,不能寫地址,而scanf函數(shù)在本質上也是給變量賦值,但要求寫變量的地址,如&a。這兩者在形式上是不同的。&是一個取地址運算符,&a是一個表達式,其功能是求變量的地址。
voidmain(){
inta,b,c;
printf("inputa,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
注意&的用法!
在本例中,由于scanf函數(shù)本身不能顯示提示串,故先用printf語句在屏幕上輸出提示,請用戶輸入a、b、c的值。執(zhí)行scanf語句,則退出TC屏幕進入用戶屏幕等待用戶輸入。用戶輸入7、8、9后按下回車鍵,此時,系統(tǒng)又將返回TC屏幕。在scanf語句的格式串中由于沒有非格式字符在“%d%d%d”之間作輸入時的間隔,因此在輸入時要用一個以上的空格或回車鍵作為每兩個輸入數(shù)之間的間隔。
如:789
或
7
8
9
格式字符串
格式字符串的一般形式為:%[*][輸入數(shù)據(jù)寬度][長度]類型其中有方括號[]的項為任選項。各項的意義如下:
1.類型
表示輸入數(shù)據(jù)的類型,其格式符和意義下表所示。
格式字符意義
d輸入十進制整數(shù)
o輸入八進制整數(shù)
x輸入十六進制整數(shù)
u輸入無符號十進制整數(shù)
f或e輸入實型數(shù)(用小數(shù)形式或指數(shù)形式)
c輸入單個字符
s輸入字符串
2.“*”符
用以表示該輸入項讀入后不賦予相應的變量,即跳過該輸入值。如scanf("%d%*d%d",&a,&b);當輸入為:123時,把1賦予a,2被跳過,3賦予b。
3.寬度
用十進制整數(shù)指定輸入的寬度(即字符數(shù))。例如:scanf("%5d",&a);
輸入:
12345678
只把12345賦予變量a,其余部分被截去。又如:scanf("%4d%4d",&a,&b);
輸入:
12345678將把1234賦予a,而把5678賦予b。
4.長度
長度格式符為l和h,l表示輸入長整型數(shù)據(jù)(如%ld)和雙精度浮點數(shù)(如%lf)。h表示輸入短整型數(shù)據(jù)。
使用scanf函數(shù)還必須注意以下幾點:
a.scanf函數(shù)中沒有精度控制,如:scanf("%5.2f",&a);是非法的。不能企圖用此語句輸入小數(shù)為2位的實數(shù)。
b.scanf中要求給出變量地址,如給出變量名則會出錯。如scanf("%d",a);是非法的,應改為scnaf("%d",&a);才是合法的。
c.在輸入多個數(shù)值數(shù)據(jù)時,若格式控制串中沒有非格式字符作輸入數(shù)據(jù)之間的間隔則可用空格,TAB或回車作間隔。C編譯在碰到空格,TAB,回車或非法數(shù)據(jù)(如對“%d”輸入“12A”時,A即為非法數(shù)據(jù))時即認為該數(shù)據(jù)結束。
d.在輸入字符數(shù)據(jù)時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有效字符。例如:
scanf("%c%c%c",&a,&b,&c);
輸入為:
def
則把''''d''''賦予a,''''f''''賦予b,''''e''''賦予c。只有當輸入為:
def
時,才能把''''d''''賦于a,''''e''''賦予b,''''f''''賦予c。如果在格式控制中加入空格作為間隔,如scanf("%c%c%c",&a,&b,&c);則輸入時各數(shù)據(jù)之間可加空格。
voidmain(){
chara,b;
printf("inputcharactera,b\n");
scanf("%c%c",&a,&b);
printf("%c%c\n",a,b);
}
scanf("''''C14F14%c%c",&a,&b);
printf("%c%c\n",a,b);由于scanf函數(shù)"%c%c"中沒有空格,輸入MN,結果輸出只有M。
而輸入改為MN時則可輸出MN兩字符,見下面的輸入運行情況:inputcharactera,b
MN
MN
voidmain(){
chara,b;
printf("inputcharactera,b\n");
scanf("%c%c",&a,&b);
printf("\n%c%c\n",a,b);
}
scanf("%c%c",&a,&b);本例表示scanf格式控制串"%c%c"之間有空格時,輸入的數(shù)據(jù)之間可以有空格間隔。e.如果格式控制串中有非格式字符則輸入時也要輸入該非格式字符。
例如:
scanf("%d,%d,%d",&a,&b,&c);其中用非格式符“,”作間隔符,故輸入時應為:5,6,7
又如:scanf("a=%d,b=%d,c=%d",&a,&b,&c);
則輸入應為
a=5,b=6,c=7g.如輸入的數(shù)據(jù)與輸出的類型不一致時,雖然編譯能夠通過,但結果將不正確。
voidmain(){
inta;
printf("inputanumber\n");
scanf("%d",&a);
printf("%ld",a);
}
由于輸入數(shù)據(jù)類型為整型,而輸出語句的格式串中說明為長整型,因此輸出結果和輸入數(shù)據(jù)不符。如改動程序如下:
voidmain(){
longa;
printf("inputalonginteger\n");
scanf("%ld",&a);
printf("%ld",a);
}
運行結果為:
inputalonginteger
1234567890
1234567890當輸入數(shù)據(jù)改為長整型后,輸入輸出數(shù)據(jù)相等。
鍵盤輸入函數(shù)
getchar函數(shù)getchar函數(shù)的功能是從鍵盤上輸入一個字符。其一般形式為:getchar();通常把輸入的字符賦予一個字符變量,構成賦值語句,如:
charc;
c=getchar();#include<stdio.h>
voidmain(){
charc;
printf("inputacharacter\n");
c=getchar();
putchar(c);
}
使用getchar函數(shù)還應注意幾個問題:
1.getchar函數(shù)只能接受單個字符,輸入數(shù)字也按字符處理。輸入多于一個字符時,只接收第一個字符。
2.使用本函數(shù)前必須包含文件“stdio.h”。
3.在TC屏幕下運行含本函數(shù)程序時,將退出TC屏幕進入用戶屏幕等待用戶輸入。輸入完畢再返回TC屏幕。
voidmain(){
chara,b,c;
printf("inputcharactera,b,c\n");
scanf("%c%c%c",&a,&b,&c);
printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);
}
輸入三個小寫字母
輸出其ASCII碼和對應的大寫字母。
voidmain(){
inta;
longb;
floatf;
doubled;
charc;
printf("%d,%d,%d,%d,%d",sizeof(a),sizeof(b),sizeof(f)
,sizeof(d),sizeof(c));
}
輸出各種數(shù)據(jù)類型的字節(jié)長度。
分支結構程序
關系運算符和表達式
在程序中經常需要比較兩個量的大小關系,以決定程序下一步的工作。比較兩個量的運算符稱為關系運算符。在c語言中有以下關系運算符:
<小于
<=小于或等于
>大于
>=大于或等于
==等于
!=不等于
關系運算符都是雙目運算符,其結合性均為左結合。關系運算符的優(yōu)先級低于算術運算符,高于賦值運算符。在六個關系運算符中,<,<=,>,>=的優(yōu)先級相同,高于==和!=,==和!=的優(yōu)先級相同。
關系表達式
關系表達式的一般形式為:表達式關系運算符表達式例如:a+b>c-d,x>3/2,''''a''''+1<c,-i-5*j==k+1;都是合法的關系表達式。由于表達式也可以又是關系表達式。因此也允許出現(xiàn)嵌套的情況,例如:a>(b>c),a!=(c==d)等。關系表達式的值是“真”和“假”,用“1”和“0”表示。
如:5>0的值為“真”,即為1。(a=3)>(b=5)由于3>5不成立,故其值為假,即為0。
voidmain(){
charc=''''k'''';
inti=1,j=2,k=3;
floatx=3e+5,y=0.85;
printf("%d,%d\n",''''a''''+5<c,-i-2*j>=k+1);
printf("%d,%d\n",1<j<5,x-5.25<=x+y);
printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);
}
charc=''''k'''';
inti=1,j=2,k=3;
floatx=3e+5,y=0.85;
printf("%d,%d\n",''''a''''+5<c,-i-2*j>=k+1);
printf("%d,%d\n",1<j<5,x-5.25<=x+y);
printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);
在本例中求出了各種關系運算符的值。字符變量是以它對應的ASCII碼參與運算的。對于含多個關系運算符的表達式,如k==j==i+5,根據(jù)運算符的左結合性,先計算k==j,該式不成立,其值為0,再計算0==i+5,也不成立,故表達式值為0。
邏輯運算符和表達式
邏輯運算符c語言中提供了三種邏輯運算符&&與運算||或運算!非運算與運算符&&和或運算符||均為雙目運算符。具有左結合性。非
運算符!為單目運算符,具有右結合性。邏輯運算符和其它運算符優(yōu)先級的關系可表示如下:
按照運算符的優(yōu)先順序可以得出:
a>b&&c>d等價于(a>b)&&(c>d)
!b==c||d<a等價于((!b)==c)||(d<a)
a+b>c&&x+y<b等價于((a+b)>c)&&((x+y)<b)
邏輯運算的值
邏輯運算的值也為“真”和“假”兩種,用“1”和“0”來表示。其求值規(guī)則如下:
1.與運算&&參與運算的兩個量都為真時,結果才為真,否則為假。例如,5>0&&4>2,由于5>0為真,4>2也為真,相與的結果也為真。
2.或運算||參與運算的兩個量只要有一個為真,結果就為真。兩個量都為假時,結果為假。例如:5>0||5>8,由于5>0為真,相或的結果也就為真
3.非運算!參與運算量為真時,結果為假;參與運算量為假時,結果為真。
例如:!(5>0)的結果為假。
雖然c編譯在給出邏輯運算值時,以“1”代表“真”,“0”代表“假”。但反過來在判斷一個量是為“真”還是為“假”時,以“0”代表“假”,以非“0”的數(shù)值作為“真”。例如:由于5和3均為非“0”因此5&&3的值為“真”,即為1。
又如:5||0的值為“真”,即為1。
邏輯表達式邏輯表達式的一般形式為:表達式邏輯運算符表達式其中的表達式可以又是邏輯表達式,從而組成了嵌套的情形。例如:(a&&b)&&c根據(jù)邏輯運算符的左結合性,上式也可寫為:a&&b&&c邏輯表達式的值是式中各種邏輯運算的最后值,以“1”和“0”分別代表“真”和“假”。
voidmain(){
charc=''''k'''';
inti=1,j=2,k=3;
floatx=3e+5,y=0.85;
printf("%d,%d\n",!x*!y,!!!x);
printf("%d,%d\n",x||i&&j-3,i<j&&x<y);
printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);
}charc=''''k'''';
inti=1,j=2,k=3;
floatx=3e+5,y=0.85;
printf("%d,%d\n",!x*!y,!!!x);
printf("%d,%d\n",x||i&&j-3,i<j&&x<y);
printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);
本例中!x和!y分別為0,!x*!y也為0,故其輸出值為0。由于x為非0,故!!!x的邏輯值為0。對x||i&&j-3式,先計算j-3的值為非0,再求i&&j-3的邏輯值為1,故x||i&&j-3的邏輯值為1。對i<j&&x<y式,由于i<j的值為1,而x<y為0故表達式的值為1,0相與,最后為0,對i==5&&c&&(j=8)式,由于i==5為假,即值為0,該表達式由兩個與運算組成,所以整個表達式的值為0。對于式x+y||i+j+k由于x+y的值為非0,故整個或表達式的值為1。
if語句
用if語句可以構成分支結構。它根據(jù)給定的條件進行判斷,以決定執(zhí)行某個分支程序段。c語言的if語句有三種基本形式。
1.第一種形式為基本形式if(表達式)語句;其語義是:如果表達式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句。其過程可表示為下圖
voidmain(){
inta,b,max;
printf("\ninputtwonumbers:");
scanf("%d%d",&a,&b);
max=a;
if(max<b)max=b;
printf("max=%d",max);
}
輸入兩個整數(shù),輸出其中的大數(shù)。
scanf("%d%d",&a,&b);
max=a;
if(max<b)max=b;
printf("max=%d",max);
本例程序中,輸入兩個數(shù)a,b。把a先賦予變量max,再用if語句判別max和b的大小,如max小于b,則把b賦予max。因此max中總是大數(shù),最后輸出max的值。
2.第二種形式為if-else形式
if(表達式)
語句1;
else
語句2;
其語義是:如果表達式的值為真,則執(zhí)行語句1,否則執(zhí)行語句2。
voidmain(){
inta,b;
printf("inputtwonumbers:");
scanf("%d%d",&a,&b);
if(a>b)
printf("max=%d\n",a);
else
printf("max=%d\n",b);
}
輸入兩個整數(shù),輸出其中的大數(shù)。改用if-else語句判別a,b的大小,若a大,則輸出a,否則輸出b。
3.第三種形式為if-else-if形式
前二種形式的if語句一般都用于兩個分支的情況。當有多個分支選擇時,可采用if-else-if語句,其一般形式為:
if(表達式1)
語句1;
elseif(表達式2)
語句2;
elseif(表達式3)
語句3;
…
elseif(表達式m)
語句m;
else
語句n;
其語義是:依次判斷表達式的值,當出現(xiàn)某個值為真時,則執(zhí)行其對應的語句。然后跳到整個if語句之外繼續(xù)執(zhí)行程序。如果所有的表達式均為假,則執(zhí)行語句n。然后繼續(xù)執(zhí)行后續(xù)程序。if-else-if語句的執(zhí)行過程如圖3—3所示。
#include"stdio.h"
voidmain(){
charc;
printf("inputacharacter:");
c=getchar();
if(c<32)
printf("Thisisacontrolcharacter\n");
elseif(c>=''''0''''&&c<=''''9'''')
printf("Thisisadigit\n");
elseif(c>=''''A''''&&c<=''''Z'''')
printf("Thisisacapitalletter\n");
elseif(c>=''''a''''&&c<=''''z'''')
printf("Thisisasmallletter\n");
else
printf("Thisisanothercharacter\n");
}
if(c<32)
printf("Thisisacontrolcharacter\n");
elseif(c>=''''0''''&&c<=''''9'''')
printf("Thisisadigit\n");
elseif(c>=''''A''''&&c<=''''Z'''')
printf("Thisisacapitalletter\n");
elseif(c>=''''a''''&&c<=''''z'''')
printf("Thisisasmallletter\n");
else
printf("Thisisanothercharacter\n");
本例要求判別鍵盤輸入字符的類別。可以根據(jù)輸入字符的ASCII碼來判別類型。由ASCII碼表可知ASCII值小于32的為控制字符。在“0”和“9”之間的為數(shù)字,在“A”和“Z”之間為大寫字母,在“a”和“z”之間為小寫字母,其余則為其它字符。這是一個多分支選擇的問題,用if-else-if語句編程,判斷輸入字符ASCII碼所在的范圍,分別給出不同的輸出。例如輸入為“g”,輸出顯示它為小寫字符。
4.在使用if語句中還應注意以下問題
(1)在三種形式的if語句中,在if關鍵字之后均為表達式。該表達式通常是邏輯表達式或關系表達式,但也可以是其它表達式,如賦值表達式等,甚至也可以是一個變量。例如:if(a=5)語句;if(b)語句;都是允許的。只要表達式的值為非0,即為“真”。如在if(a=5)…;中表達式的值永遠為非0,所以其后的語句總是要執(zhí)行的,當然這種情況在程序中不一定會出現(xiàn),但在語法上是合法的。
又如,有程序段:if(a=b)
printf("%d",a);
else
printf("a=0");本語句的語義是,把b值賦予a,如為非0則輸出該值,否則輸出“a=0”字符串。這種用法在程序中是經常出現(xiàn)的。
(2)在if語句中,條件判斷表達式必須用括號括起來,在語句之后必須加分號。
(3)在if語句的三種形式中,所有的語句應為單個語句,如果要想在滿足條件時執(zhí)行一組(多個)語句,則必須把這一組語句用{}括起來組成一個復合語句。但要注意的是在}之后不能再加分號。
例如:
if(a>b){
a++;
b++;
}
else{a=0;
b=10;
}
if語句的嵌套
當if語句中的執(zhí)行語句又是if語句時,則構成了if語句嵌套的情形。其一般形式可表示如下:
if(表達式)
if語句;
或者為
if(表達式)
if語句;
else
if語句;
在嵌套內的if語句可能又是if-else型的,這將會出現(xiàn)多個if和多個else重疊的情況,這時要特別注意if和else的配對問題。例如:
if(表達式1)
if(表達式2)
語句1;
else
語句2;
其中的else究竟是與哪一個if配對呢?
應該理解為:還是應理解為:
if(表達式1)if(表達式1)
if(表達式2)if(表達式2)
語句1;語句1;
elseelse
語句2;語句2;
為了避免這種二義性,c語言規(guī)定,else總是與它前面最近的if配對,因此對上述例子應按前一種情況理解。
voidmain(){
inta,b;
printf("pleaseinputA,B:");
scanf("%d%d",&a,&b);
if(a!=b)
if(a>b)printf("A>B\n");
elseprintf("A<B\n");
elseprintf("A=B\n");
}
比較兩個數(shù)的大小關系。
printf("pleaseinputA,B:");
scanf("%d%d",&a,&b);
if(a!=b)
if(a>b)printf("A>B\n");
elseprintf("A<B\n");
elseprintf("A=B\n");
本例中用了if語句的嵌套結構。采用嵌套結構實質上是為了進行多分支選擇,例3.16實際上有三種選擇即A>B、A<B或A=B。這種問題用if-else-if語句也可以完成。而且程序更加清晰。因此,在一般情況下較少使用if語句的嵌套結構。以使程序更便于閱讀理解。
voidmain(){
inta,b;
printf("pleaseinputA,B:");
scanf("%d%d",&a,&b);
if(a==b)printf("A=B\n");
elseif(a>b)printf("A>B\n");
elseprintf("A<B\n");
}
條件運算符和條件表達式
如果在條件語句中,只執(zhí)行單個的賦值語句時,常可使用條件表達式來實現(xiàn)。不但使程序簡潔,也提高了運行效率。
條件運算符為?和:,它是一個三目運算符,即有三個參與運算的量。由條件運算符組成條件表達式的一般形式為:
表達式1?表達式2:表達式3
其求值規(guī)則為:如果表達式1的值為真,則以表達式2的值作為條件表達式的值,否則以表達式2的值作為整個條件表達式的值。條件表達式通常用于賦值語句之中。
例如條件語句:
if(a>b)max=a;
elsemax=b;
可用條件表達式寫為max=(a>b)?a:b;執(zhí)行該語句的語義是:如a>b為真,則把a賦予max,否則把b賦予max。
使用條件表達式時,還應注意以下幾點:
1.條件運算符的運算優(yōu)先級低于關系運算符和算術運算符,但高于賦值符。因此max=(a>b)?a:b可以去掉括號而寫為max=a>b?a:b
2.條件運算符?和:是一對運算符,不能分開單獨使用。
3.條件運算符的結合方向是自右至左。
例如:
a>b?a:c>d?c:d應理解為
a>b?a:(c>d?c:d)這也就是條件表達式嵌套的情形,即其中的表達式3又是一個條
件表達式。
voidmain(){
inta,b,max;
printf("\ninputtwonumbers:");
scanf("%d%d",&a,&b);
printf("max=%d",a>b?a:b);
}
用條件表達式對上例重新編程,輸出兩個數(shù)中的大數(shù)。
switch語句
c語言還提供了另一種用于多分支選擇的switch語句,其一般形式為:
switch(表達式){
case常量表達式1:語句1;
case常量表達式2:語句2;
…
case常量表達式n:語句n;
default:語句n+1;
}
其語義是:計算表達式的值。并逐個與其后的常量表達式值相比較,當表達式的值與某個常量表達式的值相等時,即執(zhí)行其后的語句,然后不再進行判斷,繼續(xù)執(zhí)行后面所有case后的語句。如表達式的值與所有case后的常量表達式均不相同時,則執(zhí)行default后的語句。
voidmain(){
inta;
printf("inputintegernumber:");
scanf("%d",&a);
switch(a){
case1:printf("Monday\n");
case2:printf("Tuesday\n");
case3:printf("Wednesday\n");
case4:printf("Thursday\n");
case5:printf("Friday\n");
case6:printf("Saturday\n");
case7:printf("Sunday\n");
default:printf("error\n");
}
}
本程序是要求輸入一個數(shù)字,輸出一個英文單詞。但是當輸入3之后,卻執(zhí)行了case3以及以后的所有語句,輸出了Wednesday及以后的所有單詞。這當然是不希望的。為什么會出現(xiàn)這種情況呢?這恰恰反應了switch語句的一個特點。在switch語句中,“case常量表達式”只相當于一個語句標號,表達式的值和某標號相等則轉向該標號執(zhí)行,但不能在執(zhí)行完該標號的語句后自動跳出整個switch語句,所以出現(xiàn)了繼續(xù)執(zhí)行所有后面case語句的情況。這是與前面介紹的if語句完全不同的,應特別注意。為了避免上述情況,c語言還提供了一種break語句,專用于跳出switch語句,break語句只有關鍵字break,沒有參數(shù)。在后面還將詳細介紹。修改例題的程序,在每一case語句之后增加break語句,使每一次執(zhí)行之后均可跳出switch語句,從而避免輸出不應有的結果。
voidmain(){
inta;
printf("inputintegernumber:");
scanf("%d",&a);
switch(a){
case1:printf("Monday\n");break;
case2:printf("Tuesday\n");break;
case3:printf("Wednesday\n");break;
case4:printf("Thursday\n");break;
case5:printf("Friday\n");break;
case6:printf("Saturday\n");break;
case7:printf("Sunday\n");break;
default:printf("error\n");
}
}
在使用switch語句時還應注意以下幾點:
1.在case后的各常量表達式的值不能相同,否則會出現(xiàn)錯誤。
2.在case后,允許有多個語句,可以不用{}括起來。
3.各case和default子句的先后順序可以變動,而不會影響程序執(zhí)行結果。
4.default子句可以省略不用。程序舉例
輸入三個整數(shù),輸出最大數(shù)和最小數(shù)。
voidmain(){
inta,b,c,max,min;
printf("inputthreenumbers:");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{max=a;min=b;}
else
{max=b;min=a;}
if(max<c)
max=c;
else
if(min>c)
min=c;
printf("max=%d\nmin=%d",max,min);
}
本程序中,首先比較輸入的a,b的大小,并把大數(shù)裝入max,小數(shù)裝入min中,然后再與c比較,若max小于c,則把c賦予max;如果c小于min,則把c賦予min。因此max內總是最大數(shù),而min內總是最小數(shù)。最后輸出max和min的值即可。計算器程序。用戶輸入運算數(shù)和四則運算符,輸出計算結果。
voidmain(){
floata,b,s;
charc;
printf("inputexpression:a+(-,*,/)b\n");
scanf("%f%c%f",&a,&c,&b);
switch(c){
case''''+'''':printf("%f\n",a+b);break;
case''''-'''':printf("%f\n",a-b);break;
case''''*'''':printf("%f\n",a*b);break;
case''''/'''':printf("%f\n",a/b);break;
default:printf("inputerror\n");
}
}
floata,b,s;
charc;
printf("inputexpression:a+(-,*,/)b\n");
scanf("%f%c%f",&a,&c,&b);
switch(c){
case''''+'''':printf("%f\n",a+b);break;
case''''-'''':printf("%f\n",a-b);break;
case''''*'''':printf("%f\n",a*b);break;
case''''/'''':printf("%f\n",a/b);break;
default:printf("inputerror\n");
}
本例可用于四則運算求值。switch語句用于判斷運算符,然后輸出運算值。當輸入運算符不是+,-,*,/時給出錯誤提示。
循環(huán)結構程序
循環(huán)結構是程序中一種很重要的結構。其特點是,在給定條件成立時,反復執(zhí)行某程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件,反復執(zhí)行的程序段稱為循環(huán)體。c語言提供了多種循環(huán)語句,可以組成各種不同形式的循環(huán)結構。
while語句
while語句的一般形式為:while(表達式)語句;其中表達式是循環(huán)條件,語句為循環(huán)體。
while語句的語義是:計算表達式的值,當值為真(非0)時,執(zhí)行循環(huán)體語句。其執(zhí)行過程可用圖3—4表示。統(tǒng)計從鍵盤輸入一行字符的個數(shù)。
#include<stdio.h>
voidmain(){
intn=0;
printf("inputastring:\n");
while(getchar()!=''''\n'''')n++;
printf("%d",n);
}intn=0;
printf("inputastring:\n");
while(getchar()!=''''\n'''')
n++;
printf("%d",n);
本例程序中的循環(huán)條件為getchar()!=''''\n'''',其意義是,只要從鍵盤輸入的字符不是回車就繼續(xù)循環(huán)。循環(huán)體n++完成對輸入字符個數(shù)計數(shù)。從而程序實現(xiàn)了對輸入一行字符的字符個數(shù)計數(shù)。
使用while語句應注意以下幾點:
1.while語句中的表達式一般是關系表達或邏輯表達式,只要表達式的值為真(非0)即可繼續(xù)循環(huán)。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
while(n--)
printf("%d",a++*2);
}inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
while(n--)
printf("%d",a++*2);
本例程序將執(zhí)行n次循環(huán),每執(zhí)行一次,n值減1。循環(huán)體輸出表達式a++*2的值。該表達式等效于(a*2;a++)
2.循環(huán)體如包括有一個以上的語句,則必須用{}括起來,組成復合語句。
3.應注意循環(huán)條件的選擇以避免死循環(huán)。
voidmain(){
inta,n=0;
while(a=5)
printf("%d",n++);
}inta,n=0;
while(a=5)
printf("%d",n++);
本例中while語句的循環(huán)條件為賦值表達式a=5,因此該表達式的值永遠為真,而循環(huán)體中又沒有其它中止循環(huán)的手段,因此該循環(huán)將無休止地進行下去,形成死循環(huán)。4.允許while語句的循環(huán)體又是while語句,從而形成雙重循環(huán)。
do-while語句
do-while語句的一般形式為:
do
語句;
while(表達式);
其中語句是循環(huán)體,表達式是循環(huán)條件。
do-while語句的語義是:
先執(zhí)行循環(huán)體語句一次,再判別表達式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán)。
do-while語句和while語句的區(qū)別在于do-while是先執(zhí)行后判斷,因此do-while至少要執(zhí)行一次循環(huán)體。而while是先判斷后執(zhí)行,如果條件不滿足,則一次循環(huán)體語句也不執(zhí)行。
while語句和do-while語句一般都可以相互改寫。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
doprintf("%d",a++*2);
while(--n);
}
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
doprintf("%d",a++*2);
while(--n);
在本例中,循環(huán)條件改為--n,否則將多執(zhí)行一次循環(huán)。這是由于先執(zhí)行后判斷而造成的。
對于do-while語句還應注意以下幾點:
1.在if語句,while語句中,表達式后面都不能加分號,而在do-while語句的表達式后面則必須加分號。
2.do-while語句也可以組成多重循環(huán),而且也可以和while語句相互嵌套。
3.在do和while之間的循環(huán)體由多個語句組成時,也必須用{}括起來組成一個復合語句。
4.do-while和while語句相互替換時,要注意修改循環(huán)控制條件。
for語句
for語句是c語言所提供的功能更強,使用更廣泛的一種循環(huán)語句。其一般形式為:
for(表達式1;表達式2;表達3)
語句;
表達式1通常用來給循環(huán)變量賦初值,一般是賦值表達式。也允許在for語句外給循環(huán)變量賦初值,此時可以省略該表達式。
表達式2通常是循環(huán)條件,一般為關系表達式或邏輯表達式。
表達式3通常可用來修改循環(huán)變量的值,一般是賦值語句。
這三個表達式都可以是逗號表達式,即每個表達式都可由多個表達式組成。三個表達式都是任選項,都可以省略。
一般形式中的“語句”即為循環(huán)體語句。for語句的語義是:
1.首先計算表達式1的值。
2.再計算表達式2的值,若值為真(非0)則執(zhí)行循環(huán)體一次,否則跳出循環(huán)。
3.然后再計算表達式3的值,轉回第2步重復執(zhí)行。在整個for循環(huán)過程中,表達式1只計算一次,表達式2和表達式,3則可能計算多次。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。for語句的執(zhí)行過程如圖所示。
voidmain(){
intn,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s);
}
用for語句計算s=1+2+3+...+99+100
intn,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s);
本例for語句中的表達式3為n++,實際上也是一種賦值語句,相當于n=n+1,以改變循環(huán)變量的值。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d",a*2);
}
用for語句修改例題。從0開始,輸出n個連續(xù)的偶數(shù)。
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d",a*2);
本例的for語句中,表達式1已省去,循環(huán)變量的初值在for語句之前由scanf語句取得,表達式3是一個逗號表達式,由a++,n--兩個表達式組成。每循環(huán)一次a自增1,n自減1。a的變化使輸出的偶數(shù)遞增,n的變化控制循次數(shù)。
在使用for語句中要注意以下幾點
1.for語句中的各表達式都可省略,但分號間隔符不能少。如:for(;表達式;表達式)省去了表達式1。for(表達式;;表達式)省去了表達式2。
for(表達式;表達式;)省去了表達式3。for(;;)省去了全部表達式。
2.在循環(huán)變量已賦初值時,可省去表達式1,如例3.27即屬于這種情形。如省去表達式2或表達式3則將造成無限循環(huán),這時應在循環(huán)體內設法結束循環(huán)。例題即屬于此情況。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;)
{a++;n--;
printf("%d",a*2);
}
}inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;)
{a++;n--;
printf("%d",a*2);
}
本例中省略了表達式1和表達式3,由循環(huán)體內的n--語句進行循環(huán)變量n的遞減,以控制循環(huán)次數(shù)。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;;){
a++;n--;
printf("%d",a*2);
if(n==0)break;
}
}
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;;){
a++;n--;
printf("%d",a*2);
if(n==0)break;
}
本例中for語句的表達式全部省去。由循環(huán)體中的語句實現(xiàn)循環(huán)變量的遞減和循環(huán)條件的判斷。當n值為0時,由break語句中止循環(huán),轉去執(zhí)行for以后的程序。在此情況下,for語句已等效于while(1)語句。如在循環(huán)體中沒有相應的控制手段,則造成死循環(huán)。
3.循環(huán)體可以是空語句。
#include"stdio.h"
voidmain(){
intn=0;
printf("inputastring:\n");
for(;getchar()!=''''\n'''';n++);
printf("%d",n);
}
本例中,省去了for語句的表達式1,表達式3也不是用來修改循環(huán)變量,而是用作輸入字符的計數(shù)。這樣,就把本應在循環(huán)體中完成的計數(shù)放在表達式中完成了。因此循環(huán)體是空語句。應注意的是,空語句后的分號不可少,如缺少此分號,則把后面的printf語句當成循環(huán)體來執(zhí)行。反過來說,如循環(huán)體不為空語句時,決不能在表達式的括號后加分號,這樣又會認為循環(huán)體是空語句而不能反復執(zhí)行。這些都是編程中常見的錯誤,要十分注意。
4.for語句也可與while,do-while語句相互嵌套,構成多重循環(huán)。以下形成都合法的嵌套。
(1)for(){…
while()
{…}
…
}
(2)do{
…
for()
{…}
…
}while();
(3)while(){
…
for()
{…}
…
}
(4)for(){
…
for(){
…
}
}
voidmain(){
inti,j,k;
for(i=1;i<=3;i++)
{for(j=1;j<=3-i+5;j++)
printf("");
for(k=1;k<=2*i-1+5;k++)
{
if(k<=5)printf("");
elseprintf("*");
}
printf("\n");
}
}
轉移語句
程序中的語句通常總是按順序方向,或按語句功能所定義的方向執(zhí)行的。如果需要改變程序的正常流向,可以使用本小節(jié)介紹的轉移語句。在c語言中提供了4種轉移語句:
goto,break,continue和return。
其中的return語句只能出現(xiàn)在被調函數(shù)中,用于返回主調函數(shù),我們將在函數(shù)一章中具體介紹。本小節(jié)介紹前三種轉移語句。
1.goto語句
goto語句也稱為無條件轉移語句,其一般格式如下:goto語句標號;其中語句標號是按標識符規(guī)定書寫的符號,放在某一語句行的
前面,標號后加冒號(:)。語句標號起標識語句的作用,與goto語句配合使用。
如:label:i++;
loop:while(x<7);
c語言不限制程序中使用標號的次數(shù),但各標號不得重名。goto語句的語義是改變程序流向,轉去執(zhí)行語句標號所標識的語句。
goto語句通常與條件語句配合使用。可用來實現(xiàn)條件轉移,構成循環(huán),跳出循環(huán)體等功能。
但是,在結構化程序設計中一般不主張使用goto語句,以免造成程序流程的混亂,使理解和調試程序都產生困難。
統(tǒng)計從鍵盤輸入一行字符的個數(shù)。
#include"stdio.h"
voidmain(){
intn=0;
printf("inputastring\n");
loop:if(getchar()!=''''\n'''')
{n++;
gotoloop;
}
printf("%d",n);
}intn=0;
printf("inputastring\n");
loop:if(getchar()!=''''\n'''')
{n++;
gotoloop;
}
printf("%d",n);
本例用if語句和goto語句構成循環(huán)結構。當輸入字符不為''''\n''''時即執(zhí)行n++進行計數(shù),然后轉移至if語句循環(huán)執(zhí)行。直至輸入字符為''''\n''''才停止循環(huán)。
break語句
break語句只能用在switch語句或循環(huán)語句中,其作用是跳出switch語句或跳出本層循環(huán),轉去執(zhí)行后面的程序。由于break語句的轉移方向是明確的,所以不需要語句標號與之配合。break語句的一般形式為:break;上面例題中分別在switch語句和for語句中使用了break語句作為跳轉。使用break語句可以使循環(huán)語句有多個出口,在一些場合下使編程更加靈活、方便。
continue語句
continue語句只能用在循環(huán)體中,其一般格式是:
continue;
其語義是:結束本次循環(huán),即不再執(zhí)行循環(huán)體中continue語句之后的語句,轉入下一次循環(huán)條件的判斷與執(zhí)行。應注意的是,本語句只結束本層本次的循環(huán),并不跳出循環(huán)。
voidmain(){
intn;
for(n=7;n<=100;n++)
{
if(n%7!=0)
continue;
printf("%d",n);
}
}
輸出100以內能被7整除的數(shù)。
intn;
for(n=7;n<=100;n++)
{
if(n%7!=0)
continue;
printf("%d",n);
}
本例中,對7~100的每一個數(shù)進行測試,如該數(shù)不能被7整除,即模運算不為0,則由continus語句轉去下一次循環(huán)。只有模運算為0時,才能執(zhí)行后面的printf語句,輸出能被7整除的數(shù)。
#include"stdio.h"
voidmain(){
chara,b;
printf("inputastring:\n");
b=getchar();
while((a=getchar())!=''''\n''''){
if(a==b){
printf("samecharacter\n");
break;
}b=a;
}
}
檢查輸入的一行中有無相鄰兩字符相同。
chara,b;
printf("inputastring:\n");
b=getchar();
while((a=getchar())!=''''\n''''){
if(a==b){
printf("samecharacter\n");
break;
}b=a;
}
本例程序中,把第一個讀入的字符送入b。然后進入循環(huán),把下一字符讀入a,比較a,b是否相等,若相等則輸出提示串并中止循環(huán),若不相等則把a中的字符賦予b,輸入下一次循環(huán)。
輸出100以內的素數(shù)。素數(shù)是只能被1和本身整除的數(shù)。可用窮舉法來判斷一個數(shù)是否是素數(shù)。
voidmain(){
intn,i;
for(n=2;n<=100;n++){
for(i=2;i<n;i++)
if(n%i==0)break;
if(i>=n)printf("\t%d",n);
}
}intn,i;
for(n=2;n<=100;n++){
for(i=2;i<n;i++)
if(n%i==0)break;
if(i>=n)printf("\t%d",n);
}
本例程序中,第一層循環(huán)表示對1~100這100個數(shù)逐個判斷是否是素數(shù),共循環(huán)100次,在第二層循環(huán)中則對數(shù)n用2~n-1逐個去除,若某次除盡則跳出該層循環(huán),說明不是素數(shù)。如果在所有的數(shù)都是未除盡的情況下結束循環(huán),則為素數(shù),此時有i>=n,故可經此判斷后輸出素數(shù)。然后轉入下一次大循環(huán)。實際上,2以上的所有偶數(shù)均不是素數(shù),因此可以使循環(huán)變量的步長值改為2,即每次增加2,此外只需對數(shù)n用2~n去除就可判斷該數(shù)是否素數(shù)。這樣將大大減少循環(huán)次數(shù),減少程序運行時間。
#include"math.h"
voidmain(){
intn,i,k;
for(n=2;n<=100;n+=2){
k=sqrt(n);
for(i=2;i<k;i++)
if(n%i==0)break;
if(i>=k)printf("\t%2d",n);
}
}
小結
1.從程序執(zhí)行的流程來看,程序可分為三種最基本的結構:順序結構,分支結構以及循環(huán)結構
2.程序中執(zhí)行部分最基本的單位是語句。c語言的語句可分為五類:
(1)表達式語句任何表達式末尾加上分號即可構成表達式語句,常用的表達式語句為賦值語句。
(2)函數(shù)調用語句由函數(shù)調用加上分號即組成函數(shù)調用語句。
(3)控制語句用于控制程序流程,由專門的語句定義符及所需的表達式組成。主要有條件判斷執(zhí)行語句,循環(huán)執(zhí)行語句,轉向語句等。
(4)復合語句由{}把多個語句括起來組成一個語句。復合語句被認為是單條語句,它可出現(xiàn)在所有允許出現(xiàn)語句的地方,如循環(huán)體等。
(5)空語句僅由分號組成,無實際功能。
3.c語言中沒有提供專門的輸入輸出語句,所有的輸入輸出都是由調用標準庫函數(shù)中的輸入輸出函數(shù)來實現(xiàn)的。
scanf和getchar函數(shù)是輸入函數(shù),接收來自鍵盤的輸入數(shù)據(jù)。
scanf是格式輸入函數(shù),可按指定的格式輸入任意類型數(shù)據(jù)。
getchar函數(shù)是字符輸入函數(shù),只能接收單個字符。
printf和putchar函數(shù)是輸出函數(shù),向顯示器屏幕輸出數(shù)據(jù)。
printf是格式輸出函數(shù),可按指定的格式顯示任意類型的數(shù)據(jù)。
putchar是字符顯示函數(shù),只能顯示單個字符。
4.關系表達式和邏輯表達式是兩種重要的表達式,主要用于條件執(zhí)行的判斷和循環(huán)執(zhí)行的判斷。
5.c語言提供了多種形式的條件語句以構成分支結構。
(1)if語句主要用于單向選擇。
(2)if-else語句主要用于雙向選擇。
(3)if-else-if語和switch語句用于多向選擇。
這幾種形式的條件語句一般來說是可以互相替代的。
6.c語言提供了三種循環(huán)語句。
(1)for語句主要用于給定循環(huán)變量初值,步長增量以及循環(huán)次數(shù)的循環(huán)結構。
(2)循環(huán)次數(shù)及控制條件要在循環(huán)過程中才能確定的循環(huán)可用while或do-while語句。
(3)三種循環(huán)語句可以相互嵌套組成多重循環(huán)。循環(huán)之間可以并列但不能交叉。
(4)可用轉移語句把流程轉出循環(huán)體外,但不能從外面轉向循環(huán)體內。
(5)在循環(huán)程序中應避免出現(xiàn)死循環(huán),即應保證循環(huán)變量的值在運行過程中可以得到修改,并使循環(huán)條件逐步變?yōu)榧伲瑥亩Y束循環(huán)。
7.c語言語句小結
名稱一般形式
簡單語句表達式語句表達式;
空語句;
復合語句{語句}
條件語句if(表達式)語句;
if(表達式)語句1;else語句2;
if(表達式1)語句1;elseif(表達式2)語句2…else語句n;
開關語句switch(表達式){case常量表達式:語句…default:語句;}
循環(huán)語句while語句
while(表達式)語句;
for語句for(表達式1;表達式2;表達式3)語句;
break語句break;
goto語句goto;
篇2
關鍵詞:C語言;程序設計;機考;分層教學;課程改革
中圖分類號:G642 文獻標識碼:A 文章編號:1009-3044(2014)34-8225-02
《C語言程序設計》課程的授課對象是計算機專業(yè)本科學生,為專業(yè)基礎(必修)課,是學好后續(xù)各軟件課程必要的基礎。有別于已經掌握的漢語、英語語言,作為人與計算機交流的語言,C語言不但概念多、符號多、語法多、規(guī)則多,而且抽象、難懂,再加上需要有一定的理解力以及解決問題的清晰思路,有些學生在學習過程中會感覺到枯燥、繁雜、無趣。因此培養(yǎng)學生的學習興趣、加強對課程的重視、提高實際編程能力、將理論與實際相結合,是教師必須解決的問題。
為了提高學習質量,從2010年秋季學期開始對《C語言程序設計》課程的教學過程、成績考核進行了改革,由原來的紙質試卷考試變成全程上機考試。改革實施多年來,大部分學生增加了學習興趣,有了編寫程序的主動性和積極性,增加了專業(yè)學習的信心,提升了程序設計的能力。
考慮到學生在基礎知識、智力因素、學習能力上的差異,為了更有效地實施“因材施教”,從2013年秋季學期開始實施分層教學。在講完C語言基礎知識、程序基本設計方法之后進行分層。通過考核,外加自愿的原則,將原來的教學班打亂,重新組合成兩種班型――高層次、低層次班。分層之后,每個學生個體獲取的知識趨于最大化,極大地提高了課堂學習效率。
1 傳統(tǒng)教學與紙質考試存在的問題
傳統(tǒng)的教學是按照指定教材,在課上將重點內容進行講解,典型的問題、方法在TC/VC環(huán)境中進行演示,課后留給學生一定的紙質作業(yè)和上機編程作業(yè)。同樣的講授,理解力強的學生一聽就懂;理解力弱的學生,老師需要講多遍才有可能懂。傳統(tǒng)的教學中,老師只能顧及大多數(shù)中等學生,照顧不到特殊的學生。降低了課堂效率,也可以說浪費了某一部分學生的時間。
由于期末考核采用的是紙質考試,只是從紙面上考核學生對C語言理論、編程方法的理解、掌握程度,更對學生的學習產生誤導。部分學生也只重視理論,不重視實際動手編程。他們只滿足于“紙上談兵”,不考慮結果。因此,實際應用時,對上機環(huán)境不熟悉、編寫的程序不能順利通過,導致很多學生高分低能,在解決實際問題時,茫然無措。
2 機考及分層教學改革的探索
計算機專業(yè)課程的特點是實踐性強,學生在掌握了基本語法后重點是上機實踐,即在計算機上解決實際問題,這里包括問題的分析與抽象、程序的編寫與調試。
常言道:“實踐是檢驗真理的標準”。在學習C語言過程中,上機實踐是鞏固理論知識、增加理解力、提升編程能力的重要途徑。為了提高教學質量,讓學生真正打好專業(yè)基礎,授課教師在教學內容、教學方法、教學組織、考試方式等多方面上進行了調整。
2.1 教學方法以及教學組織上的改革
為了使教學效果更好,將兩個自然班作為一個授課班,教學內容統(tǒng)一要求。講授時,由淺入深、循序漸進。在語言的基礎上,重點放在程序設計的思想、方法、技巧的講解,結合典型例題,培養(yǎng)學生分析、設計、解決問題的能力。通過精心設計實驗題目、課后作業(yè)、調整考核比例、增加課后上機機時、多方位提供答疑指導等環(huán)節(jié)培養(yǎng)學生學習興趣,使學生重視上機編程。
對學生作業(yè)題目進行精心設計,既覆蓋知識點,又有趣味性,每個題目都像在講一個故事,把要解決的問題融在故事中,學生在讀故事的同時,不自覺地就會去想解決辦法,增加了興趣,提高了自主性,也鍛煉了思維。
調整平時考核內容。平時考核的環(huán)節(jié)包括:上機小測試、期中機考、上機作業(yè)、考勤,每一個環(huán)節(jié)的成績都會反映到平時成績中。平時成績的取得完全依賴自己的學習態(tài)度。
增加課后上機機時。由于考核重點是對實際動手能力的考核,光靠課內安排的上機時間顯然不夠,所以需增加學生課外自主上機實驗時間,并配有指定人員輔導。
多方位提供答疑指導。所有任課教師把答疑時間錯開,這樣每周學生可以有多次答疑時間,對比原來教師只給自己學生答疑的做法,學生增加了學習解疑的機會。
2.2加強上機實驗過程控制,促進考試改革
借助于“課程自動評測與抄襲檢測系統(tǒng)”,老師和學生有了C語言作業(yè)部署、學習、檢測的平臺。通過這個平臺,老師可以布置上機實驗、安排考試、檢查學生提交的作業(yè)。根據(jù)知識點,每章布置4-5道題,限定學生在規(guī)定時間內獨立提交。老師可以隨時查看學生提交的程序,及時與學生溝通、反饋。學生可以隨時把自己編寫的程序提交,系統(tǒng)對提交到服務器的程序自動判斷對錯,學生可以及時了解自己程序存在的問題,不斷進行修改,直到能夠順利通過所有測試。
這一環(huán)節(jié)起到了鞏固課本知識、增加獨立思考、加強動手能力的作用。期末就是利用這個平臺進行全程兩個小時的考試,要求學生既有編程的能力,又有時間的緊迫感。
加強過程考核,增加平時機考次數(shù)。為了緩解期末機考時的緊張情緒,之前會安排1-2次的上機考試,成績記入期評,其中期中考試的考試形式與期末一樣,為全程兩個小時的機考,隨機組卷。學生可以盡早了解考試模式,并更加重視對本門課程實際動手能力的訓練,學會調整心態(tài)。
為了滿足不同層次學生的要求,在平臺上配備了大量不同難度的習題,不受提交時間的限制。學生可以根據(jù)自身需求,隨時編程測試。
2.3分層教學,提升學習效率
分層教學是根據(jù)學生不同基礎、不同學習需求而實施教學的一種手段。是在承認學生差異、考慮學生興趣的前提下,以發(fā)展的眼光看待學生,給每個學生提供符合他們發(fā)展的教學目標與方法,是同時提高所有學生能力的理想狀態(tài)。經過調研,從三個方面進行分層教學。
1)學生分層。對學生能力考核的一個重要標準就是學生的學習成績,但是在學習這門課之初,沒有可依據(jù)的成績。分層安排在講完兩周課,即學完了簡單程序設計之后進行。學生根據(jù)自己當前對C語言的理解和接受程度,選擇不同層次。在分層教學的實施過程中,這樣的分層是暫時的、動態(tài)的。過一段時間,視學生的后期學習成績、學生的具體情況,可遞進或降層。這樣更有利于學生個性化發(fā)展。
2)講課分層。對不同層次的學生,采取不同課堂。在講授編程思想、必備知識基礎上,對高層次學生,拓寬和加深問題的難度,做到拔尖提高;對普通學生,在達到大綱要求的同時,考慮他們的接受能力,適度增加和加深知識,做到穩(wěn)步推進。
3)實驗分層。練習是對所學知識的鞏固和消化。按照作業(yè)、實驗題目的難易,對不同層次的學生提出不同要求。對普通學生布置基礎題,進行強化訓練;對高層次學生,以綜合運用知識進行練習。要求學生多編程解決問題,以提高應用知識的能力。這樣使得不同層次的學生得到不同程度的提高。
3 教學改革實踐效果
實行考試改革后,學生的學習積極性有了明顯提高。由于考試時間的有限性,增加了學生的緊迫感、主動性,在程序編寫、調試程序的實際動手能力方面得到了重視并有所提高,為后續(xù)課程學習奠定了良好的基礎。經過分層教學,滿足了不同層次學生學習的需要,激勵了各層次學生朝著有利于自己的方向努力,有利于學生個性能力的張揚,有利于學生綜合素質的提高,更有利于優(yōu)秀學生綜合能力的發(fā)揮、較低層次學生潛在能力的開發(fā)。
3.1帶動學風,促進后續(xù)課程的學習
大部分學生能夠按時到課,勤于思考,互相研究,答疑的同學增多了。改變了不良學風,營造了良好學習氛圍。由于課程期間比較重視學生結構化程序設計的方法,要求編寫程序之前理清解題思路、做好算法設計,經過訓練后,在后續(xù)的“程序設計專題訓練”中,面對稍難一些的問題,學生也能逐步找到解決辦法,編出程序,順利通過測試。在小學期“學術工程實踐”課程中,要求完成一個小型管理系統(tǒng),有一定的難度。大部分學生能夠順利編寫由多個結構體、多個文件、幾十個函數(shù)組成的、2000-4000行代碼的程序,并調試成功,完成管理。
3.2提升學生的程序設計能力和創(chuàng)新能力
競賽是考核學生全面素質的一個平臺,它要求學生具有扎實的理論基礎、清晰的算法設計能力、嫻熟的編程能力、良好的心理素質和快速的臨場應變能力。
隨著知識的積累,學生的能力和自信心不斷增強。學生們更加渴求知識,渴望展示自己,參加競賽的積極性提高了,人數(shù)也不斷增多。在大二階段,報名參加全國軟件設計大賽的人數(shù)由09級的16人次(占09級學生人數(shù)14.04%)、10級的33人次(占10級學生人數(shù)26.19%),增加到11級的66人次(占11級學生人數(shù)51.56%)。全國獲獎人數(shù)由09級的1人次(占09級學生人數(shù)0.88%),到10級的12人次(占10級學生人數(shù)9.52%),再到11級的17人次(占11級學生人數(shù)13.28%),獲獎人數(shù)同比增多。
4 結論
總之,學習“高級程序設計語言”不僅要使得學生在程序表達和設計上得到培養(yǎng),更重要的是在掌握解決問題的思想、方法和手段的同時,實際動手編程能力有所提高,從而增長設計程序的能力。因而,將“C程序設計”課程的考試改為上機考試是很有益的,可以改變不良的學風,營造良好學習氛圍;可以加強學生對課程的重視,提高學生程序編寫、調試等實際動手能力,提升學生的程序設計能力和創(chuàng)新能力,為后續(xù)課程學習、為培養(yǎng)合格的專業(yè)人才奠定良好的基礎。
對“C程序設計”課程實施分層次教學也是必要的,可以針對不同層次學生的需求給予相應的學習指導,以達到學生全面發(fā)展的教學目標;可以激發(fā)不同層次學生學習的欲望,向著更高更深的知識海洋探索;可以鞭策任課教師積極思考、合理取舍,做到充分了解學生、合理安排進度,能夠極大地提升老師的組織與應變能力。
參考文獻:
[1] 李學會.C程序設計教學改革與實踐[J].實驗室科學,2010(4)33-34.
篇3
(中國礦業(yè)大學(北京) 機電與信息工程學院,北京 100083)
摘要:分析C語言教學中存在的普遍問題,從教學內容組織形式、教學方法以及考核方式等方面提出一系列有針對性的教學方法,指出這種教學方法能有效地提高學生的學習效率和質量。
關鍵詞 :C語言程序設計;公共基礎課;教學方法
基金項目:北京高等學校青年英才計劃項目;煤炭資源與安全開采國家重點實驗室開放課題(SKLCRSM11KFB12)。
作者簡介:王振武,男,副教授,研究方向為數(shù)據(jù)挖掘、圖形圖像處理,wangzhenwu@126.com。
0 引言
為提高大學生利用計算機解決問題的能力,全國高校普遍為理工科專業(yè)的低年級學生開設了C語言程序設計這門必修的公共基礎課程。一方面,該課程是學生接觸的第一門程序設計類課程,其編程思維的養(yǎng)成是一個較長的過程;另一方面,該課程具有內容繁多、知識點關聯(lián)性強、算法抽象、實踐性要求高等特點,學生在學習過程中易產生畏難心理,進而出現(xiàn)學習動力不足、積極性不高等問題。C語言程序設計是一門難學也難教的課程,目前在教學上普遍存在很多問題。文獻[1-4]對C語言程序設計的教學方法給出了建議,但都不夠系統(tǒng)和全面。
1 C語言程序設計教學方法研究
1.1 理論教學
對于大多數(shù)課程而言,從宏觀上將課程知識點及其關聯(lián)講授給學生非常必要,這便于學生更加系統(tǒng)深刻地理解所學內容。筆者以文獻[5]作為教材講解C語言程序設計的知識點結構。如圖1所示,知識點之間的關聯(lián)可以層層細化,教師首先從宏觀上給學生介紹C語言程序的整體組成結構(如圖1-(a),然后針對圖1-(a)中一個源程序文件的組成成分舉例介紹,如圖1-(b)所示。在圖1-(b)中,教師對涉及的知識點進行歸類,共包含預處理命令、數(shù)據(jù)類型、運算符、語句和函數(shù)等5部分,然后圖1-(c)至圖1-(i)依次層層展開上述各類知識點的組成,逐步細化。
從宏觀上梳理C語言與程序設計課程的知識點是非常必要和重要的,這樣可以避免學生“只見樹木,不見森林”,最后只學到一堆零散的知識點,只有從宏觀上把握各個知識點在知識體系中的位置和作用,才能學得深、記得牢。
對于程序語言課程,如果僅僅介紹語法的運用,學生往往對知識點理解不深刻。我們在教學實踐中的體會是:在講解C語言語法的基礎上,適當?shù)仄饰鼍幊陶Z言在計算機中的運行機制,會讓學生的理解更加透徹。因此,我們的課堂教學方法分為如下兩部分。
1)課件講解。
課件講解包括兩部分,即知識點要點總結和知識點運行機制剖析。知識點要點總結就是告訴學生該知識點如何使用;而知識點運行機制剖析則告訴學生該程序在計算機內存中的執(zhí)行過程。由于絕大部分高校在開設C語言程序設計之前都會開設計算機文化基礎等課程,因此學生有足夠的計算機基礎知識來理解C語言程序的運行機制。
2)實例演示。
作為一門編程語言,C語言需要在實踐中理解和掌握,因此,課堂教學中,在具體的編程環(huán)境(如VC++6.0)下演示十分必要。通過在具體的軟件環(huán)境下編程,告訴學生應該做什么和不應該做什么,并總結該知識點的注意事項。相比傳統(tǒng)的脫離編程環(huán)境,只在PPT或黑板上進行板書的教學模式,該方法的教學效果要好得多。在課堂教學中,具體的教學步驟如下:①使用PPT或者板書列出該知識點的注意要點;②在編程環(huán)境(如VC++6.0)下演示該知識點的用法,給出正確的和錯誤的使用方法,并進行對比;③通過幻燈片動畫或flash動畫等形式演示程序在計算機內存中的執(zhí)行過程,讓學生更加深刻地理解程序的運行機制。
3)教學難點與重點——“復合知識點”。
從C語言的教學內容來講,數(shù)組、函數(shù)和指針是教學的重點章節(jié),這些章節(jié)之間相互關聯(lián)的部分又是重點中的難點,如數(shù)組和函數(shù)結合,數(shù)組名做函數(shù)參數(shù),數(shù)組和指針結合,指向數(shù)組的指針變量,函數(shù)和指針結合,指向函數(shù)的指針變量等。在教學過程中要反復強調各個知識點的注意事項,如果基本知識點能夠理解透徹,上述難點內容也就迎刃而解了。
1.2 上機實踐教學
在實踐教學中,教師可以通過實際教學案例循序漸進地強化學生對C語言知識點的理解。上機實踐的教學內容通常分為兩部分:基本知識點練習和綜合訓練。首先通過基本知識點的練習,讓學生掌握該知識點的使用,即鞏固課堂所學內容;然后通過一個綜合性的大作業(yè),訓練學生綜合應用C語言知識點的能力,例如,通過編寫“學生課程成績統(tǒng)計系統(tǒng)”考查學生對數(shù)組、結構體、指針、函數(shù)、文件等知識的綜合掌握情況。
對于初學編程語言的學生,往往沒有養(yǎng)成良好的編程習慣,出錯的可能性較大,而出錯之后進行調試又將耗費較長的時間,這勢必對學生的學習熱情產生負面影響。因此,一開始就給學生制定科學的編程步驟和規(guī)范,使學生養(yǎng)成良好的編程習慣,將大大減少程序出錯的可能。在C語言教學實踐中,我們總結了“五步編程法”:①定義變量,如“int a;”;②對變量進行初始化,如“a=0;”,對變量進行初始化操作是一種良好的編程習慣,可防止未對變量賦值而引起的隱性錯誤;③通過scanf語句賦值,如“scanf(“%d”,&a);”;④實現(xiàn)程序的主要算法,該部分是程序的主體;⑤通過printf語句將結果輸出在顯示器上,將結果輸出在顯示器上便于比較程序運行結果是否正確。
下面是按照上述五步編寫的一個完整的C語言程序,用來比較兩個整數(shù)的大小。按照上述五步進行編程,經過一段時間的訓練之后,學生出現(xiàn)語法錯誤的可能性大大降低,此時學生更多的精力將集中在程序算法的設計和實現(xiàn)上。
1.3 考試形式
對于C語言程序設計的考核方式,我們采用知識點考核和編程實踐相結合的方式。知識點考核偏重于C語言基本語法,用于檢驗學生對知識點的掌握是否全面,此項考核約占總成績的40%;編程實踐考核用于檢驗學生的實際動手能力,學生將在規(guī)定的時間內根據(jù)題目在機器上編程,此項考核約占總成績的60%。為了實現(xiàn)知識點的考核,我們將考試與計算機二級C語言上機考試緊密結合,采用題庫平臺進行上機考試,學生直接在機器上答題并提交,知識點考核多采取客觀題,如填空題、程序修改題以及讀程序題等,編程題在實戰(zhàn)編程中考核。C語言程序設計課程的重要特點就是實踐性強,學習該課程的目的就是為了編寫程序。因此從考試的角度講,進行編程實踐是最合適的方式,通過上機編程來考核學生的學習情況也是最公正和客觀的方式。
2 C語言程序設計教學實踐結果分析
中國礦業(yè)大學(北京)每年都有40多個班級同時開設C語言程序設計課程,因此該課程教學質量的高低將直接影響全校理工科學生對C語言的理解和掌握。中國礦業(yè)大學(北京)C語言程序設計教學團隊經過長期的探索總結出一套行之有效的C語言教學方法,我們將上述方法在學校越崎實驗班中進行了試點。如圖2所示,采用上述教學法的越崎實驗班的C語言程序設計課程考試成績要明顯好于其他班級,其中90分以上的學生占10.7%,80分以上的學生占總人數(shù)的53.6%。另外,學生的學習積極性比采用上述方法前得到明顯提高,很多學生都對計算機編程產生了濃厚興趣,實踐證明我們提出的上述方法是行之有效的。
3 結語
中國礦業(yè)大學(北京)C語言程序設計教學團隊在長期的教學實踐中探索出的這套教學方法被證明是行之有效的,它能夠極大地提高學生的學習興趣,不但讓學生學得會、記得牢,而且能夠舉一反三,把該方法應用到其他編程語言的學習中。長期的教學實踐使我們深刻地認識到,教學方法的好壞對提高教學質量有直接和重要的影響。我們團隊提出的這套教學方法是對C語言程序設計教學方法的初步嘗試,希望能夠對高等院校C語言程序設計教學方法的研究起到拋磚引玉的作用。
參考文獻:
[1] 謝中科. C語言程序設計的教學改革與實踐[J]. 理工高教研究, 2004,3(23): 96-97.
[2] 簡慧云. 提高C語言程序設計教學質量的探討[J]. 理工高教研究, 2004, 6(23): 83-85.
[3] 王孝平, 董秀成, 謝維成.提高電器信息類專業(yè)學生C語言學習能力的教學方法探索[J]. 高等教育研究, 2012, 2(29): 37-40.
[4] 張麗華, 王冬星. 自主學習教學模式在C語言教學中的運用[J]. 黑龍江教育: 高教研究與評估, 2009(12): 91-92.
篇4
【關鍵詞】單片機;延時程序
接觸單片機有一年之久,從基礎知識了解開始,到流水燈、數(shù)碼管動靜態(tài)顯示,鍵盤到液晶等幾個基本的模塊,編了一些基本的小程序,發(fā)現(xiàn)其中最常用的延時程序用C語言編寫也是千變萬化的,不同的程序,不同的用途,精確度不一樣,延時程序也需要有改變。下面就對我所知道的延時的方法談下自己的見解。
總的延時方法通常有兩種:一種為軟件延時,通常采用循環(huán)的形式進行;另外一種為硬件延時,用到定時器/計數(shù)器,這種方法可以提高CPU的工作效率,并且能相對精確延時。
一、軟件延時與時間計算
軟件延時方式精確度不是很高,但是基本時間可以控制,并且移植性很好。
2.需要多種延時時間。還是8個燈做成流水燈,但是要求第一個燈亮1S,第2個燈亮2S,第三個燈亮3S……最后一個燈亮8S。
3.時間的確定。很多朋友看完我上面講個兩種延時方法可能會說,這樣是方便了,但是上面的時間如何確定呢?你的時間確定圖怎么來的?方法很簡單,利用keil強大的功能實現(xiàn)。比如1S延時
另外還可以用示波器測試時間,需要外接示波器,用proteus畫完連接圖,接上示波器,再調用寫好程序的hex,就可以很清楚的看到延時時間。下面為延時20ms圖。
同時還可以用反匯編工具計算延時時間,匯編時間是很精確的,便于計算的。有興趣的朋友也可以自己上網(wǎng)搜索這兩種方法。對于初學的朋友,我建議還是用這種keil本身的工具比較方便。
二、用定時器/計數(shù)器實現(xiàn)精確定時
在很多情況下,需要我們精確定時,那么我們就不能用前面講的調用小的延時子程序delay()來完成。所以就要考慮用精確的定時方式:定時器/計數(shù)器。
以上我介紹了對于寫延時程序自己的一些膚淺的見解,在以后的學習中還需要進一步提高。粗略延時用基本的delay(),精確延時用定時/計數(shù)器。
篇5
(一《)C語言程序設計》的教學目標
社會對于人才的需要,并不是要求他們只要學會理論知識就可以,各個單位對人才的要求更看重于他們的實踐能力,要求他們能夠把所學習過的知識轉化為動手能力與實際解決問題的能力。因此,對于學生的《C語言程序設計》課程的教學只是進行理論知識的教育是遠遠不夠的,還有提升學生的綜合能力。學生要達到的認知類目標包括:掌握C語言程序設計課程相關的基本概念;理解解決問題的基本技巧;理解標記控制循環(huán)與計數(shù)控制循環(huán);把握程序性的知識,并學會如何應用。學生要達到的能力類的目標包括:掌握C語言程序設計的基本技能,進行程序計算;熟練運用與、或、否命題,以此來解決實際中的程序問題;熟練運用一些基本的邏輯運算符;能夠使用break和continue程序控制語句;學會編寫基本字符模式下的簡單程序;另外還有培養(yǎng)學生動手實踐能力和與他人合作的能力。除此之外,還有培養(yǎng)學生學習C語言程序設計的興趣,養(yǎng)成學習工作中嚴謹、務真求實的良好態(tài)度,培養(yǎng)解決程序問題的開放性思維。
(二《)C語言程序設計》教學策略設計
對學生進行C語言程序設計的教育,其最終目的就是要讓學生掌握這門課程,并且運用到實際工作中,而教學策略的設計,就是為了在最短的時間內,讓學生掌握更多的知識,并且將其轉化為自身的實踐能力。(1《)C語言程序設計》的教學方法教學方法多種多樣,其中講授法、談話法、演示法、實踐法等最為常見。教師在選擇教學方法的時候,要充分考慮教學大綱的要求和教材中的內容,還要考慮學生的學習情況與學習能力,以及現(xiàn)有的教學條件,從而選擇最適合教學工作的一種方法。同樣的教學方法,對于某一個班級的學生合適,對于另外一個班級也許就不適用,因為每個班的學習氛圍不同,同理,對于某一位學生教學方法很恰當,而對另外一個學生來說,可能就是阻礙學習的因素。因此,教師在教學過程中要對各個方面影響教學效果的因素進行充分的考慮。對學生的教學工作,可以采取分組教學的形式,這種方法不但可以讓教師能夠更大程度上關注到每一位學生的學習情況,還能夠通過小組間學生相互幫助,分享交流學習經驗,從而獲得更多提高成績的機會。另外,學生之間的交流要比學生與教師之間的交流更為順利,學生之間相互學習更容易發(fā)現(xiàn)自身的優(yōu)勢與不足之處,從而把自己的學習經驗分享給其他人,同時向其他同學學習自己沒有掌握的知識。小組教學還能夠增強學生的交流能力,加強學生之間的人際關系,培養(yǎng)學生的團隊合作能力,從而提升學生的綜合素質。(2《)C語言程序設計》的學習組織形式學習組織能力是指學生在學習的過程中,師生的共同活動在程序、人員、時空關系上的組合形式。運用適合學生的學習組織形式,有助于學生提高C語言程序設計學習的效率,同時,還可以將一些高效率的學習方法、學習敬仰在學習組織形式中進行運用,由于《C語言程序設計》教學分為基礎知識與課程設計兩種基本形式,我們把以問題為導向的《C語言程序設計》教學模式下的學習組織形式也分為兩種類型。一種是課堂小組合作學習。在《C語言程序設計》所有課時中,基礎知識的課程占據(jù)了絕大多數(shù),教學地點可以選為網(wǎng)絡機房,以問題為導向的《C語言程序設計》有利于學生培養(yǎng)團隊合作精神,提高彼此之間的交流能力,鼓勵學生在學習的過程中勇敢地提出問題回答問題,為學生營造一種良好的學習氛圍。教師充分發(fā)揮自身的引導與輔助的作用,幫助學生發(fā)現(xiàn)問題,解決問題。另一種類型是課程設計探究學習。課程設計的時間一般比較短,在此期間,教師要通過合理的課程設計來為學生創(chuàng)造一個和諧的學習氛圍,師生之間、學生之間進行交流,分享學習經驗與解決問題的方法,一方面可以增加學生彼此學習的機會,另一方面也可以監(jiān)督學生完成自己的學習任務。(3)網(wǎng)絡環(huán)境下的問題導向教學模式網(wǎng)絡環(huán)境下的以問題為導向的《C語言程序設計》課程教學模式,則是利用網(wǎng)絡科技來輔助教師的教學活動,在這個教學過程中,教師是教學活動中的引導者與輔助者,而學生才是學習的主體。教師為學生設計好學習任務,明確每一位學生所要解決的問題,再對學生進行合理的分組,讓學生充分利用網(wǎng)絡資源,收集對自己有利的信息,并且對信息進行有效的篩選與整合。學生在尋求解決問題的過程中,能夠充分利用網(wǎng)絡環(huán)境的優(yōu)勢,推動以問題為導向的教學模式的實施,實現(xiàn)學生的自主學習、互動合作、自覺約束自己的學習活動。這樣,學生在整個學習過程中,不僅解決了教師提出的問題,還掌握了搜集、處理信息的能力,收獲成功之后的成就感,增強與他人之間的交流,提高自身的創(chuàng)造能力,真正做到增強自身的綜合素質。
2以問題為導向的《C語言程序設計》的實踐
在《C語言程序設計》課程教學過程中,教師的教學工作與學生的學習活動總是會暴露一些問題,如教師講解不到位,學生不能理解理論知識,教師講課難以吸引學生的學習興趣,學生學習效率低下等問題。而以問題為導向的《C語言程序設計》教學模式,要如何進行具體的實施,才能夠幫助學生掌握解決問題的技巧,加深對理論知識的理解呢?
(一)以問題為導向的教學模式中的課程設計
在《C語言程序設計》教學過程中,使用以問題為導向的教學模式,要明確本次課程的教學目標是什么,所有的課程設計的大方向要以教學目標為準則,教學中要以人為本,以學生為中心,站在學生的立場上,充分考慮到學生的接受知識的能力與完成任務的可能性。另外還有考慮哪些教學設備可以供學生使用,做到最大程度利用現(xiàn)有的資源,幫助學生掌握更多的知識。同時,對于學生的要求要合理,要求過高,學生難以完成目標,將會打擊學生的參與教學的積極性與信心,要求過低,將會浪費時間,學生的實際能力達不到質的飛躍。因此,課程的設計要實事求是,一切從實際出發(fā)。
(二)以問題為導向的教學模式實施的原則
1.遵循現(xiàn)代社會教育事業(yè)的發(fā)展規(guī)律,尊重學生的認知規(guī)律,鼓勵學生運用自己的優(yōu)勢進行創(chuàng)新性的學習。2.堅持以學生為主體、以學生為中心的原則,讓學生出于教學中的主體地位。營造輕松的學習氛圍,讓每一位學生都積極大膽地參與到其中,敢于提出自己的疑問,敢于回答教師與其他學生提出的問題,積極參與具有挑戰(zhàn)性的任務。3.教師發(fā)揮自身的引導與輔助的作用,引導學生進行有利于提高自身能力的學習活動,幫助學生解決難度較大的問題,并且監(jiān)督學生對問題作出總結,從完成任務的過程中學到更多的知識。
(三)以問題為導向的教學模式應當注意的問題
篇6
[關鍵詞]C語言 程序設計 能力培養(yǎng) 教學改革
[中圖分類號]G642 [文獻標識碼]A [文章編號]1009-5349(2015)12-0232-01
一、當今《C語言程序設計》課程的教學現(xiàn)狀
《C語言程序設計》這門學科的教學內容及功能是非常強大的,應用范圍也很廣,數(shù)據(jù)結構相對比較復雜。該課程的語法檢驗結構相對比較薄弱,相對沒有編程基礎的大學生來講,要很好地學習和理解C語言的知識和程序設計方法,需要熟練各個知識點和語法結構。以往《C語言程序設計》課程教學大多主要以C語言的語法為主要講授知識點,將教學的重點放在語言的語法知識上,因此,很大一方面就忽視了在解決問題和編寫程序語句時如何能更好地應用有效的教學方法。很多學生在掌握語法知識后,不知道如何去編寫程序來解決實際問題。
二、《C語言程序設計》課程改革的幾點想法
(一)對教學內容進行重組
一方面教師要充分考慮到沒有了解程序語言設計和不懂編程經驗的學生,要將教學的重點放到C語言的理論語法知識上,全面講解《C語言程序設計》課程的基本語法知識。面對新的教學內容,要避開以往傳統(tǒng)的細節(jié)語法知識講解,引入一套新的教學思路,要以具體的實例編程去營造一個好的教學環(huán)境和教學方式,將學生引入要讓自己有能力、有想法去判斷和總結理解掌握C語言的語法知識以及編程方法。通過第一階段的理解學習,很大一部分學生能夠基本掌握C語言的基礎知識,同時也具備編寫C語言編寫程序的能力,并可以獨立編寫較難程序,并能順利通過程序調試與程序的測試。
另一方面要將教學的主要內容放在那些具有掌握一些C語言基礎知識和編寫程序,了解C語言知識的學生上。在這個階段,課程內容要注重培養(yǎng)學生的較專業(yè)的程序編寫與實踐。同時,在教學過程中注意設計教學環(huán)節(jié),不但要引入項目式驅動教學法,還要將教學內容化分模塊,把每個模塊都建立一套綜合案例,把案例內容覆蓋C語言程序設計課程的所有核心知識點,貫穿整個教學過程。
學生通過開發(fā)綜合案例,能夠將知識點融會貫通,達到學以致用的目的。也可以把要處理的問題和知識點做成項目,給學生分配項目任務,并且為學生提供可查閱的學習資料和設備。通過老師的學習指導,讓學生自由發(fā)揮,開創(chuàng)思想,并以小組討論的形式進行任務開發(fā),共同完成一個完整的項目。在這一教學階段設計的目的是要在一個完整的項目開發(fā)過程中,使學生能夠學習和了解到一些關于C語言中不常使用到的關鍵知識。也使學生學習和掌握這些知識的可行性和要重性,在教師的正確引導下將問題成功解決,使學生收獲到知識。
(二)加強實踐教學
《C語言程序設計》是一門實踐性很強的專業(yè)技術課程。實踐教學是《C語言程序設計》課程教學中的主要教學環(huán)節(jié)。在加大實踐教學內容的同時,也要改變實踐教學內容,這也是提高和培養(yǎng)具有創(chuàng)新能力學生所必經的階段。因此,在實踐教學上,要專門編寫相關的資料,方便教學。在資料中,可以編寫一些具有代表性的上機練習程序設計題目,使學生能更好地理解和學習C語言的知識和編程方法。同時也為學生提供一些比較綜合的編程題目,讓學生能在這些問題中,找到自己知識的缺口,然后補充知識,在這些編程題中發(fā)揮自己的優(yōu)點和創(chuàng)新點。同時,要開發(fā)學生的學習思路,培養(yǎng)學生的自主學習能力。
(三)完善網(wǎng)絡教學平臺
當今是網(wǎng)絡遍布的時代,所以C語言課堂教學也少不了網(wǎng)絡。我們要用網(wǎng)絡教學平臺做為輔助教學手段,合理地為學生安排布置學習內容和資料,開展小組式的學習方式,以小組方式討論問題。課堂的教學時間是有限的,對于這一類的教學活動在課堂上是不能完全實現(xiàn)的。所以要以開放式的網(wǎng)絡教學平臺為課堂輔助教學。教學平臺主要包括課程學習、電子教案、網(wǎng)上答疑、實驗指導等,讓學生能更好地自主學習。
(四)創(chuàng)新考試方式
以往的《C語言程序言設計》課程考試大多數(shù)是以筆試為主要內容,目的是考查基本的語法知識,該種考核方式使學生偏重于語法學習。為此,改革傳統(tǒng)的考核方式勢在必行,期末考試采用專門的考試系統(tǒng),將理論題與實踐題相結合統(tǒng)一在上機考試環(huán)節(jié)完成,在限定時間內考核學生的學習效果。即考即出分,減少人工批卷出錯的漏洞,減少教師的工作量,改變了傳統(tǒng)的批閱方法,通過考試的檢驗以促進學生平時學習掌握知識牢固程度,加強上機實踐,突出學生程序編寫能力過程,將實踐教學的重要性展現(xiàn)出來。
【參考文獻】
篇7
1.明確教學目標,精選教學內容,改革教學方法。傳統(tǒng)C語言教學的目標更多的是教學生程序設計語言,卻非程序設計,而高職學生在實際需求中更注重程序設計的能力。因此本課程改革的教學目標是希望學生掌握簡單的數(shù)據(jù)抽象問題建模和簡單的算法等基礎知識,養(yǎng)成解決問題的能力和程序設計的能力,養(yǎng)成自我學習專業(yè)知識的能力,學會學習一門語言,熟練使用語言及其開發(fā)環(huán)境進行程序開發(fā)與測試的技能。C語言的計算能力強,語法知識豐富而細致,上機調試容易出錯,是一門比較難學的課程,C語言程序設計一般安排在大一第一學期,與它相關的課程沒有上,這也增加了學習的難度,學生比較難入門。因此,在開始學習的前幾節(jié)課,教師一定要注重激發(fā)學生學習興趣和學習主動性。提高教師自身素質,對所教課程鉆研精通,教學方法得當,精選教學內容,精心設計課件,課堂演示編程和調試過程,提高學生的學習興趣。C語言語法豐富,但是如果過度強調語法知識的細節(jié)和容易出錯的地方,特別容易使學生陷入過度關注細節(jié),而忽略學習C語言的目標在于應用。在實際教學中要重點突出,把不常用的函數(shù)只簡單介紹,避免展開分析。在每節(jié)課之前,教師要對本節(jié)內容進行精心設計,針對本小節(jié)的內容提出一個與現(xiàn)實生活聯(lián)系較緊密且難度適中的問題,使用案例式教學法,分析問題,提出解決問題的方法,在分析問題、解決問題的過程中強化學生用編程解決實際問題的意識,在學生對該問題的程序所涉及的知識點和函數(shù)有了宏觀的認識后,然后講授與此相關的語法和函數(shù),演示編程和調試的過程,最終給出相應的程序。另外,在教學過程中不應過度依賴PPT等多媒體教學設備,也要發(fā)揮傳統(tǒng)教學媒體的作用,利用黑板對關鍵內容進行板書演示,加強學生對主要內容的理解和對知識點的消化吸收。在課堂上提出問題、分析問題的過程符合學生的思維特點,也符合程序設計的本質要求,編程思想在理論教學中逐步加強,演示編程和調試過程,使枯燥的語法在解決實際問題的編程過程中得到具體應用。
2.加強實踐教學,針對不同的學生因材施教。C語言是實踐性很強的課程,大量的語法和算法應該在實踐教學中得到應用和鞏固,而編程思想也必須在實踐中逐步形成。在課內外,教師要經常通過各種方式與學生溝通,了解學生的計算機水平、對本課程的學習情況,以及在本課程學習中遇到的問題,對不同的學生實行因材施教,對學生集中反映的問題及時解決。在實踐教學過程中要對學生提出具體詳細的要求,使每個學生能夠盡其所能提高自己的實踐技能,避免學生在有限的實踐教學時間內因為沒有具體的實踐任務而降低實踐教學的效果。我們將實踐教學分成入門技能、基本技能和綜合技能三個階段,在不同的階段對學生提出具體的不同要求,并且根據(jù)不同學生的能力靈活調整實踐學習的要求。(1)編程入門技能。這一階段主要是練習C語言基礎知識、各類運算符、表達式、輸入輸出語句。首先要求學生能夠看懂課本的例題,在編輯器VC++6.0中輸入例題中的程序,并調試運行出結果。在學習初期,學生一般會出現(xiàn)各種語法錯誤,在此階段可以強化學生的語法知識。一個好的程序一般是經過多次修改和調試才能夠很好地實現(xiàn)它的功能,因此在C語言學習過程中,調試程序、改錯是一個重要的部分,學生熟悉課本例題后,教師可以給定一些能夠實現(xiàn)特定功能的程序,要求學生改錯,直至調試運行出正確結果。這一階段可以是學生熟練掌握語法知識,獲得學習程序設計的成就感,并激發(fā)強烈的學習興趣。(2)基本編程技能。本階段教學內容包括函數(shù)、數(shù)組和指針,在實踐教學中要求學生需要完成簡單的編程任務。這一階段要求學生能夠看懂程序的流程圖,給定程序后,學生應該能夠清楚的知道程序的執(zhí)行順序,通過練習學會使用順序結構、選擇結構和循環(huán)結構,改編課本例題、擴展原有的程序實現(xiàn)更加完善的功能,使用數(shù)組、指針等新技能實現(xiàn)原有程序,實現(xiàn)一題多解,擴展解決問題的思路。教師給定實際生活中相對簡單的問題,用編程的思想對問題抽象建模,畫出流程圖,設計算法,并寫出相應的程序來實現(xiàn)。(3)綜合編程技能。程序設計不能陷入到單純學習語言語法的誤區(qū),程序設計的語法是重要的,但是更重要的是用編程來解決實際問題。綜合編程階段教學內容深入到結構體、共用體和文件,在實踐教學過程中學生除了練習本階段編程的基礎知識外,教師提出實際問題,引導學生應用所學知識分工合作解決問題,達到學習知識點、掌握編程技能的效果。教師在布置具體試驗任務時要考慮問題的難易度和趣味性,可以布置難易程度不同的多個任務,學生根據(jù)自己的能力選擇不同的任務來完成,以充分發(fā)揮學生的主動性,避免能力較強的學生快速完成后浪費時間,同時也避免了水平較差的學生對實踐課程喪失信心和興趣,讓學生在學習中獲得成就感,在課堂上發(fā)揮主體作用。
3.改革考核方式。教師在教學評價體系中增加對學生動手能力的激勵機制,能夠有效促進學生的實際動手操作的主動性。改變考試方式并不是一個教師所能進行的教學改革,但教師應該在能力范圍之內探索教學改革,增強學生的學習效果。我校的學生的成績評定中平時成績占30%,平時成績不應該是學生出勤率的簡單體現(xiàn),而應是多種因素的共同結果,教師應注重對學生學習過程的評價,并將其作為平時成績的重要參考。實踐教學一般采用驗證性實驗和綜合性實驗的方式考核。驗證性實驗由學生獨立完成,綜合性實驗則分小組進行,學生對實驗的情況撰寫實驗報告,描述需求分析、算法設計、編寫程序和上機調試的過程,總結出現(xiàn)的問題和解決方法。教師針對不同學生的不同設計方案和不同問題做一些關鍵性的指導,形成一個以學生自己動手為主,教師引導與點評相結合的啟發(fā)式教學模式。在實踐教學時增加隨堂測驗,要求學生現(xiàn)場完成編寫調試程序。在評價過程中避免單一考核實驗結果的正確性,要建立面向過程,注重實踐操作能力和創(chuàng)新能力的考核機制,考核機制應能夠反映學生實踐課程的學習態(tài)度和實驗任務的完成情況,鼓勵學生主動分析問題,嘗試用不同的方法完成實驗任務,鍛煉學生創(chuàng)新能力。
二、結語
篇8
摘要:本文在分析了C語言程序設計課程的教學現(xiàn)狀和教學困境的基礎上,對比自然語言和程序設計語言的共性以及C語言的特殊性,提出了“從概念入手,側重程序閱讀和程序設計能力培養(yǎng)”而非“語法研究”的教學角度。
關鍵詞:C語言;程序設計;教學內容;教學角度
中圖分類號:G64 文獻標識碼:A
1教學現(xiàn)狀
在高等學校的本科教育中,“C語言程序設計”幾乎成了所有專業(yè)的必開課程,從計算機科學與技術、軟件工程、網(wǎng)絡工程等相關專業(yè),到電子信息類理工科各專業(yè),乃至理工科院校的所有非計算機專業(yè),有的是專業(yè)基礎課,有的是公共必修基礎課,有的是“非計算機專業(yè)的計算機基礎課”。只是課程名稍有差異,常見的有“C語言程序設計”、“高級語言程序設計”、“C語言”、“C程序設計”、“結構化程序設計”等。無論叫什么樣的課程名,也無論是哪類專業(yè),其課程的教學要求和教材選用卻無太大差別,只是課時分配差異較大。
從網(wǎng)絡調查的16所不同類型高校的“C語言程序設計”教學大綱看,普遍都包含“通過本課程的學習,使學生了解有關程序設計的基本概念、術語及C語言的特點,掌握C語言基本數(shù)據(jù)類型、語法規(guī)則、程序控制結構、常用的標準庫函數(shù),培養(yǎng)學生的程序設計技能,初步積累編程經驗”的教學基本要求;約百分之八十左右的“C語言程序設計”課程都選用由譚浩強主編、清華大學出版社出版的“C程序設計”作為主教材;課時分配從30~108課時不等,其中80課時以上的多為應用型本科院校的計算機相關專業(yè)以及綜合性大學的非計算機專業(yè),理論課時與實驗課時的比例一般為1:1到1:1.2。與此同時,其他專業(yè)基礎課(如計算機組成原理、操作系統(tǒng)、數(shù)據(jù)結構等)的課時一般為54課時,最多不超過72學時。相比之下,“C語言程序設計”所占課時是其他專業(yè)基礎課的1.5倍至2倍。
從教學目的看,非計算機專業(yè)的“C語言程序設計”課程主要目的是“掌握語法規(guī)則和程序結構,具備一定的程序設計能力”,而計算機相關專業(yè)的“C語言程序設計”課的教學目的則要分為三個層次,一是使學生全面理解計算機程序設計語言的基本內容和結構;二是通過算法掌握程序設計的基本方法和步驟,并具備一定的程序設計能力;三是為后續(xù)課程的算法描述和其他程序設計語言的學習奠定基礎。
2教學誤區(qū)
從以上的教學現(xiàn)狀(特別是課時分配)看,長期以來,“C語言程序設計”的課程教學存在“教學內容背離教學要求和教學目的”的誤區(qū),主要表現(xiàn)在教材誤區(qū)、講授誤區(qū)和考核誤區(qū)三個方面。
2.1教材誤區(qū)
國內高校的“C語言程序設計”課大多選用譚浩強主編、清華大學出版社出版的“C程序設計”[1]為主教材,目前使用的是2005年7月修訂出版的第三版,教材共363頁,主體內容分為14章,其中,第3章的數(shù)據(jù)類型與表達式占用30頁,第4章的格式輸入輸出占用12頁,前9章共占用218頁,后5章共占用145頁。占用如此大篇幅的原因是教材中除了介紹相關語法格式外,還增加了相當多“特殊格式”和“特殊情況”的解釋和說明,因此,該教材的最大優(yōu)點就是“內容詳盡、解釋清晰”。然而,對于初學者來說,學習計算機程序設計語言就是為了“為計算機描述求解問題的過程”,過于詳細但又遠離現(xiàn)實問題的“特殊格式”和“特殊情況”的解釋,使得學習內容復雜化,增加了程序設計語言學習的難度,誤導了學習者的學習重點,由此也賦予了該教材無法掩飾的缺點,那就是教材編寫的指導思想和教材內容的組織脫離了高校各專業(yè)“C語言程序設計”課程的教學目標,過分強調語法細節(jié)而忽略了程序設計語言的“正向表達能力”的應用,過分強調“語言的靈活性”而導致教材主體內容的“復雜化”,從而誤導“C語言程序設計”課程的教學內容朝著“重語法學習、輕算法描述”的“語言研究”方向發(fā)展。
2.2講授誤區(qū)
由于教材內容的“復雜”,課堂講授自然需要較多課時,教學重點當然也放在了“語法研究”上。從網(wǎng)上下載的“C程序設計(第三版)”的配套教學課件以及有關院校的“C語言程序設計”教學課件的內容組織上可以清楚的給出以上判斷。“語法研究”型的課堂講授,更加放大了教材對“C語言程序設計”課程內容的“扭曲”程度,給學生提供了錯誤的程序設計語言學習方法,把簡單問題復雜化,更為嚴重的是,挫傷了學生學習計算機程序設計語言的興趣和積極性,把本應“主動學習”的課程成引入了“被動學習”的歧途,直接導致“懂語法、會做題,但不會編程序”的教學后果。
2.3考核誤區(qū)
多年來,“C語言程序設計”的主體考試內容就是“語法”,無論是選擇題、填空題還是程序閱讀題,大多都無法逃脫“語法”的束縛。考試方式以筆試為主。這在某種程度上肯定了“語言研究”的教學角度,促使“C語言程序設計”的教學重點更向“語法研究”的方向傾斜,最終誤入“增加課時,強化語法,還是不會編程序”的怪圈。
3應有的教學角度
按照網(wǎng)上調查的各專業(yè)教學大綱中“培養(yǎng)具有一定程序設計能力”的教學目的,“C語言程序設計”課程的教學落腳點應該更確切的理解為培養(yǎng)“能用程序設計語言描述求解問題過程”的一般程序設計者,而不是造就“全面掌握程序設計語言語法、能設計高效、難懂程序”的程序設計語言方面的“作家”。因此,“C語言程序設計”課程教學相當于自然語言中的“基本語言能力”教學,而不是“語言研究”或“高級寫作”能力培養(yǎng)。
3.1自然語言與計算機程序設計語言
計算機程序設計語言是用人和計算機都能識別的方式描述計算機求解問題過程的過程描述語言,它具有和人所使用的自然語言相同或相似的組成和結構特點,對于已經掌握了至少一門自然語言(比如漢語或英語)并具備一定文化程度的人來說,學習一種計算機程序設計語言并非難事。自然語言的基本組成包括符號集合、字、詞、句、數(shù)據(jù)及其運算規(guī)則等基本要素,學習過程包括認識符號、發(fā)音、識字、組詞、學語法并造句、學文法并寫短文、練習寫文章等基本階段,在具備了基本的語言能力之后,擴充詞匯量和提高寫作能力將成為終身學習的基本內容。按照自然語言的基本組成和學習過程,也可將計算機程序設計語言的基本組成歸納為字符集、標識符(常量、變量、保留字等)、數(shù)據(jù)類型、運算符、表達式、語句、程序格式等基本要素,其中,字符集和數(shù)據(jù)類型是定義程序設計語言的基礎,字符按一定規(guī)則組成標識符,用來充當常量名、變量名或其他標識,在自然語言中被人們公認的特殊標識符被賦予特定的語言含義,專門為語言系統(tǒng)所用(用戶不得再次定義其意義),稱為保留字;字符集中的特殊符號(如+、-、*、/)被賦予特定的運算意義(如加、減、乘、除)稱為運算符;不同數(shù)據(jù)類型的常量、變量用運算符按一定規(guī)則連接起來組成的式子就構成表達式;將特定的保留字與表達式等語言要素按照語法規(guī)則組合起來就形成相應的語句;將語句按照要描述的求解問題的邏輯順序排列起來,就構成了某種程序設計語言求解特定問題的一段程序。
3.2C語言的特殊性
一方面,C語言是程序設計語言的一種,具備一般程序設計語言的基本組成要素和結構特點。另一方面,C語言能成為面向過程的結構化程序設計語言的代表,也有其自身的特殊性。首先,C語言的數(shù)據(jù)類型極為豐富。除了基本數(shù)據(jù)類型外,還有構造類型、指針類型、空類型和用戶自定義類型,其中,構造類型包括數(shù)組、結構體(struct)、共用體(union)和枚舉類型(enum)等四種數(shù)據(jù)結構。其次,C語言具有位操作能力。除了能夠對各類變量進行操作外,C語言還具備“按位”進行邏輯“與”、“或”、“非”、“異或”運算和“左”、“右”移位運算,這使得C語言具備了更強的系統(tǒng)開發(fā)能力。第三,C語言具有顯著的結構化程序設計能力,并通過完整的函數(shù)定義來實現(xiàn)。第四,C語言的最大特點就是“語法限制不嚴,解釋靈活”。第五,C語言允許直接訪問物理地址,可直接對硬件端口進行操作。第六,C語言沒有輸入/輸出語句,信息輸入/輸出功能由標準函數(shù)庫中相應的I/O函數(shù)來完成。
C語言的這些特殊性,決定了C語言的教、學過程不同于其他程序設計語言的教學過程。
3.3C語言的教學角度
根據(jù)一般程序設計語言的基本組成與結構特點,結合C語言的特殊性,“C語言程序設計”課程的教學角度應該是:從介紹程序設計語言的基本概念入手,重點介紹語言的“正
向”設計功能而非“特殊格式”或“特殊語法”說明,側重學生的程序閱讀和程序設計能力培養(yǎng),從教學內容的廣度和深度兩個方面,恰當把握教學角度。
“C語言程序設計”課程的內容可分為三個基本模塊,教學過程從第一個模塊切入,逐漸擴展到第二和第三個模塊。第一個模塊可稱為“程序設計語言公共模塊”,主要包括程序設計語言的基本概念、程序設計語言的基本要素(字符集、標識符、常量變量以及保留字、基本數(shù)據(jù)類型、運算符、表達式、語句與控制結構、程序結構以及程序書寫規(guī)范等)以及輸入/輸出格式等內容;第二個模塊是C語言的主體,主要包括函數(shù)、數(shù)組、指針、文件等;第三個模塊是高級編程內容,主要包括結構體(struct)、共用體(union)、枚舉類型(enum)以及用戶自定義類型等。
在教學深度方面,各模塊的教學重點應放在“規(guī)范的語法描述和直觀易懂而且正確的語義表述上”,避免涉及各種過細的“不符合人類閱讀習慣”的語義描述,暫時避開“特殊格式”或“特殊情況”的糾纏,擺脫“研究語法”的錯誤向導。在此基礎上,第一模塊的教學可與自然語言相比對,通過學生已有的自然語言學習經驗和語言要素,使學生快速建立程序設計語言的基本概念,正確理解程序設計語言的基本要素及其關系,掌握基本語法和程序基本控制結構(順序、選擇、循環(huán)),并通過算法歸納求解問題的過程,正確理解算法不同描述方式(自然語言、傳統(tǒng)流程圖、N-S流程圖、偽代碼、程序設計語言)的作用和差異,特別是從“問題”到“程序”的漸進轉化過程,從而培養(yǎng)學生的基本程序設計能力。通過第二模塊的教學,使學生明確函數(shù)、數(shù)組、指針、文件等概念和作用,掌握它們的定義和引用方法,能進行相應數(shù)據(jù)類型的編程,進而掌握用函數(shù)定義的結構化模塊程序設計的方法;通過第三個模塊的教學,將程序的數(shù)據(jù)處理能力擴展到結構體、共用體、枚舉類型以及用戶自定義類型等復雜數(shù)據(jù)類型的處理上來,通過恰當?shù)睦討眠@些數(shù)據(jù)類型,向學生展示C語言強有力的數(shù)據(jù)表示和處理能力。
另外,可以將C語言中的“語法靈活性”和不同部分的各種“特殊情況”分類總結,歸納整理成“語言參考手冊”等形式,以附錄的形式提供給學生,以便需要時“備查”。這樣既可節(jié)省教學課時,又可向學生提供學習語言的主動權。
3.4教學策略和方法
“C語言程序設計”屬語言類課程,教學過程充滿了逐步完善和熟練的基本特點,因此,從教學安排的策略上要分重點、分階段逐步進行,每個階段的教學方法應該采用建立在一定基礎上的有重點的“部分教學法”,以核心內容為基礎,向外逐漸延伸,部分學習,漸進掌握。盡可能避免不分主次、不論難易、不顧急緩,盲目一次性掃清各類知識點的“地毯式”教授方法或學習方法,同時強調自學和上機驗證,強化在特定環(huán)境下(如Turbo C++ 3.0)的程序設計訓練,做到“精講多練[2]”,從小程序練起,逐漸過渡到求解較大或實際問題的程序設計上來。
4結束語
從目前的教學現(xiàn)狀看,無論是計算機相關專業(yè),還是理工科的電子信息類專業(yè),乃至綜合性大學的非計算機專業(yè),“C語言程序設計”的課程教學均占有重要的教學地位,在全面提高教學質量和教學效率的今天,不同類型專業(yè)結合自身優(yōu)勢和程序設計語言類課程的特點,選擇合適的角度組織和實施“C語言程序設計”課程的教學活動非常重要,而且很有必要。筆者的教學實踐證明,避開“語法研究”的程序設計教學不僅可減少課時,更可提高學生利用程序設計語言“表述求解問題過程”的能力。
參 考 文 獻
篇9
[論文摘要]C程序設計語言作為大、中專學生入學后的首門計算機語言課程,也是重要的程序設計課程。對于學生來說,程序設計的思維方式和概念都是全新的,學生接受起來很困難,通過對C程序設計語言教學方法探討,能收到較好的教學效果。
一、引言
《C程序設計語言》是計算機及相關專業(yè)中一門重要的計算機基礎課程,由于其在當今系統(tǒng)軟件和部分應用軟件的開發(fā)中具有實用性強的特點,又與硬件和程序設計環(huán)境底層的聯(lián)系緊密,是當今計算機軟硬件工程師應該掌握的一種基本的、比較實用的程序設計語言。它作為學生入學后第一次系統(tǒng)地學習與高級程序設計語言和程序設計有關的內容的一門新課程,本身就比較難;再加上其內容的龐雜、語言描述的靈活,更讓學生感覺難上加難。因此對于擔任該課程的老師來說,如何教好這門課程,培養(yǎng)學生運用C程序設計語言分析問題、解決問題的能力,是這一門課程的目的和宗旨。
二、采用案例教學,培養(yǎng)學生的興趣和積極性
C程序設計是應用性很強的一門課程它既有理論又有實踐,既講方法又講動手能力。一般來說,教材中前幾章都是先介紹C程序設計語言的一些概念和基礎知識,然后才介紹程序的建立和運行。這些概念和基礎知識,既枯燥又比較抽象難懂。在教學中,我們打破課本原有的順序組織課堂教學的方式的邏輯結構體系,改用從案例入手,通過給學生演示、讓學生模仿,在實際應用中去探究和領悟這些概念,并適時地加以歸納總結和概念的延伸,讓學生在輕松愉快的氣氛中學習新知識。
案例教學法打破了以教材為中心的傳統(tǒng)教學模式,不按教材的順序授課,而是以精選出的程序設計的案例為中心,把學習的重點放在具體案例的講述上,把要學習的語法和概念融入到具體案例中來講解。整個教學過程中強調在應用中學習,從而避免了枯燥的理論說教,不僅能增進學生的學習興趣,而且對提高學生綜合分析和解決實際問題的能力也大有幫助。那么該如何培養(yǎng)學生對C語言課程的興趣呢?案例教學法是培養(yǎng)學生學習興趣的有效途徑一。
三、運用多媒體CAI課件教學,提供交互式學習環(huán)境
C語言的內容比較繁雜,我們把概念、定義等一些知識性的東西用幻燈的形式投影出來就會使課堂內容更加豐富,提高學生的注意力,節(jié)省老師板書的時間,讓整堂課的效果改觀。但是課堂上課件的演示也要適當,避免喧賓奪主,使學生更多地關注了形式的變化,而忽略了內容本身。相應的,課件在其他內容的處理上就要慎重了。比如算法、程序的設計,我們不是只注重給學生一個結果、一個程序,而更應該展示給學生的是一個過程,一個思想,也就是怎么樣去解決這個問題。我們的重點在于教會學生掌握方法,即幫助學生學會自己解決問題,而不是幫助學生解決問題。即授人以漁,而非授人以魚。因此在講解這些內容的時候就不能是一張幻燈一個算法、一個程序,而應該重點介紹方法、思想,根據(jù)題目求解的過程,一步一步把結果“ 寫” 出來。
多媒體CAI課件主要包括課程內容、算法演示、在線測試、在線討論以及資源中心五部分功能。多媒體CAI課件可以提供交互式環(huán)境供學生學習,并自動根據(jù)操作過程進行實時評價。將多媒體CAI課件和教師課堂講授有機地結合起來,能形成最佳教學任務的綜合性手段與教學方案。
四、把握課堂教學方法,提高課堂教學質量
(一)注意“互動式教學”,切記不要“自演自說”。互動式教學就是要改變老師是課堂上唯一主體形式的狀況,讓學生也作為主體形式參與到課堂上來。互動式教學既可以提高學生的參與積極性,還可以避免學生上課疲勞,產生注意力不集中的現(xiàn)象。互動式教學在形式上有老師提問,讓學生上黑板演算、上教師機操作,讓學生討論等,讓學生進行正誤判析,解決普遍性問題,或者請有獨特思路的同學演示自己的方法或程序,對比各種方法的優(yōu)缺點,鼓勵大家再提出新方法。實踐證明,這種教學方法效果顯著,課堂活躍,學生的參與程度很高。但是我們在進行師生互動方面也要注意把握一個度的概念,讓課堂既要有互動的活躍氛圍,也要有好的課堂秩序,使得課堂互動有序有效進行。
(二)培養(yǎng)學生讀程序的能力。程序是C語言的本質,讀程序是學習C語言入門最快,也是最好的方法。要培養(yǎng)學生獨立編程的能力,首先應該培養(yǎng)學生讀程序的能力。學生讀的程序越多,見識的編程的思想、方法、技巧也就越多,就能更加擴展自己的編程思路,還能在某些時候把別人的東西拿來歸為己用。
在培養(yǎng)學生讀程序方面要注意循序漸進,先給學生讀一些簡單的、只有幾行的程序,然后逐漸增大程序的復雜度。
(三)采用問題驅動法。在C程序設計語言課程中,有一些概念之間的差別和程序的設計步驟如果只通過教師講述,學生在字面上可以接受,但在理解深度上往往難以達到令人滿意的效果,如果能設計出一系列問題,讓學生在實踐和解決問題的過程中自己去探究和體驗,情況將完全是另一個樣子。另外,采用一些有趣的問題來引入對某些語句結構的學習同樣有相同的作用。
采用問題驅動法,一切都要求學生自己動手動腦設計,他們在操作過程中探究和解決問題的積極性和主動性得到
了調動,從而達到了我們的教學目標。
五、加強實驗環(huán)節(jié)的教學設計,輔助理論教學
C程序設計語言是實踐性很強的一門課,培養(yǎng)學生的實踐能力是教學的首要目的。因此,在授課的同時,如何引導學生利用上機實驗來加強實踐也是教學中的一個重要環(huán)節(jié)。C程序設計語言實驗教學的目的應是:1. 緊密配合理論教學,通過相關實驗,幫助和加深對語句功能的理解;2. 通過實驗可以將各門課程學到的知識融會貫通,思考利用C程序設計語言解決實際應用問題的有效方法,從而使學生分析和解決問題的能力得到鍛煉和提高。依據(jù)實驗教學的目的,考慮學生的個體差異,將實驗設置成不同的類型:必做和選做實驗:這兩類實驗都是結合相關課程的教學需要由授課教師設計的;前者目的在于幫助學生掌握基礎知識和實驗研究方法,后者則在于培養(yǎng)和鼓勵學生的學習興趣、擴大知識面以及培養(yǎng)學生的應用能力和創(chuàng)新意識。從而大大激發(fā)了學生的學習熱情,為其今后的學習和工作打下良好的基礎。
六、結束語
要教學好C 程序設計語言,關鍵在于教師要有效地組織教學,才能激發(fā)學生的學習興趣,讓學生主動、愉快地學習,滿足他們的求知欲,這樣才能取得良好的教學效果。
參考文獻
篇10
【關鍵詞】C語言程序設計 教學方法 資源整合
C語言是一門結構化程序設計語言,對于學生來說,C語言程序設計的思維方式和概念都是全新的,學生接受起來很困難。那么,在C語言程序設計教學過程中,怎樣開展這種構造性的又具有創(chuàng)造力活動的教學呢?筆者經過這幾年的自我學習以及實際教學中的不斷摸索,對C語言程序設計教學方法有了一些認識,與大家共同探討。
一、注重網(wǎng)絡環(huán)境下的資源整合
互聯(lián)網(wǎng)技術的飛速發(fā)展徹底引發(fā)了閱讀、計算等方式的變革,巨大的信息量、便捷的信息傳
遞、極強的交互性,使得網(wǎng)絡成為最有效的資源獲取工具。因此,在教學過程中建立或利用一個以C語言為專題的編程學習網(wǎng)站,整合與C語言編程相關的豐富的學習資源,為學生提供動態(tài)的、協(xié)作性的學習環(huán)境和學習工具,讓學習者自己選擇信息資料,自己收集、分析并應用知識,去解決實際問題。通過網(wǎng)絡學習環(huán)境開展C語言教學,提高了C語言教學活動的有效性。
二、以合作學習為導向,改革課堂教學環(huán)節(jié)
合作學習是備受國際教育界推崇的學習模式,因為它有助于培養(yǎng)學習者的合作精神和協(xié)同解決問題能力。
教學中,以幾名學生為小組組成學習的基本單位,學生在學習小組內相互協(xié)作、相互幫助、群策群力,共同完成相應的教學任務。實際教學中,教師向各小組布置項目任務,給以必要的說明,提供必要的資料和網(wǎng)絡資源,然后各學習小組研究問題,制定解決方案,最后將結果展示出來。例如,在C語言中的函數(shù)調用這一個問題,將程序分解為數(shù)個模塊,每個小組各自承擔其中一個模塊的程序編寫,C語言模塊化程序設計的思想在這時得到充分地展現(xiàn),讓學生深刻理解了模塊化程序設計理念,同時也使學生感受到了團隊合作的重要性,培養(yǎng)了學生協(xié)作互助精神。
三、抓住重點,分散難點,注重循序漸進
學習程序設計是一個逐步積累的過程。教材在整體設計上,要注意分散難點、合理選材,為學生建立科學的學習順序,并注意適時、適量,學以致用地逐步滲透相關的知識、思想和方法。對于有難度的知識點,采用先用一個簡單的例子讓學生有所了解,經過一段時間的反復練習以及相關知識的積累后,再引入一個復雜一些的例子,深入理解和掌握,然后再加以概括和總結。讓學生對知識的認識、理解、運用有一個逐步深入的“螺旋式”上升過程。幫助學生把已學到的內容不斷納入新的內容體系中去,使學生認知結構中原有的概念和新的知識建立起實質性的聯(lián)系。例如,雙循環(huán)結構知識點中的打印規(guī)則圖案的程序設計方法,就可依據(jù)問題的難易程度,先找出直角三角形圖案形成的規(guī)律,再探究等腰三角形圖案的形成特點,最后解決構成菱形圖案的程序設計,讓學生有一個全面、系統(tǒng)的理解和掌握解決該問題的思想方法。
四、立足任務驅動,滲透基本概念
概念的形成過程常常是學生進行邏輯思維的過程,如果遵循邏輯思維過程去組織教學,必將使學生容易掌握概念。因此,要想讓學生領會C語言中抽象的概念,教學中以實例任務作為知識的載體,在每個實例中適時、適量滲透一些相關的概念和知識,由實例去驅動學生主動發(fā)現(xiàn)、分析和處理問題,讓學生在做中學,在學中做,使學生在完成任務的過程中,逐漸地、很自然地去體會C語言的語法規(guī)則及相關概念,并且在這一過程中,學生還能體會到相似概念之間的差別,以及解決這一問題的不同程序設計步驟。比如,當型循環(huán)while與直到型循環(huán)do-while語句的區(qū)別,如果只通過教師講述,多數(shù)同學一般只能在表面上知其然,實則不知其所以然,但如果給出一個具體的任務實例,讓同學們在實踐后的結果中自己去體
驗兩者之間的不同,留在學生腦海中的記憶將猶為深刻。
五、引導學生建構自己的知識體系
基于網(wǎng)絡環(huán)境下的學習過程具有開放性、廣域性和易交流性。因此,網(wǎng)絡環(huán)境下的創(chuàng)新教育能真正達到因材施教、發(fā)展個性的目的,能夠使學生主動參與學習過程,并按照自己的認知水平有序地進行學習和提高,并使其創(chuàng)造性學習成為一種習慣。建構主義的教學活動中,教師的教學形式并不固定,學生則作為一個主體,積極會同其他的小組成員一起,通過已經整合的學習資源在網(wǎng)絡下討論和學習,教師給予學生引導和幫助,解決學生建立知識體系過程中所出現(xiàn)的問題。這樣,學生既掌握了教材上的內容,同時又通過網(wǎng)絡資源學習了相關的知識點,完成了對自己知識體系的建構,形成了自己的學習方式,而教師不但完成了教學任務,也教會了學生學習的方法,為學生以后的自我學習打下基礎,正所謂“教”與“學”相得益彰。
六、做好歸納總結,提高學生學習效率
C語言程序設計的學習,很重要的一點在于歸納總結。一個章節(jié)的結束,學生則難以形成完整、清晰的框架,因此,教師在教學中要及時歸納、做好小結。教學歸納可以是一個知識點的歸納(如if條件語句的歸納),也可以是對一種知識結構的歸納(如分支結構中包含if語句、while語句、循環(huán)語句等的歸納)。總結可以是一個小節(jié)的總結,也可以是一個單元內容的總結。歸納總結的形式也可以多種多樣,可以使用文字概括,也可以使用圖表總結,重點難點要著重強調。做好歸納總結,有利于學生對知識的理解、做到融會貫通,順利實現(xiàn)知識遷移,提高學生的學習效率。
教學方法在程序設計教學中的重要性是不言而喻的,它制約著程序設計教學的效率。面對的教學對象不同,教學方法各異,但使每位學生都能得到充分的發(fā)展,培養(yǎng)創(chuàng)新人才,是我們的同一目的,教學絕不能脫離學生的知識背景和認知規(guī)律。
參考文獻:
[1]扈中平.現(xiàn)代教育理論.高等教育出版社,2004.