《C语言程序设计谭浩强循环结构程序设计.pptx》由会员分享,可在线阅读,更多相关《C语言程序设计谭浩强循环结构程序设计.pptx(68页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1/696.1 goto语句以及用goto语句构成循环1.goto1.goto语句形式:语句形式:goto goto 语句标号语句标号;例如例如:goto label;goto label;label:label:.语句标号用标识符表语句标号用标识符表示,它的定名规则与示,它的定名规则与变量名相同。变量名相同。2 2.语句执行流程语句执行流程:goto abc;语句体 abc:goto abc;循环体 abc:分支结构分支结构循环结构循环结构第1页/共68页2/69sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050例例:用用if if 和和got
2、ogoto语句构成循环,求语句构成循环,求#include void main()int i,sum=0;i=1;loop1:if(i=100)sum+=i;i+;goto loop1;printf(%d,sum);循环初值循环终值循环变量增值循环条件循环体第2页/共68页3/693.3.说明说明 语句标号仅仅对语句标号仅仅对gotogoto语句有效,对其它语句不影响。语句有效,对其它语句不影响。同一个程序中,不允许有同名标号。同一个程序中,不允许有同名标号。gotogoto语句通常与语句通常与ifif语句配合使用语句配合使用,实现条件转移、构成循环、实现条件转移、构成循环、跳出循环体跳出循环
3、体等功能。等功能。不能用整数作标号。不能用整数作标号。只能出现在只能出现在gotogoto所在函数内所在函数内,且唯一。且唯一。只能加在可执行语句前面。只能加在可执行语句前面。限制使用限制使用gotogoto语句。语句。第3页/共68页4/69例例:分析下面程序的运行结果:分析下面程序的运行结果:#include stdio.h void main()char c;loop1:c=getchar();if(c=n)goto end1;putchar(c);goto loop1;end1:printf(The endn);程序运行情况为:程序运行情况为:123 123asdasd123asdTh
4、e end 123asdThe end#include void main()int number,sum=0;read_loop:scanf(%d,&number);if(!number)goto print_sum;sum+=number;goto read_loop;print_sum:printf(The total sum is%dn,sum);例例:从键盘输入一组数据,以从键盘输入一组数据,以0 0结束输入,求数据和结束输入,求数据和第4页/共68页5/696.2 用while语句实现循环真真(非零非零)表达式表达式 循环体循环体假假(零零)1 1.while.while语句的语句
5、的一般一般形式形式:while(while(表达式)表达式)循环体;循环体;2 2.whilewhile语句常称为语句常称为“当型当型”循环语句。循环语句。第5页/共68页6/693 3.说明说明:先判断表达式,当条件成立时,则执行循环体,循环体有可能一次也不执行。先判断表达式,当条件成立时,则执行循环体,循环体有可能一次也不执行。表达式同表达式同ifif语句后的表达式一样,可以是任何类型的表达式。语句后的表达式一样,可以是任何类型的表达式。循环体多于一句时,用一对循环体多于一句时,用一对 括起括起。下列情况,退出下列情况,退出whilewhile循环循环条件表达式不成立(为零)条件表达式不成
6、立(为零)循环体内遇循环体内遇break,return,gotobreak,return,goto无限循环无限循环:while(1):while(1)循环体循环体第6页/共68页7/69例例:用用whilewhile循环求循环求#include void main()int i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);循环初值循环终值循环变量增值循环条件循环体第7页/共68页8/69例例:显示显示110110的平方的平方#include void main()int i=1;while(i=10)printf(%d*%d=%dn,i,
7、i,i*i);i+;运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100第8页/共68页9/69例:分析下列程序段的循环次数i=1;while(i0)printf(+);else printf(-);scanf(%d ,&x);判断正负号判断正负号第10页/共68页11/69注意注意表达式在判断前,必须要有明确的值。表达式在判断前,必须要有明确的值。循环体中一般有改变条件表达式的语句。循环体中一般有改变条件表达式的语句。while(while(表达式表达式)后面没有分号。后面没有分号。第11页/共68页12/69例例
8、:编写加、减、乘、除运算程序。用编写加、减、乘、除运算程序。用3#33#3退出。退出。#include#include void main()int i=1,flag=0;float a,b,result;char sym;clrscr();printf(请输入第1题,用3#3退出。n);scanf(%f%c%f,&a,&sym,&b);清屏函数清屏函数清屏函数清屏函数 用清屏函数时加此行用清屏函数时加此行用清屏函数时加此行用清屏函数时加此行 用做标记用做标记用做标记用做标记 第12页/共68页13/69while(sym!=#)switch(sym)case +:result=a+b;bre
9、ak;case -:result=a-b;break;case *:result=a*b;break;case /:if(b=0)flag=1;else result=a/b;break;default:flag=2;见下一页见下一页除数除数除数除数0,0,0,0,用用用用1 1 1 1标记标记标记标记 非法字符非法字符非法字符非法字符,用用用用2 2 2 2标记标记标记标记 注意缩进格式注意缩进格式注意缩进格式注意缩进格式 不能少不能少不能少不能少 第13页/共68页14/69 if(flag=0)printf(%f%c%f=%fn,a,sym,b,result);i+;if(flag=1)
10、printf(除数为0!n);if(flag=2)printf(%c是非法运算符!n,sym);printf(请输入第%d题,用3#3退出。n,i);scanf(%f%c%f,&a,&sym,&b);是合法算式是合法算式是合法算式是合法算式准备下一题准备下一题准备下一题准备下一题i第14页/共68页15/696.4 用do-while语句实现循环1.do-while的形式的形式:do 循环体循环体;while(表达式表达式););2.do-while语句语句 常称常称为为“直到型直到型”循环语句循环语句。真真(非零非零)表达式表达式 循环体循环体假假(零零)第15页/共68页16/69例:用d
11、owhile循环求#include void main()int i,sum=0;i=1;do sum+=i;i+;while(i=100);printf(%d,sum);第16页/共68页17/69v特点:先执行循环体,后判断表达式。特点:先执行循环体,后判断表达式。v说明:说明:l至少执行一次循环体至少执行一次循环体,第一次条件为真时,第一次条件为真时,while,do-while,do-whilewhile等价;第一次条件为假时,二者不同。等价;第一次条件为假时,二者不同。ldowhiledowhile可转化成可转化成whilewhile结构结构。expr循环体循环体假假(0)真真(非非
12、0)循环体循环体While循环循环第17页/共68页18/69例例:while:while和和dowhiledowhile比较比较#include void main()int i,sum=0;scanf(%d,&i);do sum+=i;i+;while(i=10);printf(%d,sum);#include void main()int i,sum=0;scanf(%d,&i);while(i=10)sum+=i;i+;printf(%d,sum);第18页/共68页19/69例:用do-while语句实现统计从键盘输入的一行非空字符的个数(以回车键作为输入结束标记)。#include
13、 stdio.hvoid main()char ch;int num=0;ch=getchar();do num+;ch=getchar();while(ch!=n);printf(num=%dn,num);第19页/共68页20/69#include stdio.h void main()char ch;int num=0;ch=getchar();例例:用用whilewhile语句实现统计从键盘输入的一行字符的个数(以回车键作为输入结束标语句实现统计从键盘输入的一行字符的个数(以回车键作为输入结束标记)。记)。while(ch!=n)判断是否输入结束判断是否输入结束 num+;ch=get
14、char();printf(num=%dn,num);第20页/共68页21/69例例:从键盘输入一串字符(用从键盘输入一串字符(用#结束输入)结束输入),如果输入如果输入为大写字母,则转换为小写字母,所有小写字母按为大写字母,则转换为小写字母,所有小写字母按p128p128的规则转换成对应的小写字母,其它字符不变。的规则转换成对应的小写字母,其它字符不变。#include void main()char ch;printf(Input data:n);do ch=getchar();if(ch=A&ch=a&chz)ch=ch-26;putchar(ch);while(ch!=#);Inpu
15、t data:UfYrq 2 yLb 3?#whats 2 and 3?#不希望输出不希望输出用用用用whilewhilewhilewhile解决解决解决解决第21页/共68页22/69#include void main()char ch;printf(Input data:n);ch=getchar();while(ch!=#)if(ch=A&ch=a&chz)ch=ch-26;putchar(ch);ch=getchar();不输出不输出不输出不输出“#”#”第22页/共68页23/69注意注意在在ifif、whilewhile语句中,表达式后面都没有分号,而在语句中,表达式后面都没有分
16、号,而在do-whiledo-while语句的表达式语句的表达式后面则必须加分号。后面则必须加分号。do-whiledo-while和和whilewhile语句相互替换时,要注意修改循环控制条件语句相互替换时,要注意修改循环控制条件 。第23页/共68页24/696.5 用for语句实现循环1 1.for.for的形式:的形式:for(for(初始表达式初始表达式1 1;条件表达式;条件表达式2 2;循环表达式;循环表达式3 3)循环体循环体;表达式表达式1 1:用于循环开始前为循环变量设置初始值。用于循环开始前为循环变量设置初始值。表达式表达式2 2:控制循环执行的条件,决定循环次数。控制循
17、环执行的条件,决定循环次数。表达式表达式3 3:循环控制变量修改表达式。循环控制变量修改表达式。循环体语句循环体语句:被重复执行的语句。被重复执行的语句。v说明:说明:lforfor语句中语句中表达式表达式1,1,表达式表达式2,2,表达式表达式3 3 类型任意,类型任意,都可省略,但分号;不可省。都可省略,但分号;不可省。l无限循环无限循环:for(;):for(;)l三个表达式都可以是逗号表达式。三个表达式都可以是逗号表达式。lforfor语句可以转换成语句可以转换成whilewhile结构。结构。表达式表达式1;1;while(while(表达式表达式2)2)循环体语句;循环体语句;表达
18、式表达式3;3;注意注意注意注意不能丢不能丢不能丢不能丢第24页/共68页25/69表达式表达式3 3计算表达式计算表达式1 1循环体循环体判断表达式判断表达式2 2零零非零非零forfor的下一条语句的下一条语句2 2.执行过程执行过程for(i=1;i=100;i=i+1)printf (“*n”);输出输出100100行行1010个星号个星号“*”语句是语句是?i+i+第25页/共68页26/69它相当于以下语句它相当于以下语句:i=1;while(i=100)sum=sum+i;i+;printf(%d,sum);表达式表达式1 1;while(表达式表达式2)表达式表达式3 3;例例
19、:用用forfor循环求循环求#include void main()int i,sum=0;for(i=1;i=100;i+)sum+=i;printf(%d,sum);第26页/共68页27/69例:例:#include void main()int i=0;for(i=0;i10;i+)putchar(a+i);运行结果运行结果:abcdefghij例:例:#include void main()int i=0;for(;i10;i+)putchar(a+i);例:例:#include void main()int i=0;for(;i10;)putchar(a+(i+);例:例:#in
20、clude void main()int i=0;for(;i10;putchar(a+i),i+);第27页/共68页28/69void main()int i,j,k;for(i=0,j=100;i=j;i+,j-)k=i+j;printf(%d+%d=%dn,i,j,k);#includevoid main()char c;for(;(c=getchar()!=n;)printf(%c,c);#include void main()int i,c;for(i=0;(c=getchar()!=n;i+=3)printf(%c,i+c);第28页/共68页29/69对for语句,循环体为空语
21、句的一般形式为:for(表达式1;表达式2;表达式3);如:for(sum=0,i=1;i=100;sum+=i,i+);要要在在显显示示器器上上复复制制输输入入的的字字符符,输输入入的的字字符符为为.时时,结束循环。结束循环。输入输入abcdefg.abcdefg.输出输出a abcdefg.bcdefg.while(while(putchar(getchar(putchar(getchar()!=)!=.);第29页/共68页3069累加器赋初值参考程序:参考程序:void main()long int k,s;s=0;for(k=1;k=1000;k+)s=s+k;printf(s=%l
22、d,s);累加累加求偶数和求偶数和2+4+6+2+4+6+100+100思考思考典型例题分析典型例题分析例例1:1:求累加和求累加和1+2+3+1+2+3+1000+1000属于属于“累加器累加器”类型问题。类型问题。第30页/共68页3169累乘器赋初值求求n!=1 2 3 n参考程序:参考程序:void main()double s=1;int k;for(k=1;k=100;k+)s=s*k;printf(s=%lf,s);累乘累乘思考思考整数连乘结果一定是整数连乘结果一定是整数,而本例中结果整数,而本例中结果数值相当大,用数值相当大,用longlong型都无法存放,因此型都无法存放,因
23、此将存放累乘结果的变将存放累乘结果的变量量s s定义为定义为doubledouble型。型。例例2:2:求累乘积。求累乘积。如:如:123.100123.100属于属于“累乘器累乘器”类型问题。类型问题。第31页/共68页3269#include math.h void main()int x,k;scanf(%d ,&x);排除法:如果有因子,排除法:如果有因子,不再往下判断是否是素不再往下判断是否是素数数循环变量终值法循环变量终值法 for(k=2;ksqrt(x)printf(%d is a prime ,x);else printf(%d is not a prime ,x);在判断范
24、围内无因子,程序正常终止在判断范围内无因子,程序正常终止有因子,程序非正常有因子,程序非正常终止终止例例3:3:判断一个数是否为素数判断一个数是否为素数?一个数一个数x x在在22,sqrt(x)sqrt(x)范围内没有因子,我们就称其为素数(质数)范围内没有因子,我们就称其为素数(质数)第32页/共68页3369#include math.h void main()int x,k,f=1;scanf(%d ,&x);排除法:如果有因子,不排除法:如果有因子,不再往下判断是否是素数再往下判断是否是素数 for(k=2;k=sqrt(x);k+)if(x%k=0)f=0;break;if(f=1
25、)printf(%d is a prime ,x);else printf(%d is not a prime ,x);在判断范围内无因在判断范围内无因子,程序正常终止子,程序正常终止有因子,程序有因子,程序非正常终止非正常终止标记变量法标记变量法第33页/共68页34/69#include stdio.hvoid main()/*a,b,c代表百位、十位、个位代表百位、十位、个位*/int x,a,b,c,num=0;/*num存放满足条件的数的个数,注意存放满足条件的数的个数,注意numnum要赋初值要赋初值*/for(x=100;x=999;x+)a=x/100;b=x/10%10;c=
26、x%10;if(a!=b&a!=c&b!=c)num+;printf(%5d,x);if(num%5=0)printf(“n”);printf(nnumber=%d,num);例例4:4:用用0-90-9这十个数字可以组成多少无重复的三位数这十个数字可以组成多少无重复的三位数?编程方法:编程方法:“枚举法枚举法”第34页/共68页35/69编程方法:编程方法:“递推法递推法”例例5 5:裴波那契数列的第裴波那契数列的第1 1、2 2项分别为项分别为1 1、1 1,以后各项的值均是其前两项之和。,以后各项的值均是其前两项之和。求前求前3030项菲波那契数。项菲波那契数。所所谓谓递递推推法法就就是
27、是从从初初值值出出发发,归归纳纳出出新新值值与与旧旧值值间间的的关关系系,直直到到求求出出所所需需值值为为止止。新新值值的的求求出出依依赖赖于于旧旧值值,不不知知道道旧旧值值,无无法法推推导导出出新新值值。数数学学上上递递推推公公式式正正是是这这一一类问题。类问题。第35页/共68页36/69 f1-f1-第一个数第一个数 f2-f2-第二个数第二个数 f3-f3-第三个数第三个数 f1=1;f2=1;f3=f1+f2;f1=1;f2=1;f3=f1+f2;以后只要改变以后只要改变f1,f2f1,f2的值,即可求出下一个数的值,即可求出下一个数.f1=f2;f2=f3;f3=f1+f2;f1=
28、f2;f2=f3;f3=f1+f2;递推递推第36页/共68页37/69void main()long f1=1,f2=1,f3;int k;参考程序参考程序:printf(%ldt%ldt,f1,f2);for(k=3;k=30;k+)f3=f1+f2;printf(%ldt ,f3);f1=f2;f2=f3;注意注意f1f1、f2f2、f3f3、x x 的类型的类型递推递推第37页/共68页38/69 在循环体语句中又包含有另一个完整的循环结构的形式,称为循环的嵌套。如果内循环体中又有嵌套的循环语句,则构成多重循环。6.6 6.6 循环的嵌套循环的嵌套嵌套在循环体内的循环体称为内循环,外面
29、的循环嵌套在循环体内的循环体称为内循环,外面的循环称为外循环。称为外循环。while while、do-whiledo-while、forfor三种循环都可以互相嵌套。三种循环都可以互相嵌套。第38页/共68页39/69说明:v三种循环可互相嵌套,层数不限v外层循环可包含两个以上内循环,但不能相互交叉v嵌套循环的执行流程(1)while()while().(2)do do while();.while();(3)while()do while();.v嵌套循环的跳转禁止:l从外层跳入内层l跳入同层的另一循环l向上跳转(4)for(;)do while();while().内循环内循环外循环外循
30、环内循环内循环第39页/共68页40/69真真真真外循环初始条件外循环初始条件内循环初始条件内循环初始条件内循环体内循环体外循环条件外循环条件假假内循环条件内循环条件假假修改内循环条件修改内循环条件修改外修改外循循环条件环条件循环结束循环结束二重二重循环循环嵌套嵌套结构结构执行执行流程流程 第40页/共68页41/69例例:循环嵌套,输出九九表循环嵌套,输出九九表1234567891234567892468101214161836912151821242791827364554637281.ij#include void main()int i,j;for(i=1;i10;i+)printf(
31、%4d,i);printf(n-n);for(i=1;i10;i+)for(j=1;j10;j+)printf(j=9)?%4dn:%4d,i*j);第41页/共68页4269例:输出图形:*编程分析编程分析:采用双重循环,一行一行输出。采用双重循环,一行一行输出。每一行输出步骤:一般每一行输出步骤:一般3 3步。步。1 1)光标定位)光标定位3 3)每输完一行光标换行)每输完一行光标换行(n)n)2 2)输出图形。)输出图形。例如本题:共例如本题:共4 4行行,若行号用若行号用k k表示,表示,则每一行有则每一行有2*2*k-1k-1个个*号。号。第42页/共68页4369#include
32、stdio.h void main()int k1,k2;for(k1=1;k1=4;k1+)putchar(t);for(k2=1;k2=k1;k2+)putchar(b);for(k2=1;k2=k1*2-1;k2+)putchar(*);putchar(n);定位(还可以用定位(还可以用空格的方法)空格的方法)输出输出int i,j;for(i=0;i6;i+)for(j=0;j5-i;j+)printf(“”);for(j=0;j=1;x-)if(x%17=0)break;printf(x=%dn,x);找到满足条件的最找到满足条件的最大数,结束循环大数,结束循环第46页/共68页47
33、/69例例:小写字母转换成大写字母小写字母转换成大写字母,直至输入非字母字符直至输入非字母字符#include void main()int i,j;char c;while(1)c=getchar();if(c=a&c=z)putchar(c-a+A);else break;第47页/共68页48/69例例:输出圆面积,面积大于输出圆面积,面积大于100100时停止时停止#define PI 3.14159void main()int r;float area;for(r=1;r100)break;printf(r=%d,area=%.2fn,r,area);第48页/共68页49/69(1
34、 1)语句形式)语句形式:continue;continue;(2)语句作用:v结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断2.continue2.continue 语句(3 3)语句执行流程)语句执行流程:continuecontinue语句可以结束本次循环,即不再执行循环体中语句可以结束本次循环,即不再执行循环体中continuecontinue语句之后的语句,语句之后的语句,转入下一次循环条件的判断与执行。转入下一次循环条件的判断与执行。仅用于循环语句中第49页/共68页50/69exprcontinue;假(0)真(非0)while真(非0)docontin
35、ue;.expr假(0)whileexpr2continue;.假(0)真(非0)forexpr1expr3第50页/共68页51/69例例:求求300300以内能被以内能被1717整除的所有整数。整除的所有整数。#include stdio.hvoid main()int x,k;for(x=1;x=300;x+)if(x%17!=0)continue;printf(%dt,x);第51页/共68页52/69例例:求输入的十个整数中正数的个数及其平均值求输入的十个整数中正数的个数及其平均值#include void main()int i,num=0,a;float sum=0;for(i=
36、0;i10;i+)scanf(%d,&a);if(a=0)continue;num+;sum+=a;printf(%d plus integers sum:%6.0fn,num,sum);printf(Mean value:%6.2fn,sum/num);第52页/共68页53/69while(条件条件)语句语句A;break;语句语句 B;真真语句语句B条件条件语句语句Abreak假假结束循环结束循环3.break3.break语句与语句与continuecontinue语句的区别语句的区别至此位置至此位置第53页/共68页54/69while(条件条件)语句语句A;continue;语句语
37、句 B;真真语句语句B条件条件语句语句Acontinue假假结束循环结束循环至此位置至此位置第54页/共68页55/69#include stdio.hvoid main()int a,b;for(a=1,b=1;a=10)break;if(b%3=1)b+=3;continue;printf(%dn,a);例例:分析以下程序的运行结果。分析以下程序的运行结果。程序运行结果:程序运行结果:4 4 第55页/共68页56/696.9 6.9 程序设计举例程序设计举例例例:求求#include stdio.hvoid main()float s=0,f1=2,f2=1,f=1,t,n;/*累加器赋
38、初值累加器赋初值*/for(n=1;n=10;n+)s=s+f*f1/f2;/*累加器当前值累加器当前值=累加器原来的值累加器原来的值+新的要加的数据新的要加的数据*/f=f*(-1);t=f2;f2=f1;f1=f1+t;/*为求下一个要加的数据做准备为求下一个要加的数据做准备*/printf(s=%fn,s);第56页/共68页57/69#includevoid main()int s;float n,t,pi;t=1,pi=0;n=1.0;s=1;while(fabs(t)1e-6)pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;printf(pi=%10.6fn,pi
39、);第57页/共68页58/69例例:译密码译密码例如例如 Hello,world!Hello,world!译成密码:译成密码:Lipps,asvph!Lipps,asvph!第58页/共68页59/69#include void main()char c;while(c=getchar()!=n)if(c=a&c=A&c=Z&c=z)c=c-26 printf(“%c”,c);第59页/共68页60/69例例:输入任意一个整数,将其逆序输出,例如输入输入任意一个整数,将其逆序输出,例如输入12341234,输出,输出43214321。#include stdio.hvoid main()lo
40、ng y,n;scanf(%ld,&y)while(y!=0)n=y%10;printf(%ld,n);y=y/10;第60页/共68页61/69例例:猜猜数数游游戏戏:任任意意设设置置一一个个整整数数,请请用用户户从从键键盘盘上上输输入入数数据据猜猜想想设设值值的的数数是是什什么么,告告诉诉用用户户是是猜猜大大了了还还是是小小了了。1010次次以以内内猜猜对对,用用户户获获胜胜。否否则则,告告诉诉用用户户设设置置的的数数据据是什么。是什么。#include stdio.hvoid main()int num=123,x,n;printf(hint:0number1000n);/*给出数据范围
41、的提示信息给出数据范围的提示信息*/for(n=1;nnum)printf(bigger!n);if(xnum)printf(smaller!n);if(n=11)printf(Lost!the number is%dn,x);第61页/共68页62/691 1.写出程序运行结果写出程序运行结果:void main()int i,j,x=0;for(i=0;i2;i+)x+;for(j=0;j0)3 if(n0)4 printf(“i=%4d j=%4dn”,i,j);第64页/共68页65/694.编程输出下面的数字金字塔(1到9)。112112321.12345678987654321第65页/共68页66/69void main()int i,j;for(i=1;i=9;i+)for(j=1;j=20-i;j+)printf();for(j=1;j=i;j+)printf(%d,j);for(j=1;ji;j+)printf(%d,i-j);printf(n);第66页/共68页6769作业:习题六作业:习题六P129-6.2 6.3 6.4 6.8 6.11 6.14 第67页/共68页68/69感谢您的欣赏!第68页/共68页