《C语言程序设计》.ppt_第1页
《C语言程序设计》.ppt_第2页
《C语言程序设计》.ppt_第3页
《C语言程序设计》.ppt_第4页
《C语言程序设计》.ppt_第5页
已阅读5页,还剩513页未读 继续免费阅读

下载本文档

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

文档简介

1、C语言程序设计,主编 任正云 中国水利水电出版社,第1章 程序设计基础,1.1 程序设计及程序设计语言,程序是以某种语言为工具编制出来的能被 机器识别并执行的一系列的指令代码,1.1.1 程序设计语言,1.1.2 C语言的发展过程,1.1.3 C语言的标准,1.1.1 程序设计语言,程序设计语言可以分为低级语言和高级语言两大类,1低级语言,低级语言又叫面向机器的语言,它是特定的计算机系 统所固有的语言,又可分为机器语言和符号语言(汇编 语言)两类,机器语言就是计算机能够直接识别并执行的指令集 合。由于计算机只能识别“0”和“1”两种状态,所以机 器语言指令都是二进制指令。例如某种型号的计算机

2、用10000000表示“进行一次加法”,用10010000表 示“进行一次减法,符号语言是从机器语言发展演变而来的,它用一些 “助记符号”来代替那些冗长的二进制指令。例如用ADD 表示加法,SUB表示减法,等等,2高级语言,高级语言是类似于人类自然语言和数学描述语言的程序设计语言,分为面向过程的程序设计语言和面向对象的程序设计语言,如C语言、Pascal语言、FoxBase、 Visual C+、Visual Basic等,1)面向过程的程序设计语言,把精力集中在解题的思路和方法上,使程序设计语言开始与解题方法相结合。其中一种就是把解题过程看作数据被加工的过程。基于这种方法的程序设计语言称为面

3、向过程的程序设计语言,C语言就是一种面向过程的程序设计语言,面向过程的程序设计语言,main() /*主函数*/ /*程序开始*/ float r; /*定义一个实型变量r,表示圆的半径 */ float s; /*定义面积变量s*/ s=3.14*r*r; /*把计算的面积赋给s*/ printf(%f , s); /*输出面积s的值*/ /*程序结束*,2)面向对象的程序设计语言,面向对象的程序设计是一种结构模拟方法,它把现实 世界看成是由许多对象(object)所组成,所有的对象都 属于特定的类(class),或者说每个对象都是类的一个实 例。因而面向对象的程序设计的一个关键是定义“类”

4、,并 由“类”生成“对象”。 面向对象的程序比面向过程的程序更清晰易懂,更适 宜编写更大规模的程序,正在成为当代程序设计的主流。 面向对象的程序设计语言有Java、Visual Basic、Visual Basic.NET等,由C派生出的C+语言也属于面向对象的 程序设计语言,它是一种多范型程序设计语言,不仅可 以利用它编写面向对象的程序,还可以用它编写面向过 程的程序,1.1.2 C语言的发展过程,C语言是目前世界上流行最广泛的高级程序设计 语言。C语言的发展过程可粗略地分为三个阶段: 1970年至1973年为诞生阶段,之后至1988年为发 展阶段,1988年以后为成熟阶段,1C语言的诞生,

5、2C语言的发展,3C语言的成熟,1.1.3 C语言的标准,C语言的灵活性、丰富性和可移植性很快得到了普遍的认 可,接着适合于各种操作系统(UNIX、MS-DOS、CP/M-80/86 等)和不同机型(字长为8bit32bit)的C语言编译系统相继出 现。1982年,美国国家标准学会(American National Standards Institute,ANSI)语言标准化委员会开始着手进行C 语言的标准化工作,并于1983年公布了第一个C语言标准草案 (83 ANSI C)。1989年,ANSI又发布了一个完整的C语言标 准ANSI X3.159-1989,通常称为“ANSI C”,简称

6、“C89”, 1990年,国际标准化组织ISO/JEC JTC1/SC22/WG14采纳了 C89,做了少量修改后,以国际标准ISO/IEC 9899:1990发布, 通常称其为“C90”,它同C89基本上相同。 1995年,WG14对C89做了两处技术修订和一个扩充,人们 将其称为“C89增补1”或“C95”,同时,WG14 开始着手对C标准 全面修订,并于1999年获得通过,形成了正式的C 语言标准, 命名为ISO/IEC 9899:1999,简称“C99,1.2 C语言的特点,1)语言简洁、紧凑,使用方便、灵活,2)运算符丰富,3)数据结构丰富,具有现代化语言的各种数据结构,4)具有结构

7、化的控制语句。用函数作为程序的模块 单位,便于实现程序的模块化。C语言是良好的结构化 语言,符合现代编程风格的要求,5)语法限制不太严格,程序设计自由度大,6)C语言允许直接访问物理地址,可以直接对硬件进 行操作,7)生成目标代码质量高,程序执行效率高,8)程序可移植性好(与汇编语言比,1.3 C程序结构,例1.1】C程序输出。 main() printf(This is a C program.n);,This is a C program,1.3 C程序结构,例1.2】设计一个程序,计算两数之和并 输出结果。 main() int a,b,sum; a=123;b=456; sum=a+b

8、; printf(sum=%dn,sum);,sum=579,1.3 C程序结构,例1.3】输入两个整数,计算两者较大的数,并输出。 main() int a,b,c; int max(int x,int y); scanf(%d,%d,int max(int x,int y) int z; if(xy) z=x; else z=y; return z;,1.4 源程序的编辑、编译、连接与运行,用高级语言编写的程序称为“源程序”,通常简 称为程序。高级语言程序也必须被转换为机器语 言程序才能被机器理解和执行,完成这种转换任 务的系统软件称为编译程序。相应的转换过程通 常称为编译,1.5 算法,

9、程序是语句的集合,一个程序应该包含两个方面的内 容:一个是对数据的描述,一个是对操作的描述。数据是 操作的对象,操作的目的是对数据进行加工和处理,以得 到期望的结果。著名的计算机科学家沃思(Niklaus Wirth) 提出: 程序=算法+数据结构 实际上,一个程序除了以上两个要素之外,还应该采取适当的程序设计方法进行程序设计,并且用某种计算机语言来表示。因此: 程序=算法+数据结构+程序设计方法+语言工具和环境 其中算法是灵魂,数据结构是加工的对象,语言是编程的 工具,编程要采用适合的方法,算法主要解决“做什么”和 “怎么做”的问题,程序中的操作语句实际上就是算法的体 现,1.5.1 算法的

10、组成要素,为解决一个问题而采取的方法和步骤称为“算 法”。对于同一个问题可以有不同的解题方法和步 骤,也就是有不同的算法。算法有优劣,一般而 言,应当选择简单的、运算步骤少的,也就是运 算快、内存开销小的算法(也就是说,设计算法 时,还要考虑时间复杂度和空间复杂度的问题,1算法的特性,1)有穷性:一个算法应当包含有限的步骤,而不是 无限的步骤;同时一个算法应当在执行一定数量的步骤 后结束,2)确定性:算法中的每一个步骤都应当是确定的, 而不是含糊的、模棱两可的。也就是说不应当产生歧 义,特别是算法用自然语言描述时应当注意,3)有0个或多个输入,4)有1个或多个输出,5)有效性。算法的每个步骤都

11、应当能有效执行,并 能得到确定的结果,2算法的组成要素,算法含有两大要素: 一是操作。每个操作的确定不仅取决于问题的需求,还取决于它们来自哪个操作集,它还与使用的工具系统 有关,算法的另一要素是结构控制。结构控制就是如何控制 组成算法的各个操作的执行顺序,1966年Bohm和Jacopini证明,由顺序结构、选择结构 和循环结构这三种基本结构可以组成任何结构的算法,可 以解决任何问题,三种基本结构,1)顺序结构。即语句的执行顺序与书写的顺序一致。 这是一种理想的结构,仅有这样的结构不可能处理复杂的 问题,2)选择结构(分支结构)。最基本的选择结构是当程序执行到某一语句时,要进行一下判断,从两条

12、路径中选择一条合适的路径进行。例如,要在a和b中取一个较大的数,就要做比较判断,决定是将a输出还是将b输出,3)循环结构(重复结构)。这种结构是将一条或多条 语句重复执行若干遍,1.5.2 算法的表示方法,为了表示一个算法,可以用不同的方法。常用 的算法表示方法有自然语言、传统流程图、结构 化流程图、N-S流程图、PAD图、伪代码、计算机 语言等,1用自然语言表示算法,自然语言就是人们日常使用的语言,可以是汉 语、英语或其他语言。用自然语言表示算法通俗 易懂,但文字冗长,容易出现有歧义的算法。自 然语言表示的含义往往不太严格,要根据上下文 才能准确判断。此外,用自然语言描述分支和循 环的算法,

13、不是很直观,2用流程图表示算法,流程图表示算法:用一些图框表示各种操作,用箭头表示算法流程。用图形表示算法直观形象,易于理解,流程图图形符号下图所示,起止框,处理框,输入输出框,判断框,连接点,流程线,注释框,准备框,待处理框,美国标准化协会ANSI规定了一些常用的流程图符号,已为世界各国程序工作者普遍采用,Y,顺序结构,选择结构,当型循环,直到型循环,循环结构,程序流程图,例1.4】用流程图描述从3个数中取最大数的算法,2用N-S流程图表示算法,直到p成立,例1.4】用流程图描述从3个数中取最大数的算法,4用伪代码表示算法,伪代码是用介于自然语言和计算机语言之间的文和符号来描述算法的工具。它

14、无固定的、严格的语法规则,通常借助语某种高级语言的控制结构,中间操作可以使用自然语言,也可以使用程序设计语言,或使用自然语言与程序设计语言的混合体。一般专业人员习惯用伪代码进行算法描述,输入a、b、c; if(a=b) max=a; else max=b; if(max=c) 输出max; else 输出c,初始化:max=0,i=1; 当(imax) max=n; 输出max,1.5.3 算法设计举例,算法的设计过程是一个复杂的过程,也是一个智力过 程。为了让设计算法的复杂性能够在人的智力控制的范围 之内,人们提出了自顶向下、逐步细化的方法。 按照这种方法,解题之初不要马上就力图触及问题的

15、细节,而应当从问题的全局出发,给出高度概括、高度抽 象的算法,通常是把这些问题的求解分成可独立求解的若 干子问题;接着对每一个子问题再进行分解最后对不 可再划分的子问题分别设计算法,而且设计的过程也是从 概括逐步走向细化。一般说来,上层所解决的是“做什么”, 逐步细化的过程解决的是“怎么做”。 在用伪代码描述算法时,随着逐步细化的深入,最终 可以用程序设计语言代替算法中的伪代码。等到全部代码 都使用某种程序设计语言描述的时候,程序设计也就基本 完成,例1.5】用自顶向下、逐步细化的方法设计3个数中取最大数算法,1)首先,分析问题需求 S1:输入三个数a、b、c; S2:从a、b、c中找出最大数

16、赋给max; S3:输出max,2)在前一阶段的基础上考虑各个“做什么”的实现途径,把算 法细化如下。 S1:调用scanf()函数输入三个数a、b、c; S2:调用一个求三个数中最大数函数max3(a、b、c),这里 就需要设计max3(float x,float y,float z); S3:调用printf()函数,将最大数输出,3)编写主程序 main() float a,b,c,max; float max3(float x,float y,float z); printf(Input 3 number a b c:); scanf(%f%f%f ,4)设计max3()。仍然需要采

17、用逐步细化的方法,先给出概要 算法。 S2.1:从x与y中取较大数送 入m中; S2.2:从m与z中取较大数送 入m中; S2.3:返回m给主调函数,进一步细化的结果如下。 s2.1: if(xy) m=x; else m=y,s2.2: if(mz) m=z,s2.3: return (m,float max3(float x,float y,float z) float m; if(xy) m=x; else m=y; if(mz) m=z return (m);,例1.6】(百钱百鸡)公元前五世纪,我国古代数学 家张丘建在算经一书中提出:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百

18、鸡,问鸡翁、鸡母、鸡雏各几何,1)解题思路的分析。这是一个有名的不定方程问题。 cocks+hens+chicks=100 5*cocks+3*hens+chicks/3=100 式中:cocks为鸡翁数;hens为鸡母数;chicks为鸡雏数,对于上述不定方程的问题,要先确定一个变量的值,才能对其求解。由问题中给出的条件,很容易得出三个变量的取值范围: cocks:019中的整数(因为每只鸡翁5钱,因此它不能超过19只) hens:033中的整数 chicks:0100中的整数,S1:cocks=0; /*赋初值*/ S2:while(cocks=19) S2.1:找出满足题意的 hens、

