c程序范文

时间:2023-03-04 23:09:18

c程序

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;

continue语句continue;

c程序范文第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.

[6] 胡超,闫玉宝. 30天学通Visual C++项目案例开发[M]. 北京:电子工业出版社,2009.

c程序范文第3篇

关键词:C程序设计;课堂教学;实验教学

中图分类号:G642.0文献标识码:A文章编号:1009-3044(2011)25-6269-02

On the Teaching of C Programming

JI Xiao-hui, YAN Hong-ping, XIN Xiao-hui

(School of Information Engineering, China University of Geosciences(Beijing), Beijing 100083, China)

Abstract: Based on teaching practice, this paper discussed the methods in the class teaching and the experimental instructing. In class teaching, this paper emphasized the importance of stimulating the students' learning interests, training their programming thought and the teaching in real-time programming. In experimental instructing, this paper focused on how to introduce a large-scale problem and to train the students to have a good programming habit. The importance of training the students' self-learning ability and offering a comprehensive review of the students' performances was described.

Key words: C programming; class teaching; experimental instructing

C语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好[1],以其为语言编制出的程序具有较强的结构化及模块化特点,并且可以直接对硬件操作,因此C语言是各高校理工科专业大一学生学习计算机程序设计所广泛使用的一种语言。通过本门课程的学习,学生不仅可以掌握此种高级程序设计语言的语法和语义,还可以掌握结构化程序设计“自顶向下、逐步求精”的思想及方法、常用的算法及实现技术,以及分析和解决实际问题的语言应用能力,是一门以激发学生的程序设计兴趣、培养学生探索精神和实际编程能力为重点的课程[1]。

但由于课程面向的是大一学生,此时学生还没有接触专业课,不能将专业的实际需要与本门课程的学习联系起来,对课程地位认识不足,因此存在对课程的兴趣不大、学习动力不足、主观能动性差、投入精力有限等问题。同时,学生此时尚不具备程序设计思想,往往会感到C语言规则繁多,枯燥无趣,看似明白,但上机出错,且不知道如何解决实际问题,不能学以致用。因此,学生如何学好、教师怎样教好基于C语言的程序设计课程成为学生和教师普遍关注的一个问题。

该文从教学实践出发,提出了一些C程序设计教学需注意的问题,并针对这些问题提出了相应的改革措施。

1 C程序设计课堂教学中应注意的问题

1.1 激发学生学习兴趣

如前所述,本课程面向的是大一学生,其尚不具备专业知识,不能将专业的实际需要与本门课程的学习联系起来,对课程的地位认识不足,缺乏学习兴趣。针对此情况,教师可以在绪论部分根据所教专业的具体特点,以具体实例来强调其将来可能从事的工作与本门课程之间的联系。以电子信息工程专业的学生为例,教师可以强调其未来可能从事的电路设计工作需要正确性的验证,而电路的正确性验证需要将所学的专业知识通过计算机语言这一桥梁教给计算机来进行处理,从而将学生未来的实际工作需要与当前所学的课程联系起来,激发学生的学习兴趣,增加其学习动力,调动其主观能动性。

除此之外,还可以以学生经常使用的网络浏览器、聊天工具、银行的ATM机、车站售票系统等软件为例,说明程序设计语言可能生产的具有各种功能、能满足各种实际需要的产品。以此为基础,强调C语言是当今使用最广泛的计算机语言之一,并且许多新型的计算机语言也是以C语言为基础或与之相似的,学完C语言后,可以很快地掌握其他语言,并且在C语言学习过程中所学到的程序设计思想,实际问题的解决能力同样适用于其他计算机语言,以进一步提高学生学习C语言的热情。但教师需要同时强调,要真正地学好程序设计,必须脚踏实地、打好基础、重视细节、勤于实践。

1.2 突出程序设计思想

作为程序设计类课程,学生不能只拘泥于具体的语法,必须对程序设计的基本思想和方法有一定的了解。本门课程的教学目的不仅要使学生能够读懂程序,还要使学生能够通过编写C语言程序去解决实际问题。因此本门课程对学生的分析问题、解决问题的能力的引导和培养是非常重要的,需要把逻辑与编程解题思路的教学放在重要位置上。同时要注意讲授时的重点放在程序设计思路、算法及编程的构思和程序的实现上,避免语法的过细阐述,防止学生产生“只见树木,不见森林”的体验,引导学生在解题编程的实践中探索其中具有规律性的认识,将感性认识升华到理性高度,让学生尽量做到举一反三。

