版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第3章结构化程序设计3.1基本语句3.2顺序结构3.3选择结构3.4循环结构3.5简单程序设计实例23.1基本语句-表达式语句
基本语句主要有表达式语句、空语句、goto语句、break语句、continue语句、return语句等。基本语句都以分号为结束符。1.表达式语句格式:表达式;例如:k++; k=k+2;33.1基本语句-空语句2.空语句格式:;功能:什么也不做的语句。例如:for(…,…,…);
/*无循环体*/if(条件1) if(条件2)
语句1;else;else
语句2;43.1基本语句-break语句3.break语句格式:break;功能:强制结束它所在的控制结构(switch或循环结构)。例如:for(…,…,…)
{/*大括号内是循环体*/
语句1;break; /*跳出循环,转做语句2*/}
语句2;53.1基本语句-continue语句4.continue语句格式:continue;功能:提早结束当前轮次循环体的执行,进入下一轮循环。例如:for(…,…,…)
{/*大括号内是循环体*/
语句1;continue; /*不执行语句2*/
语句2;}
语句3;63.1基本语句-return语句5.return语句格式:return;或return表达式;功能:结束函数的这次执行,将控制返回到函数调用处。说明:return;只能用于函数不返回结果的函数体中;
return
表达式;
用于函数有返回结果的函数体中。例如:voidswap(inta,intb)
{/*大括号内是函数体*/
语句1;return;/*不执行语句2,返回到调用函数*/
语句2;}73.1基本语句-goto语句6.goto语句格式:goto语句标号;功能:控制立即转移到goto后标号所指定的语句处继续执行。例如: start:i=0; . . . gotostart;83.2顺序结构目前,结构化程序设计提供三种基本结构:顺序结构、选择结构和循环结构顺序结构:描述一个计算步骤序列,表示从步骤序列的第一个计算步骤开始,顺序执行每个计算步骤,直至最后一个计算步骤。在C程序中,顺序执行的语句序列,用花括号括住,就构成C语言的复合语句。复合语句中的每个计算步骤可以是单个语句,也可以是一个控制结构。
9顺序结构-例【例】交换变量x、y的值。可分解为以下顺序执行的三个计算:
temp=x;/*将x的值保存到变量temp*/x=y; /*变量x置y值*/y=temp;/*变量y置temp的值*/
若把交换变量x、y的值作为一个不可分割的整体来考虑,应把它们写成复合语句:
{/*本复合语句要求外面为它定义temp变量*/temp=x;x=y;y=temp;}
10顺序结构-说明在构造复合语句时,为完成指定的工作,可能需要临时工作变量,例如,以上述中的temp变量。在语句序列中插入变量定义,引入只有复合语句内的语句可使用的临时变量。例如,将前面的例子改写成以下形式:{inttemp;/*定义自己专用的临时变量*/temp=x;x=y;y=temp;}113.3选择结构
选择结构可分为两路条件选择结构和多路按值选择结构两种。3.3.1两路条件选择结构(if语句)
由一个条件和两个供选择的分支语句组成,用于按条件成立与不成立两种情况,作两种选一的控制。12两路条件选择结构(if语句)if语句的一般形式为:
if(表达式)
语句1else
语句2
表达式?语句2假(0)真(非0)语句1例如:
if(a>b)printf("MAX=%f\n",a);elseprintf("MAX=%f\n",b);说明:当a>b成立时,输出a,否则,输出b。
13if语句-无else当if语句中的语句2为空语句时,if语句的形式为:
if(表达式)
语句
表达式?语句假(0)真(非0)例如:
max=a;if(max<b)max=b;printf("MAX=%f\n",max);说明:将a、b中大的数存于max,最后输出max。
14if语句-例3.1和3.2【例3.1】求m=max(a,b)。
if(a<b)/*如果a<b*/m=b;elsem=a;【例3.2】已知三角形的三条边长a、b、c,求三角形的面积。
if(a+b>c&&b+c>a&&c+a>b){floats;/*因为是顺序结构,必须写成复合语句*/s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));}
elsearea=0.0;/*不能构成三角形*/15if语句-例3.3和3.4(if嵌套)【例3.3】若ch中的字符为大写字母,则改为对应的小写字母。
if(ch>='A'&&ch<='Z')/*大写英文字母*/
ch=ch+'a'–'A';/*减去大写'A'的编码,加上小写'a'的编码*/【例3.4】按得分(score)输出适当信息。
if(score>=90)printf("Excellent.\n");elseif(score<60) /*嵌套的if语句*/printf("Dismal.\n");elseprintf("Typical.\n");16if语句的嵌套if(表达式1)if(表达式2)
语句1else
语句2执行语句2的条件是:
(表达式1)&&!(表达式2)
还是!(表达式1)
else总是与它前面最接近的if对应
√×if(表达式1)if(表达式2)
语句1else
语句217if语句的嵌套-说明
上例中若要执行语句2的条件为:
!(表达式1),可用以下两种方法实现:方法一:if(表达式1)
{
/*将分支语句变成一个复合语句*/
if(表达式2)语句1
}
else语句2方法二:if(表达式1)
if(表达式2)语句1
else;
/*这里有1个空语句*/
else
语句2
183.3.1if语句的说明如果if语句中的语句、语句1、语句2是一个简单语句,在这些简单语句之后会有一个分号。如果if语句中的语句、语句1、语句2是由多个语句组成的顺序结构时,则必须将它们写成复合语句。【例】
if(a>b)
/*按小到大排列*/
{temp=a;a=b;b=temp;}193.3.1if语句的说明如果if语句中的语句、语句1、语句2是一个简单语句,在这些简单语句之后会有一个分号。如果if语句中的语句、语句1、语句2是由多个语句组成的顺序结构时,则必须将它们写成复合语句。【例】
if(a>b)
/*按小到大排列*/
{temp=a;a=b;b=temp;}203.3.1if语句的说明3.在if语句中,每个else总要与它前面的if对应,不可能出现没有对应if的else。【例】if(a<b)max=b; elsemax=a; elsemax=c;/*错误*/
21【例3.5】输入3个整数,输出它们中的最大数为求三个数中的最大者,最简洁的办法是先将其中某一个预作最大者,然后逐一与其它两个数比较,当发现有更大者时,就以它重置最大者。#include<stdio.h>voidmain(){inta,b,c,max;printf("输入3个整数.\n");scanf("%d%d%d",&a,&b,&c);max=a;if(max<b)max=b;if(max<c)max=c;printf("最大数是%d\n",max);}22【例3.6】输入三个整数,按值大到小的顺序输出要求:有x、y、z三个变量,使满足关系x>=y>=z。方法:先调整x和y,使x>=y;再调整x和z,使x>=z;至此,x为最大值。最后再调整y和z,使y>=z。#include<stdio.h>voidmain(){intx,y,z,temp;printf("Enterx,y,z.\n");scanf("%d%d%d",&x,&y,&z);if(x<y){temp=x;x=y;y=temp;}/*使x>=y*/if(x<z){temp=x;x=z;z=temp;}/*使x>=z*/if(y<z){temp=y;y=z;z=temp;}/*使y>=z*/printf("%d\t%d\t%d\n",x,y,z);}23【例3.7】求一元二次方程的根
设一元二次方程为ax2+bx+c=0,对输入的系数a、b、c,有以下几种情况需要考虑:(1)a≠0: 方程有两个根。(2)a=0,b≠0: 方程退化为bx+c=0, 方程根为:-c/b。(3)a=0,b=0: 方程为同义反复(c=0), 或矛盾(c≠0)。由以上分析得到以下程序结构:{(1)输入方程系数a,b,c;if(a!=0.0)(2)求两个根;elseif(b!=0.0)(3)输出方程根-c/b;elseif(c==0)(4)输出方程同义反复字样;else(5)输出方程矛盾字样;}24【例3.7】求一元二次方程的根-分析分析1:对步骤⑴、⑶、⑷、⑸,用C语言描述非常简单。分析2:对步骤⑵,根椐判别式:
△=b2-4ac≥0,有两个实根
△=b2-4ac<0,有两个复根
对于两个复根情况,可分别计算它们的实部和虚部。对于实根,也可根据上面给出的公式计算两个根。但是考虑到b2>>4ac时,有一个根就非常接近零。数值计算中,两个非常接近的数执行减法求出的值的精度很低。为此先求出一个绝对值大的根root1。然后,利用根与系数的关系:
root1*root2=c/a
即root2=c/(a*root1)求出root2。25【例3.7】求一元二次方程的根-程序#include<stdio.h>#include<math.h>/*使用数学库函数*/voidmain(){doublea,b,c,delta,re,im,root1,root2;printf("输入方程系数a,b,c\n");scanf("%lf%lf%lf",&a,&b,&c);if(a!=0.0){ /*有两个根*/delta=b*b-4.0*a*c; /*求判别式*/re=-b/(2.0*a);im=sqrt(fabs(delta))/(2.0*a);/*fabs是求绝对值函数*/if(delta>=0.0){/*两个实根,先求绝对值大的根*/root1=re+(b<0.0?im:-im);root2=c/(a*root1);printf("两实根分别是:%7.5f,%7.5f\n",root1,root2);}26【例3.7】求一元二次方程的根-程序续elseprintf("两复根分别是:%7.5f+%7.5fI,%7.5f-%7.5fI\n",re,fabs(im),re,fabs(im));}else/*a=0.0*/if(b!=0.0)printf("单根%7.5f\n",-c/b);elseif(!c)printf("方程同义反复.\n");elseprintf("方程矛盾.\n");}27说明:if后面的表达式类型任意语句可以是复合语句
if(x)if(x!=0)if(!x)
if(x==0)例考虑下面程序的输出结果:#include<stdio.h>voidmain(){intx,y;scanf(“%d,%d”,&x,&y);if(x>y)x=y;y=x;elsex++;y++;printf(“%d,%d\n”,x,y);}CompileError!28
一般形式:if(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4内嵌if内嵌ifif(expr1)if(expr2)statement1elsestatement2内嵌ifif(expr1)if(expr2)statement1elsestatement3
内嵌ifif(expr1)statement1elseif(expr3)statement3elsestatement4内嵌ifif语句的嵌套形式29
if语句中的“表达式”一定要用()括起来, 如:ifa>b
……;(×)表达式后面只控制一条语句,但可以是一条 复合语句
if~else配对原则:缺省{}时,else总是和它上面离它最近的需配对的if配对if(……)if(……)if(……)else…...else…...else…...if语句的注意要点实现if~else正确配对方法:加{
}30例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b)
{if(b==c)printf(“a==b==c”);
}elseprintf(“a!=b”);if语句配对原则分析按照配对原则,else与最近的未配对的if配对如果需要如红箭头所示配对的话则应修改如下:31看下面程序,写输出结果:#include<stdio.h>voidmain()//注意程序的缩进规则
{intx=100,a=10,b=20;intv1=5,v2=0;if(a<b)if(b!=15)if(!v1)x=1;elseif(v2)x=10;x=-1;printf(“x=%d”,x);}
课堂练习(if语句)答案:x=-132读程序写结果:第1题#include<stdio.h>voidmain(){ inta,b,c; intx=35; a=b=c=0; if(!a)x--; elseif(b) if(c)x=3; elsex=4; printf("x=%d",x);} 第2题#include<stdio.h>voidmain(){ inta,b,c; intx=35; a=b=c=0; if(!a)x--; elseif(b); if(c)x=3; elsex=4; printf("x=%d",x);} 答案:x=34答案:x=4
课堂练习(if语句)33第三题#include<stdio.h>voidmain(){ intm=5; if(m++>5)printf(“%d\n”,m); elseprintf(“%d\n”,m--);} 答案:634if语句的练习(填空)
当a=1,b=3,c=5,d=4时,执行下面一段程序后,x的值是()
//注意程序的缩进规则if(a<b)if(c<d)x=1;elseif(a<c)if(b<d)x=2;elsex=3;elsex=6;elsex=7; 答案:2353.3.2多路按值选择结构switch语句描述多路按值选择结构。switch语句的一般形式为:
switch(表达式){case常量表达式1:语句序列1case常量表达式2:语句序列2...case常量表达式n:语句序列ndefault :语句序列n+1}36switch语句-执行过程语句序列n+1语句序列1...语句序列n+1语句序列2...
表达式=?……语句序列n+1语句序列n语句序列n+1值1值2值n所有条件都不满足说明:若遇到break语句,则直接转向switch出口37switch语句-说明1.switch后面括号内的表达式只限于是整型表达式、字符型表达式或枚举型表达式。
当表达式的值与某一个“case常量表达式”的值相等时,就执行case后面的语句,只要未遇到break语句或goto语句就一直向下执行,直至switch语句出口。只有当所有条件都不匹配时,才执行default后面的语句序列。每一个case的常量表达式的值必须互不相同,并与switch后面括号内的表达式值的类型相一致。语句序列由任意条合法的C语句构成,也可以没有语句。38
voidmain(){ charchoice; printf("Enterchoice!(A,B,C,...\n"); scanf("%c",&choice); switch(choice){case'A':printf("Achosen!\n");case'B':printf("Bchosen!\n");case'C':printf("Cchosen!\n");default:printf("defaultchosen!\n");}如输入字符'B',则程序的执行将输出:
Bchosen!Cchosen!defaultchosen!【例3.8】输入选择,输出相应的选择名称39switch语句-break语句break作用:控制转向switch语句的后继语句,即跳 出Switch语句。【例3.9】根据天气情况,安排活动。intw_con;/*天气情况变量定义*/printf("天气如何?[1:晴天,2:多云,3:下雨]");scanf("%d",&w_con);switch(w_con){ case1:printf("上街购物!\n");break; case2:printf("去游泳!\n");break; case3:printf("在家看电视!\n");break; default:printf("错误选择!\n");}40【例3.10】计算switch((int)(x+0.5)){case1:y=sin(x);break;case2:case3:case4:y=log(x);break;case5:case6:case7:y=exp(x);break;default:printf("自变量x值超出范围\n");break;}sin(x)0.5≤x<1.5y(x)=log(x)1.5≤x<4.5exp(x)4.5≤x<7.541例
#include<stdio.h>voidmain()//switch语句的嵌套
{intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}printf(“\na=%d,b=%d”,a,b);}运行结果:a=2,b=1
课堂练习(1.读switch语句)42#include<stdio.h>voidmain(){ inta=1,b=2;inty; switch(pow(a,2)+pow(b,2)) { case1:case3:y=a+b;break; case0:case5:y=a-b; } printf("%5d%d",y,a);}
课堂练习(2.switch语句是否有错)分析:错因为switch后面括号内表达式不能为double43voidmain(){ intx=0,y=2,z=1;switch(x) { case0:switch(y==2) { case1:printf("*");break; case2:printf("%");break;} case1:switch(z) { case1:printf("$"); case2:printf("*");break; default:printf("#");} }}
课堂练习(3.读switch语句)运行结果:*$*44循环控制
为什么需要循环?
编程计算10的阶乘现需要把十个同学的成绩输入计算机,并进行统计计算平均值,请用前面学过的知识编程来解决453.4循环结构C语言提供描述三种不同的循环结构的语句:
while语句、do_while语句、for语句3.4.1while语句一般形式:while(表达式)
语句执行过程:(1)计算循环条件表达式的值(2)当表达式的值为非0时,转步骤(3);当表达式的值为0时,结束循环(3)执行循环体,并转步骤(1)说明:若循环体由两个以上语句组成,循环体应写成复合语句循环体46执行流程:expr循环体假(0)真(非0)while
while循环语句while循环语句下面的语句47例用while循环求
#include<stdio.h>voidmain(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);}循环条件
循环初值循环变量增值循环体循环终值sum=0+1sum=1+2=3sum=3+3=6……sum=4950+100=505048while语句-说明循环体如果包含一个以上的语句,应该用花括号括起来,以复合语句形式出现;如果不加花括号,则while语句的范围只到while后面第一个分号处。在循环体中,应有使循环趋向于结束的语句。如上例中循环结束的条件是i>100,用i++语句达到此目的;如果无i++语句,将导致循环条件永远成立,永不结束。当循环体为空时,可用空语句代替。例:跳过输入的空白类字符:
while((c=getchar())==''
||c=='\t'
);无循环体,
用空语句表示49while语句-说明(续)4.
有时很难写出循环条件,可用
1代之
(表示条件为真),但在循环体中必须有break语句(用于跳出循环)。
while(1){...if(表达式)break;...}50例显示1~10的平方#include<stdio.h>voidmain(){inti=1;while(i<=10){printf("%d*%d=%d\n",i,i,i*i);i++;}}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=10051课堂练习(while
语句)1、设有如下程序:#include<stdio.h>voidmain(){ intn=9; while(n-->6) { printf("%d",n); }printf("%d",n);
}该程序段的输出结果是_________A)987B)876C)8765D)9876答案:C解答:不管是否满足循环条件,n=n-1都要进行52【例3.12】求学生平均成绩,当输入负数时结束#include<stdio.h>voidmain(){intsum,count,mark;sum=0;count=0;while(1){/*循环条件永远为真*/printf("输入成绩(小于0结束)\n");scanf("%d",&mark);if(mark<0)break;/*跳出while循环*/sum+=mark; /*累计总分*/count++; /*学生人数计数器增1*/}if(count)printf("平均成绩为:%.2f\n",((float)sum)/count);elseprintf("没有数据输入.\n");}53#include<stdio.h>voidmain(){intc,nwhite,nother,ndigit;nwhite=nother=ndigit=0;printf("Enterstringline\n");while((c=getchar())!='\n'){switch(c){case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':ndigit++;break;case'':case'\t':nwhite++;break;default:nother++;break;}}printf("digit=%d\twhitespace=%d\tother=%d\n",ndigit,nwhite,nother);}【例3.13】统计输入字符行中,空白类字符、数字符和其它字符的个数543.3.2do-while语句执行过程:(1)执行循环体(2)求循环条件表达式的值(3)当表达式的值为非0时,转步骤(1);当表达式的值为0时,结束循环。注意:分号是do-while语句的结束符,不能省略。循环体
一般形式:do
循环体语句;
while(表达式);55
do~while语句执行流程
执行流程:do循环体expr假(0)真(非0)whiledowhile循环下面的语句56do~while语句的特点
特点:先执行循环体,后判断条件表达式说明:至少执行一次循环体do~while可转化成while结构expr循环体假(0)真(非0)循环体while循环57while和do~while语句的对照
expr循环体假(0)真(非0)whilewhile循环下面的语句do循环体expr假(0)真(非0)whiledowhile循环下面的语句58do-while语句-说明
与while语句一样,当循环体由多个语句组成时,必须把它们书写成复合语句。while与do-while区别while:先判别表达式,后执行循环体,当
while表达式第一次为假时,循环体一次也不执行。do-while:先执行循环体,后判别表达式。因此,使用do-while至少执行一次循环体。59课堂练习(do~while
语句)选择题: 假定a和b为int型变量,则执行以下语句后b的值为_________a=1;b=10; do{b-=a;a++;}while(b-->0);A)-4B)-5C)-1D)-6答案:A解答:不管是否满足循环条件,b=b-1都要进行60do-while语句-例【例3.15】求方程f(x)=3x3+4x2-2x+5的实根。说明:1.用牛顿迭代方法求方程f(x)=0的根的近似解:
xk+1=xk-f(xk)/f’(xk),k=0,1,…2.当修正量dk=f(xk)/f’(xk)的绝对值小于某个很小数ε时,xk+1就作为方程的近似解。3.下面的程序取迭代初值为-2,ε=1.0e-6。61#include<stdio.h>#include<math.h>/*引用数学函数*/#defineEpsilon1.0e-6voidmain(){doublex,d;x=-2.0;do{d=(((3.0*x+4.0)*x-2.0)*x+5.0)/
((9.0*x+8.0)*x-2.0);/*f(x)/f'(x)*/x=x-d;}while(fabs(d)>Epsilon);/*未满足精度要求循环*/printf("Therootis%.6f\n",x);}【例3.15】求方程f(x)=3x3+4x2-2x+5的源程序结果为:Therootis-2.05331962do-while语句-例【例3.16】查找一个最小整数,要求满足以下条件:被3除余2,被5除余3,被7除余4。#include<stdio.h>voidmain(){inti=2;doi++;while(!(i%3==2&&i%5==3&&i%7==4));printf("被3除余2,被5除余3,被7除余4的最小数是:
%d\n",i);}结果为:5363【例3.16】-提高运行效率
采用分阶段的办法,先让变量在保证满足条件被3除余2情况下,寻找被5除余3的解;接着在保证被3除余2和被5除余3的条件下,寻找被7除余4的解,这样做能简化循环条件,并能加快找解的速度。#include<stdio.h>voidmain(){inti=2; /*初值i被3除余2*/doi+=3;/*保证i被3除余2*/while(i%5!=3); /*保证i被3除余2,并被5除余3*/
while(i%7!=4) i+=15; /*3*5*/printf("被3除余2,被5除余3,被7除余4的最小数是:
%d\n",i);}643.4.3for语句执行过程:(1)计算表达式1(2)当表达式2的值为非0,转步骤(3);
当表达式2的值为0,结束循环(3)执行循环体语句(4)计算表达式3(5)转向步骤(2)。循环体一般形式:for([expr1];[expr2];[expr3])
循环体语句;65for语句执行流程
执行流程:expr2循环体假(0)真(非0)forexpr1expr366for语句一般应用形式:for(循环变量赋初值;循环条件;循环变量增值){
循环体语句;}
说明:
for语句中expr1,expr2,expr3类型任意且都可省略,但分号;不可省
无限循环:for(;;)67for语句-说明1.for语句的一般形式中,表达式1、表达式2
和表达式3都可以省略。表达式1省略:表示没有赋初值部分,或在for语句前已为有关变量赋了初值。例:
求
s=1+2+…+100s=0;i=1;for(;i<=100;i++)s+=i;68表达式2省略:表示循环条件永远为真,可能循环体内有控制转移语句转出for语句。例:
for(s=0,i=1;;i++){s+=i;if(i==100)break;}表达式3省略:表示没有修正部分,对变量的修正已在循环体内一起完成。
for(s=0,i=1;i<=100;)s+=i++;for语句-说明(续)69
不管表达式1、表达式2和表达式3省略情况如何,其中两个分号都不能省略。如果三个表达式都省略,用以下形式表示:
for(;;)
语句表达式1、表达式2和表达式3都可包含逗号运算符,由多个子表达式组成。例:for(s=0,i=1;i<=100;i++)s+=i;for语句-说明(续)70对于
s=1+2+…+100的计算下面都是合理的for语句描述。①for(s=0,i=1;i<=100;s+=i,i++);②for(s=0,i=1;s+=i,i<100;i++);③for(s=0,i=0;i<100;++i,s+=i);④for(s=0,i=1;i<=100;s+=i++);for语句-说明(续)71
归纳总结
while、do~while和for循环结构中的“循环 体”都只能是一条语句!如果需要使用多条 语句来完成的循环体的功能,则应使这些语 句组成一条复合语句!72
写出程序结果#include<stdio.h>voidmain(){ intv1=0,v2=0; charch; while((ch=getchar())!='#') switch(ch) { case'a': case'h': case'o':v2++; default:v1++; } printf("v1=%d,v2=%d",v1,v2);}如从键盘输入china#<回车>答案:v1=5,v2=273习题
求下列循环体的执行次数
for(inti=0,j=3;i<=j+1;i+=2,j--) printf(“%d”,i);答案:两次74
课堂练习(for
语句)选择题:〔共两题〕1、若有intx;且有下面程序片段,则输出结果是__________。
for(x=3;x<6;x++)printf((x%2)?"**%d":"##%d\n",x);A.**3B.##3C.##3D.**3##4##4**4**4##5**5**5##5答案:D75
课堂练习(for
语句)2、有以下程序:voidmain(){ intx,I; for(I=1;I<=50;I++) { x=I; if(++x%2==0) if(x%3==0) if(x%7==0)printf(“%d”,I);}}输出结果是_________A.28 B.27C.42D.41答案:D76辅助控制语句
1、break语句功能:在循环语句和switch语句中,终止并跳出循环体或开关体说明:break只能终止并跳出最近一层的结构break不能用于循环语句和switch语句之外的任何其它语句之中77break语句的应用流程图(1)expr……break;……假(0)真(非0)whiledo……break;…...expr假(0)真(非0)while78break语句的应用流程图expr2……break;…...假(0)真(非0)forexpr1expr3语句组1break;switchexpr语句组2break;语句组nbreak;语句组break;…...const1const2constndefaultcase792、continue语句
功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断仅用于循环语句中80expr2……continue;…...假(0)真(非0)forexpr1expr3continue语句的应用流程图(1)81expr……continue;……假(0)真(非0)whilecontinue语句的应用流程图(2)真(非0)do……continue;…...expr假(0)while82for语句中
break和continue的对比expr2……break;…...假(0)真(非0)forexpr1expr3expr2……continue;…...假(0)真(非0)forexpr1expr383C++语言的跳转语句中,对于break和continue说法正确的是().A)break语句只使用于循环体中B)continue语句只应用于循环体中C)break是无条件跳转语句,continue不是D)break和continue的跳转范围不够明确,容易产生问题
课堂练习(break和continue语句)答案:B84循环的嵌套
循环的嵌套:一个循环体内又包含另一个完整的循环结构三种循环可互相嵌套,层数不限外层循环可包含两个以上内循环,但不能相互交叉嵌套循环的几种常见形式:(1)
while(){……while(){ ……}…...}(2)do{……do{……}while(); …...}while();85
嵌套循环的常见形式举例
(4)for(;;){……do{……}while();……while(){……}…...}内循环外循环内循环(3)while(){……do{……}while();…….}86
循环嵌套中的跳转问题
禁止:从外层跳入内层跳入同层的另一循环中向上跳转87
课堂练习(综合题1
)选择题:〔共两题〕1、有以下程序#include<stdio.h>voidmain()//循环的嵌套{ intI,j; for(j=10;j<12;j++) { for(I=9;I<=j;I++) {if(!(j%I))break;printf("%d",I);} if(I>j)printf("%d",j); }}输出结果为_________A.91011 B.9910C.1011D.101011答案:B88
课堂练习(综合题2)2、有以下程序#include<stdio.h>voidmain(){ inta,b; for(a=1,b=1;a<=100;a++) { if(b>10)break; if(b%3==1) {b+=3;continue;} printf("%d",b); }printf("%d\n",a);}输出结果为_________4710135B)4710136C)5D)4答案:C89程序举例1.猴子吃桃问题
有一只猴子第一天摘了若干个桃子,当天吃了一半,可后来嘴馋,又多吃了一个;第二天早上又吃掉剩下桃子的一半后,又多吃了一个;以后每天都按照相同的规律吃掉前一天剩下桃子的一半再多一个,到第10天早上来吃时,发现只剩下一个桃子,请编程求出第一天摘了多少个桃子分析:设第十天早上剩下的桃子数为num,则第九天早上剩下的桃子数为多少? 第九天早上剩下的桃子数为:2*(num+1)
第八天早上剩下的桃子数为:2*(2*(num+1)+1) 依次类推,可以编程求出第一天摘了多少个桃子90
程序代码(第1题)#include<stdio.h>voidmain(
){ intnum=1; inti; for(i=9;i>=1;i--) num=2*(num+1); printf("num=%d",num);}91写出程序结果#include<stdio.h>voidmain(){ inti,j,sum,m,n=4; sum=0; for(i=1;i<=n;i++) { m=1; for(j=1;j<=i;j++) m=m*j;sum=sum+m; } printf("sum=%d\n",sum);}答案:sum=3392写出程序结果#include<stdio.h>voidmain(){ inta,b; for(a=1,b=0;a<=100;a++) { if(b>=20)break; if(b%3==1) { b+=3; continue; } b+=5; } printf("a=%d\t",a);} 答案:a=793课堂练习1.编写程序求任意一个正整数的各位数字之和,并逆序输出.例如:输入25483,则各位数字之和为22,逆序输出384522.编程求1!+2!+3!+…+10!94#include<stdio.h>voidmain(){ intx,copy,sum=0,y=0; scanf("%d",&x); printf("该数的逆序是:"); copy=x; while(copy) { y=y*10+copy%10;sum+=copy%10; printf("%d",copy%10); copy/=10; } printf("\n各位数字和为%d\n",sum); if(x==y)printf("%d是对称数",x); elseprintf("%d不是对称数",x);}第一题参考答案95for语句-例【例3.18】编制一个程序,实现输入n个整数,输出其中的最大数,并指出其是第几个数。#include<stdio.h>voidmain(){intn,i,max,x,index;printf("输入n!\n");scanf("%d",&n);for(i=1;i<=n;i++){printf("输入第%d个数据.",i);scanf("%d",&x);96if(i==1){/*第一次输入,直接用x为max置初值*/
max=x;index=1;continue;}/*i为1时,不再执行以下语句,直接进入下一轮循环*/
if(x>max){/*输入了一个更大的数*/max=x;index=i; }}printf("最大数是:%d,它是第%d个数。\n\n",max,index);}for语句-例(续)973.4.4三种循环语句比较【例3.19】p=1-1/3+1/5-1/7+…要求:当某项的绝对值小于0.000001时程序结束。一、使用while循环语句
对当前项t的绝对值不小于0.000001时循环求和,并修正变量d(作为分母)和t,其代码为:
p=0.0;d=1;t=1.0;while(fabs(t)>=1.0e-6){p+=t;d+=2;/*后一项的分母递增2*/t=(d-1)%4?-1.0/d:1.0/d;}/*(d-1)能除尽4则当前项为正,否则为负*/98二、使用do-while循环语句
循环求和,并修正变量d(作为分母)和t(作为当前项),直至新的t的绝对值小于0.000001时结束,其代码为:【例3.19】p=1-1/3+1/5-1/7+…
p=0.0;d=1;t=1.0;do{p+=t;d+=2;/*后一项的分母递增2*/t=(d-1)%4?-1.0/d:1.0/d;}while(fabs(t)>=1.0e-6);99三、使用for循环语句
从变量d(作为分母)初值为1.0、t(作为当前项)初值为1.0开始,当t的绝对值不小于0.000001时循环求和,每次循环后相应地修正变量d和t,其代码为:【例3.19】p=1-1/3+1/5-1/7+…
for(p=0.0,d=1,t=1.0;fabs(t)>=1.0e-6;d+=2,t=(d-1)%4?-1.0/d:1.0/d)p+=t;1003.4.5嵌套的循环结构
当循环结构的循环体中又包含循环结构时,称为循环结构的嵌套。在实际应用中,三种循环语句可以相互嵌套,会呈现多种复杂形式。【例3.20】已知直角三角形每边长为25以内的整数,求出所有这样的直角三角形三边长。设:三边长为a、b、c,且c>b>=a。用三重嵌套的for语句实现。设最外层的c的变化范围是3~25;对于确定的c、内层的b的取值范围是1~c-1;最内层的a的取值范围是1~b。101循环嵌套-【例3.20】P.58#include<stdio.h>voidmain(){inta,b,c;for(c=3;c<=25;c++)for(b=1;b<c;b++)for(a=1;a<=b;a++)if(a*a+b*b==c*c){printf("A=%d\tB=%d\tC=%d\n",a,b,c);scanf("%*c");/*等待输入回车后继续执行*/ }/*按回车后显示下一个满足条件结果*/}运行结果:A=3B=4C=5A=6B=8C=10A=5B=12C=13A=9B=12C=15A=8B=15C=17A=12B=16C=20A=15B=20C=25A=7B=24C=25
102【例3.21】甲,乙,丙三位球迷分别预测已进入半决赛的四队A、B、C、D的名次如下:甲预测:A第一名、B第二名乙预测:C第一名、D第三名丙预测:D第二名、A第三名设比赛结果,四队名次互不相同,并且甲、乙、丙的预测各对一半。求:A、B、C、D四队的名次。循环嵌套-【例3.21】P.59103
令变量a、b、c、d分别表示四队的名次,对四队所有可能的名次组合作循环测试,就能找到解。甲的预测:预测对了一半。若A是第一名,则B不会是第二名;或者A不是第一名,则B必须是第二名。用逻辑运算与关系运算描述如下:
a==1&&b!=2||a!=1&&b==2
考虑:A是第一名和B是第二名不允许同时成立,即条件a==1和b==2不允许相等。这样预测对一半的条件可写成: (a==1)!=(b==2)乙预测的条件为:(c==1)!=(d==3)
丙预测的条件为:(d==2)!=(a==3)
循环嵌套-【例3.21】分析104#include<stdio.h>voidmain(){inta,b,c,d,t;for(a=1;a<=4;a++)for(b=1;b<=4;b++){if(b==a)continue;/*两队名次不可相同,取下一个b值*/for(c=1;c<=4;c++){if(c==a||c==b)continue;/*取下一个c值*/d=10-a-b-c; /*4队名次之和为10*/t=((a==1)!=(b==2))&&((c==1)!=(d==3))&&((d==2)!=(a==3));if(t)printf("A=%d,B=%d,C=%d,D=%d\n",a,b,c,d);
}}}循环嵌套
-【例3.21】程序输出结果:A=3,B=2,C=1,D=41053.5简单程序设计实例【例3.22】输入整数n,输出由2*n+1行、2*n+1列组成的以下形式(n=2)的图案。
*************分析:图案上面由n+1行,下面有n行。同一行上的两个星号字符之间有一个空格符。对于上半部分,设第一行的星号字符位于屏幕的中间,则后行图案的起始位置比前行起始位置提前两个位置。而对于下半部,第一行的起始位置比上半部最后一行起始位置前进两个字符位置,以后各行也相继进两个位置。上半部分下半部分106【例3.22】程序P.60#include<stdio.h>voidmain(){intn,j,k,space;printf("Entern!\n");scanf("%d",&n);space=40;for(j=0;j<=n;j++,space-=2){printf("%*c",space,''); /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度广告公司与广告主之间的广告发布合同2篇
- 二零二五年度房产买卖合同10(附带车位)3篇
- 2025版锅炉设备报废回收买卖合同范本及处理流程3篇
- 2025年协议离婚财产分割执行与婚姻关系终止全程服务合同3篇
- 二零二五年度家庭健康体检与评估合同3篇
- 二零二五年度康师傅饮品系列产品定制加工及全球销售合同3篇
- 二零二五年度出口贸易合同的国际贸易人才培养与合作开发协议2篇
- 海南职业技术学院《电力电子数字控制》2023-2024学年第一学期期末试卷
- 海南卫生健康职业学院《微纳加工与制造》2023-2024学年第一学期期末试卷
- 海南外国语职业学院《建筑与规划设计》2023-2024学年第一学期期末试卷
- 陕西2020-2024年中考英语五年真题汇编学生版-专题09 阅读七选五
- 多源数据融合平台建设方案
- 2023-2024学年上海市普陀区三年级(上)期末数学试卷
- 居家养老上门服务投标文件
- 浙江省宁波市鄞州区2024年七年级上学期期末数学试题【含答案】
- 浙江省杭州市钱塘区2023-2024学年四年级上学期语文期末试卷
- 《闻泰科技并购安世半导体的风险应对案例探析》8200字(论文)
- 肝断面引流管护理
- GB/T 44713-2024节地生态安葬服务指南
- 2024年形势与政策 第一讲《读懂中国式现代化》
- 2024-2025学年苏教版四年级上册期末自主测试数学试卷(一)(含答案解析)
评论
0/150
提交评论