1、1,第 4章 基本控制结构与导出数据类型,4.1 控制语句、复合语句和空语句4.2 分支语句4.3 循环语句4.4 转向语句 。,2,4.1控制语句、复合语句和空语句,简单的计算器 #includeiostream.h void main()int x,y;cout“first integer:”;cinx; / 输入一个整数coutendl“Second integer:”;ciny; / 输入一个整数coutendlx“+“y“=“x+yedl; ,3,4.1控制语句、复合语句和空语句,执行结果: first integer:12 % second integer:7 % 12 +7=19
2、 % 这个“计算器”利用输入语句可以输入不同整数,但只可作加法,功能很差。,4,4.1控制语句、复合语句和空语句,控制语句是用来控制程序中各语句执行的次序,更确切的说,控制语句是用来改变或打破程序中按语句的先后次序顺序执行规律的。C+语言中的控制语句分条件控制语句和无条件控制语句,5,4.1控制语句、复合语句和空语句,复合语句是若干语句的组合。复合语句又称为块语句(block) 或程序块。 ,6,4.1控制语句、复合语句和空语句,块语句最主要的出现位置 (1)作为函数体; (2)作为循环体; (3)作为if 语句的一个分支。 空语句,就是什么都不做。其格式为:; (1)for 语句中,控制部分
3、的三个表达式语句E1,E2,E3 和循环体S 都可以是空语句; (2)goto 语句使用中的标号语句可以是空语句:,7,4.2 分支语句,If 的流程,8,1 用于分支的if语句,if语句又叫做条件语句,它的功能是根据给定的条件,来选择执行其中的某一分支。允许使用如下两种格式的if语句:if ( ) if ( ) else ,9,紧随if后括号中的“”即为给定的条件,通常为一个关系或逻辑表达式,也可为任一数值表达式。当“”结果为非0值时,认为条件成立,否则认为条件不成立。,10,语句功能(语义),第一种不出现else的if语句是一种单分支选择结构,当“”结果为非0值(即当条件成立)时,执行其中
4、的“”,否则(即当条件不成立时),什么事也不做(而结束该if语句)。第二种具有else的if语句是一种二分支选择结构,当“”结果为非0值时(即当条件成立时),执行其中的“”, 否则(即当条件不成立时), 执行其中的“”。,11,例1,若字符变量ch的值为字母时, 则输出“YES”的if语句。 if( ch=a ,12,例2,输出数值型变量a与b中的较大者。 if( ab) coutb?a:b;注意,if句中所含的“”(或“”或“”)可以是任意语句,如,一个复合语句或者又是一个if语句等。,13,例3,若int型变量x的值小于y的值时,则将x与y的值互换;否则,将x与y的值各加上100。 if后
5、的“”为一个复合语句。复合语句以左花括号“”开始,以右花括号“”结束,花括号中为一个语句序列(或称语句组)。复合语句在逻辑上属于一个语句(参看书p86的4.1.3小节)。,14,if( xy) int temp; /说明性语句,变量temp仅在该复合语句内有效temp=x;x=y;y=temp;else x=x+100;y=y+100;,15,C+还提供“空语句“(不出现任何句子符号、只给出一个分号的语句为空语句),它什么事情也不做,但逻辑上也为一个语句的地位(参看书p86的4.1.3小节)。,16,例4,若字符变量corf的值为大小写字母“C”时,做分支1的处理工作;字符变量corf的值为大
6、小写字母“F”,做分支2的处理工作;字符变量corf的值既非“C”又非“F”时,做分支3的处理工作。,17,if(corf=c|corf=C) /大小写字母“C”时 . /分支1的处理工作else if(corf=f|corf=F) . /分支2的处理工作else . /分支3的处理工作,18,C+规定,每个else只与它前面最近的那个尚未配对的if相配对。注意,若没上述规定的话,如下形式的语句将产生二义性(两个if将“争夺”同一个else!)。if ( ) if ( ) else ;,19,这是由于“if ( ) ”与“if ( ) else ”都为合法的一个语句,那么若按“if ( ) ”
7、来“分解”的话,第一个if则将去匹配else!(但有了规定后,只能是第二个if与其后的else相匹配)。,20,按条件进行判断 -,编程序,输入一个温度值,若输入的是摄氏值则将其转换为华氏值,若输入的是华氏值则将其转换为摄氏值,并将转换结果显示出来。例如,程序执行后的输入输出界面可设计为:Enter temperature:40.2CThe temperature is:40.2C=104.36F注:转换公式如下(其中tc表示摄氏度,tf表示华氏度)tf = tc * 1.8 + 32;tc = (tf32) / 1.8。,21,程序编制如下:,#include void main()floa
8、t t,tc,tf; /t用于存放初始输入值/tc存放摄氏值,tf存放华氏值char corf; /取值大小写字母C或F/表示t值为摄氏值或华氏值const float fac=1.8,inc=32.0;/转换时所需常数coutt; /温度值tcincorf; /摄氏或华氏的字母,22,if(corf=c|corf=C)tc=t; tf=t*fac+inc; elseif(corf=f|corf=F)tf=t;tc=(t-inc)/fac; else /字母输入有错!tc=tf=0; /将tc及tf均置为0cout“The temperature is:“; couttc“C=“tf“Fn“;
9、 ,23,思考题:,如下程序执行后的输出是“i!=5, OK!”呢? 还是“i=5, j void main()int i=66, j=99;if ( i=5 )cout“i=5, “;elsecout“i!=5, “;if ( j8 );cout“j8, “;cout“OK!“endl; ,24,注意,1比较相等的运算符“=”和进行赋值的运算符“=”的使用区别。2. if语句中,作为条件的表达式结果值非0时,意味着条件成立呢,还是不成立?3“空语句”的表现形式及使用含义。,25,2 用于多分支的switch语句,switch语句又称开关选择语句或分情况语句, 它是一种多分支选择语句。该语句的
10、使用格式如下:switch( )case : case : . . . case : default: ,26,紧随switch后括号中的“”给出进行分支的条件,它必须是一个整型、字符型或枚举型的表达式。关键字case用于引出一个分支。case后的各“” 均为switch后“”的一个可能值(两者的类型应该相同)。实际上,每个“case :”都只起一个语句标号的作用。,27,执行过程为:,若switch后“”的取值恰与某个 “”的值相同, 则直接跳转到“case :”后的那一分支的起始点处去执行(直到遇到break语句或者遇到了switch语句体的右花括号后结束本switch句)。若“”的值与任
11、一个“”的值都不相同, 那么: 若有default分支, 则跳转到“default:”后的那一分支的起始点处去执行, 否则什么都不执行(而结束本switch句)。,28,例1.,若int型变量i=2, 执行下述switch语句后, 将输出 “i=2”以及”i=2”两行;若i=5,则什么也不输出(而结束该switch句);若i=1时,要输出3行“i=1”。switch (i)case 1:cout“i=“iendl; case 2: cout“i=“iendl; case 3: cout“i=“iendl; ,29,注意,执行switch时,要从分支起始点处开始执行,直到遇到break语句或者遇
12、到了switch语句体的右花括号后才结束本switch语句。思考:若在上述三个“cout“i=“iendl;”后各加一个“break;”语句的话,又将如何呢?,30,例2.,若int型变量score=86, 执行下述switch语句后, 将输出“grade=B”;若score处于90到100之间,将输出“grade=A”; . ;若score/10不处于6到10之间(如, score为59, 0, 123, -12等), 将输出“grade=E”。,31,switch (score/10) case 10: /值为10与9的分支合为一体case 9: cout“grade=A“endl;bre
13、ak;case 8:cout“grade=B“endl; break;case 7:cout“grade=C“endl; break;case 6: cout“grade=D“endl; break;default: cout“grade=E“endl; ,32,若将上述switch语句作为下述if语句之else后的一个分支句的话, 则将只对0100间的数进行处理。if(score100)cout“ERROR!“endl;elseswitch (score/10).,33,例3.,若char型变量op的取值可为“+”,“-”,“*”,“/”, “%”的话, 则下述的switch“语句构架”将根
14、据op变量的当前值来进行多分支处理。switch (op)case +: /当op为“+”符号时的处理分支. /具体处理部分break; /结束分支case -:.break;,34,case *:.break; case /:.break;case %: .break;default: /当op不为上述任一符号时的处理.,35,3 简单的计算器程序_1,输入两个整数x、y,然后输入运算符op(+, -, *, /, %),程序负责计算出结果并显示在屏幕上。例如,程序执行后的输入输出界面可设计为: First integer x:789 Second integer y:10 Operator
15、 op(+, -, *, /, %):% 789%10=9处理方法:根据输入的op值,通过使用switch语句来进行多分支处理。,36,程序编制如下:,#include void main()int x,y;char op;coutx;couty;coutop;,37,switch (op) /根据运算符op的值来进行多分支处理case +:coutx“+“y“=“x+yendl;break;case -:coutx“-“y“=“x-yendl;break;case *:coutx“*“y“=“x*yendl;break;,38,case /: if(y=0) /分母为0时的处理cout“ov
16、erflow!“endl; elsecoutx“/“y“=“x/yendl; break;case %:if(y=0) /分母为0时的处理cout“overflow!“endl; else coutx“%“y“=“x%yendl;break;default:cout“Wrong!“endl;break; ,39,短路,除非需要, (p1)&(q+25) (p+2) |(q*34),40,4.3 循环语句,while语句For 语句Do while 语句,41,1 用于循环的while语句,while语句又称当语句, 它是一种循环语句。循环语句可使某些操作(由该循环语句的循环体指定)重复执行若干
17、次(甚至无限多次)。while语句的格式如下:while( ),42,紧随while后括号中的“”给出循环是否要继续执行的条件,它通常是一个关系或逻辑表达式。随后的“”是要被重复执行的所谓循环体,它通常是一个复合语句。,43,while语句执行过程:计算while后“”的值,为真(非0)则执行一遍由“”所指定的循环体;反复执行上述操作,直到“”的值为假时结束该while语句。可以看出,若“”的值一上来就为假时,会立刻结束该while语句(也即,此种情况下,作为循环体的那一“”一次也没被执行则结束了该while语句)。,44,例1. 求sum=1+2+3+.+100的累加和。,int sum=0
18、; /sum初值为0(“sum雪球”从0滚起)sum=sum+1; /在原sum值(0)的基础上加上1/(“sum雪球”滚了一圈, sum=0+1)sum=sum+2; /在原sum值(0+1)的基础上又加上2/(“sum雪球”又滚了一圈,sum=0+1+2)sum=sum+3; /继续滚“sum雪球”sum=sum+4; /“sum雪球”继续滚,sum=0+1+2+3+4sum=sum+5; /再滚一圈后,sum=0+1+2+3+4+5cout“sum=“sumendl; /显示出结果: sum=15,45,注意上述程序片段中间的5个语句,其一般形式为“sum=sum+i;”,只不过i的取值
19、依次为1,2,3, 4,5。这 正是形成循环的基础,从1累加到100的循环实现思想也完全相同。主体程序部分如下:int i=1, sum=0; while (i=100) /当i值小于等于100, 就继续循环sum=sum+i;i=i+1; /逐次使i增1,对能否继续循环有影响cout“sum=“sumendl;,46,注意, 循环体(复合语句)内应该有像“i=i+1;”那样的将对还能否继续循环产生影响的语句。本例中,若去掉“i=i+1;”或将它改为“i=i-1;”的话,都将使“i=100”的条件永远满足,从而使循环变为无限循环而永不停止。一般称具有上述用途的i为循环变量。,47,例2.,下述
20、示意性部分程序的功能为:用户可以进行任意多次对所输入数据x、y的同一种处理过程(直到不想再继续做时为止)。int x,y;char cont=Y; while( cont=Y | cont=y )cinxy;. /对所输入的x与y进行处理coutcont; /不想再继续时,输入非“Y”字符,48,注意变量cont的作用:存放用户输入的是否要继续进行处理的“回答”字符,只要其值为大小写的“Y”字母时就继续循环。或者说,一旦用户不想再处理另外的数对x、y时,就为变量cont输入一个非大小写字母“Y”的其他任意字符。,49,简单的计算器程序_2,对“3.4 简单的计算器程序_1”进行改进,使用户执行
21、一次该程序,就可以进行任意多次所给两个数的指定运算。例如,可设计输入输出界面如下: Please input= x y op: 22 100 + 22+100=122 Do you want to continue? (y or n)y Please input= x y op: 15 4 / 15/4=3 Do you want to continue? (y or n) n,50,可循环进行处理:输入两个整数x、y,然后输入运算符op(+, -, *, /, %),程序负责计算出结果(通过switch根据输入的op值进行多分支处理)并显示;直到用户要求不再继续(而结束循环)。程序“构架”如
22、下(其他缺省部分作为练习自己补充): #include void main()int x,y;char op, cont=Y;,51,while( cont=Y | cont=y ) cout x y op: “;cin x y op;switch (op)case +:case -: coutcont; ,52,2 用于循环的do-while语句 -,do-while语句是另一种形式的循环语句。它也可以使由该语句的循环体指定的那些操作重复执行若干次(甚至无限多次)。do-while语句的格式如下:do while ( );,53,do后的“”是要被重复执行的所谓循环体, 它通常是一个复合语句
23、。紧随while后括号中的“”给出循环是否要继续执行的条件, 它通常是一个关系或逻辑表达式。do-while语句的执行过程:先执行一遍由“”所指定的循环体;而后计算while后“”的值,若为0(假)则退出循环(结束do-while语句),否则(条件为真时)返回do处继续循环。可以看出,do-while语句的循环体至少要被执行一遍(这一点与while语句不同)。,54,例. 求sum=1+2+3+.+100的累加和。,主体程序部分如下:int i=1, sum=0; /循环变量i的初值为1,随循环而增值do sum=sum+i;i=i+1;while (i=100); /当i值小于等于100继续
24、循环cout“sum=“sumendl;,55,注意, 循环体内应该有像“i=i+1;”那样的将对还能否继续循环产生影响的语句。本例中,若去掉“i=i+1;”或将它改为“i=i-1;”的话,都将使“i=100”的条件永远满足,从而使循环变为无限循环而永不停止。,56,计算e的值 -,利用如下公式计算无理数e的近似值(精确到累加项 1/(n!) 小于 0.1e-10 时为止):e = 1 + 1/(1!) + 1/(2!) + 1/(3!) + . + 1/(n!) + .程序执行后的输出结果为:The approximate value of natural logarithm base is
25、 2.71828,57,编程分析:,1循环往e上累加,累加项数不定,通过一个条件来控制是否继续累加。通常使用while语句来实现,也可使用do-while语句来实现(本例使用do-while)。2往s上累加若干项的“程序构架” s=0; while ( 还需要进一步累加 ) term = .; /形成当前累加项terms += term; /往s上累加term项 注意:第一累加项term的值,一并在循环体中形成。,58,也可使用下面的替代形式:,s=0; term = .; /第一累加项term的值 while ( 还需要进一步累加 ) s += term; /往s上累加term项term =
26、 .; /形成下一累加项term ,59,3本例通过循环往e上累加,累加项变量为r,使用do-while来控制是否继续循环进行累加。e = 1.0; /“非共性”的1先赋值给er = 1.0; /第一累加项r之值:1/(1!) doe += r; /往e上累加当前的项rr = .; /形成下一累加项rwhile ( 还需要进一步累加 );注意到,下一累加项与当前累加项的如下关系:当前累加项r除以n(n值随循环依次为2、3、4、)所得的商恰为下一累加项。,60,进一步细化后的主体程序为:,e = 1.0; /“非共性”的1先赋值给e r = 1.0; /第一累加项r之值:1/(1!) n=1;
27、/ n初值为1 do e += r; /往e上累加当前的项rn+; /n加1后,使下一累加项恰为/当前累加项r除以n所得的商r = r/n; /形成下一累加项r while (reps );完整程序见书p97下半页处,从略。,61,思考题:,求下述三个序列的累加和(每一序列各累加n项,正整数n通过cin从键盘输入)。s1 = 1/5 + 1/4 + 3/11 + 2/7 + 5/17 + 3/10 + 7/23 + s2 = 2/1 + 3/2 + 5/3 + 8/5 + 13/8 + 21/13 + 34/21 + s3 = 1/1 - 3/(1+4) + 5/(1+4+7) - 7/(1+
28、4+7+10) + 9/(1+4+7+10+13) - ,62,提示:(1)使用循环依次对三个公式中的各累加项term进行累加。共循环n次,依次往s1、s2及s3上各累加n个term项,而且总是先形成累加项,而后将其累加到各自的s上。程序主体“构架”可设计为:s1 = s2 = s3 = 0; /放累加和的各s初值均置为0,63,while ( 还需要进一步累加 ) /共求出n项之和term1 = ; /形成第1序列的累加项term1term2 = ; /第2序列的累加项term2term3 = ; /第3序列累加项term3s1 += term1; /往s1上累加s2 += term1; /
29、累加到s2s3 += term1; /累加s3,64,(2)分析并总结各序列之相邻累加项之间的关系,为形成循环奠定基础。第一序列中,i为奇数的项,分子为i,分母比上一奇数项的分母增加6;而i为偶数的项,分子为i/2,分母比上一偶数项的分母增加3。第二序列中,后一累加项的分子为前一项的分子与分母之和,而后一累加项的分母恰为前一项的分子。第三序列中,前后累加项符号互异;第i项的分子为2*i+1;其分母总为上一累加项的分母加上lastNum(而lastNum初值为1,每循环一次,lastNum增加3)。,65,3 用于循环的for语句 -,for语句是最常用的循环语句之一。它可以使由该语句的循环体指
30、定的那些操作重复执行若干次(甚至无限多次)。for语句的格式如下:for( ; ; ),66,紧随for后括号中要连续给出三个“”,它们分别起到设置循环初值、给出循环条件、循环变量增值的作用。常将“”称为初值表达式, 将“”称为条件表达式, 将“”称为增量表达式。,67,再往后的“”是要被重复执行的所谓循环体, 它可以是一个任何语句,包括又是一个像for、while、do-while这样的循环语句(那将构成二重循环甚至更多重的循环)。若要在循环体中处理较多事情的话,通常使用复合语句来构成循环体。,68,for语句的执行过程如下:(1)计算“”;(2)计算“”,若结果值为0(假)则结束本for语
31、句,否则,先执行一遍作为循环体的那一“”,再计算“”,而后转(2)。,69,几点说明:,1. 用来设置循环初值的“”通常是一个赋值表达式或逗号表达式,主要给循环变量及其它相关变量赋初值。在for语句的执行过程中,“”只被执行一次。2. 给出循环条件的“”通常是一个关系表达式或逻辑表达式,只要该表达式的值为真(非0)就要继续进行循环。3. “”通常是一个赋值表达式,主要用于为循环变量增值(或减值),一般来说,该增值(或减值)要对还能否继续循环产生影响。,70,4. 三个表达式均可以是任何类型的表达式,且每一个表达式都可以省略(但表达式间的分号不可省)。省略“”,将省去置初值部分而直接转到“”处去
32、进行条件判断;省略“”,将认为该表达式的值永远为非0(真),此时循环将无休止地继续下去(除非靠break这样的句子跳出“死循环”);若省略“”,则不在此处为循环变量增值或减值(当然, 也可将循环变量的增值或减值放在作为循环体的那一“”处进行)。,71,5. “for( ; ; ) ” 的功能可用如下的while语句来描述:;while ( ); ,72,例1. 求sum=1+2+3+.+100的累加和。,求累加和sum的常用“程序构架”为:sum = 0; /“sum雪球”从0滚起for ( ) /控制要“滚”多少圈 sum = sum + ; /“sum雪球”继续滚实际上,由于for语句的使
33、用灵活性,可以“变形”为如下的各种实现形式(只给出其主体程序部分)。,73,形式一:,int i, sum=0;for (i=1; i=100; i+) sum=sum+i;点评:i为循环变量,sum中存放累加和,其初值为0。三个表达式齐全。,74,形式二:,for (int i=1, sum=0; i”为逗号表达式,给循环变量i及相关变量sum赋了初值。,75,形式三:,int i=1, sum=0;for ( ; i”以及“”,将循环变量i加1的操作放在了作为循环体的那一“”处进行。,76,形式四:,int i=1, sum=0;for ( ; ; )sum+=i+;if (i100) b
34、reak; ,77,点评:,三个表达式全省略。省略“”,将认为该表达式的值永远为非0(真)。循环体为一个复合语句,除负责往sum上作累加外,还负责控制只累加100项(靠“if (i100) break;”来实现,break强制中断当前的循环,而跳转到循环体的下一语句开头处去执行)。,78,形式五:,for (int i=1, sum=0; i”除实现sum累加外, 还负责将循环变量i加1(注意“sum+=i+;”等价于“sum=sum+i, i=i+1;”的功能)。注:还可编写出其它的形式,如,只省略“”或只省“”等。,79,例2. 读下述程序,注意其中的三个for循环语句以及所累加出的三个不
35、同的sum结果。,#include void main()int i, x, sum=0;for(i=1; i=10; i+)sum+=2; cout“sum=“sumendl; /输出:“sum=20”sum=0;for(i=1; i=10; i+)sum+=i; cout“sum=“sumendl; /输出:“sum=55”,80,sum=0;for(i=1; ix;sum+=x;cout“sum=“sumendl; /输出的sum结果为:所输入10个数的累加和 输出结果为: sum=20 sum=55 1 3 5 7 9 22 16 -18 -7 56 sum=94,81,点评:,(1)
36、第一个for语句,循环10次,每次往sum上累加2(注意,循环体中并没有使用循环变量i之值,i只起控制次数的作用)。(2)第二个for语句,循环10次,每次往sum上累加i(循环体中使用了循环变量i之值)。(3)第三个for语句,循环10次,每次往sum上累加一个从键盘输入的x(注意,循环体中并没有使用循环变量i之值)。,82,循环处理程序实例,实例1. 判断整数i是否为素数方法:用2,3,. i-1依次去除i, 若每一个数都除不尽i的话, 则i为素数。改进一(为节省时间,提高效率):用2,3,. i/2依次去除i, 若每一个数都除不尽i的话, 则i为素数。改进二(速度最快):用2,3,. s
37、qrt(i)依次去除i, 若每一个数都除不尽i的话, 则i为素数(其中的sqrt(i)表示i的平方根)。,83,#include void main()int i,j,isprime; /isprime标记某数是否为素数couti;isprime=1; /先认为i是素数for(j=i-1; j1; j-) /也可“for (j=2; j=i-1; j+)”if( i%j = 0 ) /若i有因子jisprime=0; /断言i非素数break; /跳出循环结束for语句,84,if(isprime)couti“ is a prime.“endl; elsecouti“ is not a pri
38、me.“endl; 程序执行后的输出结果为: Input a integer:997 997 is a prime.,85,几点注意:,(1)一旦找到i的一个因子, 就可断言i非素数,则不必再继续寻找i是否还有其它因子了。(2)注意如下的句间关系(“大句子”中套着“小句子”,而形成多层次的嵌套关系): break是一个独立的语句;它与“isprime=0;”共同构成一个复合语句;此复合语句是if语句的一部分(语句体),而整个if语句又是for语句的构成部分(for语句的循环体)。(3)使用“改进二”时,只需改变for循环变量j的初值即可:“for(j=sqrt(i); )”,由于要使用数学函数
39、sqrt,要包含头文件“math.h”。,86,实例2. 求最大数最小数,任意输入n个数,找出其中的最大数以及最小数并显示出来。例如,程序执行后的输入输出界面可设计为: Please input 10 numbers: 12 0.56 35.89 556 -10.2 77 999 -256 82 21 max=999 min=-256求解方法:循环n次,每次输入一个数并处理(比大小,大者放max,小者放min)。,87,#include void main()const n=10; /共输入n=10个数double x, max, min; /新输入的数放x,最大数放max,最小数放minco
40、utx; /新输入一个数,放入变量xif(i=1) /第一个数既是目前的最大数,又是最小数max=min=x;,88,else /非第一数时if(xmax) max=x; /新输入的数比目前的max更大,更新maxif(xmin) min=x; /新输入的数比目前的min还小,更新min / for icout“max=“maxendl;cout“min=“minendl; / main,89,实例3. 输出三角函数表 -,输出从0到90度之间每隔15度的正弦、余弦以及正切函数值。程序执行后的输出结果设计为:Angle x sin(x) cos(x) tan(x)0 0.0000 1.0000
41、 0.000015 0.2588 0.9659 0.267930 0.5000 0.8660 0.577445 0.7071 0.7071 1.000060 0.8660 0.5000 1.732175 0.9659 0.2588 3.732190 1.0000 -0.0000 -,90,求解方法与注意点:,(1)使用如下形式的循环语句来实现问题求解for (int doa=0; doa=90; doa+=inteval) 其中,doa表示度数,从0开始, 增量15,直到90。即,从0开始,每隔15度计算出正弦,余弦以及正切函数值并输出。(2)通过直接调用标准库函数sin、cos、tan来求各
42、函数值,但要包含头文件“math.h”。(3)调用三角函数时, 实参必须用弧度。程序中要首先将度数doa化为弧度arc:arc=pai*doa/180。(4)程序中靠“cout.setf(ios:fixed);”来设置以定点数格式输出数据,而使用“cout.precision(4);”可使小数点后保留4位数据。,91,#include #include void main()const float pai=3.1416; /有名常量paiconst int inteval=15; /15度为计算间隔/下述8句用于输出标题行(第一行)cout.width(10);cout“Angle x“; c
43、out.width(10);,92,cout“sin(x)“;cout.width(10);cout“cos(x)“;cout.width(10);cout“tan(x)“;float arc; /弧度值arccout.setf(ios:fixed); /设置以定点数格式输出数据/cout.flags(ios:fixed); /与上一句的功能完全相同cout.precision(4); /小数点后保留4位,93,for (int doa=0; doa=90; doa+=inteval)/度数从0开始, 增量15,直到90arc=pai*doa/180; /化为弧度arccoutendl;cou
44、t.width(10);coutdoa; /输出当前度数doacout.width(10);coutsin(arc); cout.width(10);coutcos(arc); cout.width(10);if(doa=90) cout“-“; /90度正切值特殊else couttan(arc); /非90度时coutendl;,94,实例4. 打印乘法九九表 (二重循环的例子),使程序执行后的输出结果具有如下“式样”: 1*1= 1 1*2= 2 1*3= 3 1*8= 8 1*9= 9 2*1= 2 2*2= 4 2*3= 6 2*8=16 2*9=18 3*1= 3 3*2= 6 3
45、*3= 9 3*8=24 3*9=27 8*1= 8 8*2=16 8*3=24 8*8=64 8*9=7 9*1= 9 9*2=18 9*3=27 9*8=72 9*9=81,95,#include /use “setw” void main() for(int i=1; i=9; i+) for(int j=1; j=9; j+)cout“ “i“*“j“=“setw(2)i*j;coutendl; ,96,求解方法与注意点:,(1)“for(i=1; i=9; i+)”使i循环体(一个复合语句)共执行9次, 每次负责印出一行(该行的被乘数均为i)。(2)i循环体的复合语句被执行9次,意味
46、着它所包含的两个子语句被顺序执行9次(注意,子语句1为“for j .”,它的循环体是其后的那一个“cout”;而再下一个“cout”则是“for j .”的“兄弟”,即复合语句内的第二个子语句,它被执行9次,实现9次“换行”)。(3)执行一次“for j .”,又要使它的循环体“cout”被执行9次。所以,受二重循环“for i .,for j .”控制的那一个cout语句共执行了9乘9即81次, 每次负责印出一个i乘j的乘法项之值。,97,实例5. 求1000以内的所有素数 -,判断整数i是否为素数的方法:用2,3,. sqrt(i)依次去除i, 若每一个数都除不尽i的话, 则i为素数。程
47、序执行后的输出结果样式可设计为(每10数占一行):2 3 5 7 11 13 17 19 23 2931 37 41 43 47 53 59 61 67 7173 79 83 89 97 101 103 107 109 113877 881 883 887 907 911 919 929 937 941947 953 967 971 977 983 991 997,98,实现要点与方法:,(1)使用循环判断从2到1000的每一个i是否为素数for(i=2; i=1000; i+)判断整数i是否为素数(若是则屏幕显示出i);(2)而要“判断整数i是否为素数”,使用“实例1”的方法(一重循环)来解
48、决(从而使整个程序变为二重循环程序)。,99,#include /use “sqrt” #include /use “setw” void main() const int m=1000; int i,j,isprime,count=0; /count记录素数个数 for(i=2; i=m; i+) /求2到m间的所有素数isprime=1; /先认为i是素数for(j=2; jsqrt(i); j+)if( i%j = 0 )isprime=0;,100,if(isprime)count+;coutsetw(5)i;if(count%10=0) coutendl; /每输出10个素数换1行 /if /for icoutendl; ,