c程序范文
時間:2023-03-29 10:47:55
導語:如何才能寫好一篇c程序,這就需要搜集整理更多的資料和文獻,歡迎閱讀由公務員之家整理的十篇范文,供你借鑒。
篇1
本課介紹c語言程序設計的基本方法和基本的程序語句。
從程序流程的角度來看,程序可以分為三種基本結構,即順序結構、分支結構、循環結構。這三種基本結構可以組成所有的各種復雜程序。c語言提供了多種語句來實現這些程序結構。本章介紹這些基本語句及其應用,使讀者對c程序有一個初步的認識,為后面各章的學習打下基礎。
c程序的語句
c程序的執行部分是由語句組成的。程序的功能也是由執行語句實現的。
C語句可分為以下五類:
1.表達式語句
2.函數調用語句
3.控制語句
4.復合語句
5.空語句
1.表達式語句
表達式語句由表達式加上分號“;”組成。其一般形式為:表達式;執行表達式語句就是計算表達式的值。例如:x=y+z;賦值語句y+z;加法運算語句,但計算結果不能保留,無實際意義i++;自增1語句,i值增1
2.函數調用語句
由函數名、實際參數加上分號“;”組成。其一般形式為:函數名(實際參數表);執行函數語句就是調用函數體并把實際參數賦予函數定義中的形式參數,然后執行被調函數體中的語句,求取函數值。(在第五章函數中再詳細介紹)例如printf("CProgram");調用庫函數,輸出字符串。
3.控制語句
控制語句用于控制程序的流程,以實現程序的各種結構方式。
它們由特定的語句定義符組成。c語言有九種控制語句。可分成以下三類:
(1)條件判斷語句
if語句,switch語句
(2)循環執行語句
dowhile語句,while語句,for語句
(3)轉向語句
break語句,goto語句,continue語句,return語句
4.復合語句
把多個語句用括號{}括起來組成的一個語句稱復合語句。在程序中應把復合語句看成是單條語句,而不是多條語句,例如
{
x=y+z;
a=b+c;
printf(“%d%d”,x,a);
}
是一條復合語句。復合語句內的各條語句都必須以分號“;”結尾,在括號“}”外不能加分號。
5.空語句
只有分號“;”組成的語句稱為空語句。空語句是什么也不執行的語句。在程序中空語句可用來作空循環體。例如while(getchar()!=''''\n'''');本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。這里的循環體為空語句。
賦值語句
賦值語句是由賦值表達式再加上分號構成的表達式語句。其一般形式為:變量=表達式;賦值語句的功能和特點都與賦值表達式相同。它是程序中使用最多的語句之一。在賦值語句的使用中需要注意以下幾點:
1.由于在賦值符“=”右邊的表達式也可以又是一個賦值表達式,因此,下述形式變量=(變量=表達式);是成立的,從而形成嵌套的情形。其展開之后的一般形式為:變量=變量=…=表達式;
例如:
a=b=c=d=e=5;按照賦值運算符的右接合性,因此實際上等效于:
e=5;
d=e;
c=d;
b=c;
a=b;
2.注意在變量說明中給變量賦初值和賦值語句的區別。給變量賦初值是變量說明的一部分,賦初值后的變量與其后的其它同類變量之間仍必須用逗號間隔,而賦值語句則必須用分號結尾。
3.在變量說明中,不允許連續給多個變量賦初值。如下述說明是錯誤的:inta=b=c=5必須寫為inta=5,b=5,c=5;而賦值語句允許連續賦值
4.注意賦值表達式和賦值語句的區別。賦值表達式是一種表達式,它可以出現在任何允許表達式出現的地方,而賦值語句則不能。
下述語句是合法的:if((x=y+5)>0)z=x;語句的功能是,若表達式x=y+5大于0則z=x。下述語句是非法的:if((x=y+5;)>0)z=x;因為=y+5;是語句,不能出現在表達式中。
數據輸出語句
本小節介紹的是向標準輸出設備顯示器輸出數據的語句。在c語言中,所有的數據輸入/輸出都是由庫函數完成的。因此都是函數語句。本小節先介紹printf函數和putchar函數。printf函數printf函數稱為格式輸出函數,其關鍵字最末一個字母f即為“格式”(format)之意。其功能是按用戶指定的格式,把指定的數據顯示到顯示器屏幕上。在前面的例題中我們已多次使用過這個函數。
一、printf函數調用的一般形式
printf函數是一個標準庫函數,它的函數原型在頭文件“stdio.h”中。但作為一個特例,不要求在使用printf函數之前必須包含stdio.h文件。printf函數調用的一般形式為:printf(“格式控制字符串”,輸出表列)其中格式控制字符串用于指定輸出格式。格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。如“%d”表示按十進制整型輸出,“%ld”表示按十進制長整型輸出,“%c”表示按字符型輸出等。后面將專門給予討論。
非格式字符串在輸出時原樣照印,在顯示中起提示作用。輸出表列中給出了各個輸出項,要求格式字符串和各輸出項在數量和類型上應該一一對應。
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.類型類型字符用以表示輸出數據的類型,其格式符和意義下表所示:
表示輸出類型的格式字符格式字符意義
d以十進制形式輸出帶符號整數(正數不輸出符號)
o以八進制形式輸出無符號整數(不輸出前綴O)
x以十六進制形式輸出無符號整數(不輸出前綴OX)
u以十進制形式輸出無符號整數
f以小數形式輸出單、雙精度實數
e以指數形式輸出單、雙精度實數
g以%f%e中較短的輸出寬度輸出單、雙精度實數
c輸出單個字符
s輸出字符串
2.標志
標志字符為-、+、#、空格四種,其意義下表所示:
標志格式字符標志意義
-結果左對齊,右邊填空格
+輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號
#對c,s,d,u類無影響;對o類,在輸出時加前
綴o對x類,在輸出時加前綴0x;對e,g,f類當結果有小數時才給出小數點
3.輸出最小寬度
用十進制整數來表示輸出的最少位數。若實際位數多于定義的寬度,則按實際位數輸出,若實際位數少于定義的寬度則補以空格或0。
4.精度
精度格式符以“.”開頭,后跟十進制整數。本項的意義是:如果輸出數字,則表示小數的位數;如果輸出的是字符,則表示輸出字符的個數;若實際位數大于所定義的精度數,則截去超過的部分。
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”類型無影響。“%5.4lf”指定輸出寬度為5,精度為4,由于實際長度超過5故應該按實際位數輸出,小數位數超過4位部分被截去。第九行輸出雙精度實數,“%8.4lf”由于指定精度為4位故截去了超過4位的部分。第十行輸出字符量d,其中“%bc”指定輸出寬度為8故在輸出字符p之前補加7個空格。
使用printf函數時還要注意一個問題,那就是輸出表列中的求值順序。不同的編譯系統不一定相同,可以從左到右,也可從右到左。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函數對輸出表中各量求值的順序是自右至左進行的。在式中,先對最后一項“-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。但是必須注意,求值順序雖是自右至左,但是輸出順序還是從左至右,因此得到的結果是上述輸出結果。
字符輸出函數
putchar函數
putchar函數是字符輸出函數,其功能是在顯示器上輸出單個字符。其一般形式為:putchar(字符變量)例如:
putchar(''''A'''');輸出大寫字母A
putchar(x);輸出字符變量x的值
putchar(''''\n'''');換行對控制字符則執行控制功能,不在屏幕上顯示。使用本函數前必須要用文件包含命令:
#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);
}
數據輸入語句
c語言的數據輸入也是由函數語句完成的。本節介紹從標準輸入設備—鍵盤上輸入數據的函數scanf和getchar。scanf函數scanf函數稱為格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變量之中。
一、scanf函數的一般形式
scanf函數是一個標準庫函數,它的函數原型在頭文件“stdio.h”中,與printf函數相同,c語言也允許在使用scanf函數之前不必包含stdio.h文件。scanf函數的一般形式為:scanf(“格式控制字符串”,地址表列);其中,格式控制字符串的作用與printf函數相同,但不能顯示非格式字符串,也就是不能顯示提示字符串。地址表列中給出各變量的地址。地址是由地址運算符“&”后跟變量名組成的。例如,&a,&b分別表示變量a和變量b的地址。這個地址就是編譯系統在內存中給a,b變量分配的地址。在c語言中,使用了地址這個概念,這是與其它語言不同的。應該把變量的值和變量的地址這兩個不同的概念區別開來。變量的地址是C編譯系統分配的,用戶不必關心具體的地址是多少。變量的地址和變量值的關系如下:&a--->a567a為變量名,567是變量的值,&a是變量a的地址。在賦值表達式中給變量賦值,如:a=567在賦值號左邊是變量名,不能寫地址,而scanf函數在本質上也是給變量賦值,但要求寫變量的地址,如&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函數本身不能顯示提示串,故先用printf語句在屏幕上輸出提示,請用戶輸入a、b、c的值。執行scanf語句,則退出TC屏幕進入用戶屏幕等待用戶輸入。用戶輸入7、8、9后按下回車鍵,此時,系統又將返回TC屏幕。在scanf語句的格式串中由于沒有非格式字符在“%d%d%d”之間作輸入時的間隔,因此在輸入時要用一個以上的空格或回車鍵作為每兩個輸入數之間的間隔。
如:789
或
7
8
9
格式字符串
格式字符串的一般形式為:%[*][輸入數據寬度][長度]類型其中有方括號[]的項為任選項。各項的意義如下:
1.類型
表示輸入數據的類型,其格式符和意義下表所示。
格式字符意義
d輸入十進制整數
o輸入八進制整數
x輸入十六進制整數
u輸入無符號十進制整數
f或e輸入實型數(用小數形式或指數形式)
c輸入單個字符
s輸入字符串
2.“*”符
用以表示該輸入項讀入后不賦予相應的變量,即跳過該輸入值。如scanf("%d%*d%d",&a,&b);當輸入為:123時,把1賦予a,2被跳過,3賦予b。
3.寬度
用十進制整數指定輸入的寬度(即字符數)。例如:scanf("%5d",&a);
輸入:
12345678
只把12345賦予變量a,其余部分被截去。又如:scanf("%4d%4d",&a,&b);
輸入:
12345678將把1234賦予a,而把5678賦予b。
4.長度
長度格式符為l和h,l表示輸入長整型數據(如%ld)和雙精度浮點數(如%lf)。h表示輸入短整型數據。
使用scanf函數還必須注意以下幾點:
a.scanf函數中沒有精度控制,如:scanf("%5.2f",&a);是非法的。不能企圖用此語句輸入小數為2位的實數。
b.scanf中要求給出變量地址,如給出變量名則會出錯。如scanf("%d",a);是非法的,應改為scnaf("%d",&a);才是合法的。
c.在輸入多個數值數據時,若格式控制串中沒有非格式字符作輸入數據之間的間隔則可用空格,TAB或回車作間隔。C編譯在碰到空格,TAB,回車或非法數據(如對“%d”輸入“12A”時,A即為非法數據)時即認為該數據結束。
d.在輸入字符數據時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有效字符。例如:
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);則輸入時各數據之間可加空格。
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函數"%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"之間有空格時,輸入的數據之間可以有空格間隔。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.如輸入的數據與輸出的類型不一致時,雖然編譯能夠通過,但結果將不正確。
voidmain(){
inta;
printf("inputanumber\n");
scanf("%d",&a);
printf("%ld",a);
}
由于輸入數據類型為整型,而輸出語句的格式串中說明為長整型,因此輸出結果和輸入數據不符。如改動程序如下:
voidmain(){
longa;
printf("inputalonginteger\n");
scanf("%ld",&a);
printf("%ld",a);
}
運行結果為:
inputalonginteger
1234567890
1234567890當輸入數據改為長整型后,輸入輸出數據相等。
鍵盤輸入函數
getchar函數getchar函數的功能是從鍵盤上輸入一個字符。其一般形式為:getchar();通常把輸入的字符賦予一個字符變量,構成賦值語句,如:
charc;
c=getchar();#include<stdio.h>
voidmain(){
charc;
printf("inputacharacter\n");
c=getchar();
putchar(c);
}
使用getchar函數還應注意幾個問題:
1.getchar函數只能接受單個字符,輸入數字也按字符處理。輸入多于一個字符時,只接收第一個字符。
2.使用本函數前必須包含文件“stdio.h”。
3.在TC屏幕下運行含本函數程序時,將退出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));
}
輸出各種數據類型的字節長度。
分支結構程序
關系運算符和表達式
在程序中經常需要比較兩個量的大小關系,以決定程序下一步的工作。比較兩個量的運算符稱為關系運算符。在c語言中有以下關系運算符:
<小于
<=小于或等于
>大于
>=大于或等于
==等于
!=不等于
關系運算符都是雙目運算符,其結合性均為左結合。關系運算符的優先級低于算術運算符,高于賦值運算符。在六個關系運算符中,<,<=,>,>=的優先級相同,高于==和!=,==和!=的優先級相同。
關系表達式
關系表達式的一般形式為:表達式關系運算符表達式例如:a+b>c-d,x>3/2,''''a''''+1<c,-i-5*j==k+1;都是合法的關系表達式。由于表達式也可以又是關系表達式。因此也允許出現嵌套的情況,例如: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,根據運算符的左結合性,先計算k==j,該式不成立,其值為0,再計算0==i+5,也不成立,故表達式值為0。
邏輯運算符和表達式
邏輯運算符c語言中提供了三種邏輯運算符&&與運算||或運算!非運算與運算符&&和或運算符||均為雙目運算符。具有左結合性。非
運算符!為單目運算符,具有右結合性。邏輯運算符和其它運算符優先級的關系可表示如下:
按照運算符的優先順序可以得出:
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”來表示。其求值規則如下:
1.與運算&&參與運算的兩個量都為真時,結果才為真,否則為假。例如,5>0&&4>2,由于5>0為真,4>2也為真,相與的結果也為真。
2.或運算||參與運算的兩個量只要有一個為真,結果就為真。兩個量都為假時,結果為假。例如:5>0||5>8,由于5>0為真,相或的結果也就為真
3.非運算!參與運算量為真時,結果為假;參與運算量為假時,結果為真。
例如:!(5>0)的結果為假。
雖然c編譯在給出邏輯運算值時,以“1”代表“真”,“0”代表“假”。但反過來在判斷一個量是為“真”還是為“假”時,以“0”代表“假”,以非“0”的數值作為“真”。例如:由于5和3均為非“0”因此5&&3的值為“真”,即為1。
又如:5||0的值為“真”,即為1。
邏輯表達式邏輯表達式的一般形式為:表達式邏輯運算符表達式其中的表達式可以又是邏輯表達式,從而組成了嵌套的情形。例如:(a&&b)&&c根據邏輯運算符的左結合性,上式也可寫為: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語句可以構成分支結構。它根據給定的條件進行判斷,以決定執行某個分支程序段。c語言的if語句有三種基本形式。
1.第一種形式為基本形式if(表達式)語句;其語義是:如果表達式的值為真,則執行其后的語句,否則不執行該語句。其過程可表示為下圖
voidmain(){
inta,b,max;
printf("\ninputtwonumbers:");
scanf("%d%d",&a,&b);
max=a;
if(max<b)max=b;
printf("max=%d",max);
}
輸入兩個整數,輸出其中的大數。
scanf("%d%d",&a,&b);
max=a;
if(max<b)max=b;
printf("max=%d",max);
本例程序中,輸入兩個數a,b。把a先賦予變量max,再用if語句判別max和b的大小,如max小于b,則把b賦予max。因此max中總是大數,最后輸出max的值。
2.第二種形式為if-else形式
if(表達式)
語句1;
else
語句2;
其語義是:如果表達式的值為真,則執行語句1,否則執行語句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);
}
輸入兩個整數,輸出其中的大數。改用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;
其語義是:依次判斷表達式的值,當出現某個值為真時,則執行其對應的語句。然后跳到整個if語句之外繼續執行程序。如果所有的表達式均為假,則執行語句n。然后繼續執行后續程序。if-else-if語句的執行過程如圖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");
本例要求判別鍵盤輸入字符的類別。可以根據輸入字符的ASCII碼來判別類型。由ASCII碼表可知ASCII值小于32的為控制字符。在“0”和“9”之間的為數字,在“A”和“Z”之間為大寫字母,在“a”和“z”之間為小寫字母,其余則為其它字符。這是一個多分支選擇的問題,用if-else-if語句編程,判斷輸入字符ASCII碼所在的范圍,分別給出不同的輸出。例如輸入為“g”,輸出顯示它為小寫字符。
4.在使用if語句中還應注意以下問題
(1)在三種形式的if語句中,在if關鍵字之后均為表達式。該表達式通常是邏輯表達式或關系表達式,但也可以是其它表達式,如賦值表達式等,甚至也可以是一個變量。例如:if(a=5)語句;if(b)語句;都是允許的。只要表達式的值為非0,即為“真”。如在if(a=5)…;中表達式的值永遠為非0,所以其后的語句總是要執行的,當然這種情況在程序中不一定會出現,但在語法上是合法的。
又如,有程序段:if(a=b)
printf("%d",a);
else
printf("a=0");本語句的語義是,把b值賦予a,如為非0則輸出該值,否則輸出“a=0”字符串。這種用法在程序中是經常出現的。
(2)在if語句中,條件判斷表達式必須用括號括起來,在語句之后必須加分號。
(3)在if語句的三種形式中,所有的語句應為單個語句,如果要想在滿足條件時執行一組(多個)語句,則必須把這一組語句用{}括起來組成一個復合語句。但要注意的是在}之后不能再加分號。
例如:
if(a>b){
a++;
b++;
}
else{a=0;
b=10;
}
if語句的嵌套
當if語句中的執行語句又是if語句時,則構成了if語句嵌套的情形。其一般形式可表示如下:
if(表達式)
if語句;
或者為
if(表達式)
if語句;
else
if語句;
在嵌套內的if語句可能又是if-else型的,這將會出現多個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語言規定,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");
}
比較兩個數的大小關系。
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");
}
條件運算符和條件表達式
如果在條件語句中,只執行單個的賦值語句時,常可使用條件表達式來實現。不但使程序簡潔,也提高了運行效率。
條件運算符為?和:,它是一個三目運算符,即有三個參與運算的量。由條件運算符組成條件表達式的一般形式為:
表達式1?表達式2:表達式3
其求值規則為:如果表達式1的值為真,則以表達式2的值作為條件表達式的值,否則以表達式2的值作為整個條件表達式的值。條件表達式通常用于賦值語句之中。
例如條件語句:
if(a>b)max=a;
elsemax=b;
可用條件表達式寫為max=(a>b)?a:b;執行該語句的語義是:如a>b為真,則把a賦予max,否則把b賦予max。
使用條件表達式時,還應注意以下幾點:
1.條件運算符的運算優先級低于關系運算符和算術運算符,但高于賦值符。因此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);
}
用條件表達式對上例重新編程,輸出兩個數中的大數。
switch語句
c語言還提供了另一種用于多分支選擇的switch語句,其一般形式為:
switch(表達式){
case常量表達式1:語句1;
case常量表達式2:語句2;
…
case常量表達式n:語句n;
default:語句n+1;
}
其語義是:計算表達式的值。并逐個與其后的常量表達式值相比較,當表達式的值與某個常量表達式的值相等時,即執行其后的語句,然后不再進行判斷,繼續執行后面所有case后的語句。如表達式的值與所有case后的常量表達式均不相同時,則執行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");
}
}
本程序是要求輸入一個數字,輸出一個英文單詞。但是當輸入3之后,卻執行了case3以及以后的所有語句,輸出了Wednesday及以后的所有單詞。這當然是不希望的。為什么會出現這種情況呢?這恰恰反應了switch語句的一個特點。在switch語句中,“case常量表達式”只相當于一個語句標號,表達式的值和某標號相等則轉向該標號執行,但不能在執行完該標號的語句后自動跳出整個switch語句,所以出現了繼續執行所有后面case語句的情況。這是與前面介紹的if語句完全不同的,應特別注意。為了避免上述情況,c語言還提供了一種break語句,專用于跳出switch語句,break語句只有關鍵字break,沒有參數。在后面還將詳細介紹。修改例題的程序,在每一case語句之后增加break語句,使每一次執行之后均可跳出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后的各常量表達式的值不能相同,否則會出現錯誤。
2.在case后,允許有多個語句,可以不用{}括起來。
3.各case和default子句的先后順序可以變動,而不會影響程序執行結果。
4.default子句可以省略不用。程序舉例
輸入三個整數,輸出最大數和最小數。
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的大小,并把大數裝入max,小數裝入min中,然后再與c比較,若max小于c,則把c賦予max;如果c小于min,則把c賦予min。因此max內總是最大數,而min內總是最小數。最后輸出max和min的值即可。計算器程序。用戶輸入運算數和四則運算符,輸出計算結果。
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語句用于判斷運算符,然后輸出運算值。當輸入運算符不是+,-,*,/時給出錯誤提示。
循環結構程序
循環結構是程序中一種很重要的結構。其特點是,在給定條件成立時,反復執行某程序段,直到條件不成立為止。給定的條件稱為循環條件,反復執行的程序段稱為循環體。c語言提供了多種循環語句,可以組成各種不同形式的循環結構。
while語句
while語句的一般形式為:while(表達式)語句;其中表達式是循環條件,語句為循環體。
while語句的語義是:計算表達式的值,當值為真(非0)時,執行循環體語句。其執行過程可用圖3—4表示。統計從鍵盤輸入一行字符的個數。
#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);
本例程序中的循環條件為getchar()!=''''\n'''',其意義是,只要從鍵盤輸入的字符不是回車就繼續循環。循環體n++完成對輸入字符個數計數。從而程序實現了對輸入一行字符的字符個數計數。
使用while語句應注意以下幾點:
1.while語句中的表達式一般是關系表達或邏輯表達式,只要表達式的值為真(非0)即可繼續循環。
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);
本例程序將執行n次循環,每執行一次,n值減1。循環體輸出表達式a++*2的值。該表達式等效于(a*2;a++)
2.循環體如包括有一個以上的語句,則必須用{}括起來,組成復合語句。
3.應注意循環條件的選擇以避免死循環。
voidmain(){
inta,n=0;
while(a=5)
printf("%d",n++);
}inta,n=0;
while(a=5)
printf("%d",n++);
本例中while語句的循環條件為賦值表達式a=5,因此該表達式的值永遠為真,而循環體中又沒有其它中止循環的手段,因此該循環將無休止地進行下去,形成死循環。4.允許while語句的循環體又是while語句,從而形成雙重循環。
do-while語句
do-while語句的一般形式為:
do
語句;
while(表達式);
其中語句是循環體,表達式是循環條件。
do-while語句的語義是:
先執行循環體語句一次,再判別表達式的值,若為真(非0)則繼續循環,否則終止循環。
do-while語句和while語句的區別在于do-while是先執行后判斷,因此do-while至少要執行一次循環體。而while是先判斷后執行,如果條件不滿足,則一次循環體語句也不執行。
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);
在本例中,循環條件改為--n,否則將多執行一次循環。這是由于先執行后判斷而造成的。
對于do-while語句還應注意以下幾點:
1.在if語句,while語句中,表達式后面都不能加分號,而在do-while語句的表達式后面則必須加分號。
2.do-while語句也可以組成多重循環,而且也可以和while語句相互嵌套。
3.在do和while之間的循環體由多個語句組成時,也必須用{}括起來組成一個復合語句。
4.do-while和while語句相互替換時,要注意修改循環控制條件。
for語句
for語句是c語言所提供的功能更強,使用更廣泛的一種循環語句。其一般形式為:
for(表達式1;表達式2;表達3)
語句;
表達式1通常用來給循環變量賦初值,一般是賦值表達式。也允許在for語句外給循環變量賦初值,此時可以省略該表達式。
表達式2通常是循環條件,一般為關系表達式或邏輯表達式。
表達式3通常可用來修改循環變量的值,一般是賦值語句。
這三個表達式都可以是逗號表達式,即每個表達式都可由多個表達式組成。三個表達式都是任選項,都可以省略。
一般形式中的“語句”即為循環體語句。for語句的語義是:
1.首先計算表達式1的值。
2.再計算表達式2的值,若值為真(非0)則執行循環體一次,否則跳出循環。
3.然后再計算表達式3的值,轉回第2步重復執行。在整個for循環過程中,表達式1只計算一次,表達式2和表達式,3則可能計算多次。循環體可能多次執行,也可能一次都不執行。for語句的執行過程如圖所示。
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,以改變循環變量的值。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d",a*2);
}
用for語句修改例題。從0開始,輸出n個連續的偶數。
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d",a*2);
本例的for語句中,表達式1已省去,循環變量的初值在for語句之前由scanf語句取得,表達式3是一個逗號表達式,由a++,n--兩個表達式組成。每循環一次a自增1,n自減1。a的變化使輸出的偶數遞增,n的變化控制循次數。
在使用for語句中要注意以下幾點
1.for語句中的各表達式都可省略,但分號間隔符不能少。如:for(;表達式;表達式)省去了表達式1。for(表達式;;表達式)省去了表達式2。
for(表達式;表達式;)省去了表達式3。for(;;)省去了全部表達式。
2.在循環變量已賦初值時,可省去表達式1,如例3.27即屬于這種情形。如省去表達式2或表達式3則將造成無限循環,這時應在循環體內設法結束循環。例題即屬于此情況。
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,由循環體內的n--語句進行循環變量n的遞減,以控制循環次數。
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語句的表達式全部省去。由循環體中的語句實現循環變量的遞減和循環條件的判斷。當n值為0時,由break語句中止循環,轉去執行for以后的程序。在此情況下,for語句已等效于while(1)語句。如在循環體中沒有相應的控制手段,則造成死循環。
3.循環體可以是空語句。
#include"stdio.h"
voidmain(){
intn=0;
printf("inputastring:\n");
for(;getchar()!=''''\n'''';n++);
printf("%d",n);
}
本例中,省去了for語句的表達式1,表達式3也不是用來修改循環變量,而是用作輸入字符的計數。這樣,就把本應在循環體中完成的計數放在表達式中完成了。因此循環體是空語句。應注意的是,空語句后的分號不可少,如缺少此分號,則把后面的printf語句當成循環體來執行。反過來說,如循環體不為空語句時,決不能在表達式的括號后加分號,這樣又會認為循環體是空語句而不能反復執行。這些都是編程中常見的錯誤,要十分注意。
4.for語句也可與while,do-while語句相互嵌套,構成多重循環。以下形成都合法的嵌套。
(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");
}
}
轉移語句
程序中的語句通常總是按順序方向,或按語句功能所定義的方向執行的。如果需要改變程序的正常流向,可以使用本小節介紹的轉移語句。在c語言中提供了4種轉移語句:
goto,break,continue和return。
其中的return語句只能出現在被調函數中,用于返回主調函數,我們將在函數一章中具體介紹。本小節介紹前三種轉移語句。
1.goto語句
goto語句也稱為無條件轉移語句,其一般格式如下:goto語句標號;其中語句標號是按標識符規定書寫的符號,放在某一語句行的
前面,標號后加冒號(:)。語句標號起標識語句的作用,與goto語句配合使用。
如:label:i++;
loop:while(x<7);
c語言不限制程序中使用標號的次數,但各標號不得重名。goto語句的語義是改變程序流向,轉去執行語句標號所標識的語句。
goto語句通常與條件語句配合使用。可用來實現條件轉移,構成循環,跳出循環體等功能。
但是,在結構化程序設計中一般不主張使用goto語句,以免造成程序流程的混亂,使理解和調試程序都產生困難。
統計從鍵盤輸入一行字符的個數。
#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語句構成循環結構。當輸入字符不為''''\n''''時即執行n++進行計數,然后轉移至if語句循環執行。直至輸入字符為''''\n''''才停止循環。
break語句
break語句只能用在switch語句或循環語句中,其作用是跳出switch語句或跳出本層循環,轉去執行后面的程序。由于break語句的轉移方向是明確的,所以不需要語句標號與之配合。break語句的一般形式為:break;上面例題中分別在switch語句和for語句中使用了break語句作為跳轉。使用break語句可以使循環語句有多個出口,在一些場合下使編程更加靈活、方便。
continue語句
continue語句只能用在循環體中,其一般格式是:
continue;
其語義是:結束本次循環,即不再執行循環體中continue語句之后的語句,轉入下一次循環條件的判斷與執行。應注意的是,本語句只結束本層本次的循環,并不跳出循環。
voidmain(){
intn;
for(n=7;n<=100;n++)
{
if(n%7!=0)
continue;
printf("%d",n);
}
}
輸出100以內能被7整除的數。
intn;
for(n=7;n<=100;n++)
{
if(n%7!=0)
continue;
printf("%d",n);
}
本例中,對7~100的每一個數進行測試,如該數不能被7整除,即模運算不為0,則由continus語句轉去下一次循環。只有模運算為0時,才能執行后面的printf語句,輸出能被7整除的數。
#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。然后進入循環,把下一字符讀入a,比較a,b是否相等,若相等則輸出提示串并中止循環,若不相等則把a中的字符賦予b,輸入下一次循環。
輸出100以內的素數。素數是只能被1和本身整除的數。可用窮舉法來判斷一個數是否是素數。
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);
}
本例程序中,第一層循環表示對1~100這100個數逐個判斷是否是素數,共循環100次,在第二層循環中則對數n用2~n-1逐個去除,若某次除盡則跳出該層循環,說明不是素數。如果在所有的數都是未除盡的情況下結束循環,則為素數,此時有i>=n,故可經此判斷后輸出素數。然后轉入下一次大循環。實際上,2以上的所有偶數均不是素數,因此可以使循環變量的步長值改為2,即每次增加2,此外只需對數n用2~n去除就可判斷該數是否素數。這樣將大大減少循環次數,減少程序運行時間。
#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.從程序執行的流程來看,程序可分為三種最基本的結構:順序結構,分支結構以及循環結構
2.程序中執行部分最基本的單位是語句。c語言的語句可分為五類:
(1)表達式語句任何表達式末尾加上分號即可構成表達式語句,常用的表達式語句為賦值語句。
(2)函數調用語句由函數調用加上分號即組成函數調用語句。
(3)控制語句用于控制程序流程,由專門的語句定義符及所需的表達式組成。主要有條件判斷執行語句,循環執行語句,轉向語句等。
(4)復合語句由{}把多個語句括起來組成一個語句。復合語句被認為是單條語句,它可出現在所有允許出現語句的地方,如循環體等。
(5)空語句僅由分號組成,無實際功能。
3.c語言中沒有提供專門的輸入輸出語句,所有的輸入輸出都是由調用標準庫函數中的輸入輸出函數來實現的。
scanf和getchar函數是輸入函數,接收來自鍵盤的輸入數據。
scanf是格式輸入函數,可按指定的格式輸入任意類型數據。
getchar函數是字符輸入函數,只能接收單個字符。
printf和putchar函數是輸出函數,向顯示器屏幕輸出數據。
printf是格式輸出函數,可按指定的格式顯示任意類型的數據。
putchar是字符顯示函數,只能顯示單個字符。
4.關系表達式和邏輯表達式是兩種重要的表達式,主要用于條件執行的判斷和循環執行的判斷。
5.c語言提供了多種形式的條件語句以構成分支結構。
(1)if語句主要用于單向選擇。
(2)if-else語句主要用于雙向選擇。
(3)if-else-if語和switch語句用于多向選擇。
這幾種形式的條件語句一般來說是可以互相替代的。
6.c語言提供了三種循環語句。
(1)for語句主要用于給定循環變量初值,步長增量以及循環次數的循環結構。
(2)循環次數及控制條件要在循環過程中才能確定的循環可用while或do-while語句。
(3)三種循環語句可以相互嵌套組成多重循環。循環之間可以并列但不能交叉。
(4)可用轉移語句把流程轉出循環體外,但不能從外面轉向循環體內。
(5)在循環程序中應避免出現死循環,即應保證循環變量的值在運行過程中可以得到修改,并使循環條件逐步變為假,從而結束循環。
7.c語言語句小結
名稱一般形式
簡單語句表達式語句表達式;
空語句;
復合語句{語句}
條件語句if(表達式)語句;
if(表達式)語句1;else語句2;
if(表達式1)語句1;elseif(表達式2)語句2…else語句n;
開關語句switch(表達式){case常量表達式:語句…default:語句;}
循環語句while語句
while(表達式)語句;
for語句for(表達式1;表達式2;表達式3)語句;
break語句break;
goto語句goto;
篇2
>> C語言程序設計案例教學法研究 以程序案例為導向的《C語言程序設計》的教學研究 C語言程序設計教學探討 C++程序設計淺析 C程序設計教學的新寵 高職院校《C++程序設計》 C語言程序設計教學研討 《C程序設計》教學心得 淺議C語言程序設計教學 C程序設計課程教學探討 C語言程序設計教學 淺談C程序設計教學 C語言程序設計教學探索 “C++程序設計”課程改革 《C++程序設計》教材介紹 C程序設計教學初探 C程序設計教學探討 《C語言程序設計》教學實踐 C高效程序設計的技巧 C++程序設計教學探討 常見問題解答 當前所在位置:l),其中羅列了一些優秀的開源C++項目。4) 開源中國社區(/ project/ lang/21/c)。
我們初步篩選出了以下8個開源項目:1) C++程序開發框架Qt;2)以3D方式顯示函數曲面的K3DSurf;3)比Windows 自帶的Notepad更優秀的Notepad++;4)游覽宇宙星體的教育軟件Celestia;5)能夠檢測C++程序中邏輯錯誤的CppCheck;6)能夠快速瀏覽大型源代碼系統的Source Navigator;7)能夠顯示Windows目錄、邏輯盤使用情況的WinDirStat;8)能夠顯示與合并目錄/文件差異的Winmerge。
2評估指標
我們依據以下指標對每個候選案例進行定量化評估。
2.1學生興趣
從教育心理學角度看,如果學生對一個案例感興趣,他們就會主動去學習與該題目相關的其他領域知識,也會更積極地去研究課程知識是如何被應用到該案例中去的。我們調查了南開大學軟件學院114名本科一年級學生對這8個開源項目的興趣程度。首先我們演示了這8個開源軟件各自的功能,再讓每個學生獨立的填寫一個問卷調查表。每個學生對一個項目感興趣的程度用數字1~5表示,5表示最感興趣,1表示最不感興趣。最后我們將所有學生對一個項目的興趣程度取均值。
2.2代碼規模
作為本科生的課程設計或者實訓項目,往往要求學生在1個學期之內的時間完成。如果案例本身代碼太多,學生們將無法在有限的時間里完成案例的學習。另一方面,如果案例本身代碼太少,將無法展示相關課程內容在實際項目中的應用情況。我們需要在二者之間進行折中,依據軟件代碼行數(LOC,Line of Code)以及軟件中類型數量來評測一個項目的代碼規模。
2.3代碼質量
精確地評估一個軟件系統的代碼質量是比較困難的,這需要專家仔細研讀軟件的源代碼、文檔,理解并評估其軟件系統設計,判讀其可擴展性、可移植性、模塊化的程度,評判其代碼是否符合C++代碼規范的要求,評測其運行時的性能、健壯程度等。8個候選題目的代碼總量大約為53萬行,進行人工的評估顯然是不現實的。我們選擇了以下兩個子指標對一個軟件項目的代碼質量進行評估:
1) 代碼中注釋部分的比例。適當比例的注釋可以提高代碼的可讀性,同時也表明了編程人員編寫代碼比較仔細、嚴謹。
2)LCOM度量(Lack of Cohesion of Methods)。好的內聚性(Cohesion)是一個高質量軟件系統必須具備的。所謂內聚性,是指一個類的成員變量和成員函數之間的耦合程度。雖然有多個度量來評測內聚性,我們選擇Henderson-Sellers提出的Lack of Cohesion of Methods (LCOM-HS) [7]。該值越大,表明一個類的內聚性越差;越小則表示內聚性越好。其取值范圍為[0,2]。
2.4C++技術的應用
由于案例教學的目的是要求學生熟練應用C++以及相關面向對象技術進行軟件開發,所以我們要求所選案例本身能夠盡量全面的覆蓋C++的各個方面。我們選擇了3個子指標:
1) 一個項目所使用的名字空間(namespace)的個數。在一個中、大型軟件項目中,合理使用名字空間可以有效避免名字沖突,提高軟件系統的模塊化程度。
2) 一個項目所使用的模板(template)的個數。C++除了具有所有面向對象編程的特性之外,現代的C++程序開始大量使用模板來實現泛型編程(Generic Programming)的思想。對模板的適度使用,可以使得一個相關模塊更加通用,更易擴展,能夠最大程度地達到代碼復用的目的。
3) 繼承。類的繼承也可以達到代碼復用的目的,也是C++程序設計中實現多態性的必要條件之一。
3評估工具及運用
有以下工具可以評測C++代碼的規模與質量:
1)SourceAudit(),由Front EndART公司開發。
2)Telelogic 公司的logiscope。
3)CppDepend(),能夠對C++程序進行60多個指標的測量,其中有些是關于代碼結構的(如class、namespace的數量),有些是關于代碼質量的(如程序注釋比例、內聚性、項目穩定度等)。該工具還可以直觀地顯示程序模塊、類、函數之間的依賴性。CppDepend將被分析程序的代碼當做數據庫來處理,允許用戶使用一種代碼查詢語言(Code Query Language,CQL)來靈活地分析程序代碼。由于該工具小巧(約8.6M字節)、靈活(支持CQL語言)、被允許在學術機構中免費使用,我們選擇該工具來對課程案例進行評估。
部分評估指標在CppDepend生成的html格式的報告中可以直接找到,而有些評估指標需要用戶創建CQL語句,提交給CppDepend完成查詢。CQL和SQL相似,其格式為SELECT TOP FROM WHERE ORDER BY。如為了查詢一個軟件項目中有哪些函數的代碼超過200行,可以使用下面的CQL語句。
SELECT METHODS WHERE NbLinesOfCode > 200 ORDER BY NbLinesOfCode DESC
其中METHODS表示代碼中的函數,NbLinesOfCode表示函數體內的代碼行數,DESC表示降序排列。
需要使用CQL語句計算的評估指標如下。為了查詢一個C++項目中的繼承數,我們使用下面的CQL語句。
SELECT TYPES WHERE NbBaseClass >0
其中TYPES表示一個C++項目中定義的類型,比如類、結構體、聯合體等。
為了查詢一個C++項目中內聚性較差的類的名稱與數量,我們使用下面的CQL語句。
SELECT TYPES WHERE LCOMHS > 0.95 AND NbFields > 10 AND NbMethods >10 AND !IsGlobal ORDER BY LCOMHS DESC
其中LCOMHS表示Henderson-Sellers定義的LCOM度量,NbFields表示一個類的成員變量的數量,NbMethods表示一個類的成員函數的數量。
4評估結果
依據以上指標,我們對各個候選案例進行定量分析,結果如表1。由于整個Qt軟件系統的總代碼規模、復雜程度遠遠超過本科生的理解能力范圍,我們選擇了其核心模塊QtCore以及經常被開發人員使用的QtGui作為評估對象。表中,LOC表示代碼行數(Line Of Code),Types列顯示的是各系統中類型的數量,Comm列顯示的是注釋行數量與總代碼行的比值,LCOM列表示內聚性差的類在所有類型中的比例,NSpace表示namespace的數量,templates和inherits分別表示各系統所使用的模板與繼承的數量。
從“學生興趣”指標上看,學生們最感興趣的是Qt軟件包,這可能歸因于該軟件包的示例程序展現了Qt具有強大的圖形/圖像處理功能。學生們其次感興趣的是K3DSurf,可能是被該軟件所展現的精美的數學函數曲面所折服。學生們最不感興趣的是Winmerge,這可能是由于在他們有限的軟件開發經歷中,尚未遇到要比較兩個目錄的問題。假如被調查對象是具有多年工作經驗的程序員,他們可能對Winmerge更感興趣,因為該工具可以快速地找出一個軟件的兩個開發版本的異同。
從“C++技術的應用”指標上看,Qt、Celestia和Winmerge都大量的使用了名字空間、模板、繼承,表明這3款開源項目更適合作為課程案例來使用。由于學生們對Winmerge的興趣較低,我們候選案例清單縮減為Qt和Celestia。
就Qt而言,即使我們只選擇了其中的QtCore及QtGui模塊,代碼規模仍然高達22萬行。因而,我們選擇QtCore作為詳細剖析的案例對象,而對QtGui只做粗粒度的剖析。這樣,候選清單中的競爭者就成為了QtCore和Celestia。
總體上,QtCore和Celestia具有旗鼓相當的指標值,只是學生們對Qt的興趣程度稍高,QtCore的注釋比例最高。作為一個C++程序開發框架,QtCore的軟件體系應該比較抽象,所以它所使用的模板數量要高于Celestia。
5結語
本文設計了一套定量化的評估指標,使用代碼查詢語言(Code Query Language,CQL)及代碼分析工具CppDepend對8個開源項目進行了定量評估,給出了適合于課程C++程序設計的候選案例,可供各高校在相關課程的案例教學中參考。
注:本文得到南開大學教務處、軟件學院“08 年教學改革專項”(2009-2~2010-12)的大力支持。
參考文獻:
[1] Bruce Eckel. Thinking in C++[M]. 北京:機械工業出版社,2001.
[2] Stanley B Lippman,Josée LaJoie. C++ Primer[M]. 北京:人民郵電出版社,2005.
[3] Bjarne Stroustrup. The C++ Programming Language: Special Edition[M]. 北京:高等教育出版社,2001.
[4] Scott Meyers.Effective C++[M]. Greater Boston Area :Addison-Wesley Professional,2005.
[5] 陳艷華,余健,雷志軍. Visual C++.NET課程設計案例精編[M]. 北京:清華大學出版社,2008.
篇3
鐘 實
(江西科技學院)
[摘 要]C語言程序設計課程是計算機專業教育的重要組成部分。將探究教學引入C語言程序設計教學中,不僅可以提高學生學習的興趣,調動教師教學的
熱情,也豐富了探究教學的理論與實踐。具體分析并探討了C語言程序設計探究教學的實施目標、實施條件、教學情境的創設、探究形式、教學評價等問題。
[關鍵詞]C語言程序設計 探究教學 實施目標
一、 C語言程序設計探究教學實施的目標:情感目標、能力目標和認知目
標
1、體驗C語言程序設計的編程思想,激發和保持對C語言程序設計課程的
求知欲,形成積極主動地學習和參與C語言程序設計課程探究活動的態度。
2、能辯證地認識C語言程序設計對社會發展、科技進步和日常生活學習的
影響。
3、獲得親自參與研究探索的積極體驗、培養嚴謹的科學態度。
4、能從日常生活、學習中發現或歸納可以利用C語言程序設計解決的問題,
通過問題分析確定程序功能。
5、能根據任務的要求,確定所需信息的類型和來源,并鑒別信息的真實性、
準確性和相關性。
6、掌握計算機程序的基本概念,理解并掌握C語言程序設計語言的基本知
識,包括語句、數據類型、變量、常量、表達式、函數等,熟悉語言的語法規則,熟
悉計算機程序執行的基本過程。
7、了解C語言程序設計語言,掌握編寫程序、編譯程序、連接程序以及程序
開發環境等基本知識,掌握調試、運行程序的基本方法與技巧。
二、C語言程序設計探究教學實施的條件
1、掌握一定的計算機操作基礎
C語言程序設計課程由于其學科自身的特點,需要在計算機上調試程序,
所以要求學生具有一定的計算機操作知識,如:開關機、鍵盤和鼠標的使用、文
件的建立與查找、常用軟件的使用等。
2、良好的C語言程序設計認知結構
認知結構就是學生頭腦里的知識結構,是學習者觀念的全部內容和組織。
奧蘇伯爾的認知結構理論是針對新學習內容的影響(即遷移)提出的,良好的認
知結構有利于知識的提取和正向遷移。C語言程序設計探究教學強調在已有知
識經驗上的主動建構,面對新的問題和任務,需要學生及時從頭腦中提取信息,
建立新舊知識間的聯系,在已有C語言程序設計知識的基礎上思考解決新問題
的辦法,并試圖將新知識納入自己的認知結構中。
3 、良好的探究環境
良好的探究環境是學生順利進行探究的保證,至少包含兩方面的內容:(1)
要有充足的探究時間和靈活的探究條件。探究時間應該根據學習任務進行合理
安排,應該考慮到學生假設錯誤時所耽誤的時間以及討論交流所需要的時間。
探究教學中可能需要查閱大量的資料,教師還應該準備書籍、網絡等輔助資源。
(2)學生在探究學習的時候不能有太多壓力,不同的學生由于其自身的因素不可
能以相同的速度學習,所以教師在進行評價的時候也應該因人而異,應該為每
個學生提供充分的思考機會和時間,讓每個學生都能以自己的進度進行探索,
并在此過程中感受到樂趣。
三、C語言程序設計探究教學情境的創設
心理學研究表明,恰當、適宜的環境能有效激發人的熱烈情緒,提高活動的
質量和效果。教學情境是指教師人為創造的“典型場景”,創設目的在于引出教
學任務,將學生的注意力吸引到學習任務中來。教師把將要學習的C語言程序
設計知識通過一定的情境呈現給學生,使得學生認知結構與周圍環境不平衡,
引起他們對學習目標的注意和興趣,并通過探究活動把學生過去的活動和將來
的活動聯系在心理學研究表明,恰當、適宜的環境能有效激發人的熱烈情緒,提
高活動的質量和效果。教學情境是指教師人為創造的“典型場景”,創設目的在
于引出教學任務,將學生的注意力吸引到學習任務中來。教師把將要學習的C
語言程序設計知識通過一定的情境呈現給學生,使得學生認知結構與周圍環境
不平衡,引起他們對學習目標的注意和興趣,并通過探究活動把學生過去的活
動和將來的活動聯系在一體。探究教學情境的創設應做到:(1)創設的情境是為
C語言程序設計教學服務的,要以C語言程序設計探究教學目標為依據。(2)探究
情境要接近學生的真實生活經驗,能夠吸引學生的注意力,激發他們的認知沖
突和求知欲。(3)學生在情境中能夠感覺到問題的存在,自然地將新舊知識聯系
起來。(4)情境中必須包含學生未知的新內容,而且是能夠通過探究掌握的。
四、C語言程序設計課程中的探究形式
C語言程序設計課程中開展探究教學主要有4種形式:探究性提問、探究性
討論、探究性演示和探究性實驗。這4種形式是相輔相承的,而不是孤立存在的,
在C語言程序設計探究教學中,需要用到多種形式來構成一個完整的探究教學
過程。C語言程序設計探究教學通常都是由探究性提問開始,然后進行探究性
討論、探究性演示或探究性實驗;也可能從探究性演示或探究性實驗開始,在演
示或實驗的過程中發現問題,再進行探究性討論。在實際教學過程中,要根據學
習內容和課堂情況靈活地選用這些形式。
五、C語言程序設計探究教學評價
教學評價指依據一定的標準,通過各種策略和相關資料的收集,對教學活
動及其效果進行客觀衡量和科學判定的系統過程。C語言程序設計探究教學評
價是對C語言程序設計探究教學過程及其影響的測量、分析和評定,評價中我
們更關注學生學習和成長的過程,尋找適合學生發展的學習方式,滿足學生知
識和能力發展的需要。評價對探究教學的積極作用是很明顯的,但是如果評價
指標制定不合理,或者評價方法的選用、評價結果的表述不當,不僅不能達到預
期效果,還會對學生的C語言程序設計學習產生消極影響。
參考文獻
[1] 《基礎教育課程改革綱要(試行)》教育部文件,教基[2001]17號.
[2] 保羅 朗格朗.終身教育引論瞰[M].北京:中國對外翻譯出版公司,1985,
p15~31.
[3] 聯合國教科文組織.學會生存——教育世界的今天和明天[M].上海:
上海譯文出.
版社,1979,p2.
[4] 張大均。教育心理學[M].北京:人民教育出版社,2005,p68--71.
[5] 靳玉樂.探究教學論[M].重慶:西南師范大學出版社,200l.
作者簡介
鐘實(1986-02)男、民族(漢),籍貫(江西省南昌市),2010畢業于浙江大學
篇4
[關鍵詞]C語言程序設計 改革 實踐
引言
C語言程序設計課程足以C語言為平臺,使學生全面了解程序設計的總體思路、程序沒計的基本算法、C語言的語法規則以及使用C語言進行構化程序沒計的方法,并具有一定的程序設計和程序調試的能力,為今后使用C語言解決實際問題打下良好的基礎 由于C語言涉及的概念比較復雜,規則繁多,使用靈活,容易出錯,同時該課程又是學生首先接觸的第一門程序沒計課程,所以很多學生學習起來都感到困難和吃力.并不同程度產生畏懼心理。
在C語言程序設計的教學工作中,我們發現,學生的學習熱情不高,更談不上綜合應用能力的培養與提高。我們C語言課程教學組通過對我校C語言程序設計課程教學現狀的調查分析,總結出了教學效果較差的主要原因,并從教材內容、教學方法、教學手段和、上機實踐和考核評價體系五個方面進行了大膽的改革與實踐,并取得了較好的教學效果。
一、C語言程序設計課程教學現狀分析
為了實時掌握學生的真實學習情況,任課教師對學生進行了問卷調查。根據問卷結果及各位教師的教學經驗,總結出我校C語言程序設計課程教學效果較差的主要原因有以下幾點。
(1)內容抽象、枯燥,學生學習興趣度低。相比第一學期已經或多或少有所接觸并有一定基礎的大學計算機課程而言,第二學期開設的程序設計課程是一種截然不同的全新的課程,出現了大量的新概念、新名詞和新方法。上機時好不容易敲上了一個程序,一運行就會出現一堆錯誤。62.4%的學生看不懂錯誤提示,84.76%的同學不會使用單步跟蹤、Watch窗口等基本調試工具,22.3%的同學竟然根本不知道這些調試工具。于是學生對該課程的學習舉步維艱,學習的熱情急速降溫。
(2)實用性不強。近80%的同學認為C語言的語法知識學了一大堆,但不知道學這些語法有什么用,和自己的專業知識有什么聯系。因此,多年積累下來,對C語言程序設計課程的普遍看法是:這是一門無用的公共課,混混過去就算了。于是,很多同學上課不聽講、下課不預習、不復習,周而復始,形成惡性循環。
(3)進度過于緩慢。C語言程序設計每周4學時,其中,2學時多媒體教室的課堂教學,2學時計算中心機房的上機實踐。計算中心機房為多個班級公用,且無屏幕轉播設施,因此教師的教學僅限于2學時的課堂教學。課時太少,加上學生興趣度低,往往一學期下來指針剛講了基本概念就結束了。有些為參加全國計算機等級二級c語言考試而努力學習的同學也因為指針內容學習太少而難以過關。
針對上述C語言程序設計教學效果差的原因,我中心C語言課程組的各位教師認真研讀了“研究式學習”、“CDIO教學模式”、“計算思維”等理論及各種教學方法和實踐方式,借鑒了哈工大全國精品課程“C語言程序設計”課程的先進教學經驗,并結合各位教師多年的教學經驗,制定了C語言程序設汁課程教學體系的改革方案。該教學體系改革方案從教材內容、教學方法、教學手段、上機實踐和考核評價體系五個方面展開。
二、編寫優質配套教材,實施教材改革
我們按照研究性學習的內涵編寫了《研究式學習——C語言程序設計》教材,目前正在進行面向“計算思維”的新版教材的編寫。該系列教材具備以下特點:
(1) 編寫理念科學性強
整套教材的編寫以“研究式學習”理念為指導,研究性學習是一種建構性的、追求協商的、尊重個性的、以人為本的“體驗式學習”。在2006年的《國家精品課程評估指標》中新增了一條指標:“重視研究性學習、探究性學習、協作學習等現代教育理念在教學中的應用;能夠根據課程內容和學生特征,對教學方法和教學評價進行設計。”所以研究性學習是以人為本的高等教育價值觀的體現,是社會變革和教育發展的要求,也是精品課程的要求。研究性學習的關鍵是要在學習的各個階段提出適當的研究問題,以便在學習過程中為學生創造能親臨體驗地進行研究學習的平臺,問題的提出貫穿在課堂教學、實驗教學、課后作業、綜合性作業以及評價的整個教學過程中。我們自2004年開始就致力于打造C語言程序設計精品課程,所有的教學和改革都圍繞該指導思想進行。2007年以C語言程序設計為主體的“程序設計與計算機語言”被評為省級精品課程,2010年由教材主編主持申報到了省級質量工程教改項目“Inquiry Learning體系在程序設計課程中的運用”研究。這一系列的改革和研究都是以學生為主體,以培養和提高學生的計算機素養為最終目的而制定的。在教學過程中我們經常與學生座談和交流,了解學生的需求,完善我們的教學,使我們的教材和教學模式能與時俱進,保持很好的前瞻性和科學性。
(2) 內容組織創新性強
本教材用“提出問題—分析問題—給出相關知識—舉一反三”的研究式學習方式來組織“C語言程序設計”這門課程,在注重語言知識培養的同時,更注重邏輯思維能力、程序設計能力及創新能力的培養。內容組織方式新穎,符合認識規律,富有啟發性,便于學習,有利于激發學生學習興趣及各種能力的培養。本教材每章都通過4個步驟來完成學習:
第1步,通過提出問題、分析問題來激發學生的興趣,引起學生的思考。
第2步,通過問題的解決、相關知識點的跟進,使學生能逐步提升程序設計的能力,掌握C語言的知識,引導學生深入思考。
第3步,用一定數量的編程實例使學生深入理解和掌握所學知識,用具有趣味性的綜合應用編程實例培養學生的邏輯思維能力和編程能力,挖掘學生的創新能力。
第4步,對每部分的知識進行小結,以便學生進一步鞏固應掌握的知識。
每章后面都有“綜合應用”部分,讓學生對所學知識的具體運用有明確的認識,并能在此基礎上進一步鞏固和提升。
三、采取多樣性方法,實施教學方法的改革
(1)任務驅動教學方法
大多數學生反映C語言概念眾多,許多知識點抽象且難以理解,學生不能將理論和實際應用結合起米, 任務驅動教學法是一種建立在建構主義學習理論基礎上的教學法,它將以往以傳授知識為主的傳統教學理念,轉變為以解決問題、完成任務為主的多維巨動式的教學理念;將再現式教學轉變為探究式學習,使學生處于積極的學習狀態,每一位學生都能根據自己對當前問題的理解,運用共有的知識和自己特有的經驗提出方案、解決問題。在c語言程寧沒計課中.體現“任務驅動”就是讓學生在一個個典型的程序“任務”驅動下,教師引導幫助學生完成一系列程序“任務”,把知識的學習和知識的應用有機地融合在一起,讓學生達到融會貫通、一點帶面的效果。例如,在講授C語言循環語句的教學時,按任務驅動教學模式不是孤立地介紹格式、作用和使用方法,而是將這一知識點設計為“計算1+2+3+……+1 00=?”這一具體的任務。首先,教師通過提出“任務”讓學生把握教學內容,同學們會想象怎么完成這個任務,頭腦里對前而的所學內容進行回顧,但前面學過的知識沒法完成這種任務。接下來教師再講解如何使用循環語句等具體操作方法,這樣教學,學生學得快、學得牢。通過實踐發現“任務驅動”法有利于激發學生的學習興趣,培養學生的分析問題、解決問題的能力,提高學生自主學習及與他人協作的能力,縮短了學習周期。
(2) 項目教學法
很多學生在學完C語言程序沒汁課程后,其結果是聽得懂、卻編不出程序來。針對這一情況,我們在教學過程中采用項目教學法。項目教學法是通過實施一個完整的項目而進行的教學活動,其目的是在課堂教學中把理論與實踐有機地結合起來,充分發掘學生的創造潛能,提高學生解決實際問題的綜合能力。在課程初期.主要是進行單項的編程練習,重在掌握C語言的基本數據類型、語句與程序結構等。在進入函數、數組、指針、結構體和文件內容教學時,開始綜合實訓項日的編程設計,每一個實訓項日都呵以用前一個實訓項目為基礎。通過一個項目的層層遞進,引入課程內容,使得學生的學習循序漸進,螺旋式地上升,效果很好,開闊學生的思維,使得學生在課堂上真正地成為“主體”,教師則扮演“主導”角色。該教學方法使學生積極參與到教學過程中,變被動為主動,有效地調動了學生學習的積極性,深受學生好評。
(3)比較教學法
C語言中的概念比較復雜,規則繁多.而且內容前后聯系緊密,教學過程中教師通過對比的方式對相關的概念或類似的程序代碼進行比較,進而明確差異,然后進行歸納總結,方便學生理解,將會收到事半功倍的效果 例如,C語言中的指針是教學中的一個難點.這一部分涉及的概念較多,如指向變量的指針、指向數組的指針、指向字符串的指針、指向函數的指針等。這些概念很容易混淆,但是將這些概念對比起來講解,學生就很容易理解了。這些概念的共性都是指針,那么它們不同的地方在哪呢?關鍵在于指針變量的指向不同,指針所指向變量的數據類型決定了指針變量的用法。通過這樣的講解,概念的定義就很容易理解,概念的用法也就可以統一了。再如,數據的排序問題有多種算法,典型的有冒泡排序、選擇排序、插入排序等,求解方程的根的算法也有多種,有迭代法、牛頓迭代法、二分法和弦截法等。這些算法之間既有聯系又有區別,講清楚了算法的聯系和區別,也就解決了整個問題。
(4)啟發式教學法
啟發式教學法就是通過教師的啟發教學充分調動學生的積極性、主動性和創造性,引導學生主動學習。例如,在學習printf()和scanf()函數時,通過比較式啟發方法講解兩函數的功能、格式、使用特性等方面的異同,通過比較使學生更好地把握兩函數的特征。在學習選擇排序算法時,使用模擬式啟發方法,讓l0個學生隨機坐在相鄰的l0個位子上,然后現場模擬排序過程;在學習數據交換算法時,使用比喻式和問題式啟發方法,將兩個變量比喻成兩個瓶子,將里面存放的數據比喻成醋和醬油,然后提問:如果將兩個瓶子中的醋和醬油交換一下,應如何操作。
(5)“魚漁兼授式”教學方法。C語言只是一種表述工具,如果只有扎實的語法知識,沒有程序設計思想,根本就不可能寫出程序;而如果有程序設計思想,但語法知識不扎實,勢必在程序的編寫、運行過程中遇到一系列的問題,從而影響學生的學習熱情。而“魚漁兼授式”教學方法可以在基礎語法知識和程序設計方法之問找到一個平衡點,使之相輔相成。例如,在講解數據類型時著重講解為什么數據要分不同的數據類型,需要從哪幾個角度學習不同數據類型的特性;講解具體算法時著重講解遇到類似問題時應從哪些角度分析問題,用什么方法進行程序設計從而解決問題;在課前精心設計一些錯誤,尤其是邏輯錯誤,然后講解遇到錯誤可以采用什么手段去剖析、定位錯誤。
四、建立立體化教學體系,實施教學手段的改革
我們從2006年就開始了立體化教學體系的建設,我們建立了精品課程網站,實現了“在線教育”,現在我們課程的課件、課堂教學錄像、軟件、二級等考及相關閱讀等教學資源都放在了網絡上,作業也通過網絡來實現布置、提交和批閱。師生之間可以通過教學郵箱和課程論壇進行交流,任課教師可以自己定制調查問卷,隨時了解學生的動態和需求,還可以隨時進行在線測試,課程考試已經完全實現了網絡無紙化模式。學生可根據自身的情況進行課后自主學習、自測學習、互相學習或下載資料、上交作業,有助于學生的個性化發展和創新能力的培養。設計出包含驗證型、引導型、擴充型和設計型等多種類型的實驗,在實踐中充分體現學生的自主性,有目的、分層次地培養學生的實踐能力,使學生學會從實驗過程中獲取知識,積累經驗。通過綜合設計,為學生自己構建、發展并完善自己的知識體系創造機會,使學生具備獲取知識和應用知識的能力,激發學生的創新精神,培養學生的團隊精神和協作能力,全面提高學生的實踐能力。
教學實踐證明:學生在課程網站上作業及報告的提交率達到98%以上,問卷調查的訪問量達到了85%以上,優秀設計作業的訪問率達到90%以上,其他資料的訪問率也高于60%。由此可見,立體化教學體系很好的實現了不受時間、地點限制的開放式教學。
五、上機環節的改革與實踐
上機環節是教學活動的重要環節,是對學生進行基本技能訓練、增強學生實踐能力的關鍵環節,是培養學生創新精神的重要手段。本科實踐教學的目的是優化學生的素質結構、能力結構和知識結構,讓其具備獲取知識、應用知識的能力和創新能力。對于《程序設計與計算機語言》課程,以往的實踐教學內容和題目以驗證型和設計型為主。驗證型的題目只要求學生按照書本上的指示,輸入程序,填寫結果即可,學生處于被動接受的地位,學生覺得無趣,毫無創意;設計型的題目對于非計算機專業學生來說,難度太大,學生無從下手。為了全面提高學生的實踐能力和應用能力,使實踐教學能滿足不同層次學生自主學習的需求,我們制定并實施了以下改革措施:
(1)改革上機實踐的教學模式:將以理論教學為主的教學模式改為由理論教學和實踐教學相互聯系、相互交叉、彼此滲透、有機結合、同步發展的教學模式,確立了實踐教學在《程序設計基礎》課程中的重要地位。
(2)設計多種類型的實驗題目:針對學生存在基礎不同、接受能力不同、個性有差異等問題,設計出包含驗證型、引導型、擴充型和設計型共四種類型的實驗,題目盡可能做到覆蓋知識點,切合實際、生動有趣。通過完成不同類型的實驗,有目的、分層次地培養學生的實踐能力,使學生學會從實驗過程中獲取知識,積累經驗。
(3)在實踐中充分體現學生的自主性:實驗課的實驗任務由規定實驗內容和自主實驗內容兩部分組成。學生在完成規定的實驗任務后,可根據自己的興趣和愛好,自主設計一些實驗任務,在教師的指導和幫助下加以完成和實現。通過自主學習和自主設計,能有效地培養學生應用知識的能力和探索精神,極大地激發學生的學習主動性。
(4) 啟發引導學生的創造性,培養學生的團隊協作精神:本課程要求學生以小組(3~5人)為單位進行綜合性程序設計,設計題目主要由學生自己按綜合設計要求來確定,每個小組推選出一名小組長,負責協調程序的開發、與教師和組員的聯系、提交總的設計報告和完整的源程序等工作。在綜合設計過程中,學生處于主導地位,是核心。學習小組的組建,綜合設計題目的選擇或確定,各組員任務的分配與協調,任務完成后的總結與成績的自評等,主要是按學生的意愿來進行。教師只負責宏觀指導和一些條件支持。當學生的選題不符合要求或系統功能設計不合理時,教師會立即指出,并幫助他們修改和完善;當學生調不通程序或程序中有錯誤時,教師會向他們介紹調試方法和查錯方法,教會他們調試程序。對學習好、能力強的優秀學生,教師會注重開擴他們的思路,啟發他們的思維,引導他們去獲取新知識、去探索新問題,激發他們的創新欲望,使他們能完成高水平的綜合設計。通過綜合設計,可充分體現以學生為中心的教學方法,為學生自己構建、發展并完善自己的知識體系創造機會,使學生具備獲取知識和應用知識的能力,激發學生的創新精神,培養學生的團隊精神和協作能力,全面提高學生的實踐能力,從而有效地提高《程序設計與計算機語言》課程的教學質量。
六、考核評價體系的改革
我校C語言程序設計課程的成績分為理論和實踐兩個分數,各2個學分,兩項成績都合格即可獲得該課程的4個學分。其中:
理論課綜合成績(百分制)=平時(百分制)*(50%)+末考(百分制)*50%;
上機實踐綜合成績(百分制)=平時(百分制)*(60%)+綜合設計(百分制)*40%;
理論成績由平時成績和末考成績組成。其中:平時成績由上課考勤、作業提交、階段性實驗報告組成,占總成績的50%;末考指的是期末閉卷無紙化考試,末考側重于基礎知識測試,考核學生對基本概念的掌握。題型包括:判斷題、選擇題、填空題和編程題,判斷題題型重點考察學生對基本知識點的掌握程度,選擇題和填空題重點考察學生對程序的閱讀、理解和分析能力,編程題則重點考察學生編寫程序的能力。
無紙化考試采用的是我們中心自己研發的考試系統,但該系統存在一點缺陷,就是編程題需要人工閱卷。因此,我們于2012年開設了一個試點班,本著提高學生編程能力的目的出發,從平時的教學和最后的考試都試用了哈工大研發的《C語言編程題自動評分系統》。該系統允許學生借助于 C編譯系統調試程序,學生將自己編寫并調試過的程序由客戶端提交給服務器端后,服務器端立即根據學生程序的結構和語義進行評分,并將評分返回給客戶端,使學生在提交程序之后立即看到自己的分數。
上機實踐成績則由平時成績和綜合設計成績構成。其中:平時成績由上機考勤、在線單元測試組成,占總成績的60%;課程最后提交的綜合設計則占到了40%。
該考核評價體系涉及到教學實施過程中的每一個環節,有利于對學生進行科學、客觀的評價,從而避免了一張考卷定乾坤帶來的弊病。
該體系在實施過程中顯現出了其科學性,但是目前存在的問題就是教師的負擔太重。一個學生一學期一般要提交12份報告,每位教師一般帶兩個班,每個班約88位同學,這樣每位教師一個學期只報告一項就要批閱約2000份,工作量太大。現在正在努力尋求更加合理的解決方法。
七、結束語
教學實踐證明,以上改革措施能夠有效解決我校C語言程序設計教學過程中存在的問題。此教學模式下,教學內容符合學生專業特點,能夠滿足理工科專業學生對計算機技術的需求;教學方法行之有效,教學效果有明顯提高;教學實踐方法與措施切實可行,能夠有效促進學生分析問題解決問題能力、實踐能力及團隊合作能力等能力的培養與提高。當然,該模式仍然存在一些不盡如人意的地方,這就需要我們堅持不懈,繼續努力去改進和完善。
項目來源:云南省高校質量工程教改項目“Inquiry learning體系在程序設計中的運用”(云教高[2010]96號)。
[參考文獻]
[1]王剛.CDIO工程教育模式的解讀與思考[J].中國高教研究,2009(5).
[2]謝延紅.C語言程序設計公共課教學模式改革與實踐[J].計算機時代,2010(12).
[3]馬新.《C語言程序設計》課程教學方法與手段的改革與實踐[J].科技信息,2010(33).
篇5
[關鍵詞]C#程序設計 教學改革 項目任務 情境設計
[作者簡介]郭紅艷(1975- ),女,河南新鄉人,河南廣播電視大學,講師,碩士,研究方向為軟件工程和職業教育;谷保平(1973- ),男,河南周口人,河南廣播電視大學,講師,碩士,研究方向為網絡安全和數據挖掘。(河南 鄭州 450046)
[基金項目]本文系2013年度河南省社科聯“河南中小企業信息化發展現狀與對策研究”(項目編號:SKL-2013-3423)、2013年度河南廣播電視大學高職科研項目“‘C#程序設計’課程改革研究”(項目編號:GZYB2013027)階段性研究成果。
[中圖分類號]G642.3 [文獻標識碼]A [文章編號]1004-3985(2013)32-0152-02
一、背景及意義
C#語言是Microsoft公司2000年6月的面向對象程序設計語言,經過十幾年的普及發展,在計算機專業課程中逐漸取代了傳統的C++語言。對于應用程序開發人員而言,C#語言吸收了C++和Java等語言的經驗和教訓,是最成熟的面向對象程序設計語言。該語言以其特有的面向對象、類型安全、組件技術、自動內存管理等優點,越來越受到應用程序開發人員的喜愛。“C#程序設計”作為學院多媒體專業比較核心的基礎職業課程,是學生接觸最早的編程語言。由于高職學生的整體素質下降,加上程序設計的抽象性和C#的面向對象特征,以學科系統知識和理論原理為導向、以知識為目標、以教師為主體、以應試為基礎的教學模式越來越不能適應高職院校的教學要求,如何進行教學改革,激發學生的學習興趣,提高學生的學習主動性,使學生在學習中建立真正的自信心,進而掌握C#程序設計語言并能綜合運用,是高職課程改革中必須面對并解決的關鍵問題。
高等職業教育是“以就業為導向,以應用為宗旨,以能力為本位”的一種高等教育類型,目標是培養實踐能力強、具有良好職業道德,面向生產、建設、管理和服務第一線崗位的高素質技能型人才。高職教育的社會定位是培養技術應用型(職業技術)人才,畢業生應主要從事生產、工藝、建設等工作,最需要的是“做事”的能力、知識應用的能力,還需要具備各項專業技術能力。根據高職教育的培養目標和社會定位,本文主要研究“C#程序設計”課程改革,探索在職業基礎課程如何進行基于工作過程的課程設計和實施。
二、“C#程序設計”課程改革的現狀
基于工作過程的課程設計與開發,強調為學生的職業生涯發展培養其綜合職業能力。課程建設的出發點、落腳點及實施都是工作過程。所謂工作過程是在企業里為完成一件工作任務并獲得工作成果而進行的一個完整的工作程序。因此,在課程的知識體系框架內,通過構建合適的學習情境,以職業活動的工作過程為依據,改造課程的內容和順序。通過項目的實現,使學生獲得直接經驗,實現由知識的認識,到知識的重組,再到知識的遷移,最終實現知識的應用。目前,學院多媒體技術專業已經有了一些基于工作過程的課程改革成功案例,但大都是綜合應用類的課程,對于“C#程序設計”這種基礎語言類課程來說,基于工作過程的課程設計與開發研究尚處起始階段。
在“C#程序設計”教學中,項目化教學已成為目前主要采用的課程模式,但在實踐層面上還存在諸多問題。一是項目來源和內容的簡單化及隨意性。高職課程中的項目應盡可能取材于企業,但由于企業實際項目比較復雜,不符合課程教學要求,很難全面覆蓋課程的全部知識點,實際操作起來比較困難。由于上述因素,在教學中使用的所謂項目基本還是原來例題、習題、案例的簡單改造,或者是學科體系中一些驗證性實驗簡單變換一下拿來用于項目化教學,更有甚者,一些項目化教材的目錄就是原來的章節目錄。通過這種方式開發項目化課程和教材失去了“高職教育中的項目課程應該是一種基于工作任務的項目課程”的根本意義。二是項目間缺乏有效提高學生能力的關聯度。項目的關聯不僅體現著知識的分配和覆蓋,還反映了能力的遷移和提高。目前教學過程中使用的項目大部分是獨立的,沒有相關性和遞進性。學生可以完成工作過程中的孤立項目,卻不能獨立完成整個工作。究其原因,主要是訓練項目間沒有關聯,造成了知識缺失和遺漏,不能覆蓋工作領域需要的全部知識,使得學生在解決實際問題時缺少完整的知識體系支撐。
三、基于工作過程的課程改革實踐
1.確定課程教學目標。“C#程序設計”是多媒體技術專業開設的職業基礎課程,是學生進一步學習專業課程的基礎。經過專業調研,對社會需求進行分析,并結合現有師資條件,確定專業目標崗位是面向中小微企業的Flas設計員和網站開發后臺程序員,課程體系以Flash系列課程為主線,結合網站設計和動態網站開發相關課程。“C#程序設計”是學習Flash編程等課程的基礎課程。根據專業目標崗位,通過與公司開發經理、項目主管、程序設計人員、測試人員交流,共同研究應用程序開發人員的工作流程和任務,通過歸納和提煉,制定就業崗位的典型工作任務,并依據典型工作任務確定課程的學習目標。通過課程學習,使學生掌握面向對象程序設計思想,C#程序開發環境Visual Studio 2008,程序設計的基本步驟和調試方法,并在學習實踐的基礎上了解計算機軟件開發的一般過程,理解計算機解決問題的基本思想,能獨立設計簡單的Windows應用程序,能協作完成比較完整的小型應用程序,能根據實際要求解決較為簡單、具體的問題,并具備觀察分析問題的能力和解決問題的能力。
2.基于工作過程的“C#程序設計”課程設計。根據典型工作任務,“C#程序設計”為第一級學習領域,其學習效果直接影響后續課程。按照高職課程改造的三項重要原則:課程必須突出能力目標,以項目任務為教學內容的主要載體,用項目和任務訓練學生的能力,學生是課程教學的主體。在課程的設計過程中,圍繞能力目標,以工作過程為導向,通過專業教師與行業專家一起對課程進行深入細致系統分析,最終確定“學生信息管理系統”為課程的貫穿綜合訓練項目。在項目實現過程中,利用面向對象的思想,通過設計學生類,實現學生數據的添加、刪除、修改以及查找操作,程序的界面設計等任務,培養學生程序設計能力。考慮到知識的全面覆蓋和反復訓練的需要,還增加了若干實用小程序(如貸款計算器)和趣味小游戲(如掃雷游戲)等作為能力訓練的補充項目。這些項目任務是以應用程序開發過程中必須使用的基礎知識、專業技能、職業素養等要求為依據選擇和設計的。每個訓練任務的實現都按應用程序的開發過程進行設計,項目盡可能地真正實施,并對項目效果進行客觀檢驗。項目的開展遵循從簡單到復雜、從感性到理性、從具體到抽象的原則,通過項目把理論知識與實踐能力進行整合,實現理、實一體化的教學模式。
3.基于工作過程的“C#程序設計”課程實施。在教學過程中,教師在講解每個知識點前,通過學習情境將任務交給學生,教師提出任務設想,由學生討論,并最終確定項目任務的功能。該任務應該是學生現實生活中的遇到的具體問題,而不應該太抽象,這樣就可以讓學生帶著疑問聽課,激發學生學習的興趣。如在學習結構化程序設計語句時,引入中央電視臺綜藝節目的“看商品,猜價格”學習情境,由老師提出任務,要求通過學習,學生能夠自主開發出一個“看商品,猜價格”的游戲小程序。通過討論分析程序實現的過程,引導學生逐步學習并使用程序設計中的選擇結構和循環結構。學生通過信息收集整理、方案設計實施檢驗評價等一系列過程逐步實現項目任務,并在直接感知、動手操作中掌握了理論知識,培養了職業技能。
下面以“學生信息管理系統”項目的實現來說明基于工作過程的課程實施過程:教師通過學習情境引出項目的任務和工作,給學生下發任務,簡要介紹任務中需要學生掌握的新知識點,然后由學生在教師的引導下逐步實現任務。項目實現過程中,學生自由結合,分成3~4人的項目小組,推選出項目組長,小組成員分工協作,共同完成項目。經過項目小組討論,確定系統應實現以下功能:學生信息及成績輸入;存儲每個學生信息及各科成績;計算每個學生的總分和平均分;修改或刪除某個學生的信息;按學號或姓名查詢學生成績;對指定的成績進行排序;自動提示不及格考生參加補考或重修。在任務的實現過程中,把任務按照應用程序開發規律,分解成若干相對獨立小任務,如基本類的設計、UI設計等,并把C#的知識內容進行重組,融入每個具體的任務中,由小組成員協作完成,每個學生都承擔不同的任務。對于學生來說,每人只是完成1~2個模塊的設計,較易實現。通過項目組成員相互交換工作任務,每個成員輪流完成所有任務模塊,反復訓練,從而達到多次“換崗”的要求,使每個學生都能體驗工作全過程。采用這種方式,在進行一輪實訓后小組成員間、小組與小組間可以相互幫助,解決了指導老師難以兼顧所有學生的問題。
在授課形式上,傳統的課堂是教師的獨角戲,老師在上面講,學生在下面機械聽課。到了實訓環節,大部分學生無從下手,上課效果極差。根據課程特點,結合學院實際情況,在實訓室授課教學效果良好。實訓室集計算機、多媒體教學設備為一體,并安裝了電子教室軟件的教學環境。授課過程中,通過投影和屏幕廣播,學生能清晰地看到老師的操作過程,并能根據老師的指導及時進行實際操作。在任務實現的過程中,老師邊講邊讓學生練習,可以隨時提問學生或指定學生演示,并將演示過程進行屏幕廣播,遇到學生共性的問題,老師可以引導學生討論,共同解決問題。這些教學手段的使用,充分地把“教、學、做”融為一體,實現了做中學,邊做邊練能力,邊做邊學知識,強化了學生的實踐動手能力。
在課程考試方式上,應該采取過程性考核與期末考試相結合的考核方法,加強項目考核的比例。根據學生是教學主體的原則,老師在任務的實現過程中的主要作用是提出任務、遇到問題時及時指導學生,而學生是項目的設計實施者。項目完成后,由各個項目組公開展示成果,按組答辯并提交相關文檔和程序,教師和全體學生公開對小組項目進行評估,具體的評分細則包括小組成績(小組成績為教師打分占60分,其他組平均分占30分,小組自評分占10分)和學生個人成績(個人成績=小組成績×(個人組內得分/組內所有人平均得分)),其中個人組內得分由項目組長組織評分,小組成員背靠背相互打分,取平均分。這種考核方式把課程考核落實在學生學習的過程中,突出能力目標,重點考查學生解決問題的能力,動手實踐能力和協作能力,激發了學生的學習興趣,提高了學習主動性和積極性。
四、結束語
基于工作過程的“C#程序設計”教學改革,通過設計合適的學習情境,引導學生動手動腦,提高了學生的學習興趣和學習主動性。通過項目任務訓練,學生對就業崗位要求的專業知識、職業技能和職業素養都有了初步認識,項目的實現過程也使學生的實踐技能得以提升,為今后就業奠定了扎實基礎。
[參考文獻]
[1]姜大源.職業教育學研究新論[M].北京:教育科學出版社,2007.
[2]戴士弘.職業教育課程教學改革[M].北京:清華大學出版社,2007
篇6
【關鍵詞】程序設計課程 教學方案 能力培養
【中圖分類號】G642 【文獻標識碼】A 【文章編號】1006-9682(2012)06-0010-03
程序設計類課程是計算機科學與技術及相關專業的基礎課程,在計算機專業課程體系建設中占有十分重要的地位。目前大部分高校在程序設計教學中多采用傳統的講授法和系統的學習,同時結合一些上機實踐操作來鞏固和熟悉課堂上所講的一些知識點,但對于計算機程序設計課程而言,其特點是更新更快、內容多、課時少。所以,在授課內容處理上既要講授大量的基礎知識、基本概念,而且還要講授具體的應用甚至操作,要讓學生掌握計算機的應用能力;既不能拋棄傳統的、經典的內容,又要介紹當前最新的成果。傳統的系統學習和講授有許多缺點,它偏重知識的灌輸,重理論輕實踐,以教師為中心,以單項講授為主,是式的學習方法,培養出的學生實踐能力不強,不能滿足當前社會對人才的需要。[2~4]教育的目標是培養、提高學生的科學素質,科學素質教育的核心是培養學生的實際動手能力與創新精神。[5]所以,我們提倡把程序設計課程的重點放在學生的能力培養上,即如何從計算機解決實際問題的角度,以解決實際問題的程序設計思想作為切入點進行教學,培養學生具有利用軟件開發環境解決實際問題的能力。
在上述教學理念的指導之下,為了使程序設計課程達到上述的目標,提出以下教學方案,包括課程設置、教學內容與教材建設、教學方法、教學手段等。
一、課程設置
在課程設置上,我們應采用《程序設計基礎C++》+可視化開發環境介紹的方式,并配備集中課程實踐的方式。通過《程序設計基礎C++》的學習,學生可以掌握基本的編程技能,但不能具備利用軟件開發工具進行高級編程的能力,不能滿足社會對計算機專業學生的編程要求,甚至出現大四畢業生連一門開發工具都不掌握的情況。通過這兩門課程的學習,學生能較深入全面地掌握程序設計的思想和技能,并可以使用軟件開發工具進行高級編程。
學習程序設計的目標是利用計算機這個智力工具來分析和解決問題,對現實問題進行建模并編程解決的能力的培養是程序設計類課程的首要任務。知識、能力和素養三者具有辯證關系,一個具有較強能力和良好素養的人,必須掌握豐富的知識。程序設計基礎領域的知識是由程序設計的基本概念和程序設計藝術(技巧)組成的,要掌握這些基本概念和設計藝術,必須立足于理性化的學習和理性化的實踐。能力是技能化的知識,是知識的綜合體現,程序設計能力的培養必須通過動手實踐來培養,同時程序設計需要以扎實的理論基礎、學科方法以及思維方法來指導實踐。為此,程序設計的課程應在加強課堂教學的同時,更注重上機實踐環節,學生通過上課掌握了豐富的知識,通過實踐鍛煉了個人能力,與此同時個人素養也得到提高。[1] 程序設計基礎C++的語法和語義介紹以及開發工具的介紹,可以幫助學生掌握基本的程序設計概念,只有通過兩門課程大量的上機實踐才能幫助學生把所學的理論知識用于解決實際問題,促進學生程序設計能力的提高。以我校為例,程序設計基礎共96學時(60學時課堂教學+36學時上機實驗),在大一開設,課程結束后緊接著是兩周的程序設計課程設計。目前該課程實踐教學環節由兩部分組成:與課堂教學同步安排的實驗上機和集中安排的課程設計。實驗上機注重學生理解和消化課堂講授的知識,偏重于如何編寫功能單一的“小”算法,局限于一個或兩個知識點,運用這些知識解決一些具體的算法設計問題,培養學生的動手能力,并培養良好的程序設計風格。課程設計是軟件設計的綜合訓練,包括問題分析、總體結構設計、用戶界面設計、程序設計基本技能和技巧,多人合作,以至一整套軟件工作規范的訓練和科學作風的培養,對學生的一種全面綜合訓練,是與課堂聽講、自學和練習相輔相成的、必不可少的一個教學環節。但是,課程設計的效果不盡人意,絕大部分同學只是在DOS環境下實現了一個算法,演示效果缺乏美觀,盡管我們一再要求學生自學可視化開發工具如Visual C++,但是只有極少數同學進行這項工作,很多同學反映,看不懂,太難了。所以,根據實際教學經驗,應該開設可視化開發環境介紹這門課,幫助學生掌握一門實際的開發工具。學習完這門課以后,開設課程設計,這樣,在課程設計階段綜合運用所學知識,提高學生用軟件開發環境解決實際問題的能力。
二、教學內容與教材建設
教學內容的組織與實施是程序設計課程改革的重要內容。教學內容在組織上應該與時俱進,不與實際的程序設計發展脫節,比如,STL(Standard Template Library),即標準模板庫,是一個具有工業強度的,高效的C++程序庫。它被容納于C++標準程序庫(C++ Standard Library)中,是ANSI/ISO C++標準中最新的也是極具革命性的一部分。應該作為程序設計課程的必不可少的組成部分,程序設計內容體系結構應分為三個部分:第一部分簡述程序設計的基本概念和思想,以C++語言面向語法和語義為背景,講述一般程序設計語言所具有的基本內容:數據(類型)、操作、程序控制結構、數據控制,這部分內容重點介紹如何進行結構化程序設計及計算機解題的思路和方法,使學生理解算法結構與解題過程,同時掌握程序調試與測試的初步技術。第二部分以C++面向對象機制為背景,介紹面向對象的基本概念:類、對象、消息、方法、封裝、繼承、多態,使學生初步掌握面向對象程序設計開發技術的基本方法,為后繼課程打下基礎。第二部分以標準模板庫和Visual C++開發工具為背景,介紹容器、算法、迭代子、開發環境、MFC、視圖等知識,使學生進一步掌握面向對象的程序設計方法,以及用高效的工具進行軟件開發的能力。
教材的質量直接影響教學的質量,以注重學生的程序設計思想和能力的培養為指導,組織編寫具有特色的、高水平的教材。此外,隨著教育信息化進程的推進,僅提供一本平面紙質教材,已無法滿足高校的教學需求。為了教學的需要,我們給學生提供了立體化的教材,主要包括:主教材、學習指導書(實驗和課程設計指導書)、主要參考書目、電子教案、多媒體課件、習題庫和試題庫等。這些資料,學生都可以通過網站獲得。
三、教學方法
教學方法是程序設計教學的核心,有了合理的課程設置和教學內容,把程序設計的知識傳授給學生,這是決定教學成功與否的關鍵因素。
在目前普遍采用的教育模式中,學生處于一種較單純的接受式學習方式中,學生所學知識,基本上是由教師以定論的形式傳授給學生的,學生不需要進行獨立發現,而只需接受或理解。教師則更多注重知識的傳授,重視教學內容的選擇和講授的技巧和方法的研究,而往往不重視對學生的自主學習能力和創新思維的培養。因此,在對傳統教學方法分析的基礎上,繼續保持傳教法研究的優勢,改變以教師為中心的狀況,注重學生多方面的能力和素質的培養,特別要重視學生思維能力、思維方法和創新能力的培養,應采用探究式教學方法。
1.采用探究式教學培養學生的創新能力
“探究式教學”,是指教學過程在教師的啟發誘導下,以學生自主學習和合作討論為基礎,為學生提供充分自由表達、質疑、探究、討論問題的機會,讓學生通過個人、小組、集體等多種解難釋疑嘗試活動,將所學知識應用于解決實際問題的一種教學形式,[6]探究式教學方法通過“探究—創新”的過程,在培養創新型人才上起了明顯的作用,強調通過在教師引導下的學生自主或合作進行探索而獲得知識,特別適宜于思維能力的鍛煉和自主學習能力和團隊合作精神的培養,它在啟發和培養學生創新能力方面呈現著明顯的優點,受到教育學界的重視并得到了逐步推廣。
2.采用案例教學法提高學生的興趣
案例教學法(Case Method),在1870年由哈佛法學院院長藍德爾(C.C.Langdell)首倡,案例教學法已被大學很多專業及中小學教學廣泛應用。它是培養和提高學習者知識能力的一種教學方法,即將已經發生或將來可能發生的問題作為個案形式讓學習者去分析和研究,并提出各種解決問題的方案,從而提高學習者解決實際問題能力的一種教學方法。案例教學法是一種啟發學生研究實際問題,注重學生智力開發及能力培養的現代教學方法,它有著傳統教學方法所不具備的特殊功能。和傳統的“滿堂灌”、“注入式”教學法相比,案例教學側重實踐和案例的講解分析,啟迪學生積極思維,強調在教學過程中學生主動參與,引導學生動用科學的理論知識,去分析、歸納、演繹、推理、總結,從而達到鞏固知識的目的。案例教學的實施一般包括三個步驟,案例的選擇,作為教師可以選擇一些經典案例課題,如程序設計課程中的“學生管理系統”案例,接下來是案例教學的開展。案例教學的一般流程是教師介紹案例背景給出任務目標,學生開展現場討論提出初步意見,之后就是在教師的指導下不斷討論與實踐直至最終完成任務目標。案例教學的最后一步是評價,對學生提交的案例實施報告和案例解決方案根據案例任務目標進行評價,這里案例的評價通常由教師與學生共同完成,讓學生介入評價更有利于加強學生對案例的認識提高案例教學效果。古語云:“授人以魚,三餐之需;授人以漁,終生之用。”在案例選擇及實施階段強調學生的自學能力是非常有必要的。那么如何做到這點呢?首先逐步削弱學生對老師的依賴,即老師不再是學生學習知識的唯一途徑,告知學生如何提高各種途徑獲得解決問題的方法是一種很有效的手段。在課堂中經常告知學生獲取知識的三種途徑:互聯網、書籍或者編程軟件的幫助文檔、他人。其次是對學生獨立解決的任何問題給予鼓勵及肯定,這必將進一步促進其獨立解決問題的興趣。最后是在案例中刻意制造一些未學習過的問題,促使學生必須通過各種途徑找到解決方法。[7~8]
3.采用任務驅動式教學法增強學生的綜合能力
任務驅動教學法是一種建立在建構主義教學理論基礎上的教學法。所謂任務驅動教學法,就是讓學生在一個典型的信息處理“任務”的驅動下,展開教學活動,引導學生由簡到繁、由易到難、循序漸進地完成一系列“任務”,從而得到清晰的思路、方法和知識的脈絡,在完成“任務”的過程中,培養分析問題、解決問題以及用計算機處理信息的能力,為學生創造良好的學習環境,讓學生通過努力,能順利完成每個具體的任務,掌握學習內容,獲得成功的體驗。任務驅動式教學在形式上是:提出任務師生共同分析完成任務的方法和步驟適當講解或自學或協作學習完成任務實踐歸納和研討。比如我們在上運算符重載時,在沒進入主題以前,先給學生布置一個任務,實現兩個復數的運算,可能學生會用以前的知識完成任務,也有的學生可能會有比較超前的想法,然后通過研討的方式對問題進行分析并提出解決方案,最終完成任務,學生在完成任務的同時既學會了運用以前的知識點分析解決問題,又學會了運算符重載這一知識點。采用任務驅動教學法進行教學,教師的教和學生的學都是圍繞如何完成一個具體的任務進行。教師教學思路清晰,學生學習目的明確,學習變成了學生的主動行為,可以充分調動學生的主觀能動性,在用的需求下學,學以致用,更容易掌握學習內容,增強學生的綜合能力。[1、7]
四、教學手段
在教學手段上,采用多媒體(黑板輔助)+實驗室環境+網絡課堂的方式。多媒體教學已經是一種非常重要的教學手段,但單純使用多媒體進行教學,老師的即興發揮以及與學生的交互將受到限制,所以,我們采用黑板進行輔助的方式。對于識記性的內容可以通過多媒體展示,對于理解性的內容,為了理清學生的思路則通過黑板給學生講解。此外,對于一些例題,我們采用在集成開發環境下進行現場調試和制作例題的多媒體動態演示課件等方法來加深學生的理解。當前,程序設計的課堂教學一般在教室里采用“計算機+大屏幕投影”的方式,實驗課在實驗室環境下人手一機練習。該模式缺點是理論與實踐相脫節、以教師為中心、束縛學生的思維,最終直接影響到教學效果。[9]在實驗室環境下,老師講課時,鎖住所有的機器,使學生機和教師機保持同步,在學生練習時,再給機器解鎖,讓學生自由練習,通過這種方式,邊講邊練,可以通過實際動手編程加深對新知識的理解。為了使所有的教學資源能被有效地利用,要建立一個網絡輔助教學環境,即建立程序設計網絡課堂,將現實教學中的課堂教授、作業、答疑、測試、課程設計、討論等全部在網絡課堂中予以實現,提供課程的教學大綱、教學日歷、參考資料等。這樣,為學生提供了一個很好的學習氛圍。學生可以進入程序設計網絡課堂進行在線學習、在線討論和答疑、在線測試等。
五、結束語
總之,程序設計是計算機專業的核心課程,合理的課程內容設置配以科學的教學方法,充分利用科技發展帶來的教學方式的革新,定能促進學生能力的提高,但是,還有很多方面有待進一步摸索。
參考文獻
1 楊靜、王浩、胡學鋼、方寶富、張晶.程序設計課程教學改革探討[J].吉林大學學報(信息科學版),2005(S2)
2詹自勝.案例教學法在計算機程序設計教學中探索與實踐. 省略/lunwen/2008/200811/270935.shtml
3 方寶富、王浩、胡學鋼.機器人足球賽程序設計教學研究——大學生創新能力培養實踐第七屆全國計算機系主任論壇論文集[C].北京:清華大學出版社,2004
4 何炎祥、伍春香.現代教學理論指導下的“編譯原理”教學綜合改革[J].計算機教育,2005(3)
5 劉傳平.《C++語言程序設計》課程教學改革的探討[J].中國科技信息,2005(11)
6 戴挺、童蔚蘋.探究式教學法在計算機程序設計教學中的應用[J].電氣電子教學學報,2005(4)
7 崔艷莉、張敏、王重英.淺談“案例+任務”驅動教學法在VB程序設計語言教學中的應用[J].中國農業銀行武漢培訓學院學報,2009(1)
篇7
關鍵詞:C語言;C++語言;程序設計
高校的C族語言教學總是按照先學C語言,再學C++的順序進行,這種學習順序隨著C++標準的不斷升級改革后變得越來越不適用。早期的C++屬于多面性語言,即可以像C一樣進行模塊化的面向過程的編程設計,也可以像Java一樣進行抽象的面向對象程序設計。那時的教學者考慮的是學生應當從較為便于理解的面向過程的編程思路入門學習C語言編程,然后在熟練了面向過程的編程方式后再從C語言延伸到C++,轉而學習面向對象的程序設計。可是隨著面向對象的程序設計在應用市場上占領了絕對的主導地位后,再讓學生從面向過程著手就等于是浪費學習時間。加上C++和C兩門語言的初級語法思想是完全一致的,開設兩門課程浪費了學時,也耽誤后續更重要的核心課程的學習。
1程序設計語言C與C++的比較
1.1C與C++的共性。一般簡要的介紹是把C++當作C的加強版,這種認知當然是錯誤的,C++語言的設計者在設計之初為了保障自家語言會受到開發者的關注,所以兼容了的C的語法,這就自然使得C++可以使用C的編程方式進行程序設計,所以也導致了很多人對這兩種語言的關系產生了錯誤的認知。同時由于C語言本身設定上的優越性,所以C++在進行自我定義的時候也沿用了C語言很多優良的性質。基礎數據結構一致,C與C++的基礎數據類型都是以變量和常量作為基本屬性劃分,類型上有字符型、整型、長整型、單精度浮點型和雙精度浮點型,不過C++額外增設了布爾型。復合型數據結構上也都同時具有數組、多維數組、結構體、枚舉類型和共同體,但是C++增設了字符串類型以替代C語言中的字符數組,功能上更加強大,也更加便捷。在語法方面,聲明、賦值、循環、選擇的結構和實現都是一致的,并且C++雖然提倡使用類和對象的概念去設計程序結構,可也同樣支持函數體結構的程序設計結構。并且C語言中函數的賦值都是間接調用,在使用C語言函數時總是會在指針上出現各種紕漏,但是C++的函數體可以使用引用參數,這就使得C++的函數體比之C的更加好用。總的說來就是,C++標準下用戶可以完全使用C語法進行編程而不會出現任何BUG,同時C++自身的優越設定和標準使得其設計能力比C要強大數倍,是目前市場上大型程序開發的首選語言。
1.2C與C++的不同。上一節介紹了C++和C的基礎語法上的區別,這些區別都是C++的作者在C的基礎之上修訂而來的結果,是為了讓C++標準下得面向過程的程序設計比之單純的C更加便捷方便。但是C++的誕生伊始,就是一門向上使用面對對象的程序設計思想的高級編程語言。它的封裝性、繼承性、多態性和對象唯一性才是C++成為強大高級語言的重要原因,這些特性都是C語言不可能擁有的。所以C能夠實現的程序,C++能夠實現并且實現的更為方便,C不能實現的程序,C++同樣可以實現。
1.3C++的特色。承接上一節,C++和C之間最大的不同,也是C++自身最值得夸耀的特性,就是面向對象程序設計思想。這種思想使得C++語言設計出來的程序,變成了類和對象的有機結合,這種結合的代碼比之面向過程的函數體架構的代碼更加易讀,共同開發起來容易上手,后續的維護者也不用費更多的腦筋去理解前人的代碼含義。而類和對象的設計思路,使得開發者合作時相互之間的工作變的更為獨立,雙方之間只需要知道對方所寫的類實現的功能和包含的數據就行。這種特性我們稱之為良好的封裝性,開發者之間不需要去知道對方的代碼是如何實現,甚至在此之上還可以保證良好的代碼健壯性。因為類的引入,更先進的作用域機制也被引入進來,類的書寫者往往會將自己類中的數據進行嚴格的作用域限定,防止其他合作者擅自去修改和使用自己類中的數據。合作者想要知道類中的數據或者使用類中的數據,只能通過類的書寫者定義的帶有檢查機制的方法才行。這樣會使得很多人合作開發的大型項目的穩定性和安全性比之用C語言開發時再上一個臺階。同時類的概念中還有一個先進的設定就是繼承性,并且由這個繼承性還延伸出了接口的概念。有了可以繼承的接口和類,那么開發者在對程序進行迭代的瀑布開發流程時,就可以很好的使用自己曾經開發的源代碼,或者借用其他項目的源代碼,因為只要學會科學的使用繼承機制,就不僅僅是節約程序員的代碼時間,也減少了程序員在回顧曾經代碼時發生的錯誤和歧義。而與繼承機制配合使用的是多態性,曾經C語言中定義的函數,其靈活度非常差,特定的函數只能滿足特定程序定義的需求,想要重用曾經的源代碼是幾乎不可能的事情。我們剛才提到的繼承機制使得C++開發者復用源代碼成為了一種習慣,但是復用時不可避免的修改問題又擺到了臺面上,多態機制順應而生了。多態機制使得類不僅可以繼承其他類,將父類的數據和方法都在本類體中自如的使用,同時還可以用本類中新的定義和代碼去覆蓋父類中的數據定義和方法。這就讓程序員變的更加自由,想用父類的數據和方法時就去繼承,但是不想全部使用時就加上多態機制去覆蓋。這樣代碼之間的重復利用率變得十分客觀,節約了大量的開發時間和開發成本。
2程序設計語言C與C++開設建議
C++課程的內容應當如下安排:第一部分,教授C++的基礎語法,讓學生可以編寫出在DOS命令行下輸入輸出的程序,了解編程的基本概念和思想。并且這時應當同時進行C和C++的雙向語法教學,為日后學生進入高年級后的方向選擇打下基礎。此部分使用半個學期最為適宜,并且此時并不灌輸學生何為面向對象何為面向過程,而主在讓學生使用基礎語法進行最基本的編程探索。第二部分,在學生有了基礎編程知識后,將數據結構的內容放入課程中去,用半學期的時間教授學生用C++實現的各類常見數據結構。并且結合實際開發項目中的代碼作為閱讀補充,讓學生明白數據結構的知識對程序開發的意義,然后將簡化后的小項目作為課堂的主要內容,用實際的代碼讓學生去理解那些枯燥的數學定理和概念。而且在實現數據結構的過程中,必然會面對一些更為高級的C++語法和概念。總的來說,用大一上的一個學期讓學生對于基礎編程有了良好的認知和深入,是十分值得和有效的。第三部分,在學生有了數據結構的基礎和C++的基本語法掌握后,應當面對一些實際的開發項目和問題。當然實際的問題還是需要老師進行簡化,其主要目的是讓學生掌握C++的高級特性和實際軟件開發的過程與思路,并且想學生傳授基礎的算法。這一部分較為困難,應當使用一個學期讓學生慢慢的掌握和熟悉。第四部分,在學生算是對C++語言和數據結構與算法都有了基礎的入門后,再進行課堂教學意義就不大了,應當再大二上學期開設一門課程設計實驗課,讓學生完成幾個難度從小到大的項目,循序漸進的掌握基本的實際開發技巧和思維。
參考文獻
[1]羅莉.計算機程序設計的多應用型開發與實現[J].產業與科技論壇,2015(14):54-55.
[2]鄧薇,何锫,錢俊彥,等.深度優先的多基因表達式程序設計[J].模式識別與人工智能,2013(9):819-828.
篇8
關鍵詞: C程序設計 Ch平臺 交互式 課堂實效性
高職教育重在職業能力的培養。目前,高職電子、機電、電信類大專業,都不同程度地要求學生具備一定的程序設計能力。而程序設計能力是培養職業能力的核心能力之一。C語言作為計算機編程入門教學中應用最廣泛的語言之一,已成為各個高職院校的首選。但是C語言本身的特點決定了它并不是最好的教學語言。加之高職層次的學生由于生源的特點所決定,他們英語和數學的基礎普通很差,邏輯思維能力有所欠缺。所以在高職這個層面上C程序設計這塊教學始終是塊硬骨頭。
Ch平臺是程輝教授在美國加州大學戴維斯分校從事近20年C語言程序設計教學和科研實踐中,針對C語言的眾多難點,積累開發的一種跨平臺嵌入式C/C++程序解釋器。Ch平臺拋棄了傳統的抽象教學方式,由面向底層內核的交互式命令外殼和教學專用且界面友好的集成開發環境兩大模塊構成,從而形成了一種新的C程序設計教學平臺和新的教學模式。中國科學院計算技術研究所倪光南院士指出,Ch平臺是一個適合于中國計算機程序設計教學的優秀平臺。本文就Ch平臺在高職C程序設計課的教學過程中所呈現出的魅力一一描述。
一、Ch平臺開發環境比較適合初學者。
如果一個開發環境非常的龐大和復雜,這會讓初學者望而卻步。Ch平臺具有以下特點。
1.體積比較小,方便安裝。它是所有C語言教學平臺中體積最小的。例如,最新版的Ch不到80MB,而VisualC++有30多GB。并且安裝后可以馬上使用,不用重啟和配置任何文件。
2.操作過程簡單明了。新建項目時過程簡單,學生易于上手。在緩沖區里同時打開多達20個文件,編寫程序時非常方便;有助于提高編程和調試效率。如下圖是ChIDE的集成環境。
3.有專門的使用幫助文件,方便初學者查找,有利于初學者入手。
4.界面美觀,具有人性化的設計。清晰明了的圖示降低了初學者學習的難度,有全面的快捷鍵說明。各個功能塊的作用明顯。
5.調試功能全面。調試時控制臺始終保持在最前,不必在代碼界面和調試控制臺之間頻繁切換。擁有一個典型的C語言開發環境所需要的所有運行和調試功能:可以設置多個斷點;單步調試時的提示清晰明確;單擊錯誤提示就可以直接跳轉到有錯誤的那一行;無需編譯鏈接就可以解釋代碼;在調試過程中可以更改變量的值,可以觀測任何含有變量的表達式的值,甚至可以在任何時候調用函數。在學習控制結構時,學生可以改變變量的值,觀察每次不同的分支選擇結果,以及在什么時候會進入無限循環。對一個寫好的程序,也可以通過這個方式測試其穩定性。
如下圖所示是ChIDE的調試工具欄。
7.強大的Ch命令外殼(Command Shell)。C語言也可以實現所見即所得,在交互式命令外殼的窗口下,可以清楚地看得到,體會得到C當中語句的執行過程。如下圖所示,從中可以明明白白地看到交互式的命令外殼的優勢。
說明:定義兩個變量a,b,分別賦值9,7,然后計算a+b,立刻得到結果是16,接著再計算a*2,結果也立刻得到是18,這就是Ch平臺的交互式的命令外殼功能的體現。Ch平臺的這些優勢決定它可以大大降低初學者學習計算機程序設計的門檻。
二、Ch平臺的交互操作可以提高課堂教學的實效性,激發學生的學習積極性。
教師可以使用這個平臺,在課堂上開展直觀的程序交互式演示教學,幫助學生形象化地理解C語言指針、結構體、數組、編程邏輯、編程調試等學習難點,從而提高教學的實用性,激發學生的學習積極性。學生可以快捷地體驗C語言的不同特征,無需進行冗長的編譯/鏈接/運行/調試的循環操作。例如,在講解變量所占字節數這個知識點時,可以利用Ch平臺的交互功能,使得講授變得簡單易懂,形象生動。如下圖所示。
Inta,b定義兩個整型變量,然后用Sizeof()求出變量所占字節數,馬上輸出結果是4,Char c定義一個字符型變量,同樣用Sizeof()求出變量所占字節數為1。利用這樣的交互操作,學生會一目了然,馬上明白整型和字符型變量在內存中所占字節數。課堂的實效性顯然能大大地提高。學生也不會覺得程序設計有多難學,積極性自然而然會大大提高。
三、Ch平臺可以大大提高女生學習計算機編程的興趣。
歷年來的程序設計課堂上總是有這樣一種怪現象,學習的時候男學生忙著走神,女生刻苦認真;使用的時候,女生六神無主,男生才開始學習。期末考試的成績女同學的合格率高于男同學,而優秀率卻低于男同學,所以如何提高女學生的學習興趣一直是個瓶頸。而利用Ch平臺可以很好地突破這個瓶頸。Ch平臺較之于其他的教學平臺有更多的優勢,具有交互功能,大大地降低了理解C語言的抽象性。它的知識點可以得到形象、具體的顯示。現在我們通過一個簡單的循環語句來說明。
#include
void main()
{int i,sum=0;
for (i=1;i
sum=sum+i;
printf(“%d”,sum);
}
女生的抽象理解能力和邏輯思維能力普遍差于男生,但女生的細心程度和英語基礎普遍好于男生。通過Ch平臺的調試工具欄,可以把一些知識點的講解難度降低,變得簡單易懂。
四、利用Ch平臺授課可以在突破重點和難點時做到事半功倍。
例如,在講解for循環語句時,利用此平臺,發揮它的交互解釋作用,可以讓學生一目了然,清清楚楚地知道循環的次數,每一次循環都做了哪幾條語句,以及循環時程序的跳轉,等等。通過對比講解(和利用其他平臺對比,在時間的花費上對比,在教學效果上對比)得出利用Ch平臺授課可以在突破重點和難點時做到事半功倍。
總之,Ch平臺一經在我校引入,程序設計課的教學效果大大提高,特別值得一提的是,在近幾年的浙江省ACM程序設計大賽中,我校學生成績不俗,最好的一次獲得了高職組金獎和最佳組織獎。這和我們在教學中引入Ch平臺夯實基礎密不可分。
參考文獻:
[1]吳文虎.程序設計基礎.北京:清華大學出版社,2004.
[2]譚浩強.C程序設計教程.北京:清清華大學出版社,2006.
[3]孫紹榮.教育信息理論.上海:上海教育出版社,2006.
[4]譚浩強.C程序設計試題匯編.北京:清華大學出版社,2006.
[5]何光明.C語言實用培訓教程.北京:人民郵電出版社,2002.
[6]黃逵中.C語言實例教程.北京:中國電力出版社,2004.
[7]美國加州大學網站主頁.QCOP.edu/.
[8]Ch網站主頁.省略/.
篇9
【關鍵詞】單片機;延時程序
接觸單片機有一年之久,從基礎知識了解開始,到流水燈、數碼管動靜態顯示,鍵盤到液晶等幾個基本的模塊,編了一些基本的小程序,發現其中最常用的延時程序用C語言編寫也是千變萬化的,不同的程序,不同的用途,精確度不一樣,延時程序也需要有改變。下面就對我所知道的延時的方法談下自己的見解。
總的延時方法通常有兩種:一種為軟件延時,通常采用循環的形式進行;另外一種為硬件延時,用到定時器/計數器,這種方法可以提高CPU的工作效率,并且能相對精確延時。
一、軟件延時與時間計算
軟件延時方式精確度不是很高,但是基本時間可以控制,并且移植性很好。
2.需要多種延時時間。還是8個燈做成流水燈,但是要求第一個燈亮1S,第2個燈亮2S,第三個燈亮3S……最后一個燈亮8S。
3.時間的確定。很多朋友看完我上面講個兩種延時方法可能會說,這樣是方便了,但是上面的時間如何確定呢?你的時間確定圖怎么來的?方法很簡單,利用keil強大的功能實現。比如1S延時
另外還可以用示波器測試時間,需要外接示波器,用proteus畫完連接圖,接上示波器,再調用寫好程序的hex,就可以很清楚的看到延時時間。下面為延時20ms圖。
同時還可以用反匯編工具計算延時時間,匯編時間是很精確的,便于計算的。有興趣的朋友也可以自己上網搜索這兩種方法。對于初學的朋友,我建議還是用這種keil本身的工具比較方便。
二、用定時器/計數器實現精確定時
在很多情況下,需要我們精確定時,那么我們就不能用前面講的調用小的延時子程序delay()來完成。所以就要考慮用精確的定時方式:定時器/計數器。
以上我介紹了對于寫延時程序自己的一些膚淺的見解,在以后的學習中還需要進一步提高。粗略延時用基本的delay(),精確延時用定時/計數器。
篇10
關鍵詞:程序設計;教學方法;教學手段
中圖分類號:G642 文獻標識碼:B
“C語言程序設計”作為一門公共基礎課程,是高校理工科非計算機專業學生的一門必修課程。通過該課程的學習,學生不僅要掌握C程序設計語言的知識,更重要的是要學會分析問題的方法,提高解決基本問題的能力和程序語言的應用能力,并為今后的繼續學習打下良好的基礎。
由于“C語言程序設計”這門課程的實踐性較強,必須通過大量的編程訓練,才能逐步理解和掌握程序設計的思想和方法,因此,怎樣激發學生自主學習的興趣,培養學生的實際編程能力是這門課教學改革應解決的問題。
1教材適合教師的“教”和學生的“學”
教學有兩個方面,一個是教師的“教”,另一個是學生的“學”。“教”是為了學生能獨立地去“學”,就像葉圣陶先生說的那樣:教,是為了最后達到不需要教。教師不僅要研究怎么教,更重要的是要研究學生怎么學。教師備課一定是要“背”學生的,首先要看學生的基礎是什么?學生要達到的目標是什么?其評價的標準也是以學生能夠掌握為評判標準。
其實,學生都想學好“C語言程序設計”這門課,也想掌握一門真本領到社會上去競爭。但很多學生一遇到問題就退縮了,不愿意費太大的力氣,而這門課恰恰又是需要通過大量練習才能入門的一門課。
感謝由譚浩強教授編著的《C 程序設計》這本書,為教師進行該課程的教學改革提供了一個很好的平臺。該書不僅將復雜問題簡單化了,而且可使教師根據不同程度的學生對內容進行取舍而不影響整個程序設計的思想和方法。該書符合學生的任知規律,將學習的每一個臺階變“矮”,并能夠使人理性認識C語言。
我們在教學中考慮到學生學習的難度,分解講解,從而使學生克服了畏難心理,覺得C語言并不難學。有些課上沒有講到的內容,學生也可利用教材自學。同時,根據該教材,我們制作了適合學生自學的助學系統。考慮到學生基礎的差異,我們結合教材,編寫了《C語言程序設計上機指導》,從而給學生提供了一個自主學習的平臺,受到學生們的好評。
2培養學生的抽象思維能力
在進行“C語言程序設計”的教學改革中,我們思考了這樣的問題:如果教師只是鉆研教材,并讓學生理解、記住其結果,那么,學生就會失去獨立鉆研和獲取新知識的能力;每個學習“C語言程序設計”的學生將來未必都從事計算機編程;因此,我們把砥礪學生的抽象思維能力作為了改革“C語言程序設計”教學的方法之一。
首先,我們根據“C語言程序設計”這門課的特點,研究了譚浩強教授編著的《C程序設計》這本書是怎樣引導學生完成抽象的認知過程并逐步提升的;怎樣通過簡單的舉例和進一步的講解,使學生理解抽象的數據類型、函數以及指針在構造抽象程序中的意義;并將研究成果應用在教學中,從而使學生學會算法抽象的基本方法,掌握程序抽象的思考方法。
實踐中,我們采用程序設計和語言講解并行的方法。首先提出用程序要解決的一個問題,找出解決問題的方法,講解要引入的新的語法知識,給出算法并解釋,最后編寫出完整的程序,再上機實踐。
3激發學生的學習興趣,培養學生解決實際問題的能力
教學與科研在研究目的等很多方面一樣,其本質都是為了實際應用,并且科研的有些方法也同樣適用于教學研究,因此,如何強調實踐教學都不為過,并把培養學生解決實際問題的能力作為“C語言程序設計”教學改革追求的主要目標,這也與譚浩強教授編著的《C程序設計》這本書的初衷相一致。至于采用哪種方法好,筆者認為,主要看是否適合學生。在這個問題上,只有適合不適合,而沒有好壞之分。
對于所要解決的問題,首先引導學生仔細進行分析、對各功能模塊進行抽象描述、畫出解決方案的流程圖、討論并修改算法、最后再進行編程、調試,并得出正確結論,這是培養學生創造性地解決實際問題能力的必由之路。我們在教授“C語言程序設計”這門課開始時,就把本學期要做一個實用作品、期末要進行上機編程考試、作品及上機考試占期末成績的比例、要求寫實驗報告等信息告知給學生,并在期中將所要做的內容確定下來。有的是老師指定內容,有的是讓學生自己選題。有的教師采取一對一輔導,有的分成小組讓學生討論,教師在適當的時候給予指導。對于做得比較好的同學及時給予表揚,并讓學生將思路講給教師聽;同時要求寫出詳細的注釋,并在小組或班上講解。這樣做,可使部分學生的編程能力明顯提高,并帶動了很多同學積極參與討論,激發了同學們編程的熱情,課上和課下都有學生在討論編程的事,班里出現了良好的學習編程的氛圍。
但是,我們清楚地認識到:要普遍提高學生的實際編程能力目前還存在著很大的困難。教師在有限的學時內不僅要完成授課計劃,還要利用很多的課余時間完成類似于課程設計的作品輔導,教師在肩負科研和教學雙重任務,所教學生多的情況下,也只是盡力而為。因此,在實際實施的過程中,采取“先讓少部分人富起來”的做法,教師對部分編程愛好者多進行輔導,讓好一點的學生去幫助其他同學。雖然取得了一定的效果,但距離我們良好的愿望還相差很遠,需要我們在今后的教學中不斷地探索,找出普遍提高學生實際編程能力更好的方法。
4 “C語言程序設計”的教學改革
C++是從C語言發展演變而來的一種面向對象的程序設計語言,其主要特點表現在全面兼容C,并且支持面向對象的方法。目前,C++程序設計語言已經成為應用最廣泛的面向對象的程序設計語言之一,全國計算機等級考試(二級)也已把它作為主要考查的語種之一。很多學生考慮到就業,也希望我們開設這門課。鑒于上述等原因,我們從教學改革的角度出發,在我校部分班級開設C++程序設計課程,先在部分班級試點,待積累一定的經驗,時機成熟時再向全院推進。
“程序設計方法是不可選擇或不可抗拒的時代潮流,只能在應用中領悟和熟悉,算法則需要比較深入的理論知識,必須經過嚴格的科學訓練。” 我們在教學實踐中,本著一個原則:不論是C程序設計還是C++程序設計,均把培養學生的實際編程能力作為教學目標。對于非計算機專業的在校大學生來說,學習C++程序設計是為了讓學生了解面向對象程序設計方法,能夠利用C++編寫較大并相對簡單的程序,為以后進一步的學習和應用打下良好的基礎。
通過對所教學生進行實事求是的分析和估計,我們選用了譚浩強教授編著的《C ++程序設計》作為教材。之所以選用這本教材,主要還是想用容易理解的方法講清楚有關的基本概念和基本方法。該教材前7章的內容是C++從C語言繼承來的部分。由于教師都是初上該門課,感到完成整個教材,課時有些緊張,如果再加上實用作品設計,學生負擔會太重。因此,我們在教學上著力于使學生對C++的全貌和作用有基本的認識,而不是注重語法中的細節,同時引導學生閱讀實用程序,指導學生在學完課程后,編寫完成一個較大的應用程序。
5結束語
“C語言程序設計”的教學改革是一項長期的任務,無論怎樣改,都要從學生的實際出發,發揮教師的主導作用,調動學生學習的積極性,使學生有收獲。教學千古事,得失寸心知。在今后的教學實踐中我們還要不斷地完善教學內容和方法,做到既有“法”而又無“定法”,真正提高教學質量。
參考文獻: