1、全书内容,第一部分:C 语 言 入 门 部分: 第12章第二部分:程序设计基础部分: 第35章第三部分:程序设计提高部分: 第67章第四部分:综合程序设计部分: 第8章,第一章 C语言程序设计的概念,程序与程序设计语言 C语言及其标准 C语言程序概要,1.1 程序与程序设计语言 计算机与程序,“程序”一词来自生活,通常指完成某些事务的一种既定方式和过程。 例: (1)起床 (2)刷牙 (3)洗脸 (4)吃饭 (5)早自习,例1-1 求圆的面积和周长,根据数学知识,我们知道解决问题的步骤如下: 步骤1 输入圆的半径r; 步骤2 圆的面积pi*r*r; 步骤3 圆的周长2*pi*r; 步骤4 输出
2、得结果。,例1-2 求1+2+100,根据存储程序原理,解决问题的步骤如下: (1)设置S为存储计算结果的存储单元,初值为0; (2)把S和1相加,所得的和记为S; (3)将S和2相加,所得的和记为S; (102)将S和99相加,所得的和记为S; (103)将S和100相加,所得的和记为S; (104)打印S的值,S即为累加之和。,程序的特征,日常生活及解决数学问题中的程序特征应具备: 开始与结束 按部就班地进行 基本动作 完成工作 用某种形式描述那么,计算机程序又是什么呢?,计算机与程序,计算机程序是能在计算机上解决问题的步骤,是人与计算机交流信息的基本方式,是人向计算机发出的指令序列,人通
3、过计算机程序指挥计算机的活动。,程序存储控制,任何工具所做的工作,都是由程序控制的。 只有工具具备记忆程序功能,并能按照程序进行自我控制,该工具才能自动工作。,CPU指令系统,由0、1序列构成的指令码组成 如:10000000 加10010000 减,用助记符号描述的指令系统 如 ADD A, B,面向机器的语言,程序设计是数据被加工的过程,C语言程序设计 第一章 C语言概述,1.1.2计算机程序设计语言,Ada,ALGOL60,ALGOL68,Pascal,Modula-2,CPL,BCPL,B,C,C+,Java,LISP,PROLOG,COBOL,FORTRAN77,FORTRAN,PL
4、/1,Simula 67,Smalltalk 80,BASIC,ANSI-BASIC,QBASIC,VB,FORTRAN90,file.exe,C语言程序设计 第一章 C语言概述,程序代码的录入, 生成源程序*.c,语法分析查错,翻译 生成目标程序*.obj,与其它目标程序或库 链接装配,生成可执行 程序*.exe,1.2 C语言及其标准,C语言是目前世界上流行、使用最广泛的高级程序设计语言。 C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。 语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。,C语言的设计者 Dennis M.
5、 Ritchie,C标准:标准C:K&R合著The C Programming LanguageANSI C:1983年87 ANSI C:1987年国际标准的ANSI C :1990年,Ada,ALGOL60,ALGOL68,Pascal,Modula-2,CPL,BCPL,B,C,C+,Java,LISP,PROLOG,COBOL,FORTRAN77,FORTRAN,PL/1,Simula 67,Smalltalk 80,BASIC,ANSI-BASIC,QBASIC,VB,FORTRAN90,1.3 C语言程序概要 例1.1 第一个程序 Hello,World!,/* example1.
6、1 The first C Program*/ #include main() printf(“Hello,World!”); ,C语言程序设计 第一章 C语言概述,输出: Hello,World!,C程序编程运行环境TC2.0,例1.2,/* example1.1 calculate the sum of a and b*/ #include /* This is the main program */ main() int a,b,sum;a=10;b=24;sum=add(a,b);printf(”sum= %dn“,sum); /* This function calculates t
7、he sum of x and y */ int add(int x,int y) int z;z=x+y;return(z); ,运行结果: sum=34,C语言程序设计 第一章 C语言概述,格式特点 习惯用小写字母,大小写敏感 不使用行号,无程序行概念 可使用空行和空格 常用锯齿形书写格式,C语言程序设计 第一章 C语言概述,main( ) . ,main( ) int i , j , sum;sum=0;for(i=1; i10;i+)for(j=1;j10;j+)sum+=i*j ;printf(“%dn”,sum); ,优秀程序员的素质之一: 使用TAB缩进 对齐 有足够的注释 有合
8、适的空行,选择结构,二分支选择结构,多分支选择结构,循环结构,当型循环结构,直到型循环结构,P,A,假,真,A,P,真,假,1.3.3 名字与声明 标识符 定义:用来标识变量、常量、函数等的字符序列 组成: 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 大小写敏感 不能使用关键字 长度:最长32个字符 命名原则: 见名知意 不宜混淆 如l与I, o与0,例:判断下列标识符号合法性 sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char ab _above $123,M.D.John,3days,#33,
9、char,$123,ab,32个关键字:(由系统定义,不能重作其它定义) auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef unsigned union void volatile while,C语言程序设计 第一章 C语言概述,变量 概念:其值可以改变的量 变量名与变量值 变量定义的一般格式:数据类型 变量1,变量2,变
10、量n;,变量初始化:定义时赋初值,例:int a,b,c;float data;,决定分配字节数 和数的表示范围,合法标识符,例:int a=2,b,c=4;float data=3.67;char ch=A;int x=1,y=1,z=1;int x=y=z=1;,变量的使用:先定义,后使用,例1 int student;stadent=19;,例2 float a,b,c;c=a%b;,变量定义位置:一般放在函数开头,Ch2_005.c,2.4 运算符和表达式,学习运算符应注意: 运算符功能 与运算量关系 要求运算量个数 要求运算量类型 运算符优先级别 结合方向 结果的类型,算术运算符和表
11、达式 基本算术运算符: + - * / % 结合方向:从左向右 优先级: - -* / % - + -(2) (3) (4) 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据,例 5/2 =-5/2.0 =,例 5%2 =-5%2 =1%10 =5%1 =5.5%2,例 5/2 = 2 -5/2.0 = -2.5,例 5%2 = 1 -5%2 = -11%10 = 15%1 = 05.5%2 (),自增、自减运算符+ - 作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i+
12、1或i-1),例 j=3; k=+j; j=3; k=j+; j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,自增、自减运算符+ - 作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i+1或i-1),说明: + - 不能用于常量和表达式,如5+,(a+b)+ + -结合方向: 自右向左 优先级:- + - -* /
13、% -+ -(2) (3) (4),例 -i+ -(i+)i=3; printf(“%d”,-i+); /-3,例 -i+i=3; printf(“%d”,-i+);,Ch2_009.c,赋值运算符和表达式 简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符 种类:+= -= *= /= %= = = &= = |=,例 a=3;c=d+2;,说明: 结合方向:自右向左 优先级: 14 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=
14、x-2*y;a+b=3;,例 float f; int i;i=10; f=i; 则 f=10.0,例 int i; i=2.56; /结果i=2;,例: a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),/表达式值为5,a,b,c值为5,/ b=5;a=5,/表达式值11,c=6,a=11,/表达式值10,a=10,b=4,c=6,/表达式值5,a=5,b=10,c=2,说明: 结合方向:自右向左 优先级: 12 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量
15、的类型,例: a=12; a+=a-=a*a,例: int a=2; a%=4-1; a+=a*=a-=a*=3;,/a=-264 等价于a=a+(a=a-(a*a),/a=0 等价于a=a+(a=a*(a=a-(a=a*3),34,数据类型(Data Type),数据为什么要区分类型? 例2-1中“2 * 3.14159 * 5.3”的2为整数, 5.3和3.14159为实数,其范围不一样 开辟不同的内存空间 可以参加的运算不同不同类型的数据代表不同的 数据表示形式 合法的取值范围 占用内存空间大小 可参与的运算种类,35,在程序中指定数据的类型就是为了明确存储空间的大小,以便对内存中的数据
16、进行操作!,36,数据类型树型结构,37,基本数据类型,整型int 整数,在目前绝大多数机器上占4个字节。TC环境中是2个字节 单精度实型float 单精度浮点数,一般是4个字节长 双精度实型double 双精度浮点数,一般是8个字节长 字符型char 字符,一般是1个字节长 用来表示256个ASCII字符,或者0255的整数 枚举型enum,38,基本数据类型的分类,39,类型长度,shortintlong 可用下面运算测量: sizeof(数据或数据类型符或变量名) 求出的结果为表达式值所属类型或者类型占用的字节数,40,sizeof的应用,#include void main(void)
17、 printf(“Data type Number of bytesn“);printf(“- -n“);printf(“char %dn“, sizeof(char);printf(“int %dn“, sizeof(int);printf(“short int %dn“, sizeof(short);printf(“long int %dn“, sizeof(long);printf(“float %dn“, sizeof(float);printf(“double %dn“, sizeof(double); ,41,数据类型修饰符,在基本数值数据类型之前都可以加各种类型修饰符。,42,数
18、据类型修饰符,short short int,短整数,一般2个字节长。通常简写为short long long int,长整数,一般是4个字节长。通常简写为long long double,长双精度(高精度)浮点数,一般是10个字节长。 signed 用来修饰char、int、short和long,说明他们是有符号的整数(正整数、0和负整数)。一般缺省都是有符号的,所以这个修饰符通常省略 unsigned 用来修饰char、int、short和long,说明他们是无符号的整数(正整数和0),43,数据在内存中的存储格式,整型(以补码方式存储) 实型(默认为double型,以浮点数指数形式存储)
19、 N=S2j字符型(存放ASCII码值 ),44,如何选择恰当的数据类型?,具体问题具体分析,尽量选择取值范围较大些的数据类型 1+2+3+ 1!+2!+3!+ 13+23+33+,45,在例2-1中,将圆半径用一个实型变量r来存放,程序源代码如下: #include void main() float r = 5.3; /* 定义实数变量,以备后面使用 */printf(“area = %fn“, 3.14159 * r * r); /* 输出面积 */printf(“circumference = %fn“, 2 * 3.14159 * r);/* 输出周长 */ ,46,【例2-3】求两
20、个整数的和。,#include void main() int a=23,b=45; /* 定义两个整型变量 */printf(“sum=%dn“, a+b); 其中,“%d”表示按十制整数输出。,47,问题?,如果我们希望将面积和周长、以及两数和保存起来,应该怎么办?,48,数据的两种形式,数据的表现形式有两种: 常量 变量 在上述程序中, 常量(常数):5.3、23、45 变量:r、a、b,49,常量与变量,常量是一种在程序中保持固定类型和固定值的数据。编译系统从数据形式上可以区分(除枚举类型外)。常量分为: 整型常量 实型常量 字符常量 字符串常量 枚举常量 变量是在程序执行过程中可以改
21、变。,50,整型常量,整型常量 十进制:18、-31 long int型常量 123l、123L、123456l、123456L unsigned int型常量 123u、 123U 根据实际数据大小确定int型还是long型,51,八进制与十六进制常量,以数字“0”开始的整型常量是八进制数 022、-037 010和10大小不一样 因为八进制并不常用,所以此种表示法比较少见 以“0x”或者“0X”开始的整型常量是十六进制 AF和af用来表示十进制的1015 十六进制的形式比较常用 0x12、-0x1F, -0x1f,52,整型常量的几种形式,三种形式: 十进制整数:由数字09和正负号表示.如
22、 123,-456,0 八进制整数:由数字0开头,后跟数字07表示.如0123,011 十六进制整数:由0x开头,后跟09,af,AF表示. 如0x123,0Xff,例 12 与 12L,例 30000 为int型65536 为long int 型,整型常量的类型 根据其值所在范围确定其数据类型 在整常量后加字母l或L,认为它是long int 型常量,问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10,53,字符(Character)常量,字符常量的表示方法 a,A,5,%,$ 单引号内只能有一个字符,除非用“”开头 就是一个普通整数,也可以参与各种数学运
23、算 每个字符具有一个0255之间的数值,可从ASCII表查出 注意:5和整数5的区别 字符的数学运算在密码学内用得比较多 用“”开头的字符为转义字符 例如,n,代表1个字符,附录A,54,字符常量转义符,转义字符 一些特殊字符(无法从键盘输入或者另有它用)用转义字符表示,55,例2-4 转义符举例,/*LI2_4.c*/ #include void main(void) printf(“*ntABC 123n abc 321tbn*n“); ,56,字符串(String)常量,用双引号括住的由0个或多个字符组成的字符序列 “I am a string“ “表示空字符串 转义字符也可以在字符串中
24、使用 引号只作为字符串开始和结束的标志 C语言内部用0表示字符串的结束 “x“和x是不同的,57,实型常量,实型常量 十进制小数形式 :123.45、456.78 指数形式 :1e-2、4.5e3 float型常量 123.45f、 456.78F、1e-2f、4.5e3F long double型常量 123.45l、 456.78L、4.5e3L 缺省为double,58,为什么需要常量?,假如不使用常量,直接使用常数,有什么影响? 程序的可读性变差 容易发生书写错误 修改麻烦 常量只能在定义时赋值,以后不能再改变其值 符号常量(宏常量) 常数、符号常量,都可以用来表示一个永远不会改变的数
25、 建议不要直接使用常数,而用后者代替,59,符号常量,也可以用标识符代表常量,称为符号常量。其定义格式为:#define 符号常量 常数或字符序列,60,符号常量,符号常量 也称宏常量 一般采用大写字母表示 不是语句,而是一种编译预处理命令 宏替换 使用字符序列替换,61,求圆面积和圆周长另解,/*求圆面积和圆周长*/ #include #define PI 3.14159 #define R 1.5 void main(void) printf(“area = %fn“, PI * R * R);printf(“circumference = %fn“, 2 * PI * R); ,area
26、 = 7.068577 circumference = 9.424770,62,自动类型转换,同种数据类型的运算结果,还是该类型 不同种数据类型的运算结果,是两种类型中取值范围更大的那种long double double float long int short char,63,自动类型转换规则,64,自动类型转换,在进行赋值操作时,会发生类型转换 将取值范围小的类型转为取值范围大的类型是安全的 反之是不安全的 如果大类型的值在小类型能容纳的范围之内,则平安无事 但是,浮点数转为整数,会丢失小数部分,非四舍五入,65,自动类型转换例子,66,类型强制转换(Casting),类型强制转换运算符
27、“(类型)” 消除从大到小的警告 l = (long)i; 可以通过“(类型)表达式”的方式把表达式的值转为任意类型,67,数据强制转换举例,#include void main() int m = 5;printf(“m / 2=%dn“, m/2);printf(“(float)(m/2) = %fn“, (float)(m/2);printf(“(float)m/2 = %fn“, (float)m/2);printf(“m = %dn“, m); ,m/2 = 2 (float)(m/2) = 2.000000 (float)m/2 = 2.500000 m = 5,精度损失问题,68
28、,问题的提出,在例2-1中,半径是一个给定的常数,能不能使用键盘输入一个数据作为半径计算圆周长和面积呢?例2-2 运行时输入半径,计算圆的周长和面积,并将结果输出到屏幕,试编程实现。,69,问题的分析,圆周长L2R,圆面积SR R 为3.14159,是实数,2为整数,这两个数均是常数。 R为要输入的半径,是一个可以变化的量。 L和S分别为所计算的圆周长和圆面积存放的地方,其值随R的变化而变化。这里涉及到格式化输入输出,下面介绍。,70,格式化输入输出,如何进行数据的输入输出? 输入:从标准输入设备上输入数据到计算机内存 输出:将计算机内存中的数据送到标准输出设备 C语言中输入输出操作通过调用标
29、准库函数来实现,71,库函数,常用的输入输出函数(附录C),72,格式输出函数,格式输出函数 printf(格式控制字符串, 输出项表列); 输出若干个任意类型的数据 printf(“a=%d b=%5.2f“, a, b);,73,格式说明符含义,%d或%i按十进制有符号整数输出,正数的符号省略 %u按十进制无符号整数输出 %o按八进制无符号整数输出(不输出前导0) %x或X按十六进制无符号整数输出(不输出前导符0x) %c按字符型数据输出 %s按字符串数据输出 %f按小数形式输出(6位小数) %e或E按指数形式输出实数 %输出本身 %g或G选用%f或%e格式中输出宽度较短的一种格式,不输出
30、无意义的0,74,附加格式说明符,m 表示数据占用的宽度,正整数 n 对实数,指定小数位数(四舍五入)对字符串,指定实际输出位数 l 加在d、o、x、u前:输出长整型加在f、e 、g前:输出双精度型 h 加在d、o、x 前:输入短整型 - 输出数据在域内左对齐(默认右对齐) + 指定在有符号数的正数前显示正号(+),75,输入格式函数,scanf(格式控制字符串, 地址表列) 按照指定格式输入数据,76,格式输入函数,格式输入函数 scanf(格式控制字符串, 地址表列); scanf(“%d,%f”, ,函数scanf()中的格式控制字符串中除了格式说明以外的其他字符,必须在输入数据时原样输
31、入。,77,scanf格式字符,d,i以带符号十进制形式输入整型数据 u 以无符号十进制形式输入整型数据 o 以八进制无符号形式输入(无前导0) x 以十六进制无符号形式输入(无前导0x) c 以字符形式输入单个字符 s 输入字符串,以非空字符开始,遇第一个空白字符结束 f 以小数形式输入实数 e 以指数形式输入实数,78,scanf附加格式说明符,l 加在d、o、x、u前:输入长整型加在f、e 前:输入双精度型 L 加在f、e 前:输入long double型 h 加在d、o、x 前:输入短整型 m 表示数据占用的宽度,正整数 * 本输入项在读入后不赋给相应的变量,79,格式输入函数常见错误
32、,常见错误 scanf(“%d,%fn”,80,输入数据时,遇以下情况时该数据认为结束 遇空格、回车、TAB 键 遇非法输入,格式输入数据中止,81,#include void main() int a, b;printf(“Please input a and b:“);scanf(“%2d%*2d%2d “, ,Please input a and b:,a=12, b=56, a+b = 68,123456,例:计算两数之和,82,#include void main() int a, b;printf(“Please input a and b:“);scanf(“%2d%*2d%2d
33、“, ,Please input a and b:,a=12, b=5, a+b = 17,12345a,例:计算两数之和,非法输入,83,#include void main() int a, b;scanf(“%d %d“, ,问题1:当要求程序输出结果为a = 12, b = 34 时,用户应该如何输入数据?,12 34,例:输入数据的格式控制,84,#include void main() int a, b;scanf(“%d %d“, ,问题2:当限定用户输入数据以逗号为分隔符,即输入数据格式为: 12, 34 时,应修改程序中的哪条语句?怎样修改?,scanf(“%d,%d“, ,
34、例:输入数据的格式控制,85,#include void main() int a, b;scanf(“%d %d“, ,问题3:语句scanf(“%d %d“, 时,用户应该如何输入数据?,a = 12, b = 34,例:输入数据的格式控制,86,#include void main() int a, b;scanf(“%d %d“, ,问题4:限定用户输入数据为以下格式为 1234 同时要求程序输出结果为a = 12, b = 34,scanf(“%2d%2d“, ,例:输入数据的格式控制,87,#include void main() int a, b;scanf(“%d %d“, ,
35、问题5:限定用户输入数据为以下格式为 12 34同时要求程序输出结果为a = “12“, b = “34“,scanf(“%d%d“, ,例:输入数据的格式控制,88,#include void main() int a, b;scanf(“%d %d“, ,问题6:设计程序使得用户可以以任意字符(回车、空格、制表符、逗号、其它)作为分隔符进行数据的输入,scanf(“%d%*c%d“, ,例:输入数据的格式控制,89,预处理命令,作用:对源程序编译之前做一些处理,生成扩展C源程序 种类 宏定义 #define 文件包含 #include 条件编译 #if-#else-#endif等 格式:
36、“#”开头 占单独书写行 语句尾不加分号 在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们被称为预处理部分。,90,预处理,所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。 预处理是语言的一个重要功能,它由预处理程序负责完成。 当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。,91,预处理命令文件包含,#include “stdio.h“ 在当前目录和TC指定的目录中找该文件 #include 在由TC指定的文件目录中找该文件,92,不带参数的宏定义,一般形式: #define 宏名 宏
37、体 功能:用指定标识符(宏名)代替字符序列(宏体),如 if(x=YES) printf(“correct!n”);else if (x=NO) printf(“error!n”); 展开后: if(x=1) printf(“correct!n”);else if (x=0) printf(“error!n”);,宏展开:预编译时,用宏体替换宏名-不作语法检查,如 #define YES 1#define NO 0#define PI 3.1415926#define OUT printf(“Hello,World”);,宏体可缺省,表示宏名定义过或取消宏体,定义位置:任意(一般在函数外面)
38、作用域:从定义命令到文件结束 #undef可终止宏名作用域格式: #undef 宏名,宏定义可嵌套,不能递归,例 #define MAX MAX+10 (),引号中的内容与宏名相同也不置换,例 #define PI 3.14159printf(“2*PI=%fn”,PI*2); 宏展开:printf(“2*PI=%fn”,3.14159*2);,宏定义中使用必要的括号(),例 #define WIDTH 80#define LENGTH WIDTH+40var=LENGTH*2; 宏展开:var= 80+40 *2;,93,带参数的宏定义,一般形式: #define 宏名(参数表) 宏体,例
39、#define S (r) PI*r*r 相当于定义了不带参宏S,代表字符串“(r) PI*r*r”,宏展开:形参用实参换,其它字符保留 宏体及各形参外一般应加括号(),例 #define S(a,b) a*barea=S(3,2); 宏展开: area=3*2;,不能加空格,例 #define POWER(x) x*xx=4; y=6;z=POWER(x+y); 宏展开:z=x+y*x+y; 一般写成: #define POWER(x) (x)*(x) 宏展开: z=(x+y)*(x+y);,94,用宏定义和函数实现同样的功能,#define MAX(x,y) (x)(y)?(x):(y).
40、 main() int a,b,c,d,t;.t=MAX(a+b,c+d); 宏展开:t=(a+b)(c+d)?(a+b):(c+d);,int max(int x,int y) return(xy?x:y); void main() int a,b,c,d,t;.t=max(a+b,c+d); ,95,文件包含,功能:一个源文件可将另一个源文件的内容全部包含进来 一般形式: #include “文件名”或 #include ,处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译, 直接按标准目录搜索 “” 先在当前目录搜索,再搜索标准目录 可指定路径,
41、96,嵌套包含与集中包含,被包含文件内容 源文件(*.c) 头文件(*.h),宏定义 数据结构定义 函数说明等,文件包含可嵌套 file1.c中包含file2.c,file2.c中包含file3.c,97,例2-2 问题的实现,/*LI2_2.c*/ #include #define PI 3.14159 void main( ) float R,L,S; /* 定义实数变量,分别存放半径、周长、面积 */printf(“Please input R:“); /* 显示输入半径R的提示信息 */scanf(“%f“, /* 输出面积 */ ,注释,预处理命令,定义变量,主函数,用库函数 实现输
42、入,用库函数 实现输出,赋值语句,98,问题?,运行时输入的半径是否符合要求呢?比如输入一个负数怎么办?,半径的判断可以使用条件运算符(?:)来实现,条件表达式的格式为:表达式1 ? 表达式2 : 表达式3 expr1 ? expr2 : expr3,99,条件运算符,条件运算符的运算规则是:如果“表达式1”的值非0(为真),则该条件表达式的结果就是“表达式2”的值,否则,就是“表达式3”的值。其中,“表达式1”为关系表达式或逻辑表达式,当然也可以为整型或字符型量。,100,条件运算符,执行顺序: 先求表达式1, 若表达式1的值为非0,则求表达式2,此时表达式2的值就作为整个条件表达式的值;
43、若表达式1的值为0,则求表达式3,此时表达式3的值就作为整个条件表达式的值。,101,下面再解决一个问题:,102,例2-14 输入半径,求圆的周长、面积 和球的表面积、体积,【分析】首先输入半径,如果输入的半径为负数,则取其绝对值,取绝对值函数在math.h头文件中定义,详见附录C,需要使用文件包含命令包含进来;其次定义不带参数的宏,表示3.1415926常量;再定义带参数的宏求周长、面积等,最后输出结果。,103,例2-14 程序,/*LI2_14.c*/ #include /* scanf()和printf()函数在此定义 */ #include /* 绝对值函数fabs()在此定义 *
44、/ #define PI 3.1415926 /* 宏定义(符号常量) */ #define L(r) 2*PI*r /* 宏定义(求圆周长),引用已有的宏PI */ #define S(r) PI*r*r /* 宏定义(求圆面积),引用已有的宏PI */ void main() float l,s,r,q,v; /* 定义变量 */printf(“Please input r :“); /* 提示信息 */scanf(“%f“, ,104,关系运算符及其表达式,关系运算符 种类:= != 结合方向:自左向右 优先级别:,例 ca+b /c(a+b)ab!=c /(ab)!=ca=bc /a=
45、(bc),关系表达式的值:是逻辑值“真”或“假”,用1和0表示,例 int a=3,b=2,c=1,d,f;ab (ab)=cb+cbf=abc,/*表达式值1*/,/*表达式值1*/,/*表达式值0*/,/*d=1*/,/*f=0*/,105,关系运算符注意事项,例 若a=0; b=0.5; x=0.3;则 a=x=b的值为,0,例 5278在C中是允许的,值为,0,例 int i=1, j=7,a; a=i+(j%4!=0); 则a=,2,例 a0 结果为A100 结果为,1,0,106,关系运算符注意事项,例 注意区分“=”与“=”int a=0,b=1;if(a=b) printf(“
46、a equal to b”);elseprintf(“a not equal to b”);,例 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0=1.0 结果为 可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,0,107,2.3 C程序概貌,根据前面讲过的几个程序,可以总结出C源程序的基本结构特点如下: 一个C语言源程序有且只能有一个主函数(main函数)。 函数由函数头和函数体构成,函数体由声明部分和执行部分构成。 源程序中可以有预处理命令,预处理命令通常应放在源程序的最前面。 每一个声明、每一个语句都必须以分号结尾。但预处理命令、函数头和花括号“”之后不能加分号。,108,书写C程序时应遵循的规则,从书写清晰,便于阅读、理解和维护的角度出发,在书写程序时应遵循以下规则: 一个声明或一个语句占一行。 用“”括起来的部分,通常表示程序的某一层次结构。“”一般与该结构语句的第一个字母对齐,并单独占一行。第一个花括号“”后面也可以用空格分隔后直接书写语句,但花括号“”原则上都是单独占一行。 低一层次的语句或声明可比高一层次的语句或声明缩进若干格后书写。以便看起来更加清晰,增加程序的可读性。在编程时应力求遵循这些规则,以养成良好的编程风格。 在C程序中的所有符号均为英文符号(即半角符号)。,