收藏 分销(赏)

C语言第4章.ppt

上传人:xrp****65 文档编号:13226243 上传时间:2026-02-06 格式:PPT 页数:63 大小:486KB 下载积分:10 金币
下载 相关 举报
C语言第4章.ppt_第1页
第1页 / 共63页
C语言第4章.ppt_第2页
第2页 / 共63页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第,4,章 程序的控制结构,C语言大学实用教程,内容提要,算法的描述方法,基本控制结构,基本控制语句,常用算法,如累加、累乘、统计、递推、迭代、穷举等,程序的基本版式,结构化程序设计的基本思想,2,算法的概念,数据结构,+,算法,=,程序,算法:为解决一个具体问题而采取的确定的有限的操作步骤,这里仅指计算机能执行的算法,算法特性:,有穷性,确定性,有效性,没有输入或有多个输入,有一个或多个输出,3,算法的分类,数值运算算法:,解决的是求数值解的问题,例如用辗转相除法求两个数的最大公约数等,非数值运算算法:,主要用于解决需要用分析推理、逻辑推理才能解决的问题,例如人工智能中的许多问题,查找、分类等问题,4,算法的表示方法,自然语言表示,传统的流程图表示,N-S,结构化流程图表示,伪代码表示,5,C,程序结构,C,程序,源程序文件,1,源程序文件,2,源程序文件,3,编译预处理命令,全局变量声明,函数,1,函数,n,函数首部,函数体,局部变量声明,执行语句,6,构成程序的三种基本结构,顺序结构,选择结构,循环结构,已经证明,任何程序均可只用这三种结构综合描述,只用这三种结构编制的程序,叫结构化程序,程序必须符合结构化规则,7,结构化程序设计的核心思想,采用顺序、选择和循环三种基本结构作为程序设计的基本单元,只有一个入口;,只有一个出口;,无死语句,即不存在永远都执行不到的语句;,无死循环,即不存在永远都执行不完的循环。,采用“自顶向下、逐步求精”和模块化的方法进行结构化程序设计,8,B,A,NS,图,传统流程图,顺序结构,B,A,9,B,N,如果,成绩,60,那么,通知补考,否则,告知你考试成绩,A,Y,条 件,P,A,B,N,Y,条 件,P,分支结构(选择结构),10,条 件,P,A,当型循环,直到型循环,真,假,假,条 件,P,A,假,真,循环结构,11,当型循环,A,真,假,假,条 件,P,循环结构,当,P,为真,A,当,P,为真,A,12,直到型循环,条 件,P,A,假,真,循环结构,直到,P,为假,A,直到,P,为假,A,13,复合语句,括住的若干条语句构成一个复合语句,语句块内可以定义变量,变量仅在定义它的复合语句内有效,变量必须在复合语句的开头定义,复合语句可以用在任何可以使用语句的地方,14,if,-,else,选择结构的一种最常用形式,if,(,表达式,),语句,1;,else,语句,2;,语句,3,表达式,值,非,0,时,执行,语句,1,,然后,语句,3,;,表达式,值为,0,时,执行,语句,2,,然后,语句,3,else,部分可以没有。,if,(,表达式,),语句,1;,语句,3,当,表达式,值为,0,时,直接执行,语句,3,if-else,嵌套使用时,注意,else,和谁配对的问题,15,else,-,if,if,的一种扩展形式,if,(,表达式,),语句,1;,else if,(,表达式,),语句,2;,else if,(,表达式,),语句,3;,else,语句,4;,语句,5;,else,部分可以没有,16,编程完成例,4.5,体型判断。按“体指数”对肥胖程度进行划分:,体指数,t=,体重,w/(,身高,h)2,(,w,单位为公斤,,h,单位为米),当,t=27,时,为肥胖。,编程从键盘输入你的身高,h,和体重,w,,根据给定公式计算体指数,t,,然后判断你的体重属于何种类型。,用,3,种方法编程:,算法,1,:用不带,else,子句的,if,语句编程,算法,2,:用在,if,子句中嵌入,if,语句的形式编程,算法,3,:用在,else,子句中嵌入,if,语句的形式编程,17,switch,多路选择,switch,(,表达式,),case,常数,1:,语句序列,1;,case,常数,2:,语句序列,2;,default,:,语句序列,3;,default,可以没有,但最好不省略,不要忘记,break,18,编程完成计算器程序,例,4.8,编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:,操作数,1,运算符,op,操作数,2,然后,计算表达式的值,指定的运算符为加(,+,)、减(,-,)、乘(*)、除(,/,),19,循环,while,,,for,while,(,表达式,),语句,;,for,(,表达式,1;,表达式,2;,表达式,3),语句,;,20,while,while,(,表达式,),语句,;,只要,表达式,的值为,非,0,,就重复执行,语句,,直到,表达式,值为,0,时止,21,for,for,(,表达式,1;,表达式,2;,表达式,3),语句,;,首先执行,表达式,1,。如果,表达式,2,的值为,非,0,,就重复执行,语句,和,表达式,3,,直到,表达式,2,的值为,0,时止,相当于:,表达式,1;,while,(,表达式,2),语句,;,表达式,3;,表达式,1,和,表达式,3,可以没有或者是用逗号分隔的多个表达式的组合。但最好不要有太多的表达式组合,22,注意,在,for,和,while,语句之后一般没有分号,有分号表示循环体就是分号之前的内容(空循环体),while,(i 100),;,i+;,for,(i=0;i 100;i+),;,printf(%d,i);,for,通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量,23,do,-,while,do,语句,;,while,(,表达式,);,首先执行,语句,,然后判断,表达式,的值。如果表达式为,0,,继续向下执行,否则,再次执行,语句,,再次判断,表达式,的值,语句,会被至少执行一次,24,条 件,P,A,当型循环,直到循环,真,假,假,条 件,P,A,假,真,假,条 件,P,条 件,P,A,假,当循环条件第一次就为假时,25,选择三种循环的一般原则,如果循环次数已知,用,for,如果循环次数未知,用,while,如果循环体至少要执行一次,用,do,-,while,这只是“一般”原则,不是“原则”,26,编程完成例,4.6,,例,4.9,例,4.6,:猜数游戏:先由计算机“想”一个数请人猜,如果人猜对了,则计算机给出提示:“,Right!”,,否则提示:“,Wrong!”,,并告诉人所猜的数是大还是小。,例,4.9,:先由计算机“想”一个,1,到,100,之间的数请人猜,如果人猜对了,则结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。计算机记录人猜的次数,以此来反映猜数者“猜”的水平。,27,猜数游戏用到的库函数,随机函数,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;,现场编程完成例,4.6,,发现问题,28,猜数游戏用到的库函数,随机函数,srand,为函数,rand(),设置随机数种子来实现对函数,rand,所产生的伪随机数的“随机化”,通过键入随机数种子,产生,1,100,之间的随机数,scanf(%u,srand(seed);,magic=rand()%100+1;,29,猜数游戏用到的库函数,随机函数,srand,为函数,rand(),设置随机数种子来实现对函数,rand,所产生的伪随机数的“随机化”,使用计算机读取其时钟值并把该值自动设置为随机数种子,产生,1,100,之间的随机数,函数,time(),返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子,#include ,srand(time(NULL,);,magic=rand()%100+1;,30,死循环,永远不会退出的循环为死循环,for,(;),while,(1),do,while,(1),一般情况下,要极力避免死循环,绝大多数程序不需要死循环。如果出现,往往都是,bug,时间过长的循环会造成“假死”效果,也要考虑解决,31,编程完成例,4.11,国王的许诺。相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。,位聪明的宰相指着,8,8,共,64,格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放,1,粒,第,2,格中放,2,粒,第,3,格放,4,粒,以后每一格都比前一格增加一倍,依此放完棋盘上的,64,个格子,我就感恩不尽了。,舍罕王让人扛来一袋麦子,他要兑现他的许诺。,国王能兑现他的许诺吗?试编程计算舍罕王共要多少麦子赏赐他的宰相,这些麦子合多少立方米?,(已知,1,立方米麦子约,1.42e8,粒),总粒数为:,sum=1+2+2,2,+2,3,+2,63,32,方法,1,#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);/*,打印折合的总麦粒体积数*,/,33,方法,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);/*,打印折合的总麦粒体积数*,/,34,使用嵌套的循环体时,应注意以下问题,在嵌套的各层循环体中,使用复合语句(即用一对大花括号将循环体语句括起来)保证逻辑上的正确性,内层和外层循环控制变量不应同名,以免造成混乱,嵌套的循环最好采用右缩进格式书写,以保证层次的清晰性,循环嵌套不能交叉,即在一个循环体内必须完整的包含着另一个循环,35,合法的嵌套循环,36,现场编程完成例,4.14,编程输出如下形式的乘法九九表,37,#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);,38,现场编程完成例,4.15,将上例输出格式改成如下的下三角格式打印,39,#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;,n=m,;n+),printf,(%4d,m*n);,printf,(n);,40,现场编程完成例,4.16,马克思手稿中有一道趣味数学题:有,30,个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了,50,先令,每个男人各花,3,先令,每个女人各花,2,先令,每个小孩各花,1,先令,问男人、女人和小孩各有几人?,解方程组,穷举,法,41,方法,1:,采用三重循环穷举,x,y,z,的全部可能的组合,#include,main,(),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);,42,方法,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),printf,(,%3d t%5d t%8dn,x,y,z);,43,流程的转移控制,break,语句,continue,语句,goto,语句,return,语句,标准库函数,exit(),44,break,和,continue,对,for,、,while,、,do,-,while,循环进行内部手术,break,,退出循环,continue,,中断此次循环体的执行,开始下一次,break,和,continue,少用为妙,45,break,和,continue,假,假,真,真,break,表达式,1,表达式,2,循环语句的,下一条语句,循环语句的,下一条语句,假,假,真,真,contiue,表达式,1,表达式,2,continue,46,标号举例,error:,goto,举例,goto,error;,一般形式,goto,语句标号,;,语句标号:,或,语句标号:,goto,语句标号,;,goto,与标号(,label,),47,exit(),函数,exit(0),作用是终止整个程序的执行,强制返回操作系统,调用该函数需要嵌入头文件,48,输入一个整数,判断它是否是素数,49,方法,1,#include ,main,(),int,m,i,k;,printf,(Please enter a number:);,scanf,(%d,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);,Please enter a number:,6,Program is over!,No!,50,方法,1,#include ,main,(),int,m,i,k;,printf,(Please enter a number:);,scanf,(%d,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);,Please enter a number:,5,Program is over!,Yes!,51,方法,2,#include ,main,(),int,m,i,k;,printf,(Please enter a number:);,scanf,(%d,k=,sqrt,(m);,for,(i=2;i k),printf,(Yes!n);,else,printf,(No!n);,printf,(Program is over!n);,Please enter a number:,6,Program is over!,No!,52,方法,3,#include ,main,(),int,m,i,k,flag=1;/*,标志变量,flag,初值置为,1*/,printf,(Please enter a number:);,scanf,(%d,k=,sqrt,(m);,for,(i=2;i=k i+),if,(m%i=0),flag=0;,if,(flag),printf,(Yes!n);,else,printf,(No!n);,printf,(Program is over!n);,53,这个程序是做什么的?,#include ,main,(),int,m,i,k,flag=1;/*,标志变量,flag,初值置为,1*/,printf,(Please enter a number:);,scanf,(%d,k=,sqrt,(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);,54,糟糕的,goto,START_LOOP:,i,f,(,fStatusOk,),if,(,fDataAvaiable,),i=10;,goto,MID_LOOP;,else,goto,END_LOOP;,else,for,(,i,=0;,i,100;,i,+),MID_LOOP:,/lots of code here,goto,START_LOOP;,END_LOOP:,55,糟糕的,goto,START_LOOP,:,i,f,(,fStatusOk,),if,(,fDataAvaiable,),i=10;,goto,MID_LOOP;,else,goto,END_LOOP;,else,for,(,i,=0;,i,100;,i,+),MID_LOOP:,/lots of code here,goto,START_LOOP;,END_LOOP:,56,现代观点认为:,混乱根源不在,goto,,而在标号,任何程序都可以不用,goto,就实现其功能,但在某些情况下,使用,goto,可以让程序更清晰,57,使用,goto,的原则,使用之后,程序仍然是单入口,单出口,不要使用一个以上的标号,不要用,goto,往回跳,要向下跳,不要让,goto,制造出永远不会被执行的代码,58,编程的艺术就是处理复杂性的艺术,优秀的程序员很清楚自己的能力是有限的,所以他对待编程任务的态度是完全谦卑的,特别是,他们会象逃避瘟疫那样逃避“聪明的技巧”。,1972,年图灵奖演讲,简单是可靠的先决条件,我们所使用的工具深刻地影响我们的思考习惯,从而也影响了我们的思考能力,59,这一章我们学习了,算法的描述方法,流程图,与基本控制结构相应的结构化的控制语句,if-else,switch,for,while,do-while,break,continue,常用算法,如,累加、累乘、统计,、递推、迭代、穷举等,60,这一章我们学习了,常用算法,求阶乘,:,数据类型的定义,long,或,double,求累加和,:long,统计,:,统计正数、平均分以上、,n,个成绩中,10090,、,8980,、,7970,、,6960,、,60,的人数;输入字符串中字母,d,的个数,设置一个计数变量,k,:初始化为,1,,每遇到一次将其加,1,:,k+;,61,这一章我们学习了,累加和,存放累加和的变量:,初始化为,0,或第一项,再循环加每一项;,循环控制:,前,n,项之和,已知循环次数,可设置一个循环变量如,i,来控制;,加到某一项或累加和满足一定条件。例:,1+2+.+n,与,1+3+5+7+.,和,2+4+6+8+.,及,12+32+52+72+.,输入,n,或累加和大于,2000,的最小的,n,62,这一章我们学习了,累加的项较复杂时,得专门求,例:,前后项之间无关,1,m,+3,m,+5,m,+7,m,+.,/4=1-1/3+1/5-1/7+.,直到最后一项的绝对值小于,10-6,为止,前后项之间有关,1!+2!+.+n!,x,0,+x,1,+x,2,+x,3,+.,1+1+2+3+5+8+13+21+.,2/1+3/2+5/3+8/5+13/8+21/13+.,a+aa+aaa+aaaa+aaaaa,+.a,是一个数字,例,a=2,,,2+22+222+2222+.,63,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服