针对刚开始程序设计时学生不知如何下手这一普遍现象,可以结合所教内容所用到的具体实例,引导学生使用“数据输入、运算处理和结果输出”的步骤进行编程。在“运算处理”步骤上,可以将结构化程序设计思想的“自顶向下,逐步求精”的方法渗透给学生,具体可以先以伪代码的形式写出概要算法,再逐层分解,并逐步以所学的C语言替换之,最终转化成可以解决实际问题的源程序。通过此种方法既解决了提出的问题,也让学生学到了程序设计的方法。此种方法可以贯穿课程的始终,以强化学生的程序设计思想,提高学生分析问题和解决问题的能力。

1.3 现场编程解决问题

由于课程面向的是大一学生,绝大多数学生没有任何编程经验。因此本课程的另一项重要任务就是教会学生熟练地使用常用的软件开发环境进行编程和调试。为达到此教学目的,最好的方法就是结合所教内容所用到的具体实例进行现场编程及调试。在向学生交代清楚所求解的问题及所采用的算法后,可以先在所用的软件开发环境中以伪代码的形式写出概要算法,再逐层分解,并逐步以所学的C语言替换之,最终转化成可以解决实际问题的源程序并现场编译。对编译出现的问题进行现场分析及排错,或者对于编译通过但结果出现逻辑错误的程序进行现场调试,以提高学生分析、解决编程中出现的问题及相应的调试能力。这种方法虽然加大了教师授课的随机性和难度,但却可以充分调动学生的学习积极性和主动性,可以给学生留下更深刻的印象,深化教学效果。

另一方面,现场演示编程可以进一步加深学生对知识点的理解。例如,学生不易理解“指针一定要初始化”的问题,此时,教师可以进行现场编程,打印出或者通过调试状态观察指针的值,让学生明白如果指针不初始化,那么其值是不确定的,而在指针不确定指向哪里的情况下对指针指向的内容进行修改,不仅得不到正确的结果,还是非常危险的。另外,还可以对将较复杂的程序进行调试,以单步跟踪的方式监控某些变量在程序执行过程中值的变化,加深学生对程序执行过程的理解,进一步帮助学生理解算法。

2 C程序设计实验教学中应注意的问题

2.1 引入具有一定规模的综合实验

C语言程序设计是一门实践性很强的课程,课程的最终目的是让学生能够综合应用所学知识通过实际上机编程解决应用问题,因此上机实验是教学过程中必不可少而且至关重要的环节。在上机实验内容上,既要有比较简单的验证性题目,也要包含具有一定难度的设计性题目,每个知识点的题目都应由易到难,循序渐进,并具有一定的趣味性,以更好地调动学生的学习兴趣。为了锻炼学生解决复杂问题的能力,可以要求学生在期末时提交一份具有多个功能模块、相对较为复杂的大作业,并将其完成的好坏作为最终成绩的一部分。为了让学生能够体会所学各章知识点不是相互孤立、而是彼此联系、是构成大型程序的必要组成部分,可以将所要求完成的大作业根据各章不同的知识点进行任务分解,并在各章的实验部分予以完成,最终课程学完后,学生也完成了一个相对较为完整、复杂的程序。

以“学生成绩管理系统”为例,在课程开始就可以把该系统演示给学生,让学生第一次看到用C语言开发出的界面友好、功能完善的综合软件,并将其各部分的实现方法与所学各章的知识点进行简要的对应性介绍,并告诉学生,完成本门课程的学习就可以编制出类似软件,以激发学生的学习兴趣。在具体到各章的实验任务上,在学习了输入/输出语句后就可以让学生实现简单的显示界面及菜单;学习了数据类型及分支结构,就可以要求学生实现菜单选择;学习了数据类型、输入函数及循环结构,就可以要求学生实现成绩的录入及分数的计算;学习了数组,就可以要求学生实现成绩的排序,让学生明白,复杂的程序实质上也是通过简单语句及函数的拼接来实现的,在潜移默化中培养了学生采用模块化方法解决实际问题的意识。学完结构体及文件后,可以要求学生分别使用结构体及文件来实现学生成绩的管理,并与前面所使用的方法予以对比,使学生能从整体的角度来审视整个程序的设计过程并进行不同方法的对比,以加强对所学知识点的理解,进一步通过上机综合调试,达到提高编程能力的目的。

