C语言程序设计第3章.ppt_第1页
C语言程序设计第3章.ppt_第2页
C语言程序设计第3章.ppt_第3页
C语言程序设计第3章.ppt_第4页
C语言程序设计第3章.ppt_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

LOGO 肖肖 洁洁 大连工业大学管理学院大连工业大学管理学院 第三章 C语言程序的流程控制 算 法1 关系运算符和关系表达式2 选择结构程序设计 3逻辑运算符和逻辑表达式 4 循环结构程序设计5 3.1 3.1 算算 法法 一. 算法的概念 二. 算法的基本性质 三. 结构化程序设计 四. 算法的描述 一. 算法的概念 算法:解决问题确定的方法和有限的步骤 称作为算法。 一个程序应包括两个方面的内容: 对数据的描述:数据结构 对操作的描述:算法 完整的程序设计应该是: 程序设计数据结构算法方法工具 二. 算法的基本性质 l有穷性:算法必须在执行有限个操作后终 止; l确定性:算法中每一步的含义必须是确切 的,不可出现任何二义性; l有效性:算法中的每一步操作都应该能有 效执行,一个不可执行的操作是无效的; l有0个或多个输入; l有1个或多个输出。 三. 结构化程序设计 结构化程序设计方法主要包括: 只采用顺序、选择、循环三种基本的程序 控制结构来编制程序,从而使程序具有良好 的结构; 程序设计自顶而下; 用结构化程序设计流程图表示算法。 四. 算法的描述 1 流程图 2 N-S图 3 伪代码 四. 算法的描述 1. 流程图 过程判断数据预定义过程 起止流程线连接注释 常用的流程图标准化符号 用流程图描述程序的三种基本结构 l特点: 一个入口,一个出口 顺序执行 S1 S2 a b l顺序结构 l选择结构(if 语句) 语句1语句2 条件 YN 功能: 判断条件为真时执行语句,否则跳过语句 单选择 双选择 用流程图描述程序的三种基本结构 语句 N 条件 Y l循环结构 循环环体 N 条件 Y while循环do-while型循环 条件 N Y 循环环体 用流程图描述程序的三种基本结构 例:交换两个变量的值 a t b 1 2 3 t=a a=b b=t 例3.1 用流程图描述从三个数中取最大数的算法。 a=b 输入a,b,c max=a 真假 max=b max=c 真假 输出max输出c 开始 结束 i=max max=n 求最大值、最小值问题 常用算法:例如一种打擂台的方法。 n个数中,先假设第一个数为最大值,成 为擂主,依次同第2,3,n个数据逐一比 较,一旦某个数大,马上替换擂主;所有值比 较完,最大值也就获得。 求最小值问题则先假设为最小值。 bmax 假 真假 输出max 结束 max=a 真 max=c cmax max=b 开始 输入a,b,c 四. 算法的描述 2. N-S图 N-S图的每一种基本结构都是一个矩形框 S1 S2 S3 P S1S2 当P S 假真 (c)当型重复结构(a)顺序结构 (b)选择结构 a=b max=amax=b 输入a,b,c 假 真 max=c 输出max输出c 真假 当i=max max=n 真假 输入n 初始化:max=0,i=1 输出max 四. 算法的描述 3. 伪代码 四. 算法的描述 输入a,b,c; if(a=b) max=a; else max=b; if(max=c) 输出max; else 输出c; 初始化:max=0,i=1; 当(i=max) max=n; 输出max; 小 结 算法概念 算法特性 结构化程序设计:顺序、选择、循环结构 算法的描述:标准流程图、N-S图、伪代码 交换两个数算法 求一系列数最大值的算法 3.2关系运算符和关系表达式 一、关系运算符 关系运算是进行比较大小的运算,并产生运算结果 1(真)或 0(假)。 语言中的关系运算符有种: 、! 优先次序:前种同级,高于后种(后种同级) 关系运算符的结合性为从左到右; 如:32 2+ab; (a-b)=1; b+cbc; (自左至右 ) 3.2关系运算符和关系表达式 注意: 避免对两个实数表达式作“相等”或“不相等” 的判别 1.0/3.0*3.0=1.0 fabs (1.0/3.0* 3.0-1.0)1e-5 3.2关系运算符和关系表达式 要表示x在区间a,b中, a=x=b a=x 分析 z%2=0 的值? 如果z为偶数,则 z%2=0的值为1; 否则z为奇数,则 z%2=0的值为0; 因此,z%2=0是断言“z是偶数”的c语言判 断式。 2. x与y的个位数字相同 x%10=y%10 如何判断十位数上数字相同? 3.3 逻辑运算与逻辑表达式 一、逻辑运算符和表达式 C语言提供三种逻辑运算符: 例: if (ab) x=a; 1. 单选择if语句 语语句 假(0) 条件 真(!0) 条件可以是关系表达式 或逻辑表达式 一、 if 语句 2. 双选择if语句 语句格式: if (条件) 语句组1; else 语句组2; 功能: 当条件为非零时执行语句组1 否则执行语句组2。 语句组1 条件 语句组2 真(!0)假 (0) 一、 if 语句 if(a60)(a60) printf(“及格n”); else printf(“不及格n”); main() int a; scanf(“%d”, if (a main( ) int a,b,max; printf(“Input a and b=“); scanf(“%d%d“, /* input number a and b*/ if ( ab ) max=a; /*如果ab,则将a=max */ else max=b; /* 否则, b=max */ printf(“The max of a and b is : %dn“, max); ab? max=bmax=a YN 求a和b两数中较大的一个 例例 2 2 一、 if 语句 说出下列程序的输出结果: #include main() int a; scanf(“%d“, if (a50) printf(“%d“,a); if (a40) printf(“%d“,a); if (a30) printf(“%d“,a); 例例3 3 程序运行: 输入58, 输出? 输入30, 输出? 一、 if 语句 3.有关if语句的说明 l 条件后面不加分号 l 语句之后有分号 l else不是语句,不能单独使用 l 当if后有多个执行语句时,必须用 将多个语句括 起来,构成一个复合语句,而 之外不必有分号。 lif后面的表达式一般为逻辑表达式或关系表达式, 也可以是任意数值类型表达式。 一、 if 语句 该语句是合法的:if(3) printf(“ok!”); 4、 if语句的嵌套 格式:if(表达式) if( 表达式1) 语句11; else 语句12; else if (表达式2) 语句21; else 语句22; 在if语句的“语句1”或“ 语句2”中又包含着if语句 判断表达式的值,若为非0,再判断表达式1的 值,非0执行语句11,否则执行语句12 若表达式的值为0,再判断表达式2的值,非0 执行语句21,否则执行语句22 功能: 外if 内嵌if 一、 if 语句 下列程序段表示的数学式? y=-1; if (x!=0) if (x0) y=2*sin(x); else y=0; 程序段表示的数学式1: 0 (x0) 讨论:给第二个if行加 后表示的数学式? 程序段表示的数学式2: -1 (x0) 数学式1程序可表示为: y=-1; if (x!=0) if (x0) y=2*sin(x); else y=0; 思考 强调:if和else可成对出现, 也可不成对出现,每个else 都与距其最近的if配对。 一、 if 语句 写一程序,判断某一年是否闰年。 其中:leap代表闰年的信息,leap=1闰年,leap=0 非闰年 main( ) int year, leap; scanf(“%d”, leap=0; if(year%4= =0 if(leap= =1) printf(“%d is ”, year); else printf(“%d is not ”, year); printf(“a leap yearn”); #include main( ) int year, leap; scanf(“%d“, leap=0; if(year%4=0 if(leap=1) printf(“%dn is a leap year“, year); else printf(“%dn is not a leap year“, year); return(0); 例例4 4 输入: 1989 结果为: 1989 is not a leap year 输入: 2000 结果为: 2000 is a leap year 1、if语句的多重选择形式: if(表达式1) 语句 1 else if(表达式2) 语句 2 else if(表达式3) 语句 3 else if(表达式m) 语句 m else 语句 n 仅执行表达式为真的后面内嵌语句,若所有的表达式 值都为0,则执行最后一个else后的内嵌语句. 二、 ifelse if结构 语句1 语句2 语句3 真假 表达式1 假 真 表达式2 真 假 表达式3 二、 ifelse if结构 根据百分制分数决定成绩的等级: 80分以上为A级; 70分及以上,80分以下,B级; 60分及以上,70分以下,C级; 60分以下,D级。 真 假 score=80 score=70 等级A 真 假 输入score score=60 等级B等级D等级C 二、 ifelse if结构 例例5 5 #include int main(void) float score; printf(“Input a score:“); scanf(“%f“, if (score = 80) printf (“%f is An“,score); else if (score = 70) printf (“%f is Bn“,score); else if (score = 60) printf (“%f is Cn“,score); else printf (“%f is Dn“,score); 2、缩排 是源程序普遍使用的 书写方法,它是语句 相对于上一条语句退 后若干个字符位置的 书写方法。 缩排的目的就是 为了使源程序的层次 清晰明了,增加源程 序的可读性。 #include main() int x; scanf(“%d”, if (x0) printf(“X is positive.”); x=x+1; else printf (“X is negative.”); 缩进 缩进 缩进 二、 ifelse if结构 main() int i=1,j=1,k=2; if(j+|k+) 程序输出结果是:(C ) A1,1,2 B. 2,2,1 C. 2,2,2 D. 2,2,3 main() int a=5,b=4,c=3,d=2; if(abc) printf(“%d”,d); else if (c-1=d)=1) printf(“%dn”,d+1); else printf(“%dn”,d+2); 程序输出结果是:(B ) A. 2 B. 3 C. 4 D. 编译时有错,无结果 三、 switch 语句 1、一般格式: switch(表达式) case 常量表达式1:语句序列1 break; case 常量表达式2:语句序列2 break; : case 常量表达式n:语句序列n break; default :语句序列n+1 表达式 语句序列1 语句序列2 语句序列n 语句序列n+1 常量表达式1常量表达式2常量表达式ndefault 2、流程图 表达式 语句序列1 常量表达式1: 语句序列2 常量表达式2: 语句序列i 常量表达式i: 语句序列n 常量表达式n: 语句序列n+1 default break; break; break; break; break; 三、 switch 语句 3、switch语句说明: “常量表达式” 的值一般是整型、字符型或枚举类 型,并且是互不相同的。 default子句是switch中的可选项,其位置不一定 要写在最后。 多个case可以共用一组语句。 break语句的作用是结束本层switch语句。 case后的语句序列可以是一条语句,也可以是多条 语句,此时多条语句不必用括号括起来。 三、 switch 语句 switch结构允许嵌套。 #include “stdio.h“ main() int score;char grade; printf(“please input a students score:n“); scanf(“%d“, switch(score/10) case 0: case 1: case 2: case 3: case 4: case 5: grade=E;break; case 6: grade=D;break; case 7: grade=C;break; case 8 : grade=B;break; case 9: case 10 : grade=A;break; default: printf(“data error!n“); grade ; printf(“score=%d, grade=%c”,score,grade); 例例6 6 #include main() int score;char grade; printf(“please input a students score:n“); scanf(“%d“, switch(score%10) case 0: case 1: case 2: case 3: case 4: case 5: grade=E;break; case 6: grade=D;break; case 7: grade=C;break; case 8 : grade=B;break; case 9: case 10 : grade=A;break; default: printf(“data error!n“); printf(“score=%d, grade=%c“,score,grade); return (0); 书例3.9 联想猜词游戏 例例7 7 三、 switch 语句 运输公司对用户计算运费。距离(s)越远, 每公里运费越低。折扣为d (discount),每公 里每吨货物的基本运费为p (price),货物重w (weight),总运费f (freight) , f=p * w * s * (1- d), 标准如下: 例例8 8 s/250后分界值分别为1-2-4-8-12 main( ) int c,s; float p, w, d , f ; scanf(“%f , %f , %d”, if(s=3000) c=12; else c= s / 250; switch( c ) case 0: d=0 ; break ; case 1: d=2 ; break ; case 2: case 3: d=5; break; case 4: case 5: case 6: case 7: d=8 ; break ; case 8: case 9: case 10: case 11: d=10 ; break ; case 12: d=15 ; f=p*w*s*(1-d/100.0) ; printf(“freight=%15.4f ”, f ) ; 运行:100,20,300 结果:freight= 588000.0000 格式:表达式 ?表达式:表达式 功能:判断表达式的值,该值为“非0”,则 取表达式2的值,为“ 0 ”时,取表达式3的值。 如:max=ab ? a : b 若 a=3, b=2, 则 max=? 说说明: (1) 条件运算符优优于赋值赋值 运算符。 (2) 条件运算符的结结合方向为为“自右向左”。 如:当a=1,b=2,c=3, d=4 时, 表达式 ab ? a : cd ? c : d , 值为:? 如: 若 x=1,y=0,a=3,b=-3 表达式 (yx?a:b) scanf(“%c”, ch=(ch=A printf (input 2 relas please:); scanf (%f%f, printf (The max is %fn,ab?a:b); return 0; 书例3.11 输入两数,输出大者。 例例1010 四、条件运算符 小 结 if语句实现单分支 if-else语句实现两个分支 switch-break语句实现多分支 嵌套if语句可以实现复杂的分支结构(注意 else与哪个if 结合) 条件表达式 3.5 3.5 循环结构程序设计循环结构程序设计 一. 迭代与穷举算法 二. while循环结构 三. dowhile结构 四. for结构 五、break与continue 一. 迭代与穷举算法 1、迭代:是一个不断用新值取代变量的旧值 ,或由旧值递推出变量的新值的过程。 例3.12人口增长问题。按年0.2%的增长速度, 现有13亿人,10年后将有多少人? 设现人口数为m,则第1年后人口变为: m = m*(1+0.2%) 迭代与下列因素有关: 初值; 迭代公式; 迭代次数或迭代终止标志。 一. 迭代与穷举算法 例3.13 兔子繁殖问题。 设有一对新生兔子,从第三个月开始它们每个 月都生一对兔子。按此规律,并假设没有兔子死亡 ,一年后共有多少对兔子。 人们发现每月的兔子数组成如下数列: 1,1,2,3,5,8,13,21,34, 并把它称为Fibonacci数列。 从第3个数开始,每一个数都是其前面两个相邻数之和 。 一. 迭代与穷举算法 迭代 次数 3456789101112 fib111235813213455 fib2123581321345579 fib23581321345579144 一. 迭代与穷举算法 幼仔数 成兔数 总 数 一. 迭代与穷举算法 上述算法可以描述为 fib1=fib2=1 (1) fibn=fibn-1+fibn-2 (n=3) (2) fib=fib1+fib2; fib1=fib2; /* 为下一次迭代作准备*/ fib2= fib; 赋初值 迭代公式 一. 迭代与穷举算法 对问题的所有可能状态一一测试,直到 找到解或将全部可能状态都测试过为止。 2、穷举 一. 迭代与穷举算法 循环控制有两种办法:计数法与标志法。 一. 迭代与穷举算法 当imax max=n( 空) 真假 输入第i个数n 输入一个数给max 输出max 初始化:i=1 例3.15 输入10个数,将最大的一个数打印 出来。 一. 迭代与穷举算法 当不想或无条件使用计数法时,可以使用标 志法。 当(n!=FLAG) nmax max=n( 空) 真假 输入下一个数n max=n 输出max 初始化:i=1,FLAG=-32768 输入一个数n 一. 迭代与穷举算法 例3.16 百钱买百鸡问题。 鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱 一。百钱买百鸡,问鸡翁、母、雏各几何? (1) 基本解题思路 cocks+hens+chicks=100 5*cocks+3*hens+chicks/3=100 当(cocks int main(void) double m=13; int i=1; while(i main() int fib1=1,fib2=1,fib,i=3; while(i #define FLAG -32768 main( ) int max,n; printf(“Input a number:”); scanf(“%d”, maxn; do scanf(“%d”, if(n

温馨提示

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

评论

0/150

提交评论