C语言程序控制结构_第1页
C语言程序控制结构_第2页
C语言程序控制结构_第3页
C语言程序控制结构_第4页
C语言程序控制结构_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章程序控制结构

主要内容4.1C语言的执行语句4.2顺序结构4.3选择结构4.4循环结构4.1C语言的执行语句

C语言的语句分为声明语句和执行语句。第3章介绍的变量定义语句是最常见的声明语句,声明语句在编译时处理,在程序运行时不产生相应的操作。执行语句的作用是在程序运行时向计算机系统发出操作命令,使计算机执行特定的操作.

C语句:以“;”作结束符,编译后产生机器指令。

C语句分类:表达式语句空语句控制语句复合语句4.1.1表达式语句表达式语句是在表达式的末尾加上分号构成的语句。z=x+sin(y);a-=a*a;赋值语句i++;自增1语句x=0,y=1;逗号表达式语句x+y;无意义printf(“ThisisaCprogram.\n”);函数调用语句赋值语句和函数调用语句是使用最多的表达式语句如:

printf("ThisisaCstatement.");func(a,5);y=max(a,b);4.1.2空语句仅由一个“;”构成的语句只是在逻辑上起到一个语句的作用,在编译时不产生任何指令,在执行时不产生任何操作。作用:构成标号语句,标示流程的转向点;构成循环语句中空循环体。例如:while(getchar()!=‘\n’);只要从键盘上输入的字符不是回车则重新输入。4.1.3复合语句用{}括起来的一组语句。一般形式:

{

执行语句;

}说明:“}”后不加分号

其中最后一个语句后也要加分号语法上和单一语句相同

复合语句可嵌套如:

{z=x+y;t=z/100;

printf("%f",t);

}如:

{z=x+y;{t=z/100;

printf("%f",t);

}}4.1.4控制语句控制语句:完成一定的控制功能。辅助控制if()…else…switchfor()…while()…do…while()continuebreakgotoreturn分支循环如:if(x>y)z=x;elsez=y;4.2顺序结构流程图流程图是表示算法的一种工具,用一些图框来表示各种操作。一个流程图包括以下几部分:表示相应操作的框;带箭头的流程线;框内外必要的文字说明。如,顺序结构流程图:AB顺序结构常用的流程图符号:起止框判断框处理框输入/输出框注释框流向线连接点

N-S流程图:完全去掉了流程线,算法的每一步都用矩形框描述,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。顺序结构结构化程序的三种基本结构顺序结构:按书写顺序执行的语句构成的程序段ABAB流程图N-S图选择结构循环结构例4.1输入任意两个整数,求它们的和及平均值。要求平均值取两位小数输出。//例4.1#include<stdio.h>

#include<math.h>

voidmain()

{

intnum1,num2;

floatsum,aver;

printf("Pleaseinputtwointegers:\n");

scanf("%d,%d",&num1,&num2);

sum=(float)num1+num2;/*求累计和*/aver=sum/2.0; /*求平均值*/

printf("sum=%.0f,aver=%.2f\n",sum,aver);}运行情况:

30000,5005

sum=35005,aver=17502.50开始输入两整数计算sum计算aver结束例4.2给定一个三位正整数,分别输出其个位数、十位数和百位数。#include<stdio.h>voidmain(){

intm,m0,m1,m2;

printf(“Inputanumber(100~999):”);

scanf("%d",&m);

m0=m%10;m1=(m/10)%10;m2=m/100;

printf("%d,%d,%d\n",m0,m1,m2);}运行结果:

Inputanumber(100~999):263输出:3,6,2例4.3取一个16位的二进制数a的7、6、5、4四个位,如图4-2中加阴影的部分。voidmain(){unsigneda,b,c,d;

scanf("%x",&a);/*以十六进制形式输入整数a*/b=a>>4;c=~(~0<<4);d=b&c;

printf("%x\n%x\n",a,d);/*以十六进制输出a和结果d*/}例4.4求ax2+bx+c=0方程的根。