2.2 培养学生良好的编程习惯

良好的编程风格可以增加代码的可读性和可维护性,有利于团队合作以及别人帮助改正错误,并能帮助编程人员理清头绪,提高调试效率,是产生高质量程序的前提。本门课程是学生学习程序设计的入门课程,在此阶段就应该要求学生养成良好的编程习惯,注意编写程序时的缩进方式、注释、对于变量、函数以及文件等标识符应做到“见名知义” 以增强程序的可读性和可维护性、程序写到一定的阶段时进行测试等,尽量使程序看起来清晰、简洁、一目了然,为学生今后的编程建立良好的习惯和基础。

3 C程序设计教学中应注意的其它问题

3.1 培养学生的自学能力

当代科学技术发展迅猛、知识更新速度愈来愈快,计算机领域尤其如此,新的语言、新的技术层出不穷,如果学生的学习完全依靠教师,没有一定的自学能力,对其将来的发展是很不利的。C语言程序设计课程的知识点多,课堂授课时间有限,因此教师在授课上需要重点突出、抓大放小。所谓抓大是指强调程序设计思想以及重点、难点的讲解,放小是指淡化C语言中语法细节的讲解,而是引导学生通过课后自学,动手上机等方式进行学习。其中需要讲授的重点和难点包括变量、数据类型和表达式、选择结构、循环结构、一维和二维数组、函数、结构体和指针等,需要淡化讲解的知识点主要是学生编程过程中用的相对较少、后续课程学习中会学到的内容[2],比如多维数组、共用体、链表应用等。在重、难点内容的讲解上,教师要注意耐心、仔细、尽量降低学生的畏难情绪,引领学生掌握要点,以避免由于某一环节的缺失而影响后续知识的学习,进而降低对本门课程的学习兴趣。

另一方面,由于学生的个体差异,有的学生在较短的时间内就能完成所学内容甚至可以超前学习,对于此类学生教师可以鼓励其在在线评测系统(如、等)上进行练习,在线评测系统的特点是对正确性的评判极为严格,不仅要求逻辑上正确,而且数据的格式也要相符合,学生必须考虑到每一个细节和特殊边界条件,而不是大体上正确就能通过测试,这对于培养严谨、周密的程序设计思想及风格极为有效[3]。同时也可以鼓励这些优秀的学生帮助其他学生解答问题,调试程序,对于出现错误的学生也鼓励其为那些出现同样错误的同学进行解答、调试,以加强学生的理解,并以榜样的力量促进良好的学风建设,形成良好的学习氛围,促进整体的学习进步。

3.2 综合评价学生成绩。

C程序设计的教学目标之一是培养具有实际上机编程能力的学生,因此其上机实践能力应纳入到考核范围中来。具体可以在每堂实验课结束之前,随机抽查学生的实验结果,要求学生讲解程序执行流程,并能够针对教师对程序的改动进行现场调试和纠错,根据学生具体的完成情况予以评分,以增强学生的实验重视程度。在全部实验课结束时,可根据实际情况,对实验进行单独的实验期末考核。

另外,还可以引入期中考试,一方面可以让学生有机会了解自己的学习和掌握情况,激励好的学生,为没有学好的学生敲响警钟;另一方面,也有利于教师及时了解自己的教学效果,调整和改善教学方法。

4 结论

该文认真研究和分析了C程序设计的教学现状,并学习了其它学校的先进经验,与相关授课教师进行交流,以及结合我校学科建设特点和学生水平,提出了C程序设计课堂教学及实验教学中应注意的问题,并提出了培养学生自学能力、综合评价学生成绩的必要性及方法。

参考文献:

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

[2] 张艳明. C语言程序设计教学体会浅析[J]. 电脑知识与技术, 2010(4):2690-2691.

c程序范文第4篇

