08级C语言第一章电子教案.ppt_第1页
08级C语言第一章电子教案.ppt_第2页
08级C语言第一章电子教案.ppt_第3页
08级C语言第一章电子教案.ppt_第4页
08级C语言第一章电子教案.ppt_第5页
已阅读5页,还剩162页未读 继续免费阅读

下载本文档

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

文档简介

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 ,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 the sum of x and y */ int add(int x,int y)

6、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缩进 对齐 有足够的注释 有合适的空行,选择结构,二分支选择结构,多分支选择

7、结构,循环结构,当型循环结构,直到型循环结构,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,char,$123,ab,32个关键字:(由系

8、统定义,不能重作其它定义) 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,变量n;,变量初始化:定义时赋初值,例: in

9、t 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 运算符和表达式,学习运算符应注意: 运算符功能 与运算量关系 要求运算量个数 要求运算量类型 运算符优先级别 结合方向 结果的类型,算术运算符和表达式 基本算术运算符: +

10、 - * / % 结合方向:从左向右 优先级: - -* / % - + - (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 = -1 1%10 = 1 5%1 = 0 5.5%2 (),自增、自减运算符+ - 作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i+1或i-

11、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)+ + -结合方向: 自右向左 优先级:- + - -* / % -+

12、 - (2) (3) (4),例 -i+ -(i+) i=3; printf(“%d”,-i+); /-3,例 -i+ i=3; printf(“%d”,-i+);,Ch2_009.c,赋值运算符和表达式 简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量,复合赋值运算符 种类:+= -= *= /= %= = = c=d+2;,说明: 结合方向:自右向左 优先级: 14 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=x-2*y; a+b=3;,例

13、 float f; int i; i=10; f=i; 则 f=10.0,例 int i; i=2.56; /结果i=2;,例: a=b=c=5 a=(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 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例: a=

14、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,在程序中指定数据的类型就是为了明确存储空间的大小,以便对内存中的数据进行操作!,36

15、,数据类型树型结构,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) printf(

16、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,数据类型修饰符,short shor

17、t 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型,以浮点数指数形式存储) N=S2j 字符型(存放ASCI

18、I码值 ),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】求两个整数的和。,#include v

19、oid main() int a=23,b=45; /* 定义两个整型变量 */ printf(sum=%dn, a+b); 其中,“%d”表示按十制整数输出。,47,问题?,如果我们希望将面积和周长、以及两数和保存起来,应该怎么办?,48,数据的两种形式,数据的表现形式有两种: 常量 变量 在上述程序中, 常量(常数):5.3、23、45 变量:r、a、b,49,常量与变量,常量是一种在程序中保持固定类型和固定值的数据。编译系统从数据形式上可以区分(除枚举类型外)。常量分为: 整型常量 实型常量 字符常量 字符串常量 枚举常量 变量是在程序执行过程中可以改变。,50,整型常量,整型常量 十进

20、制:18、-31 long int型常量 123l、123L、123456l、123456L unsigned int型常量 123u、 123U 根据实际数据大小确定int型还是long型,51,八进制与十六进制常量,以数字“0”开始的整型常量是八进制数 022、-037 010和10大小不一样 因为八进制并不常用,所以此种表示法比较少见 以“0 x”或者“0X”开始的整型常量是十六进制 AF和af用来表示十进制的1015 十六进制的形式比较常用 0 x12、-0 x1F, -0 x1f,52,整型常量的几种形式,三种形式: 十进制整数:由数字09和正负号表示.如 123,-456,0 八进

21、制整数:由数字0开头,后跟数字07表示.如0123,011 十六进制整数:由0 x开头,后跟09,af,AF表示. 如0 x123,0Xff,例 12 与 12L,例 30000 为int型 65536 为long int 型,整型常量的类型 根据其值所在范围确定其数据类型 在整常量后加字母l或L,认为它是long int 型常量,问题: 0123 = ( )10 0 x123 = ( )10 0Xff = ( )10,53,字符(Character)常量,字符常量的表示方法 a,A,5,%,$ 单引号内只能有一个字符,除非用“”开头 就是一个普通整数,也可以参与各种数学运算 每个字符具有一个

22、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 表示空字符串 转义字符也可以在字符串中使用 引号只作为字符串开始和结

23、束的标志 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,为什么需要常量?,假如不使用常量,直接使用常数,有什么影响? 程序的可读性变差 容易发生书写错误 修改麻烦 常量只能在定义时赋值,以后不能再改变其值 符号常量(宏常量) 常数、符号常量,都可以用来表示一个永远不会改变的数 建议不要直接使用常数,而用后者代

24、替,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 = 7.068577 circumf

