控制结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
循环条件判断在循环处理之后 C 语言提供 do while 语句 循环出口在处理之中 C 语言提供 break 语句

常见算法描述2


常见算法描述3

for 语句

e1
流 程 图
Y
语法
for( e1; e2; e3 ) stmt
e2 = 0? N


e1 e2 e3 stmt
初始化 循环条件 改变量处理 循环体
思考:#define S(x) (x * x) 有问题? S(3) , S(i) , S(3+4)
正确写法:#define S(x) ((x) * (x))


基本思路
例5-2:求16进制数 的数值
逐个输入16进制数的字符c,计算相应的数值n 每次计算 n = n * 16 + (c代表的值)

continue 语句


goto 语句

例5-5:求出21世纪的所有闰年
#include <stdio.h> main( ) {
/* 阅读该程序 */
int y; for( y = 2001; y < 2100; y++ ) { if( 0 != y%4 ) continue; if( 0 == y%400 ) printf( “%d\n”, y ); else if( 0 != y%100 ) printf( “%d\n”, y );
1. 2. 3.
读一个整数 (包括正负号) 的算法
变量设置 n 结果 ch 当前字符 sign 符号
4.
跳过空格 0 n 读入字符ch 若ch是+
1sign 跳过空格
控制转移的其他解决方案


避免多重循环结构的嵌套

例5-6:复数四则运算

输入一个复数运算表达式

格式: (实部虚部i ) 例: (-23 + 4 i)* (4 – 7 i)


输出计算结果
仅考虑加法和乘法 例: (-120 + 177 i )
算法描述
1. 2. 3.
4.
读复数r1,i1 读运算符op 读复数r2,i2 若 op = ‘+’,则

赋值
1. 2. 3.
4.
将右侧数据变换成左侧数据类型后,完成赋值 高精度的数据变换成低精度数据时,被剪断 低精度的数据变换成高精度数据时,被补零或符号位 有符号数据和无符号数据相互变换时,可能带来值的变 化 必要时,采用强制类型转换
do-while 语句

语法
do stmt while( e )
5.1 switch 的 使用
程序读解

新的语言现象




switch语句:按照条件表达式求值结果,决定转 向哪个case的执行 case分支:当条件式的值等于开关值(必须是常 量)时,执行 default分支:在所有case不匹配时,执行 (可 缺省) break语句:用于结束case分支的执行,转向 switch后续语句的执行
/* 枚举每年 */
/* 不能整除4 */ /* 能整除400 */ /* 不能整除100 */
}
}

判断闰年的方法是: 若该年份能被400整除 或能被4整除而不能被100整除 则为闰年,否则为平年 。
主要用途

简化程序结构、提高程序可读性

减少程序的嵌套层次(复合语句) 引入专用变量,表示处理状态 对程序可读性的影响较大 算法中循环深度较大时, 应引入新的函数,负责内层循环的计算
第五章 控制结构

C语言的控制语句
if 语句 switch 语句 循环语句 while 语句 for 语句 do while 语句 循环控制语句 break 语句 continue 语句
条件语句


目的:更方便地进行算法描述
#include <stdio.h> #define PR(a,b,c,d) printf(“%f%c%f=%f\n”,a,b,c,d) 多路选择 main( ) { 带参数的宏代换 float x, y; char op; scanf( “%f%c%f”, &x, &op, &y ); switch( op ) { case ‘+’ : PR(x, op, y, x+y); break; case ‘-’ : PR(x, op, y, x-y); break; case ‘*’ : PR(x, op, y, x*y); break; 结束case case ‘/’ : PR(x, op, y, x/y); 分支 break; default: printf( “Error: %c\n”, op ); } }
程序实现
实现技巧

循环条件难以描述

采用无限循环 while( 1 )
{ … }

return语句


函数出口;(结束当前函数的运行) 可以用于结束循环 利用ASCII值实现
整数、字符、逻辑值的混合运算

字符处理


C语言的特点(弱类型语言)

5.2 循环语句

常见算法描述1

迭代过程经常存在循环控制变量 C 语言提供 for 语句,简化描述,增加可 读性

整数

C语言中的常数
80 0120 0x50


十进制 八进制(前缀0) 十六进制(前缀0x)

字符常数

'a'
'\n'
'\t'
'\0'
'\020'
字符串常数

“string” 80l 80L
‘\0’ 结尾 (不能作为case条件)
长整数

浮点常数(双精度)

0.123
1.23e3
123E-5
stmt
e

stmt e
循环体 循环条件
N
=0 Y
例5-4:求 sin x 的近似值
计算公式:
2 n 1 x sin x n 0 ( 1) n (2n 1)!
在 n 趋向无穷的过程中累加项值趋向于0,而累加值趋
向函数值。
x3 x 5 x 7 sinχ = x - ─ + ─ - ─ + … … 3! 5! 7!
x2n+1 ── (2n+1)!
算法设计问题
如何利用迭代方法完成累加 累加项(t) 的递推公式:
2
tn tn1 x / (2n (2n 1))
循环结束条件:用 t 的绝对值小于 10-6 为结束条件。 数据对象考虑 累加值 累加项 sum t 参数值 迭代次数 x n
算法描述
5.3 循环控制语句