原型开发是C语言程序设计学习支持系统的使用的主要理论基础,在开发该系统的初始阶段,首先要有针对性的对使用的需要进行调查,以此为依据迅速的将一个系统原型制造出来并进行正常的运转。使用者运用这个原型之后,提供使用建议,接下来就是对该原型进行有效的修补和完善,以新的结构、数据和使用模型来建立起一个崭新的原型。之后再交由使用者进行使用并反馈意见,经过几次的使用和反馈、修改,使用者与系统提供者能够在使用上达到共识,使用过程中的种种误会得以解除,使系统得到精准的内涵,同时能够到达使用者的满意。经过这一系列的反馈与修改,系统如果能够达到使用者的要求,就可以被定义为实际生产运行系统,如果达不到使用者的要求,则就会被舍弃进行重新开发。

2C语言程序设计学习支持系统的开发步骤

在对C语言程序设计学习支持系统进行开发的过程中,要严密结合《C语言程序设计》这门课程本身的独特之处,并将该系统的开发思想融入其中,实现以下五个开发步骤:

2.1开发前分析

在进行系统开发之前,一定要结合实际情况做好各方面的调研,这是系统开发的必经之路,也是基础所在。首先进行开发前调研,能够使有疑问的地方展现出来,才能给设计者提供一个确实可行的主题来开发此系统。

2.2开发前设计

经过了开发前有效的分析和主题的确立,将使用者在使用过程中的需求通过调查了解清楚,将该系统的具体模块加以确立,将原型设计出来,同时数据库的基本情况也要得到有效的设计。

2.3C语言程序编程思路和语料分析

一个科学的推理路径的确立需要有效分析C语言程序编程思路和语料,同时要仔细分析复杂程序中存在的编程思路。

2.4系统的开发

在开发系统的过程中,代码的编写、信息库的开发、先进的技术的采用一系列程序后,才能使该系统的功能得以实现。

2.5试用与修改

将开发出来的系统交给使用者进行试用,使用者在使用过程中会发现各种各样的不足,及时根据使用者的意见进行沟通和修改,最终形成一个完善的系统。

3C语言程序设计学习支持系统的功能结构

3.1学习支持模块

在计算机的使用过程中,使用者很多时候会遇到种种困难,例如在对编程或程序进行调试的过程中遇到的难题,自己无法解决时,学习支持模块就能够及时帮助使用者将问题进行指示并提供帮助。编程思路分析指导和程序调试指导是学习支持模块的两大组成部分。

3.1.1编译诊断

使用者在使用计算机的过程中,正确的程序无法得到有效的调试的情况下,编译诊断就能够充分发挥自身作用,为使用者给予及时的帮助,使其了解发生错误的根本原因。它包括了上传程序和诊断问题两大部分。该系统是在使用者无法进行正确的编译C语言源程序时启用。使用者在启用该系统是首先要将参数输入进去,此时数据库就能够通过系统的查找提供错误的起因及解决方法,系统会逐步为使用者进行提示,再通过使用者输入的问题作出判断并给出解决方案。此时问题如果没有得到解决,则说明不完善的数据库存在于该系统中。

3.1.2编程思路分析

计算机使用者在进行上机编程的过程中,该系统能够使思路不清晰的复杂程序编程进行分析,根据相近的程序编程思路给使用者提供指示。它能够满足使用者的即时需求。

3.2信息库管理模块

3.2.1用户信息库管理

使用者的使用权限、基本信息和上传程序信息等的管理都是由该模块来进行的。在使用计算机的过程中首先信息库要将使用者的基本信息收入其中,使用者在每次登陆的过程中只有将基本信息输入进去,通过系统的检查之后才能够进行使用。

3.2.2出错知识信息库管理

针对这一部分的管理,发生问题的知识信息,其中包括诊断、设问和编译错信息,C语言使用者可以采取管理维护措施。完善、删除和添加等操作可以对出错知识库加以填充和完善。

3.2.3编程思路分析信息库管理

C语言使用者可以针对这一部分采取维护管理,即维护管理复杂程序的编程思路分析信息,主要可以采取的手段有更改、删除和添加等操作,不断填充和完善此信息库。

4结论

学习和使用计算机者在上机过程中会遇到上机编程任务中的种种问题,此时C语言程序设计学习支持系统就能够通过种种手段有效帮助使用者解决这些问题,它不仅能够帮助使用者搜索到发生问题的主要原因,还能够使程序的编程思路更加清晰,使该系统的编程能力和调适能力有所提高,从而使学习者和使用者的学习效率得到提高。

c程序范文第5篇