a,b,c由键盘输入,设>0。一元二次方程式的根为

x1=x2=

可以将上面的分式分为两项:

p=,q=,则x1=p+q,x2=p-q。顺序结构#include<stdio.h>

#include<math.h>

voidmain()

{

floata,b,c,disc,x1,x2,p,q;

scanf("a=%f,b=%f,c=%f",&a,&b,&c);

disc=b*b-4*a*c;

p=-b/(2*a);

q=sqrt(disc)/(2*a);

x1=p+q;x2=p-q;printf("\nx1=%5.2f\nx2=%5.2f\n",x1,x2);

}运行情况:

输入:a=1,b=3,c=2输出:x1=-1.00

x2=-2.004.3选择结构选择结构是指在程序执行过程中,根据指定条件的当前值在两条或多条路径中选择一条执行。C语言的选择控制语句有两条:条件选择语句:if语句开关分支语句:switch语句4.3.1if语句表达式语句1真(非0)假(0)1、if格式(单分支语句)

if(判断表达式)语句1;

语句1可以是一条语句或复合语句。注意:满足条件时想要执行多条语句一定要用复合语句

当判断表达式值不为零(即”真”),则执行语句1,再执行其后继语句;否则,不执行语句1,执行其后继语句。单分支语句判断表达式应该是具有一定意义、有实用价值的表达式,因此,最常用关系表达式和逻辑表达式来表达,例如:if(a==b)if(a==0)等价于if(!a)if(a!=0)等价于if(a)if(a>=5&&a<=10)例:输入一个整数,求绝对值. main() {

inti;

scanf("%d",&i); if(i<0)i=-i;

printf("%d",i); }例:执行下列程序段后a的值是____。

inta=3;if(2)a=5;单分支语句#include<stdio.h>main(){charc;

printf("inputaletter:");c=getchar();

if(c>='A'&&c<='z')c=c+32;

printf("%c\n",c);}例4.5从键盘输入一个字母,以小写字母形式输出该字母单分支语句例4.6从键盘输入两个整数,按升序输出这两个数。#include<stdio.h>

voidmain()

{

int

a,b,t;

scanf("%d%d",&a,&b);

if(a>b)

{t=a;//交换两数

a=b;

b=t;}

printf("%d,%d\n",a,b);}TFa>bt=aa=bb=t例:输入三个数a,b,c,要求按由小到大的顺序输出。Ifa>b将a和b对换Ifa>c将a和c对换Ifb>c将b和c对换a>ba>cb>ca和b交换a和c交换c和b交换yyynn单分支语句单分支语句#include<stdio.h>

voidmain()

{

floata,b,c,t;

scanf("%f%f%f",&a,&b,&c);

if(a>b)

{

t=a;

a=b;

b=t;

}

if(a>c)

{

t=a;

a=c;

c=t;

}

if(b>c)

{

t=b;

b=c;

c=t;

}

printf("%5.2f,%5.2f,%5.2f\n",a,b,c);

}{}必不可少,否则,会出现逻辑错误!2、if(表达式)语句1else语句2

条件

语句1

语句2YN双分支if-else语句各有一个分号;但属于一个语句例:if(x>y)

printf(“%d”,x);else

printf(“%d”,y);双分支if-else语句说明:在if和else后面可以只含有一条语句,也可以含有用花括号{}括起来的复合语句。如:if((a+b)>c&&(b+c)>a&&(c+a)>b){s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));

printf("area=%6.2f",area);}else

printf("itisnotatrilateral.");例:输入两个数并判断两数是否相等。#include<stdio.h>voidmain(){int

a,b;

printf("Enterintegera:");

scanf("%d",&a);

printf("Enterintegerb:");

scanf("%d",&b);

if(a==b)

printf("a==b\n");else

printf("a!=b\n");}运行结果:

