您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > c语言第6章_循环结构程序设计
第6章循环结构程序设计制作者:钱瑛本章的学习重点和难点循环的概念循环的基本语句结构和流程循环在常用算法中的应用引言循环结构是程序的三大算法结构之一,是相对比较难理解和运用的结构,很多问题常常要以它作为基础来的解决,因此,是否能掌握好循环结构是非常关键的学习循环时首先,弄清楚循环的概念,以及具体循环语句结构的流程(可以利用单步调试工具)第二步应学会根据已有的算法流程图结构,去套用书中循环语句结构来解决问题第三步,学会自己分析问题,将问题中的某些重复性工作,抽取出来,找出其中的规律,画出流程图,最后用某种适合的循环语句实现第四步,通过学习,积累经典算法,学会将这些算法融会贯通,运用到实际问题的解决*引例要求输出显示6行星号分析:要求显示的信息是每行是由16个星号所构成的字符串,所以可以通过连续6次调用printf函数实现图形的显示#includestdio.hintmain(){printf(****************\n);printf(****************\n);printf(****************\n);printf(****************\n);printf(****************\n);printf(****************\n);return0;}若要求显示100行或更多行这样的信息若打印信息的行数要求是由用户决定专门用于进行重复操作的语句结构*引例循环结构就是这样一种专门用于实现有规律的重复性操作的算法结构,是程序基本的三大算法结构之一。循环——重复地执行某些操作。计算机语言中的循环就是指在指定的条件下,重复执行一组语句;这组被重复执行的语句就称为循环体,而指定的条件就称作循环条件*引例要求输出显示6行星号分析:要求重复6次输出一行由16个星号所构成的字符串,因此,循环条件就是输出的行数6,重复执行的循环体就是printf(****************\n);#includestdio.hintmain(){inti=0;//定义计数器变量i来记录目前已输出的行数while(i6)//当输出行数未达到6行,反复执行下面语句{printf(****************\n);i++;//每输出一行信息,计数器i累加1}//返回到while行return0;}*引例要求输出n行星号分析:要求输出的16个星号的行数由用户决定#includestdio.hintmain(){inti=0,n;//定义变量n记录用户输入的指定行数scanf(%d,&n);//接收用户输入的行数while(in)//当输出行数未达到n行,反复执行下面语句{printf(****************\n);i++;//每输出一行信息,计数器i累加1}//返回到while行return0;}循环结构当型循环用while语句实现循环用do-while语句实现循环用for语句实现循环循环的嵌套跳转语句:break和continue语句当型循环格式1while型while(循环条件)循环体格式2do-while型do循环体while(循环条件);True循环条件循环体False循环条件循环体TrueFalse当型循环格式1while型while(循环条件)循环体True循环条件循环体False要求输出显示n行星号#includestdio.hintmain(){inti=0,n;scanf(%d,&n);while(in){printf(****************\n);i++;}//返回到while行return0;}当型循环格式2do-while型do循环体while(循环条件);要求输出显示n行星号#includestdio.hintmain(){inti=0,n;scanf(%d,&n);do{printf(****************\n);i++;}while(in);return0;}循环条件循环体TrueFalse当型循环“循环体”可以由若干条语句构成;“循环条件”通常是一个关系或逻辑表达式,其值为True或False。两种格式的while循环都表示:仅当循环条件成立,即为真“True”时,重复执行循环体,否则循环条件不成立,即为假“False”时,结束循环格式1是每一次进入循环,先判断循环条件是否为“True”,后决定是否进入执行循环体;格式2是先执行一次循环体,后进行判别循环条件是否为真“True”,以决定是否再次进入执行循环体。格式1的循环有可能一次也没进入循环体执行,格式2是不管循环条件是否为真,至少执行一次循环体*例题6-2求1+2+3…+n分析:求多项数据之和,首先得设置一个累加器sum,存放累加结果。根据一般人们求和的步骤,多个数据累加的过程如下:sum0=0sum1=sum0+1sum2=sum1+2sum3=sum2+3………………sumn=sumn-1+n归纳:求多项数据之和,整个累加过程一直在重复执行sum=sum+i,其中累加项i的变化规律为:i=i+1,i的初值为1,终值为n,即当i的值=n进行累加操作*例题6-2求1+2+3+…+n求多项数据之和,整个累加过程一直在重复执行sum=sum+i,其中累加项i的变化规律为:i=i+1,i的初值为1,终值为n,即当i的值=n进行累加操作sum+i→sum开始结束FalseTrue0→sum1→ii≤n输出求和结果sumi+1→i输入n*例题6-2求1+2+3…+n程序代码设计:循环条件:当i的值=n进行累加;循环体:sum=sum+i,i=i+1#includestdio.hintmain(){inti=1,sum=0,n;scanf(%d,&n);while(i=n){sum=sum+i;i++;}printf(%d,sum);return0;}sum+i→sum开始结束FalseTrue0→sum1→ii≤n输出求和结果sumi+1→i输入n例6-2用while循环求1+2+3…+n#includestdio.hintmain(){inti=1,sum=0,n;scanf(%d,&n);while(i=n){sum=sum+i;i++;}printf(%d,sum);return0;}循环初值循环终值循环变量增值循环条件循环体inti=2,sum=1,n;scanf(%d,&n);while(i=n){sum=sum+i;i++;}inti=0,sum=0,n;scanf(%d,&n);while(in){i++;sum=sum+i;}例6-5用do-while循环求1+2+3…+n#includestdio.hintmain(){inti=1,sum=0,n;scanf(%d,&n);do{sum=sum+i;i++;}while(i=n);printf(%d,sum);return0;}#includestdio.hintmain(){inti=1,sum=0,n;scanf(%d,&n);while(i=n){sum=sum+i;i++;}printf(%d,sum);return0;}当型循环在循环体中,至少要有一条语句使得循环条件趋向于假“False”,即使循环语句在有限的时间内执行完毕,否则将会出现“死循环”程序运行时出现“死循环”,按break中止(中断)程序运行,然后进行调试将循环条件中影响循环次数的变量,称为循环控制变量[演示]数据的自运算数据的自运算——在原来的基础上进行的某些运算使用场合:累加、累乘、统计等sum=sum+t//sum+=tfact=fact*t//fact*=tn=n+1//n++*例6-20采用欧几里德算法求解两个自然数的最大公约数的程序算法分析:“欧几里德算法”①输入两个自然数m、n②求m除以n的余数r③m←n④n←r⑤若r≠0,则转②,否则转⑥⑥输出m和n的最大公约数mFalse输入两个自然数m,nr=m%nm=nn=rr0输出最大公约数m开始结束True*例6-20设计采用欧几里德算法求解两个自然数的最大公约数的程序程序代码设计:输入的数据M和N要求是自然数,所以在程序中应加入对数据的合法性进行检验的部分考虑到程序的应用范围,数据类型可选用整型根据算法流程图可知这是一个循环结构:循环条件是r0,r是循环控制变量,循环体是r=m%n;m=n;n=r;False输入两个自然数m,nr=m%nm=nn=rr0输出最大公约数m开始结束True*例6-20设计采用欧几里德算法求解两个自然数的最大公约数的程序实现:#includestdio.hintmain(){intn,m,r;scanf(“%d,%d”,&m,&n);do//求最大公约数{r=m%n;m=n;n=r;}while(r!=0);printf(“GCD=%d\n,m);return0;}False输入两个自然数m,nr=m%nm=nn=rr0输出最大公约数m开始结束True*例6-20#includestdio.hintmain(){intn,m,r;scanf(“%d,%d”,&m,&n);do//求最大公约数{r=m%n;m=n;n=r;}while(r!=0)printf(“GCD=%d\n,m);return0;}while(r!=0)Nor=m%n;m=n;n=r;*例6-20最大公约数和最小公倍数若已知整数x和y的最大公约数是k,则它们的最小公倍数是x*y/k求两个整数最大公约数的两种方法。(1)辗转相除法(欧几里德算法)(2)相减法1.最大公约数和最小公倍数(1)辗转相除法(欧几里德算法)递推公式如下:算法描述如下:步骤1:输入两个自然数x、y,令x=y。步骤2:求x除以y的余数r。步骤3:yx,ry。步骤4:若r≠0,则转步骤2,否则转步骤5。步骤5:输出x。0Gcd(,)Gcd(,Mod)0mnmnnmnn1.最大公约数和最小公倍数(2)相减法。递推公式如下:两个数中从大数中减去小数,所得的差若与小数相等,则该数为最大公约数。若不等,对所得的差和小数,继续从大数中减去小数,……,直到两个数相等为止。Gcd(,)Gcd(,-)mnmnmnnmnnmn当型循环例6-19验证谷角猜想。对于任意一个自然数n,若n为偶数,则将其除以2;若n为奇数,则将其乘以3,然后再加1。如此经过有限次运算后,总可以得到自然数1。分析:由于不能确定要多少步才能结束运算,因此本题中采用当型while循环语句实现。使用变量n存放该正整数,每次重新计算出的新值仍然存放在n中。当n未达到1时继续执行运算,当n等于1时结束循环。例6-19代码:intn;printf(“请输入一个正整数:”);scanf(“%d”,&n);printf(“%d”,n);if(n0)while(n!=1){if(n%2==1)n=n*3+1;elsen=n/2;printf(“-%d”,n);}elseprintf(“输入数据错误\n”);当型循环结构小结不管是哪一种格式的当型循环,一般都可相互转换使用,经常用于解决各种各样的重复操作的问题在使用循环时,关键是要找出重复操作的规律,形成循环体,以及设置好循环条件一般循环体中肯定有一条改变循环控制变量值的语句*例题设计一个小程序,能够实现接收若干的专家的考评打分,输入-1表示打分结束,最后计算出平均考评分分析:要求出专家的平均考评分Average,所以先得求出专家的考评总分Total,然后再除以考评分个数Num。而考评总分的计算,就是要将每个专家的考评打分Mark依次累加专家的打分并非一次性给出,而是在程序运行时,由用户依次输入,因此要进行考评总分的计算,必须先接收一个用户输入的专家打分,只要该专家打分不为-1(表示结束输入),就进行累加这个
本文标题:c语言第6章_循环结构程序设计
链接地址:https://www.777doc.com/doc-2909060 .html