C语言程序的基本构成_第1页
C语言程序的基本构成_第2页
C语言程序的基本构成_第3页
C语言程序的基本构成_第4页
C语言程序的基本构成_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1

上机实验中出现的问题一.编写时候注意符号在英文格式下面输入二.语句结束后“;”容易遗漏,但是也不能乱加,如while,if后面不能加”;”三.对于函数来说,基本格式:函数头+一对{}四.scanf和printf函数2

第2章

C程序的基本构成32.1C语言源文件

C语言是结构化的程序设计语言,一个C源程序可以由一个或多个文件组成,C源程序文件的扩展名一般为.c

或.cpp,下面通过实例学习多文件系统中的函数调用。

说明:文件-是指存放在存储器上以文件名进行管理的一组信息.

函数-指具有独立功能、按一定格式构成的代码段。

一个大型,典型的C语言源程序大致如下所示:4C语言源程序

源程序文件1

源程序文件n

源程序文件2…..

预处理命令

全局变量

声明

函数1…..

函数n

函数首部

函数体

局部变量

声明

执行语句5

文件包含的概念:一个文件可以将另一个源文件的全部内容包含进来,这叫文件包含处理。

当然文件包含予处理也可在特定的盘,特定的目录(文件夹)中寻找包含文件.

如:#include“c:\myfolder\myfile.c”

文件包含的一般格式:

#include<文件名>

或者#include“文件名”

6#include“file2.C”file1.cA

在编译时,将file2.c全部内容复制到#include“file2.c“的位置上,将file1.c作为一个源文件单位进行编译。file1.c

BA+Bfile2.c包含7例2.1

在VisualC++环境下新建两个文件,其文件名分别

为2_1_1.c、2_1_2.c,其中2_1_1.c文件定义一个做乘法的函数f(),定义另一个主调函数main().

在主调函数中分别调用函数f()以及存放在2_1_2.c中的函数disp(),在main函数中输出f()的返回值。82_1_2.c文件disp()函数分析:

在文件2_1_1.c中由两个函数构成,文件2_1_2.c由一个函数构成.

程序的执行从main()函数开始,main函数调用f()函数,然后再调用disp()函数。2_1_1.c文件f()函数main()函数#include“2_1_2.c调用调用910总结:

1.C程序是由函数组成,必须要包含一个主函数main().

函数之间可以相互调用.

因此,函数是C程序的基本单位。

(1).C用各种各样的函数来完成某些特定功能。

(2).

C函数库十分丰富,标准C提供一百多个函数.

被调函数可以是系统提供的库函数,如:printf(),

scanf();也可以是根据需要自己编写的函数,如:disp().112.一个C程序总是从main()函数开始执行,不管这

个main()在整个程序中处于什么位置。

main()函数可放在整个程序的最上头,或最后,或

一些函数的中间.3.C程序书写格式自由:一行内可以写几条语句.

一条语句可写在多行上,行尾使用续行符:“\”.

*书写程序时,一律使用英文标点符号.

12*C语言程序中区分大小写。

*在程序中int、return、include叫保留字,在C语言

中有特定的含义,一般不作它用。*而disp、f、a、b等为用户自定义标识符,通常为

了定义函数、变量所取的名字,取名要有一定的规

则。134.每条语句及变量定义的最后要有一个分号(;),

分号(;)是语句的必要组成部分。如:intx,y=7;c=a+b;

:变量定义必须放在函数的开头部分,执行语句之前,

不能插入在语句当中.C++可放程序任何位置.5.C语言本身并没有输入,输出语句.输入,输出的操

作是由库函数,像printf(),scanf()函数来完成。

C语言对输入、输出实行“函数化”管理。142.2C函数函数是完成特定任务的独立模块,函数的使用最主要涉及到函数的定义与调用。

C程序是由一个或多个文件构成,而文件可由一个或多个函数组成.