19、chicks; S2.2:cocks加1; /*cocks=cocks+1*,2)对S2.1细化。 思路1:把已经确定的cocks带入式与式中,求解方程,看能 否找到满意的解。这种思路不太适合计算机求解。 思路2:在每个给定的cocks下,对hens的取值范围内的各个值依 次测试,看能找到哪些hens及chicks满足题意。于是把S2.1细化为: S2.1.1:hens =0; /*赋初值*/ S2.1.2:while(hens =33) S:找出满足题意的chicks; S:hens加1; /* hens = hens +1*,3)对S细化。对S2.

20、1.2.1来说,cocks 和hens都已确定, 这时的chicks满足: chicks=100-cocks-hens,对S可细化为: S:chicks=100-cocks-hens; if(5*cocks+3*hens+chicks/3.0=100) printf(%d%d%dn,cocks,hens,chicks,4)编写程序,C语言程序设计,主编 任正云 中国水利水电出版社,第2章 数据类型与基本操作,程序的主要部分是由数据和执行的语句组成的,计算机处理的对象是数据。C语言的数据结构是以数据类型形式出现的。数据类型不同,它所表达数据的范围、精度和所占据存储空间

21、的大小均不相同。因此在介绍程序的操作(即语句)之前应当对操作的对象有一个初步的了解。这样才能更好理解操作的结果,数据类型,2.1 常量与变量,对于基本数据类型,按其取值是否可以改变可分为常量和变量两种。在程序中,常量是可以不经说明而直接引用的,而变量则必须先定义后使用,2.1.1 常量,在程序运行过程中,其值不改变的量称为常量。常量 可分为直接常量和符号常量两种。直接常量,又叫字面 常量,其数据类型可以从字面形式直接判断出来。在C 语言中,常量有不同的类型,分别是整型常量(int)、 浮点型常量(float和double)、字符常量(char)、字 符串常量,整型常量也还有短整型(short

22、int)、长整 型(long int)和无符号型(unsigned int)等,1整型常量,整型常量通常是指数学上的整数,分为十进制、八进 制、十六进制常量,1)十进制整型常量形式,如15,19,123,-345等,2)八进制整型常量形式,以数字0开头,如:05,012, 0123都是八进制,它们分别代表十进制5,10,83,3)十六进制整型常量形式,以数字0和字母x(或大写 字母X)开头。如:0 x10,0Xff,0X8均为十六进制整数,它们分别代表十进制数16,255,8,注意:八进制数的各位数字可以是07。十六进制数的各位数 字可以是015,其中10、11、12、13、14、15既可以用

23、大写字母A, B,C,D,E,F表示,也可以用小写字母a,b,c,d,e,f表示; 常量的长度及表示数据的范围,通常与机器类型有关,2浮点型常量,浮点型常量也称数值常量,它有正值和负值之分,只 能用十进制形式表示。浮点型常量可以用小数形式或指数 形式表示,如345,.345,345.,3.14159,1.5e+5, 2.9e-7等。后两个数都采用了指数形式,分别表示 1.510 和2.910 。浮点型常量不分单精度型和双精 度型,但可以赋给一个float型或double型变量,5,7,注意:指数形式的浮点常量E或e前面必须有数字(尾 数),E或e后面必须为整数(阶码),因此E8,6e7.8都

24、是不合法的浮点常量,3字符常量,字符常量是用一对单引号括起来的一个字符,如 a , A , ? , # 。注意,单引号只是字符与其他部分 的分隔符,或者说是字符常量的定界符,不是字符常量的 一部分,当输出一个字符常量时不输出此引号,不能用双 引号代替引号,如a不是字符常量,注意:引号中的字符不能是引号或反斜杠。如或都不是 合法的字符常量,4转义字符,C语言规定:用反斜杠开头后面跟一个字母代表一个控制字符; 代表“”,用 代表单引号字符;用后跟13个八进制数代表ASCII码为该八进制数的字符;用x后跟12个十六进制数代表 ASCII码为该十六进制数的字符,4转义字符,例2.1】 main() c

25、har ch; ch=362; /*将八进制数362的ASCII字符赋给ch*/ printf (%c,ch);,在IBM PC机上运行可在显示屏上输出:,当然,也可以用以输出其他字符,如: 101或 x41 表示A 010或 x08 表示 b 134或 x5C 表示 012或 x0A 表示 n,5字符串常量,在C语言中,把用一对双引号括起来的零个或多个字符序列称为字符串常量。如hello,Programming in C,A,a, 等。 字符串以双引号为定界符,但双引号并不属于字符串。要在字符串插入引号,应借助转义字符。例如要处理字符串I say: Goodbye! 时,可以把它写为I sa

