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语言程序设计”的教学改革是一项长期的任务,无论怎样改,都要从学生的实际出发,发挥教师的主导作用,调动学生学习的积极性,使学生有收获。教学千古事,得失寸心知。在今后的教学实践中我们还要不断地完善教学内容和方法,做到既有“法”而又无“定法”,真正提高教学质量。
参考文献: