欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    关关雎鸠南邮C语言课件第4章.ppt

    • 资源ID:2216237       资源大小:1.38MB        全文页数:46页
    • 资源格式: PPT        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    关关雎鸠南邮C语言课件第4章.ppt

    高级语言程序设计 *1 *2 第四章 程序流程控制 主讲: 计算机学院 朱立华 内容提要 n算法的基本概念以及表示方法,简单介绍流程图 nC程序的3种基本流程控制结构:顺序结构、选择结构( 也叫分支结构)、循环结构,每种结构的控制语句: if、switch控制选择结构 for、while、dowhile控制循环结构 break、continue、goto等语句的用法 循环嵌套程序的设计及运行过程 n一些常用算法的基本思想: 分段函数求解问题 判断一个整数是否为质数 求两个正整数的最大公约数 各种求和问题 掷骰子游戏的多种解法 求阶乘 打印规则的图形 穷举问题的多种求解方法 DateDate 3 3 算法与语句 n算法(Algorithm)就是为解决一个具体问题而采取的 有限的操作步骤,算法通过语句来实现 n计算机算法分两类:数值运算算法、非数值运算算法 n程序=数据结构+算法 n算法的正确性衡量标准: 有穷性:算法包含有限步操作 确定性:每一步都应确定无歧义 有效性:每一步都应能有效执行且能得到确定的结果 0或多个输入: 程序允许无输入 1或多个输出:任何程序都必须有输出,哪怕是提示信息 解决求数值解的问题 解决需要用分析推理、逻 辑推理才能解决的问题 数据的描述和组织形式 对操作或行为的描述, 即操作步骤 DateDate 4 4 算法与语句 n常用的算法描述方法有:自然语言、传统流程图、NS 流程图、伪代码等,这里只介绍传统流程图。 n例:求n!的算法思想: nn!=1*2*3*n n由于计算机执行乘法时每次只能求两个数相乘,因此 上面的公式在程序中必定需要通过反复相乘来实现。 n需要设定一个变量n,表明求多少的阶乘; n第二个变量,存当前累乘的结果; n第三个变量存当前将要与累乘器相乘的因子,并且该 因子的变化是从1到n每次增加1 n流程图如下页所示 DateDate 5 5 no 开始 n n#include /包含平方根函数sqrt的声明 nint main( ) n n double a,b,c,s,area; /定义5个double变量 n printf(“Please input a,b,c:n”); /屏幕提示 scanf(“%lf%lf%lf“, /输入a,b,c的值 n s=(a+b+c)/2; /求周长的一半 n area=sqrt(s*(s-a)*(s-b)*(s-c); /求面积 n printf(“area=%fn“,area); /输出面积 n return 0; n 顺序结构 输入 3 4 5 输出area=6.000000 编程提示:存原始数据的变 量,用读入方式使其获得 的值更灵活,也可赋值, 但是通用性下降 编程提示:如果变量的值需要根据其他 变量或一定的计算规则计算出来,则 使用赋值语句而不能读入 问题1:可能会输入负数 问题2:即使输入的都是正数, 未必能构成一个三角形 顺序结构无法解决需要作出判 断的问题! 动 态 演示 过 程 DateDate 9 9 n选择结构的特点:通过某一个或若干条件的约束,有选 择性地执行特定语句-在符合一定条件时,执行特定 操作;在不符合条件时,不执行操作或执行另外的操作 n选择结构使用的流程控制语句:if语句、switch语句 n优点:保证程序的健壮性、完备性 nifelse语句形式: n if (表达式) 语句块1 n else 语句块2 n执行过程:先计算表达式,若非0(真) n则执行语句块1;如果表达式为0(假) n则执行语句块2 选择结构 不平衡的ifelse 语句(单分支if) ifelse语句( 双分支if) 表达式可以是任何类型的 ,条件表达式和逻辑表达 式最常用 语句块通常用复合语 句实现,若复合语句内 只有一条语句,则一对 大括号可以不写 表达式 真假 语句块1 语句块2 不平衡的ifelse 语句(if语句) 不执行操作 DateDate1010 n程序4.1 求任意三角形的面积 n#include n#include /包含平方根函数sqrt的声明 nint main( ) n double a,b,c,s,area; /定义5个double变量 n printf(“Please input a,b,c:n”); /屏幕提示 scanf(“%lf%lf%lf”, /输入a,b,c的值 n s=(a+b+c)/2; n area=sqrt(s*(s-a)*(s-b)*(s-c); /求面积 n printf(“area=%fn”,area); /输出面积 n n return 0; n 选择结构(if语句) 问题1:可能会输入负数 问题2:即使输入的都是正数, 未必能构成一个三角形 顺序结构无法解决需要作出判 断的问题! 程序4.2 改进程序4.1,在构成三角形时求面积,否则给提示信息 if (a0 此else分支不能省略,否则在不能 构成三角形时将没有任何输出, 就不是一个正确的算法了 动 态 演示 过 程 DateDate1111 n程序4.3 生成50以内的两个随机数,比较大小,输出较大者及 两者之差的值。若第1个数大于第2个数,输出you are lucky! n#include n#include /含srand和rand函数的原型 n#include /含time函数的原型 nint main( ) nint a ,b ; /定义两个整型变量a和b nsrand(time(NULL); /调用当前系统时钟产生随机种子 a=rand()%50; /产生一个50以内的随机数赋给a nb=rand()%50; /产生另一个50以内的随机数赋给b nif(ab) /如果a大于b n printf(“the larger number is a:%dn”,a) ; /输出较大者 n printf(“a-b=%dn“,a-b); /输出a与b的差值 n else /如果a不大于b,即ab) printf(“you are lucky!n”); /if语句 nreturn 0; n 选择结构(if语句) 若删除此句,则每次产生的随 机数都是一样的,这是调用系 统时钟产生随机种子 上机运行观察结果 上机测试观察运行结果并分析: (1)删除srand(time(NULL); (2)删除else后的一对大括号 若删除此一对括号,则语句 printf(“b-a=%dn”,b-a);成为 一条不受条件控制的语句 动 态 演示 过 程 DateDate1212 nifelse语句形式: if (表达式) 语句块1 else 语句块2 nif语句形式: if (表达式) 语句块1 n最常用的嵌套ifelse语句形式: if (表达式1) 语句块1 else if (表达式2) 语句块2 else 语句块n 选择结构(if语句) 在语句块处还可以嵌入if或 ifelse语句,形成形式多 样的嵌套if语句,以解决多 分支(=3)的处理问题 else总是与其前面与之最靠近的并且未与其它else 匹配过的if相对应; 每个else都代表了与其对应if完全相反的条件,编 程时应充分利用else所代表的条件简化程序 整个嵌套的ifelse语句从 语法上仍为一条语句 DateDate1313 选择结构(if语句) n程序4.4 用嵌套if进行符号函数求解 n#include nint main( ) n int x,sign; n printf(“Please input x:“); n scanf(“%d“, n if (x0) n sign=1; n else n if (x=0) n sign=0; n else sign=-1; n printf(“x=%d, sign=%dn“,x,sign); n return 0; n 1 sign= 0 -1 /语句2处嵌入ifelse 此else代表的条件是x=0) if (x0) sign=1; else sign=0; else sign=-1; 语句1处嵌入ifelse 此else代表的条件是x100| score= 90) grade='A' nelse if (score = 80) grade='B' n else if (score = 70) grade='C' nelse if (score = 60) grade='D' n else grade='E' nprintf(“%d-%cn”,score,grade); /输出百分成绩及等级 n n A 90score100 B 80score100| score= 90) grade='A' nelse if (score = 80) grade='B' n else if (score = 70) grade='C' nelse if (score = 60) grade='D' n else grade='E' nprintf(“%d-%cn”,score,grade); n n switch (score/10) /为减少常量的个数 case 10: case 9: grade='A' break; case 8: grade='B' break; case 7: grade='C' break; case 6: grade='D' break; case 5: case 4: case 3: case 2: case 1: case 0: grade='E' break; 选择结构(switch语句) 方法二:用switch语句实现百分制转五级分制 这些break都 不能省略 此break 可以省略 在VC+下运行程序观察结果,遗 憾:每次运行程序只能输入一个 成绩,一次运行无法输入多个百 分成绩进行转换! 动 态 演示 过 程 DateDate1717 n循环结构的特点:某些操作在一定条件约束下在程序中 可被重复执行,或者重复执行到满足一定的条件时停止 n循环结构使用的流程控制语句: for语句、while语句、dowhile语句; n辅助语句:break语句、continue语句 nfor语句形式: for(表达式1;表达式2;表达式3) 语句块 n执行过程见右边流程图 n注意:for语句中的3个表达式可以省略 1个或多个,最多3个都可省略,但是 分号不能省,且应保证执行结果不变,不能死循环 循环结构 当型循环 直到型循环 用于求初值, 只计算一次 用来作为控制循环的条件, 非0值则执行语句块;若为0 ,则结束for语句 语句块执行结束后自动执 行此表达式,然后再重新 计算表达式2就是循环体,通常用复合语 句,只能是一条语句 整个for语句在语法 上就是一条语句 假 表达式2 真 语句块 表达式1 表达式3 DateDate1818 循环结构(for语句) n程序4.6 从键盘上输入一个非负整数n,求n! n#include nint main( ) n int n,i; /定义两个整型变量,i表示乘数 n double fac=1; n printf(“Please input n:n“); /提示输入数据的信息 n scanf(“%d”, /从键盘上输入一个整数值 n if (n=0 n for (i=1;i 输出结果为:Error input! 若输入为:4 输出结果为: 4!=2.400000e+001 若输入为:100 输出结果为: 100!=9.332622e+157 查 看 流 程 fac的类型应当定义为double类型,因 为阶乘的结果很容易非常大,应当定义 范围最广的数据类型作为累乘器的类型 ,并且一定要初始化为1 对n作判断,保证程序的健壮性 用%e以指数形式输出一个 较大的结果比较合理 执行的操作不变, 但是变量是在不断 变化的 for语句中表达式省略示例 =1; +; fac*=i+; if (in) break; 循环次 数确定 动 态 演示 过 程 DateDate1919 n程序4.7 输入1个正整数m,判断m是否为质数,输出判断结果 n质数的概念:除了1和它自己外,不能被任何其他整数所整除 n算法思路: 设一个变量prime表示结果,值为1表示是质数,值为0则不是质数 最初可以先假定m是质数,即prime初值为1,设一个变量i作为除 数,从2变化到m-1,只要其中有一个能被m整除(即满足m%i=0), 就说明m不是质数,立即修改prime为0,否则继续取下一除数计算 n除数终值到底取多少:除数的终值需要到m-1吗?数学已上证明 ,除数最大只要到sqrt(m)就已经保证所有可能的因子均已被判断 n循环条件的控制:本题是循环次数不可确定的循环问题,用for 语句也可以解决.以上分析表明循环终止有两种可能:(1)被某一 个i整除,(2)i的值已变到终值处.因此循环条件体现为两个条件 共同控制,即:prime n scanf(“%d“, n if (mk而终止,前 者表明m不是质数,后者表明m 是质数,prime保持初值1 判断m是否能被i整除,若能则 prime赋值为0,不是质数循环终止时prime可能为1可能为 0,根据其值输出不同的结论 循环体是这一条if语句 动 态 演示 过 程 DateDate2121 nwhile语句:与for语句一样能控制当型循环 nwhile语句的形式: while(表达式) 语句块 n执行过程见右边流程图 nfor语句与while语句的等价关系: (1)for中的表达式1相当于出现在 while之前的对循环变量的初始化 (2)for语句的表达式2相当于while语句的表达式,都表示 当该表达式为真时执行循环体 (3)for语句的语句块和表达式3一起,相当于while循环的 语句块,是被反复执行的循环体 循环结构(while语句) 假 表达式 真 语句块 循环控制条件 循环体,通常用一 条复合语句 DateDate2222 循环结构(while语句) n程序4.6 从键盘上输入一个非负整数n,求n! n#include nint main( ) n int n,i; n double fac=1; n printf(“Please input n:n“); n scanf(“%d”, n if (n int main( ) int i,n; /定义两个整型变量i,n,变量先定义后使用 n=578; /通过赋值语句使n获得一个3位整数值 i=n%10; /对10取余求得个位数 printf(“%d“,i); /输出个位数 i=n/10%10; /先整除10再对10取余求得十位数 printf(“%d“,i); /输出十位数 i=n/100; /用整除100求得百位数 printf(“%dn“,i); /输出百位数 return 0; 该程序显然不具有通用性,不能处理任 意位数的整数按位分离问题 DateDate2424 循环结构(while语句) n程序4.8 从键盘读入任意位的非负整数,按位分离后逆序输出 n#include nint main( ) n int i,n; n scanf(“%d”, /读入n n if (n=0 nwhile (n) n n i=n%10; /求余 n printf(“%d“,i); /输出 n n=n/10; /n降阶 n nprintf(“n“); n return 0; n 算法思想: 在被处理的数不等于0时: (1)利用对10取余得到个位数 (2)输出该个位数 (3)对被分离的数利用整除10 降一阶,若不为0回到步骤(1) 若为0停止处理 等价于 n!=0 用循环求解问题的关键: (1)以什么作为控制循环的条件 (2)重复不断地执行的是哪些 操作,即循环体是什么 (3)在循环体内对变量如何变化 每个变量的意义要明确 动 态 演示 过 程 DateDate2525 循环结构(while语句) n程序4.9 从键盘读入两个正整数,用辗转相除法求最大公约数 n #include nint main( ) n int dividend,divider,remainder; n /读入dividend,divider n remainder=dividend%divider; n while (remainder) n n dividend=divider; n divider=remainder; n remainder=dividend%divider ; n nprintf (“hcd: %dn“,divider); n return 0; n 算法思想: (1)将两个正整数分别作为被除数 (dividend)和除数(divider) (2)被除数整除除数得余数(remainder) (3)若余数不为0,则除数转为被除数, 余数转为除数,继续步骤(2) (4)若余数为0则结束循环,使余数 为0的除数就是最大公约数 余数不为0 为循环条件 上一次的除数作为 下次的被除数 上一次的余数作为 下次的除数 求新的余数 使余数为0的除数就 是最大公约数 第一次求余数 动 态 演示 过 程 DateDate2626 nwhile语句与for语句都控制当型循环,共同特点:先判断 循环条件,为真才执行循环体,故循环体最少执行0次 ndowhile语句控制直到型循环,其特点是:先执行循 环体,再判断条件,当条件为真时继续执行循环体,条 件为假,循环结束。因此循环体至少执行1次。 ndowhile语句的形式: do 语句块 while(表达式); n执行过程见右边流程图 循环结构(dowhile语句) 假 表达式 真 语句块 循环控制条件 循环体,可以 是多条语句 此处一定要 有分号 DateDate2727 循环结构(dowhile语句) n程序4.10 模拟投骰子,以6点为目标,投中目标两次获胜,最多 允许投10次(方法1:用dowhile语句) n#include n#include n#include nint main( ) n int count=0,y=0,dice; n srand(time(0); n do n n dice=1+rand()%6; n count+; n if(dice=6) y+; n while(count n#include n#include nint main( ) n int count=0,y=0,dice; n srand(time(0); n do n n dice=1+rand()%6; n count+; n if(dice=6) y+; n while(count nint main(void) n int sign,i; n double item,pi,sum=0; n sign=1; n for(i=1;i #include int main(void) int sign,i=1; double item,pi,sum=0; sign=1; do item=sign*1.0/(2*i-1); sum=sum+item; sign=-sign; i+; while (fabs(item)=1e-4); pi=4*sum; printf(“pi=%fn“, pi) ; return 0; 动 态 演示 过 程 DateDate3131 ndowhile语句一个非常实用的用法:保证读入的数据符合要求, 也就是说,如果读入的数不符合要求,则提示重新读入,直到满 足要求为止 n例4.7:判断一个输入的正整数m是否为质数 n当时对输入的m,如果小于等于0,则简单地返回不做任何处理。 现在使用dowhile可以要求读到m大于0为止。 n nint main( ) n int m,i,k,prime=1; n scanf(“%d“, n if (m0:n“); scanf(“%d“, while (m nint main( ) nint i,j,n; ndouble f,sum=0; ndo n printf(“Please input n:n“); n scanf(“%d“, nwhile (n nint main( ) n int i ,j ; n n for (i=1;i nint main(void) n n int x,y,z; n for(x=0;x int main(void) int x,y,z; for (x=0;x n#include n#include nint main( ) n int count=0,y=0,dice; n srand(time(0); n while(count n#include n#include nint main( ) n int count=0,y=0,dice; n srand(time(0); n while(count n#include n#include nint main( ) n int count=0,y=0,dice; n srand(time(0); n do n n dice=1+rand()%6; n count+; n if(dice=6) n y+; n while(count用if或switch求解多分支问题 判断某一个整数是否为质数-寻找一定范围内所有的质数 ,哥德巴赫猜想 求两个整数的最大公约数-求两数的最小公倍数,多个数 的最大公约数 按位分离十位数的每一位数字-进制转换问题 项数确定或要求精度的格里高利公式求和-求和题的解法 模拟投骰子游戏的多种实现-猜字谜游戏的灵活设计 打印等腰三角形-规则图形的打印方法 百鸡百钱问题的多种解法-穷举题的一题多解及算法效率 n掌握一些实用技术: 用dowhile语句保证读入符合特定要求的数据 调用srand(time(NULL)产生随机种子,保证数的随机性 调用rand()函数产生一定范围的随机整数 DateDate4545 *46 The end of chapter 4

    注意事项

    本文(关关雎鸠南邮C语言课件第4章.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开