26、y: Goodbye!,字符常量与字符串常量的区别,6符号常量,例2.2】符号常量的使用。 # define PRICE 30 main() int num,total; num=10; total=num*PRICE; printf (total=%dn, total);,6符号常量,符号常量名用大写,变量名用小写,以示区别,使用符号常量的好处是,1)含义清楚。如上面的程序中,看程序时从PRICE就可知道它代表价格。因此定义符号常量名时应考虑“见名知意”。在一个规范的程序中不提倡使用很多的常数,如:sum=15*30*23.5*43。在检查程序时搞不清各个常数究竟代表什么。应尽量使用“见名知

27、意”的变量名和符号常量,2)在需要改变一个常量时能做到“一改全改”。例如在程序中多 处用到某物品的价格,如果价格用常数表示,则在价格调整时, 就需要在程序中作多处修改,若用符号常量PRICE代表价格,只需 改动一处即可。如: # define PRICE 35 在程序中所有以PRICE代表的价格就会一律自动改为35,2.1.2 变量,变量指在程序运行中,其值可以发生变化的量。变量 在内存中占据一定的存储单元,该存储单元中存放变量的 值。变量通常用来保存程序运行中的输入数据,计算获得 的中间结果和最终结果。一个变量应该有一个名字,以便 被引用,变量的命名规则和用户标识符相同,给变量取名 时,为了

28、便于理解程序,一般都采用“见名知意”的原则,标识符,C语言中,有3类标识符: (1)关键字。C语言规定了32个关键字,如int,float, for,if,else等,它们有特定的用途和含义,不能用作变 量名。 (2)系统预定义的标识符。如系统提供的库函数的名 字sin,printf,main等以及预编译命令define等。系统允 许把它们另作它用,但这就会使它们失去原有作用,容 易产生混乱,建议不要把它们用作变量名。 (3)用户标识符。即用户自己定义的标识符,用来给 程序中的变量、函数、符号常量、数组、结构体、共用 体、文件等命名,标识符,C语言规定标识符只能由字母(AZ、az)、数字 (0

29、9)和下划线3种字符组成,且第一个字符必须为字 母或下划线,下面的标识符是合法的: a b1 ab x13 name_students filel_buf SIZE_PI,下面不是合法的C标识符: 456th (数字开头) cade-of-moves (含有非法的“-”) piece flag (含有非法字符空格) $123.4 ($开头,含有非法字符) w.w (含有非法字符“.”) a int y,等效为:int x,y,例2.3】整型变量的定义和引用。 # include stdio.h main() int x,y,z,s; /*基本整型变量定义,一次可定义一个或多个变量*/ x=3;

30、y=4;z=5; /*整型变量的赋值*/ s=x+y+z; /*整型变量的引用*/ printf(ns=%d,s);,运行结果: S=12,例2.4】将例2.3中定义的整型变量类型和所赋数值做些 修改。 # includestdio.h main() int a; /*基本整型变量的定义*/ short b; /*短整型变量的定义*/ long c; /*长整型变量的定义*/ unsigned long s; /*无符号长整型变量的定义*/ a=32769;b=4;c=5; s=a+b+c; printf(s=%dn,s);,运行结果: s= -32758,变量的声明,1)不同类型的数据在内存