break 语句

出现在循环体中,用于终止循环(最内层); 出现在switch语句中,用于终止多路选择; 出现在循环体中,用于终止循环体的本次执行 (最内层) goto label; 转向执行label指定的语句 label: 定义在某个语句前; 破坏程序的结构化,不推荐使用;
switch 语句
switch( e ) /* 条件式 */ { case c1: /* 常量 */ stmt1… 。。。 case cn stmtn… default: stmt0… /* 语句组 */ } /* 语句组中常使用break */
T
e = c1
stmt1…
F
e = c2
T
stmt2…


数据对象
n 保存数值(已计算出的数值) c 保持当前字符

算法
1.
2.
3. 4. 5. 6.
0 n 读入一个字符 c 如果 c 是数字字符,则 n*16+c的值 n 如果 c 是a-f等字母,则 n*16+(10..15) n 否则,输出n;结束 重复2-5
#include <stdio.h> 长整型 main( ) { 无限 char c; long n=0; 字符的 循环 while( 1 ) { ASCII值 scanf( “%c”, &c ); switch( c ) { case ‘0’: case ‘1’: case ‘2’: case ‘3’: case ‘4’: case ‘5’: case ‘6’: case ‘7’: 长整型 case ‘8’: case ‘9’: 输出 n = n * 16 + c – ‘0’; break; case ‘a’: case ‘b’: case ‘c’: case ‘d’: case ‘e’: case ‘f’: n = n *16 + 10 + c – ‘a’; break; 结束main default: printf( “n = %ld\n”, n ); return; } } }
stmt
e3
例5-3:构造华氏温度和摄氏温度对照表

要求

华氏温度 0 度到 300 度每 20 度为一项,输出对照表。
计算公式: 程序实现
C = ( F - 32 ) * 5 / 9
#include <stdio.h> main () { int f; /* 华氏温度 */ float c; /* 摄氏温度 */ for (f = 0; f <= 300; f += 20) { c = (f-32) * 5 / 9.0 ; printf(”F = %d, C = %f\n",f,c); } }
switch( op ) { case ‘+’ : r0 = a[0] + b[0]; i0 = a[1] + b[1]; break; case ‘*’: r0 = a[0]*a[1] – b[0]*b[1]; i0 = a[0]*b[1] + a[1]*b[0]; break; } if( i0 < 0 ) printf( “(%d%d)”, r0, i0 ); else printf( “(%d+%d)”, r0, i0 ); }

读取一个符号后,返回 读取一个整数(包括正负号)后,返回 读取一个复数(包括括弧)后,存入数组返回

int getNum( )


void getComp( int x[ ] )

主程序的实现
#include <stdio.h> #include <ctype.h> char getSymbol( void ); int getNum( void ); void getComp( int x [ ] ); main( ) { int a[2], b[2], r0, i0; char op; getComp( a ); op = getSymbol( ); getComp( b );
程序读解

针对问题,设置循环变量

利用华氏温度

利用 for 语句


设置控制变量初值、终止条件、增量控制 简洁、易懂 不同精度的数据进行运算时,结果为精度高的数据 (精度高的数据占用内存空间大) 如:(f–32)*5/9.0 的结果为浮点数

混合运算的规律


赋值与类型转换

精度比较

char < int < unsigned < long < float < double double 类型:16bit阶码、48bit尾数
计算 r0 = r1+r2, i0 = i1+i2
5.
若 op = ‘*’,则
计算 r0 = r1*r2 – i1*i2, i0 = r1*i2 + r2*i1
6.
输出 ( r0 + r1i )
程序实现的考虑

Baidu Nhomakorabea难点

正确地识别出复数的实部、虚部和运算符 考虑空格的存在、正负号的存在、i的存在
设置 3 个函数 char getSymbol( )
1、初始化
2、do
sum,t,n;
2.1 累加t 2.2 2.3 3、输出 循环的初始值:sum = 0.0,n = 0,t = x。 n n+1; 求下一累加项t;
直到 |t| < 10-6
#include #include
<stdio.h> <math.h>
程序实现
main() { 求绝对值 double sum = 0.0, t, x; int n = 0; scanf( “%f”, &x ); t = x; do { 指数形式 sum = sum + t; n = n + 1; t = -t * x * x / (2*n) / (2*n + 1); } while (fabs(t) >= 1E-6 ); printf(“%lf\n”,sum); }
break
F T
e = cn
break
stmtn…
break
F
stmt0…
注意:switch语句的每一个case判断,都只 负责指明流程分支的入口点,而不负责指 定分支的出口点,出口点由编程人员用相
应的跳转语句来表明。
break是流程跳转语句。
程序读解

宏代换

预处理命令(前缀#) 在程序编译之前进行(同include) 功能:完成参数代换后,将定义复制到引用处
相关文档
最新文档