Enterintegera:12

Enterintegerb:12a==b

运行结果:

Enterintegera:12

Enterintegerb:9a!=b

双分支if-else语句分析以下程序的输出结果:(1)#include<stdio.h>

voidmain()

{

inta,b;

scanf("%d",&a);

b=1;

if(a==5)

b=a+3;

b=6;

printf("%d\n",b);}(2)#include<stdio.h>voidmain(){inta,b,t;

scanf("%d%d",&a,&b);

if(a>b)t=a;a=b;b=t;printf("a=%d,b=%d\n",a,b);getch();}(3)#include<stdio.h>

voidmain()

{

intx,y;

scanf("%d",&x);

y=-1;

if(x!=0)y=1;

if(x>0)y=1;elsey=0;

}(4)程序输出结果#include<stdio.h>voidmain(){

intx,y;

scanf("%d",&x);

y=0;

if(x>=0)

{if(x>0)y=1;}

else

y=-1;printf("%d\n",y);}3.多分支语句几种形式:

if(表达式1){if(表达式2)

语句1}else

语句2

内嵌if

if(表达式1)

语句1elseif(表达式2)

语句3else

语句4内嵌if

if(表达式1)if(表达式2)语句1else语句2elseif(表达式3)语句3else语句4内嵌if内嵌if

if(表达式1)if(表达式2)

语句1else

语句2内嵌if3、if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3……elseif(表达式m)语句melse语句n多分支语句例:

if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)cost=0.075;elseif(number>50)cost=0.05;elsecost=0;多分支语句多分支语句匹配规则:Else总是与它上面的,最近的,统一复合语句中的,未配对的if语句配对。当if和else数目不同时,可以加花括号来确定配对关系。例:if(a==b)if(b==c)

printf(“a==b==c”);else

printf(“a!=b”);修改:if(a==b){if(b==c)

printf(“a==b==c”);}else

printf(“a!=b”);

-1(x<0)例有一个函数y=0(x=0),编一程序,输入一个x值,输出y值。1(x>0)算法1:算法1: 输入x输入x

若x<0,则y=-1若x<0,则y=-1

若x=0,则y=0否则: 若x>0,则y=1若x=0,则y=0

输出y若x>0,则y=1

输出y

多分支语句程序#include<stdio.h>voidmain(){

int

x,y;

scanf(“%d”,&x);{

if(x<0)y=-1;else

if(x==0)y=0;elsey=1;}

printf(“x=%d,y=%d\n”,x,y);}if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;正确?程序1:程序2:

if(x<0)if(x>=0)y=-1;if(x>0)y=1;elseelsey=0;

if(x==0)y=0;elsey=-1;elsey=1;程序3:程序4:y=-1;y=0;

if(x!=0)if(x>=0)

if(x>0)y=1;if(x>0)y=1;elsey=0;elsey=-1;正确正确上例中的程序段有四个,请判断哪个是正确的?X<0时,y=0X=0时,y=-1多分支语句例4.7:输入百分制成绩,要求输出相应的五级制成绩。百分制成绩与五级制成绩之间的转换标准为:90分以上为“A”,80-89分为“B”,70-79分为“C”,60-69分为“D”,60分以下为“E”。If语句嵌套voidmain(){intscore;

printf("\nPleaseinputthescore(0-100):");

scanf("%d",&score);

if(score>=90)

printf("A\n");

elseif(score>=80)

printf("B\n");

elseif(score>=70)

printf("C\n");

elseif(score>=60)

printf("D\n");

else

printf("E\n");}多分支语句例4.8分段函数定义如右:根据所输入的x的值,求函数值。main(){floatx,y;

scanf("%f",&x);

if(x<0)y=0;elseif(x<=50)y=x;elsey=x*x;

printf("x=%f,y=%f\n",x,y);}4.3.2switch语句switch语句的格式:switch

