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

下载本文档

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

文档简介

高级语言程序设计,肖洁大连工业大学管理学院,第三章C语言程序的流程控制,算法,1,关系运算符和关系表达式,2,选择结构程序设计,3,逻辑运算符和逻辑表达式,4,循环结构程序设计,5,3.1算法,一.算法的概念,二.算法的基本性质,三.结构化程序设计,四.算法的描述,一.算法的概念,算法:解决问题确定的方法和有限的步骤称作为算法。,一个程序应包括两个方面的内容:,对数据的描述:数据结构对操作的描述:算法,完整的程序设计应该是:,程序设计数据结构算法方法工具,二.算法的基本性质,有穷性:算法必须在执行有限个操作后终止;确定性:算法中每一步的含义必须是确切的,不可出现任何二义性;有效性:算法中的每一步操作都应该能有效执行,一个不可执行的操作是无效的;有0个或多个输入;有1个或多个输出。,三.结构化程序设计,结构化程序设计方法主要包括:只采用顺序、选择、循环三种基本的程序控制结构来编制程序,从而使程序具有良好的结构;程序设计自顶而下;用结构化程序设计流程图表示算法。,四.算法的描述,1,流程图,2,N-S图,3,伪代码,四.算法的描述,1.流程图,常用的流程图标准化符号,用流程图描述程序的三种基本结构,特点:一个入口,一个出口顺序执行,顺序结构,选择结构(if语句),功能:判断条件为真时执行语句,否则跳过语句,单选择双选择,用流程图描述程序的三种基本结构,循环结构,while循环,do-while型循环,用流程图描述程序的三种基本结构,例:交换两个变量的值,a,t,b,1,2,3,例3.1用流程图描述从三个数中取最大数的算法。,求最大值、最小值问题,常用算法:例如一种打擂台的方法。n个数中,先假设第一个数为最大值,成为擂主,依次同第2,3,n个数据逐一比较,一旦某个数大,马上替换擂主;所有值比较完,最大值也就获得。求最小值问题则先假设为最小值。,四.算法的描述,2.N-S图,N-S图的每一种基本结构都是一个矩形框,(c)当型重复结构,(a)顺序结构,(b)选择结构,四.算法的描述,3.伪代码,四.算法的描述,输入a,b,c;if(a=b)max=a;elsemax=b;if(max=c)输出max;else输出c;,初始化:max=0,i=1;当(i=max)max=n;输出max;,小结,算法概念算法特性结构化程序设计:顺序、选择、循环结构算法的描述:标准流程图、N-S图、伪代码交换两个数算法求一系列数最大值的算法,3.2关系运算符和关系表达式,一、关系运算符关系运算是进行比较大小的运算,并产生运算结果1(真)或0(假)。语言中的关系运算符有种:、!优先次序:前种同级,高于后种(后种同级)关系运算符的结合性为从左到右;,如:322+ac;(自左至右),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语句,条件可以是关系表达式或逻辑表达式,一、if语句,2.双选择if语句,语句格式:if(条件)语句组1;else语句组2;,双选择,功能:当条件为非零时执行语句组1否则执行语句组2。,一、if语句,if(a60)printf(“及格n”);elseprintf(“不及格n”);,main()inta;scanf(“%d”,输出不及格的成绩,例1,一、if语句,#includemain()inta,b,max;printf(Inputaandb=);scanf(%d%d,求a和b两数中较大的一个,例2,一、if语句,说出下列程序的输出结果:#includemain()inta;scanf(%d,例3,程序运行:输入58,输出?输入30,输出?,一、if语句,3.有关if语句的说明,条件后面不加分号语句之后有分号else不是语句,不能单独使用当if后有多个执行语句时,必须用将多个语句括起来,构成一个复合语句,而之外不必有分号。if后面的表达式一般为逻辑表达式或关系表达式,也可以是任意数值类型表达式。,一、if语句,该语句是合法的:if(3)printf(“ok!”);,4、if语句的嵌套,格式:if(表达式)if(表达式1)语句11;else语句12;elseif(表达式2)语句21;else语句22;,在if语句的“语句1”或“语句2”中又包含着if语句,判断表达式的值,若为非0,再判断表达式1的值,非0执行语句11,否则执行语句12若表达式的值为0,再判断表达式2的值,非0执行语句21,否则执行语句22,功能:,一、if语句,下列程序段表示的数学式?y=-1;if(x!=0)if(x0)y=2*sin(x);elsey=0;,程序段表示的数学式1:0(x0),讨论:给第二个if行加后表示的数学式?,程序段表示的数学式2:-1(x0),数学式1程序可表示为:y=-1;if(x!=0)if(x0)y=2*sin(x);elsey=0;,思考,强调:if和else可成对出现,也可不成对出现,每个else都与距其最近的if配对。,一、if语句,写一程序,判断某一年是否闰年。,其中:leap代表闰年的信息,leap=1闰年,leap=0非闰年main()intyear,leap;scanf(“%d”,例4,输入:1989结果为:1989isnotaleapyear输入:2000结果为:2000isaleapyear,1、if语句的多重选择形式:if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3elseif(表达式m)语句melse语句n,仅执行表达式为真的后面内嵌语句,若所有的表达式值都为0,则执行最后一个else后的内嵌语句.,二、ifelseif结构,二、ifelseif结构,根据百分制分数决定成绩的等级:80分以上为A级;70分及以上,80分以下,B级;60分及以上,70分以下,C级;60分以下,D级。,二、ifelseif结构,例5,#includeintmain(void)floatscore;printf(Inputascore:);scanf(%f,2、缩排是源程序普遍使用的书写方法,它是语句相对于上一条语句退后若干个字符位置的书写方法。,缩排的目的就是为了使源程序的层次清晰明了,增加源程序的可读性。,#includemain()intx;scanf(“%d”,二、ifelseif结构,main()inti=1,j=1,k=2;if(j+|k+)程序输出结果是:(B)A.2B.3C.4D.编译时有错,无结果,三、switch语句,1、一般格式:,switch(表达式)case常量表达式1:语句序列1break;case常量表达式2:语句序列2break;:case常量表达式n:语句序列nbreak;default:语句序列n+1,表达式,语句序列1,语句序列2,语句序列n,语句序列n+1,常量表达式1,常量表达式2,常量表达式n,default,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结构允许嵌套。,#includestdio.hmain()intscore;chargrade;printf(pleaseinputastudentsscore:n);scanf(%d,case6:grade=D;break;case7:grade=C;break;case8:grade=B;break;case9:case10:grade=A;break;default:printf(dataerror!n);grade;printf(“score=%d,grade=%c”,score,grade);,例6,#includemain()intscore;chargrade;printf(pleaseinputastudentsscore:n);scanf(%d,书例3.9联想猜词游戏,例7,三、switch语句,运输公司对用户计算运费。距离(s)越远,每公里运费越低。折扣为d(discount),每公里每吨货物的基本运费为p(price),货物重w(weight),总运费f(freight),f=p*w*s*(1-d),标准如下:,例8,s/250后分界值分别为1-2-4-8-12,main()intc,s;floatp,w,d,f;scanf(“%f,%f,%d”,case4:case5:,case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12: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)elsex=y;,(yy成立时条件表达式的值为1.2,否则为实型数据6.0(8bytes)。c=xy?1:s,当xy成立时c=1,否则c=s(4bytes)。,四、条件运算符,将输入的大写字母转换为小写字母。main()charch;scanf(“%c”,输入输出a,例9,四、条件运算符,#includeintmain(void)floata,b;printf(input2relasplease:);scanf(%f%f,书例3.11输入两数,输出大者。,例10,四、条件运算符,小结,if语句实现单分支if-else语句实现两个分支switch-break语句实现多分支嵌套if语句可以实现复杂的分支结构(注意else与哪个if结合)条件表达式,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个数开始,每一个数都是其前面两个相邻数之和。,一.迭代与穷举算法,一.迭代与穷举算法,幼仔数,成兔数,总数,一.迭代与穷举算法,上述算法可以描述为fib1=fib2=1(1)fibn=fibn-1+fibn-2(n=3)(2),fib=fib1+fib2;fib1=fib2;/*为下一次迭代作准备*/fib2=fib;,赋初值,迭代公式,一.迭代与穷举算法,对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。,2、穷举,一.迭代与穷举算法,循环控制有两种办法:计数法与标志法。,一.迭代与穷举算法,例3.15输入10个数,将最大的一个数打印出来。,一.迭代与穷举算法,当不想或无条件使用计数法时,可以使用标志法。,一.迭代与穷举算法,例3.16百钱买百鸡问题。鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、母、雏各几何?(1)基本解题思路,cocks+hens+chicks=1005*cocks+3*hens+chicks/3=100,二.While循环结构,while(表达式)循环体语句,1、语法形式:,例3.17人口问题,#includeintmain(void)doublem=13;inti=1;while(i=10)m=m*(1+0.002);i+;printf(“Populationafter10yersis:%fn”,m);return0;,Populationafter10yersis:13.262353,二.While循环结构,例3.18Fibonacci算法C语言的程序实现。,#includemain()intfib1=1,fib2=1,fib,i=3;while(i=12)fib=fib1+fib2;fib1=fib2;fib2=fib;i+;printf(“TheFibonaccinumberafter1yeris:%dn”,fib);,二.While循环结构,例3.22百钱买百鸡,main()intcocks=0;while(cocks=19)inthens=0;while(hens=33)intchicks;chicks=100-cocks-hens;if(5*cocks+3*hens+chicks/3.0=100)printf(%8d%8d%8dn,cocks,hens,chicks);hens+;cocks+;,三.dowhile结构,do循环体while(表达式);,1.dowhile循环语句的形式,先执行语句,后判断条件,循环体至少执行一次,例:用do-while型循环求:,main()inti=1,sum=0;dosum=sum+i;i+;while(i=100);printf(%d,sum);,例:输入10个数,将最大的一个数打印出来,#include#defineFLAG-32768main()intmax,n;printf(“Inputanumber:”);scanf(“%d”,四.for结构,1.for循环语句的形式for(表达式1;表达式2;表达式3)语句,2.执行过程,说明,(1)基本的应用形式:for(循环变量赋初值;循环条件;循环变量增值),例:求级数12+22+32+前10项之和。main()inti,sum=0;for(i=1;i=10;i+)sum=sum+i*i;printf(%d,sum);,(2)三个表达式均可缺省,但起分割作用的两个分号不可省略。例如:for(;)相当于while(1)表达式1省略,应在for之前对循环变量赋初值i=1;for(;i=10;i+)sum=sum+i;,说明,例:输出100以内所有偶数的和与所有奇数的和。main()inti,s1=0,s2=0;for(i=1;i100;i+)if(i%2=0)s2=s2+i;elses1=s1+i;printf(“s1=%d,s2=%dn”,s1,s2);,/*计算Fibonacci数*/#includeintmain(void)intfib1=1,fib2=1,fib,i;for(i=3;i=12;i+)fib=fib1+fib2;fib1=fib2;fib2=fib;printf(“TheFibonaccinumberafter1yearis:%dn”,fib);return0;,当使用计数方式控制重复过程时,采用for结构比较方便。,三种循环语句的比较,for语句和while语句先判断条件,后执行语句,故循环体有可能一次也不执行,而dowhile语句的循环体至少执行一次。必须在while语句和dowhile语句之前对循环体变量赋初值,而for语句可在表达式1中对循环变量赋初值。在循环次数已经确定的情况下,习惯用for语句;而对于循环次数不确定只给出循环结束条件的问题,习惯用while语句解决。,循环语句的嵌套,for(i=1;i=2;i+)for(j=1;j=2;j+)printf(“%3d”,i+j);printf(“n”);,for(i=1;i=2;i+)for(j=1;j=2;j+)printf(“%3d”,i+j);printf(“n”);,输出结果:2334,输出结果:2334,五.break与continue,1.break语句语法:break;功能:将流程转到该循环结构的后面(中途退出循环结构)。main()intn;for(n=100;n=200;n+)if(n%3=0)break;printf(“%6d”,n);,2.continue语句语法:continue;功能:结束循环体的本次执行(提前结束一个重复周期)。main()intn;for(n=100;n=200;n+)if(n%3=0)continue;printf(“%6d”,n);,100101,小结,算法:迭代和穷举While、dowhile、for循环循环嵌套循环转向控制break与continue,练习,1、输入一个整数n,判断是否为素数。在2n/2中能否找到一个整数m能将n整除。若m存在,则n不是素数;若找不到m,则n为素数。,for循环结构用下列表达式控制:初值:m=2循环条件:m=n/2修正:m+,设标志flag,初始值为1,默认是素数。,#incl

温馨提示

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

评论

0/150

提交评论