c语言chap控制结构.pptx
本章内容3.1 顺序结构与基本输入输出3.2 分支结构3.3 循环结构3.4 循环程序设计3.5 应用举例第1页/共128页3.1 顺序结构与基本输入输出 3.1.1 C语句概述 3.1.2 顺序结构程序设计 3.1.3 字符输入输出 3.1.4 格式输入输出 第2页/共128页3.1.1 C语句概述源程序的基本组成单位是语句,语句用于完成一定的操作任务。C语句有以下五类:1 1说明语句说明语句变量定义、变量说明、函数说明、结构说明等 int x,y=4;定义整形变量x、y,并初始化变量yextern int x,y;说明整形变量x、y是已被定义的全局变量int max(int,int);声明函数max第3页/共128页3.1.1 C语句概述2.2.控制语句,完成程序流程控制控制语句,完成程序流程控制if()else 选择结构语句for()循环语句switch多分支选择结构语句return 从函数返回语句第4页/共128页3.3.表达式语句:在表达式后面加分号构成。表达式语句:在表达式后面加分号构成。例:a=3;/*赋值语句*/i+;/*算术表达式语句*/表达式能构成语句是C的特色。4.4.空语句:空语句:只有分号“;”组成的语句,什么也不执行,但占据了一个语句的位置,也起一条语句的作用。常用于需要一个语句但不需要任何操作的情况。3.1.1 C语句概述第5页/共128页5 5复合语句(语句块)复合语句(语句块)由大括号 括起来的语句序列,在语法上复合语句被看作一条语句。例:int x,y;z=x+y;t=z/100;printf(%f,t);复合语句常用于任何需要一条语句的地方。3.1.1 C语句概述第6页/共128页3.1.2 顺序结构程序设计例3-1 键盘输入一个三位数,输出逆序后的数。#includevoid main()int x,y,a,b,c;printf(Please input a num:);scanf(%d,&x);a=x/100;b=x/10%10;c=x%10;y=100*c+10*b+a;printf(x=%d,y=%dn,x,y);顺序结构,就是语句按照编写的顺序依次执行。第7页/共128页C中的输入输出1C本身没有输入输出语句,数据的I/O由函数实现。2源程序的开头使用如下语句:#include#include“stdio.h”第8页/共128页3.1.3字符输入输出1.字符输出函数putchar()int putchar(int c)作用:向终端输出一个字符。参数C可以int型与char型。第9页/共128页例:#include stdio.h void main()char a,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(c);程序输出:BOY 注:若要输出小写的boy,程序怎样修改?若没有#include“stdio.h”会怎样?实例第10页/共128页函数参数可以是转义字符例:putchar(n);输出换行符putchar(101);输出字符 Aputchar();输出单引号 putchar(012);输出换行符putchar(015);输出回车.不换行,光标到本行首转义字符第11页/共128页2字符输入函数getchar()形式:int getchar(void)作用:从stdin(键盘)输入一个字符,同时有回显。函数无参数,返回接收到的输入字符原型定义:stdio.h常用用法:变量=getchar();第12页/共128页#include stdio.hvoid main()char c;c=getchar();putchar(c);putchar(getchar();输出(如在键盘上输入“a”):aa实例第13页/共128页3.1.4 格式输入与输出 1.格式输出函数printf()作用:按指定的格式输出指定数据一、printf()的一般格式printf(格式控制,输出列表);例:int i=3;double f=4.56;printf(i=%d,f=%lfn,i,f);第14页/共128页1.格式控制:控制按指定格式输出后面的参数。以“”括起。格式控制组成:普通字符(不含%的字符),原样输出(可为转义字符)格式说明符(%格式字符),控制输出数据的格式。2.输出表列:需要输出的数据,以,分隔。可为常、变量、表达式、函数,受格式控制中格式符的控制。也可以没有输出表列,如:l printf(“NametAddtTeln”);printf函数格式第15页/共128页二、格式字符1.d格式符:按十进制有符号数格式输出d按int型数据实际长度输出%md 按m指定的宽度输出(不足补空格,大于m位时按实际长度输出),右对齐%ld,%mld 输出long int 型数据,m指定输出宽度%hd,%mhd输出short int型数据%0md,%0mld,%0mhd 0(数字0)表示位数不足m时补0%-md,%-mld 左对齐输出,右边补空格 注:%后面的m(位数控制)、0(位数不足补0)对于其他格式符也适用。第16页/共128页例:(表示空格)int i=123;long j=123456;printf(%d%5d%05d,%ld%8ld%08ld,i,i,i,j,j,j);结果:12312300123,12345612345600123456 强调:对long型数据要用%ld输出,若用%d可能会发生错误。同理,short int 数据要用%hd第17页/共128页2.o(字母)格式符:按八进制无符号数的格式输出。符号位作为数一并输出。例:short int a=-1;printf(“a=%hd,%hon”,a,a);结果:a=-1,1777773、x格式符:按十六进制无符号数格式输出int型数。4、u格式符:以无符号十进制形式输出整数对long int数据都需要附加l,对short int 需要附加h如%lo,%10hx,%-10lo第18页/共128页5、c格式符:以字符形式输出。例:char c=101;printf(%c,c);也可以使用:%mc、%-mc 第19页/共128页6、s格式符:以字符串格式输出。%s例:printf(%s,CHINA);%ms m指定宽度(不足时左补空格,大于时按实际宽度输出),右对齐%-ms 左对齐,不足m时右补空格%m.ns 输出占m列,取字符串左端n个字符,左补空格%-m.ns 同上,n个字符输出,占m列,右补空格 第20页/共128页7、f格式符:按小数格式输出实数。printf(%0.3f,123.45678);显示 123.457%f按小数格式输出,整数部分全输出,6位小数%m.nf输出占m列(含小数点),其中n位小数(四舍五入)%-m.nf同上,左对齐%lf用于double型数据第21页/共128页8.e格式符:以标准指数形式输出实数%e 指数形式输出实数,尾数保留6位小数。%m.ne n指保留尾数部分小数位数,右对齐%-m.ne 左对齐%ledouble a=-1.1e300;printf(a=%le,sizeof=%dn,a,sizeof(a);输出:a=-1.100000e+300,sizeof=8第22页/共128页2格式输入函数scanf()一、一般格式作用:按规定格式输入形式:int scanf(格式控制,地址列表)原型定义:stdio.h将键盘输入的数据按指定的格式接收、转换后,送到相应的地址中。第23页/共128页#include stdio.h void main()int a,b,c;scanf(%d%d%d,&a,&b,&c);printf(%d,%o,%xn,a,b,c);运行时输入:101112 程序输出:10,13,c第24页/共128页二、格式说明与printf()的格式控制类似格式字符说明d 用于输入十进制数o用于输入八进制数x用于输入十六进制数c用于接收单个字符s接收字符串认为空格是结束符f用于输入实数(小数或指数均可接收)e与f相同附加格式说明符l用于long(%ld)和double(%lf)型数据h用于短整型数据(%hd、%ho、%hx)域宽(一个正整数)指定输入所占宽度*表示对应输入量不赋给一个变量第25页/共128页1.可以指定输入数据的列数,系统自动按它截取所需数据。例:scanf(%2d%3d,&a,&b);输入 123456系统自动将12赋给a,345赋给b。2.*格式用于跳过一个数据域scanf(%2d%*3d%2d,&a,&b);输入:1234567结果,a=12,345被跳过,b=67。*主要用于利用现有数据时,跳过某些数据项。3.输入实数不能规定精度如:scanf(%7.2f,&a);说明第26页/共128页1、sacnf()中的变量必须使用地址。int a,b;scanf(“%d,%d”,a,b);错误 scanf(“%d,%d”,&a,&b);正确2、scanf()的“格式控制”中,可以使用普通字符,但在输入时必须输入这些字符,成为 数据输入时的分隔符。例:scanf(%d,%d,&a,&b);输入:3,4(逗号与%d,%d中的逗号对应)三.使用scanf()函数的注意事项第27页/共128页例:scanf(%d%d,&a,&b);输入:34(两个或以上空格)例:scanf(%d:%d:%d,&h,&m,&s);输入:12:23:36(与格式控制中的冒号对应)例:scanf(a=%d,b=%d,c=%d,&a,&b,&c);输入:a=12,b=24,c=36(a=,b=,c=及逗号与格式控制相对应)第28页/共128页3、在用“%c”输入时,空格、回车、TAB等均作为有效字符被接收。例:scanf(%c%c%c,&c1,&c2,&c3);输入:abc结果:ac1,c2,bc3(其余被丢弃)若输入:123ab结果:1c1,2c2,3c3 第29页/共128页4、输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数)。遇空格、“回车”、“跳格”键或用户指定的分隔符。遇宽度结束。遇非法输入。第30页/共128页5、注意%c与%d混合使用时的问题。例:scanf(“%c%d%c”,&a,&b,&c);执行:a12c 结果:a=a,b=12,c=c a12c 结果:a=a,b=12,c=6、数据类型与格式符匹配使用%f%lf 用于实型%d%o%x 用于整型%c 用于字符型第31页/共128页问题与讨论1.scanf函数变量名前没有&会怎样?编译器会报错吗?2.a=getchar()与 scanf(%c,&a)的异同3.怎样设计scanf使得输入数据时减少出错?第32页/共128页3.2 分支结构 程序需要进行比较与逻辑判断,根据判断结果决定不同的操作。确定判断的条件确定判断结果为“真”或“假”时执行的不同操作 第33页/共128页2.2.4 关系运算符与关系表达式 关系运算:也称比较运算,比较两个运算对象的大小。关系表达式:关系运算符连接的式子,关系表达式可能结果有:“真”(true)和“假”(false)。例:a 3、a=3、a!=3第34页/共128页1.关系运算符及其优先次序 小于优先级相同(高)大于=大于等于=等于优先级相同(低)!=不等于第35页/共128页中的逻辑值:(假)(真)关系表达式:用关系运算符连接的表达式。关系表达式的值:0、1 与int 型等效例:若a=3,b=2,c=1,则:ab 真,表达式的值为1(ab)=c真,表达式的值为1b+cb d的值等于1f=abc f的值等于0 注意:数学式abc应写为ab&bc2.关系表达式第36页/共128页3.关系运算的特点右结合双目运算符优先级例:ca+b 等效于c(a+b)ab!=c 等效于(ab)!=c a=bc 等效于a=(bc 等效于a=(bc)第37页/共128页2.3.3 逻辑运算符与逻辑表达式1.逻辑运算符及其优先次序&逻辑与“双目运算符”:要求两个操作数,如:(ab)&(xy)|逻辑或!逻辑非单目运算符,要求一个操作数,如:!(ab)优先级:!高于&高于|第38页/共128页1&1=11&0=00&1=00&0=01|1=11|0=10|1=10|0=0!1=0!0=1逻辑运算规则表混合运算:!a&b=c|x*2y+3&c+按右图优先级运算。第39页/共128页用逻辑运算符将关系表达式或逻辑量连接起来。在C中,参与逻辑运算的数据可为任意类型,非0即为真,0为假。例:a+b|c值为1 a&0值为0 53&2|83)&(b=a=b)&(b=31)后 a的值为1,b的值为0应用:常直接用逻辑表达式构造条件。例如闰年条件:(y%4=0&y%100!=0)|(y%400=0)第42页/共128页条件语句块1语句块2exprstatement1statement2非0=03.2 分支结构 3.2.1 if语句1.if-else分支if(表达式)语句块1;else 语句块2;第43页/共128页例3-6 输入一个字符,判断它是否为英文小写字母。#include void main()char c;printf(Please input a character:);c=getchar();if(c=a&c=60)printf(Passedn);else printf(Failedn);printf(You must take this course againn);变量score的值大于60时,程序将输出:PassedYou must take this course again第46页/共128页if-else使用说明(3)ifelse语句执行完毕后执行ifelse的后续语句。系统将整个ifelse结构处理为一条语句单元。第47页/共128页2.if 分支if(表达式)语句;exprstatement非0=0条件语句1第48页/共128页例3-9 输入三个数,按由小到大的顺序输出#includevoid main()int a,b,c,t;scanf(%d%d%d,&a,&b,&c);if(ab)t=a;a=b;b=t;/*变量a与b互换,t为中间变量*/if(ac)t=a;a=c;c=t;if(bc)t=b;b=c;c=t;printf(%d,%d,%dn,a,b,c);第49页/共128页例3-8 设计一个加法计算训练程序,由机器随机产生两个整数,让用户计算两数之和,若用户计算正确则打印“Right”,否则打印“Wrong”。#includevoid main()int a,b,s;a=rand();/*rand()是库函数,随机产生一个0-32767之间的数*/b=rand();printf(%d+%d=,a,b);scanf(%d,&s);/*用户输入结果*/if(s=a+b)/*计算机判断用户结果是否正确*/printf(Rightn);else printf(Wrongn);第50页/共128页 常见错误 多条语句为内嵌时忘记用 括起来。在if(表达式)之后多加一个分号。比较运算符“=”与赋值运算符“=”混淆使用。最常见的错误为:if(if(x=1x=1)误写为:if(if(x=1x=1)无论x的原值是什么,赋值表达式x=1的值总为1,其作为条件时恒为真。第51页/共128页3.ifelse ifelse 多分支if(表达式1)语句1;elseIf(表达式2)语句2;elseIf(表达式3)语句3elseif(表达式m)语句melse 语句n条件语句1条件2语句2语句3条件3第52页/共128页第53页/共128页例3-10 应用多分支结构编写此程序,根据用户输入的自变量x的值,计算y的值。第54页/共128页void main()float x;printf(please input x:);scanf(%f,&x);if(x0.0)printf(y=0n);else if(x=30)printf(y=%fn,x);else if(x=60)printf(y=%fn,x*x);else printf(y=%fn,x*x*x);例 3-10第55页/共128页条件语句1语句2条件语句1条件语句1条件2语句2语句3条件3分支结构流程图第56页/共128页条件语句1语句2条件语句1条件语句组语句组条件条件语句组语句组语句组语句组语句组语句组If-else 嵌套流程图第57页/共128页3.2.2 if语句的嵌套 if(条件表达式1)if(条件表达式2)程序块1;else 程序块2;else if(条件表达式3)程序块3;else 程序块4;ifelse的内嵌程序块中又包含一个或多个ifelse语句称为if语句的嵌套,常用于实现多路选择。第58页/共128页嵌套if语句时,必须特别注意if与else配对。配对原则:从最内层开始,else总是与它上面最接近的(未曾配对的)if配对。避免if与else配对错位的最佳办法是加大括号,同时,为了便于阅读,使用适当的缩进,(只有大括号能保证if和else不错位配对,缩进仅便于阅读)If与else的匹配第59页/共128页例: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”);实现 if else 正确配对方法:加 实现if else 正确配对方法第60页/共128页if(p1)if(p2)语句A;else if(p3)语句B;else 语句C;语句D;比较差异:if(p1)if(p2)语句A;else if(p3)语句B;else 语句C;语句D;第61页/共128页#include void main()int a,b,c,max;printf(please input three numbers:n);scanf(%d%d%d,&a,&b,&c);max=a;if(cb)if(ca)max=c;else if(ba)max=b;printf(the max is%dn,max);max=a;if(cb)if(ca)max=c;else if(ba)max=b;printf(the max is%dn,max);运行时:please input three numbers:输入:2 5 3输出:the max is 2第62页/共128页良好习惯(1)相配对的if与else书写于同一列上,内嵌语句缩格书写,以表明层次结构。(2)if语句多重嵌套实现多路选择时,应尽可能的在else中分支,即在else中嵌套另一个if语句,而不要在if中嵌套。(3)具体实现时,每一个 if的条件为真时只有唯一的一种情况,而将剩余的各路选择放在else中一次次细分。第63页/共128页在if语句中,在“表达式”为“真”和“假”时,都只执行一个赋值语句给同一个变量赋值,例如:if(ab)max=a;else max=b;可以用如下赋值语句来处理:max=(ab)?a:b;条件运算符要求有三个操作对象,称为“三目运算符”(它是C语言中唯一的一个三目运算符)。3.2.3 条件运算符 第64页/共128页条件表达式的一般形式:表达式1?表达式2:表达式3说明:1执行顺序:先求解表达式1的值,若其为真,求解表达式2的值,做为整个条件表达式的值;若表达式1为假,则求解表达式3的值,且整个条件表达式的值等于表达式3。max=(ab)?a:b 把条件表达式的值赋给max。3.2.3 条件运算符第65页/共128页2优先级:高于赋值运算符,低于算术运算符、关系运算符和逻辑运算。max=(ab)?a:b max=ab?a:bab?a:b+1 (ab)?a:(b+1)3结合性:右结合。ab?a:cd?c:d (ab)?a:(cd?c:d)4ifelse与条件表达式的替代:if(ab)printf(%d,a);else printf(%d,b);替代:printf(%d,ab?a:b);条件运算符说明第66页/共128页5表达式1、表达式2、表达式3的类型可以不同。6可以嵌套。max=(ab?a:b)c?(ab?a:b):c例:P48 例3-13,大小写转换。(read)if(ch=a&ch=z&ch=z)?32:0条件运算符说明第67页/共128页3.2.4 switch语句 其一般形式:switch(表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;case 常量表达式n:语句n;break;default:语句n+1 不能省各常量值必须不相等break用于跳出switch第68页/共128页例:根据考试成绩的等级(grade)打印出百分制分数段:grade=getchar();switch(grade)case A:printf(“90100n);case B:printf(7589n);case C:printf(6074n);case D:printf(60n);default:printf(errorn);如果输入A,回车,输出?当grade=A时,程序从printf(“90100n)开始执行,因此输出结果为:90100 7589 6074 60n);break;7、case后面必须是整形常量或字符型常量。Switch说明第71页/共128页例3-15 五分制成绩转换成百分制#include void main()char c1,c2;printf(please input the score:);scanf(%c%c,&c1,&c2);第72页/共128页例3-15 五分制成绩转换成百分制switch(c1)switch(c1)case 5:switch(c2)case 5:switch(c2)case+:printf(100n);break;case+:printf(100n);break;case n:printf(90n);break;case n:printf(90n);break;case-:printf(85n);break;case-:printf(85n);break;break;break;case 4:switch(c2)case 4:switch(c2)case+:printf(80n);break;case+:printf(80n);break;case n:printf(75n);break;case n:printf(75n);break;case-:printf(70n);break;case-:printf(70n);break;break;break;case 3:printf(60n);break;case 3:printf(60n);break;case 2:case 2:case 1:printf(60n);break;case 1:printf(60n);break;第73页/共128页3.3 循环结构 在一个算法中,某些步骤需要反复多次地执行时,需要设计一个循环。循环是在给定循环条件为真时由计算机重复执行一组循环体语句的控制结构。循环结构是结构化程序三种基本结构之一。构建循环让计算机反复执行一组操作语句,从而完成大量类同的计算。第74页/共128页根据开始循环的初始条件和结束循环的条件不同,C语言中用如下语句实现循环1、用while语句。2、用do-while语句。3、用for语句。循环构成第75页/共128页3.3.1 while语句 一般形式:while(表达式)循环体语句;作用:实现“当型”循环。当“表达式”为非0(真)时,执行“循环体语句”,其后回到循环开始while处再次判断表达式真假,直至表达式为假,结束循环,执行while后续。特点:循环体只能是一条语句。若有多条语句,使用 使之成为复合语句。表达式一般是关系或逻辑表达式。当然,在C中也可以为任意类型表达式。第76页/共128页循环结构流程图第77页/共128页实例例3-16 求 void main()int i,n,sum=0;i=1;printf(“please input:”);scanf(“%d”,&n);while(i 0);printf(“s=%dn”,s);第80页/共128页例3-17 计算x的y次方#include#includevoid main()int y,i;double x,z;printf(Please input x and y:);scanf(%lf%d,&x,&y);z=1;i=1;do z*=x;i+;while(i=fabs(y);if(y0)z=1/z;printf(result=%lfn,z);循环条件一开始为假,循环执行一次。第81页/共128页while和do-while是可以互换的。在一般情况下,用while和do-while语句解决同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但当循环条件一开始就为“假”时,两种循环的结果不同。这是因为此时while循环的循环不被执行,而do-while循环的循环体被执行一次。While 和do-while第82页/共128页例3-17 计算x的y次方 修正#include#includevoid main()int y,i;double x,z;printf(Please input x and y:);scanf(%lf%d,&x,&y);z=1;i=1;if(y!=0)do z*=x;i+;while(i=fabs(y);if(y0)z=1/z;printf(result=%lfn,z);第83页/共128页3.3.3 for语句 for(表达式1;表达式2;表达式3)循环体语句;执行过程:(1)求表达式1;(2)求表达式2,若为“真”,执行“循环语句”;若为假,转第(5)步。(3)求表达式3。(4)转第(2)步。(5)执行for语句下面的语句。第84页/共128页for 循环流程图第85页/共128页例3-18 用for循环求1+2+3+100#includevoid main()int i,sum;for(i=1,sum=0;i=100;i+)sum+=i;printf(sum=%dn,sum);第86页/共128页for语句中:“表达式1”循环变量初始化“表达式2”判别循环条件“表达式3”循环控制变量更新例:for(sum=0,i=1;i=100;i+)sum=sum+i;这里,循环条件由变量i设定,变量i称为“循环变量”。for语句 第87页/共128页(1)表达式1和表达式3经常是逗号表达式,可以分别或同时省略。for语句省略“表达式1”。“表达式1”的作用是设定循环初始条件,“表达式1”省略后,应在for语句前面设置循环初始条件。例:i=1;for(;i=100;i+)sum=sum+i;/*注意,“表达式1”后面的分号不能省略*/for语句 说明第88页/共128页for语句省略“表达式3”。表达式3用于修改控制循环条件(修正循环变量的值),若省略,应在循环体语句中增加修改循环变量值的语句,以保证循环能正常结束。例:for(sum=0,i=1;i=100;)sum=sum+i;i+;for语句 说明第89页/共128页for语句 说明同时省略“表达式1”和“表达式3”,只有“表达式2”。例:i=1;sum=0;for(;i=100;)sum+=i;i+;i=1;sum=0;for(;i=100;)sum+=i+;第90页/共128页(2)表达式2是循环条件。如果省略“表达式2(循环条件)”,则不判别循环条件,认为循环循环条件始终为“真”,循环将无终止地进行下去。for(i=1,sum=0;i+)sum+=i;相当于:for(i=1,sum=0;1;i+)sum+=i;(3)循环体只能是一条语句,若包含多条语句,应用 括起来。for语句 说明第91页/共128页(4 4)forfor语句的其他变形例1:for(sum=0,i=1;i100)break;(5)5)各表达式可为逗号表达式 for(i=0,j=100;i=j;i+,j-)k=i+j;for语句 说明第92页/共128页例3-19用for语句计算x的y次方,y为整数。x与y的值都由键盘输入。void main()int y,i;double x,z;printf(Please input x and y:);scanf(%lf%d,&x,&y);for(z=1,i=1;i=fabs(y);i+)z*=x;if(y0)z=1/z;printf(result=%lfn,z);第93页/共128页例3-20 求最高分与平均分例3-20 歌手大奖赛,有裁判12人。编写计算歌手得分程序,键盘输入12个成绩,输出最高分、最低分与最终得分。#define N 12void main()int i;float score,max,min,sum,aver;scanf(%f,&score);max=min=sum=score;for(i=1;imax)max=score;if(scoremin)min=score;sum+=score;aver=(sum-max-min)/(N-2);printf(max=%6.2f,min=%6.2f,average=%6.2fn,max,min,aver);第94页/共128页3.3.4 循环的嵌套 循环嵌套:一个循环(称为“外循环”)的循环体内包含另一个循环(称为“内循环”)。内循环中还可以包含循环,形成多层循环。(循环嵌套的层数理论上无限制)。三种循环(while、do-while、for)可以互相嵌套。多重循环的使用与单一循环完全相同,但应特别注意内、外层循环条件的变化。内、外层循环变量赋初值的位置、变量名的使用等。注意:外循环必须完整地包含内循环。do while()for(;)do while();while();第95页/共128页例:1!+2!+3!+n!void main()long s=0,k;int i,n,j;scanf(“%d”,&n);for(i=1;i=n;i+)k=1;for(j=1;j=i;j+)k*=j;s+=k;printf(“s=%ldn”,s);void main()long s=0,k;int i,n,j;k=1;scanf(“%d”,&n);for(i=1;i=n;i+)for(j=1;j=i;j+)k*=j;s+=k;printf(“s=%ldn”,s);求1!+1!*2!+1!*2!*n!第96页/共128页void main()void main()long s=0,k;long s=0,k;int i,n;int i,n;scanf(“%d”,&n);scanf(“%d”,&n);for(i=1,k=1;i=n;i+)for(i=1,k=1;i=n;i+)k*=i;k*=i;s+=k;s+=k;printf(“s=%ldn”,s);printf(“s=%ldn”,s);第97页/共128页循环嵌套实例例3-21 打印九九乘法表。例3-22 编程输出如下图形:1 222 33333 4444444 555555555第98页/共128页3.3.5 break与continue语句 1.break语句 在while、for、do-while或switch结构中使用,可使程序立即退出该结构,转而执行该结构后的第一条语句。注:break只可跳出所在的一重循环。在多重循环中使用,只能跳出其所在的内层循环。第99页/共128页Break 跳出分析A;While(p1)B;for(C;p2;D)E;if(p3)break;F;G;H;第100页/共128页例3-23 求满足表达式1+2+3+n=1000的最大的n#includevoid main()int i,sum;for(sum=0,i=1;i+)sum+=i;if(sum1000)break;printf(n=%dn,i-1);#includevoid main()int sum=1,i;for(i=1;sum=1000;i+)sum+=i;printf(i=%dn,i-2);第101页/共128页2.continue语句 作用:提前结束本次循环体的执行,回到循环的起始处,接着进行下一次循环条件的判别。说明:1.对于while,continue是回到while处再次判断条件,根据条件决定是否进行下一次循环;2.对do-while,回到do处,重新执行循环体语句,并不判别循环条件。3.对for,来到表达式3处,执行表达式3后再判断表达式2。第102页/共128页While(p1)A;if(p2)continue;doif(p3)continue;B;while(p4);for(C;p5;D)if(p6)continue else break;E;第103页/共128页输出100200之间不能被3整除的数。void main()int n;for(n=100;n=200;n+)if(n%3=0)continue;printf(%5d,n);void main()int n;for(n=100;n=60)。输入时以负数作为输入的结束。void main()int s=1;while(s=0)scanf(%d,&s);if(s60)continue;printf(%d,s);printf(n);第105页/共128页break语句和continue语句 说明1.注意各自的功能while(表达式1)while(表达式1)if(表达式2)if(表达式2)break;continue;break语句跳出循环 continue语句结束本次循环体的执行,进入下一次循环 2.都不能单独使用。break只能用于循环与switch控制结构中,continue只能用于循环控制结构中。第106页/共128页3.3.6 goto语句 (无条件转移语句)一般形式:goto 语句标号功能:无条件转向“语句标号”处执行。语句标号为一个标识符,放在语句前面,用:与语句分隔。goto语句引起一个无条件的转移,会破坏其他控制结构,不符合结构化程序设计原则,破坏了程序结构的清晰,因此,一般应避免使用goto语句。第107页/共128页例3-25 计算n+(n+1)+(n+2)+100#include void main()int i,s=0;scanf(%d,&i);if(i100)printf(Error);goto end;start:/*语句标号*/if(i=100)s+=i+;goto start;printf(s=%d,s);end:printf(n);/*带语句标号的语句*/第108页/共128页3.4 循环程序设计 3.4.1 循环设计循环是在循环条件为真时反复执行的一组计算机指令,是计算机解题的一个重要结构。循环控制有两种基本方法:计数法和标志法。1.计数器控制的循环事先准确地知道循环次数,因此设计一个循环控制变量,由变量值来控制循环次数。每循环一次,循环变量的值会递增(增值通常为1或-1),当其值达到终值时结束循环。第109页/共128页2.标志控制的循环事先不知道准确的循环次数,由某一目标值标记循环的结束。C语言程序所需的任何控制形式可以用下面三种控制结构完成:顺序结构、if结构、while结构。一、循环设计第110页/共128页程序设计的首要工作是算法设计,离开了算法也就没有了程序。算法,是指完成某一项工作而采取的方法和步骤,具体到程序设计,是对解题过程的准确而完整的描述,并用一种程序设计语言的来实现。循环主要用来解决程序设计中两类基本的算法:穷举和迭代。3.4.2 基本算法第111页/共128页穷举的基本思想是对问题的所有可能状态一一测试,直到找到解或将全部可能状态都测试过为止。穷举是一种重复型算法,其核心是设计循环,在循环体中依次测试。例0:最大公因数例1:百钱百鸡例2:最值问题