(表达式){case常量表达式1:语句1[break;]case常量表达式2:语句2[break;]…case常量表达式n:语句n[break;]default:语句n+1}执行过程:当表达式的值与某一个case后面的常量表达式的值相等时,就从此case后面的语句开始执行下去,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。switch语句case1语句组1break?case2语句组2break?caseN语句组nbreak?是是是否否否有无无无有有caseN+1switch语句执行流程:首先计算switch圆括号中表达式的值,然后将结果值按前后顺序依次与各个case后的常量表达式进行比较。当表达式的值与某一个case后面的常量表达式的值相等时,就执行该case后边的语句组k,接着如果遇到break语句,则结束整个switch语句(即退出switch)。如果不遇到break语句,则按顺序执行下面其他case后边的语句组,直至遇到break语句或最后边的“}”为止,才结束switch语句当结果值与常量表达式k的值都不相等时,若有default,则执行其后语句;若无default,则什么都没执行switch语句说明:1)switch关键字,case也是关键字,与其后面的常量表达式合称case语句标号,常量表达式类型必须与switch后面表达式类型相匹配,且各case语句标号的值各不相同,不能重复;default也是关键字,起语句标号的作用,代表除了以上所有case标号之外的那些标号;2)语句1、语句2可以是一条语句,也可以是若干条,在必要时,case语句标号后的语句可以省略不写;3)switch的表达式通常是一个整型或字符型变量,也允许枚举型变量,其结果为相应的整数、字符或枚举常量;4)break语句不是一定需要加上,执行完一个case后面的语句,若没有遇到break,就自动进入下一个case继续执行,而不再判断是否与之匹配。当程序在执行时,如果输入的是′A′#include"stdio.h"main(){chara;a=getchar();switch(a)

{case65:printf("%c",′A′);case66:printf("%c",′B′);default:printf("%s\n","other");}}运行结果:

ABother当程序在执行时,屏幕上输出为:#include"stdio.h"main(){intk=2;switch(k)

{case1:printf("%d\n",k++);break;case2:printf("%d",k++);case3:printf("%d\n",k++);break;

cade4:printf("%d\n",k++);default:printf("Full!\n“);}}运行结果:

23switch语句例:要求按照考试成绩的等级输出百分制分数段,用switch语句实现

应写为:

switch(grade){case'A':printf("85~100\n");break;

case'B':printf("70~84\n");break;

case'C':printf("60~69\n");break;

case'D':printf("<60\n");break;default:printf("error\n");

}补充例:输入成绩,用A、B、C、D、F、R分别表示优、良、中、及格、不及格、补考、缺考。

grade=getchar();switch(grade){ case'A':case'a':printf("优");break; case'B':case'b':printf("良");break; case'C':case'c':printf("中");break; case'D':case'd':printf("及格");break; case'F':case'f':printf("不及格");/*此处没有break语句*/ case'R':case'r':printf("请补考");break; default:printf("输入错");}switch语句例:某幼儿园只收2至6岁的儿童。2~3岁入小班,4岁入中班,5~6岁入大班。根据输入的年龄,求应入的班级。分析:设年龄为age,当age为2和3时,应输出同样的内容“入小班”,age为5和6时输出同样的内容“入大班”。该题算法比较简单。switch语句#include<stdio.h>voidmain(){intage;

printf("Pleaseenterage:");

scanf("%d",&age);

switch(age){case2: case3: printf("入小班\n");break; case4: printf("入中班\n");break; case5: case6: printf("入大班\n");break; default: printf("不能入园\n");}}

voidmain(){int

x,y,a=0,b=0;

scanf("x=%d,y=%d",&x,&y);

switch(x){case1:

switch(y){case0:a++;case1:b++;default:a++;b++;}break;case2:a+=2;b+=2;break;default:a+=3;b+=3;}

printf("a=%d,b=%d\n",a,b);}运行结果:输入:x=1,y=0输出:a=2b=2switch语句的嵌套选择结构程序举例例4.13输入一个字符,判别该字符是数字、英文大写字母、小写字母还是其它字符。#include<stdio.h>voidmain(){charc;

printf("inputachar:");c=getchar();if(c>='0'&&c<='9')

printf("Thisisadigit.\n");elseif(c>='A'&&c<='Z')

printf("Thisisacapitalletter.\n");elseif(c>='a'&&c<='z')

printf("Thisisasmallletter.\n");else

printf("Thisisanothercharacter.\n");}选择结构程序举例例4.14输入三角形三边长,求三角形面积。#include<math.h>voidmain(){floata,b,c,s,area;