第二天上机的时候也很快完成了第一步,觉得还行,慢慢来五天完全可以完成。后来也就没怎么好好思考,没想到第二天遇到麻烦了,编不出第二步了。第三天下午也没调试好,第一步输入的数据在第二步统计的时候怎么也数不出来,我从头至尾研究了多次,没发现一点问题,请舍友帮我检查也说没错,到了傍晚还是看不出来。哎!又找一个人给我看了看,竟然错得那么幼稚,类外定义了全局对象,在数据输入put()函数里又重新定义了对象,这样在put()输入的数据无法用到其他函数中,自然统计的时候都是默认值了。

就这么一个小小的错误整得我一天一晚上寝食难安。

编程序时深深感受到要不得半点马虎,有时少一个“}”或“<”都会导致程序语法错误;由于编程序经常要变换输入法,很容易输进中文字符,这也会导致语法错误;调用类里重名函数时要注明属于哪个类的。

第三天的时候第二步基本都编出来了,傍晚那时我没检查出错误来的时候,实在是把我急坏了,借了台电脑,在那安静专心的研究程序,舍友帮我检查出错误来之后,编程序有了感觉,那时已经22:00多了,竟然没有一丝睡意。

后来舍友们陆续睡觉了,可我就是不愿睡。可能是出于自尊心需要,别人都编出来了,自己编不出来,让我无法接受;也可能是第二步出来了急于尽快搞定。从19:00到凌晨4:00一直在那儿编程序了,一次次地听到铃声响竟然没有上床睡觉的冲动,满脑袋只有一个想法:认真编程序,争取晚上搞定。后来差不多了,只有备份不怎么完善,当时电脑已经用了好长时间了,实在不忍心一直用人家的电脑,只好关机睡觉了。

这几天可以说是两耳不闻窗外事,一心只顾编程序了,电话都懒得打,只想尽快把程序搞定,晚上没有电脑用,我们三个女生就去网吧,只是那儿没有vusual-c++,只好作罢。

虽然我们一直在编程序,觉得挺累的,其实还有比我们更累的——我们的老师。我们是每天只有半天的实习时间,可是老师却整天在机房里,看得出来,老师连坐下休息的时间都没有,刚要喝点水,立马就被一个同学叫去了,实习完那天下午看见老师都不想走路了。太累了,一天站7小时,还一直给别人检查程序,太忙了。想想老师这么认真,我们还有什么理由不认真呢?

只有五天的实习,却让我受益匪浅:这不仅是一次对我们的c++掌握和运用的熟练程度的检查,更是一次磨练我们耐性、培养认真态度的机会。这次实习让我深刻体会到“细节决定成败,态度决定一切”;更让我 从 老师身上学到了很多在以后工作中需要的优秀品质。相信这会在我今后的学习和以后的工作很有帮助。

通过完成本次面向对象程序设计的任务,使我熟练和掌握了上学期所学的有关visual c++中的一些主要知识点和应用点,如类的定义,类的实现,对象的定义,类的继承等等。可以所学有所学,所有所用,不至于自己所学知识由于没有经历可用过程,而放弃对它的兴趣。

第一天上课时候听老师讲,第一反应是这可怎么做了。当时有些迷茫。但是事在人为,下午回去之后在宿舍苦心研究,终于在整体上有了一定的把握。我们可以先定义一个基类,再派生三个子类,然后在类外定义函数。有人数规定,我们就定义相应长度的对象数组,最后在实现程序功能时,用函数调用就行。

于是当晚很快就完成了第二天的预习报告,上机调试时也没什么大问题,就这样第二天顺利通过。

虽说接下来的统计没那么容易,但就顺着数据顺利输入的喜悦心情,我还是较好的完成了这个任务。在类外定义一个函数用来输出雇员的基本情况,表头,表尾直接在统计函数中输出,也就是在统计函数中调用函数。打印与统计有异曲同工之妙,所以在统计做出之后,打印自然而然的也就很快完成了。

接下来的数据备份中,遇到了一个小问题,一开始以为也是函数中调用打印函数中用的那函数。其实不然,如若那样,又变成了打印。那我们就直接输出,但详细资料是受保护的,不能直接输出,那还得调用函数。于是在每个类中的公共成员中定义了直接返回的函数,接下来顺利完成了备份。调用头文件<process.h>里的exit(int)函数,可以用if()语句进行判断是否确定退出。程序顺利完成。

