C语言教案.docx
《C语言教案.docx》由会员分享,可在线阅读,更多相关《C语言教案.docx(70页珍藏版)》请在冰点文库上搜索。
C语言教案
C语言教案
第一章导论
一、对学习程序设计语言的一些说明
程序、程序设计、程序设计语言
程序设计语言的分类、作用
当前实用的程序设计语言
C语言的特点
二、C语言基础
●字符集:
大、小写字母,数字,特殊字符,不可打印字符
●标识符:
标识符是用来标识常量、变量、类型、函数及程序的名字。
标识符的组成规则:
以字母或下划线开头的字母、数字串。
特殊标识符:
关键字如int,char,do,if,_ax,pascal,include等(见P6)
特殊标识符不能用作自定义标识符。
●C语言的程序结构:
由一个或多个函数构成,有且仅有一个名为main的主函数,程序的执行是从主函数开始的。
函数由函数头和函数体两部分组成,函数头包括函数类型说明、函数名、函数标志和参数等;函数体由语句组成并用花括号({})括起。
如程序:
#includemain(){intw,x=30,y=60;intz=10;
printf(“\nEnteraint_num:
”);
scanf(“%d”,&w);z=max(x,y);
w=max(z,w);
printf("max=%d\n",w);
}
intmax(inta,intb)
{if(a>b)return(a);elsereturn(b);}
对照此程序说明C语言的程序结构。
●C语言程序上机操作步骤(TurboCVER2.0)
建立源程序,编译与连接,运行
(解释方式与编译方式的区别在哪?
)
可用TCC进行编译。
TC的集成开发环境:
启动(Options项中工作目录的设置)
输入上面给出的示例源程序,指定文件名保存
ALT+R让编译、连接、运行一次过
ALT+F5查看运行结果
说明程序中第一行的功能、执行过程
C语言的书写格式说明:
一般语句以“;”号结束,一行内可写多个语句,也可把一个语句分成几行来写,关键字都使用小写字母。
程序出错的修改处理:
语法错误——去掉if语句中间的分号试试看;
逻辑错误——去掉scanf语句中w前的&看看。
一个程序验证完成后怎样开始新的程序
常用菜单项说明。
第二章基本数据类型及表达式
一、基本数据类型
每一个数据在使用前必须给出其数据类型,数据类型分基本类型和扩展类型。
基本类型有:
整型(int)
字符型(char)
实型(又分单精度型——float,双精度型——double)
无值型(void)
其中char和int类型双可用signed、unsigned、long、short来修饰。
(各种类型的存储和取值参见P13表2-3)
扩展类型如数组类型、结构类型、指针类型等。
二、常量及变量
1.常量
●整型常量
十进制:
如25,0,-38
八进制:
如025,-038(以0开头)
十六进制:
如0x25,0X1f(以0X或0x开头)
[注]在整型常量后加l或L表示longint类型,如25L。
●实型常量(浮点型常量)
有小数和指数两种表示形式。
如:
-1.23,1234.567,2.5E3,2E+4,2.3E-2.
但下列表示是不合法的:
E3,2.5E,4.3E2.5
●字符型
用单引号引起的单个字符或转义序列。
如:
‘A’,‘5’,‘\012’(回车动作)
●字符串常量
用双引号引起的字符序列或转义序列。
如:
”Computer”
C语言编译程序在存储字符串常量时,自动在结尾处加空操作字符’\0’作为字符串结束标记。
因此sizeof(“Computer”)测试结果字符串长度为9。
2.变量
变量用一般标识符来命名(不区分大小写)。
使用变量前必须事先说明并指明数据类型,也可以给变量赋初值。
变量说明的一般格式为:
<类型说明符><变量名列表>;
类型说明符是上面说过的数据类型,如int,char等。
例如:
inta1,b1,c1;
longww=5825125,vv;
floatx,y=123.45,z=18;
doubled;
char_c1=’A’,_c2=’0’;
【说明】①整型与字符数据之间可以相互赋值。
给字符型变量赋值时要注意数值的大小,赋值超过255时将输出一个不认识的图形字符。
②整型与实型数据之间可以相互赋值。
如在上面的变量说明后,可以进行如下赋值:
_c2=48;a1=_c1;
d=128;b1=y;
3.转义序列
以“\”开头,后跟一个规定字符。
如‘\n’表示输出换行。
也可以是形如\ddd(八进制)或\xhh(十六进制)的表示方式。
如‘\012’。
三、运算符
1.赋值运算符
赋值语句又称赋值表达式,格式为:
<变量名>=<表达式>
如:
a=a+b;
b=a+b/c;
运算结果的类型按预先说明的变量类型进行转换。
二目运算符与赋值运算符一起构成得合运算符。
如A+=B,相当于A=A+B;A/=B相当于A=A/B。
2.算术运算符
有+,-,*,/,%(取余);
*,/,%的优先级高于+,-运算,同一优先级自左向右处理。
可用圆括号改变运算顺序。
如:
X+Y*Z
(X+Y)*Z
3.关系运算符
有六种:
<,<=,>,>=,==,!
=
优先级:
==和!
=的优先级低于前四种;
关系运算符的优先级低于算术运算符,高于赋值运算符。
如:
A+B>C+D
结果只有两种:
真
(1)、假(0)。
4.逻辑运算符
优先级从高到低有:
!
&&,||
·前述四种运算符的优先级从高到低的顺序为:
!
→*,/,%→+,-→>,>=,<,<=→==,!
=→&&,||→赋值符(=)
5.Sizeof运算符(应该叫函数)
得到操作数所占存储空间的字节数。
如:
sizeof(int);/*结果为2*/
sizeof(5+6.3)/*结果为8,所有实数按double处理*/
6.自增减运算符
++〈操作数〉/--〈操作数〉/*操作数使用前先自动加(减)1*/
〈操作数〉++/〈操作数〉--/*操作数使用前后再自动加(减)1*/
·自增减运算只能用于变量,不能用于常量和表达式。
-I++相当于-(I++)。
7.地址和地址运算符
C语言具有低级语言的功能,提供对计算机存储单元地址的访问。
有地址运算符&和*,若a为变量名,则:
&a——表示取变量a存储的首地址;
a——称间址运算,说明变量a是一个指针变量。
指针变量的值是另一个变量的地址(用*a可访问另一变量的值)。
8.其他运算符
·条件运算符“?
:
”——如result=a
a+b:
a-b;
·园括号和方括号操作符——园括号改变优先级别,方括号用于标识数组元素的下标。
·点.与箭头操作符——用于结构和联合类型。
·逗号,操作符——用于连接几个表达式。
假设y=10,则x=(y-=5,25/y)相当于y=y-5;x=25/y;
四、表达式
由操作数和运算符按一定顺序连接起来的式子。
如:
a+b/2
!
(a<=100)&&!
(a>=200)
注意表达式的运算结果的类型。
例:
若有以下定义:
chara;intb;
floatc;doubled;
则表达式a*b+d-c值的类型为double。
表达式中可以利用强制类型转换运算将一个表达式转换成所需类型,但不影响原变量的类型。
如(int)a+(int)(x+y).
第三章程序控制语句
一、程序的三种基本控制结构
·顺序结构——按语句书写的自然顺序执行
·分支结构——根据判断条件的真
(1)与假(0)执行不同的语句序列
·循环结构——在一定条件下多次重复执行某一相同的语句序列
(控制结构的框图表示,框图形状的说明)
·程序设计规范
限制使用goto语句、设计风格(从属关系低格书写,注释,易读)、模块程序
设计方法。
二、简单及其程序设计
1.赋值语句
C语言中有赋值表达式,又有赋值语句。
如赋值语句:
a=b=c+d;
这在很多高级语言(如FoxBASE)中是错误的语句,但在C语言中是正确的,相当于
a=(b=c+d);
可把右边的等号看成是赋值运算符,左边的等号看成赋值符号。
从C语言的赋值运算
从右向左结合的规则看也应是这样的。
2.函数调用语句
C语言程序是由一个一个函数组成的,函数间互相调用形成完整的系统。
函数有两种:
标准库函数和用户编写的函数(如第一章例中的max函数)。
这里介绍的是几个标准输入输出函数,使用这些函数时应在源程序中加入程序行:
#include
函数调用语句的一般格式为:
<函数名>([<参数表>]);
[注意<参数表>在不同函数中的使用格式,并对照各函数加以说明]
(1)putchar()函数——输出单个字符
例:
#includemain(){chara='2';putchar(a);putchar('5');putchar('\n');}
输出结果为:
25
(2)printf()函数——格式输出函数
调用格式为:
printf(<格式控制>,<参数表>);
其中<格式控制>是用双引号括起来的字符串,可用“%”加规定的控制字符组成输出格式(如%d,%c,%f,%s),其他字符原样输出;<参数表>中是要输出的数据或表达式,参数个数必须与<控制格式>中说明的控制字符个数相同,且按顺序一一对应。
C语言规定的控制字符有%c,%d,%e,%f,%g,%o,%s,%u,%x,%%,另有附加格式字符l,m,n,-。
各控制字符的格式控制说明见P34表3-1、表3-2。
(举例说明各种控制字符控制的输出格式)
例:
.....................
(3)getchar()函数——从键盘输入单个字符
无参数,只接收一个字符,可以赋给字符或整型变量,也可作为表达式使用。
程序运行时为了看清结果可用此函数实现暂停。
例:
#include
main()
{inta,b,c;
a=5;b=3;
c=a+b;
printf(“%d+%d=%d\n”,a,b,c);
c=getchar();/*若输入多个字符,只接收第一个字符。
回车也作为一个字符*/
}
(4)scanf()函数——格式输入函数
调用格式为:
scanf(<格式控制>,<参数表>);
其中<格式控制>中的控制字符与printf()相似(见P39表3-3、表3-4);<参数表>中的参数一般是变量的地址,不能是变量名,参数表中地址变量必须与格式控制字符一一对应。
例:
#include
main()
{floata,b,c;
printf(“Enter3Number=”);
scanf(“%f%f%f”,&a,&b,&c);
/*变量中前加“&”表示取变量的地址,数组除外*/
printf(“%f,%f,%f,%f\n”,a,b,c,(a+b+c)/2);
}
程序运行时若输入数据为:
582<回车>
输出结果为:
5.000000,8.000000,2.000000,7.500000
◆若输入数据为:
5,8,2<回车>
结果为:
5.000000,0.000000,0.000000,2.500000
若输入数据为:
58<回车>
2<回车>
结果为:
5.000000,8.000000,2.000000,7.500000
改scanf()函数控制格式为:
scanf(“%f,%f,%f”,&a,&b,&c)再试试看,结果如何?
【注】①格式控制中的空白字符(或无任何字符),在输入数据时可用空格、制表符和换行符;若在控制字符间有非空白字符,则在输入时,数据项间一定要加上与之相同的字符。
②输入数据时不能规定精度,但可指定输入数据所占列数。
③“*”号紧随%之后,表示跳过与之相应的数据。
④在输入数据时,遇下列情况时认为输入已结束:
空格、宽度结束、非法输入。
4.空语句
只有一个分号(;)
5.复合语句
用花括号({})括起来的一组语句。
用于条件语句和循环语句的循环体。
三、条件语句及其程序设计
1.条件
有关系表达式和逻辑表达式两种,表达式的结果不是真
(1)就是假(0)。
(六种关系运算符,三种逻辑运符,可以与其他运算符、表达式混合使用)
所有非零值均视为真。
◆注意条件的构成形式,如(a&&b)+5,!
a+5将永过为真,不是你想要的,且不会提示语法错误。
2.if语句
格式:
if(<条件>)<语句1>;
[else<语句2>];
用框图表示,看执行方法。
说明:
<条件>一定要用园括号括起;
语句1、语句2可以是简单语句,也可以是复合语句或空语句;
else部分用方括号括起表示可选;
else之前要有分号(;)或“}”号;
所有关键字一律用小写。
例:
从键盘输入一个整数,判断它的正负(不考虑0)。
main()
{intx;
printf(“Enterainteger=”);
scanf(“%d”,&x);
if(x>0)
printf(“x=%d,>0\n”,x);
else
{printf(“x=%d,”,x);printf(“x<0\n”);}
}
3.if语句的嵌套
在if语句的语句1或语句2中又包含另一个if语句时,称为if语句的嵌套。
常见形式有:
if...if...
elseif...if....
..............else....
elseif...else
else...if...
else...
例:
从键盘输入一个整数,判断它的正负(考虑0)。
main()
{intx;
printf(“Enterainteger=”);
scanf(“%d”,&x);
if(x>0)
printf(“x=%d,>0\n”,x);
else
if(x<0)
{printf(“x=%d,”,x);printf(“x<0\n”);}
}
在if语句的嵌套结构中要注意if与else的配对关系:
else总是与上面最近的if配对,但可使用复合语句格式改变这种配对关系。
如:
if(条件1)
if(条件2)语句1;
else语句2;
比较:
if(条件1)
{if(条件2)语句1;}
else语句2;
4.开关语句switch
是多路分支语句,可以替代有规律的if语句嵌套结构。
格式为:
switch(<表达式>)
{case<常量1>:
[<语句1>]
case<常量2>:
[<语句2>]
......
case<常量n>:
[<语句n>]
[default:
<语句n+1>]
}
说明:
◆switch后的表达式结果只能是整型或字符型(有序类型);
◆执行时依次判别常量值是否等于表达式的值,当某一常量值等于表达式值时,执行该常量后的语句;后面的所有语句将自动执行而不再判断,因此每个case分支的末尾应加上break语句以跳出switch语句;
◆若所有常量值均不等于表达式的值,则执行default后的语句而结束switch结构;
◆每个case后常量的值应互不相同;
◆case的书写顺序不影响程序的执行;
◆多个case可共用一组语句(见P46例3-20)
例:
main()
{inta;
scanf(“%d”,&a);
switch(a)
{case1:
printf(“1”);
case1:
printf(“2”);
case1:
printf(“3”);
case1:
printf(“4”);
default:
printf(“error.\n”);
}
}
程序运行时,若输入2,则输出为:
234error.
可在每一printf函数后加一个break语句。
这种语句常可用于编写象FoxBASE一样的菜单程序。
四、循环语句及其程序设计
C语言中提供了三种循环语句:
for、while、do—while
1.while语句
格式:
while(<条件>)
<语句>/*循环体*/
先对<条件>进行判断,为真(非0)时执行循环体。
若<条件>一开始就为假,则循环体一次也不执行。
例:
从键盘输入一组整数,统计正整数个数并求它们的和(输入0时结束)。
#include
main()
{intx,n=0;
longs=0;
scanf(“%d”,&x);
while(x<>0)
{if(x>0)
{s=s+x;n=n+1;}
scanf(“%d”,&x);
}
printf(“n=%d,s=%d\n”,n,s);
}
说明:
while语句一般用于循环次数未知的情况;<条件>中使用的变量要先赋初值,且使其值在每次循环中不断变化,以免造成死循环;防止将<条件>中的“==”误写成“=”而造成死循环(这在任何<条件>中都应注意)。
2.do—while语句
格式:
do
<语句>/*循环体*/
while(<条件>)
与while语句相似,只是先执行循环体,后判断条件,<条件>为假时结束。
◆循环体至少执行一次。
问:
用do—while语句如何改写上例程序?
例:
输入一个正整数,判断该数是否为素数。
#include
main()
{intx,i=1,f=0;
scanf(“%d”,&x);
do{
i++;
if(x%i==0)f=1;
}while(i<=x/2);
if(f)printf(“No\n”);
elseprintf(“Yes\n”);
}
例:
求两个数的最大公约数和最小公倍数。
#include
main()
{intx,y,i,flag;
printf(“Enter2integer:
”);
scanf(“%d%d”,&x,&y);
i=x;flag=0;
if(x>y)i=y;
do{
if(x%i==0&&y%i==0)flag=1;
elsei--;
}while(!
flag);
printf(“%d%d\n”,i,x*y/i);
}
3.for语句
for语句一般用于循环次数已知的情况。
格式为:
for([<表达式1>];[<条件>];[<表达式2>])
<语句>
这里,<表达式1>是给循环控制变量赋初值;<条件>是用循环控制变量的值与终值进行比较;<表达式2>是修改循环控制变量的值(增加或减少步长)。
如:
for(i=1;i<=100;i++)
sum=sum+i;/*sum=1+2+3+…+99+100*/
说明:
for语句可以用while语句来实现,等价于
<表达式1>;
while(<条件>){
<语句>;
<表达式2>;
}
for语句中各表达式可以省略,形如:
for(;;)<语句>;
将是一个死循环,要想结束循环,可通过其它手段完成(如用break)。
例:
用for语句编写程序,判断一个正整数是否是素数。
(程序略)
例:
输入20个数,按每行5个数输出,并求最大数和最小数。
4.break语句和continue语句
这两个语句都不带任何参数。
break用于跳出switch和循环结构;continue用于结束本次循环,重新开始下一次循环。
在其它地方不能使用它们。
五、goto语句及标号
C语言虽然提供了goto语句,但应尽量不用,它会影响程序质量。
goto语句的一般格式为:
goto<标号>;/*标号只能是标识符*/
标号用来标识某语句的位置,格式为:
<标识符>:
<语句>;
说明:
goto语句只能在所在函数内进行跳转,且标号唯一;
goto语句可与if语句一起构成循环结构;
gogo语句可用来从循环体内跳到循环体外,但不能从循环体外跳到循环体内。
六、多重循环及举例
循环体内又包含另一循环称多重循环(循环不能交叉)。
结构说明:
.......................
例1:
输出1-100间的所有素数。
#include
main()
{intx,i,f,n=0;
for(x=2;x<=100;x++)
{f=0;i=1;/*对每个x都假定它是素数f=0,注意语句的位置*/
do{/*内循环判断x是否为素数*/
i++;/*这样的内循环会少输出一个素2,应改用while语句,怎么改?
*/
if(x%i==0)f=1;
}while(i<=x/2);
if(!
f)
{printf(“%5d”,x);n++;/*按5位字符宽度输出一个素数*/
if(n%5==0)printf(“\n”);/*实现每行输出5个数*/
}}
}
例2:
打印如下数字图形。
1
121
12321
1234321
...................
程序如下:
#include
main
{inti,j,n=8;
for(i=1;i<=n;i++){
for(j=1;j<=n+1-i;j++)printf(““);/*打印每行左边的空格*/
for(j=1;j<=i;j++)printf(“%2d”,j);/*打印前半行*/
for(j=i-1;j>=1,j--)printf(“%2d”,j);/*打印后半行*/
printf(“\n”);/*换行*/
}
getchar();/*暂停*/
}
[问]:
如何实现一个循环控制输出一整行?
用for(j=-i+1;j<=i-1;j++)if......
★阅读下列程序或程序段,写出运行结果或回答问题:
1.main()
{intx,i;
for(i=1;i<=50;i++)
{x=i;
if(++x%2==0)
if(x%3==0)
if(x%7==0)
printf("%d",i);
}
}
/*28/27/42/41*/
2.假设a和b为int型变量,则执行以下语句后b的值为?
a=1;b=10;
do
{b-=a;a++;}
while(b--<0)
/*9/-2/-1/8*/
3.设j为int型变量,则下面for循环语句的执行结果是?
for(j=10;j>3;j--)
{if(j%3)j--;
--j;--j;
printf("%d",j);
}
/*63/74/62/73*/
4.main()
{inti,j;
for(j=10;j<11;j++