c语言程序范文10篇(全文)

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

#include

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

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(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=k+1);

printf("%d,%d\n",1

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=k+1);

printf("%d,%d\n",1

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&&x+yc)&&((x+y)

逻辑运算的值

逻辑运算的值也为“真”和“假”两种,用“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

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

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

if语句

用if语句可以构成分支结构。它根据给定的条件进行判断,以决定执行某个分支程序段。c语言的if语句有三种基本形式。

1.第一种形式为基本形式if(表达式)语句;其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。其过程可表示为下图

voidmain(){

inta,b,max;

printf("\ninputtwonumbers:");

scanf("%d%d",&a,&b);

max=a;

if(max

printf("max=%d",max);

}

输入两个整数,输出其中的大数。

scanf("%d%d",&a,&b);

max=a;

if(max

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

elseprintf("A=B\n");

}

比较两个数的大小关系。

printf("pleaseinputA,B:");

scanf("%d%d",&a,&b);

if(a!=b)

if(a>b)printf("A>B\n");

elseprintf("A

elseprintf("A=B\n");

本例中用了if语句的嵌套结构。采用嵌套结构实质上是为了进行多分支选择,例3.16实际上有三种选择即A>B、A

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

}

条件运算符和条件表达式

如果在条件语句中,只执行单个的赋值语句时,常可使用条件表达式来实现。不但使程序简洁,也提高了运行效率。

条件运算符为?和:,它是一个三目运算符,即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为:

表达式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

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

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语句的表达式后面则必须加分号。

www.zjmangrove.org-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。

3.在do和while之间的循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。

www.zjmangrove.org-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

if(n%i==0)break;

if(i>=n)printf("\t%d",n);

}

}intn,i;

for(n=2;n<=100;n++){

for(i=2;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

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;

continue语句continue;

c语言程序范文第2篇

关键词:考试系统;多媒体技术;数据源;连接数据库

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)03-10854-03

1 课题研究的意义和目的

1.1研究意义

现在,多媒体技术日趋成熟,多媒体系统以其能输出精彩的图形和图像、美妙的声音、动感的画面赢得了用户和社会各界广泛的关注和应用。如果把按传统考试方式同现代化的多媒体技术相结合,并且用多媒体著作工具及其它多媒体技术,编制一套符合高校考试需求的系统及其配套的多媒体教学软件,利用多媒体技术生动、直观、形象展示信息的特点,辅助教师授课和学生进行考试,尤其对部分有限制性的实验环节,可利用活动视频技术进行展示,这将会解决一系列目前存在的问题。总之,该课题是在计算机辅助教学及考试上进行的一次积极有意义的尝试,为其他实践性较强的课程进行多媒体辅助教学开辟一条新的路子,具有一定的理论和现实意义。

1.2目的

传统的考试手段主要依靠有纸试卷,几乎没有可重用性。本课题将实现:用计算机辅助考试系统,把多媒体生动、直观的显示出来,使学生不再将考试视为一种枯燥无味的东西,提高了考试效果,使学生在一种愉悦的心情中进行考试,把枯燥的重复变为充满乐趣、具有启发性的考试过程,使学生能比较全面的学习知识,掌握技能,达到素质教育的要求。

2 系统流程图设计

2.1初始化流程设计

在使用Authorware创建任何多媒体项目的时候,都应该先设置当前项目文件的窗口大小,将其设置为“800×600”,然后选择“演示居中屏幕”,同时取消对“显示标题栏”和“显示菜单栏”复选框的选择。

2.2主界面的设计

本界面采用了Photoshop7.0图形图像处理软件来绘制。为了避免界面的单调和呆板,用蒙版和滤镜技术加以美化。该界面把Photoshop中的图层技术、图层蒙版技术、文字效果及滤镜等功能完美的结合了起来。并且在底部设置了一个Flas,增加视觉效果。

2.3背景音乐的交互控制

该多媒体教学以MIDI作为背景音乐,背景音乐的交互控制包括背景音乐的随机选曲播放、停止等功能,另外当该教学程序处于活动状态时,能够随时调整背景音乐和讲解声音的大小及比例,让使用者在一种轻松悦耳的环境中考试(调出WINDOWS的音量控制实现),还能够暂停背景音乐,当再次进入活动状态时则能重新播放背景音乐。

为了充分考虑用户计算机的不同配置情况,首先利用BUDAPI.U32的BASOUNDCARD函数判断用户机器是否已经安装了声卡,如果已经安装则执行背景音乐播放,否则不允许播放任何背景音乐操作.程序如下:

IF BASOUNDCARD() THEN

MIDI:=1

TEST(MIDI,MIDILOOP (FILELOCATION^”MUSIC\\MUSIC-”^RANDOM(1,5,1)^”.MID”),STOPMIDI())

END IF

软件中的背景音乐交互控制是通过交互响应来实现的。在程序执行过程中,用户始终可以通过按钮控制背景音乐的播放与暂停。在计算图标“播放音乐”后添加一交互图标并命名为“音乐控制”,并在交互图标右边添加三个计算分支。设置“STOP/PLAY”分支为按钮响应交互,其功能是实现对背景音乐的控制。由于在整个程序执行过程中它都是有效的,因此须设置其为永久按钮,即选择“PERPETUAL”属性选项,同时设置“ACTIVE IF”条件为:BASOUNDCARD(),即检测到用户没有安装声卡的情况下该按钮及响应分支无效。

2.4内容的导航设计

该多媒体教学涉及内容繁多,不仅包括文本、图片、声音和动画,而且还有其它多媒体工具与Authorware 配合,同时,还把视频文件导入,以增加实用性。为使用户操作简单方便,设计了合理的教学内容导航。主文件与各章节之间的导航设计根据结构规划中的该章节内容的栏目划分,在流程设计中为这些栏目设计了导航,如图1为主程序内容导航的设计流程图。

这样的流程设计使整个主程序结构清晰,可读性强。由于该文件结构是主-分结构,即主文件调用各章节模块文件的方式,因此在主文件的章节内容中实际存放的是一个起链接桥梁作用的调用脚本,而具体的考试试题题型内容则放在各章节的模块文件内。

2.5各模块的内容流程设计

图中的考试模式、练习模式、教学模式及退出系统这四部分主要程序流程图如下图2、图3、图4、图5所示。

第五部分的原理演示则是通过热区交互以及调入用VC6.0制作的演示内容的库文件,抽象的工作原理形象化,具体化。在打包的过程中采用了分步打包,首先对每部分进行打包。通过主文件调用其它各部分,这样避免了主文件过大,影响运行速度。

3 以完成单选题为例来看具体实现过程

从单选题的数据库题库中随机抽取相应题数的问题;每一题只能选择一个答案;用户可以按次序做答,可跳过不答,在回答过程中,可以随时返回已做过的题目进行修改;交卷后会给出完成情况可以查看每题的回答情况.最后回到选题主界面,并把学生所做的答案成绩保存到数据库中。

当用户在主界面中,选择了“考试模式”后,系统就会进入到登录界面系统会提示输入用户名和密码,当输入后,点击“确定”后,系统将会进入到题型选择界面。在提示框中输入用户名和密码,我们点击“确定”后,就会进入到正式的单选题型界面中,选择“单选题”单击。

C语言程序设计考试系统的选择题从数据库中取出选择题,在一个界面上显示。利用三个热区域交互按钮“上一题”“下一题,”“完成”,按钮和四个热区域设置计算图标用来记录学生所选择的答案。在学生选择“完成”后,弹出学生做题的情况界面,然后回到选题主界面,并把学生所做的答案成绩保存到数据库中。

3.1“未命名”用来擦除以前的图像

(1) 打开“未命名”的属性,进入“未命名”的属性窗口。

(2)在“属性窗口”中单击擦除标签在设置过渡效果进行设置。

(3)单击“确定”按钮

3.2 设置“单选界面”插入一个图像

(1)双击“单选界面”图标进入显示图标窗口

(2)单击绘图工具箱 图标进行绘制一个和窗口矩形一样大的矩形

(3)设置矩形的颜色为“绿色”

(4)单击显示图标窗口的关闭按钮,关闭保存对“单选界面”的设置。

3.3 设置交互“进入”

(1)在交互图标的右边拖放一个群组“单选”。

(2)设置单选的热区为“按钮”。

(3)单击确定后,双击“选择”。

3.3.1“未命名”用来擦除上次运行的图形

3.3.2 在“打开数据库”的输入如下源程序:

hint0:="您的数据库没有连接上......"

--显示连接数据库的信息

title:="数据库连接...."

ODBChandle:=ODBCOpen(WindowHandle,"","database","","")

--得到数据源

getrecord:="select count(sequence) from erigister"

--得到记录的个数

record:=ODBCExecute(ODBChandle,getrecord)

if ODBChandle=0 then--测试连接数据库是否连接成功

MessageBox(WindowHandle,hint0,title,17)

end if

ODBCClose(ODBChandle)

ODBChandle:=ODBCOpen(WindowHandle,"","database","","")

if ODBChandle=0 then

MessageBox(WindowHandle,hint0,title,17)

end if

sqlstring1:="select ssdb from erigister where sequence="^record^"" -从表中选择单选库表题

ssdatabase:=ODBCExecute(ODBChandle,sqlstring1)

getrecord:="select count(sequence) from "^ssdatabase^""

record:=ODBCExecute(ODBChandle,getrecord)

--ssdb数据库的记录个数,以便产生随机数

sssum:=0

number1:=1

sui:=[]

sui[1]:=Random(1,record,1)

--下面程序用来产生一个随机数不能出现相同的题目

i:=2

repeat while i

flag:=0

repeat while flag=0

sui[i]:=Random(1,record,1)

flag1:=0

repeat with p:=1 to i-1

if sui[i]=sui[p] then flag1:=1

end repeat

if flag1=0 then flag:=1

end repeat

i:=i+1

end repeat

3.3.3 在“做选择的背景”显示图标中设计单选题的界面如上图5.4

3.3.4 在“数据库的操作”中输入如下代码:在这里,我们就要实现对数据库的随机读取和跟踪答案的长短来选择界面

x:=0

ran:=sui[number1]

result:=""

record1:=Number(record)

record:=record1--得到记录的个数

sqlstring1:="select topic from "^ssdatabase^" where sequence="^ran^""分别得到选择题各项

sqlstring2:="select a from "^ssdatabase^" where sequence="^ran^""

sqlstring3:="select b from "^ssdatabase^" where sequence="^ran^""

sqlstring4:="select c from "^ssdatabase^" where sequence="^ran^""

sqlstring5:="select d from "^ssdatabase^" where sequence="^ran^""

sqlstring6:="select result from "^ssdatabase^" where sequence="^ran^""

get1:=ODBCExecute(ODBChandle,sqlstring1)

--get1得到选择题目内容

get2:=ODBCExecute(ODBChandle,sqlstring2)

--get2得到选择项A内容

get3:=ODBCExecute(ODBChandle,sqlstring3)

--get3得到选择项B内容

get4:=ODBCExecute(ODBChandle,sqlstring4)

--get4得到选择项C内容

get5:=ODBCExecute(ODBChandle,sqlstring5)

--get5得到选择项D内容

get6:=ODBCExecute(ODBChandle,sqlstring6)

--get6得到选择题的答案

inputa:=1 --用来设置热区域的激活条件

3.3.5空“操作”用来设置跳转标志

3.3.6在交互图标右边拖入四个热区域

在计算图标中从左到右的四个计算图标中输入: result:="A" result:="b" result:="c" result:="d"在交互属性中设置激活条件为inputa=1: ,鼠标指针设置为标准鼠标指针,其它的为默认设置.其中result变量用来记录用户所选的答案.

3.3.7拖一个交互图标“未命名”在它的右边拖两个计算图标为“上一题”和“下一题”,再拖一个群组“完成”放在“下一题”右边 ,设置热区为按钮。在“上一题”的激活条件中输入number1>1,鼠标指针设置为:标准的鼠标指针。在“下一题”的激活条件中输入:number1

4 结束语

根据对教师上课时课堂练习的分析,开发出该考试系统,主要是能够方便课堂练习,同时还可用于期中期末测试,该系统主要是针对《C语言程序设计》课程来设计的。对该系统做简单修改,即可用于其它课程。

参考文献:

[1]王嘉宁,朱隽.Photoshop7.0中文版新概念百例[M].中国水利水电出版社,2004,4.

[2]龚祥国.主编.Photoshop图像处理实用教程[M].科学出版社,2002,2.

[3]王龙,金海.主编.Flash MX实战入门新概念[M].中国水利水电出版社,2005,5.

[4]李恒.Authorware 6.0多媒体实例大制作》[M] 冶金工业出版社,2002,4.

[5]袁海东.Authorware 7.0教程[M].电子工业出版社,2004,9.

[6]郝蕾蕾.Authorware课件制作[M].中国水利水电出版社,2001,7.

c语言程序范文第3篇

关键词:Java;JNT;C++;DLL

在现今的软件开发领域中,Java以其跨平台的优势得到大量的应用,其代码可以一次编译多处执行。但这种特性给Java带来了一定的局限性,幸好Java提供了完备的C/C++语言接口,这样我们可以利用C语言的强大功能实现Java难以实现的功能,在一定程序上消除Java的局限性和低效率。

JNI是Java Native Interface的英文缩写,中文翻译为本地调用,自从Java 1.1开始就成为了Java标准的一部分。

C/C++是系统级的编程语言,可以用来开发任何和系统相关的程序和类库, 但是Java本身编写底层的应用比较难实现,使用JNI可以调用现有的本地库,极大地灵活了Java的开发。

C/C++的效率是目前最好的语言,可以使用C/C++来实现一些实时性非常高的部分。 C/C++和Java本身都是非常流行的编程语言,一些大型软件中经常使用语言之间的混合编程。

一、创建DLL文件

使用某一种C/C++开发工具创建Dll文件,实现某一功能,供JAVA调用,例如本文在此使用Visual studio 2005创建一个名为testdll的动态库文件。

二、使用JNI

JNI是Java Native Interface的缩写,中文为JAVA本地调用。它允许Java代码和其他语言写的代码进行交互。

www.zjmangrove.org类

在JAVA程序中,首先需要在类中声明所调用的库名称,如下:

static {

System.loadLibrary(“testdll”); //加载动态库,testdll为DLL文件名称

}

还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:

public native static void set(int i);

public native static int get();

然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。

例如程序www.zjmangrove.org,内容为:

public class testdll { static { System.loadLibrary(“testdll”); } public native static int get(); public native static void set(int i); public static void main(String[] args) { testdll test = new testdll(); test.set(10); System.out.println(test.get()); } }

用javac www.zjmangrove.org编译它,会生成testdll.class。

再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。

2.C/C++

创建C/C++项目需要增加的头文件有jni.h、jni_md.h这两个文件是JNI中必须的;还有就是增加testdll.h。

对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。

接上例子。我们先看一下testdll.h文件的内容:

#include #ifndef _Included_testdll #define _Included_testdll #ifdef __cplusplus extern "C" { #endif JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv * jclass); JNIEXPORT void JNICALL Java_testdll_set (JNIEnv * jclass jint); #ifdef __cplusplus } #endif #endif

在具体实现的时候,我们只关心两个函数原型 JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv * jclass);和 JNIEXPORT void JNICALL Java_testdll_set (JNIEnv * jclass jint);这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。