如在前述的文件2_1_1.c中,由两个函数main()、F()构成.

文件2_1_2.c由一个函数disp()构成。15一.函数的调用形式为:

函数名(

[参数]);

注:函数的原型:

函数返回值类型函数名(形式参数表);参数:

执行一个函数所必须提供的数据叫参数.16返回值类型函数名(形式参数声明){

数据声明部分语句部分

}二.

C函数定义的结构示意图17

intadd(intx,inty)

{

intz;/*变量定义,给变量分配内存空间*/z=x+y;/*执行语句*/returnz;

}

18注:在C语言中,变量在使用前,一定要先定义:

指定变量的名字及类型,在编译时给变量分配存储空间。

例如:

intz;

指定变量的名字为z,及类型为int.(在编译时给变量分配存储空间)。19变量的定义

变量定义的一般形式:

类型名变量名表;注:

变量名按C语言的命名规则命名.

变量名一般用小写字母,见名知义.例如:intx3,n;定义整型变量floaty2;定义单精度浮点型变量doublearea,length;

定义双精度浮点型变量

多个变量用逗号(,)分开,最后加一分号(;).20

每一个变量有二个特性:

有一个名字和相应的类型,并在编译时分配相应的内存单元。

该存储单元的大小由变量的数据类型决定.

1.5x3变量名变量值存储单元21C语言中的变量和代数中的变量含义不同.

数学中的变量代表未知数.

如在C语言中的式子:x=x+1在代数中没有意义.但在C语言中,式子x=x+1表示把变量x中的值加1,然后再保存到x中.

这里的”=“是赋值运算符.

构成了一赋值表达式.x=x+1222.3C语句

C文件由函数构成,函数由语句构成,语句的结束符用“;”表示.

在例2.1中的文件2_1_1.c中的main函数,由5条语句构成,每条语句用“;”表示语句的结束。

intx=3,y=4,z;---变量定义语句.表示定义了x、y、z三个变量,并给x、y分别赋予一个最初的值3与4.intx=3,y=4,z;disp();z=f(x,y);printf("%d*%d=%d\n",x,y,z);disp();disp();---函数调用语句.表示调用函数disp().输出:******************23

intx=3,y=4,z;

disp();z=f(x,y);printf("%d*%d=%d\n",x,y,z);disp();z=f(x,y);

表示调用函数f(),在调用函数f()时把实参x、y的值分别传给形参a、b.

返回值最后赋给变量z.

printf(“%d*%d=%d\n”,x,y,z);表示调用系统函数printf输出,其输出形式为:3*4=12intf(inta,intb){intc;c=a*b;

returnc;}在被调函数f()中把a、b的乘积赋给变量c,然后函数f()把返回值c赋给main函数中的z。242.4保留字与标识符语句由保留字、标识符、运算符和表达式构成。2.4.1保留字保留字是指C语言中有特殊含义的名字,只能用于C语言中特定的场合。

例如:

int:

用于定义整型类型变量

float:

用于定义实型变量

double:

用于定义双精度变量

char:

用于定义字符变量或字符串变量

25注意:保留字只能用于规定的场合,不能用作给变量取名或用户自定义标识符。if:

用于判断for:

用于循环while:

用于循环在C语言中其它的保留字见附录C,其含义在以后的章节中陆续学到。262.4.2标识符

标识符简单的理解就是给在程序中涉及的对象取的名字.

标识符分为系统命名的标识符与用户自命名标识符,系统标识符通常用于系统函数的命名,如:

printf、strlen、scanf、fabs、malloc等。

用户自命名标识符是用户为命名变量或定义函数等而取的名字,通常用户自定义标识符以字母、数字、下划线组成,并以字母或下划线开头。27注意:

a_12、_12、ab12等都是正确命名的标识符。

12a、a/b等都是不正确的标识符。思考:是否可用:intif=5;

定义一个整型变量?为什么?282.5运算符在C程序中有极为丰富的运算符,例如:

赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符等。

运算符及其优先级请参阅附录292.5.1算术运算符算术运算符有:加、减、乘、除、取余数,它们的表达方式及含义如下表所示。运算符含义例备注

+加5+2结果7-减5-2结果3*乘5*2结果10/除5/2结果2%求余5%2结果1只适用于整型数

++

自增

--

自减

30

算术运算符的优先级:运算符

+-*/%

相同相同低高311.关于除法运算符:/

两个整数相除结果为整数:5/2结果25/3结果1

2.关于求余运算符:

%

%两边的操作数都应是整数.

5%2结果1

7%4结果3

除法运算符”“/“的运算结果跟两个操作数的类型有关:(1).如果两边都是整形,结果必定为整形.(2).如果两边是其它类形,结果不是整形.323.C语言也规定了算术运算符的优选级和结合性。

在表达式求值时:*先按运算符的优先级别高低次序执行,如a-b*c,

*如果在一个运算对象两侧的运算符级别一样,则按

“结合方向”处理。

算术运算符的结合方向是“自左至右”,即先左后右.又称“左结合性”——

即运算对象先与左边的运算符相结合。33

如:

a-b+c

,因此b先与减号结合,执行a-b的运算,再执行加+c的运算.

以后还将遇到“右结合性”的运算符,其结合方向为自

右至左。即运算对象与右边运算符的相结合.

结合性是在别的高级语言中没有的,是C特有的。请参阅附录:

列出所有运算符的优先级和结合性。343、算术表达式

:算术表达式:

用算术运算符将运算对象连接起来的,符合C语言语法规则的式子.

什么是表达式?由常量,变量,各种运算符,函数和括号连接而成的,合符c语言语法规则的有意义的式子,称为表达式。如:

a+23,t+sqrt(y),z=x+y,Pi*r*r35从广义上来讲,单个变量,单个常量也可看作表达式。

c具有众多运算符,可以构成多种表达式:

赋值表达式,算术表达式、字符串表达式、

关系表达式,逻辑表达式.36算术表达式的书写规则:

在数学表达式中省略的内容要写上:

如:2x

要写成2*x2r要写成2**r

abca<=b&&b<=cs(s-a)(s-b)(s-c)要写成

s*(s-a)*(s-b)*(s-c)

(5÷9)(F-32)

要写成

(5/9)*(F-32)

x1+x2要写成x1+x237

4.自增、自减运算符:

在算术运算符中,C语言又增加了两个很有用的运

算符:

++

……

加1运算符(自增)

--

……

减1运算符(自减)作用:

使变量的值加1或减1。如;

++x;相当于x=x+1;

--x;相当于x=x-1;

38

增1,减1运算符可放在操作数之前,也可放在其后。如:

++i,--i变量使用之前,先使i

增1,减1.

i++,i--变量使用之后,再使i加1,减1设:i=3;

j=++i;(j的值为4)j=i++;(j的值为3,i的值为4)注意!39例:

main(){inta=100;printf(“%d\n”,++a);printf(“%d\n”,a++);printf(“%d\n”,a);}结果:

10110110240(2).结合方向是“自右至左”,即“右结合”.

如有:-i++

负号和“++”同一优先级,结合方向同为“自右而左”,即相当于-(i++).

注:(1).++,--运算符只能用于变量,不能用于常量与表

达式。

如:5++,(a+b)++都不合法.41思考:表达式y=1+x++

是否等同于x++,y=1+x

还是等同于

y=1+x,x++?42上机练习21:上机调试下列程序,总结余数的符号与什么相关。#include<stdio.h>intmain(){

printf("%d%d\n",5%2,-5%2);return0;}432:上机调试下列程序,分析程序输出的结果。#include<stdio.h>intmain(){intx,y,z;

scanf("%d",&x);y=x++;z=++x;printf("y=%dz=%dx=%d\n",y,z,x);}&的含义是“取地址”的意思,函数的作用是:

