资源预览内容
第1页 / 共88页
第2页 / 共88页
第3页 / 共88页
第4页 / 共88页
第5页 / 共88页
第6页 / 共88页
第7页 / 共88页
第8页 / 共88页
第9页 / 共88页
第10页 / 共88页
亲,该文档总共88页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第2章 用C语言表达程序2.1 C程序的结构 C程序是由若干个函数组成 其中有且只有一个主函数(main)。主函数是 程序的入口,主函数调用其它函数完成任 务,相当于把一个大任务分成若干小任务 逐块完成。 一个程序的整体思路是:“输入-处理-输出” 的模式。 在程序中需要用到像变量一类的标识符, 必须先定义后使用。 程序中通常需要用到输入输出函数,比如 键盘输入、屏幕输出,因此,希望每一个 程序的第一行都加上#include 2.1.1 简单结构 【例2-1】输入两个整数,输出其和。 【分析】 输入:用键盘输入两个数存入变量a,b;用 函数scanf实现。 处理:直接用加法运算a+b,将结果存入 变量c;“存入”用C语言的赋值操作实现。 输出:用函数 printf 向屏幕输出。【说明】 #include 相当于把系统中的文件 stdio.h的内容插入到程序中。程序中使用到标准输入函数scanf和标准输 出函数printf,在使用它们之前必须先声明 ,而文件stdio.h中的主要内容就是对标准输 入输出函数调用格式的说明(称函数声明 ),所以通常放在程序的开头,称 *.h(head)的文件为头文件。这一行叫做“包 含标准输入输出头文件”。 C语言规定,所有标识符都必须先定义 (即规定标识符的名称和其他属性), 后使用。如变量名、符号常量名、函数 名。 标识符的名字必须是以字母或下划线开头 的字母、数字、下划线串。不能以数字开 头,也不能含有其它符号,如小数点、空 格、逗号等。apple-pric、3W、都不是一 个合法的标识符,下面几种是合法的: apple_price、ApplePrice、ApplePrice2、 W3。 标识符尽量取成有意义的名字,以便 阅读程序方便。如用max表示最大、 min表示最小、ApplePrice表示苹果的 价格等等。现在流行的匈牙利取名法 ,比如fApplePrice表示苹果的价格是 浮点数(实数),不但具有实际名字的意 义,而且还具有程序设计的意义。 C语言区别标识符的大小写字母。如max 与Max是两个不同的标识符。 一对花括号表示了一段语义的开始与结束 。 上面这个简单程序表达了清晰的“输入-处 理-输出”的工作流程。 程序中给出适当的注释,可以使阅读程序 更容易。 /* */ 方便阅读和备忘。 / 单行注释。【例2-2】输入两个整数,输出它们的平方和 。 【分析】 输入:用函数scanf实现键盘输入两个整数 ,存入变量a,b; 处理:计算a2+b2,在C语言中用a*a+b*b 表达,将计算结果存于变量square中; 输出:把第步的计算结果square输出, 用函数printf实现。 【说明】 本例多用了一个printf,目的是在程序运行 时屏幕上出现需要输入数据的提示。 变量名square比变量名c更有意义,增加 了程序的可读性。 本程序仍用“输入-处理-输出”的思维模式, 初学者切记此法。2.1.2 简单函数构造与调用 一个问题可以分解为更容易解决的小问题 ,把每一个小问题构造成一个函数,使程 序结构更清晰。另外,有一些问题可能会 反复用到某一个小问题,写程序时只需要 构造一个函数而反复使用。【例2-3】圆的周长与面积。 【分析】 输入:用函数scanf实现键盘输入圆的半径r 。 处理:用求圆的周长和面积的公式,计算 周长c、面积s。 输出:把上面的计算结果c和s用函数printf 向屏幕输出。 圆的半径决定了圆的性质,因此,只要输入圆 的半径,其周长和面积就容易计算了。其中 圆周率只能取近似值。【说明】 如果程序运行时,用户输入的半径是一个 负数,计算还有意义吗? 为了避免这样的情 况发生需要在程序中做“判断”,后面例题将 讲到。 这里用到实数类型float,对应的输入输出函 数中也有变化。对比前面例2-1用到的整数 类型int及其输入输出格式符号(%d)的区别 。输入输出格式控制字符对应输入输出数 据的类型,在后面章节中再细讲。#include void main( ) float r, c, s; /定义变量r为半径,c为周长,/s为面积,它们都为实数scanf(“%f“, / 输入圆的半径c = 2 * 3.1415926 * r;s = 3.1415926 * r * r;printf(“周长为:%f, 面积为:%fn“, c, s); 在某些问题中需要反复计算不同半径的周 长和面积,可以把这两个计算专门拿出来 #include float c(float r) return 2*3.1415926*r; float s(float r) return 3.1415926*r*r; void main( ) / 主函数 float r ; /* 定义变量r为半径 */ scanf(“%f“, / 输入圆的半径 printf(“周长为:%f, 面积为:%fn“, c(r), s(r) ); 上面这个程序把计算周长和面积单独定义 成函数c和函数s,这两个函数只要有一个半 径给它,它就能返回一个值(用return语句返 回函数值). 函数定义的一般格式为函数值类型 函数名(参数表) /函数头 /函数体 语句; 函数参数函数值图2.2 函数接口设计 函数的参数可能有多个,但函数返回值最多只有一 个。 如果函数不需要返回值,则函数名前用空类型(如 上面程序的主函数用的void类型);如果函数需要 返回值,则函数名前需明确返回值的类型,在函 数中用return实现返回值; 函数头部非常重要,它说明了一个函数的“入”和“ 出”,至于函数是如何实现的,调用者不关心。上 面程序中周长是如何求出来的,主函数并不关心 ,这样,主函数在一个更高的层次上处理问题, 结构就更清晰了。 建议把主函数放到程序最后面,养成这样 的习惯既遵守了“先定义后使用”的规则,又 容易找到。 子函数中的参数是形式参数(形参只是说 明需要一个这种类型的数据,函数才能完成 任务。在执行该函数前形参不占用存储单 元,也没有实际的值),无所谓用什么标 识符。因此注意子函数中的r和主函数里的 变量r不是同一个东西。把子函数的参数名 改一下,上机试试结果如何 ? 系统提供给我们的函数,如printf等等,也 是这样构造的。 可以看出,子函数与主函数的结构是完全 一样的。主函数也可以使用参数,主函数 由操作系统调用,因此,其参数也是由操 作系统传给主函数。如果主函数有返回值 ,当然也是返回给操作系统。 定义函数的头部非常重要,如 “float c(float r)”有三部分:函数的返回值类型 、函数名、参数表。定义了函数之后,调 用这个函数就如同调用库函数一样。2.2 常量、变量与赋值 直接写在程序代码中的数据的值是常量。 不同数据类型的主要差别是取值范围的不 同,其实质是每个数据占用的内存空间大 小不同。无论哪种数据类型,占用的空间 都是有限的。2.2.1 预处理命令【例2-4】球的表面积与体积。 #define PI 3.1415926 PI可以看成是一个常量标识符2.2.2 变量与内存 所谓变量,是与常量相对应的,类似数学 知识中的变元。 计算机领域里用“内存单元”理解。 一个字节(byte)的内存有8个二进制位(bit), 能表示的无符号数为028-1,即0255共256 个无符号数。如果把这个字节里的数看成 有符号整数,则表示范围为 128127,也是256个数 C语言规定的数据类型(比如前面用到的int 和float),实际上是告诉编译程序为变量分 配多少字节的内存空间,不同大小的内存 能表示数的范围也不一样。 使用变量就是使用内存。内存里的数据是 可以改变的,因此变量的值也是可以改变 的。但注意,尽管变量的值可以改变,在 某一时刻一个变量只能存一个值,新值覆 盖旧值。5x10y10x10y图2.4 执行“x=y”后,x原来的值被覆盖了,y的值不变 变量的值也是可以复制的,如“x=y”表示把 变量y的值存入变量x中,但y的值不变,这 就是复制,如图2.4所示。 给变量赋值,实际上就是改变相应内存里的值。如 “c=a+b”,就是把a+b的结果放到变量c中去,当然,原来c 里的值就被新值所覆盖,如图2.5所示。图2.5 执行“c=a+b”后,a、b、c变量的变化5a10b20c5x10y15c+ 从变量的实质可以看出,赋值运算符的左 边必须有存放数据的地方,一般都是变量 【例2-6】交换两个变量的值。 【分析】交换两个变量的值的PAD图如图2.6所示,最 左边的竖线表示程序执行的流程,矩形框 表示执行步骤。由PAD图可以看出各步骤 从上往下执行的顺序 图2.6 “交换两数值”的PAD图a=2t=aa=bb=tb=3输出a,b输出a,b【说明】 注意到,一行可以写多个语句,每个语句 后面必须有分号。 用图来表示内存单元数据的交换过程更直 观(如图2.7)。在执行“a = 2; b=3;”后如图 2.7(a)。注意此时变量t单元里的值是内存原 来的“残留物”,但不知道它的值具体是多少 ,我们也不关心。图2.7 变量a和b的值交换过程2a3bt(a) 执行“a = 2; b=3;”后2a3b2t(b) 执行“t=a;”后3a3b2t(c) 执行“a=b;”后3a2b2t(d) 执行“b=t;”后 计算机处理数据是一个一个地处理,如图 2.7,没有别的捷径,但计算机执行速度非 常快。 交换一对变量的值需要三个赋值语句,在 应用程序中经常需要用到“交换”操作,一定 理解并记熟。 就本题而言,交换两个变量的值,还可以 用下面三句实现,可以节省一个变量,请 读者琢磨: a = a+b; b=a-b; a=a-b;2.3 表达式 表达式用运算符和括号将运算对象连 接起来的、符合C语言语法规则的式子。【例2-7】温度的转换:华氏温度转换成摄氏温度。2.3.1 运算符【说明】 阅读教学参考书 * % 关系运算符 = )运算都是双目运算(两个 操作数), 按位取反()是单目运算。 2.3.2 使用库函数【例2-9】求解一元二次方程的根 【分析】 一元二次方程ax2+bx+c=0实际上是由系数 a,b,c决定的,因此,给出了a,b,c的值就等 同于确定了一个一元二次方程。 求解一元二次方程的根可用求根公式,只要有了a,b,c的值,不难计算该公式。 判别式=b24ac确定了根的多种情况:两 个相同的实根、两个不同的实根、一对共 轭复数根。须把判别的步骤写在程序中(下 面算法第4步)。粗略算法:步1:输入a,b,c (确定方程)步2:如果a为0,则输出“不是一元二次方程”,转5步3:求=b24ac步4:如果=0,则有相同的两个相等的实根:;否则如果0,则有两个不同的实根:;否则有一对共轭复数根: 步5:结束 图2.8 “求解一元二次方程的根”的PAD图a=0=0输入a,b,c0不是一元二次方程两个相等的实根 两个实根共轭复根=b24ac2.3.3 赋值表达式与变量的自增自减 x=1+2 赋值表达式 赋值表达式的值是赋值以后左边变量的值 。比如赋值表达式“x=1+2”的值是3 赋值语句就是赋值表达式后面加分号。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号