下面我们用testdll.cpp文件具体实现这两个函数:#include "testdll.h" int i = 0; JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv * jclass) { return i; } JNIEXPORT void JNICALL Java_testdll_set (JNIEnv * jclass jint j) { i = j+5; }

编译连接成库文件,这里就是testdll.dll。把testdll.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。

三、总结

使用JNI可以在JAVA中调用其它语言编写的代码,在一定程度上消除JAVA的局限性和低效率。

参考文献:

[1]高晶,王建华.JNI技术在嵌入式软件开发中的应用[J].哈尔滨师范大学自然科学学报,2007,(06) .

c语言程序范文第4篇

关键词:C语言;程序设计;学习方法;学习兴趣

中图分类号:TP312.1-4

《C语言程序设计》是计算机专业的一门核心专业基础课程,是专升本、考研和等级水平考试的必考科目,也是学生学习中感到比较吃力的一门课。那么,如何学习《C语言程序设计》这门课程呢?现根据自己多年在教学中的体会,谈一些粗浅的认识。

1 为什么要学习《C语言程序设计》

《C语言程序设计》是用C语言来编写程序的,每个程序员在他们的编程生涯中都应该学习C语言,因为它有太多难以忽视的好处了。除了它会给你提供更多的工作机会之外,C语言还会教给你更多的关于计算机的知识。它的好处如下:

1.1 C语言是一种计算机程序设计语言

它既具有高级语言的特点,又具有汇编语言的特点,既可以用来编写系统软件,又可以用来编写应用软件。它不仅具有绘图能力强,还具备很强的数据处理能力,因此也适于编写三维,二维图形和动画。

1.2 C语言具有功能强大、使用灵活、丰富的数据类型和运算符、结构化的控制语句、目标代码运行效率高、适用范围大、可移植性好等优点。

1.3 C语言是各大操作系统的基础,Unix、Linux、Windows其内核都清一色是C语言开发的,(某些地方是和汇编语言混合开发的),还有各种语言的编译器,包括java虚拟机,各种嵌入式设备,如手机、PDA等都是C语言开发的。

1.4 C语言是基础,如果你学习过C语言,你就能学习现在任何的高级编程语言