scanf("%f,%f,%f",&a,&b,&c);

if(a+b>c&&a+c>b&&b+c>a){s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));

printf("area=%7.2f\n",area);}

else

printf("Notatriangle.\n");}选择结构程序举例例4.15输入a、b、c三个整数,输出最大数和最小数。

voidmain(){int

a,b,c,max,min;

printf("inputthreenumbers:");

scanf("%d,%d,%d",&a,&b,&c);max=a>b?a:b;min=a<=b?a:b;

if(c>max)max=c;

elseif(c<min)min=c;printf("max=%d\nmin=%d",max,min);}

课堂练习1.以下程序的运行结果是()。

main(){intn=5;

if(n++>=6)

printf("%d\n",n);else

printf("%d\n",++n);}2.对于整型变量a,赋值语句a=(a%3==0?1:0);与()语句不等价。

(A)if(a%3==0)a=1;elsea=0; (B)if(a%3!=0)a=0;elsea=1; (C)if(a%3)a=0;elsea=1; (D)if(a%3)a=1;elsea=0;课堂练习3.以下程序的运行结果是()。main(){intn='c';

switch(n++){default:printf("error");break;case'a':case'b':printf("good");break;case'c':printf("pass");case'd':printf("warn");}}循环结构在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。特点:当给定的条件成立时,反复执行某个程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体,它由C的语句构成。C语言提供了3种循环结构:while语句;do-while语句;for语句4.4.1用while语句实现循环while语句用来实现“当型”循环结构。一般形式:

while(表达式)语句当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。(1)与if的区别,if只一次,while反复判断,反复执行;(2)while语句中通常有改变表达式的值的语句。用while语句实现循环例4.18计算1+2+…+100。main(){inti=1,s=0;while(i<=100){s+=i;i++;}

printf("%d,%d",i,s);

getch();}1.如果缺少i++这一行会出现什么情况?2.若计算:n!该程序应如何修改?例4.19根据公式计算π的值。#include<math.h>voidmain(){inti=1,n;doublepi=0;

printf("Inputaninteger:\n");

scanf("%d",&n);

while(i<=n){pi+=1.0/(i*i);i++;}pi=sqrt(pi*6);

printf("pi=%lf\n",pi);}用while语句实现循环例4.21猴子吃桃问题:猴子摘下了一堆桃子,第一天吃总数的一半多一个,第二天吃剩下的一半多一个,以后每天都吃前一天剩下的一半多一个,到第十天想再吃时剩一个,求猴子摘了多少个桃子?算法分析:

设第i天未吃前有xi个桃子,由题意得:x1/2-1=x2x2/2-1=x3…x9/2-1=x10已知x10=1,我们有:x10=1xn-1=(xn+1)*2voidmain(){intk,x1,x2;k=1;x2=1;while(k<=9){x1=(x2+1)*2;x2=x1;k++;}

printf("Totalnumber=%d\n",x1);}用while语句实现循环补充1.统计从键盘输入的字符个数。(以回车结束)补充2.从键盘输入一个整数(至少大于9),求最高位的数字.

#include<stdio.h>main(){intcount=0;while(getchar()!='\n') count++;

printf("count=%d",count);}

这种结构的循环次数是不确定的。while(d>9)d=d/10;