31、中占据不同长度的存储空间,而且 采用不同的表示方式(指数据在机器内部的表示方式)。例如,一 般的微型机,用两个字节存放一个整数,以定点形式存放;而用4个 字节存放一个浮点型数据,以指数形式存放。在程序中引用一个变 量,实际上是对指定的存储空间的引用,必须先开辟(分配)存储 空间才能引用它,2)一种数据类型对应着一个值的范围,3)一种数据类型对应着一组允许的操作。例如,对整数数据 可以进行“求余”运算(5%2的值为1,即5除以2的余数为1),而 实型数不能进行求余运算。数值型数据可以进行四则运算,而结 构体型数据就不能进行四则运算,2变量的初始化,C语言允许在说明变量的同时对其初始化,int s

32、um=0,float pi=3.1416,char c=w,也可以对说明的变量的一部分初始化,int i, sum=0,j,2.2 整型数据在计算机中的存储方式,计算机中,内存储器的最小存储单位称为“位”(bit),每一个位中或存放0,或存放1,因此称为二进制位。大多数计算机把8个二进制位组成一个“字节”(byte),并给4个字节分配一个地址。若干字节组成一个“字”(word),用一个字来存放一条机器指令或一个数据。一个字含多少个字节随机器而不同。如果计算机系统字长为4个字节(一个字节为8个二进制位),就称这台计算机的字长为 32位,一个字节有8个二进制位,本书中把最右边的一位称为最低位, 把

33、最左边的一位称为最高位,用以存放整数的符号。所以也称之为 符号位。若是正整数,最高位置0;若是负整数,最高位置1。因此,从最高位就立刻能判别出存放的一个整数是正整数还是负整数,2.2 整型数据在计算机中的存储方式,C语言中,数值都是以补码(complement)表示的。 一个正整数的补码和该数的原码(即该数的二进制形式) 相同,负数求“补码”的步骤如下: (1)求原码。把整数的绝对值用二进制表示,最高位用 于表示符号,0表示正数,1表示负数。 (2)求反码。除符号位外把1转换成0,把0转换成1。 (3)把所求得的反码加1,结果即为所求的补码,整型数据在计算机中的存储方式,例2.5】求十进制数-

34、5在计算机中的存储形式,例2.6】把内存中以补码形式存放的二进制码 1111111111110110转换成十进制整数,2.3 整型数据的溢出,例2.7】 # includestdio.h void main() int a,b; a=32767; b=a+1; printf(%d,%d n,a,b);,在Turbo C环境下运行结果为 32767,-32768,2.4 float和double类型数据在内存中的表示,通常称float为浮点类型,而称double为双精度类型,它们都用来表示浮点型数,差别只在于长短不同,因而所能表示的数的范围也不同。对于一个浮点型常量,可以用两种形式表示它,即十进

35、制小数形式和指数形式。 (1)十进制小数形式,如123.45、-0.001。 (2)指数形式,如123e2、1.23E4、.123e5、123000E-1。 这几部分的书写规则是: (1)尾数部分不能省略,即e(或E)前必须有数据。 (2)指数部分必须是整数。 (3)尾数可以只有整数部分或只有小数部分。 (4)指数、尾数都可以带符号,如省略符号则隐含为正,2.5 有符号的数据类型和无符号的数据类型,前面谈到的short、int、long型数据,都是指带符号的, 也就是含有signed(带符号),因此,int与signed int等价; short与signed short等价;long与sig

36、ned long等价。C语言 还允许使用无符号(unsigned)的整型数据,它将二进制 形式的最左边一位不作为符号,而与右边各位一起用来表 示数值,也就是说,如果定义一个数据类型为unsigned int, 则它只能存放正数而不能存放负数。字符型的数据也有 signed和unsigned两种类型,基本数据归纳,例2.8】 main() char c; c=0362; printf(%dn,c);,运行结果: -14,例2.9】以下程序的输出结果为( )。 # includestdio.h void main() unsigned int a=65535; int b=-2; printf(n

37、a=%d,%u;b=%d,%u,a,a,b,b); Aa=-1,65535; b=-2,65534 Ba=65535,65535; b=-2,65534 Ca=65535,65535; b=65534,65535 Da=-1,65535; b=65534,65534,答案为A,2.6 运算符和表达式,运算(即操作)是对数据的加工。C对数据的基本操作和处理几乎全是由运算符来完成的。这些符号称为运算符或操作符。被运算的对象数据称为运算量或操作数。运算符执行对操作数的各种操作,按操作数的数目分类有单目(一元)运算符、双目(二元)运算符和三目(三元)运算符;按运算符的功能分类有算术运算符、关系运算符、

