《程序的控制结构.pptx》由会员分享,可在线阅读,更多相关《程序的控制结构.pptx(81页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/2/2314.1 算法的概念及其描述算法的概念及其描述数据结构+算法=程序算法:为解决一个具体问题而采取的确定的有限的操作步骤。算法特性:有穷性确定性 有效性 没有输入或有多个输入 有一个或多个输出 第1页/共81页2023/2/232算法的分类算法的分类数值运算算法:解决的是求数值解的问题,例如用辗转相除法求两个数的最大公约数等非数值运算算法:主要用于解决需要用分析推理、逻辑推理才能解决的问题,例如人工智能中的许多问题,查找、分类等问题第2页/共81页2023/2/233算法的描述方法算法的描述方法自然语言表示传统的流程图表示N-S结构化流程图表示 伪代码表示第3页/共81页202
2、3/2/234构成程序的三种基本结构构成程序的三种基本结构顺序结构选择结构(分支结构)循环结构已经证明,任何程序均可只用这三种结构综合描述只用这三种结构编制的程序,叫结构化程序程序必须符合结构化规则第4页/共81页2023/2/235结构化程序设计的核心思想结构化程序设计的核心思想采用顺序、选择和循环三种基本结构作为程序设计的基本单元 只有一个入口;只有一个出口;无死语句,即不存在永远都执行不到的语句;无死循环,即不存在永远都执行不完的循环。采用“自顶向下、逐步求精”和模块化的方法进行结构化程序设计 第5页/共81页2023/2/2364.2 顺序结构顺序结构BANS图传统流程图BA第6页/共
3、81页2023/2/237顺序结构顺序结构应用举例应用举例(1)例:设半径为1.5,求圆周长及面积。解:(1)问题分析:(算法)step1:给出圆的半径r=1.5step2:求圆的周长及面积step3:输出结果公式:圆周长=2*3.14*r圆面积=3.14*r*r第7页/共81页2023/2/238开始r=1.5L=2*3.14*rs=3.14*r*r 输出L,s结束(2)画画出出流流程程图图第8页/共81页2023/2/239#include#define PI 3.14 main()float r,l,s;r=1.5;l=2*PI*r;s=PI*r*r;printf(nl=%f,s=%f,
4、l,s);(3)根根据据流流程程图图编编程程第9页/共81页2023/2/2310顺序结构顺序结构应用举例应用举例(2)例4.1 设银行存款利率rate为2.25%,存款期为n年,本金为captial元,编程计算n年后的本利之和deposit解:(1)问题分析:(算法)step2:给出年n、本金captial(键盘输入)step3:n年后本利之和depositstep4:输出结果公式:deposit=captial*(1+rate)n step1:给出存款利率rate第10页/共81页2023/2/2311开始rate=0.0225输入n和captialdepoist=captial*(1+r
5、ate)n 输出depoist结束(2)画画出出流流程程图图第11页/共81页2023/2/2312(3)根根据据流流程程图图编编程程#include#include main()int n;double rate=0.0225;double capital,deposit;printf(please enter year,capital:);scanf(%d%lf,&n,&capital);deposit=capital*pow(1+rate,n);printf(deposit=%lfn,deposit);第12页/共81页2023/2/2313以#开始的编译预处理命令 main()局部变量
6、说明语句;执行语句;简单的简单的C程序结构框架程序结构框架第13页/共81页2023/2/2314编译预处理命令编译预处理命令文件包含编译预处理命令#include指示编译系统将一个源文件嵌入到含有#include指令的源文件中该指令所在的位置处。使用形式:#include /头文件名注意:以#开头;每条一行;不是C语句第14页/共81页2023/2/2315查询情况编译预处理命令编译预处理命令(1)用将头文件名括起,则在include 子目录中查询(2)用 将头文件名括起,则先在 当前目录中查找若无继续搜索 C子目录。第15页/共81页2023/2/2316常用函数对应的头文件常用函数对应的
7、头文件 函数 头文件名数学函数 math.h 字符串函数 string.h输入、输出函数 stdio.h动态存储分配函数 stdlib.h/malloc.h第16页/共81页2023/2/23174.3 选择结构选择结构作用:根据条件控制程序流向。条件的组成:问题的提出:各种类型的常量、变量、表达式(常用:关系/逻辑表达式)注意各种表达式的用法第17页/共81页2023/2/2318简单分支选择(单分支)结构简单分支选择(单分支)结构yesno语句A A条件成立否条件表达式.T.F.语句格式:if(表达式)语句/语句组;第18页/共81页2023/2/2319双分支选择结构双分支选择结构yes
8、no程序段A A程序段B B条件成立否条件表达式.T.F.语句1语句2格式:If(表达式)语句1/语句组1;else 语句2/语句组2;第19页/共81页2023/2/2320多分支选择结构多分支选择结构表达式表达式语句语句1T TF F语句语句2表达式表达式表达式表达式语句语句3语句语句4T TT TF FF F表达式表达式1语句语句1T TF F语句语句2表达式表达式2表达式表达式3语句语句3语句语句4T TT TF FF F第20页/共81页2023/2/2321多分支选择结构多分支选择结构 if(表达式)语句1;else if(表达式2)语句2;:else if(表达式m)语句m;el
9、se 语句n;一般形式:第21页/共81页2023/2/2322分支嵌套分支嵌套 if(表达式1)if(表达式2)语句1;else 语句2;else if(表达式3)语句3;else 语句4;一般形式:第22页/共81页2023/2/2323使用使用 if if 语句需注意事项语句需注意事项(1)条件判断表达式一定用圆括号括起。(2)复合语句必须用引起。(3)每一个else必须与一个if项匹配。(4)else总是与离它最近的if 相匹配。第23页/共81页2023/2/2324体型判断。按“体指数”对肥胖程度进行划分:体指数t=体重w/(身高h)2 (w 单位为公斤,h单位为米)当t=27时,
10、为肥胖。编程从键盘输入你的身高h和体重w,根据给定公式计算体指数t,然后判断你的体重属于何种类型。用3种方法编程:算法1:用不带else子句的if语句编程(ex45_1)算法2:用在if子句中嵌入if 语句的形式编程(ex45_2)算法3:用在else子句中嵌入if 语句的形式编程(ex45_3)例例4.54.5第24页/共81页2023/2/2325例:计算并输出下列分段函数值 y=0 x 01 x0#include main()float x,y;printf(input x:);scanf(%f,&x);y=0;if(x0)y=1;printf(y=%fn,y);第25页/共81页202
11、3/2/2326用用 switchswitch语句构成的多分支结构语句构成的多分支结构多路选择switch(表达式)case 常数1:语句序列1;case 常数2:语句序列2;default:语句序列3;default可以没有,但最好不省略不要忘记break第26页/共81页2023/2/2327例例4.84.8编程设计一个简单的计算器程序。(ex48)要求根据用户从键盘输入的表达式:操作数1 运算符op 操作数2计算表达式的值,指定的运算符为加(+)、减(-)、乘(*)、除(/)第27页/共81页2023/2/2328使用使用 switchswitch语句应注意语句应注意(1)各常量表达式的
12、值不可相同。(2)case 后可有多个语句,不用括起。(3)常量表达式仅是一个语句标号。(4)各case及default子句的顺序可随意。(5)每个分支执行后,利用break语句跳出。第28页/共81页2023/2/23294.4 循环结构循环结构引入循环的目的:简化程序、提高编程效率三种循环方式当型循环直到型循环步长型循环第29页/共81页2023/2/2330循环结构的流程图循环结构的流程图条条 件件P P P PA当型循环直到循环真假假条条 件件P P P PA假真假条条 件件P P P P条条 件件P P P PA假第30页/共81页2023/2/2331循环语句循环语句while一般
13、形式:while(表达式)语句;只要表达式的值为非0,就重复执行语句,直到表达式值为0时止先判断,后执行第31页/共81页2023/2/2332例:找出100以内的奇数。main()int I=1;while(I=100)printf(%d,I);I+=2;注意:(1)while 构成的 是“当型”循环。(2)循环体中一定 有对于循环控 制变量的操作。第32页/共81页2023/2/2333循环语句循环语句do-while一般形式:do 语句;while(表达式);首先执行语句,然后判断表达式的值。如果表达式为0,继续向下执行,否则,再次执行语句,再次判断表达式的值语句会被至少执行一次第33页
14、/共81页2023/2/2334例:找出100以内的奇数。main()int I=1;while(I=100)printf(%d,I);I+=2;main()int I=1;do printf(%d,I);I+=2;while(I=100);第34页/共81页2023/2/2335循环语句循环语句for 一般形式:for(表达式1;表达式2;表达式3)语句;表达式2执行循环体计算表达式1的值计算表达式3的值跳出循环TF工作过程:第35页/共81页2023/2/2336有关有关 for 的说明的说明(1)for(表达式1;表达式2;表达式3)语句;相当于:表达式1;while(表达式2)语句;表
15、达式3;第36页/共81页2023/2/2337在for和while语句之后一般没有分号有分号表示循环体就是分号之前的内容(空循环体)while(i 100);i+;for(i=0;i 100;i+);printf(%d,i);for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量有关有关 for 的说明的说明(2)第37页/共81页2023/2/2338 for语句中的表达式1、表达式3可为逗号表达式。如:for(i=0,j=1;jn∈i+,j+)表达式1和表达式3可以没有或者是用逗号分隔的多个表达式的组合。如:for(;i=5;)有关有关 for 的说明的说明(3)第38
16、页/共81页2023/2/2339 main()float x,sum;while(x!=9999)if(x0.0)sum+=x;printf(nsum=%f,sum);scanf(%f,&x);scanf(%f,&x);例:给定一组数据如下,编程对负数求和。12,45,67.8,-12.5,-35.67,567.89方法1:用 while第39页/共81页2023/2/2340例:给定一组数据如下,编程对负数求和。12,45,67.8,-12.5,-35.67,567.89方法2:用 for main()float x,sum=0;for(i=1;i=6;i+)if(x0.0)sum+=x;
17、scanf(%f,&x);printf(nsum=%f,sum);int i;第40页/共81页2023/2/2341选择三种循环的一般原则选择三种循环的一般原则如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while这只是“一般”原则,不是“原则”第41页/共81页2023/2/2342 猜数游戏:先由计算机“想”一个数请人猜,如果人猜对了,则计算机给出提示:“Right!”,否则提示:“Wrong!”,并告诉人所猜的数是大还是小。(ex46)例例4.64.6分析:Step1:计算机想一个数;Step2:人猜一个数;Step3:判断三种情况并给出相
18、应结果。第42页/共81页2023/2/2343猜数游戏用到的库函数(猜数游戏用到的库函数(1 1)随机函数rand()#include RAND_MAX在stdlib.h中定义,不大于双字节整数的最大值32767 产生0,RAND_MAX 之间的随机数magic=rand();产生0,b-1 之间的随机数magic=rand()%b;产生a,a+b-1 之间的随机数magic=rand()%b+a;第43页/共81页2023/2/2344 猜数游戏:先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,则结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。计算机
19、记录人猜的次数,以此来反映猜数者“猜”的水平。(ex49)例例4.94.9运行程序发现问题运行程序发现问题每次运行程序,机器所想的数都是一样的;用函数rand所产生的随机数只是伪随机数。第44页/共81页2023/2/2345猜数游戏用到的库函数(猜数游戏用到的库函数(2 2)随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”通过键入随机数种子,产生0,100之间的随机数scanf(%u,&seed);srand(seed);magic=rand()%100+1;改进例4.9(ex49_1)第45页/共81页2023/2/2346猜数游戏用到的库
20、函数(猜数游戏用到的库函数(3 3)随机函数srand:为函数rand()设置随机数种子来实现对其产生的伪随机数的“随机化”使用计算机读取其时钟值并把该值自动设置为随机数种子,产生0,100之间的随机数函数time()返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子#include srand(time(NULL);magic=rand()%100+1;再改进例4.9(ex49_2)第46页/共81页2023/2/2347永远不会退出的循环为死循环for(;)while(1)do while(1);一般情况下,要极力避免死循环绝大多数程序不需要死循环。如果出现,往往都是
21、bug时间过长的循环会造成“假死”效果,也要考虑解决死循环死循环第47页/共81页2023/2/2348例例4.11 4.11 国王的许诺国王的许诺相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。位聪明的宰相指着88共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了舍罕王让人扛来一袋麦子,他要兑现他的许诺。国王能兑现他的许诺吗?试编程计算舍罕王共要多少麦子赏赐他的宰相,这些麦子合多少立方米?(已知1立方米麦子约1.42e
22、8粒)总粒数为:sum=1+2+2sum=1+2+22 2+2+23 3+2+26363 第48页/共81页2023/2/2349#define CONST 1.42e8#include#include main()int n;double term,sum=0;/*累加求和变量赋初值*/for(n=1;n=64;n+)term=pow(2,n-1);/*根据累加项的规律计算累加项*/sum=sum+term;/*作累加运算*/printf(sum=%en,sum);/*打印总麦粒数*/printf(volum=%en,sum/CONST);/*打印折合的总麦粒体积数*/方法方法1 1第49页
23、/共81页2023/2/2350方法方法2 2#define CONST 1.42e8 /*定义符号常量CONST值为1.42e8*/#include main()int n;double term=1,sum=1;/*累乘求积、累加求和变量赋初值*/for(n=2;n=64;n+)term=term*2;/*根据后项总是前项的2倍计算累加项*/sum=sum+term;/*作累加运算*/printf(sum=%en,sum);/*打印总麦粒数*/printf(volum=%en,sum/CONST);/*打印折合的总麦粒体积数*/第50页/共81页2023/2/2351循环嵌套循环嵌套结构形
24、式 for():while():do :while();第51页/共81页2023/2/2352使用嵌套的循环时使用嵌套的循环时,应注意的问题应注意的问题在嵌套的各层循环体中,使用复合语句(即用一对大花括号将循环体语句括起来)保证逻辑上的正确性 内层和外层循环控制变量不应同名,以免造成混乱 嵌套的循环最好采用右缩进格式书写,以保证层次的清晰性 循环嵌套不能交叉,即在一个循环体内必须完整的包含着另一个循环 第52页/共81页2023/2/2353合法的嵌套循环合法的嵌套循环第53页/共81页2023/2/2354例例4.144.14编程输出如下形式的九九表第54页/共81页2023/2/2355
25、#include main()int m,n;for(m=1;m10;m+)printf(%4d,m);/*打印表头*/printf(n);for(m=1;m10;m+)printf(-);printf(n);for(m=1;m10;m+)for(n=1;n10;n+)printf(%4d,m*n);printf(n);例例4.144.14第55页/共81页2023/2/2356例例4.154.15将上例输出格式改变成下三角格式打印第56页/共81页2023/2/2357#include main()int m,n;for(m=1;m10;m+)printf(%4d,m);/*打印表头*/pr
26、intf(n);for(m=1;m10;m+)printf(-);printf(n);for(m=1;m10;m+)for(n=1;n=m;n+)printf(%4d,m*n);printf(n);例例4.154.15第57页/共81页2023/2/2358例例4.16 4.16 马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?解方程组穷举法第58页/共81页2023/2/2359方法方法1:1:穷举穷举x,y,z的所有组合的所有组合#include mai
27、n()int x,y,z;printf(Man t Women t Childernn);for(x=0;x=30;x+)for(y=0;y=30;y+)for(z=0;z=30;z+)if(x+y+z=30&3*x+2*y+z=50)printf(%3d t%5d t%8dn,x,y,z);第59页/共81页2023/2/2360方法方法2:2:改进算法改进算法#include main()int x,y,z;printf(Man t Women t Childernn);for(x=0;x=16;x+)for(y=0;y=25;y+)z=30 x-y;if(3*x+2*y+z=50)pri
28、ntf(%3d t%5d t%8dn,x,y,z);第60页/共81页2023/2/23614.5 4.5 流程的转移控制流程的转移控制goto语句break语句continue语句return语句 标准库函数exit()第61页/共81页2023/2/2362gotogoto 语句语句一般形式 goto 语句标号;语句标号:或 语句标号:goto 语句标号;功能:无条件转去执行语句标号所指语句行。第62页/共81页2023/2/2363(1)语句标号用标识符表示。(2)语句标号一定为函数段中存在的。(3)该语句不可滥用。使用使用gotogoto 语句要注意语句要注意标号举例error:got
29、o举例goto error;不能用整数作语句标号第63页/共81页2023/2/2364使用之后,程序仍然是单入口,单出口不要使用一个以上的标号不要用goto往回跳,要向下跳不要让goto制造出永远不会被执行的代码使用使用gotogoto 语句的原则语句的原则第64页/共81页2023/2/2365break 与与continue 语句语句 break语句的作用:循环中使用break语句可提前结束整个循环。continue语句的作用:循环中使用continue语句可提前结束本次循环第65页/共81页2023/2/2366break 与与continue 语句示意图语句示意图假假真真break表
30、达式1表达式2循环语句的下一条语句循环语句的下一条语句假假真真 contiue表达式1表达式2continue第66页/共81页2023/2/2367有关有关break 与与continue 的说的说明明(1)break 语句可用于switch结构,也可用于循环中;(2)continue语句仅用于循环中;(3)break 与continue均只影响包含它的结构中;(4)break 与continue少用为妙;第67页/共81页2023/2/2368#include#define PI 3.14 main()int r;float area;for(r=1;r50.0)break;printf(
31、面积等于%fn,area);printf(现在r=%dn,r);例第68页/共81页2023/2/2369例#include#define PI 3.14 main()int r;float area;for(r=1;r=10;r+)area=PI*r*r;if(area50.0)continue;printf(面积等于%fn,area);第69页/共81页2023/2/2370Exit()函数函数exit(0)l作用是终止整个程序的执行,强制返回操作系统 l调用该函数需要嵌入头文件第70页/共81页2023/2/2371例例4.194.19从键盘任意输入一个正整数,编程判断它是否是素数,若是
32、素数,输出“Yes!”;否则,输出“No!”问题分析:概念:素数是指除了能被1和它本身整除外,不能被其他任何整数整除的数;判断素数的方法:把m作为被除数,把i=2(m-1)依次做为除数,若余数都不为0,则说明是素数。简单判断方法:只需用2 的数去除m,即可得到正确的判定结果。第71页/共81页2023/2/2372#include main()int m,i,k;printf(Please enter a number:);scanf(%d,&m);k=sqrt(m);for(i=2;i=k;i+)if(m%i=0)printf(No!n);goto end;printf(Yes!n);end
33、:printf(Program is over!n);Please enter a number:6Program is over!No!方法方法1 1:用:用gotogoto第72页/共81页2023/2/2373方法方法1 1:用:用gotogoto#include main()int m,i,k;printf(Please enter a number:);scanf(%d,&m);k=sqrt(m);for(i=2;i=k;i+)if(m%i=0)printf(No!n);goto end;printf(Yes!n);end:printf(Program is over!n);Plea
34、se enter a number:5Program is over!Yes!第73页/共81页2023/2/2374#include main()int m,i,k;printf(Please enter a number:);scanf(%d,&m);k=sqrt(m);for(i=2;i k)printf(Yes!n);else printf(No!n);printf(Program is over!n);Please enter a number:6Program is over!No!方法方法2 2:用:用breakbreak第74页/共81页2023/2/2375#include
35、main()int m,i,k,flag=1;/*标志变量flag初值置为1*/printf(Please enter a number:);scanf(%d,&m);k=sqrt(m);for(i=2;i=k&flag;i+)if(m%i=0)flag=0;if(flag)printf(Yes!n);else printf(No!n);printf(Program is over!n);方法方法3 3采用设置标志变量的方法第75页/共81页2023/2/2376#include main()int m,i,k,flag=1;/*标志变量flag初值置为1*/printf(Please ent
36、er a number:);scanf(%d,&m);for(i=2;i=m-1;i+)if(m%i=0)flag=0;printf(%dn,i);if(flag)printf(No divisor!It is a prime number.n);printf(Program is over!n);程序功能?程序功能?第76页/共81页2023/2/2377本章小结(本章小结(1)算法的描述方法流程图与基本控制结构相应的结构化的控制语句if-elseswitchforwhiledo-whilebreakcontinue常用算法,如累加、累乘、统计、递推、迭代、穷举 等第77页/共81页2023
37、/2/2378常用算法(1)求阶乘:数据类型的定义,long或double(2)统计:统计正数、平均分以上、n个成绩中10090、8980、7970、6960、60的人数;输入字符串中字母d的个数设置一个计数变量k:初始化为1,每遇到一次将其加1:k+;本章小结(本章小结(2)第78页/共81页2023/2/2379本章小结(本章小结(3)常用算法(3)累加和:存放累加和的变量初始化为0或第一项,再循环加每一项;循环控制:前n项之和已知循环次数,可设置一个循环变量如i来控制;加到某一项或累加和满足一定条件。例:1+2+.+n 与 1+3+5+7+.和 2+4+6+8+.及12+32+52+72+.输入n或累加和大于2000的最小的n第79页/共81页2023/2/2380作业作业习题44.2、4.3、4.4、4.6、4.10、4.14、4.15、4.19、4.20、4.25、4.26、4.27下周实验内容:习题44.15、4.19、4.20、4.25、第80页/共81页2023/2/2381感谢您的观看!第81页/共81页
限制150内