/*反复执行d=d/10*/

printf("最高位是%d",d);也可写成:

while((d/=10)>9); /*空循环体,反复执行d=d/10*/

printf("最高位是%d",d);4.4.2用do-while实现循环

do-while语句的特点:先执行循环体,然后判断循环条件是否成立。一般形式:

do{

循环体语句

}while(表达式);

执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”)时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。用do-while实现循环用do-while计算:1+2+…+100。main(){inti=1,s=0;do{s=s+i;i++;}while(i<=100);

printf("%d,%d",i,s);

getch();}计算:1-3+5-7…+101main(){

inti=1,s=0;

ints=1,t=1;do{s=s+t*i;i=i+2t=-t;}while(i<=101);

printf("%d\t",s);}用do-while实现循环例4.22利用格里高公式:求π,直到最后一项的值小于10-6。voidmain(){ints=1;floatn=1.0,t=1,pi=0;do{pi=pi+t;n=n+2; /*分母每循环一次增加2*/s=-s; /*单项的正负号交替变化*/t=s/n; /*下一项的值*/

}while(fabs(t)>1e-6);pi=pi*4;

printf("pi=%10.6f\n",pi);}while和do…while循环的比较上述程序的功能是什么?比较:输入5和11时两个程序的输出结果如何?#include<stdio.h>voidmain(){inti,sum=0;

scanf("%d",&i);do{sum+=i; i++;}while(i<=10);

printf("%d",sum);}#include<stdio.h>voidmain(){inti,sum=0;

scanf("%d",&i);while(i<=10){sum+=i; i++;}

printf("%d",sum);}

当型循环最少执行次数是多少?直到型循环,最少执行次数是多少?4.4.3用for语句实现循环C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。一般形式:

for(表达式1;表达式2;表达式3)循环体也可写作:for(循环变量赋初值;循环条件;循环变量增值)循环体

for语句等价于如下的while循环形式:

表达式1;while(表达式2){

语句

表达式3;

}用for语句实现循环for语句的执行过程:

(1)先求解表达式1。

(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。

(3)求解表达式3。

(4)转回上面第(2)步骤继续执行。

(5)循环结束,执行for语句下面的一个语句

用for循环计算:1+2+…+100。

main() {

inti,s=0; for(i=1;i<=100;i++)/*注意括号后没有分号*/ s=s+i;/*

求和:1+2+3+…+100*/

printf("%d",s); }变量i用于控制循环次数,我们称其为循环控制变量。1.最后i的值是多少?2.从1加到10000或更多呢?用for语句实现循环说明:表达式1,表达式2和表达式3之间必须用分号隔开,但表达式3后面不能加分号。循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。循环体有可能一次也不执行。循环体可以为空。表达式1和表达式3都可以为逗号表达式。(例)表达式1,表达式2和表达式3都可省略,但不鼓励省略表达式2和表达式3。(例:省略表达式1)for语句循环与while循环可以互相转换,但for循环的结构更简洁。for语句的省略形式例(1):i=1;for(;i<=1000;i++)sum=sum+i;

例(2):for(i=1;i<=1000;){sum=sum+i;i++;}例(3):for(i=1;;i++){if(i>1000)break;sum=sum+i;}1)表达式1可省略,但分号不能省,在for语句前为变量赋初值;2)表达式3也可省略,但应把其放入循环体内,否则for无法正常结束;3)表达式2省略后,for语句将无限循环下去。可在循环体内加退出循环的语句for语句的省略形式4)表达式1和表达式3可以是一个简单的表达式,也可以是一个逗号表达式,表达式1和表达式3也可以是与循环无关的任意表达式;5)三个表达式全省略,无终止执行循环体,分号不能省;6)把循环体内容放到表达式3,循环体为空语句。尽量避免此写法例(4):i=1,sum=0;for(p=0;i<=100;p+=1){sum=sum+i;i++;}