38、逻辑运算符、自增与自减运算符、赋值运算符和条件运算符。此外,表示数组下标的“ ”、表示函数调用的“( )”、表示顺序求值的“,”,以及类型强制转换符“(类型)”也都作为运算符看待,运算符和表达式,1)算术运算符(+、-、*、/、+、-)。 (2)关系运算符(、=、|、 、 a/=a+a; printf(%dn,n);,例2.11】有定义: “ int a=12; ” ,表达式a+=a-=a*=a的值 为( )。 A12 B144C0 D132,输出的结果 0,答案 C,2.6.2 算术运算符和算术表达式,算术运算符包括:+、-、*、/、%、+、,双目运算符+、-、*、/的操作数可为任何整数或浮

39、点 数。对于“+”和“-”,还可用于指针加或减一个整数。双目 运算符的两个操作数类型可以不同,运算前遵循类型的一 般算术转换规则自动转换成相同的类型,运算结果的类型 与转换后操作数的类型相同。类型的一般算术转换规则是 值域较窄的类型向较宽的类型转换,例如,13+5:结果为整数18。两个操作数类型相同,都为int,不执 行类型转换,13.0+5:结果为双精度浮点数18.0。操作数13.0类型为double, 执行加运算之前,5被转换成double,d 97:结果为整数3。d的类型为char,97为int,执行减运算 之前,d被转换成int,d的ASCII值为整数100,算术运算符和算术表达式,对

40、于除运算符“/”,如果两操作数都是整数,则执行整数除, 运算结果也是整数,值为商的整数部分,小数部分被截去;否则,执行浮点数除,运算结果是浮点数。例如: 15/5结果为整数 3 3/6 结果为整数0 -8/5结果为整数-1 15.0/3或15/3.0或15.0/3.0结果相同,均为双精度浮点数5.0,算术运算符和算术表达式,对于求余运算符%,规定两操作数必须都为整数,运算结果 也为整数,值为左操作数除以右操作数所得的余数,符号与左操 作数相同。例如: 17%5或7%-5 结果为整数2 -17%5 结果为整数-2 5%10 结果为整数5 10%5 结果为整数0,整数除和求余运算存在下列关系,a%

41、b=a-a/b*b,算术运算符和算术表达式,增1运算符+和减1运算符-是两个独特的单目运算 符,其独特之处在于它们既可以用作变量的前缀,又可 以用作变量的后缀。这两种用法的效果都是使变量增1或 减1,但前缀式先自增(或自减)后引用,后缀式先引用 后自增(或自减,i、-i 在使用i之前,先使i的值增1、减1,i+、i- 在使用i之后,使i的值增1、减1,若i的原先值为8,j=+i 先使i的值加1,变为9,然后再送给j,因此,j的值为9,j=i+ 先将i的值送给j,这样,j的值为8,然后i值再加1,变为9,注意:+和-运算的结合方向是自右向左的,算术运算符和算术表达式,例2.12】下面的程序说明“

42、+”和“-”运算的用法。 # include stdio.h void main() int x=0,y=1; printf(x=%d,y=%dn,x,y); printf(x+=%dn,x+); printf(y-=%dn,y-); printf(x=%d,y=%dn,x,y);,运算结果: x=0,y=1 x+=0 y-=1 x=1,y=0,2.6.3 长度测试运算符sizeof,长度测试运算符sizeof可用来测试某个类型的变量所占 用计算机内存空间的字节长度,一般形式为:sizeof(类型名,int a; a=sizeof(float); printf(%d,a,输出结果为 4,2.6

43、.4 关系运算符和关系表达式,注意: (1)关系运算符为双目运算符,结合方向为自左至右。 (2)C语言中没有逻辑值,所以关系运算符的结果为真时用1表 示(或为假时用0表示)。 (3)算术运算符高于关系运算符,ca+b 等同于c(a+b) a=bc 等同于a=(bc) ab!=c 等同于(ab)!=c,关系运算符,关系表达式,由关系运算符、运算对象以及小括号组成的表达式称为关系 表达式。当表达式成立时,返回值为整型值1;当表达式不成立时, 返回值为整型值0,关系运算符和关系表达式,例2.13】下列程序运行后的结果为( )。 main() int x,a=3,b=5,y; x=1053; y=a=

44、3+10; printf(%d,%dn,x,y);,输出结果 0,0,注意:y= a=3+10;表达式相当于y=(a=(3+10) ),故先算 3+10再与a比较。因为算术运算符比关系运算符的优先级高,小 括号可以不写,但写了更清楚,2.6.5 逻辑运算符与逻辑表达式,逻辑运算符,逻辑表达式,用逻辑运算符将关系表达式连接起来就构成了逻辑表达式。逻 辑运算的对象可以是C语言中任意合法的表达式。逻辑表达式的运算结果为真用1(“真”)表示,为假用0(“假”)表示,例如,ab”,分别执行下列语句, s和i的值是多少? s=+s|+i,答案为:s=1,i=10,例2.17】定义:“int x=0,y=0

45、,z=0;”,分别执行下列语 句后,各变量的值是多少? +x scanf(%d,条件运算符与条件运算表达式,例2.19】已定义“int x=4,b=5,y;”, 执行语句:y=+xb?x:b-+x?+b:x后, x、b、y的值分别为_,本题含有关系运算、算术运算、条件运算和赋值运算,分析,条件运算符的结合方向为自右至左,条件运算符的优 先级别仅高于赋值运算符,比关系运算符和算术运算符 都低,是否需要求解表达式“b-+x?+b:x”,取决 于+xb?的真假,若为真使得该表达式的值y为x, 若为假,即再求解表达式“b-+x?+b:x,本题+xb为假,由于在判断+xb时x值为5,判 断b-+x时x值

46、为6,所以整个表达式的值为6,答案为x=6,b=4,y=6,条件运算符与条件运算表达式,例2.20】分析下列程序的输出结果。 #include stdio.h void main() int i,j,k,a=3,b=2; i=(-a=b+)?-a:+b; j=a+; k=+b; printf(i=%d,j=%d,k=%dn,i,j,k);,输出的结果: i=1,j=1,k=4,条件运算符与条件运算表达式,例2.21】请编制程序,任意输入两个整数,输出其 中较小者。 main() int n1,n2,min; clrscr(); printf(input two number(n1,n2): )

47、; scanf(%d,%d,条件运算符与条件运算表达式,例2.22】编制程序,输入大写字母,则输出小写字母;输入小写字母,则输出大写字母。 main() char ch; printf(input any letter: ); scanf(%c,2.6.7 逗号运算符与逗号表达式,逗号运算符,又称“顺序求值运算符”。逗号表达式 的一般形式为: 表达式1,表达式2或表达式1,表达式2,表达式3,表达式n,运算过程是:自左至右依次计算表达式1,表达式2, ,表达式n的值,而整个逗号表达式的值取最后的表达式n的值,对于逗号表达式,a=3*5, a*4,a=3*5,a*4),a+5,要正确区分表达式的

48、作用,x=(a=3,6*3,x=a=3,6*3,2.7 不同类型数据间的转换,C语言允许数据的值从一种类型转换为另一种类型。 下列情况之一会引起类型转换: (1)当双目运算符的两个操作数类型不相同时,引起 一般算术转换(或称运算符转换)。 (2)当一个值赋予一个不同类型的变量时,引起赋值 转换。 (3)当一个值被强制为另一个类型时,引起强制类型 转换。 (4)当某个值作为参数传给一个函数时,引起函数调 用转换。其中,赋值转换、一般算术转换和函数调用转 换是由系统自动隐含进行的,强制类型转换是由程序员 使用强制运算符指定进行的显式类型转换,1一般算术转换,一般算术转换(简称算术转换)的基本规则为

49、: 双目运算符的两个操作数中,值域较窄的那个类型向 值域较宽的那个类型转换。值域是类型所能表示的值的 最大范围。被转换的两个操作数可为任意类型,转换规则如下,1)将表达式中的char或short全部自动转换为相应的 int型,将float转换为double型,一般算术转换,2)当运算符的两端运算类型不一致的时候,存储值域 窄的向值域较宽的转换,一般算术转换,3)同样长度的整型数据在signed类型和unsigned类 型之间的转换,例2.23】分析下面程序的执行结果。 # includestdio.h void main() unsigned short us1=32767,us2=65535

50、,us; signed short ss=-7; us=ss; printf(1)ss=%d,us=%un,ss,us); ss=us1; printf(2)us1=%d,ss=%dn,us1,ss); ss=us2; printf(3)us2=%u,ss=%dn,us2,ss);,程序执行结果如下: (1)ss= -7,us=65529 (2)us1=32767,ss=32767 (3)us2=65535,ss=-7,一般算术转换,1)第1种情形是把一个有符号的数-7(在变量ss中) 赋值给无符号类型的变量us,而后无符号的变量中的数 变成65529。这种变化是由于将原来的有符号数中的符 号