面向对象程序设计作为一门软件设计的课程,具有极强的实践性,使我加强了灵活应用理论知识的能力及面向对象程序设计技能。

此次,应用程序的设计和创建,经历了平时在课堂中和考试中,决不会有的重重难题和问题。而这些问题,又都是课本上很少提到的、更深一层的知识领域和应用领域。这些问题,并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们面对难题,自己思索,自己探索,自己查资料发现问题、解决问题的独断能力。

c程序范文第6篇

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

中图分类号: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程序范文第7篇

1.1对象

受试者为首都医科大学燕京医学院2013级三年制卫生信息管理专业学生,共40人,考试过程中无缺考及作弊行为,有效试卷共计40份。教学采用《C程序设计》[1]为教材,有两名教师共同参加理论课和实验课教学。

1.2试题组成

试卷按课程考试要求分为A、B两套,在考前由教务处随机抽取其中一套。根据试卷的规范化要求,满分为150分,考试时间120分钟,试卷类型包括客观题和主观题,题型、分值及具体分布情况。

1.3评分方法

试卷根据考前制订的标准答案和评卷标准进行评判,客观题填涂标准答题卡,由读卡机阅卷;主观题由授课教师采取流水作业的方式进行闭卷阅卷和签字负责,并由专人负责核分和抽查。

1.4数据处理

主观题阅卷完成后与客观题机读卡数据合并,利用SPSS统计分析软件对考试成绩进行正态性检验,并统计成绩频数分布情况、计算试卷的信度。同时利用Excel软件计算每道题的难度、区分度及试卷整体的平均难度、区分度。计算公式如下。某题难度(P)的计算方法:P=某题所有考生得分的平均分/该题满分分值。某题区分度(D)的计算方法:(1)客观题的区分度:将得分数据按总成绩排序,分别以高分组(前27%)和低分组(后27%)计算出高分组PH值和低分组PL值,则某题区分度D=PH-PL;(2)主观题的区分度:D=(XH-XL)/N(H-L),其中XH为高分组考试总分,XL为低分组考试总分,H为该题最高得分,L为该题最低得分,N为有效试卷总数的27%。

2结果

2.1学生成绩分析

试卷满分是150分,换算成100分后,平均成绩为(70.45±10.48)分,最高为94.67分,最低为44.67分,中位数为70.33分,P=0.306,成绩呈正态分布。

2.2试卷质量分析

本研究采用克隆巴赫α系数法测量试卷信度,学生的试卷α系数为0.649。此外,学生的试卷总体难度系数为0.51,区分度为0.15。

3讨论

考试是对课程教学进行效果评价的重要手段,课程考试结果包含大量有助于改善教学质量的信息[2]。因此,加强试卷分析、完善对教学效果的科学反馈是提高课程教学质量的关键。

3.1对试卷质量的评价试卷评价的常用指标包括信度、难度和区分度等[3]。信度是指试卷的稳定性和可靠性。用同一份试卷对同一组参加考试者进行反复测验,所得结果一致,那就说明这份试卷具有较高的信度。信度是衡量试卷质量的一项重要指标。目前,试卷分析最常用的内在信度系数为克隆巴赫α系数。一般认为,标准化能力测试信度应在0.800以上,教师自编学习测验试卷的信度达到0.600以上就可以了。此次考试试卷的克隆巴赫α系数为0.649,表明试卷的稳定性和可靠性均较好,说明考试结果很少受随机因素影响,考试成绩能真实、可靠地反映出被试者的学习水平。难度(P)指试卷题目的难易程度,通常以试题的通过率作为难度的衡量指标,P值越大难度越低。区分度(D)是区分应试者能力水平高低的指标。一般认为,P>0.55且D>0.15表示试题难度适中,区分度良好;P≤0.55且D>0.15说明试题偏难,但区分度良好,依然适用;P>0.55且D≤0.15则试题容易且区分度较差,只有必要时才用;P<0.25且D<0.15则试题既难又无区分度,不适用于考试。本次研究中,试题的总体难度系数为0.51,区分度>0.15,表明试卷整体难度、区分度尚可。

