《c语言chap控制结构实用教案》由会员分享,可在线阅读,更多相关《c语言chap控制结构实用教案(129页珍藏版)》请在金锄头文库上搜索。
1、本章(bnzhn)内容3.1 顺序结构与基本输入输出3.2 分支结构3.3 循环结构3.4 循环程序设计3.5 应用举例第1页/共128页第一页,共129页。3.1顺序结构(jigu)与基本输入输出3.1.1 C语句概述 3.1.2 顺序(shnx)结构程序设计 3.1.3 字符输入输出 3.1.4 格式输入输出 第2页/共128页第二页,共129页。3.1.1C语句(yj)概述源程序的基本组成单位是语句(yj),语句(yj)用于完成一定的操作任务。C语句(yj)有以下五类:1说明语句(yj)变量定义、变量说明、函数说明、结构说明等intx,y=4;定义整形变量x、y,并初始化变量yexter
2、nintx,y;说明整形变量x、y是已被定义的全局变量intmax(int,int);声明函数max第3页/共128页第三页,共129页。3.1.1C语句(yj)概述2. 2. 控制语句,完成程序流程控制控制语句,完成程序流程控制if( )elseif( )else 选择结构语句选择结构语句for() for() 循环语句循环语句switchswitch多分支选择结构语句多分支选择结构语句return return 从函数从函数(hnsh)(hnsh)返回语句返回语句第4页/共128页第四页,共129页。3. 3. 表达式语句:在表达式后面加分号构成。表达式语句:在表达式后面加分号构成。例:例
3、:a = 3a = 3; /* /* 赋值语句赋值语句 */ */i+i+; /* /* 算术表达式语句算术表达式语句 */ */ 表达式能构成语句是表达式能构成语句是C C的特色。的特色。4. 4. 空语句:空语句:只有分号只有分号“;”组成的语句,什么也不执行,但占据了一个语句的位置,也起一条组成的语句,什么也不执行,但占据了一个语句的位置,也起一条语句的作用。语句的作用。 常用常用(chn yn)(chn yn)于需要一个语句但不需要任何操作的情况。于需要一个语句但不需要任何操作的情况。 3.1.1C语句(yj)概述第5页/共128页第五页,共129页。5 5复合语句(语句块)复合语句(
4、语句块) 由大括号由大括号 括起来的语句序列括起来的语句序列(xli)(xli),在语法,在语法上复合语句被看作一条语句。上复合语句被看作一条语句。例例: : int x , y; int x , y; z = x + y; z = x + y; t = z / 100; t = z / 100; printf(%f,t); printf(%f,t); 复合语句常用于任何需要一条语句的地方复合语句常用于任何需要一条语句的地方 。3.1.1C语句(yj)概述第6页/共128页第六页,共129页。3.1.2顺序(shnx)结构程序设计例3-1键盘输入一个(y)三位数,输出逆序后的数。#includ
5、evoidmain()intx,y,a,b,c;printf(Pleaseinputanum:);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);顺序结构(jigu),就是语句按照编写的顺序依次执行。第7页/共128页第七页,共129页。C中的输入输出1C本身没有输入输出语句(yj),数据的I/O由函数实现。2源程序的开头使用如下语句(yj):#include#include“stdio.h”第8页/共128页第八页,共129页。3.1.3字符(zf)输入输出1.字符输出(shch)函数pu
6、tchar()intputchar(intc)作用:向终端输出(shch)一个字符。参数C可以int型与char型。第9页/共128页第九页,共129页。例:#includestdio.hvoidmain()chara,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(c);程序(chngx)输出:BOY注:若要输出小写的boy,程序(chngx)怎样修改?若没有#include“stdio.h”会怎样?实例(shl)第10页/共128页第十页,共129页。函数参数可以(ky)是转义字符例:putchar(n);输出换行符putchar(101);输出
7、字符Aputchar();输出单引号putchar(012);输出换行符putchar(015);输出回车.不换行,光标到本行首转义字符第11页/共128页第十一页,共129页。2字符输入(shr)函数getchar()形式:intgetchar(void)作用:从stdin(键盘)输入一个字符,同时有回显。函数无参数,返回接收( jishu)到的输入字符原型定义:stdio.h常用用法:变量=getchar();第12页/共128页第十二页,共129页。#includestdio.hvoidmain()charc;c=getchar();putchar(c);putchar(getchar(
8、);输出(如在键盘(jinpn)上输入“a”):aa实例(shl)第13页/共128页第十三页,共129页。3.1.4格式输入(shr)与输出1.格式输出函数printf()作用:按指定(zhdng)的格式输出指定(zhdng)数据一、printf()的一般格式printf(格式控制,输出列表);例:inti=3;doublef=4.56;printf(i=%d,f=%lfn,i,f);第14页/共128页第十四页,共129页。1.格式控制:控制按指定格式输出后面的参数。以“”括起。格式控制组成:普通字符(zf)(不含%的字符(zf)),原样输出(可为转义字符(zf))格式说明符(%格式字符(
9、zf)),控制输出数据的格式。2.输出表列:需要输出的数据,以,分隔。可为常、变量、表达式、函数,受格式控制中格式符的控制。也可以没有输出表列,如:printf(“NametAddtTeln”);printf函数(hnsh)格式第15页/共128页第十五页,共129页。二、格式字符1.d格式符:按十进制有符号(fho)数格式输出d按int型数据实际长度输出 %md 按m指定的宽度输出(不足补空格,大于m位时按实际长度输出),右对齐 %ld,%mld 输出long int 型数据,m指定输出宽度 %hd,%mhd输出short int型数据%0md,%0mld,%0mhd 0(数字0)表示位数不
10、足m时补0 %-md,%-mld 左对齐输出,右边补空格 注:%后面的m(位数控制)、0(位数不足(bz)补0)对于其他格式符也适用。 第16页/共128页第十六页,共129页。例:(表示(biosh)空格)inti=123;longj=123456;printf(%d%5d%05d,%ld%8ld%08ld,i,i,i,j,j,j);结果:12312300123,12345612345600123456强调:对long型数据要用%ld输出,若用%d可能会发生错误。同理,shortint数据要用%hd第17页/共128页第十七页,共129页。2.o(字母)格式符:按八进制无符号数的格式输出。符
11、号位作为数一并输出。例:shortinta=-1;printf(“a=%hd,%hon”,a,a);结果:a=-1,1777773、x格式符:按十六进制无符号数格式输出int型数。4、u格式符:以无符号十进制形式输出整数对longint数据(shj)都需要附加l,对shortint需要附加h如%lo,%10hx,%-10lo第18页/共128页第十八页,共129页。5、c格式符:以字符形式(xngsh)输出。例:charc=101;printf(%c,c);也可以使用:%mc、%-mc第19页/共128页第十九页,共129页。6、s格式(gshi)符:以字符串格式(gshi)输出。%s例:pr
12、intf(%s,CHINA); %ms m指定宽度(不足时左补空格,大于时按实际宽度输出),右对齐 %-ms 左对齐,不足m时右补空格 %m.ns 输出占m列,取字符串左端n个字符,左补空格 %-m.ns 同上,n个字符输出,占m列,右补空格 第20页/共128页第二十页,共129页。7、f格式(gshi)符:按小数格式(gshi)输出实数。printf(%0.3f,123.45678);显示123.457%f按小数格式输出,整数部分全输出,6位小数%m.nf输出占m列(含小数点),其中n位小数(四舍五入)%-m.nf同上,左对齐%lf用于double型数据第21页/共128页第二十一页,共1
13、29页。8.e格式符:以标准指数形式输出(shch)实数%e 指数形式输出实数,尾数保留6位小数 。 %m.ne n指保留尾数部分小数位数,右对齐 %-m.ne 左对齐 %ledoublea=-1.1e300;printf(a=%le,sizeof=%dn,a,sizeof(a);输出(shch):a=-1.100000e+300,sizeof=8第22页/共128页第二十二页,共129页。2格式输入(shr)函数scanf()一、一般格式作用:按规定格式输入形式:intscanf(格式控制,地址(dzh)列表)原型定义:stdio.h将键盘输入的数据按指定的格式接收、转换后,送到相应的地址(
14、dzh)中。第23页/共128页第二十三页,共129页。#includestdio.hvoidmain()inta,b,c;scanf(%d%d%d,&a,&b,&c);printf(%d,%o,%xn,a,b,c);运行时输入(shr):101112程序输出:10,13,c第24页/共128页第二十四页,共129页。二、格式(gshi)说明与printf()的格式(gshi)控制类似格式字符说明d 用于输入十进制数o用于输入八进制数x用于输入十六进制数c用于接收单个字符s接收字符串认为空格是结束符f用于输入实数(小数或指数均可接收)e与f相同附加格式说明符l用于long(%ld)和doubl
15、e(%lf)型数据h用于短整型数据(%hd、%ho、%hx)域宽(一个正整数)指定输入所占宽度*表示对应输入量不赋给一个变量第25页/共128页第二十五页,共129页。1.可以指定输入数据的列数,系统自动按它截取所需数据。例:scanf(%2d%3d,&a,&b);输入123456系统自动将12赋给a,345赋给b。2.*格式用于跳过一个(y)数据域scanf(%2d%*3d%2d,&a,&b);输入:1234567结果,a=12,345被跳过,b=67。*主要用于利用现有数据时,跳过某些数据项。3.输入实数不能规定精度如:scanf(%7.2f,&a);说明(shumng)第26页/共128
16、页第二十六页,共129页。1、sacnf()中的变量必须使用地址。inta,b;scanf(“%d,%d”,a,b);错误scanf(“%d,%d”,&a,&b);正确2、scanf()的“格式控制”中,可以(ky)使用普通字符,但在输入时必须输入这些字符,成为数据输入时的分隔符。例:scanf(%d,%d,&a,&b);输入:3,4(逗号与%d,%d中的逗号对应)三.使用(shyng)scanf()函数的注意事项第27页/共128页第二十七页,共129页。例:scanf(%d%d,&a,&b);输入:34(两个或以上空格)例:scanf(%d:%d:%d,&h,&m,&s);输入:12:23
17、:36(与格式(gshi)控制中的冒号对应)例:scanf(a=%d,b=%d,c=%d,&a,&b,&c);输入:a=12,b=24,c=36(a=,b=,c=及逗号与格式(gshi)控制相对应)第28页/共128页第二十八页,共129页。3、在用“%c”输入时,空格(kn)、回车、TAB等均作为有效字符被接收。例:scanf(%c%c%c,&c1,&c2,&c3);输入:abc结果:ac1,c2,bc3(其余被丢弃)若输入:123ab结果:1c1,2c2,3c3第29页/共128页第二十九页,共129页。4、输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数(hnsh))
18、。遇空格、“回车”、“跳格”键或用户指定的分隔符。遇宽度结束。遇非法输入。第30页/共128页第三十页,共129页。5、注意%c与%d混合使用时的问题(wnt)。例:scanf(“%c%d%c”,&a,&b,&c);执行:a12c结果:a=a,b=12,c=ca12c结果:a=a,b=12,c=6、数据类型与格式符匹配使用%f%lf用于实型%d%o%x用于整型%c用于字符型第31页/共128页第三十一页,共129页。问题(wnt)与讨论1.scanf函数变量名前没有&会怎样?编译器会报错吗?2.a=getchar()与scanf(%c,&a)的异同3.怎样设计scanf使得(shde)输入数据
19、时减少出错?第32页/共128页第三十二页,共129页。3.2分支(fnzh)结构程序需要进行比较与逻辑判断,根据(gnj)判断结果决定不同的操作。确定判断的条件确定判断结果为“真”或“假”时执行的不同操作第33页/共128页第三十三页,共129页。2.2.4关系(gunx)运算符与关系(gunx)表达式关系运算:也称比较运算,比较两个运算对象(duxing)的大小。关系表达式:关系运算符连接的式子,关系表达式可能结果有:“真”(true)和“假”(false)。例:a 3、a=3、a!=3第34页/共128页第三十四页,共129页。1.关系(gunx)运算符及其优先次序 小于优先级相同(高)
20、大于=大于等于=等于优先级相同(低)!=不等于第35页/共128页第三十五页,共129页。中的逻辑值:(假)(真)关系(gunx)表达式:用关系(gunx)运算符连接的表达式。关系(gunx)表达式的值:0、1与int型等效例:若a=3,b=2,c=1,则:ab真,表达式的值为1(ab)=c真,表达式的值为1b+cbd的值等于1f=abcf的值等于0注意:数学式abc应写为ab&bc2.关系(gunx)表达式第36页/共128页第三十六页,共129页。3.关系(gunx)运算的特点右结合(jih)双目运算符优先级例:ca+b 等效于c(a+b) ab!=c 等效于(ab)!=c a=bc 等效
21、于a=(bc 等效于a=(bc) 第37页/共128页第三十七页,共129页。2.3.3逻辑(luj)运算符与逻辑(luj)表达式1.逻辑(luj)运算符及其优先次序&逻辑与“双目运算符”:要求两个操作数,如:(ab) & (xy) |逻辑或!逻辑非单目运算符,要求一个操作数,如:!(ab) 优先级:! 高于 & 高于 | 第38页/共128页第三十八页,共129页。1&1=11&0=00&1=00&0=01|1=11|0=10|1=10|0=0!1=0!0=1逻辑运算规则(guz)表混合(hnh)运算:!a&b=c|x*2y+3&c+按右图优先级运算。第39页/共128页第三十九页,共129
22、页。用逻辑运算符将关系表达式或逻辑量连接起来。在C中,参与逻辑运算的数据可为任意类型(lixng),非0即为真,0为假。例:a+b|c值为1a&0值为053&2|83)&(b=a=b)&(b=31)后a的值为1,b的值为0应用:常直接(zhji)用逻辑表达式构造条件。例如闰年条件:(y%4=0&y%100!=0)|(y%400=0)第42页/共128页第四十二页,共129页。条件语句块1语句块2exprstatement1statement2非0=03.2分支(fnzh)结构3.2.1if语句(yj)1.if-else分支if (表达式) 语句(yj)块1;else 语句(yj)块2;第43页
23、/共128页第四十三页,共129页。例3-6输入一个字符(zf),判断它是否为英文小写字母。#includevoidmain()charc;printf(Pleaseinputacharacter:);c=getchar();if(c=a&c=60)printf(Passedn);elseprintf(Failedn);printf(Youmusttakethiscourseagainn);变量score的值大于60时,程序(chngx)将输出:PassedYou must take this course again第46页/共128页第四十六页,共129页。if-else使用(shyng)
24、说明(3)ifelse语句执行完毕后执行ifelse的后续语句。系统将整个ifelse结构处理(chl)为一条语句单元。第47页/共128页第四十七页,共129页。2.if分支(fnzh)if(表达式)语句(yj);exprstatement非0=0条件语句1第48页/共128页第四十八页,共129页。例3-9输入(shr)三个数,按由小到大的顺序输出#includevoid main() int a,b,c,t; scanf(%d%d%d,&a,&b,&c); if(ab) t=a;a=b;b=t; /*变量(binling)a与b互换,t为中间变量(binling)*/ if(ac) t=
25、a;a=c;c=t; if(bc) t=b;b=c;c=t; printf(%d,%d,%dn,a,b,c); 第49页/共128页第四十九页,共129页。例3-8设计一个加法计算(jsun)训练程序,由机器随机产生两个整数,让用户计算(jsun)两数之和,若用户计算(jsun)正确则打印“Right”,否则打印“Wrong”。#includevoidmain()inta,b,s;a=rand();/*rand()是库函数,随机产生一个0-32767之间的数*/b=rand();printf(%d+%d=,a,b);scanf(%d,&s);/*用户输入结果*/if(s=a+b)/*计算(js
26、un)机判断用户结果是否正确*/printf(Rightn);elseprintf(Wrongn);第50页/共128页第五十页,共129页。常见(chnjin)错误多条语句为内嵌时忘记用括起来。在if(表达式)之后多加一个分号。比较运算符“=”与赋值运算符“=”混淆使用。最常见(chnjin)的错误为:if(x=1)误写为:if(x=1)无论x的原值是什么,赋值表达式x=1的值总为1,其作为条件时恒为真。第51页/共128页第五十一页,共129页。3.ifelseifelse多分支(fnzh)if(表达式1)语句(yj)1;elseIf(表达式2)语句(yj)2;elseIf(表达式3)语句
27、(yj)3elseif(表达式m)语句(yj)melse语句(yj)n条件语句1条件2语句2语句3条件3第52页/共128页第五十二页,共129页。第53页/共128页第五十三页,共129页。例3-10应用(yngyng)多分支结构编写此程序,根据用户输入的自变量x的值,计算y的值。第54页/共128页第五十四页,共129页。voidmain()floatx;printf(pleaseinputx:);scanf(%f,&x);if(x0.0)printf(y=0n);elseif(x=30)printf(y=%fn,x);elseif(x=60)printf(y=%fn,x*x);elsep
28、rintf(y=%fn,x*x*x);例3-10第55页/共128页第五十五页,共129页。条件语句1语句2条件语句1条件语句1条件2语句2语句3条件3分支(fnzh)结构流程图第56页/共128页第五十六页,共129页。条件语句1语句2条件语句1条件(tiojin)语句(yj)组语句(yj)组条件条件语句组语句组语句组语句组语句组语句组If-else嵌套流程图第57页/共128页第五十七页,共129页。3.2.2if语句(yj)的嵌套if(条件表达式1)if(条件表达式2)程序块1;else程序块2;elseif(条件表达式3)程序块3;else程序块4;ifelse的内嵌程序块中又包含(b
29、ohn)一个或多个ifelse语句称为if语句的嵌套,常用于实现多路选择。第58页/共128页第五十八页,共129页。嵌套if语句时,必须特别注意if与else配对。配对原则:从最内层开始,else总是与它上面最接近的(未曾配对的)if配对。避免if与else配对错位的最佳办法是加大括号,同时,为了便于阅读,使用适当的缩进,(只有大括号能保证(bozhng)if和else不错位配对,缩进仅便于阅读)If与else的匹配(ppi)第59页/共128页第五十九页,共129页。例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);修改(xi
30、gi): if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);实现(shxin) if else 正确配对方法:加 实现if else 正确配对(pi du)方法第60页/共128页第六十页,共129页。if(p1)if(p2)语句(yj)A;elseif(p3)语句(yj)B;else语句(yj)C;语句(yj)D;比较差异:if(p1)if(p2)语句(yj)A;elseif(p3)语句(yj)B;else语句(yj)C;语句(yj)D;第61页/共128页第六十一页,共129页。#includevoidmain()inta,b,c,
31、max;printf(pleaseinputthreenumbers:n);scanf(%d%d%d,&a,&b,&c);max=a;if(cb)if(ca)max=c;elseif(ba)max=b;printf(themaxis%dn,max);max=a;if(cb)if(ca)max=c;elseif(ba)max=b;printf(themaxis%dn,max);运行时:please input three numbers:输入(shr):2 5 3输出:the max is 2第62页/共128页第六十二页,共129页。良好习惯(1)相配对的if与else书写于同一列上,内嵌语句
32、缩格书写,以表明层次结构。(2)if语句多重嵌套实现多路选择时,应尽可能的在else中分支(fnzh),即在else中嵌套另一个if语句,而不要在if中嵌套。(3)具体实现时,每一个if的条件为真时只有唯一的一种情况,而将剩余的各路选择放在else中一次次细分。第63页/共128页第六十三页,共129页。在if语句(yj)中,在“表达式”为“真”和“假”时,都只执行一个赋值语句(yj)给同一个变量赋值,例如:if(ab)max=a;elsemax=b;可以用如下赋值语句(yj)来处理:max=(ab)?a:b;条件运算符要求有三个操作对象,称为“三目运算符”(它是C语言中唯一的一个三目运算符)
33、。3.2.3条件(tiojin)运算符第64页/共128页第六十四页,共129页。条件表达式的一般形式:表达式1?表达式2:表达式3说明:1执行顺序:先求解表达式1的值,若其为真,求解表达式2的值,做为整个(zhngg)条件表达式的值;若表达式1为假,则求解表达式3的值,且整个(zhngg)条件表达式的值等于表达式3。max=(ab)?a:b把条件表达式的值赋给max。3.2.3条件(tiojin)运算符第65页/共128页第六十五页,共129页。2优先级:高于赋值运算符,低于算术运算符、关系运算符和逻辑运算。max=(ab)?a:bmax=ab?a:bab?a:b+1(ab)?a:(b+1)
34、3结合(jih)性:右结合(jih)。ab?a:cd?c:d(ab)?a:(cd?c:d)4ifelse与条件表达式的替代:if(ab)printf(%d,a);elseprintf(%d,b);替代:printf(%d,ab?a:b);条件(tiojin)运算符说明第66页/共128页第六十六页,共129页。5表达式1、表达式2、表达式3的类型可以(ky)不同。6可以(ky)嵌套。max=(ab?a:b)c?(ab?a:b):c例:P48例3-13,大小写转换。(read)if(ch=a&ch=z&ch=z)?32:0条件(tiojin)运算符说明第67页/共128页第六十七页,共129页。
35、3.2.4switch语句(yj)其一般形式:switch(表达式)case常量(chngling)表达式1:语句1;break;case常量(chngling)表达式2:语句2;break;case常量(chngling)表达式n:语句n;break;default:语句n+1 不能省各常量值必须不相等break用于跳出switch第68页/共128页第六十八页,共129页。例:根据(gnj)考试成绩的等级(grade)打印出百分制分数段:grade=getchar();switch (grade) case A:printf(“90100n); case B:printf(7589n);
36、case C:printf(6074n); case D:printf(60n); default: printf(errorn); 如果(rgu)输入A,回车,输出?当grade=A时,程序(chngx)从printf(“90100n)开始执行,因此输出结果为: 90100 7589 6074 60n);break;7、case后面必须是整形常量或字符型常量。Switch说明(shumng)第71页/共128页第七十一页,共129页。例3-15五分制成绩(chngj)转换成百分制#includevoidmain()charc1,c2;printf(pleaseinputthescore:);
37、scanf(%c%c,&c1,&c2);第72页/共128页第七十二页,共129页。例3-15五分制成绩(chngj)转换成百分制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;
38、 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:
39、case 1: printf(60n); break; case 1: printf(60n); break; 第73页/共128页第七十三页,共129页。3.3循环(xnhun)结构在一个算法中,某些步骤需要反复多次地执行时,需要设计一个循环。循环是在给定(idn)循环条件为真时由计算机重复执行一组循环体语句的控制结构。循环结构是结构化程序三种基本结构之一。构建循环让计算机反复执行一组操作语句,从而完成大量类同的计算。第74页/共128页第七十四页,共129页。根据开始循环的初始条件和结束循环的条件不同(btn),C语言中用如下语句实现循环1、用while语句。2、用do-while语句。3
40、、用for语句。循环(xnhun)构成第75页/共128页第七十五页,共129页。3.3.1while语句(yj)一般形式:while(表达式)循环体语句;作用:实现“当型”循环。当“表达式”为非0(真)时,执行“循环体语句”,其后回到循环开始while处再次判断表达式真假,直至表达式为假,结束循环,执行while后续。特点:循环体只能是一条语句。若有多条语句,使用使之成为复合语句。表达式一般是关系(gunx)或逻辑表达式。当然,在C中也可以为任意类型表达式。第76页/共128页第七十六页,共129页。循环(xnhun)结构流程图第77页/共128页第七十七页,共129页。实例(shl)例3-
41、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页第八十页,共129页。例3-17计算(jsun)x的y次方#include#includevoidmain()inty,i;doublex,z;printf(Pleaseinputxandy:);scanf(%lf%d,&x,&y);z=1;i=1;doz*=x;i+;while(i=fabs(y);if(y0)z=1/z;printf(result=%lfn,z
42、);循环条件(tiojin)一开始为假,循环执行一次。第81页/共128页第八十一页,共129页。while和do-while是可以(ky)互换的。在一般情况下,用while和do-while语句解决同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但当循环条件一开始就为“假”时,两种循环的结果不同。这是因为此时while循环的循环不被执行,而do-while循环的循环体被执行一次。While和do-while第82页/共128页第八十二页,共129页。例3-17计算(jsun)x的y次方修正#include#includevoidmain()inty,i;doublex,z;prin
43、tf(Pleaseinputxandy:);scanf(%lf%d,&x,&y);z=1;i=1;if(y!=0)doz*=x;i+;while(i=fabs(y);if(y0)z=1/z;printf(result=%lfn,z);第83页/共128页第八十三页,共129页。3.3.3for语句(yj)for(表达式1;表达式2;表达式3)循环(xnhun)体语句;执行过程:(1)求表达式1;(2)求表达式2,若为“真”,执行“循环(xnhun)语句”;若为假,转第(5)步。(3)求表达式3。(4)转第(2)步。(5)执行for语句下面的语句。第84页/共128页第八十四页,共129页。fo
44、r循环(xnhun)流程图第85页/共128页第八十五页,共129页。例3-18用for循环(xnhun)求1+2+3+100#includevoidmain()inti,sum;for(i=1,sum=0;i=100;i+)sum+=i;printf(sum=%dn,sum);第86页/共128页第八十六页,共129页。for语句中:“表达式1”循环变量初始化“表达式2”判别循环条件(tiojin)“表达式3”循环控制变量更新例:for(sum=0,i=1;i=100;i+)sum=sum+i;这里,循环条件(tiojin)由变量i设定,变量i称为“循环变量”。for语句(yj)第87页/共
45、128页第八十七页,共129页。(1)表达式1和表达式3经常是逗号表达式,可以分别或同时省略。for语句省略“表达式1”。“表达式1”的作用是设定循环初始条件,“表达式1”省略后,应在for语句前面设置循环初始条件。例:i=1;for(;i=100;i+)sum=sum+i;/*注意(zhy),“表达式1”后面的分号不能省略*/for语句(yj)说明第88页/共128页第八十八页,共129页。for语句(yj)省略“表达式3”。表达式3用于修改控制循环条件(修正循环变量的值),若省略,应在循环体语句(yj)中增加修改循环变量值的语句(yj),以保证循环能正常结束。例:for (sum=0,i=
46、1;i=100;) sum = sum + i;i+; for语句(yj)说明第89页/共128页第八十九页,共129页。for语句(yj)说明同时省略(shngl)“表达式1”和“表达式3”,只有“表达式2”。例:i=1;sum=0;for(;i=100;)sum+=i;i+;i=1;sum=0;for(;i=100;)sum+=i+;第90页/共128页第九十页,共129页。(2) 表达式2是循环条件。如果省略“表达式2(循环条件)”,则不判别循环条件,认为循环循环条件始终为“真”,循环将无终止(zhngzh)地进行下去。for(i=1,sum=0; ;i+) sum+=i;相当于:for
47、(i=1,sum=0; 1 ; i+) sum+=i;(3)循环体只能是一条语句,若包含多条语句,应用 括起来。for语句(yj)说明第91页/共128页第九十一页,共129页。(4 4)forfor语句的其他(qt)(qt)变形例1 1: for(sum=0,i=1;i=100;) for(sum=0,i=1;i100) break; if(i100) break; (5)(5)各表达式可为逗号表达式 for(i=0,j=100; i=j; i+,j-) for(i=0,j=100; i=j; i+,j-) k = i + j; k = i + j; for语句(yj)说明第92页/共128
48、页第九十二页,共129页。例3-19用for语句(yj)计算x的y次方,y为整数。x与y的值都由键盘输入。voidmain()inty,i;doublex,z;printf(Pleaseinputxandy:);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页第九十三页,共129页。例3-20求最高分与平均分例3-20歌手大奖赛,有裁判12人。编写计算歌手得分(dfn)程序,键盘输入12个成绩,输出最高分、最低分与最终得分(dfn)。#defineN12vo
49、idmain()inti;floatscore,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页第九十四页,共129页。3.3.4循环(xnhun)的嵌套循环嵌套:一个循环(称为“外循环”)的循环体内包含另一个循环(称为“内循环”)。内循环中还可以包
50、含循环,形成多层循环。(循环嵌套的层数理论(lln)上无限制)。三种循环(while、do-while、for)可以互相嵌套。多重循环的使用与单一循环完全相同,但应特别注意内、外层循环条件的变化。内、外层循环变量赋初值的位置、变量名的使用等。注意:外循环必须完整地包含内循环。do while( ) for( ; ; ) do while( ); while( );第95页/共128页第九十五页,共129页。例:1!+2!+3!+n!voidmain()longs=0,k;inti,n,j;scanf(“%d”,&n);for(i=1;i=n;i+)k=1;for( j=1;j=i;j+)k*=
51、j;s+=k;printf(“s=%ldn”,s);voidmain()longs=0,k;inti,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页第九十六页,共129页。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(
52、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页第九十七页,共129页。循环(xnhun)嵌套实例例3-21打印九九乘法表。例3-22编程输出(shch)如下图形:1222333334444444555555555第98页/共128页第九十八页,共129页。3.3.5break与continue语句(yj)1.break语句(yj)在while、for、do-while或switch结构中使用,可使程序立即退出该结构,转而执行该结构后的第一条语句(yj)。注:break
53、只可跳出所在的一重循环。在多重循环中使用,只能跳出其所在的内层循环。第99页/共128页第九十九页,共129页。Break跳出(tioch)分析A;While(p1)B;for(C;p2;D)E;if(p3)break;F;G;H;第100页/共128页第一百页,共129页。例3-23求满足(mnz)表达式1+2+3+n=1000的最大的n#includevoidmain()inti,sum;for(sum=0,i=1;i+)sum+=i;if(sum1000)break;printf(n=%dn,i-1);#includevoidmain()intsum=1,i;for(i=1;sum=10
54、00;i+)sum+=i;printf(i=%dn,i-2);第101页/共128页第一百零一页,共129页。2.continue语句(yj)作用:提前结束本次循环体的执行,回到循环的起始处,接着进行下一次循环条件的判别。说明:对于while,continue是回到while处再次判断条件,根据条件决定是否进行下一次循环;对do-while,回到do处,重新(chngxn)执行循环体语句,并不判别循环条件。对for,来到表达式3处,执行表达式3后再判断表达式2。第102页/共128页第一百零二页,共129页。While(p1)A;if(p2)continue;doif(p3)continue;
55、B;while(p4);for(C;p5;D)if(p6)continueelsebreak;E;第103页/共128页第一百零三页,共129页。输出(shch)100200之间不能被3整除的数。voidmain()intn;for(n=100;n=200;n+)if(n%3=0)continue;printf(%5d,n);voidmain()intn;for(n=100;n=60)。输入时以负数作为(zuwi)输入的结束。voidmain()ints=1;while(s=0)scanf(%d,&s);if(s60)continue;printf(%d,s);printf(n);第105页/
56、共128页第一百零五页,共129页。break语句(yj)和continue语句(yj)说明1.注意各自的功能(gngnng)while(表达式1) while(表达式1)if(表达式2)if(表达式2)break;continue;break语句跳出循环continue语句结束本次循环体的执行,进入下一次循环2.都不能单独使用。break只能用于循环与switch控制结构中,continue只能用于循环控制结构中。第106页/共128页第一百零六页,共129页。3.3.6goto语句(yj)(无条件转移语句(yj))一般形式:goto语句标号功能:无条件转向“语句标号”处执行。语句标号为一个
57、标识符,放在语句前面,用:与语句分隔。goto语句引起一个无条件的转移,会破坏其他控制结构,不符合结构化程序设计原则,破坏了程序结构的清晰(qngx),因此,一般应避免使用goto语句。第107页/共128页第一百零七页,共129页。例3-25计算(jsun)n+(n+1)+(n+2)+100#includevoidmain()inti,s=0;scanf(%d,&i);if(i100)printf(Error);gotoend;start:/*语句(yj)标号*/if(i=100)s+=i+;gotostart;printf(s=%d,s);end:printf(n);/*带语句(yj)标号
58、的语句(yj)*/第108页/共128页第一百零八页,共129页。3.4循环(xnhun)程序设计3.4.1循环设计循环是在循环条件为真时反复执行的一组计算机指令,是计算机解题的一个重要结构。循环控制有两种基本方法:计数法和标志法。1.计数器控制的循环事先准确地知道循环次数(csh),因此设计一个循环控制变量,由变量值来控制循环次数(csh)。每循环一次,循环变量的值会递增(增值通常为1或-1),当其值达到终值时结束循环。第109页/共128页第一百零九页,共129页。2.标志控制的循环事先不知道准确的循环次数,由某一目标值标记循环的结束。C语言程序所需的任何控制形式可以(ky)用下面三种控制
59、结构完成:顺序结构、if结构、while结构。一、循环(xnhun)设计第110页/共128页第一百一十页,共129页。程序设计的首要工作是算法设计,离开了算法也就没有了程序。算法,是指完成某一项工作而采取的方法和步骤,具体( jt)到程序设计,是对解题过程的准确而完整的描述,并用一种程序设计语言的来实现。循环主要用来解决程序设计中两类基本的算法:穷举和迭代。3.4.2基本(jbn)算法第111页/共128页第一百一十一页,共129页。穷举的基本思想是对问题的所有可能状态(zhungti)一一测试,直到找到解或将全部可能状态(zhungti)都测试过为止。穷举是一种重复型算法,其核心是设计循环
60、,在循环体中依次测试。例0:最大公因数例1:百钱百鸡例2:最值问题。输入十个数,输出其中最大、平均值。例3:素数问题。判断x是不是素数。例3-30例4:输出100-1000之间所有素数,每行输出5个。例5:韩信点兵1穷举第112页/共128页第一百一十二页,共129页。判断(pndun)素数第113页/共128页第一百一十三页,共129页。韩信点兵韩信(hnxn)有一队兵,他想知道有多少人,便让士兵排队报数。按1-5报数最后一人报1;按1-6报数末一人报5;按1-7报数最后一人报4;按1-11报数最末一人报10。韩信(hnxn)有多少兵?思考:设士兵数为x,满足以下关系式:x%5=1&x%6=
61、5&x%7=4&x%11=10用穷举法对x从1开始测试,直到找到满足关系式的x第114页/共128页第一百一十四页,共129页。按照特定(tdng)规律和方法,不断用新值取代变量的旧值,或由旧值递推出变量新值,直至问题解决为止,这种解决问题的方法为迭代。迭代的关键因素是:迭代初值、迭代公式和迭代次数(精度要求)。例0:最大公因数例1:输出Fibonacci数列前20项。例2:牛顿迭代法解方程2x3-4x2+3x-6=0在1.5附近的根迭代公式:xk+1=xk-f(xk)/f(xk)2迭代第115页/共128页第一百一十五页,共129页。x0X0,f(x0)xx=x0-f(x0)/f(x0)f(
62、x)牛顿(ni dn)迭代法x0第116页/共128页第一百一十六页,共129页。#includevoidmain()floatx,x0,f,f1;x=1.5;dox0=x;f=2*x0*x0*x0-4*x0*x0+3*x0-6;f1=6*x0*x0-8*x0+3;x=x0-f/f1;while(fabs(x-x0)=1e-5)或while(fabs(f)=1e-5)printf(therootis:%6.2fn,x);第117页/共128页第一百一十七页,共129页。x0x2x0x1f(x)x2x1f(x0)0x0 =(x1+x2)/2二分法第118页/共128页第一百一十八页,共129页。
63、例3:二分法解上述(shngsh)方程。#includemain()floatx,x1,x2,f,f1,f2;doprintf(Pleaseenterx1,x2:);scanf(%f%f,&x1,&x2);f1=x1*(2*x1-4)*x1+3)-6;f2=x2*(2*x2-4)*x2+3)-6;while(f1*f20);dox=(x1+x2)/2;f=x*(2*x-4)*x+3)-6;if(f*f11e-4);printf(therootis:%6.2fn,x);第119页/共128页第一百一十九页,共129页。三、循环设计1计数器控制的循环(固定次数(csh)的循环)2标记控制的循环。第
64、120页/共128页第一百二十页,共129页。循环(xnhun)小结一、循环(xnhun)控制语句。循环(xnhun)是一组指令,计算机反复执行这组指令直到满足条件为止。循环(xnhun)常有计数器控制循环(xnhun)和标记控制循环(xnhun)两种。二、三种循环(xnhun)控制语句比较可处理同一问题,可互相替代。强调循环(xnhun)体是一条语句。注意循环(xnhun)条件改变,以使循环(xnhun)终止。嵌套时,要注意内循环(xnhun)所用的循环(xnhun)变量赋初值位置。第121页/共128页第一百二十一页,共129页。三、continue、break语句使用四、常见的程序设计错
65、误1因为浮点数值可能是一个近似值,用浮点变量作循环变量可能会产生不精确的值,从而不能准确(zhnqu)地测试终止条件。2for结构的头部用逗号代替分号3for、while后第一条语句为循环体,不要加;,否则空语句为循环体。4赋值运算符=与比较运算=5循环嵌套时内循环变量与外循环变量采用同一变量。6内循环变量赋初值位置。循环(xnhun)小结第122页/共128页第一百二十二页,共129页。五、良好的程序设计习惯1缩格书写2逻辑判断条件清晰3逻辑清楚(qngchu),程序简洁。第123页/共128页第一百二十三页,共129页。运行(ynxng)以下程序,写出运行(ynxng)结果(1)#incl
66、udevoidmain()inta=3,b=2,c=1,t;if(abc)t=1;elseif(abc)t=0;elset=-1;printf(%dn,t);(2)#includevoidmain()inta=11,b=22,t=33;if(ab)t=a;a=b;b=t;printf(a=%d,b=%dn,a,b);第124页/共128页第一百二十四页,共129页。运行以下程序(chngx),写出运行结果(3)#includevoidmain()intx=1,a=0,b=0;switch(x)case0:b+;case1:a+;case2:a+;b+;printf(a=%d,b=%dn,a,b
67、);(4)#includevoidmain()intn=4;while(n-)printf(%d,-n);第125页/共128页第一百二十五页,共129页。运行以下程序(chngx),写出运行结果(5)#includevoidmain()inta,b;for(a=1;a=5;a+)for(b=1;b=a;b+)if(b*10+a=a*10+b)break;printf(%d,a*10+b);(6)运行(ynxng)时输入621803-1,输出是_#includevoidmain()intx,max;domax=x;scanf(%d,&x);if(xmax)max=x;while(x!=-1);
68、printf(max=%dn,max);第126页/共128页第一百二十六页,共129页。编写程序,输出所有的“水仙花”数。水仙花数:一个(y)三位数,各位数字立方和为该数本身,即为水仙花数。如:153=13+53+33,则153为水仙花数第127页/共128页第一百二十七页,共129页。感谢您的欣赏(xnshng)!第128页/共128页第一百二十八页,共129页。内容(nirng)总结本章内容。顺序结构,就是语句按照编写的顺序依次执行(zhxng)。3结合性:右结合。7、case后面必须是整形常量或字符型常量。3. 循环体中必须有使循环趋于结束的语句,否则程序进入“死循环”(不结束)。4. 书写方式:缩格书写。printf(“s=%dn”,s)。printf(“s=%ldn”,s)。程序设计的首要工作是算法设计,离开了算法也就没有了程序。循环是一组指令,计算机反复执行(zhxng)这组指令直到满足条件为止。感谢您的欣赏第一百二十九页,共129页。