从键盘输入的两个值,分别送到x所占地址的内存单元中去,也就是输入x的值.

%d为输入格式说明,d为十进制整数格式说明符。

现设给x输入了一个5,问:y,z,x输出各为多少?输出:y=5,z=7,x=744

又:#include<stdio.h>intmain(){intx,y,z;

scanf("%d",&x);y=x--;z=--x;printf("y=%dz=%dx=%d\n",y,z,x);}

3:把前程序中的++都改为--,再次调试程序,观察程序运行的结果。

现设给x输入了一个5,问:y,z,x输出各为多少?输出:y=5,z=3,x=345

5.赋值运算符:=

在C中,把赋值符“=”也列为运算符之列,“=”执行赋值操作。如:y=23.3x=45.3+y*4执行过程如下:

变量=表达式注:

左边必须是一个变量.

1.

首先计算表达式的值.

同时把其类型转为左边变量的类型.

2.把右边表达式的值赋

给左边的变量.46说明:1.如果在赋值运算中,赋值符两侧类型不一致,在赋值时要进行类型转换。规则:

赋值符右边的值转变为赋值符左边变量所属的类型(系统自动转换)。

例如:

a.将实型数据赋给整型变量时,小数部分自动丢失。

inti;i=8.56;(i为整型变量,

i的值就为8)47b.将整型数据赋给实型变量时,数值不变,但以浮点形

式存于内存。

如:floatf2;f2=28;

f2将以28.000000存于内存。

(单精度以6位有效数字存入,

双精度有15位有效数字)48例:

若x是整型变量,表达式(x=10.0/4.0)的值是____

A.2.5B、2.0C、3D、2496、复合赋值运算符:(1).如果在赋值符‘=‘之前加上其它运算符,可构成

复合赋值运算符,如:

+=(相加赋值)

*=

(相乘赋值)

例如:

a+=

3相当于a=a+3x*=y+8相当于x=x*(y+8)x%=3相当于x=x%3

C采用这种形式,一是为了简化程序,二是为了提高编译效率。

凡是二目(二元)运算符,都可与赋值符组成复合赋值符.50

为了便于记忆,可以这样理解:

设有

:a+=b又设a为变量,b为表达式

a+=b(“=”左边部分,插入“=”右边)

a=a+b(“=”左边补上变量名)

如果b表达式是包含若干项的表达式,它相当于有括号:

x%=y+3x%=(y+3)x=x%(y+3)51(2).赋值表达式:

由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”.

如:

“a=5*b”

就是一个赋值表达式,赋值表达式的值就是

被赋值的变量的值.

527、强制类型转换运算符

如:(double)a2….(将a2变量强制转换成double型)

(int)(x+y)...(将(x+y)的类型强制转换int型)

一般形式为:(类型名)(表达式)说明:进行强制类型转换时,得到一个所需的中间变量,

原来的变量类型不变。例:floatx1;inti;x1=13.6;i=(int)x1

;\*i的值为13*\53

类型转换有二种方法:

a.系统自动进行.

b.强制进行.

强制类型转换在函数调用时,当要求形参与实参的类型一致时使用。542.5.2关系运算符一、关系运算符与关系表达式:

关系运算符也就是一种比较大小的运算符。1.关系运算符及优先级:

<

(小于)

<=

(小于等于)

>

(大于)

>=

(大于等于)

==

(等于)低

!=

(不等于)

优先级相同(低)优先级相同(高)55

算术运算符:*,/,%

+,-

高关系运算符:<,<=,>,>=,==,!=

赋值运算符:=

复合赋值运算符:+=,%=,*=

运算符的优先级请见附录B562.关系表达式:

用关系运算符将两个表达式连起来的式子——关系表

达式。关系表达式由于是一种比较的操作,其结果是成

立,不成立的关系。

也即产生一个逻辑值

,“真”或“假”。

