C程序的控制结构.ppt_第1页
C程序的控制结构.ppt_第2页
C程序的控制结构.ppt_第3页
C程序的控制结构.ppt_第4页
C程序的控制结构.ppt_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

第2章 算法,学习要求:,理解算法的概念和分类 掌握算法的特性 熟悉算法的表示 理解用计算机求解问题的一般过程,2.1 算法的概念,1、著名的计算机科学家沃思提出: 数据结构 + 算法 = 程序 其中:数据结构是对操作对象的描述,在程序中表现为数据类型 算法是对操作的描述,在程序中表现为程序代码 2、算法的定义 为解决一个具体问题而采取的方法和步骤的描述即为“算法”,3、算法的分类 数值运算算法:目的是求数值解,研究比较深入,一般有现成的模型 供直接使用 非数值运算算法:常见的应用是在事务管理领域,只有典型的算法有 较深入的研究,例2.1 求1+2+3+4+5所得的数值。,算法1,步骤1:先求1+2得到结果3; 步骤2:将步骤1得到的结果3再加3,得到结果6; 步骤3:将6再加4,得到结果10; 步骤4:将10再加5,得到结果15,这就是最终的结果,输出。,算法2,步骤1:m1 步骤2:i2 步骤3:将m+i的值存放在m中,可简单表示为m = m+i 步骤4:将i的值加1,可表示为 i = i1 步骤5:判断i是否大于5,如果不大于5返回重新执行步骤3、4、5; 否则输出m,算法结束,最后m中保存的值就是1到5的和。,2.2 利用计算机求解问题的一般过程,利用计算机求解问题过程大致分为以下几个阶段:通过问题分析建立数学模型阶段、数据结构设计阶段、算法设计阶段、编写和调试程序阶段,设计一个算法时应具备以下五个特性:,(1)有穷性 (2)确定性 (3)有零个或多个输入 (4)有一个或多个输出 (5)有效性,2.3 算法的描述,常用的有自然语言、流程图、N-S图、伪代码、计算机语言等。,一、用自然语言描述算法,二、用流程图描述算法,流程图表示方法是用标准的图形符号描述算法的操作过程,直观形象,容易理解,也避免了人们对非形式化语言的理解差异。ANSI规定的常用流程图符号见P30表2-1。,为了提高算法质量,使算法的设计和阅读方便,需要规定流程只能顺序执行。1966年,Bohra和Jacopini提出了以下三种基本结构。,1顺序结构,2分支结构,3循环结构,循环结构是反复执行某一部分的操作,有两类循环结构: (1)当型循环如图2-3所示 (2)直到型循环如图2-4所示。 例2.2 用流程图描述计算5!的过程。5 ! 的流程图,如图2-5所示。,三、用N-S流程图描述算法,N-S流程图用以下基本图形表示:,例2.3用N-S描述计算5!的过程。 5!的N-S图,如图2-6所示。,四、用伪代码描述算法,伪代码通常用介于自然语言和计算机语言之间的文字、数学公式和符号来描述算法,一般在算法设计过程未最终确定的时候表示。,五、用计算机语言描述算法,只有用计算机语言编写的程序才能被计算机执行。用计算机语言表示算法必须严格遵循所用语言的语法规则。,2.4 算法举例,用C语言表示算法的一般过程:,文件包含(如: # include ) void main() 定义变量; 提供已知数据; 数据运算; 输出结果; ,#include #include void main( ) float a,b,c,l,s; /定义变量 printf(“请输入三角形的三边长: ”); /提示输入三边边长 do scanf(“%f,%f,%f”, /输出面积值 ,例2.6 利用三角形的三条边长求三角形的面积。,2.5本章小结,算法的概念和分类 算法的五大特性 算法的表示,第3章 C程序的控制结构,学习要求:,1. 掌握关系运算符和逻辑运算符的使用 2. 掌握if语句和switch语句的语法及应用 3. 掌握while语句、dowhile语句和for语句的语法及应用 4. 掌握break,continue语句的应用 5. 熟悉循环语句的嵌套应用,分支结构又称选择结构,是结构化程序设计的三种基本结构之一。在程序设计时,如果需要根据某些条件作出判断,决定不同的处理方式,则要用到分支结构。分支结构能根据条件是否成立自动选择要执行的程序段。,3.1 分支结构,3.1.1关系表达式和逻辑表达式,分支结构程序设计的关键是对选择条件的判断,选择条件的描述主要采用关系表达式和逻辑表达式。,一关系运算符与关系表达式,1. 关系运算符(见表3-1):,表3-1 关系运算符及其功能,2. 关系表达式:适用于对两个对象的简单比较,4. 关系表达式取值:逻辑值(非“真”即“假”) 关系成立为“真”,关系不成立为“假”。在C语言中,规定用数值1代表“真”,用数值0代表“假”。 例如,假设num1=3,num2=4,num3=5,则: (1)num1num2的值=0。 (2)(num1num2)!=num3的值=1。 (3)num1num2num3的值=1。 (4)(num1num2)+num3的值=6。,3. 优先级关系: (1)关系运算符内部 前4个优先级相同,后2个也相同,且前4个高于后2个。 (2)与其它种类运算符的优先级关系 关系运算符的优先级,低于算术运算符,但高于赋值运算符。,二 逻辑运算符和逻辑表达式,1.逻辑运算符:,2.逻辑表达式 由逻辑运算符连接的表达式称为逻辑表达式,逻辑运算符连接多个关系表达式可以描述多个对象的复杂关系。 如int x; x=0 & x=10 等。,表3-2 逻辑运算符及其含义和优先级,3. 和其他常用运算符的优先级关系 ! 算术运算 关系运算 & | 赋值运算,4. 逻辑表达式的值:逻辑值 C系统“非零为真,零为假”来判断一个逻辑量的真假。 说明: (1)操作数:逻辑运算符的操作数可为任何类型的数据,如实型、字符 型等。 (2)短路特性:在计算逻辑表达式时,只有在必须执行下一个表达式才能求解时,才求解该表达式(即并不是所有的表达式都被执行)。换句话说: 1)对于逻辑与运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。 2)对于逻辑或运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。 例如: 假设:n1=1、n2=2、n3=3、n4=4、x=1、y=1、z,则执行表达式z=(x=n1n2)&(y=n3n4)后x,y,z的值为多少?,x=0,y=1,z=0,3.1.2 if语句,三种形式 形式一(单分支选择): 格式:if (表达式) 语句 执行过程:,例:if (xy) printf(“%d”,x);,形式二(双分支选择): 格式:if (表达式) 语句1 else 语句2 执行过程:,例:if (xy) max=x; else max=y;,形式三(多分支选择): 格式:,if ( 表达式1 ) 语句1 else if (表达式2 ) 语句2 else if (表达式3 ) 语句3 . else 语句n ,执行过程:,例:if (x0) y=-1; else if (x=0) y=0; else y=1;,说明:if后面的表达式类型任意,语句可以是复合语句 if(x) if(x!=0) if(!x) if(x=0),【案例3.1】输入两个整数,输出其中的较大数。 【任务要求】掌握求最值的算法,以及if语句实现双分支结构的应用。,图3-2 案例3.2的算法描述,【程序详解】 /*ex3-1.c 求两个数的最大数 */ #include void main() int x , y,max; printf(“请输入两个整数 :“); scanf(“%d%d“ , /输出max ,【思考】 求3个数中的最大数/最小数或求4个数中的最大数/最小数如何实现?,(1) 在案例3.2中,初学者经常将“if(xy)”错误地添加分号,写成“if(xy);”,这会导致程序错误。 (2) 在if语句中,条件判断表达式必须用括号括起来。 (3) if后的表达式一般为关系表达式或逻辑表达式,但也可以是其他表达式,用0和非0取其逻辑值。 (4)if和else嵌套可组成多分支选择结构,但要注意if和else的配对关系,其原则是:else总是和上面最近的未曾配对的if配对。,经验交流,【案例3.2】输入三个数a,b,c,要求按由小到大的顺序输出。,【目的】掌握少量数据的简单排序算法及交换算法,【算法分析】 (1)将三个数分别存入a,b,c变量中 (2) if(ab) 将a和b对换 (a是a,b中的较小者) (3) if(ac) 将a和c对换 (a是a,c中的较小者,因此a是三个数中的最小者) (4) if(bc) 将b和c对换 (b是b,c中的较小者,也是三个数中的次小者) (5) 顺序输出a,b,c中的值,【程序祥解】 /*ex3-2.c 三个数排序*/ # include void main() int a,b,c,t; printf(“请输入三个整数:“); scanf(“%d%d%d“, ,【思考】 4个数/5个数的排序如何实现?,【案例3.3】计算以下分段函数的值。,【目的】掌握ifelse构造多分支选择结构的算法,【程序祥解】 /*ex3-3.c 求解分段函数*/ # include void main() float x , y ; printf(“请输入x :“); scanf(“%f“, ,【思考】 程序中虚线部分有没有其他的写法?,3.1.3条件表达式,条件运算符由“?”和“:”组成,是一个三目运算符,即有三个参与运算的量。 条件表达式的一般形式为: 表达式1 ? 表达式2 :表达式3 条件表达式的求值规则为:先计算表达式1的值,若为真,则计算表达式2的值并将其作为条件表达式的值,否则计算表达式3的值并将其作为条件表达式的值。,【案例3.4】输入一个字符,判断它是否是大写字母,如果是,将它转换成小字母,如果不是则不转换,然后输出最后得到的字符。,【程序详解】 /*ex3-4.c 大、小写字母的转换 */ #include void main() char ch; printf(“请输入一个字符: “); scanf(“%c“, ,经验交流,【目的】掌握英文字母大小写的转换方法,并练习条件运算符的使用,【思考】 如果输入是的小写字母,要求转换为对应的大写字母,如何实现?,3.1.4 switch语句,C语言提供了一种用于多分支结构的选择语句switch语句,其一般形式为: switch() case : 语句序列1; case : 语句序列2; case : 语句序列n; default : 语句序列n+1; ,其语法规则是:见书P42最后一段话,【案例3.5】根据考试成绩的等级输出相应的百分制分数段,用switch语句实现的程序段如下:,【任务要求】掌握switch语句的使用方法。,【程序详解】 /*ex3-5.c 根据等级输出分数段 */ #include void main() char grade; printf(“请输入成绩等级:“); scanf(“%c“, ,【思考】 如果输入的是百分制成绩,如何用switch语句实现输出其对应的等级?,【归纳总结】,(1) switch后的计算结果必须为整型或字符型,case后的必须是整型常量或字符型常量。 (2) 每个case后的常量表达式的值必须互不相等,否则就会出现互相矛盾的现象。 (3) 在case后,允许有多个语句,可以不用 括起来; (4) default子句可以省略不用。 (5)多条case语句可以共用一组执行语句。,3.2循环结构,在解决实际问题时,常常遇到许多有规律的重复执行的操作过程,利用计算机运算速度快的特点,可以将这些过程写成循环结构,使计算机反复执行这些操作。所谓循环就是在给定条件成立时反复执行某一程序段的现象,被反复执行的程序段称为循环体。 C语言提供三类语句来实现循环:while语句、dowhile语句和for语句。,3.2.1 while语句,while语句的语法形式为: while() 循环体; ,其算法描述如图3-9所示:,图3-9 while语句的算法描述,【案例3.6】求1+2+3+100的值。,#include void main() int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(“%d“,sum); ,【归纳总结】,(1) while 语句先判断条件,后决定是否执行循环体。如果循环条件一开始就为假,则循环体一次也不执行,直接执行循环体外的下一条语句。 (2) 在循环体中应有使循环趋于结束的语句,否则程序可能进入死循环状态。如以下程序段: i=5; while(i0) x+; (3) 在进入循环之前,应当对有关变量初始化。,3.2.1 dowhile语句,dowhile语句的语法形式为: do 循环体; while(); 其算法描述如图3-12所示。,图3-12 do-while语句执行流程图,【案例3.7】统计从键盘输入一行字符的个数(以回车键作为输入结束标记)。,【程序详解】 /*ex3-7.c 统计字符个数 */ #include void main() char ch; int num=0; /字符计数器 do ch=getchar(); /一次接收一个字符 num+; /每接收一个字符,字符计数变量加1 while(ch!=n); /回车为输入结束符 printf(“您输入了%d个字符n“,num-1); /输出计数结果 ,【思考】 用while语句改写该程序,或用dowhile改写1+2+100如何实现?,【归纳总结】,(1)while语句先判断条件后执行循环体语句,有可能一次也不执行循环体;而dowhile语句先执行循环体,后判断循环条件,至少会执行一次循环体。 (2)注意在do-while循环中,while(); 这里的分号必须有,否则有语法错误。 (3)while 和 do while语句在第一次循环条件就为真的情况下,可以相互改写而结果不变。,3.2.3 for语句,在C语言中,for语句使用灵活,功能强大,是使用最多的一类循环控制语句,其语法形式为: for(表达式1; 表达式2; 表达式3) 循环体; for循环的执行过程如下: (1) 求解表达式1。 (2) 求解表达式2,若其值为真,则执行循环体内的语句,转第3步;若其值为假,则结束循环。 (3) 求解表达式3,转第2步。 (4) 循环结束,执行for循环外的下一条语句。,for循环的算法描述如图3-15所示。,图3-15 for循环的算法描述,【案例3.8】如果能将一张厚度为0.05mm的报纸对折,再对折,再对折对折50次后,报纸的厚度是多少?,【程序详解】 /*ex3-8.c 报纸的对折问题 */ #include“stdio.h“ void main() double a=0.0005; /a表示纸的厚度,初始为0.0005米 int i; for( i=1;i=50;i+) /对折50次 a=a*2; /每对折一次厚度是原来的2倍 printf(“这张纸对折50次后厚度为%.2f米n“,a); /保留两位小数输出 ,【案例3.9】求具有,性质的四位数。,程序的算法描述如图3-17所示。,【归纳总结】,for循环中的“表达式1”、“表达式2”和“表达式3”都是可选项,即可以缺省,但“;”不能缺省。 (1)“表达式1”一般用于为进入for循环的有关变量赋初值,可以是赋值表达式、逗号表达式等。 (2)“表达式2”是循环执行条件,每次执行循环体语句前,都要判断条件是否成立,只要其值非0就执行循环体。 (3) 在循环体语句执行后,立即执行“表达式3”,“表达式3”一般用于改变有关变量的值,特别是常用于改变与循环条件有关的变量值。,for循环语句可以转换成while循环语句,以下for语句和while语句等价,for(i=1; i=100; i+) sum=sum+i;,i=1; while(i=100) sum=sum+i; i+; ,经验交流,i=1; do sum=sum+i; while(i=100);,3.2.4 break语句和continue语句,1break语句 break语句只能用在switch语句和循环语句中,其作用是跳出switch语句或跳出本层循环,转去执行后面的语句。,break、continue的流程图,【案例3.10】把316表示为两数之和,其中一个是13的倍数,另一个是11的倍数,【程序详解】 /*ex3-10.c 316分解问题算法 */ #include main( ) int m; for(m=1; ;+m) if(316-13*m)%11=0) break; /跳出本层循环 printf(“316=%d+%dn“, 13*m, 316-13*m); ,【案例3.11】输入一个自然数,判断该数是否为素数,如果是素数,输出“YES”,否则输出“NO”。,【程序详解】 /*ex3-11.c 判断素数 */ #include #include main( ) int n,i,flag=1; printf(“请输入任意一个整数:”);scanf(“%d”, ,思考:输出100400间的素数?【例3.13】,【归纳总结】 使用break语句在一些场合下使编程更加灵活、方便.,2. continue语句 continue语句可以结束本层本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断。,与break区别:continue语句只结束本层本次的循环,并不跳出循环。,【案例3.12】输出100以内能被9整除的数,按照每行5个数的格式输出。,/*ex3-12.c 【穷举法】 */ #include main( ) int n,count=0; for(n=9;n=100;n+) if(n%9!=0) continue; printf(“%dt”,n); count+; if(count%5=0) printf(“n”); printf(“n”); ,3.2.5循环的嵌套,循环的嵌套也称多重循环,即在一个循环语句的循环体中,可以嵌套另一个循环语句。执行顺序是:外循环执行一次,内循环执行一遍。,三种循环都可以互相嵌套: 1、while while 2、 do-while -dowhile while ( ) do while( ) do . while( ); while( );,3、for for 4、for while for( ; ;) for(; ;) for ( ; ; ) while( ) 5、 while do-while 6、do-while for while( ) do do for( ; ;) while( ); while ( );,举例书p55【例3.13】,ppt45,例:打印如右图图形。,* * *,main( ) int i,j,k; for(i=1;i=3;i+) for(j=1;j=3-i;j+) printf(“ ”); /*打印前导空格*/ for(k=1;k=2*i-1;k+) printf(“*”); /*打印*符号*/ printf(“n”); ,问:输出5行呢,9行呢?输出n行程序怎样修改?,经验交流:1、循环体多条语句时用“ ”括起来,并采用递缩格式 2、需要使用多层循环嵌套时,可逐层考虑循环,如求100以内素数,【案例3.15】估计2的方法,用的不足近似值来估计它的大小。当依次取定精确度1,0.1,0.01,0.001,时,2的不足近似值构成无穷数列:1,1.4,1.41,1.414,这个数列中的项随着序号的增加逐渐接近 2,就可以用这个数列来“逼近” 2。(穷举),#include main( ) double a=1.0,d=0.1; while(d0.000001) while(a+d)*(a+d)=2

温馨提示

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

评论

0/150

提交评论