51、变成了无符号数中的最高位而产生的。如图2-3所示, 当-7的16位补码被当做无符号的数据时,由于正数的原 码等于补码,所以(1111 1111 1111 1001)2=65535(全1) -(110)2=65529,一般算术转换,2)第2种情况是将一个一般的unsigned类型的数据转 换成长度相同的signed类型的数据。在一般情况下,不 会出现什么问题。但是在第3种情况下却出现了意外。 这是因为当无符号数较小且最高位为0时,转换成有符 号数后,最高位虽然被当成符号位,但并未影响数据的 有效值。而如果无符号数大到使最高位为1时,则转换 成有符号数之后,被当成了负数的补码。于是,就有了 前面执

52、行的结果,2强制类型转换规则,强制类型表达式的形式为: (类型名)操作数,强制转换与赋值转换的区别是,1)强制转换是显式方式,赋值转换是隐式方式,前者是人为的,后者是自动的,2)强制转换的结果类型由强制运算符指定的类型名决定,赋值转换的结果类型由赋值运算符的左操作数的类型决定,char)(3-3.14159*x,*得到字符型数据*,k=(int)(int)x+(float)i+j,*得到整型数据*,float)(a=99,*得到实型单精度数据*,强制类型转换,例2.24】 # include stdio.h void main() float x; int i; x=3.6; i=(int)x

53、; printf(x=%f,i=%dn,x,i);,运行结果为: x=3.600000,i=3,注意:语句i=(int)x把x强制转换后赋给i,而x本身的类型并不改变,强制类型转换,例2.25】设x=2.5,a=7,y=4.7,算术表达式 x+a%3*(int)(x+y)%2/4的结果为( )。 A2.5B7C4.7D2.75,解析:取模运算只能在整数之间进行,a为整型变量, 因为%、*、/这三个运算符的优先级别相同,而类型 强制转换符优于*、/运算符,a的值为7,7%3=1,又 因为(int)(2.5+4.7)=7,1*7=7,7%2=1,1/4=0,所 以表达式x+a%3*(int)(x+

54、y)%2/4=x+0=2.5,答案为A,C语言程序设计,主编 任正云 中国水利水电出版社,第3章 结构化程序设计,语句是程序的重要组成部分,它代表着程序的执行步骤,实现程序的意图。C语言属于过程式语言,在这种语言中,围绕一项工程所采取的每一步行动都必须由语句一一体现出来。简单地讲,一个程序包含两个基本信息,一部分是数据,另一部分是对数据的操作,这些操作都是通过语句来实现的,3.1 C语句概述,C语言的语句用来向计算机系统发出操作指令。一 个语句经过编译后产生若干条机器指令。C语句可以分 为3大类:控制语句、表达式语句和复合语句,3.1.1 控制语句,C语言有9种控制语句,主要用于控制程序流程。

55、它们是: if-else(条件语句)for(循环语句) while(循环语句)do-while(循环语句) continue(转向语句)break(转向语句) switch(多分支选择语句)goto(转向语句) return(从函数返回语句,3.1.2 表达式语句,表达式语句是在表达式最后加上一个“;”所组成的语句,表达式语句的一般形式,表达式,例如,a=3,*赋值语句*,i,*一般表达式语句*,getchar(,*函数调用语句*,常见表达式语句的形式有,赋值语句、函数调用语句、空语句,表达式语句,1)赋值语句,由赋值表达式加上一个分号构成赋值语句,2)函数调用语句,由函数调用表达式加一个分号

56、构成函数调用语句,printf(This is a C statement.,z=(-y/+x)*z,3)空语句,只有一个分号的语句,3.1.3 复合语句,用 把一些语句(语句序列,表示一系列工作)括 起来成为复合语句(又称语句块,一般情况凡是允许出现语句的地方都允许使用复合 语句。在程序结构上复合语句被看作一个整体的语句, 但是内部可能完成了一系列工作,int a,b,sum; a=0; b=2; sum=a+b; printf(%d,sum);,注意,C语言允许一行写几个语句,也允许一个语句拆开写在 几行上,书写格式无固定要求。一般将彼此关联的或表示一个整体的一组较短的语句写在一行上,3.

57、2 数据的输入和输出,C语言本身不提供输入输出语句。输入输出操作是由 标准输入输出函数来完成的,3.2.1 数据的输出函数,格式是,printf(格式控制参数,输出项1,输出项2,,格式控制参数以字符串的形式描述,也称“格式控制字 符串”。它由格式说明符和普通字符两种成分组成,1普通字符,普通字符即按照原样输出的字符,例如,若int a、b的值分别为6和8,printf(a=%d b=%d,a,b,输出结果是: a=6 b=8,2格式说明符,格式说明符由“%”和转换字符组成,如%d、%f等, 作用是将输出的数据转换为指定的格式输出。格式说明 总是由“%”字符开始,以转换字符结束。转换字符是有

58、特定含义的单个字符,它决定数据以何种类型输出,如 d代表十进制数,其完整格式为, o m . n h/l 格式字符,开始 符,对齐 方式,填充 方式,宽度 指示符,精度 指示符,长度 修正符,指出输 出类型,格式字符,printf的附加格式说明,1)%d格式,1)%d:对一般整型数据的输出格式。 2)%md:按给定的宽度m输出。若输出项的实际位数小于m, 则左端以空格补齐;若大于m,则按实际位数输出。 3)%ld:对长整型数据的输出格式。 4)%mld:按给定的宽度m输出长整型数据。若输出项的实际 位数小于m,则左端以空格补齐;若大于m,则按实际位数输出,例3.1】关于格式字符d的用法举例。

59、# include stdio.h main() int a; long int b; a=70; b=20080512,printf(a=%dn,a); printf(a=%5dn,a); printf(b=%ldn,b); printf(b=%12ldn,b);,运行结果: a=70 a= 70 b=20080512 b= 20080512,2)%o格式,例3.2】 # include stdio.h main() int a; long int b; a=70; b=20080512; printf(a=%on,a); printf(a=%5on,a); printf(b=%lon,b); printf(b=%12lon,b);,运行结果: a=106 a= 106 b=114463600 b= 114463600,3)%x格式,例3.3】 # include stdio.h main() int a; long int b; a=70; b=20080512; printf(a=%d, a=%o,a=%xn,a,a,a); printf(a=%5d, a=%5o,a=%5xn,a,a,a); printf(b=%ld, b=%lo,b=%lxn,b,b,b); printf(a=%12ld, a=%12lo,a=%12lxn,b,b,b);,运行结果: a

温馨提示

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

评论

0/150

提交评论