




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第2C语言表达程序 2.1 C程序的结构 C程序是由若干个函数组成 其中有且只有一个主函数(main)。主函数是 程序的入口,主函数调用其它函数完成任 务,相当于把一个大任务分成若干小任务 逐块完成。 一个程序的整体思路是:“输入-处理-输出” 的模式。 在程序中需要用到像变量一类的标识符, 必须先定义后使用。 程序中通常需要用到输入输出函数,比如 键盘输入、屏幕输出,因此,希望每一个 程序的第一行都加上 #include 2.1.1 简单结构 【例2-1】输入两个整数,输出其和。 【分析】 输入:用键盘输入两个数存入变量a,b;用 函数scanf实现。 处理:直接用加法运算a+b,将结果存入
2、 变量c;“存入”用C语言的赋值操作实现。 输出:用函数 printf 向屏幕输出。 【说明】 #include 相当于把系统中的文件 stdio.h的内容插入到程序中。 程序中使用到标准输入函数scanf和标准输 出函数printf,在使用它们之前必须先声明, 而文件stdio.h中的主要内容就是对标准输入 输出函数调用格式的说明(称函数声明), 所以通常放在程序的开头,称*.h(head)的 文件为头文件。这一行叫做“包含标准输 入输出头文件”。 C语言规定,所有标识符都必须先定义 (即规定标识符的名称和其他属性), 后使用。如变量名、符号常量名、函数 名。 标识符的名字必须是以字母或下划
3、线开头 的字母、数字、下划线串。不能以数字开 头,也不能含有其它符号,如小数点、空 格、逗号等。apple-pric、3W、都不是一 个合法的标识符,下面几种是合法的: apple_price、ApplePrice、ApplePrice2、 W3。 标识符尽量取成有意义的名字,以便 阅读程序方便。如用max表示最大、 min表示最小、ApplePrice表示苹果的 价格等等。现在流行的匈牙利取名法, 比如fApplePrice表示苹果的价格是浮 点数(实数),不但具有实际名字的意义, 而且还具有程序设计的意义。 C语言区别标识符的大小写字母。如max 与Max是两个不同的标识符。 一对花括号表
4、示了一段语义的开始与结束。 上面这个简单程序表达了清晰的“输入-处 理-输出”的工作流程。 程序中给出适当的注释,可以使阅读程序 更容易。 /* */ 方便阅读和备忘。 / 单行注释。 【例2-2】输入两个整数,输出它们的平方和。 【分析】 输入:用函数scanf实现键盘输入两个整数, 存入变量a,b; 处理:计算a2+b2,在C语言中用a*a+b*b 表达,将计算结果存于变量square中; 输出:把第步的计算结果square输出, 用函数printf实现。 【说明】 本例多用了一个printf,目的是在程序运行 时屏幕上出现需要输入数据的提示。 变量名square比变量名c更有意义,增加
5、了程序的可读性。 本程序仍用“输入-处理-输出”的思维模 式,初学者切记此法。 2.1.2 简单函数构造与调用 一个问题可以分解为更容易解决的小问题, 把每一个小问题构造成一个函数,使程序 结构更清晰。另外,有一些问题可能会反 复用到某一个小问题,写程序时只需要构 造一个函数而反复使用。 【例2-3】圆的周长与面积。 【分析】 输入:用函数scanf实现键盘输入圆的半径r。 处理:用求圆的周长和面积的公式,计算 周长c、面积s。 输出:把上面的计算结果c和s用函数printf 向屏幕输出。 圆的半径决定了圆的性质,因此,只要输入圆 的半径,其周长和面积就容易计算了。其中 圆周率只能取近似值。
6、【说明】 如果程序运行时,用户输入的半径是一个 负数,计算还有意义吗? 为了避免这样的情 况发生需要在程序中做“判断”,后面例 题将讲到。 这里用到实数类型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 *
7、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) ); 上面这个程序把计算周长和面积单独定义
8、 成函数c和函数s,这两个函数只要有一个半 径给它,它就能返回一个值(用return语句返 回函数值). 函数定义的一般格式为 函数值类型函数值类型 函数名函数名(参数表参数表) /函数头函数头 /函数体函数体 语句;语句; 函数函数 参数参数 函数值函数值 图图2.2 函数接口设计函数接口设计 函数的参数可能有多个,但函数返回值最多只有一 个。 如果函数不需要返回值,则函数名前用空类型(如 上面程序的主函数用的void类型);如果函数需要 返回值,则函数名前需明确返回值的类型,在函 数中用return实现返回值; 函数头部非常重要,它说明了一个函数的“入” 和“出”,至于函数是如何实现的,调
9、用者不关 心。上面程序中周长是如何求出来的,主函数并 不关心,这样,主函数在一个更高的层次上处理 问题,结构就更清晰了。 建议把主函数放到程序最后面,养成这样 的习惯既遵守了“先定义后使用”的规则, 又容易找到。 子函数中的参数是形式参数(形参只是说 明需要一个这种类型的数据,函数才能完成 任务。在执行该函数前形参不占用存储单 元,也没有实际的值),无所谓用什么标 识符。因此注意子函数中的r和主函数里的 变量r不是同一个东西。把子函数的参数名 改一下,上机试试结果如何 ? 系统提供给我们的函数,如printf等等,也 是这样构造的。 可以看出,子函数与主函数的结构是完全 一样的。主函数也可以使
10、用参数,主函数 由操作系统调用,因此,其参数也是由操 作系统传给主函数。如果主函数有返回值, 当然也是返回给操作系统。 定义函数的头部非常重要,如 “float c(float r)”有三部分:函数的返回值 类型、函数名、参数表。定义了函数之后, 调用这个函数就如同调用库函数一样。 2.2 常量、变量与赋值 直接写在程序代码中的数据的值是常量。 不同数据类型的主要差别是取值范围的不 同,其实质是每个数据占用的内存空间大 小不同。无论哪种数据类型,占用的空间 都是有限的。 2.2.1 预处理命令 【例2-4】球的表面积与体积。 #define PI 3.1415926 PI可以看成是一个常量标识
11、符 2.2.2 变量与内存 所谓变量,是与常量相对应的,类似数学 知识中的变元。 计算机领域里用“内存单元”理解。 一个字节(byte)的内存有8个二进制位(bit), 能表示的无符号数为028-1,即0255共256 个无符号数。如果把这个字节里的数看成 有符号整数,则表示范围为 128127,也是256个数 C语言规定的数据类型(比如前面用到的int 和float),实际上是告诉编译程序为变量分 配多少字节的内存空间,不同大小的内存 能表示数的范围也不一样。 使用变量就是使用内存。内存里的数据是 可以改变的,因此变量的值也是可以改变 的。但注意,尽管变量的值可以改变,在 某一时刻一个变量只
12、能存一个值,新值覆 盖旧值。 5x10y 10 x10y 图图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变量的变化变量的变化 5a10b20c 5x10y15c + 从变量的实质可以看出,赋值运算符的左 边必须有存放数据的地方,一般都
13、是变量 【例2-6】交换两个变量的值。 【分析】 交换两个变量的值的PAD图如图2.6所示,最 左边的竖线表示程序执行的流程,矩形框 表示执行步骤。由PAD图可以看出各步骤 从上往下执行的顺序 图图2.6 “交换两数值交换两数值”的的PAD图图 a=2 t=a a=b b=t b=3 输出输出a,b 输出输出a,b 【说明】 注意到,一行可以写多个语句,每个语句 后面必须有分号。 用图来表示内存单元数据的交换过程更直 观(如图2.7)。在执行“a = 2; b=3;”后如 图2.7(a)。注意此时变量t单元里的值是内存 原来的“残留物”,但不知道它的值具体 是多少,我们也不关心。 图图2.7
14、变量变量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 表达式 表达式用运算符和括号将
15、运算对象连 接起来的、符合C语言语法规则的式子。 【例2-7】温度的转换:华氏温度转换成摄氏温度。 2.3.1 运算符 【说明】 阅读教学参考书 * % 关系运算符 = = != = 逻辑运算符 ! 否则如果0,则有两个不同的实根: ; 否则有一对共轭复数根: 步5:结束 2 b x a 12 22 bb xx aa 和 22 b xi aa 图图2.8 “求解一元二次方程的根求解一元二次方程的根”的的PAD图图 a=0 =0 输入输入a,b,c 0 不是一元二次方程不是一元二次方程 两个相等的实根两个相等的实根 两个实根两个实根 共轭复根共轭复根 =b24ac 2 b x a 2 b x a
16、 22 b xi aa 2.3.3 赋值表达式与变量的自增自减 x=1+2 赋值表达式 赋值表达式的值是赋值以后左边变量的值。 比如赋值表达式“x=1+2”的值是3 赋值语句就是赋值表达式后面加分号。 自增和自减 x = x +1写成变量x自增:+x或x+; x = x - 1写成变量x自减:- - x或x - -; 自增和自减也是赋值,是变量自己增1或减 1后送回自己,因此,自增自减操作只能用 在可以赋值的变量上。 自增和自减操作只是为了提高程序运行的 速度,其实完全可以用赋值来表示。 +x是先增后用,即先把x的值增加1以后再 把x拿来运算, y=+x; 相当于执行 x=x+1;y=x; x
17、+是先用后增,即先把x的值用作运算以后 再把x增加1, y=x+; 相当于执行 y=x; x=x+1; 单独使用自增的语句, +x与x+效果是相同 的 自减也是一样的道理 x = x+5,C语言中可以写成x+=5 - =、*=、/=、 变量在原来的基础上修改自己的值 注意:复合赋值运算符的运算规则与赋值 运算符一样:先对右边的表达式求值,再 做(复合)赋值运算。 复合赋值运算 2.4 基本输入输出 所有高级语言系统都将输入输出处理成子 程序放到函数库中,程序设计者只需调用 而不需过多掌握硬件性能。 2.4.1 格式输入输出 scanf(按格式扫描scan format)和printf(按指 定
18、格式打印print format ) 格式是指函数中用到的类似%d、%f等以 “%”引导的格式字符,是告诉程序以什么 样的格式输入或输出。 scanf 告诉程序需要输入什么类型的数据,并在 键盘输入结束之后敲入回车键 除了规定的格式字符以外的字符,在程序 运行时必须原样输入 scanf(%d,as%d, double y=1234.5678; printf(十进制输出:%d, %lfn,x,y); printf(加前导0的输出:%05d, %09.2lfn,x,y); printf(十六进制输出(大写字母):%Xn, x); printf(十六进制输出(小写字母):%xn, x); print
19、f(八进制输出:%on, x); 【说明】 有些编译器对输出格式%f和%lf不加区别; 八进制输出格式只能用小写字母o; 输入输出格式字符都是以“%”引导的。 如果需要在屏幕上看见一个“%”,则在程 序中须用“%”。 2.4.2 字符输入输出 特指一个字符的输入输出 字符在计算机里是用代码表示的 ASCII 每个字节代表一个字符的编码 汉字用两个字节编码 字符输入函数 getchar( ) :键盘输入一个字符,回车以后 返回输入的字符给程序; getch( ):在键盘上按一个键,立即将按键 的字符返回给程序,但不把这个字符显示 在屏幕上。 注意:函数getch不是标准库函数,需要 conio.
20、h预处理说明。conio.h是控制台 (console)输入输出头文件。 字符输出函数 putchar( ):其参数就是待输出字符的代码 【例2-11】键盘输入字符,输出其后面的字 符。如输入A 则输出B . 【分析】 用一个变量去接收键盘的字符,再把这个 变量的值增1然后输出。我们用getch()取键 盘字符。 【程序】 【说明】 字符类型char取值是-128127,本例也可以用无 符号字符型unsigned char。 特殊字符:用引导符 给出一个字符的表示方 法,如 n 表示换行字符,其ASCII码是10。 注意,字符常量用单引号。符号 用于特殊字符 的引导符,如果想在屏幕上看见一个
21、,须在程 序中用连续两个符号 ,用单引号的 代表字符 。 本例中+c与c+是不同的。 字符的运算实际是用对应的ASCII值,如c=A,变 量c的值就是65,+c即c的值变为66,此时用 putchar(c)实际输出ASCII值为66的字符(B)。可 以理解为A与65相等。 如果接收的字符没有别的用途,可不用变 量暂存,但不能用成+getch()。因为自增 或自减是赋值运算,只针对变量操作。 #include #include void main() putchar(getch()+1); putchar(n); 2.5 基本数据类型 数据类型的用途: 明确变量的取值范围; 明确变量占用内存空间
22、大小; 编译程序检查变量在各种情形下的使用是 否合法。 2.5.1 数据在内存中的存储 类型类型标识符标识符 VC占用占用 字节数字节数 取值范围取值范围 字符型字符型char1-128 +127 无符号字符型无符号字符型unsigned char10255 (ASCII表附录表附录) 短整型短整型short int (简写简写short)2-32768+32767 无符号短整型无符号短整型unsigned short20 65535 整型整型int4-231+231-1 无符号整型无符号整型 unsigned int (简写简写unsigned) 40 232-1 (4294967295)
23、长整型长整型long int (简写简写long)4-231+231-1 无符号长整型无符号长整型unsigned long40232-1 浮点型浮点型float4(3.410-383.41038),有效数字,有效数字7位位 双精度型双精度型double8(1.710-3081.710308),有效数字,有效数字 15位位 长双精度型长双精度型long double10(3.410-49323.4104932),有效数字,有效数字 18位位 2.5.2 变量的地址、用指针存取数据 变量其实就是一片内存空间。一片内存空 间实际上由两个条件决定:一是这片空间 的起始地址(首地址),二是这片空间的长
24、度 (字节数)。 每个存储单元都有一个编号,这个编号就 是内存地址。 每个变量可能不止占用一个单元,如 double型变量占用8个单元,如图2.9. 图图2.9 double类型变量占用的空间与首地址类型变量占用的空间与首地址 变量变量a 首地址首地址&a 第一个条件,需要取得变量的首地址,比 如变量a的首地址用&a得到(&a到底是多少, 我们一般不关心其具体值),在前面使用格 式输入函数scanf已经用到过&a; 第二个条件由变量的数据类型决定占用空 间大小。 地址有一个特别的名称叫指针;专门用于存地址 的变量就叫指针变量。 例如定义一个指向double数据的指针变量p: double *p
25、 指针变量p的值就是某一片内存的首地址,而这片 内存空间的长度由类型double决定。 如果赋值p=&a,则p的值是变量a的首地址,如图 2.10. 图图2.10 指针变量的值是内存地址指针变量的值是内存地址 &a 变量变量a 指针变量指针变量p 用变量p取得变量a的数据用*p,即*p就是a 的值。 但注意:指针变量必须指向一个确定的地 址才有意义(如上面用了“p=&a”),否则, 如果p的值是未知区域的地址,向这片空间 存值是危险的,甚至会使得系统崩溃。 指针概念是C语言的精华,通过指针直接使 用内存的方式使设计程序非常灵活而效率 非常高,请读者多理解。更重要的是,指 针概念可以打开程序设计
26、的思路。 【例2-12】用指针存取变量的值。 【分析】 如果用指针变量p存取简单变量a的值,可用 p=&a得到变量a的地址,再用*p存或取a的 值。 【程序】 【说明】 变量定义“int a=5, *p”后,变量a有了空 间而且赋了初值5(如图2.11(a),但变量p的 值不确定(尽管p也有值,但我们不知道它 的值到底是多少,而且可能每次运行p的值 都不一样)。 语句“p = &a”就明确了p的值,就是a 的地址(如图2.11(b)。从此,只要不改变 p 的值,p指向的地方就是变量a的空间,所 以“*p = 6”就等价于“a=6”。 图图2.11 变量与指针的关系变量与指针的关系 p 5a (
27、b) 执行执行“p=&a”后后 5a (a) 执行执行“int a=5”后后 a的首地址到底是多少呢?一般情况下,我 们并不关心变量的具体地址。但经过编译 链接以后,程序运行时操作系统会分配给 变量一个恰当的空间,也就有了地址。可 由printf(%p, &a)得到变量a的地址,或 “p = &a”后,由printf(%p,p)得到p的值, 即变量a的地址。 指针变量p也是变量,当然p也有地址,p 的地址就是指向指针的指针,因为p的空间 里装的是地址(指针)。 简单理解,指针就是地址。 2.5.3 表达式混合运算的数据类型转换 表达式混合运算的数据类型转换:向占用 空间大的数据类型转换;如果有占用空间 相同的两种类型则向实数类型(浮点型、双 精度型、长双精度型)转换,这样不至于丢 掉小数部分。 数据类型的转换有以下几种: 自然转换。当各种类型的数据混合使用在 表达式中,最后的结果是其中占用空间最 多的那种数据类型,以保证精度不降低。 如果有实数类型,最后结果是占用空间最 多的实数类型。 赋值转换。不管赋值语句的右端是什么类 型
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 法律慈善公益创新创业项目商业计划书
- 乳清蛋白粉创新创业项目商业计划书
- 咖啡环保家居用品创新创业项目商业计划书
- 智能语音会议记录系统创新创业项目商业计划书
- 痛风性肾病的治疗与护理
- 百分数应用题难点突破训练
- 社区医生家庭管理方案(3篇)
- 政务中心装修平面方案(3篇)
- 农水改造项目招标方案(3篇)
- 房子楼梯改建方案(3篇)
- 查漏知识 短语800组+词形转换360组-2025年中考英语冲刺复习
- 科技创新团队的职责与组织分工
- MR/T 0001-2025自然人网店管理规范
- 2025年中考历史二模试卷(河南卷)
- 《中枢神经系统疾病患者护理》课件
- 江苏淮安2025年公开招聘农村(村务)工作者笔试题带答案分析
- GB/T 23480-2025电火花小孔加工机床精度检验
- 2025-2030国内中成药行业市场深度调研及发展前景与投资机会研究报告
- DB32T 4972.1-2024传染病突发公共卫生事件应急处置技术规范 第1部分:监测预警
- 银行合同签署管理制度
- 颈动脉粥样硬化的健康宣教
评论
0/150
提交评论