3.2对今后教学及命题工作的思考综合本次试卷的分析结果,本研究认为本次考试命题以教学大纲为依据,内容比例合理,但是容易的题目和难题所占比例偏大,在将来的命题工作中应加大中等难度题目的比例,对区分度差的题目进行替换。为了进一步提高教学质量,在今后的教学中,在加强学习基本知识和理论的基础上,还应强化对学生综合分析和理解应用能力的培养。教学更多地采用以问题为基础的教学模式,每次课后留下几个小问题让学生以小组为单位积极思考,下次上课时在教师的指导下进行讨论,充分发挥学生的主体作用,鼓励学生积极发言,增强学生发现问题、解决问题的能力。

c程序范文第8篇

关键词: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代码和其他语言写的代码进行交互。

1.JAVA类

在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++的头文件。

例如程序testdll.java,内容为:

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 testdll.java编译它,会生成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程序范文第9篇

【关键词】 C程序设计教学改革教学实践

【基金项目】河西学院教学研究项目(HXXYJY-2012-020)资助。

【中图分类号】TP311.52 【文献标识码】A 【文章编号】2095-3089(2014)05-0244-02

《C程序设计》课程是目前各高校计算机专业普遍开设的第一门专业基础课程,它具有功能强大、效率高、简洁灵活和可移植性强的特点,使其在软件开发领域颇受开发人员的青睐[1]。从目前的教学情况来看,学生在学习C程序设计时往往存在着一定的问题,实际掌握的情况并不太理想。笔者在多年的 C程序设计教学的基础上,总结经验,逐渐探索出一些行之有效的教学改革措施,并进行了相关的实践,取得了显著的成效。

一、C程序设计教学存在的突出问题

第一,难入门,C程序设计前几章介绍的是运算符和表达式,如果按课本顺序来讲,这些内容足使学生产生枯燥感,从而慢慢失去对本课程的学习兴趣;第二,生源的计算机基础参差不齐,导致部分学生学习进度缓慢,每次的实践任务在规定的上机课内难以完成,越积累多,最终可能放弃;第三,教学案例的选择和教学方法的选取不当,难以提起学生的学习兴趣;第四,课时不断压缩,教学任务难以完成,教学压力越来越大,不得不减少教学内容,有些学校甚至把可以称作C语言精华部分的指针都已经取消;第五,考核方式不合理,造成应试教育效果,难以达到能力培养的效果。

二、C程序设计课程改革与实践

(一)上好第一节课

上好C程序设计的第一堂课很重要:首先讲明C程序设计的重要性;其次结合一些生动的C程序实例,展示C语言强大的功能,使学生对C语言的学习产生兴趣并狠下决心;再次 提出该课程的学习要求与学习方法,给出平时作业、上机试验、考试方式等具体要求[2]。

(二)教学模式改革

C程序设计教学模式改革以程序设计为主线,编程案例为驱动,培养高素质应用型专门人才为目标,注重分析问题、解决问题的能力的培养。该课程要求学生掌握结构化程序设计方的法和步骤,具有阅读和编写一定应用程序的能力,具有上机调试、正确运行程序的能力[3]。因此必须以学生为主体、教师为导向,利用现代化教学手段,改革《C程序设计》课程教学模式; 同时以应用型能力培养为导向,制定合理的教学大纲和教学计划,形成一套科学的课程教学体系。

(三)理论教学方法改革

课堂上采用案例教学和任务驱动教学等教学方法的有机结合,理论联系实际,有针对性地提出恰当的生活实例,让学生在一个个有趣的典型实例的驱动下,进行教学活动,引导学生逐步完成一系列任务,从而掌握了清晰的思路、解决方法和知识的脉络,并且在完成任务的过程中,培养了分析问题、解决问题以及程序设计的能力,同时拓展学生知识面。

(四)实践环节改革

1.C程序设计是一门实践性很强的课程,需要大量的上机实践。由于学校每周安排的上机时间仅仅为2小时左右,所以需要学生在上机前按照上机试验的要求,确定解决问题的思路并编写程序。这样既锻炼了学生独立调试程序的能力,又增强了学生编程解决较难问题的信心。

2.教师也要认真对待每节上机课,要细心组织安排每一次试验内容,让学生在试验前都有明确的上机目的和必要的编程准备。在实践过程中,作为教师对于上机试验内容应尽量精心设计,与所学的课堂知识结合起来,便于学生对知识的理解和消化,注重内容的实用性。 同时还要在实际操作中采用各种办法克服困难达到实验教学的效果。

