




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计C语言程序设计C语言程序设计C语言程序设C语言程序C语言程序设计C语言程序设计C语言程序设计C语言 3.1 语句 三、语句分类 C 语言语句不多,可分为下面 5 类。 控制语句 完成选择、循环和转移等功能,共 9 种; 函数调用语句 由一个函数加一个分号构成; 表达式语句 由一个表达式加分号构成一个语句。任何表达式都可以加上分号而成为语句 (如:a=3; +x;),这是 C 语言的一个重要特色。 因此,C 语言也被叫作“表达式语言”。 空语句 只有一个“;”号的语句。 复合语句 将语句用“”括起来的一组语句,用于执行一系列语句,与顺序结构对应。 四、C 语言语句的书写 C 语言语
2、句的书写非常自由 一行可以写多个语句; 一个语句也可以拆开写在几行上。 但清晰的、有层次的良好的语句书写习惯,对于程序的可读性将有很大的帮助。 程序中的注释包含在“/*”和“*/”之间或“/”之后 对程序的功能没有任何影响,注释的目的是帮助人们理解程序 (C99 可用“/”),。 编译程序对注释、空格、制表符和回车换行的处理一样,只是简单地跳过不予处理。3.2 顺序结构 (复合) 赋值表达式和(复合)赋值语句的不同特点 赋值表达式出现在语法上要求使用表达式的地方,而且常常要使用表达式的值; 赋值语句不能出现在要求使用表达式的地方, 使用时,主要用它的赋值功能,不关心其值。 例: (a = b
3、) 0 是合法的表达式, ( a = b; ) 0 是非法的。 说明 由于 C 语言赋值表达式形式多样,用法灵活,掌握其运算规律有利于写出正确的赋值语句。 赋值语句只能出现在程序的可执行部分。 用赋值语句和复合赋值语句时,要求赋值号两侧的数据类型一致,否则,系统按赋值号左边变量的类型进行自动转换。 如:若 f 是浮点数,语句 f = 1.0; 比 f = 1; 的运行效率要高。 二、数据输入输出 1. 概述 输入输出 (I/O) 概念 把数据从计算机内部送到外部设备 (如显示屏、打印机、磁盘等) 的操作称为“输出”。 从外部设备 (如键盘、磁盘等) 将数据送入计算机内部的操作称为 “输入”。
4、标准输入是指从标准输入设备 (键盘) 输入数据,标准输出是指将数据输出到标准输出设备 (显示屏) 上。 输入输出实现 C 语言本身没有 I/O 语句,I/O 操作通过函数来实现。 不同系统提供的函数的数量、名字和功能不完全相同,有些通用的函数各系统都提供。 C 语言函数库中有一批以标准 I/O 设备为对象的“标准输入输出函数”; 本节介绍其中常用的四种: scanf ( ) , printf ( ) getchar ( ), putchar ( ) 输入输出函数的使用 使用 I/O 函数,要在程序开头写入一预编译包含命令: # include stdio.h 是一个头文件,其中包括全部 I/O
5、 库函数的数据类型定义和函数说明。 对于 Visual C+ 6. 0 系统: *.cpp 的 C+ 程序 # include 命令不能省; *.c 的 C 程序若省略 # include 命令,编译会出现警告,但还能正确运行。 由于编排的关系,在后面的很多例子中, # include 命令都省略,调试时最好加上。键盘输入: 缓冲输入 操作系统和 C 程序标准输入函数采用缓冲输入方式; 输入数据后,按“Enter”键,数据才能进入缓冲区内。 程序再从缓冲区取数据,如果没有数据,进入等待输入的状态,直到通过键盘输入数据,并按“Enter”键把数据又放入缓冲区,程序才能继续输入操作。1 1 2 2
6、 a ba bABAB取数据进缓冲 2. 字符输入函数 getchar( ) 功能:从标准输入设备读入一字符,没有参数;返回:字符的 ASCII 码值或 EOF(文件结束标志) main ( ) char a, b, c ; a = getchar( ) ; b = getchar( ) ; c = getchar( ) ; printf(a=%d b=%d c=%dn, a,b,c); printf(a=%c b=%c c=%cn, a,b,c); 键盘输入:输出:a=49 b=10 c=97a=1 b=c=a1ab1ab 3. 字符输出函数 putchar ( ) 功能:putchar (
7、int c) 向标准输出写一个字符;如果 c 是某个控制字符的 ASCII 码,输出控制字符时,会变成相应的设备动作。如: putchar( n ); 引起屏幕换行操作例如:把一个输入字符输出,并换一行。main ( ) char c; c = getchar( ); putchar (c); putchar (n); 4. 格式输出函数 printf ( ) 格式:printf ( 格式控制串, 参数表 ) ;例:printf(abc=%dn, b=%8.2f , a, b+1);功能: 按指定格式向显示器输出数据。返回: 输出字节数或 EOF (出错时),(较少用)。参数表:要输出的数据,
8、可以是表达式,可以多个 (用“,”分隔),也可以没有 。格式控制串:(包含两种信息)原样输出:普通字符或转义序列格式说明:%修饰符 格式字符 格式字符 定义输出数据的类型;(见表 1) 格式字符要用小写; 与输出项个数应相同,按顺序一一对应; 与输出项类型不一致,自动按指定格式输出。int a=3, b=4;printf(%d %d n,a, b ); printf(a=%d,b=%dn,a,b);输出结果:3 4a=3 , b=4main() unsigned short u=65535; printf ( u = %hd n,u );输出结果:u = -1非符号11111111111111
9、11 无符号整数 65535符号位1111111111111111 十进制整数 -1 修饰符:插在“%”和格式字符之间,说明宽度、 对齐方式、正负号和前导符等。(见表2) 长度修饰符 长整型数一定要加 l,如“%ld”(VC 没用) h 表示短整型或无符号短整型。(TC 没用) 宽度控制 m.n (后面例子中加红色的要记住) 缺省宽度是数据本身的宽度,采用右对齐。 m 是输出数据总的宽度。 当 m 小于数据宽度时,使用缺省宽度; 当 m 大于数据宽度时,数据右对齐,左边补空格; 如:“1234” n 对不同格式符有不同含义 对 e、E 或 f 类型实型数 指定小数点位数 小数位数大于 n 时,
10、按四舍五入截去多余小数; 小数位数小于 n 时,小数右边添 0。 例: (红色为常用格式,要记住) printf (%f n,123.45); 结果:123.450000 (缺省) printf (%12f n,123.45); 结果:123.450000 printf (%en,123.45); 结果:1.23450e+02(缺省) printf (%14en,123.45); 结果:1.23450e+02 printf (%gn,123.45); 结果:123.45 printf (%8gn,123.45); 结果:123.45 printf (%7.3f n,12.34); 结果:12.
11、340 (右边添0) printf (%7.1f n,123.45); 结果:123.5 (四舍五入) 左对齐控制 在宽度前加“-” (减号) 实现。 例如 printf (%4d#n, 123); 结果:123# printf (%-4d#n,123); 结果:123# printf (%8.5fn, 1.234); 结果:1.23400 printf(%-8.5fn, 1.234); 结果:1.23400 正负号显示控制 在宽度前加“+”号实现。如: printf (%+d%+dn,12,-12); 结果:+12-12 前导字符控制 在宽度前加“0”字符实现。如: printf ( %06
12、.0f n,123.45 ); 结果:000123 增加八进制和十六进制标志 在 % 或 o 后 x 之间插入“#”号实现。如: printf (%#o, %#xn,12, 255 ); 结果:014, 0 xff 非正常输出问题 格式输出过程中,如果出现非正常输出 (如溢出),可能会引起以后输出内容的混乱。如:printf (%hd %d n, 60000, 60000); 由于第一个输出数据 60000 超出了 %hd 格式的表示范围,输出 -5536 后,导致其他的输出结果出现混乱。 %d 的表示范围是基本整型数的取值范围,在 TC 中 2 字节,在 VC 中 4 字节。 解决办法是保证
13、输出格式和输出数据在类型和范围的正确对应关系。 如:在 TC 中,加 %ld,在 VC 不用加 l 。 5. 格式输入函数 scanf ( )格式: scanf (格式控制串, 地址表);功能:按指定格式从键盘读入数据,存入地址表 指定的存储单元中,并按回车键结束;返回值:正常时,返回输入数据个数 (使用不多)地址表: 变量的地址,常用取地址运算符 &(各输入项用逗号隔开) 如:&a, &b格式控制串 (参考 printf )用双引号括起来的字符串,由“%”符号、格式字符和其他字符组成。用于指定输入时的数据格式。 格式字符 每个格式说明都必须用 % 开头,以一个格式字符
14、结束。 (见表3) 匹配 格式说明的个数应该与输入项数相同,且类型应该一一匹配。 不仅如此,要使 scanf ( ) 函数正确完成数据输入,需要在程序运行时,按照输入项的顺序和类型输入正确格式的数据。 附加格式说明符 (修饰符) 在“%”和格式字符之间见表 4 其他字符: 格式描述串里还可以写各种字符,其中空白字符包括空格、制表符和换行符,scanf() 函数对它们忽略不计。 遇到除字符“%”之外的非空白字符 (原样字符),scanf ( ) 将其与输入流中的下一个非空白字符匹配。 字符相同则匹配成功;否则匹配失败,scanf ()停止工作。 输入缓冲区字符序列的情况 当程序调用标准输入函数时
15、,实际上是要求用掉输入缓冲区字符序列最前面的一个或几个字符。如 getchar() 用掉最前面的一个字符。 而 scanf() 函数,如果序列中的字符符合要求,会用掉最前面的几个字符;如果无法完成指定的转换,可能一个字符也没用掉。 序列中用掉一个字符就少了一个字符,未用掉的字符仍在序列中。 scanf ( ) 函数的工作过程 设 scanf() 正要处理的是转换描述串 %d,输入序列到达某个地方,scanf() 从这里开始工作: 首先读入和丢掉空白字符 (可能一个或多个,也可能没有),找到下一个不为空白的字符,开始转换。 由于 %d 要求的是十进制数,如果此非空白字符不能看作为数的一部分 (不
16、是09,也不是正负号),匹配失败,返回已完成的成功转换项数,输入停留在这个未能成功匹配的字符处,留待以后输入使用。 若遇到的字符是数的一部分,scanf 逐个读入字符,直到遇到不属于这个数的字符为止。已读入的字符,转换成整型数的内部形式,赋给变量。(如:-123a) 数据输入操作 (运行时如何正确输入数据?) 输入分隔符 一般以空格、TAB 或回车键作为分隔符 例1:scanf (%d%d, &a, &b); 若给 a 输入 12,给 b 输入 36。 输入为:1236 或者:12 36 例2:scanf (%d%o%x,&a,&b,&c); print
17、f (a=%d, b=%d, c=%dn,a,b,c); 输入:123 123 123 输出: a=123, b=83, c=291 其它分隔符:格式串中两个格式符间字符 例3:字符 : 为分隔符scanf (%d:%d:%d, &h, &m, &s);输入:12:30:45则:12 h, 30m, 45s 例4:字符 , 为分隔符scanf(%d,%d, &a, &b)输入: 3,4 则: 3a, 4 b 例5:字符作为分隔符scanf(a=%d,b=%d, &a, &b);输入:a=12,b=24 则: 12a, 24 b 输入普通字
18、符 “格式字符串”中出现的普通字符,包括转义字符 (并不把它当转义字符来解释),务必原样输入。例如:原样字符的输入 scanf (a=%d, b=%dn, &a, &b); 假设给 a 输入12,给 b 输入 36, 正确的输入操作为:a=12, b=36n 使用格式说明符 %c 输入单个字符 空格和转义字符均作为有效字符被输入。 例如:scanf ( %c%c%c,&c1,&c2,&c3); 假设输入:ABC 则将:字母 A c1,空格 c2,B c3 在输入数据时认为数据结束的情况 遇到空格,或者回车键,或者 Tab 键; 遇到输入域宽度结束;如 %
19、3d 只取 3 列 遇到非法输入。 如:scanf( %d%c%f ,&a, &b, &c); 若输入:1234a123o.2 则:1234a,ab,123 c 输入函数在缓冲区留下的“垃圾”解决方法 用 getchar ( ) 清除 用函数 fflush (stdin) 清除全部剩余内容 用格式串中空格或“%*c”来“吃掉” 例1:int x; char ch; scanf (%d,&x); ch = getchar(); printf (x=%d, ch=%dn, x, ch); 输入:123 输出:x=123,ch=10 例2:int x; char ch
20、; scanf (%d, &x ); scanf (%c, &ch ); 或:scanf (%*c%c, &ch); 表1 printf ( ) 函数格式字符int a=567;printf (%d, a);int a=255;printf(%x, a);int a=65;printf(%o, a);int a=567;printf(%u, a);char a=65;printf(%c,a);printf(%s,ABC);printf(%e, a);printf(%f, a);printf(%g, a);printf(%);float a=567.89;567ff101
21、567AABC5.67800e+002567.89000567.89% 表2 printf ( ) 附加格式说明符(修饰符) 表3 scanf ( ) 函数格式字符scanf(%c,&a);scanf(%d,&a);scanf(%i,&a);scanf(%o,&a);scanf(%x,&a);scanf(%u,&a);scanf(%f,&a);scanf(%s,&a);3.14abcB31010183B 3 0123.14abc12123 表4 scanf ( ) 附加格式说明符 (修饰符)*抑制符,指定输入项读入后不赋给变量。m
22、指定输入数据宽度,遇空格或不可转换字符则结束。l用于d、o、x前,指定输入为 long 型整数;用于 e、f 前,指定输入为 double 型实数。用于d、o、x前,指定输入为 short 型整数。 例1 scanf(%3d%*4d%f,&k, &f); 输入:12345678765.4 则: 123k, 8765.43f 4567 不赋给变量 scanf(%4d%2d%2d,&y,&m,&d); 例2 输入:20111015 则:2011y, 10m, 15d scanf(%2d %*3d %2d,&a,&b); 例3 输入:12 34
23、5 67 则: 12a, 345不赋给变量, 67b 例4 scanf (%3c%2c, &c1, &c2); 输入:abcde 则:ac1, dc2 三、复合语句和空语句 1. 复合语句 (也称“语句块”) 形式: 语句1; 语句2; 语句n; 说明 最后一个语句的分号 “;” 不能缺少; 复合语句内,可有执行语句,还可有定义部分,定义部分应该出现在可执行语句的前面; C 编译将整个 内的结构视作一条语句。 使用情况 C 语言中复合语句经常用来表示一些控制结构的执行体。如循环结构的循环体、选择结构中某一条件的执行部分和函数的执行体等。2. 空语句什么是空语句C 程序的所有语句
24、都必须由一个分号“;” 结束。如果一个语句只有一个分号,这个语句叫“空语句”。功能 空语句执行时不产生任何动作。说明 程序中有时需要用空语句来表示存在一条语句,但随意加分号也会导致逻辑上的错误,要特别小心。 四、顺序程序设计举例 1. 程序设计基本步骤 分析和分解问题 将问题分解为输入、处理和输出三个部分: 首先分析题目要求的输入是什么,用什么方法输入,输入后怎样保存; 其次应考虑对输入需要进行什么处理,需要什么空间开销,使用什么程序结构,处理结果如何保存等问题; 最后考虑用什么方法和格式输出结果。 画出程序的基本轮廓 (流程图,N-S图等工具) 实现该程序 2. 例举例1 两个整型变量内容的
25、交换。输入两整数给 x 和 y,交换 x 和 y 的值,并输出交换前后 x 和 y 的值,验证是否正确交换。分析 本例对输入输出的要求很明确,对输入数据的处理需要交换 x 和 y 的值。不可以简单地用 x=y; y=x; 来实现。 错误的交换过程: x=y; y=x;xy55 35 为了不丢失 x 的原有值,必须在执行 x=y 之前,把 x 的值保存到临时变量 t 中,在执行了 x=y 之后,再把 t 中的值 (原来 x 的值) 赋给 y,所以需要一个类型和 x、y 相同的临时变量。 这个过程和现实生活中交换两个容器中液体的方法类似,一定要借助第三个容器才能完成。 正确的交换 x 和 y 的值
26、的过程: t=x; x=y; y=t;xy53t53 3 程序 # include main() int x, y, t; / t 是临时工作单元 printf ( Enter x & y: ); / 给一些输入提示 scanf ( %d%d,&x,&y ); / 输入 x 和 y printf (交换前: x=%d y=%dn,x,y); t=x; x=y; y=t; /* 交换 */ printf ( 交换后: x=%d y=%dn, x, y); # include 如果去掉,编译会出现警告,但还能正确运行,上机调试时最好加上。运行结果:Eliter x y: 2
27、34 678 交换前: x234 y678交换后: x678 y234 例2 ASCII 码的使用和输出 从终端输入一个数字字符,输出它的 ASCII 码,求出该数字字符表示的数值,输出以该值为序号的大写字母。 分析 数字字符在计算机内用 ASCll 码表示,其对应数字值是整型数,用一个整型变量存放,相应序号的大写字母也保存在字符变量中,解决这类问题需要 ASCll 码编码规律的知识。 程序 main ( ) char c1, c2; int x; printf (输入一个字符:); c1= getchar( ); printf (%c ASCll 码 %d n,c1,c1); x=c1- 0
28、; c2=A+x-1; printf (No.%d 大写字母是%c n, x, c2); / 字母、数字字母的 ASCll 编码顺序连续 思考 不使用 c2 和 x 也能完成问题的要求,可试一试。 但使用变量保存结果使程序的结构更清晰。运行结果: 输入一个字符: 5 5 ASCII 码 53 No.5 大写字母是 E3.3 选择结构 一、关系运算和逻辑运算 1. C 语言中的逻辑值 用 1 来表示 真,用 0 表示 假 任何基本类型的值都可作为逻辑值使用。 所有非 0 的值 (含负数) 被当作 真 使用,而 0 值被当作 假 使用。 对于任一表达式,若值为 0,就代表一个 假值,只要值是非零都
29、代表一个 真 值。 C89 没专门的逻辑值,C99 增加 true 和 false; 下面要讨论的关系表达式和逻辑表达式,运算的结果都会得到一个逻辑值。2. 关系运算符和关系表达式关系运算概念 将两个数据进行比较,判定两个数据是否符合给定的关系。实际上就是“比较运算”。例如:“ab”中的“”表示一个大于关系运算。如果 a 的值是 5,b 的值是 3,则大于关系运算“”的结果为 真,即条件成立;如果 a 的值是 2,b 的值是 3,则大于关系运算“”的结果为 假,即条件不成立。关系运算种类: = = a + b 等价于 c ( a + b ) a b != c 等价于 ( a b ) != c
30、a = b c 等价于 a = ( b c 等价于 a = ( b c ) 什么是关系表达式 用关系运算符将两个表达式连接起来,进行关系运算的式子。 例如:下面的关系表达式都是合法的 a = b、(a=5)(b=6)、ed、a != 0 关系表达式的值 逻辑值 真 或 假 ,用整型数 1 和 0 表示。 例如:计算下列关系表达式的值, 其中:a=8,b=5,c= ,f=5.12 则:(a=8,b=5,c=1,f=5.12)a = b关系成立,表达式的值为 1。a b = c “”的优先级高于“=”,先求 (ab),关系成立,(ab)的值为 1,再求 1= c 的值,关系成立,值为 1。a +
31、c = b关系运算符两侧的类型不一致,先按照双目运算类型转换原则进行类型转换 (b 转换成实型) 再进行关系运算,关系成立,表表达式值为 1 。 关系运算注意事项 进行关系运算的两个数据的类型不同时,按照算术运算同样的规则进行转换,再比较。 C 语言中一般不使用连续关系运算符的描述方式。其计算结果往往会出乎人们的预料。 例:7 5 2 希望的值为 1,实际值为 0。 表达式中常出现把“=”写成“=”的错误。 例:int a = 0, b = 1; if (a = b) printf ( a=b ); else printf (a!= b); 应避免对实数作相等或不等的判断。 例:1.0/3.0
32、*3.0=1.0 结果为:0 改写为:fabs(1.0/3.0*3.0-1.0)b ? a : cd ? c : d ab ? a : (cd?c:d) 类型转换:如果 expr2 和 expr3 的类型不同, 表达式结果值取较高的类型。(*) 如:x ? a : b; x=0,值为 b;x0,值为 a; xy?1:1.5; xy,值为1.0;x0 ? 1: (xy ? x + 1 : x 1 x y 的值为 0,x-1 的值得 7,并将其作为整个表达式的值。不再计算 xl。 x y ? x : f f 的类型是 float 型,x 的类型是 int 型,将 x 和 y 转换成 float 型
33、。 ( x = 8, y = 24) z = x != 0 ? y / x : 1 条件运算符的优先级高于赋值运算符,先计算赋值号右边的条件表达式。 计算 x != 0 得值 1,y/x 的值得 3,将其作为条件表达式的值赋给 z 变量。 z 的值也是整个表达式的值。 如果 x 值为 0,x != 0 的值为 0,根本不会执行 y/x,而去执行“:”后面的表达式即为常量1, 将1 赋给 z。 ( x = 8, y = 24) x 0 ? 1 : x = 0 ? 0 : -1 条件运算符连用,结合方法是从右向左,相当于:x 0 ? 1 : ( x = 0 ? 0 : -1) 本例 x 的值为 8
34、,x 0 成立,取常量值 1,它是整个表达式的值,所以不再计算: (x = 0 ? 0 : -1) 例2 使用关系和条件表达式,可表示复杂条件。 如当 x 的值在闭区间 2, 5 之内时,z 变量的值取 1,其他情况取 0;实现如下: z = ( x = 2 ? ( x 3 & x3 & x3&x3) | !(x5) = x=5 本题条件简单,直接分析也可得相同结果; 结论:等价的肯定形式的表达式 x=5 比 !(x3 & xb)&(n=cd) 结果:m = 0,n = 1 例2 计算逻辑表达式的值,其中变量定义为: int x=3,y=0;i=1。 !
35、 x x 为 3,即为真,否定运算后为假,即为 0。 !(x = 2) (x=2) 的值为 2 (即真),对其否定运算,值为假 (即 0)。注意 (x=2) 是赋值表达式。 !(x=2) (x=2) 的值为假 (0),对其否定运算,值为真 (即 1)。注意 (x=2) 是关系表达式。 x & y x 的值为 3(即为真),继续计算 y,y 的值为 0(即为假),所以整个表达式的值为 0。 y & x y 的值为 0(假),结果为 0,故不再计算 x; (x=3,y=0;i=1) yi | xi 计算 yi 的值,值为假 (0),继续计算 xi, 值为真 (1)。所以整个表达式的
36、值为 1。 yi | xi 计算 yi 的值,条件成立,值为真 (1),所以整个表达式的值为 1,不再计算 x1 y 的值为 0,y!=0 的值为 0,所以整个表达式的结果为 0,不再计算 y1。如果 y 的值不为 0,则计算后面的表达式 x/yl。 小结 表示复杂条件直观、简捷、可读性好。 要特别注意短路特性 例3 写出判断某一年是闰年逻辑表达式。 设 y 表示年的整型变量,闰年的条件是: y 能被 4 整除,但不能被100 整除; 或 y 能被 400 整除。( y 的值四位数如:2011) 用逻辑表达式表示 闰年:(y%4=0 & y%100!=0) | y%400=0 非闰年:
37、!(y%4=0&y%100!=0)|y%400=0) 二、if 语句 1. if 语句作用 构造选择结构,实现对某些操作的选择执行。 以一个逻辑条件作为选择的条件,条件成立时执行一种操作,不成立时执行另一种操作。 2. if 语句的三种形式 (ifif_else 和 if_else_if ) 形式一 格式:if (表达式) 语句组; 例:if (xy) printf (%d, x); 执行过程:非非0=0 形式二 格式:if (表达式) 语句组1; else 语句组2; 例:if (xy) max=x; else max=y; 执行过程:非非0 0=0 说明 if 语句中“表达式”必须
38、用 ( 和) 括起来; else 子句(可选,不选时为形式一)是 if 语句的一部分,必须与 if 配对,不能单独使用; if 和 else 下面的语句组,仅由一条语句构成时,可去掉花括号; if 语句允许嵌套 ( 在“语句组”中,又包含有 if 语句的情况 );嵌套时,else 子句与 if 的匹配原则:与在它上面、距它最近、且尚未匹配的 if 配对。例如:if ( ) if ( ) 语句1else if ( ) 语句2 else 语句3正确写法:if ( ) if ( ) 语句1else if ( ) 语句2 else 语句3 形式三 格式:if (表达式1) 语句组1; else if
39、(表达式2) 语句组2; else if (表达式n) 语句组n; else 语句组n+1; 执行过程:非非0 0=0=0=0=0=0=0非非0 0非非0 0 例4* 编程把学生成绩转换为等级: 90分以上等级为A, 60分以下等级为E, 其余10分一个等级。 三、switch 语句 作用 直接处理多分支选择。 形式 switch (表达式) case 常量表达式1: 语句组1; break; case 常量表达式2: 语句组2; break; case 常量表达式n: 语句组n; break; default:语句组n+1; break; switch 语句执行过程E1E2Endefault
40、case 说明 switch 后面的 “表达式”,可以是 int、char 和枚举型中的一种。 每个 case 后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象 (即对表达式的同一值,有两种或以上的执行方案)。 case 后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,所以必须加上 break 语句,以便结束 switch 语句。 各 case 及 default 子句的先后次序,不影响程序执行结果。 case 后可包含多个可执行语句,且不必加 。 switch 可嵌套。 多个 case,可共用同一语句 (组)。 如:case A:c
41、ase B:case C: printf(s60); break; 用 switch 语句实现的多分支结构程序,可以用 if 语句来实现。 实例 已知某公司员工的保底薪水为 500,某月所接工程的利润 profit (整数) 与利润提成的关系如下 (计量单位为元): profit 1000 没有提成; 1000profit 2000 提成 10%; 2000profit 5000 提成 15%; 5000profit 10000 提成 20%; 10000profit 提成 25%。 算法设计要点 为使用 switch 语句,必须将利润 profit 与提成的关系,转换成某些整数与提成的关系。
42、分析本题可知,提成的变化点都是 1000 的整数倍 (1000、2000、5000、),如果将利润 profit 整除 1000,则当: profit 1000 对应 0、1 1000profit 2000 对应 1、2 2000profit 5000 对应 2、3、4、5 5000profit 10000 对应 5、6、10 10000profit 对应 10、11、解决相邻两个区间重叠的方法是: profit 先减 1 (最小增量),然后再整除 1000 即可。 profit 1000 对应 01000profit 2000 对应 12000profit 5000 对应 2、3、45000
43、profit 10000 对应 5、6、910000profit 对应 10、11、0 1k 2k 3k 4k 5k 6k 7k 8k 9k 10k 11k 12k profit0 1 2 3 4 5 6 7 8 9 10 11 12 grade25201510 5 0提成 (%) 程序* main( ) int profit; short grade; float salary = 500.0; printf(Input profit: ); scanf(%d, &profit); grade=(profit -1)/1000; / 转化成的 case 标号 switch (grad
44、e) 完整语句见下页 / 计算 salary 的值 printf (salary=%.2fn, salary); / 程序结束switch (grade) / 根据 grade,计算 salary 的值 case 0: break; / profit 1000 case 1: salary+=profit*0.1; break; /10002000 case 2: case 3: / 2000profit5000 case 4: salary += profit*0.15; break; case 5: case 6: case 7: case 8: / 5000profit10000 cas
45、e 9: salary += profit*0.2; break; default: salary += profit*0.25; / 10000profit 3.4 循环结构1. while语句 一般形式: while (表达式) 循环体语句组;特点: 先判断表达式,后执行循环体;执行过程: 说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出 while 循环:条件表达式不成立 (为零)循环体内遇 break,return,goto无限循环 while (1) 循环体;为为0非非0 例1 while 循环计算 1+2+n 的值 分析:循环结构程序设计的一个重要工作是确定在计算
46、过程中的重复动作,并将它们用适当的循环形式正确描述。 要建立一个循环结构,需解决的问题: 如循环中涉及哪些变量; 这些变量在循环开始前应该给什么值; 循环过程中这些变量的值如何改变; 在什么情况下继续或结束循环; 循环终止后如何得到所需要的结果等。该例有一个重复的累加,次数由 n 决定。累加的对象是一个 int 变量,将它设为 i,其值由 1 到 n。累加的中间结果用 sum 表示。循环开始前 i 的初值为 1,sum 的初值为 0,循环过程中,sum 记录每次累加的结果,i 的值依次递增;结束条件是 in (循环条件是 in)。循环结束时sum即为所求的和。 程序* # include ma
47、in() int i, n, sum ; scanf (%d, &n ) ; i = 1; sum=0; while ( i = n ) sum = sum + i; i+; printf (sum= %d n, sum) ; 循环初值循环条件循环终值循环变量增值循环体2. do_while 语句一般形式:do 循环体语句组; while (表达式);执行过程:特点:先执行循环体,后判断表达式。说明:dowhile 可转化成 while 结构。dowhile 与 while 结构重要的区别是:在书写上,循环的控制条件出现位置不同;while 循环的循环体可能一次也不执行,而 do_wh
48、ile 的循环体至少执行一次。为为0非非0 例 2* 用 do_while 循环计算 1+2+n 的值 # include main() int i, n, sum ; scanf (%d, &n); i = 1; sum = 0 ; do sum = sum + i; i+; while ( i = n ) ; printf (sum=%dn, sum); 循环初值循环条件循环终值循环体循环变量增值3. for 语句一般形式:for (表达式1;表达式2;表达式3) 循环体语句组;执行过程:说明:for 的三个表达式类型任意,都可省略,但“;”不可省;无限循环:for ( ; ; )
49、;for 可以转换成 while 结构;常用形式 for (循环变量赋初值; 循环条件; 变量增值) 循环体语句组; 为为0非非0 例 3* 用 for 循环计算 12n 的值 # include main() int i, n, sum ; scanf (%d, &n) ; for ( i = 1, sum=0; i = n ; i+) sum = sum + i; printf ( sum= %d n, sum); 二、循环嵌套 概念 循环语句的循环体内,又包含另一个完整的循环结构,称为循环的嵌套。 循环嵌套的概念,对所有高级语言都是一样的。 说明 三种循环可互相嵌套,层数不限。
50、外层循环可包含两个以上内循环,但不能相互交叉。 嵌套循环的执行流程: 嵌套循环的跳转禁止情况: 从外层跳入内层; 跳入同层的另一循环; 向上跳转。外循环内循环 例 4* 输出下三角形状的乘法九九表。 main ( ) int i, j; for ( i=1; i=9; i+) printf(%4d, i ); / 打印表头 printf ( %c, n ); for ( i=1; i=38; i+) printf(%c, -); / 打印横线 printf (%c, n); for ( i=1; i=9; i+) / 循环体执行一次, 打印一行 for ( j=1; j=i; j+) prin
51、tf(%4d,i*j); / 循环一次, 打印一数据 printf (%c, n); / 每行尾换行 printf(n); 运行结果: 三、控制语句 1. break 语句 形式: break; 功能: 在循环语句和 switch 语句中; 终止并跳出循环体或开关体。 对循环控制的影响: 说明: break 只能终止并跳出最近一层的结构; break 不能用于循环语句和 switch 语句之外的任何其它语句之中。为为0非非0while 循环循环 例 5* 循环体中 break 语句执行示例 main ( ) int i, s = 0; for ( i = 1; i 5) break; prin
52、tf (s = %d n, s ) ; 与 if 配合使用运行结果: s = 1 s = 3 2. continue 语句形式: continue;功能: 结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断,仅用于循环语句中。对于 for 循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于 while和 do-while 循环,跳过循环体其余语句,但转向循环继续条件的判定。 说明: continue 只能用于循环语句中。 对循环控制的影响: (见图) 例6* 求十个整数中正数的个数及其平均值 main ( ) / 输入数据用空格分开 int num = 0, s
53、um = 0, i, a; for ( i = 0; i10; i+ ) scanf (%d, &a); if ( a = 0 ) continue; num+; sum+=a; printf ( 正数的个数:%dn, num); printf ( 平均值:%6.2f n, 1.0*sum/num); 为为0非非0while 循环与 if 配合使用3. goto 语句形式: goto 标号; 标号:语句; 功能: 无条件转向标号所在的语句行执行。说明:标号的命名: 遵循标识符命名规则;标号的作用: 标号可以写在任何语句前面 (标号:语句行),在程序中起标记作用,作为某个转移的目的地,程
54、序不为其分配空间。标号唯一 : goto 语句中的标号只能出现在 goto 所在函数内,且唯一。 用 goto 语句能构成循环 (但 for 语句可代替) 如*:用 goto 语句构成循环算 1+2+n 的值 main ( ) int n = 1, sum = 0; loop: sum += n; n+; if (n = 100) goto loop; printf (sum = %d n, sum ) ; 限用 goto 语句: 结构化程序设计方法,主张限制使用 goto 语句。因为滥用 goto语句,将会导致程序结构无规律、可读性差。 四、循环结构中的常用机制 循环结构是构造复杂 C 程序
55、必用的结构,下面将归纳循环中常用的一些结构和控制机制。 增量、减量运算符 ( +、 - ) 增量、减量运算符在循环中经常用来改变循环控制变量的值。如 for 语句的表达式 3 部分、while 和 do_ while 结构的循环体内经常出现。 逗号运算符 (,) 逗号常用在 for 语句头部,表达式 1 中变量赋初值和表达式 3 中循环变量更新的操作中。 复合赋值 在循环体内进行累加、累乘和递减等操作。 空语句 空语句是单独的分号 ;,用在程序中语法上需要一条语句、但又什么都不需要做的地方。 使用空语句可保证语法结构的完整性。如 for 结构的循环体部分为空,就在其位置上用 ; 表示。如果没有
56、此分号,紧接 for 语句的下一个语句将被编译器解释为地的循环体。 如:for (i=0; arrayi=0; i+) ; / 循环体为空 printf ( i = %dn, i); 若把分号 ;去掉,功能完全不同了: for ( i=0; arrayi = 0; i+ ) printf ( i = %dn, i); / 循环体为 printf 无限循环 程序中表示无限循环的常用结构有: while (1) 循环、for( ; ; ) 循环。 无限循环的循环体内一定要有选择结构和beak 语句以便最终从循环结构中退出来。 控制语句 break,continue,goto break 控制跳出本
57、层循环; continue 控制跳过本次循环体中尚未执行的语句,再次开始循环条件的判断; goto 和标号结合使用实现任意转移。 五、循环结构设计实例 1. 数学方面 循环结构在数学问题求解方面有广泛的应用,比如求数列第 n 项或前 n 项的和、迭代求解方程的根和使用矩阵解线性方程等。 例6 计算 分析:分析第 n 项和 n 的关系,本题有两个累加,第 n 项的分母由前一项分母加 n 得到,是 int 型。前 n 项的和由前 n-1 的和加第 n 项得到,是 float。循环控制变量用 int i 表示,i 的变化范围从 in。n+2+11+3+2+11+2+11+1 实现 用两种循环结构实现
58、,请比较两者的特点。 采用 for 循环方法的程序 # include main() int i, n, s; / s 用于累加分母的值 float sum; scanf(%d, &n); s=0; sum=0.0 for ( i = 1; i = n ; i+) s+= i; sum+=1.0/s; / 为什么用1.0 printf(sum=%fn, sum); 这种形式可读性差,应避免。与循环控制无关的操作,如本例的 s+=i 和 sum+=1.0/s 应尽量放在循环体内。 采用 while 循环方法# include main() int i, n, s; float sum;
59、scanf ( %d, &n); s=0; sum=0.0; i=1 while ( i 0 x0f(x0)0 x1f(x1)0 具体方法 做下列操作: 输入 x1 和 x2 的值; 计算 f(x1) 和 f(x2):fx1=f(x1),fx2=f(x2) 直到 f(x1) * f(x2) 0。 做下列操作: x0 = (x1+x2) / 2 计算 f(x0):fx0 = f(x0) if ( f(x0) * f(x1) 0) x2 = x0,fx2 = fx0 else x1 = x0,fx1 = fx0 直到 f(x0) 10-5 程序*# include main ( ) flo
60、at x0, x1, x2, fx0, fx1, fx2; do printf ( Enter x1&x2: ); scanf ( %f%f, &x1, &x2 ); fx1 = x1*( (2*x1- 4)*x1+3 ) - 6; fx2 = x2*( (2*x2 - 4)*x2+3) - 6; while ( fx1*fx2 0 ) ; do x0 = ( x1 + x2 ) / 2; fx0 = x0*( (2*x0 - 4)* x0+3 ) - 6; if (fx0*fx1 1e-5) ; printf ( x = %6.2f n, x0 ); 运行结果: Enter x1&x2: 1 8 x = 2.00 例 8 用迭代法求方程 x3x1 = 0 在 x = 1.5 附近的根。 分析 迭代法解决问题的关键是找到迭代公式,首先把方程变换为迭代公式 ; 依题,用 1.5 作迭代的初值,结束条件为两次近似解之差的绝对值小于 0.0001。31 xx 程序* # include # include main() float x1, x = 1.5; do x1 = x; x = pow( (x+1), 1.0/3.0 ); while ( fabs
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 特许经营合同的终止协议
- 矿山提前关闭协议书范本
- 环卫法务合同协议书范本
- 美术机构签约协议书模板
- 油茶果收购合同协议模板
- 球队安全合同协议书范本
- 签订合同之后的补充协议
- 物流网点转让合同协议书
- 终止销售承包合同协议书
- 销售方怎样拟定合同协议
- 提高肿瘤治疗前TNM分期评估率PDCA
- 患者隐私保护培训课件1
- 无机房电梯应急预案演练
- 成都市第十二中学川大附中新初一分班英语试卷含答案
- 固定资产报废申请表(样本)
- 八年级物理光学测试题含答案试题
- Unit1Myclassroom单元整体设计(学历案)四年级英语上册教学评一致性资源(人教PEP版)
- 皮带机使用说明书
- 住宅小区消防、排烟通风工程招标文件
- 四川省中小流域暴雨洪水计算表格(尾矿库洪水计算)
- 福建省危险性较大的分部分项工程安全管理标准
评论
0/150
提交评论