例(6):for(i=1,sum=0;i>1000;sum=sum+i,i++);例(5):i=1,sum=0;for(;;){sum=sum+i;i++;if(i>100)break;}用for语句实现循环例4.25求1!+2!+…+10!的值。voidmain(){inti,n=10;longs,t;

for(i=1,t=1,s=0;i<=n;i++){t*=i;/*t为上一个数i-1的阶乘值,再乘以i,即i!=(i-1)!*i*/s+=t;/*累加i!*/}

printf("s=%ld\n",s);}用for语句实现循环例4.27编程输出“斐波那契数列”的前20项。“斐波那契数列”是意大利中世纪数学家列昂纳多·斐波那契以兔子繁殖为例子而引入的,故又称为“兔子数列”。main(){inti,x1=1,x2=1;

for(i=1;i<=10;i++)/*每次生成并输出两项,所以循环10次*/{printf("%10d%10d",x1,x2);if(i%2==0)printf("\n");/*当i为偶数时换行,即每四个换行*/x1=x1+x2;x2=x2+x1;}}用for语句实现循环最简单的写法:main(){inti,j,k=10000; for(i=1,j=0;i<=k;i=i+j,j=i-j)

printf("%d",i);}这里:i表示fibonacci(n) i=i+j;即第n项=第n-1项+第n-2项

j=i-j;即第n-1项=第n项-第n-2项 使i存放当前项,j存放前一项程序运行结果为:

112358132134558914423337761098715972584418167654.4.4continue语句和break语句1.break语句

(1)在while、for、do~while语句的循环体或switch语句的语句组中,使用break语句可使程序立即退出该结构。故有中断语句之称。其语法格式如下:

break;

(2)功能:用在循环语句或switch语句中,使得跳出循环体或分支,提前结束循环或分支。continue语句和break语句#include<stdio.h>voidmain(){

inti;for(i=1;;i++)

if(!((512-i*15)%13))break;

printf("%d+%d=512\n",i*15,512-i*15);}例4.28将数字512表示成两个数的和,这两个数分别为15和13的倍数。运行结果:

135+377=512continue语句和break语句

说明

break只能终止并跳出最近一层的循环结构。

break不能用于循环语句和switch语句之外的任何其它语句之中。在循环语句中,break总是与选择语句配合使用。main(){inti,s;s=0;for(i=1;i<=10;i++){s=s+i;

if(s>5)break;

printf("%d\n",s);}}运行结果:

13continue语句和break语句2.continue语句一般形式:continue;功能:用在循环语句中,使得结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。补充例题:

for(i=1;i<=10;i++){ if(i%2==0)continue;

printf(“%d”,i);}该程序的功能是:只打印出单数continue语句和break语句说明:continue只能终止本次循环,而不是终止整个循环的执行。

continue不能用于循环语句之外的任何其它语句之中.continue总是与选择语句配合使用。//例4.29

#include<stdio.h>voidmain(){int

i,n=0;

for(i=100;i<=200;i++){if((i%7!=0)&&(i%9!=0)) continue; printf("%5d",i); n++;

if(n%5==0)

printf("\n");}}例4.29输出100~200之间所有能被7或9整除的数。continue语句和break语句补充例:计算输入的10个整数中正数的个数及正数平均值。

main(){int

i,n,a; floats=0.0;

printf("请输入10个整数:\n"); for(n=0,i=0;i<10;i++) {scanf("%d",&a); if(a<=0)continue;/*或改为if(a>0)下两句要加{}*/ s+=a; n++; }

printf("共有%d个正数.其平均值为%f。\n",n,s/n);}3.continue和break的区别:continue语句只是结束本次循环,而不是终止整个循环的执行,而break语句则是结束整个循环过程,不再判断条件是否成立。continue语句和break语句main(){inti,a=0,b=0,c=0,d=0;for(i=1;i<=4;i++){switch(i){case1:a=1;continue;case2:b=2;case3:c=3;break;case4:d=4;}printf("%d%d%d%d\n",a,b,c,d);}}main(){inti,s;s=0;for(i=1;i<=10;i++){s=s+I;

if(s>5)break;

printf("%d\n",s);}}continue语句和break语句main(){intk=4,n=0;

clrscr();for(;n<k;){n++;if(n%3!=0)break; k--;}

printf("%d,%d\n",k,n);}运行结果:

4,1将break改为continue运行结果:

3,34.4.5循环的嵌套循环的嵌套:一个循环体内又包含另一个完整的循环结构。多层循环:内嵌的循环中还可以嵌套循环。三种循环(while循环、do-while循环和for循环)可以互相嵌套,层数不限。循环嵌套形式举例:(1)

while()(2)do(3)for(;;){…{…{…while()dofor(;;){…}{…}{…}…while();…}}}while();循环的嵌套(4)

while()(5)for(;;)(6)do{…{…{…dowhile()for(;;){…}{}{}while()………}}}while()外层循环可包含两个以上内循环,但不能相互交叉。嵌套循环的执行流程例:for(i=1;i<=n;i++)for(j=1;j<=5;j++)s=i*j;例4.30在屏幕上输出如下图形:main(){inti,j,k;

for(i=8;i>=1;i--)/*总共要输出8行星号*/{for(j=1;j<=8-i;j++)

printf("");/*控制每行星号前面显示的空格*/

for(k=1;k<=2*i-1;k++)

printf("*");/*控制每行星号的个数*/

printf("\n");/*控制输出每行星号后换行*/}}循环的嵌套例4.31改写例4.25求1!+2!+…+10!的程序,用嵌套的循环结构来实现。main(){inti,n=10,j;longs=0,t;for(i=1;i<=n;i++){for(t=1,j=1;j<=i;j++)t*=j;/*每次循环都重新计算i!*/s+=t;/*累加i!*/}

printf("s=%ld\n",s);}程序举例—穷举法例4.32三位自方幂数又称水仙花数,用穷举法求出所有水仙花数。如:13+53+33=153main(){inti,j,k,m1,m2;

printf("narcissusnumbersare:");

for(i=1;i<=9;i++)for(j=0;j<=9;j++)for(k=0;k<=9;k++)

{m1=i*100+j*10+k;m2=i*i*i+j*j*j+k*k*k;if(m1==m2)printf("%4d",m1);

}

printf("\n");}程序举例—数的分离例4.33编写一个程序,输入1~32767之间的整数,把这个整数显示为一系列数字,每组数字都是用两个空格分开。例如,整数1234应该显示为:1234。

main(){inti,num,counter,temp;counter=1;

printf("Enteraninteger:");scanf("%d",&num);temp=num;

while(temp/10)/*计算位数*/

{temp/=10;counter++;}while(counter)

{temp=1;

for(i=1;i<=counter-1;i++)temp*=10;printf("%3d",num/temp);num%=temp;counter--;}printf("\n");}程序举例—方程求根例4.34用二分法求非线性方程f(x)=x3+1.1x2+0.9x-1.4=0的根。xy0cabf(a)f(b)voidmain(){floatx,x1,x2,y1,y2,y;do{printf("Inputx1,x2:\n");scanf("%f,%f",&x1,&x2);y1=((x1+1.1)*x1+0.9)*x1-1.4;y2=((x2+1.1)*x2+0.9)*x2-1.4;}while(y1*y2>=0);do{x=(x1+x2)/2;y=((x+1.1)*x+0.9)*x-1.4;y1=((x1+1.1)*x1+0.9)*x1-1.4;if(y*y1>0)x1=x;elsex2=x;}while(fabs(y)>=1e-6);

printf("Arootofequationis:%8.2f\n",x);}程序举例—多项式计算例4.35编程计算多项式的值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论