3.试验结束时,学生按统一要求,提交实践程序到FTP,个别试验按老师要求写试验报告,教师把学生提交电子文件作为试验报告评分的参考依据。

(五)提高教师的效能感

教师效能是一种教师对自己的教学能力和专业知识能影响和帮助学生的信念。这种信念表明了教师对本身教学能力的自信程度。教师效能感通过对教师心理的作用影响教师的教学及其它行为,并以教师对待学生的外部行为为教师传递教育效能感的必由方式,并最终体现在对学生学业成就和人格等因素的影响上。教师效能感也会影响学生学习的积极性,影响学生的学习兴趣、学习态度和情绪情感活动。本团队强调教师必须具有效能感,方能更好的提高教学质量。

(六)教材修订

当前大部分C程序设计教材是传统的编排模式,即先介绍入门知识,然后是基础语法知识、数据类型、程序结构、指针、结构体、文件的读写。这种方法以知识点为主线,容易陷于语法细节,使学生容易判别错C程序设计课程的重点。本教学团队在以趣味性案例为目标的前提下重新编写了C程序设计教材,该教材以程序设计为主线,在阐述基本理论的基础上,组织了大量有趣的生活实例,每个实例包含了即将教学的理论知识。这样通过大量经典实例讲解和实训,使学生带着兴趣积极努力,不断培养和提高了学生的编程能力和创新精神。

(七)网络教学平台的构建

本团队努力构建了C 程序设计教学网站,该网站充分利用网络的开放性、共享性和协作性等特点和优势,对C程序设计教学内容重新进行规划和组织,为学生创造了一个集知识和趣味于一体的、包括个性化学习环境和协作式学习环境的开放性网络教学平台。将该课程的大纲、电子教案、教学进度计划、课件、经典程序源代码以及课外学习资料等教学资源上传到网站,为学生营造了一个自主学习的网络环境,将教学延伸到课堂外。这样学生既可以利用教学资源自主学习,还可以使用Email、QQ或 论坛等方式与教师进行交流,完全避免了时空限制,以达到更好的教学效果。

(八)改革单一的考核方式

本学院对C程序设计考核不再采用仅仅笔试的形式,而是笔试和机试相结合。与传统的笔试相比,上机考试可以考核学生实际上机调试程序的能力,考核分析问题,编程解决问题的综合能力,督促学生真正掌握程序设计课程的精髓。

三、近六年的期末平均成绩分析

笔者将本院计算机专业近六年的C程序设计课程的期末考试成绩进行了整理(每年选本届第一个班整理成绩),C程序设计课程期末考试中各项考核的平均成绩,按时间顺序分析发现尽管每年参加C程序设计考试的学生不同,但总体成绩大体呈现稳步上升,尤其是上机考试成绩在逐步提高,甚至出现超出笔试成绩的情况,这说明本团队对C程序设计课程的教学改革与实践取得初步成效,应用能力培养的结果逐渐凸显,诸多情况完全符合我校应用性本科建设的要求;笔试成绩尽管有所提高,但不太显著,说明学生的理论知识点掌握基本稳定。

本团队实施以上改革措施后,学生不仅对C程序设计课程有了极大的学习兴趣,而且程序设计思想和编程能力有了明显的提高。总之,教师应精心选择并钻研教材,把教材和学生实际相结合,再运用灵活多样的教学方法和恰当的教学手段,使教学过程最优化。C程序设计教学改革应该重视理论与实践相结合,在今后的教学过程中将不断地去完善。

参考文献:

[1] 谭浩强. C程序设计教程[M]. 北京,清华大学出版社,2007.

[2] 杨平. C语言教学改革探讨与实践[J] .电脑学习,2011(4). [3] 冯运仿. 《C语言程序设计》课程教学模式的研究与实践[J] .福建电脑,2012(1) .

作者简介:

祁昌平,男,(1976-),硕士,副教授,2013年国家青年骨干访问学者,主要研究方向为模式识别、人工智能、数据库技术等。

吴建军,男,(1971-),硕士,副教授,主要研究方向为网络技术、数据库技术等。

c程序范文第10篇

[关键词]C语言程序设计 探究教学 实施目标

中图分类号:TP312.1-4 文献标识码:A 文章编号:1009-914X(2014)17-0126-01

一、 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.

作者简介

上一篇:三维动画专业范文 下一篇:民事诉讼程序范文