25、erence = 9.424770,62,自动类型转换,同种数据类型的运算结果,还是该类型 不同种数据类型的运算结果,是两种类型中取值范围更大的那种 long double double float long int short char,63,自动类型转换规则,64,自动类型转换,在进行赋值操作时,会发生类型转换 将取值范围小的类型转为取值范围大的类型是安全的 反之是不安全的 如果大类型的值在小类型能容纳的范围之内,则平安无事 但是,浮点数转为整数,会丢失小数部分,非四舍五入,65,自动类型转换例子,66,类型强制转换(Casting),类型强制转换运算符“(类型)” 消除从大到小的警告 l

26、 = (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,问题的提出,在例2-1中,半径是一个给定的常数

27、,能不能使用键盘输入一个数据作为半径计算圆周长和面积呢? 例2-2 运行时输入半径,计算圆的周长和面积,并将结果输出到屏幕,试编程实现。,69,问题的分析,圆周长L2R,圆面积SR R 为3.14159,是实数,2为整数,这两个数均是常数。 R为要输入的半径,是一个可以变化的量。 L和S分别为所计算的圆周长和圆面积存放的地方,其值随R的变化而变化。 这里涉及到格式化输入输出,下面介绍。,70,格式化输入输出,如何进行数据的输入输出? 输入:从标准输入设备上输入数据到计算机内存 输出:将计算机内存中的数据送到标准输出设备 C语言中输入输出操作通过调用标准库函数来实现,71,库函数,常用的输入输出

28、函数(附录C),72,格式输出函数,格式输出函数 printf(格式控制字符串, 输出项表列); 输出若干个任意类型的数据 printf(a=%d b=%5.2f, a, b);,73,格式说明符含义,%d或%i按十进制有符号整数输出,正数的符号省略 %u按十进制无符号整数输出 %o按八进制无符号整数输出(不输出前导0) %x或X按十六进制无符号整数输出(不输出前导符0 x) %c按字符型数据输出 %s按字符串数据输出 %f按小数形式输出(6位小数) %e或E按指数形式输出实数 %输出本身 %g或G选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0,74,附加格式说明符,m 表示数据

29、占用的宽度,正整数 n 对实数,指定小数位数(四舍五入) 对字符串,指定实际输出位数 l 加在d、o、x、u前:输出长整型 加在f、e 、g前:输出双精度型 h 加在d、o、x 前:输入短整型 - 输出数据在域内左对齐(默认右对齐) + 指定在有符号数的正数前显示正号(+),75,输入格式函数,scanf(格式控制字符串, 地址表列) 按照指定格式输入数据,76,格式输入函数,格式输入函数 scanf(格式控制字符串, 地址表列); scanf(%d,%f”, ,函数scanf()中的格式控制字符串中除了格式说明以外的其他字符,必须在输入数据时原样输入。,77,scanf格式字符,d,i以带符

30、号十进制形式输入整型数据 u 以无符号十进制形式输入整型数据 o 以八进制无符号形式输入(无前导0) x 以十六进制无符号形式输入(无前导0 x) c 以字符形式输入单个字符 s 输入字符串,以非空字符开始,遇第一个 空白字符结束 f 以小数形式输入实数 e 以指数形式输入实数,78,scanf附加格式说明符,l 加在d、o、x、u前:输入长整型 加在f、e 前:输入双精度型 L 加在f、e 前:输入long double型 h 加在d、o、x 前:输入短整型 m 表示数据占用的宽度,正整数 * 本输入项在读入后不赋给相应的变量,79,格式输入函数常见错误,常见错误 scanf(%d,%fn”

31、,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, ,Please input a and b

32、:,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, ,例:输入数据的格式控制,85,#include voi

33、d 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, ,问题5:限定用户输入数据为以下格式为 12 34 同时要求程序输出结

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等 格式: “#”开头 占单独书写行 语句尾不加分号 在源程序中这些命令都放在函数之外,而且一般

35、都放在源文件的前面,它们被称为预处理部分。,90,预处理,所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。 预处理是语言的一个重要功能,它由预处理程序负责完成。 当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。,91,预处理命令文件包含,#include stdio.h 在当前目录和TC指定的目录中找该文件 #include 在由TC指定的文件目录中找该文件,92,不带参数的宏定义,一般形式: #define 宏名 宏体 功能:用指定标识符(宏名)代替字符序列(宏体),如 if(x=YES) printf

36、(“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”);,宏体可缺省,表示宏名定义过或取消宏体,定义位置:任意(一般在函数外面) 作用域:从定义命令到文件结束 #undef可终止宏名作用域 格式: #unde

37、f 宏名,宏定义可嵌套,不能递归,例 #define MAX MAX+10 (),引号中的内容与宏名相同也不置换,例 #define PI 3.14159 printf(“2*PI=%fn”,PI*2); 宏展开:printf(“2*PI=%fn”,3.14159*2);,宏定义中使用必要的括号(),例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2; 宏展开:var= 80+40 *2;,93,带参数的宏定义,一般形式: #define 宏名(参数表) 宏体,例 #define S (r) PI*r*r 相当于定义了不带参宏S,代表

38、字符串“(r) PI*r*r”,宏展开:形参用实参换,其它字符保留 宏体及各形参外一般应加括号(),例 #define S(a,b) a*b . area=S(3,2); 宏展开: area=3*2;,不能加空格,例 #define POWER(x) x*x x=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) . main() int a,b,c,d,t; . t=MA

39、X(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 ,处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译, 直接按标准目录搜索 “” 先在当前目录搜索,再搜索标准目录 可指定路径,96,嵌套包含与集中包含,被包含文件内容 源文件

40、(*.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, /* 输出面积 */ ,注释,预处理命令,定义变量,主函数,用库函数 实现输入,用库函数 实现输出,赋值语句,98,问题?,运行

41、时输入的半径是否符合要求呢?比如输入一个负数怎么办?,半径的判断可以使用条件运算符(?:)来实现,条件表达式的格式为: 表达式1 ? 表达式2 : 表达式3 expr1 ? expr2 : expr3,99,条件运算符,条件运算符的运算规则是:如果“表达式1”的值非0(为真),则该条件表达式的结果就是“表达式2”的值,否则,就是“表达式3”的值。 其中,“表达式1”为关系表达式或逻辑表达式,当然也可以为整型或字符型量。,100,条件运算符,执行顺序: 先求表达式1, 若表达式1的值为非0,则求表达式2,此时表达式2的值就作为整个条件表达式的值; 若表达式1的值为0,则求表达式3,此时表达式3的

42、值就作为整个条件表达式的值。,101,下面再解决一个问题:,102,例2-14 输入半径,求圆的周长、面积和球的表面积、体积,【分析】 首先输入半径,如果输入的半径为负数,则取其绝对值,取绝对值函数在math.h头文件中定义,详见附录C,需要使用文件包含命令包含进来; 其次定义不带参数的宏,表示3.1415926常量; 再定义带参数的宏求周长、面积等,最后输出结果。,103,例2-14 程序,/*LI2_14.c*/ #include /* scanf()和printf()函数在此定义 */ #include /* 绝对值函数fabs()在此定义 */ #define PI 3.1415926

43、 /* 宏定义(符号常量) */ #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)!=c a=bc /a=(bc),关系表达式的值:是逻辑值“真”或“

44、假”,用1和0表示,例 int a=3,b=2,c=1,d,f; ab (ab)=c b+cb f=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(“a equal to b”)

45、; else printf(“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程序时应

46、遵循的规则,从书写清晰,便于阅读、理解和维护的角度出发,在书写程序时应遵循以下规则: 一个声明或一个语句占一行。 用“”括起来的部分,通常表示程序的某一层次结构。“”一般与该结构语句的第一个字母对齐,并单独占一行。第一个花括号“”后面也可以用空格分隔后直接书写语句,但花括号“”原则上都是单独占一行。 低一层次的语句或声明可比高一层次的语句或声明缩进若干格后书写。以便看起来更加清晰,增加程序的可读性。在编程时应力求遵循这些规则,以养成良好的编程风格。 在C程序中的所有符号均为英文符号(即半角符号)。,109,2.4 举一反三,例2-15 编写程序输出如下形状的图形: * * * 【分析】 图形中

47、每行为星号,可以使用printf()函数完成,第几行就有几个星号。每行必须有换行符。 #include void main() printf(*n); printf(*n); printf(*n); ,110,例2-18:求梯形面积,【分析】 设梯形上底为a,下底为b,高为h,面职为s,则 s(ab)h2 /*LI2_18.c*/ #include void main( ) float a,b,h,s; printf(please input a,b,h:); /* 从键盘获得3个实数r , ,111,混合运算示例,源代码如下: void main() long x,y; int a,b,c,

48、d; x=5;y=6; a=7;b=8; c=x+a;d=y+b; printf(c=x+a=%d,d=y+b=%dn,c,d); ,112,强制类型转换示例,#include int main() int a=90,b=50; float f; f=a/b; printf(f=%fn,f); f=(float)a/b; printf(f=%fn,f); return 0; ,113,例2-20:计算两个实数之和,【分析】 首先要输入两个实数,然后在计算两个数的加法,最后再输出和。 /*LI2_20.c*/ #include void main() float x, y ,sum; print

49、f(Input two floating decimals:); scanf(%f%f, /* 输出x和y相加之和 */ 程序完成了几个功能:输入两个实数、计算两个实数的和、输出两个实数的和。仅管如此,由于这个程序语句较少,所以在一个主函数中可以完成。如果实用程序的功能很多,也在一个主函数中实现吗?这个问题我们将在第3章中介绍。,114,建 议,学好程序设计语言的唯一途径是上机练习 你的编程能力与你在计算机上 投入的时间成正比,115,习题2,教材:习题2.1、2.3。 教材:习题2.10、2.13。,116,第一次课后的思考题:如何求两个数的最大(小)值?,117,思考题,C程序可以由除了由

50、main()函数完成以外,能否通过编写自定义函数完成?,二进制与八进制之间的转换 二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制 八进制转换成二进制:用3位二进制数代替每一位八进制数,例 (1101001)2=(001,101,001)2=(151)8,例 (246)8=(010,100,110)2=(10100110)2,000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7,符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符(identifier)。简单地说,标识符就是一个名字。 C语言规定标识符只能由字母、

51、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。下面列出的是合法的标识符,也是合法的变量名:sum,average, -total, class, day, month, student-name,tan,lotus-1-2-3,basic, li-ling 下面是不合法的标识符和变量名: dohn,y 123,33,3d64,ab,注意,大写字母和小写字母被认为是两个不同的字符。因此,sum和suM,class和class是两个不同的变量名。一般,变量名用小写字母表示,与人们日常习惯一致,以增加可读性。 ANSI C标准没有规定标识符的长度(字符个数),但各个c编译系统都有自己的规

52、定。有的系统(如ib PC的s C)取8个字符,假如程序中出现的变量名长度大于8个字符,则只有前面8个字符有效,后面的不被识别。例如,有两个变量:student_name和student_number,由于二者的前8个字符相同,系统认为这两个变量是一回事而不加区别。可以将它们改为stud_name和stud_num,以使之区别。,Turbo C则允许32个字符。因此,在写程序时应了解所用系统对标识符长度的规定,以免出现上面的混淆。这种错误并不反映在编译过程中(即语法无错误) ,但运行结果显然不对。为了程序的可移植性(即在甲机器上运行的程序可以基本上不加修改,就能移到乙机器上运行)以及阅读程序的

53、方便,建议变量名的长度不要超过8个字符。 如前所述,在选择变量名和其他标识符时,应注意做到“见名知意”,即选有含意的英文单词(或其缩写)作标识符,如count、name、day、month、total、country等,除了数值计算程序外,一般不要用代数符号(如a、b、c、x1、y1等)作变量名,,以增加程序的可读性。这是结构化程序的一个特征。本书在一些简单的举例中,为方便起见,仍用单字符的变量?如a、b、c等),请读者注意不要在其他所有程序中都如此。 在c语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”,如例12、例13那样。这样做的目的是: (1) 凡未被事先定义的,不作为

54、变量名,这就能保证程序中变量名使用得正确。例如,如果在定义部分写了 int student;,而在执行语句中错写成staent。如: staent=30; 在编译时检查出statent未经定义,不作为变量名。因此输出“变量statent未经声明”的信息,便于用户发现错误,避免变量名使用时出错。 (2) 每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。如指定a、b为int型,turbo c编译系统为a和b各分配两个字节,并按整数方式存储数据。 (3) 指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量a和b,可以进行求余运算:,a%b

55、 %是“求余”(见3.8节),得到a/b的余数。如果将a、b指定为实型变量,则不允许进行“求余”运算,在编译时会给出有关“出错信息”。 下面各节分别介绍整型、实型(浮点型)、字符型数据。,3.3 整型数据,3.3.1 整型常量的表示方法 整型常量即整常数。c整常数可用以下三种形式表示: (1) 十进制整数。如123, -456, 0。 (2) 八进制整数。以0开头的数是八进制数。如0123表示八进制数123,即(123)8,其值为:182+281+380,等于十进制数8 3。-011表示八进制数-11,即十进制数-9。 (3) 十六进制整数。以0 x开头的数是十六进制数。如0 x123,代表十

56、六进制数123,即(123)16=1162+2161+3160=256+32+3=291。-0 x12等于十进制数-18。,3.3.2 整型变量 1. 整型数据在内存中的存放形式数据在内存中是以二进制形式存放的。 如果定义了一个整型变量i: int i; /* 定义为整型变量 */ i=10; /* 给i赋以整数10 */ 十进制数10的二进制形式为1010,在微机上使用的c编译系统,每一个整型变量在内存中占2个字节。图3.2(a)是数据存放的示意图。图3.2(b)是数据在内存中实际存放的情况。,二进制与十六进制之间的转换 二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十

57、六进制 十六进制转换成二进制:用4位二进制数代替每一位十六进制数,例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16,例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2,0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F,字节和位 内存以字节为单元组成 每个字节有一个地址 一个字节一般由8个二进制位组成 每个二进位的值是0或1,数值的表示方法原码、反码和补码 原码:最高位为符号位,其余各位为数值本身的绝对值 反码: 正数:反码与原码相同 负数:符号位为1,

温馨提示

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

最新文档

评论

0/150

提交评论