因为所有的高级语言都是以C语言为基础的(像JAVA,C++,C#等等)。C语言学好了,将来想学其他的语言,就比较好入门了。

2 如何学习《C语言程序设计》

2.1 克服畏难心理,充满自信的学习《C语言程序设计》

大多数学生一看到《C语言程序设计》课程的教材,就有畏难的情绪,觉得C语言难学,学不会,因为他们对计算机语言不了解,另外有些英语差的同学,看到计算机编程是用英语编写的,就未学先弃了。其实学习语言并没有他们想象的那么难,英语差也对学习计算机语言影响不大,比如学C语言,真正要记的关键字不多,语法也不复杂,只要大家不带着畏难的心理,充满自信,一定能学好的。

2.2 要明确《C语言程序设计》的学习目的

通过《C语言程序设计》课程的学习,掌握C语言基本知识,掌握程序设计的基本方法并逐步形成正确的程序设计思想,能够熟练运用基本程序结构解决简单问题,理解模块化程序设计原则并能熟练使用C语言进行程序设计,具备调试程序的能力,为后继课程及其他程序设计课程的学习和应用打下基础。

2.3 要明白《C语言程序设计》与一般的计算机操作课程有所不同

《C语言程序设计》是计算机的一门软件编程课程,是用C语言来编写程序的,它具有难度性、抽象性、连续性和逻辑严密性。如果你第一次课来听了,第二次课没来,第三次课很可能就听不懂了。比如,第一次课讲的是数字1,2,3,4……,第二次课讲的是运算符号+,-,*,/,第三次课老师让你算1+2=?,如果你前两次课都来听了,那么你就能算出它的结果,否则你就算不出它的结果。因此,如果要想学好《C语言程序设计》,必须坚持每次课都来,如果那天确实不能来,就应在家自学,不懂的地方应及时向老师请教,一定不能落课。

2.4 要整体把握《C语言程序设计》

C语言是一种通用的程序设计语言,在开发系统软件和应用软件中得到广泛的应用,已成为当今计算机世界最流行的语言之一。C语言是一个整体,各个方面是有机联系的,要从总体上把握它,不要把它割裂成互不关联的部件。它包括C语言概述、数据类型(整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等)、运算符和表达式、流程控制语句、函数、数组、字符与字符串、指针、结构体、文件等。通过《C语言程序设计》的学习,掌握程序设计的基本概念、基本思想、基本方法和基本技能,进而学会利用C语言解决实际问题,培养计算机程序设计的能力和素质,以及思维方法,为以后学习其它计算机程序语言和后续的专业课程打下基础。

简单的C程序是由主函数和函数体两大部分组成。它的基本框架如下:

main()

{

}

其中main表示“主函数”。每一个C程序都必须有一个main函数,而且只能有一个main函数,它表示程序从这里开始执行。由花括号“{ }”括起的部分是函数体。其中函数体又包括定义变量、变量赋值、函数调用、输出打印等。

例:一个简单的求和程序

main() /*主函数*/

{

int a,b,sum; /*定义变量*/

a=123;b=456; /*变量赋值*/

sum=a+b; /*求两数之和*/

printf(“sum is %d\n”,sum); /*输出和值*/

}

这是一个简单的求和程序。/*...*/表示注释部分,只给人看的,对编译和运行不起作用。第3行是声明部分,定义变量a、b、sum,指定a、b、sum为整型(int)变量。第4行是两个赋值语句,使a和b的值分别为123和456。第5行使sum的值为a+b,第6行中“%d”是输入输出的“格式字符串”,用来指定输入输出时的数据类型和格式,“%d”表示“以十进制整数形式输出”。Printf函数中括弧内最右端sum是要输出的变量,现在它的值为579(即123+456之值)。因此输出一行信息为:

sum is 579

从这个例子可以看出,想要把《C语言程序设计》这门课学好,不仅要知道《C语言程序设计》的基本框架,还要学好函数体中的内容(变量类型、定义变量、变量赋值、输入输出格式字符串、输入输出函数格式、调用函数等)。另外还要学好C语言的运算符、运算顺序 、四种程序结构(顺序结构、分支结构、循环结构、模块化程序结构 )、掌握一些简单的算法等。

2.5 熟练C程序的上机步骤

在编好一个C源程序后,如何上机运行呢?要经过编辑、编译、连接和运行四个步骤。

(1)编辑源文件。在编辑(Edit)状态下输入或修改源程序。

(2)编译源程序。选择“C编译”菜单并选择“编译到OBJ”,进行编译,得到一个后缀为.obj的目标程序。

(3)然后再选择菜单“L连接EXE文件”,进行连接操作,可得到一个后缀为.exe的可执行文件。

(4) 运行程序。在“RUN”菜单中选择“R运行程序”项,或直接按Ctr+F9键,系统就会运行已编译好的可执行目标文件。此时,TC集成环境窗口消失,屏幕上显示出程序运行的结果。如果程序需要输入数据,则应在此时,从键盘输入所需数据,然后程序会接着执行,输出结果。

2.6 要加强编程训练

《C语言程序设计》是实践性非常强的课程,要求学员要理论联系实际,在掌握C语言的基本语法和基本知识后,重点应放在提高编程能力的训练上。根据学生学习的认知特点,我认为主要应从以下几个方面进行强化训练:

(1)吃透课本例子。每学完一次新课,让学生对课本例子先分析任务、再仔细阅读程序,然后按书上的源代码敲出来,编译执行输出结果,如果结果跟书上一致就算完成,如果不一致,就要仔细找原因。再后不看书自己编写代码与课本对照,找出自己的不足,然后改进。最后在此例的基础上自己加以改造,举一反三,变为其它的例子,如此反复练习,不仅培养了学生动脑思考的习惯,而且养成了遇事三思、认真、周密的作风。

(2)精选上机题目,要求调试通过。每章找出一个或两个综合性的具有代表性的应用题目,如编写一个程序,计算一个整数的名位数字之和;用选择法对数组中10个整数,按由小到大的顺序进行排序等,要求用C语言编写可执行的源程序,上机调试。这样不仅锻炼了学生解决实际问题的能力,更重要的是激发了学生学习课程的兴趣,抽象变具体 ,理论变实践,对这门课有了更深的认识。

(3)阅读填空法。找一些经典程序,配上必要的说明,适当去掉语句或表达式,让学生通过阅读填补空白,训练学生的程序设计能力。例编写一个程序,输入月份号,输出月的英文月名,还有求和、排序、报号等。

(4)准备一个经验本,记下C语言重要的语法和知识点,还有自己出错的解决方法及老师讲解的其他同学出现的常见错误,抽空常翻看,逐步积累经验,加深印象,使以后避免。

(5)带着作业去上机。每次理论课结束后,老师都会给学生布置一些作业(如习题)让学生做,那么学生一定要认认真真的把作业完成好,先把程序编写在作业本上,上机时再把这些程序敲到计算机上,进行修改、调试、运行,最后输出结果。如果学生不带作业去上机,第一次老师警告下次一定带作业上机,如果第二次还没带作业,不准学生进机房,让学生到教室把作业做完后再到机房上机调试。有人说学生可以直接在机器上编写程序,固然没错,但对于初学者来说,如果在机器上边思考边编写,也就是说想一句编一句,再想一句再编一句,这样太浪费时间,一节课说不定连一个程序都编不好,所以老师一定要求学生在课下把程序编好,上机只需把程序敲出来进行修改、调试、运行,这样能节约大量的时间,学生上机时间本身都是有限的。

上述方法在教学实践中证明是行之有效的,学生对问题分析、程序设计的自觉性和能动性得到提高,动手能力加强,对后继课如《C++》、《面向对象程序设计》等,学习起来倍感轻松,较好地完成了该门课程的学习目标。总之,实践出真知,多学、多练、多思、多交流,勤奋好学才能学成。

参考文献:

[1]严桂兰.C语言程序设计与应用教程[M].福建:厦门大学出版社,2001.

[2]谭浩强.C程序设计(第三版)[M].北京:清华大学出版社,2005.

[3]陈东.计算机多媒体教学改革的一些尝试[J].福建师范大学学报(自然版),2004,20(3):98.

[4]王兰.学好《C程序设计》的几点建议[J].科技信息,2007(9).

作者简介:薛玉莹(1976.07-),女,四川攀枝花人,研究生,计算机讲师,主要研究方向:计算机及经济学。

c语言程序范文第5篇

【关键词】C语言程序设计;教学内容;教学手段;教学方法;教学改革

C语言是一种广泛使用的程序设计语言,它具有高级语言的特性与直接操纵计算机硬件的能力。因而,在当前许多高校中,C语言被列为程序设计课程的首选语言,成为了计算机专业的必修课程,也越来越多地被非计算机专业所采用[3]。然而在《C语言程序设计》课程的教学中,由于C语言概念比较复杂,规则繁多,同时在实践中又具有灵活多变运用,所以教师对于课程教学难易度的把握有困难,学生对于课程的学习与实践亦感到迷惑,甚至产生一些畏难心理[2]。作为实践性很强的C语言程序设计课程,它的学习有自身特点:光听只看是不够的,还必须加以练习,通过大量的编程训练,反复夯实语言的概念基础,并在实践中培养程序设计的基本能力,逐步理解和掌握程序设计的思维与方法。所以,C语言程序设计课程的教学重点是培养学生的实践编程能力,以程序设计为中心来组织课程内容。在笔者多年的教学实践中,针对《C语言程序设计》课程的难点与特点,在教学内容、教学手段、教学方法等方面做出了一些改革与尝试,收到了较好的教学效果。

1、教学内容的改革[1][3]

1.1课堂教学内容的改革

目前关于C语言的教材很多,内容主要包括数据类型、表达式、分支、循环、函数、数组、指针、结构体、文件的概念和应用以及指针和各种构造类型的混合运用、基本算法等。很多教材侧重于语言本身的理论体系介绍,而对于编程方面的介绍却相对较少,这样的安排虽然突出了知识结构的认识,但是也弱化了学生的程序设计能力和语言应用能力,而这些能力对于学生学好这门课程又恰恰是至关重要的。笔者在教学中,尝试以程序设计为向导,辅以编程应用,将案例和问题引入课堂,使学生尽快建立起程序设计的思想和方法,然后在这些框架上穿插讲解相关的语言知识。在前几次课中,简单介绍相关的背景知识和利用编程求解问题的过程,然后引入实例,在对问题的解决过程中介绍顺序、分支和循环3种控制结构以及函数的使用,使学生对C语言有一个大概的了解。然后深入讲解程序设计的思想和方法,并演示应用C语言解决问题。通过实例程序的引入来介绍语言知识,在每节课中介绍一些程序设计的方法、技巧以及编程中的常见错误,并设置练习题,鼓励学生多思考、多练习,提高综合能力,每章课程结束后, 设置综合性的习题,包括本章的综合以及从第一章到本章的综合,主要是程序设计题。学生要想学会并应用C语言进行程序设计,除了对程序设计语言了解外,更重要的是在实践中领会并掌握程序设计的基本思想和方法,要求学生从开始学习C语言起就试着编写程序,先模仿例题中的程序,然后尝试加以改写,循序渐进,最后能独立地编写程序来解决比较复杂的问题。

1.2实验教学内容的改革

C语言的教学特别需要重视实践环节,包括编程和上机实验。针对不同水平的学生,笔者在教学班中抓两头,学得好的学生鼓励给大程序,难一点的实验,学得一般的学生做基础性的题目。在保留基础性实验的同时,增加一些实用性强的、难度略大的实验,并组织学生讨论得出算法流程,然后上机编程调试。

按照实验指导书上的内容,每个实验内容以编程题为主,学生可以先模仿课堂案例操作,然后再做实验题,通过“模仿-改写-编写”三步曲的上机实践过程,在循序渐进的引导中逐步熟悉编程环境,理解和掌握程序设计的思想、方法和技巧,以及程序调试方法[4]。

实验题分为必做题和选做题,在实验过程中针对学生有问题的程序统一讲解,然后再选一个有错误的程序让学生自己找错误(开始一个月内的时间,让学生学会找到语法错误)。这样学生能力会提高很快,在后期发现逻辑错误,也会自己先找出,然后再求助老师。实验题量一次课(2节课)至少留6-8题实验。

2、教学手段的改革

运用多媒体技术辅助教学,是当前课堂上很流行的一种教学手段,因为这种方式包含的信息量大、丰富,学生学习起来感觉生动,提高了学习的兴趣,同时也能够优化教学过程。但是多媒体辅助教学的弊端也越来越被了解,比如不恰当的使用会分散学生注意力,甚至影响学生对主要问题的理解。所以将多媒体教学引入C语言程序设计课程教学过程中,必须要考虑到两者的特点与优势,取长补短,将传统教学与多媒体教学进行有机的结合。比如:对于C语言的概念性知识点如数据类型、变量类型、运算符、程序结构等,可以采用多媒体教学,通过课件的制作,既满足了课堂上演示的需要,也简化了传统教学大量板书的缺点。而对于程序的编写或案例的分析,就需要发挥传统教学的优势,更灵活的进行板书讲解、课堂讨论,使问题在师生之间的良性互动中得以解决。因此,教学中将各种手段如PPT、板书、现场编程并运行等多种手段有机结合,使得课堂教学达到最优化,如果条件允许尽量现场编程(或事先准备好的程序),学生可以学习教师的思路考虑问题,收到更好的效果,同时也能加快教学进度。

另外,利用网络资源的便利性,将大纲、电子教案、课件、练习题等放在网络上,方便学生随时查用学习,同时通过飞信、QQ、Email等网络交流手段与学生进行答疑、讨论等互动交流,从而扩展了课堂教学的空间。

赏识学生,注重学习兴趣的培养。在教学过程中,教师应运用多种信息技术适时的辅导,创设丰富的情境,发挥最佳效应,运用多种教学手段激发学生主动学习获取知识的热情。

3、教学方法的改革

c语言程序范文第6篇

关键词:C语言程序设计;计算思维;抽象;自动化

美国卡内基・梅隆大学的周以真教授在2006年系统地提出了计算思维的概念[1]:计算思维指的是运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等一系列思维活动。其后,陈国良院士和李廉教授归纳出三种典型的科学思维,即以观察和归纳为特征的实证思维,以推理和演绎为特征的逻辑思维,以抽象和自动化为特征的计算思维[2-3]。计算思维是计算机类课程的主要思维方式。

有关计算思维在程序设计类课程中的研究,已经引起很多学者的兴趣[4-6]。这些研究虽然从案例设计和项目过程等角度做了有益探索,但却忽略了对计算思维本质的讨论。C语言程序设计课程中,我们采用李廉教授的观点,即计算思维的本质是抽象和自动化。抽象指的是使用符号系统对问题进行精确而严格的描述;自动化指的是对这些符号系统施加一定操作并按照某种结构自动地执行。

一、C语言程序中的计算思维本质之一:抽象

有些C语言程序设计课程教学的一开始就提倡使用案例教学。这虽然能够使得学生可以迅速进入实际编程环节并建立直观感性认识,但案例教学由于往往出现“程序就是编程工具”的工具论现象,导致出现“只知其然,而不知其所以然”的学习后果,不利于学生的后续发展。

对于C语言程序来说,抽象指的是使用符号系统对求解问题进行精确而严格的描述,抽象的过程就是对实际系统建模的过程。实际上,程序是用来描述现实生活中某个实际存在的或不存在的系统。程序就是对系统的抽象。系统之所以存在,是因为系统具有一些关键特征和核心功能。程序中对系统特征进行抽象的就是操作对象,对系统功能进行抽象的就是函数。系统功能往往有多个且存在着复杂的调用关系。例如,求一个函数定积分的功能必然涉及求函数在某一个点的取值功能,如果该函数比较复杂且含有正弦、余弦和正切等三角函数,还需要继续调用求这些三角函数值的功能,形成多级调用;有时函数执行过程中还需要调用本身,形成递归调用。

C语言程序中的操作对象分为变量和常量。常量是对系统中的取值不变的特征进行抽象,如圆的圆周率;而变量是对系统中取值可以改变的特征进行抽象,如圆的半径。不管是哪类特征,都会有一个取值范围以及所允许的操作。例如,对于课程成绩,其取值范围一般是从0~100,而允许对该特征进行的操作可以是加法和减法等算术操作以及大于和小于等比较运算;而对于课程名字这一特征,就不能进行加法和减法这样的算术操作。C语言程序中用来对特征的取值范围及允许的操作进行抽象的概念是数据类型。C语言程序中的抽象模块如表1所示。

现实生活中,经常需要描述多个相同数据类型的一个系统特征,如所有同学的高等数学课程的成绩,可以使用一维数组来进行描述;而描述多个不同数据类型的多个系统特征,如学生的姓名、学生的身高和学生的年龄等,可以使用结构体来进行描述;如果要描述多个相同数据类型的多个系统特征,如全班所有同学的高等数学和大学英语课程的成绩,则可以使用二维数组来进行描述。

表1 C语言程序中的抽象模块

C语言程序中的元素 现实生活中的元素

程序 系统

函数 系统功能

函数调用 功能调用

数据类型 常量 系统特征

变量

一维数组 多个相同类型的一个系统特征

多维数组 多个相同类型的多个系统特征

结构体 多个不同类型的多个系统特征

链表或结构体数组 多个不同类型的多个系统特征的集合

二、C语言程序中的计算思维本质之二:自动化

计算思维的另一个本质是自动化。自动化指的是对符号系统建模的各种元素施加一些操作,并按照某种顺序的或非顺序的结构自动地执行。对于C语言程序来说,自动化体现为函数内部的语句在EIP寄存器加法操作支持下顺序自动地执行以及函数之间的调用在内存堆栈区支持下自动地进行跳转。EIP是32位机的指令指针寄存器,用来存放下一条要执行的指令的地址。EIP寄存器中增加值的大小需要根据实际存储指令的大小来确定。

对于C语言程序来说,自动化过程中执行的对象是语句。不同类型的语句,执行的结果和效用是不一样的。例如,一个变量定义语句“int a”的执行结果是在内存中分配4个字节的空间,一个返回语句“return t”的执行结果是将程序的执行流程返回到主调函数中。这些语句的组合构成一个个函数,程序的执行就是在某个函数之中顺序自动地执行以及在多个函数之间来回自动地跳转。

既然程序的执行过程是在某个函数之中顺序自动地执行以及在多个函数之间来回自动地跳转,这种自动执行需要有相应的计算机软件和硬件基础。支持程序自动执行的软件基础是操作系统,支持程序自动执行的硬件基础是计算机硬件结构,即冯・诺依曼原理的程序存储思想。当用户点击执行按钮后,程序被提交给操作系统来执行,可以不需要人为干预。此后,程序在操作系统中以进程的方式出现。操作系统协调内存、中央处理器和外存等硬件资源执行该进程。

函数中的语句之所以能够一个接着一个顺序地执行,主要依赖于EIP寄存器的加法操作。当一条指令执行完成之后,EIP寄存器在原有内容的基础上再加上当前指令所占存储空间大小,其内容便是下一条指令的地址。如此进行下去,就可以一个一个顺序地执行函数中的语句。

程序控制之所以能够在函数之间进行跳转,主要依赖于操作系统管理的内存堆栈区。内存堆栈区是满足“后进先出”操作约束的存储区。当操作系统开始执行用户提交的C语言程序时,首先开始从main函数执行,main函数的相关局部变量被压入栈中;当执行到被调函数时,被调函数的相关局部变量再次被压入栈中,程序控制转移到被调函数,且操作只能对当前栈顶进行,而此时栈顶存储的就是被调函数的相关局部变量;而当被调函数执行结束时,被调函数的相关局部变量从栈中退出,程序控制转移到main函数继续执行,此时栈顶存储的是main函数的相关局部变量;当main函数执行结束时,main函数的局部变量从栈中退出,整个程序执行结束。下列程序执行时的堆栈变化过程示意如图1所示。

#include "stdio.h"

double s(double r)

{ return r*r; }

int main()

{ double r;

double area;

r=2.0;

area= s(r);

printf("area=%f",area);

return 0;

}

图1 函数调用过程的堆栈变化

自动化过程实际反映了C语言程序解决实际问题的算法流程。算法是解决某一问题的执行步骤。一般而言,使用C语言进行编程之前,需要进行相应的算法设计,即构思解决实际问题的思路和步骤。一旦这些步骤变成C语言程序语句并形成一个完整的程序,就可以提交给操作系统自动地执行这些步骤,这正是计算机解决问题的高效率的体现。

三、以计算思维为导向的C语言程序设计课程教学

1.教学内容

针对计算思维的抽象和自动化两大本质特征,C语言程序设计课程的教学内容需要在原有的基础上特别强调一些针对性的观点。例如,C语言中的各种数据类型和数据结构可以完成实际系统中各种不同元素的抽象,一个函数之中的顺序语句自动执行的基础是EIP寄存器的加法操作,多个函数之间的来回自动跳转的基础是内存堆栈区的支持等。具体强调的观点如表2所示。

表2 教学内容中需要强调的观点

C语言程序设计

课程的内容 强调的观点

C语言概述 程序是对系统的抽象

抽象过程就是C语言的建模过程

自动化过程反映C语言的算法流程

数据类型、表达式和语句 操作对象是对系统特征的抽象

语句是系统自动化执行的基本对象

控制结构 控制结构是问题求解步骤的抽象

函数中顺序语句自动执行的基础是EIP寄存器的加法操作

数组 一维数组是对多个相同类型的一个系统特征的抽象,多维数组是对多个相同类型的多个系统特征的抽象

函数 函数是对系统功能的抽象

函数调用是功能调用的抽象

函数之间的来回自动跳转的基础是内存堆栈区的支持

结构体 结构体是对多个不同类型的多个系统特征的抽象

指针 链表是多个不同类型的多个系统特征集合的抽象

2.教学方式

计算思维的本质是抽象和自动化。C语言程

序设计课程一般都是面向大一新生,理解抽象和自动化进而培养计算思维,对于还处在计算机学习起点的学生来说是比较困难的。

对于C语言程序来说,抽象过程实际就是运用C语言中各种符号对所描述系统的建模过程,培养抽象的计算思维方式就是培养使用C语言描述实际系统的思维过程。因此,可以通过启发式教学方式引导学生思考如何使用C语言中的符号来描述系统。可以提出这样的一系列问题:C语言中如何描述一个人的身高?如何综合描述一个人的姓名、年龄和籍贯等?如何描述一个班中所有学生的高等数学成绩?如何描述各路公共汽车站的网状信息?通过启发学生对这些问题的思考,让学生所学的C语言中的各种符号不再“虚幻”,让学生真正理解这些符号实际是一种建模元素,每种符号有着其特别的抽象描述能力。

对于C语言程序来说,理解自动化过程必须借助一些形象化的手段。例如,借助于Visual C++ 6.0平台的单步调试功能,可以形象地演示上述C语言程序的自动化过程,如表3所示。

表3 C语言程序执行过程中EIP和ESP寄存器内容的变化

断点 EIP寄存器内容 ESP寄存器内容 当前栈顶函数

r=2.0;语句 00401068 0013FF24 main函数

area=s(r);语句 00401076 0013FF24 main函数

return r*r;语句 00401020 0013FF18 s函数

printf("area=%f",area);语句 00401089 0013FF24 main函数

从表3可以看出,随着EIP寄存器内容的增加,main函数中的语句顺序自动执行,即从语句“r=2.0”到语句“area=s(r)”再到语句“printf("area=%f",area)”。ESP寄存器是另一个重要的寄存器,它始终存放栈顶的地址。随着main函数对s函数的调用开始,栈顶工作函数由main函数变化为s函数;当s函数调用结束后,栈顶工作函数又由s函数回到main函数。

3.考核内容

针对C语言程序设计课程的计算思维培养要求,考核方式上必须从以考查语言的语法知识为主转变为以考查学生的系统建模能力和算法设计能力为主。

系统建模能力的考查主要针对计算思维的抽象特征。例如,可以给出各种系统特征,考查学生使用数据类型进行描述的能力。

算法设计能力的考查主要针对计算思维的自动化特征。当然,C语言程序设计课程中涉及的都是一些如迭代、枚举和排序等简单算法。可将这些算法封装成各种函数来进行调用,以考查函数中顺序语句的执行以及函数间的伴随参数传递的跳转来理解自动化过程。因此,必须以简单算

法设计和函数调用为重点考核内容,突出对函数接口设计和算法流程设计的考核。

参考文献:

[1] Jeannette M. Wing. Computational Thinking[J]. Communications of the ACM, 2006, 49(3):33-35.

[2] 陈国良. 计算思维[J]. 中国计算机学会通讯,2012,8(1):31-34.

[3] 李廉. 计算思维――概念与挑战[J]. 中国大学教学,2012(1):7-12.

[4] 张耀文. 基于计算思维的程序设计课程案例教学法研究[J]. 重庆电子工程职业学院学报,2012,21(3):149-150.

[5] 吴绍兵. 计算思维和程序设计能力的培养[J]. 计算机教育,2011(16):11-14.

[6] 苏海英. 计算思维理论指导下的程序设计教学改革实践[J]. 现代计算机,2012(4): 32-34.

c语言程序范文第7篇

关键词:C语言程序设计实践教学;课时统一化;小组竞赛;网络平台

中图分类号:G642.41 文献标志码:A 文章编号:1674-9324(2015)51-0224-02

在21世纪信息技术时代,大学生不能只满足于会用办公软件。为了迎接新世纪的挑战,无论计算机专业还是非计算机专业的学生,都应当学习C程序设计课程,并且把它当作进一步学习与应用计算机的基础。C语言作为一种程序设计语言,它功能强大、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高低级语言的许多优点和特点,适用于编写系统软件,又能方便地用来编写应用软件[1,2]。因此,C语言程序设计作为第一门计算机语言教学显得尤为重要,且实际上它也日益受到各个高校的重视。然而,当今大学生在学习这门课程的过程中却出现了各种问题,如学不会、不想学、听不懂,这些问题逐渐地恶性循环,致使这门课程没有完全发挥出价值,形同虚设。所以,我们亟需大家探讨并发现问题,解决问题。

一、实践教学现状

C语言程序设计作为一门计算机基础教育课程,已经在各高等院校开设,现各高校普遍采用板书或多媒体讲解概念、语法、教材,然后让学生上机操作,这种方式存在弊端,致使大部分学生只能读懂程序而不会编写程序,甚至一部分学生变成程序代码的“搬运工”,与我们的教学目的背道而驰。根据目前的教学状况,C语言程序设计的教学存在以下一些问题。

1.学生的参与度不够。在传统的教学中,教师采用的是全板书形式,如今,多媒体普及,教师又改为全多媒体教学[3]。实际上,多媒体就是节省板书时间,但依然是教师照本宣科地讲,学生一头雾水地听这种陈旧的模式。一味地采取“填鸭式”教学,从头讲到尾这样被动的课堂,学生就是一名观众,没有参与到学习与思考中来,正因如此,学生注意力不集中成为一件高频率事件,等学生再集中注意力回归课堂,会发现对教师的话已经是不知所云,所以为了保证学生高效率听课,一定要让学生参与其中。

2.理论与实践脱节。现在,大多数高校普遍存在的一个问题是课时总量不够,时间安排也不适当,表现在师资力量匮乏,教学班级多,教学任务繁重。以笔者所在的学校为例,一个学期理论课共42个授课课时,26个上机实验课时,加上各种节假日,上课的时间少之更少。C语言程序设计是长期的、逐步深入的教学过程,依照现在的教学任务设置,教师要想按照考试大纲要求进行讲解,就只能加快教学进度,顾不上对实践内容进行详细讲解,结果导致学生的实际操作能力偏低,但若全部进行机房实践,又不利于学生掌握基本理论。而且,为了教学课程的安排,通常学生的上机实验课会比理论课晚两天左右,甚至周一理论课,周五才安排上机操作,不能将实验与课堂教学环节很好地进行连贯,导致理论与实践的严重脱节[4]。

3.实践与应用太少。学以致用是学生学习的最终要求,我们的教学目的是让学生可以运用所学的知识读懂程序、编写程序,然后去解决实际问题,而现在高校的大部分学生做不到这一点。目前,多数高校的学生学习C语言程序设计这门课程的学习方法非常不到位,即在课堂上,学生仅仅翻开教材,盯着讲台听课;在上机课上,学生也只是按照课本照搬程序。除此之外,在课余时间,学生们不巩固复习教材,也不看程序,更不会自己编写代码。如此下去,他们的实践能力不仅不会提高,反而极大地降低了他们对C语言程序设计的学习兴趣。

4.实践未得到及时反馈。由于课时紧张,教师不能将学生上交的实践报告或上机操作的实验结果及时地反馈给学生本人,以致于学生不能在第一时间对自己的错误或疑惑有进一步的了解与解决,造成学生盲目地学习,甚至不学习。但等到课堂上,教师也不能占用大部分时间去点评学生的实践结果而耽误课程的进展。另外,新的知识点讲完就会有新的练习内容,如此积累,工作量繁杂,学生对之前编程的细节也会慢慢忘记,更重要的是程度较落后的学生会出现知识的缺陷,长此下去,学习困难的打击会使学生的学习兴趣急剧下降。

二、教学方法

要解决上述问题,我们就要紧紧抓住学生的实践锻炼,重视实践教学,明确实践教学方法,才能使我们的教学目标达到事半功倍的效果。

1.课时统一化,采用多种方式考察。既然由于课时原因,全理论授课与全上机操作导致学生的参与度不够,理论与实践脱节,我们可以统一课时,即我们的C语言程序设计课程全部在机房授课。如今,机房设施完备,软硬件已足够完善,我们可以选择在机房授课,利用机房的多媒体与黑板,讲解理论知识,遇到需要学生动手的地方,可以让学生及时地动手操作。教师完全不用担心在授课时,学生玩电脑游戏影响听课,我们可以远程控制桌面,实时控制学生的电脑,进行各种操作,提高学生的听课效率。同时,系统还可以自动统计出勤率,比点名更加快捷,具有实时的监督作用。另外,教师再也不用担心学生由于近视问题而看不清多媒体屏幕。其次,这种机房授课以多种方式对学生学习状况进行考察,例如提出问题法、纠错奖励法、学生演示法、小测试法……提出问题法是指教师提出一些重点或难点问题,由学生来回答;纠错奖励法指教师给出某个算法或程序让学生去发现其中的错误并纠正,最快找出的学生给予小小的奖励,如一张精美的书签、一句鼓励的话语等;学生演示法指的是找一名学生到教师端编写一个小程序或某个算法中的易错点,以此找出学生的通病,引起大家的注意;小测试法是在课堂最后十分钟左右给学生发放一份提前写好的试题,两到三题即可,可以按照计算机二级等级考试模式编写,学生提交,系统直接核对,省时省力。这样多种方式进行考察,真实地反映学生对该节课的掌握程度,也让教师真正了解学生的学习情况,以便进一步开展教学工作。

2.小组竞赛法,模拟各种编程竞赛。为了激发学生的学习兴趣,增强学生的动手实践能力,可以采用小组竞赛的方法来加强学生对C语言课程的学习。整个班级可以自由分组,两到三个人一组,教师布置相应的编程题目,要求学生在规定的时间内上交,由教师来评分,选出程序最清晰、代码更简练的一组。在学期中后期,学生拥有一定的基础和能力的情况下,可使其参与评选过程,通过评选人员相互交流讨论,在提高被评学生编程能力的同时使参评学生也有所提高,即所谓的“教学相长”。除了进行班级内小组竞赛,还可以进行班级之间、专业之间集体赛。依然是先在班级中进行初选,再经过层层选拔与淘汰,指出各方的优缺点,最终评出优秀、良好等。奖项不是重点,关键在于让学生都参与到实践活动中来。通过以上各种形式的竞赛,可以提升学生对C语言的学习兴趣和编程能力。

3.网络交流法,建立多种网络平台。伴随网络化时代的到来,教师可以通过多种网络平台与学生交流、互动,及时指出并解决问题。如教师可以给每个班建立一个QQ讨论组、微信群,如果学生在课下时间有难题或者对课堂上的知识点有疑问,可以在第一时间通过网络交流平台和教师取得联系,以此使得“教学课堂”在时间和地域上得到无限制的延续。另外,通过网络平台,教师还可以给每个年级建立公共邮箱、论坛,用来分配任务、布置作业、共享教学资源等。更重要的是,教师可以把一些实践或实验发到网上,对学生的作品进行网上点评,把优秀的程序分享给大家,同时指出学生的不足之处,到网上,学生自行查收,及时地给学生反馈。另外,这些平台还可以作为学生们的“讨论网”,大家自由交流各自的学习经验与学习心得,成为学生在线学习交流、在线测试的途径。通过各种网络平台,使教师与学生、学生与学生的交流不受时间的限制、地点的约束,由学生自主地选择学习,从而解决教学时间不充足的问题,消除教师与学生之间在时间和空间上的距离感,进一步方便学生及时解决疑惑,及时得到反馈,取得更有效的学习效果。

本文探索的一些方法和改革创新是优缺点共存的。研究发现,采用以上多种方法相结合,一环扣一环的教学组织与管理,能保证学生学到一定的知识。没有最棒的方法,只有最适合自己的方法,我们做的就是尽可能给予学生指导,建立良好的学习氛围。但是,如果学生对自己不负责任,学生之间存在相互包庇、帮忙完成实验上机报告等问题,将影响整个教学效果。所以,教师要特别关注这些学生,经常鼓励、辅导他们,督察学习情况,特殊情况特殊处理,引导和帮助他们找到自己的学习目标和学习方法。C语言程序设计成为越来越多高校学生选择的课程,也是全国计算机等级考试的选择之一。我们要紧跟时代的步伐,不断更新教学内容,分析和探讨C语言程序设计教学过程中存在的问题,进行教学方法的改革,适应时代需要,做好十足的准备去迎接未来的挑战。

参考文献:

[1]谭浩强.C语言程序设计(第四版)[M].北京:清华大学出版社,2010.

[2]薛小锋.《C语言程序设计》教学方法探析[J].福建电脑,2004,(01):87-88.

[3]余炳辉,孙娟.《C语言》课程教改浅论[J].科技资讯,2009,(27):222-223.

c语言程序范文第8篇

关键词: 《C语言程序设计》 教学方法 教学手段 实验教学

《C语言程序设计》是程序设计类课程的基础,是计算机专业和相关专业的核心课程,也是全校工科各专业的本、专科教学计划中占有重要地位和起着关键作用的一门课程。在计算机教育方面,C语言是为数不多的与国外保持内容同步的课程之一。因此,它在高校教学中的地位之重要不言而喻。我们的教学目标是让学生掌握程序基本编程思想和实用编程技能,训练学生严密的逻辑思维、严谨踏实的作风、精益求精的精神,通过全面、深入、系统地介绍程序设计方法和程序设计语言,使学生掌握C语言的基本语法、语句、控制结构,以及结构化程序设计的基本思想和方法,使学生认识到算法、良好的程序设计风格与实践在本课程学习中的重要性,培养学生熟练使用C语言编程分析和解决实际问题的能力。但在实际的教学过程中,经常有学生学不好、不愿学的情况。我根据自己多年的C语言教学经验,谈谈在C语言教学过程中的一些问题,希望对读者学习和使用C语言有所帮助。

1.存在的问题

很多学生在开始学习时热情高涨,但随着课程的深入,该课程里面需要记的规则和规则本身的灵活性特别是思维的转变使学生慢慢失去了学习的兴趣。主要原因有以下几点:第一,对知识理解不够透彻,没有深究里面的知识点。课本里面一般只介绍C语言的格式和规则,因为语言学习的一个渐进性,所以结合实例比较少,学生就比较难于掌握。例如if语句的用法:if(表达式)语句;当表达式为真时执行语句,否则执行if语句的后续语句,如果在“(表达式)”后面加一个分号虽然没有语法错误,但程序的逻辑结构发生了改变,很多初学者会犯此类错误。第二,学生的思维方式开始很难转变过来,经常会用数学里面的表达式来理解和表达C语言里面的表达式。如若要描述三个变量a、b、c的大小关系,很多学生就直接这么写了:a>b>c,虽然没有语法错误,但同样出现逻辑错误,实际上在C语言里应该这样描述:a>b&b>c。第三,学生对程序的理解不够。弄不明白程序的运行过程,实际上时对C语言的控制语句理解不够。第四,不会动手写程序。这是很多初学者出现的问题,很多程序能看懂,能理解,但是一叫他独立写一个程序,他就无从下手。这主要是平时动手不够,另外对算法的理解还没有深入。

2.解决方法

2.1教学方法。教学方法多种多样,不可采用单一的方式进行讲授,在教学过程中教师应该灵活地采用多种方法相结合,充分调动学生的积极性,使其从被动学习转变为主动学习具体方法如下。

2.1.1互动教学法。互动教学法的方式有多样,如课堂提问、课堂练习等。例如,在讲完一个知识点后,教师可拿出几分钟时间让学生自由提问,或者可以出一个相关习题让学生随堂练习,这样既不会让学生感到枯燥无味,又能加深学生对该知识点的理解。在课堂上还可让学生直接到黑板上编写程序,编写完毕后让其他同学上来进行点评、讲解,这样可及时发现学生的掌握情况和学生容易犯错的地方,从而对症下药,对学生还没有掌握的知识点再重新温习一遍,这样学生的印象深刻,比直接讲解效果更好。

2.1.2启发教学法。C语言教材中的例题和课后习题比较丰富,给出了一般问题的一般解法,应对其进行归纳、整理和分类,在讲解同一类问题时没有必要逐题讲解,而应该在讲解一、两个典型题目的基础上,拓展学生思路,启发学生归纳出求解这一类问题的基本算法,这样既节省了重复讲题的时间,又留出时间来给学生讨论和思考;或者在讲授新的内容时通过复习前面的知识引入新的内容,例如讲循环结构程序设计时,应首先让学生回忆顺序结构和分支结构的执行原理和过程,进而引出循环结构的思路和过程。

2.1.3类比教学法。如在讲解交换变量a和b的值时,很多学生会直接用a=b;b=a;来处理。这时教师可用交换两个杯子甲和乙里的饮料这样的例子来说明,要交换两个杯子甲和乙里的饮料,则应该要拿第三个杯子丙作为过渡,先将甲杯子里的饮料倒入丙,再将乙杯子的饮料倒入甲,最后将丙杯子里的饮料(亦即最开始甲杯子里的饮料)倒入乙杯子,这样就实现了甲乙两杯子的饮料的互换。同样要交换两变量的值,也应该要一个中间变量,假设为t,则程序段应这样写:t=a;a=b;b=t;如此,学生就很容易理解了。

2.1.4演示教学法。利用黑板或动画的形式生动地描述程序的运行过程,这样对一些比较复杂的结构块或程序段有很好的助理解作用。

2.2教学手段。教学手段也是多样,针对不同的教学内容和不同的学生个体采取不同的教学手段,这样才会有针对性。

2.2.1寓教于乐。兴趣是激发一个人学习的最大动力,所以教师在教学过程中尽可能地采取一切方法来激发学生学习的热情。在C语言课程中,也有很多趣味性的数学问题,如“水仙花数”,“完数”,“斐波那契数列”,“猴子吃桃问题”,“百钱买百鸡”,等等,这些有趣的问题可激发学生编程的兴趣。

2.2.2传统的板书和多媒体课件相结合。在教学过程中,教师一定不能单纯地使用多媒体教学或板书的方式。基于C语言这门课程的特殊性――特别注重动手和程序设计能力,所以在教学过程中,对概念或演示方面可以用多媒体,概念一定要讲详细,宁可少讲一个习题,也不能让学生对概念模糊;涉及程序(特别是学生刚接触到程序或比较复杂的程序)的时候,虽然多媒体课件上有,但讲解的时候最好将其板书出来边写边讲,哪个语句段实现什么功能,能否用其他程序段实现相同功能,等等,这样学生更容易接受这个程序、算法和思想,学习效果更佳。

3.加强实验教学的管理

《C语言程序设计》是一门实践性很强的课程,上机实验是学生消化、理解理论知识,熟悉算法,发现、验证错误,调试程序和提高编程能力的一个重要途径。学习C语言不能纸上谈兵,一定要通过上机来验证程序,而且学生独立上机编辑运行一个程序比单独看书效果强很多。所以教师一定要加强上机实验的管理,让学生重视实验。实验环节主要有以下几点。

3.1理论课结束后即要为学生布置实验课的内容,要有难有易以供不同层次的学生选择,让学生在课后先自己编写好程序或者写出问题的算法以提高实验课的上课效率。

3.2上机过程中督促和指导学生进行实验。上机调试程序的过程中,会出现各种问题,教师应耐心细致地为学生讲解并让其思考原因。另外基于C语言有不同的编译平台,常用的有TC2.0和VC++6.0,有个别程序(主要是数据类型里面的问题)在不同的编译平台上有不同的结果,一定要让学生弄清楚为什么。

3.3仔细批改实验报告。实验课结束后,要求学生写实验报告,上交之后,详细了解每个学生的实验情况,出现的问题,这样就相当于一个反馈了,以后就有针对性了。

C语言是高校计算机教育的一门非常重要的课程,因此C语言教学是一个非常值得探讨的问题。教师应尽一切努力让学生学好这门课程。

参考文献:

[1]谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,1999.

[2]谢乐军.C语言程序设计及应用[M].北京:冶金工业出版社,2008.

c语言程序范文第9篇

1.1教学只注重课程的讲解,不注重教学过程的质量控制

传统的教学以课程内容的讲解为主,通过讲解变量、循环、数组、指针等内容,并结合一定的教学案例来推进教学过程的实施。这种传统的教学方法没有考虑到本阶段学生的特点,往往造成教学效果差,教学质量难以控制。C语言程序设计课程在大一新生中开设,许多学生缺乏程序的思维和一定的动手能力,学生难以跟上教学进度,造成一定数量的学生对学习语言失去兴趣,从而影响整个专业课程的学习。

1.2教学过程缺乏有效的互动

C语言程序设计的教学过程中主要使用PPT来讲解,案例程序也通过PPT展示,甚至包括程序运行结果也以截图的形式在PPT中显示。虽然在PPT中可以添加很多的动作,动态地标注、显示程序的运行过程,但这种方法以投影为中心,缺少与学生交流的环节,加上程序类课程相对枯燥,以致学生难以集中精力做到全程听课。

1.3代码编写规范强调不够

编码规范是软件专业学生必须要牢记并遵守的,良好的编码规范不仅能体现软件从业人员的素质,而且使代码有更好的可读性,更容易被别人所理解和交流。该课程的讲解主要以编写简单逻辑来解决一些日常问题、数学问题,编程的环节侧重于算法的实现,往往忽略了编码规范

。1.4考试以笔试为主,难以检验学生的动手能力

传统的C语言程序设计课程考试以笔试为主,考查学生对C语言基本的语法、简单逻辑编写的掌握情况。这种考试机制脱离了程序语言的实现介质,即计算机。虽然在试卷中也可以用编程题目来考查学生的编程能力,但在纸上写程序与在计算机上写程序有本质的不同。在纸上写程序只需要写出大致的逻辑即可,而在计算机上写程序不仅要写出正确的代码,而且需要调试和跟踪代码,最终保证程序的正确执行。因此,笔试并不能很好地检验学生的动手实践能力。

2教学改革措施

2.1加强教学过程的质量控制

C语言程序设计课程是一门实践性强的课程,仅通过做一些常规练习无法达到教学质量监控的目的。为了更好地控制教学质量,需要从学生语法规则的掌握到动手编程这一系列环节进行掌握和跟踪。为此,我们开发了一套在线作业系统用于教学质量的控制。⑴作业题库的建设C语言程序设计的任课教师根据自己的经验和理解来搜集和设计C语言题目,包括基础知识的题目和编程实践的题目。基础知识的题目主要用于C语言知识点的训练,包括填空题、选择题、判断题和程序阅读题;编程实践的题目主要用于编程能力的训练,这类题目需要学生对问题进行正确分析、设计算法、编程并运行,最终得到结果。教师在给出题目时,需要提供测试数据和对应的结果。⑵作业的布置与批改教师可以根据每次课的教学大纲、课程内容,从作业题库中选择一些填空题、选择题、程序阅读题、编程题来建立课程作业供学生在课外完成。学生在规定的时间之内完成作业后提交作业,系统根据教师预先设定的答案进行自动批改,形成每个学生的作业记录。如果学生在规定的时间之内没有完成作业并提交则失去本次作业的记录。教师通过查阅部分学生的解答来掌握学生对相关知识的掌握情况,特别是需要整理学生所犯的共性问题,并有针对性的开设习题课进行解答。⑶配套政策为了使学生重视平时作业的完成,课程的期末成绩将考查平时作业的情况。如果学生没有提交作业的次数在30%以上,则平时成绩计0分,其他情况按照提交作业次数和作业得分根据一定的公式进行计算得到学生的平时成绩。这种策略的主要目的在于督促学生跟着教学进度进行学习和训练,不至于严重滞后于教学进度而失去学习的兴趣,可有力地保证教学质量。

2.2加强教学过程中的互动

课堂教学应该在一定程度上脱离PPT的教学,这样才可以调动学生的积极性。加强师生之间的互动可以结合本课程特点进行。在讲解课程知识点后,配以适合的案例进行教学,这些案例都是需要编写C语言程序来实现的。此时,编程实现的环节不要通过PPT展示,而要在教师的计算机上动手编写并运行得到结果,这样可以改变教学节奏,吸引学生的注意力。C语言课程案例程序的一大特点是代码量少,一般在20~30行之间,适宜在课堂上完成。教师在编写程序的过程中,可以向学生展示编程中需要注意的问题,同时,进一步讲解C语言的语法和基本知识点。教师在编写程序的过程中难免会犯小错误,或者是有针对性的故意犯一些学生经常犯的错误,在编程后的编译运行时会有错误报出,这时对于提高师生交互是很好的机会。从学生的角度来说,他们的编程往往会有很多错误,编译时会出现大量的错误提示。此时,学生可能就比较迷茫,不知道如何定位并解决错误。因此,当老师也出现错误,而且是学生经常遇到的错误时,学生往往是比较兴奋的,希望能知道老师是如何处理错误的。从老师的角度来说,真实地反映程序编写、编译的过程,展示程序错误的发现、定位、解决的方法,能够更快地提高学生的动手实践能力。面对错误,教师还可以引导学生参与程序错误的解决,消除学生对程序错误的恐惧感。在解决程序错误时可以参考以下步骤。首先,教师要把所有错误信息读出来给学生听,因为一般编译出来的错误是用英文写的,而且有些单词学生不熟悉,因此,老师需要指出错误是变量重定义、变量没有定义、还是其他错误;然后,指出核心错误的位置,教师要告诉学生程序报出很多错误信息往往是由一个小错误导致的,因此,老师要指导学生学会确定引起其他错误的核心错误;最后,在源程序中找到错误的位置,修改错误并重新编译,得出运算结果。这个错误处理过程是针对简单语法错误的处理方法,如果程序中出现了逻辑错误,即程序编译正确,但运行结果不是预期结果,此时,错误的处理方法更为复杂,可能需要重新检查程序逻辑,并使用编译环境进行程序中可疑变量的监视,通过观察变量中的数值在程序运行过程的变化来确定错误。通过实地编写程序并调试,发现和解决程序错误,最终得到正确的计算结果,不仅能使同学更好地掌握程序编写的方法,而且还能更好地与学生进行互动,提高教学效果。

2.3强调代码规范

有些老师在教学的过程别是演示程序时,注重于解决问题而忽视代码规范,甚至是自己写程序也是这样,没有代码规范。虽然遵守代码规范并不能改善程序的性能,但遵守代码规范能够使程序具有更好的可读性、可维护性,是软件代码实施过程中软件从业人员良好素质的重要体现。改善代码规范可以从以下几个方面进行。⑴适当的缩进每一行代码不要顶格书写,而要根据情况缩进。具有良好缩进格式的代码不仅能少犯语法错误,还能够使阅读者快速掌握程序内容。⑵适当的空行函数与函数之间增加必要的空行,使得程序构成一目了然。⑶适当增加代码注释程序中函数的开头最好加上注释说明该函数的作用、参数的意义,在函数中重要逻辑的部分加入注释说明该逻辑的主要思路、算法。⑷代码块要用花括号界定代码块尽量使用花括号来界定代码范围,即使代码块里只有一行代码,这样可以提高代码的可阅读性,防止阅读者误解程序。⑸变量和函数的命名尽量使用多个字母来命名变量和函数,使得程序阅读者通过名称即可大致了解变量的意义、函数的作用,提高程序的可读性。通过编码规范的强调和实施,使学生认识到软件开发的专业素质,对于提高学生的专业素养具有潜移默化的作用。

2.4上机考试

上机考试采用在线考试的方式进行,考试环节包括如下几个部分。⑴试题库的建设C语言程序设计的任课教师负责组建上机试题库,试题库中的题目都是编程的题目,用于考核学生的编程能力。教师在组建试题库时,标明每个试题的知识点和大致难度,并提供测试案例和对应的答案。题库负责人负责查看、重新编辑每个题目,从题库整体的角度更新每个试题的难度。⑵上机考试的实施为单次考试准备7个知识点和1个综合知识点的题目,教师在考试之前为每个知识点选定难度相当的5个题目。每个学生登录系统后,系统自动建立考卷,具体策略是从为每个知识点准备的5个题目中随机选择1题组成一个考卷,因此,该考卷包含8个题目,这8个考题要求学生在4小时内完成编程。考试时间一般定为上午8:00至中午12:00点。学生根据随机组成的考卷题目进行解答,为每道题目编程求解,并在学生机上利用示例测试用例检验代码的正确性。如果在本地没有通过检测,则进行逻辑检查,修改程序;如果本地通过测试,学生需要将代码提交到服务器。服务器接收到代码后,自动调用教师提供的更多的测试用例来检测程序运行结果是否与预先设置的结果匹配,进行代码逻辑黑盒测试。如果全部通过,则说明学生的编程逻辑是正确的,此时将学生成绩记录中对应的题目标为通过,并回显“通过”给学生,学生继续做下一道题目;如果其中有的用例运行结果不正确,则返回“错误”给学生,学生可以接着做本道题目,也可以选做另外一道题目,同时,在学生成绩记录中对应的题目标为错误。教师在考试现场调取并查看所有学生成绩记录信息,如果发现异常信息,如在很短的时间内完成了过多的题目,则可能学生在作弊。此时,根据异常学生信息中的IP地址找到该学生,进行现场查证,如果确认为作弊则立即处理。如果学生正确完成了8道题中的5道题,则学生通过上机测试,否则,学生没有通过上机测试。为了减轻学生的压力,上机考试可以分两次进行,如果第一次没有通过上机考试,还可以组织学生进行第二次考试,取这两次考试的较高分作为学生成绩。

3结束语

C语言程序设计是软件工程专业的一门重要的基础课程,其教学效果直接影响后续语言类课程的教学效果。传统的C语言程序设计在教学过程难以进行质量控制;师生之间缺少良好的交互,没有强调编码规范,没有进行机试测试,导致教学效果难以保证。为此,本文提出了一系列改革措施,这些措施包括:利用在线练习系统来保障学生的课程作业得到及时的完成;通过课程程序的现场编写、编译等措施,加强与学生的互动交流;强调编码规范提高学生的专业素养;通过在线考试提高学生的程序思维能力和动手实践能力。通过这些措施,学生学习C语言的进度基本能够得以保证。由于学生平时就被要求在作业系统中进行程序的编写并在线评判,从而具有了良好的编程能力,而且所编写程序有较好的编码风格,最终大多数学生能够通过机试考试。实践表明,本文所提出的改革措施提高了本专业学生的专业素养和动手实践能力,有力地保证了后续语言课程的教学质量。

c语言程序范文第10篇

关键词:C语言;空指针;NULL

中图分类号:G642 文献标识码:B

1引言

指针在C语言编程中占有非常重要的地位,使用指针可对内存进行动态分配、直接访问内存以及表示复杂的数据结构等。正确而灵活地使用指针可编写出优质的程序,可以说指针充分体现了C语言的优点。但由于指针具有高度的灵活性,对它的完全掌握也较为困难。

在某些场合下会使用到一种称为空指针的指针,由于这种指针在程序中不以普通指针的形式出现,并没有对它进行显式的定义或赋值,所以常常被忽视,但作为指针的一类,空指针这一概念却是不应该被忽略或混淆的。

那么,什么是空指针呢?

2空指针的概念

空指针是一种不指向任何对象的指针,它的值为NULL。NULL在中是这样定义的:

#define NULL0

或:

#define NULL 0L

也即是说,NULL的值是一个纯粹的零,这样,空指针就与普通指针有了区别:空指针的值是一个整型值,而普通指针值是不允许是整型值的。但这个纯粹的零需要时可以被强制转换成void *或char *类型。

3空指针的用途

3.1用作函数调用失败时的返回值

某些函数的返回值是一个指针,若函数调用成功,返回一个指向某一对象的指针;反之则返回一个空指针。很多C库函数在调用失败时的返回值就是一个指针,如:

#include

main( )

{char *string[5];

int i=0;

while(i

{if((string[i]=(char *)malloc(32))= = NULL)

{ printf(“failure”);

exit(0);

}

else

gets(string[i];

i++;

}

for(i=0;i

}

这个程序中定义了一个指针数组分别指向五个字符串,这五个字符串的存储位置在是程序执行过程中调用malloc( )函数动态分配得到的,若分配失败,malloc( )函数的返回值即为一个空指针,程序中if语句的条件就是以判断malloc( )函数的返回值是否为空指针来确定程序的流向。

3.2用来终止对递归数据结构的间接引用

单链表是一种常见的递归数据结构,其结构非常简单,包含一个值域和一个指向链表中下一个元素的指针域。下面以一个只含一个整型数据域的单链表为例:

struct linklist

{intdata;

struct linklist*next;

};

在这样一个链表中,通过指向第一个元素的指针(头指针)开始引用该链表,并通过每个元素的指针不断引用下一个元素,将链表中最后一个元素的指针赋值为NULL,用以控制对该链表引用的终止。如下例是对如上定义的单链表求其长度的函数:

int length(struct linklish *head)/*head为头指针,函数结果用i返回*/

{struct linklist *p;p=head;

int i=0;

while(p!=NULL)

{p=p->next;

++i; }

return(i);

}

在本例中,while循环的执行条件“p!=NULL”判断指针p是否移动到链表尾,若该条件不成立,表示已到链表最后一个元素,终止对链表的引用。

3.3用作main函数形参argv[ ]的结束警戒值

一般情况下main函数是不带参数的,但有时它可有两个形参:argc和argv[ ]。一个带形参的main函数如下例:

#include

main(argc, argv)

int argc;

char *argv[ ];

{ int i=0;

while(argv[i]!=NULL)

{printf(“argv[%d]=%s\n”,i, argv[i]);

i++;}

}

其中argc是指在操作命令状态下执行main函数时命令行中参数的个数,argv[ ]则是一个指针数组,指向命令行各参数字符串的首地址。

若该函数编译后生成的可执行文件名为file,则可在操作命令状态下输入如下命令行:

filepara1para2para3

则argc的值为4(文件名也看作一个参数),argv[0]指向命令行中第一个字条串“file”,argv[1]指向“para1”,argv[2]指向“para2”,argv[3]指向“para3”,实际上还有一个argv[4],其值即为NULL。该程序的功能是依次输出命令行中的各参数字符串,while循环体的执行条件是“argv[i]!=NULL”,该循环体执行四次依次输出命令行中四个参数字符串后,到达指针数组的最后一个元素argv[4],其值为空,循环终止。

4关于空指针的讨论

4.1空指针与void指针的区别

空指针与void指针是完全不同的,前面已经说明空指针是不指向任何对象的,而void指针却需指向某个对象,只是这个被指向的对象是不属于任何类型的,void指针在需要时可与其它类型的指针互换。

void指针常用作指向函数的指针,而这对空指针而言是不可想象的。

4.2空指针的值是否总是为0

对于空指针的值是否总是为0这一问题,如果理解为“NULL与0比较,结果相等”,那么回答是肯定的,也就是说NULL总是等于0;但是如果将这一问题理解为“其存储方式总是与整型值0相同”,则并不一定,因为就存储方式而言,不同类型的“0”显然是不同的,所以程序中若在需要时将NULL的值强制转换成void *或char *类型后,其存储方式必然与整型的0不同了,一个字符型的0在内存中存放的是其ASCII代码的值(048),一般而言占用一个字节,而一个整型的0在内存中存放就是其本身的值(0),则所占字节数随编译系统的不同而不同,一般为两个字节,因此,在这种意义下则可说空指针的值并不一定总是为0。

4.3NULL与NUL的不同

前面在说明空指针的概念时已经知道NULL是在中定义的一个宏,其值为0或0L。而NUL则是指ASCII中第一个字符----空字符’\0’,常用作字符串的结束标志,它并不是C语言中预定义的宏,它与NULL是完全不同的。

5结束语

在程序设计语言的发展历程中,C是一个重要的里程碑。在面向对象、可视化、基于网络的程序设计语言占据主流地位的今天,C仍然是计算机专业和非计算计专业学生进入程序设计领域的重要基础。指针是C语言中的一个极为重要的概念,全面正确地掌握指针是进行C语言程序设计的必备基础。空指针虽然不像C语言中其它普通指针那样得到广泛的使用,但对其有一个明晰的概念,了解了它的用途后,对程序的阅读及实现某些编程技巧却是很有用的。

参考文献:

[1] 谭浩强. C程序设计(第三版)[M]. 北京:清华大学出版社,2005.

相关推荐

发表回复

登录后才能评论