C语言中没有设逻辑型数据.

C中用1代表逻辑真,0代表逻辑假。0~157

如:设:a=4,b=3,c=2;

则:(1).a>b的值为“真”,表达式的值为1.

(2).d=b>c/*d的值为1

.*/(3).e=a>b>c/*e的值为0.*/

/*因“>”运算符自左到右结合,先执行a>b,值为1,再执行1>c,值为0*/

(4).f=(a>b)+af的值为558思考:表达式y=6<10==1

它等同于

y=(6<10)==1

还是y=6<(10==1)?

算术运算符:*,/,%

+,-

关系运算符:<,<=,>,>=,

==,!=

赋值运算符:=

592.5.3逻辑运算符1.逻辑运算符及优先级:逻辑运算符是对逻辑量进行操作.共有三种:

!

……逻辑非(NOT)

(对操作数取反,如操作数为真,结果就为假.)

&&……逻辑与(AND)

(只有两个操作数的值同时为真时,结果为真.)

||……逻辑或(OR)

(只要两个操作数中的一个值为真时,结果就为真.)高

低60

逻辑运算符的功能

逻辑与:

&&

,

逻辑或:||,逻辑非:!真值表:

aba&&ba||b!a假假假假真假真假真真真假假真假真真真真假

&&,||是双目(二元)运算符,!是单目(一元)运算符.61

优先级:

逻辑运算符:!

算术运算符:+,*

关系运算符:>,=<

逻辑运算符:&&,||

赋值运算符:=低62例:(a>b)&&(x>y)a>b&&x>y

(!a)||a>b!a||a>b2.逻辑表达式:

用逻辑运算符将关系表达式,或逻辑量连起来的式

子,叫逻辑表达式。逻辑表达式的值应该是一个逻辑量:真(1),假(0).63

但在判断一个量是否为真或为假时,即以非0为真(包括负值),以0值为假.

这种表示方法法最先在C中使用,因为它使得编程显示特别方便。说明

:

C语言在编译时,给出逻辑运算结果时(如关系表

达式、逻辑表达式),如果是真,用数值1表示;

是假用0表示。64例:设a=4,b=5

那么:

!a的值为0(因为a的值为非0,认为是真)

a&&b的值为1.

a||b的值为1.4&&0||2的值为1(自左向右运算).可见:

(1).逻辑运算结果不是0,就是1.(2).参加逻辑运算的操作数可以是1,0(真,假),也可是

整数,也可以是任何类型的数据。系统最终是以:

0判断为假,非0判断为真.65例:求表达式的值:5>3&&2||8<4-!0①4-!0即:3得:5>3&&2||8<3②5>3结果为1;8<3结果为

0

得:1&&2||0

③1&&2结果为1

最后结果为1

注:

逻辑表达式求解自左向右,且一旦知道结果的真假

值,求值即停止。例.

若设:a=1,b=1,c=3,d=4,m,n原值为1,那么:(m=a>b)&&(n=c>d)

则m新值为0,n不再赋值。

661.判断ch是否为小写英文字母:

(ch>='a')&&(ch<='z')2.判断ch是否为英文字母:(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')

熟练掌握关系运算符和逻辑运算符,可以巧妙地用一个逻辑表达式来表示一个复杂的条件。

67例:闰年的条件:a.能被4整除,但不能被100整除

b.能被400整除

设year为某一年份,year为闰年的表达式:((year%4==0&&year%100!=0)||year%400==0)

当上述逻辑表达式为1时,year这一年为闰年,当为0时,year这一年为非闰年。68例2.3

#include<stdio.h>intmain(){intx=20,y=3,z=0,a;a=x>y;printf("%d>%d=%d\n",x,y,a);

a=x/y;printf("%d/%d=%d\n",x,y,a);

a=x%y;printf("%d%%%d=%d\n",x,y,a);

….ch2_2_3.c输出符号%时,需写成:69…..

a=x==y;printf("%d==%d=%d\n",x,y,a);

a=x!=y;printf("%d!=%d=%d\n",x,y,a);

a=x&&y;printf("%d&&%d=%d\n",x,y,a);

a=x||y;printf("%d||%d=%d\n",x,y,a);

a=!x>y;printf("!%d>%d=%d\n",x,y,a);}70注:由于%通常用于格式控制符中,当在printf中输出符号%时,需写成:

printf(“%d%%%d=%d\n”,x,y,a);,而不是:

printf("%d%%d=%d\n",x,y,a);

说明:

在编译新程序前要关闭前一程序的[工作空间]。

注意!71思考:1.写出判断x大于0并且小于10的表达式。

(x>0)&&(x<10)2.写出判断ch是大写字母的的表达式。

3.写出判断ch是字母的表达式。

4.写出整型数a、b、c能构成一个三角形的表达式。722.5.4位运算符位运算符的运算对象为二进制数.

运算符含义1.

~

按位取反例:

~1结果0~1010结果0101

2.

&

按位与

例:

1&1为1;1&0为01100&1010结果1000733.

|

按位或

例:

1|1为1;1|0为1;0|0为0.

1100|1010结果11104.

^

按位异或例:

1^1为0;0^0为0;1^0为1.1100&1010结果01107475

5.

<<

按位左移例:

0010<<1

左移1位结果01006.

>>

按位右移例:

0010>>1

右移1位

结果000176例2.4

从键盘输入一个整型数,判断此数转化为二进制数后第2位是否为1。分析:假定此整数为12,转化为二进制后为1100(你可以用windows中的计算器转换).

判断第2位是否为1,即此数只要与二进制数0100作“与”运算.

如结果不为0,即可判断此数的二进制数的第2位不为0.第0位77数制与编码二进制与八进制、十六进制之间相互转换准备知识:①二进制与八进制的对应关系

②二进制与十六进制的对应关系不同数制之间的转换0000010100111001011101110123456700000001001000110100010101100111012345671000100110101011110011011110111189ABCDEF78#include<stdio.h>intmain(){ intx,y; scanf("%d",&x); y=(x&4)!=0; printf("此数的二进制数的第2位为:%d\n",y);}

请读者自行调试,如程序运行时分别输入7、8,输出是什么?为什么?ch2_2_4.c输入12

(12)

1100

(4)

0100

792.6编辑C程序时应注意的问题1.C程序中区分大小写字母,书写格式自由,一行内可写几个语句。用“;”作为语句的结束标记。3.函数定义如:main()、#include<stdio.h>、#definePI3.14159不是语句,后面不能用“;”号。注释用符号“/*”和“*/”来界定,“/”和“*”之间不可以有空格。一个好的程序应该有详细的注释。80

第2章

C程序的基本构成

结束81例:

执行下列程序段后,a值为____: inta,b; a=15;b=-1; a=a+b&&a;

A)15B)0C)1D)16例:写出下列程序段的输出结果:

floatx1,x2;x1=3/2;x2=x1/2;printf("%d,%.1f",(int)x1,x2);C).11,0.53/2的值为182练习与实践一、选择题1.()是构成C语言程序的基本单位。(A)函数 (B)过程(C)子程序 (D)文件832.在下述程序段中,()是错误的程序注释方法(注:本例多个选择)。(A)

#in/*包含*/clude<stdio.h>voidmain(){printf("Howareyou?\n");}(B)#include<stdio.h>voidmain(){inti=3;/*整型数*/}84(C)#include<stdio.h>voidmain(){intx/*初始化*/=10;/*打印*/printf("%d",x);}(D)#include<stdio.h>voidmain(){intx=10;printf("%d",x);/*打印x/*x=10*/的值*/}853.()是C语言提供的合法的数据类型关键字。(A)Float (B)signed(C)integer (D)Char4.以下选项中不合法的用户标识符是(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论