1、第三章VC+程序结构顺序、选择、循环程序的三种基本结构 顺序结构顺序结构a块b块AB分支选择结构分支选择结构a块b块成立不成立条件AB条件a 块成立不成立AB 循环结构循环结构赋值表达式深入n“再谈”变量q占位符n拥有内存空间内存空间的标识符n变量的输入,即将值存入存入对应内存n对变量的赋值,用新值覆覆盖性盖性地改写改写原来存储的值n变量的引用即将对应内存中的值代换变量int a;acina;a=10;2int b=a;10b10?如何理解语句如何理解语句a=a+1;?如何交换变量如何交换变量a、b的值的值赋值表达式深入n赋值表达式:左结合,所赋之值为表达式的值。可作为操作数参与其他运算。qb
2、=c=d=a+5qa=(b=4)+(c=6)n复合赋值表达式q+=、-=、*=、/=qa+=3 等价于 a=a+3n赋值表达式加“;”即可称为赋值语句赋值表达式深入n赋值时的类型转换q整型实型 :去掉小数赋值,注意溢出溢出q实型整型 :加 .0q整型unsigned char :按字节赋值,高八位补0q整型signed char :按字节赋值,扩展符号位q整型unsigned int 或 long int : 注意溢出溢出n强制的类型转换溢出:超出可表示范围,结果出错,系统不报错溢出:超出可表示范围,结果出错,系统不报错赋值表达式深入n赋值时的类型转换int a=258,b;unsigned
3、char c;b=c=a;b=?int a=254,b;char c;b=c=a;b=?特殊的算术运算n自增运算()int p1;p+; /等价于p=p+1;q只有变量有自增运算q自增运算分前置自增(+p)和后置自增(p+)n前置自增:先自增、再取值n后置自增:先取值、再自增int p=1,a;a=+p; /和a=p+;结果比较n自减()选择语句选择结构之条件语句条件语句利用关键字if选择执行两个分支中的一个分支,因此通常也称为“if语句”。分支选择结构分支选择结构a块b块成立不成立条件AB当(如果)条件成立时执行当(如果)条件成立时执行a块块if (条件成立条件成立)a块语句;块语句;如何表
4、达?如何表达?关系运算符与关系表达式n 关系运算是对两个操作数进行的比较运算: = = !=n关系表达式的运算结果是一个整数q当关系成立关系成立时,结果为1q当关系不成立关系不成立时,结果为0。n关系表达式多用于条件的判断选择结构之条件语句n引例:已知,当x1时,y=x,其中x、y均为整数,请编程实现根据x的值输出y的值。n分析:q主要问题当(如果)x1时,y=xq转换代码if (x=1)y=x;q补充代码块内只有一条语句时,可省块内只有一条语句时,可省n例:当x1时,y=x,其中x、y均为整数。#includevoid main()int x,y;coutx;if(x=1)y=x;couty
5、=yendl;单选条件语句条件表达式条件表达式”x=1”要用圆要用圆括号括起来括号括起来if所在行末尾没有分号!所在行末尾没有分号!为什么?二中选一条件语句#includevoid main()int x,y;coutx;if(x1)y=2*x-1;couty=y1可简化为:可简化为:if(x1非非此此即即彼彼嵌套条件语句#includevoid main()int x,y;coutx;if(x1 & x=10)y=3*x+11;couty=yn;分段函数分段函数y=x 当当x1y=2x-1 当当1x1 & x10是何意?是何意?为何不写成为何不写成1x0 & y0 成立;qx & y0 成立
6、; qx & y 成立。qx0 | y0 成立;qx | y 成立。q!(x0) 不成立;q!(x!=1) 成立;q!x 不成立。n如果x=0,y=-1,则q x0 & y0 不成立;qx & y0 不成立; qx & y 不成立。qx0 | y0 不成立;qx | y 成立。q!(x0) 成立;q!(x!=1) 不成立;q!x 成立。课内练习:?数学中数学中xa或或xb, 在在c+中应如何表示中应如何表示?数学中数学中axb , 在在c+中应如何表示中应如何表示回到嵌套条件语句#includevoid main()int x,y;coutx;if(x1 & x=10)y=3*x+11;cou
7、ty=yn;分段函数分段函数y=x 当当x1y=2x-1 当当1x10y=3x+11 当当x10可简化为:可简化为:if(x=1)y=x;else if(x1 & x1代表条件代表条件 x=10条件运算符”?:”n条件运算符“? :”为三目运算符,要求有三个操作对象,使用格式为:q ? : n 计算条件表达式值的具体过程如下:q先计算,q若其值不等于0,则计算,并将计算的值作为该条件表达式的值;q否则求解的值,并将该值作为条件表达式的值。条件条件条件成立条件成立条件不成立条件不成立例:求两个整数中的较大数#includevoid main()int a,b,max;couta;coutb;if
8、(a=b)max=b;elsemax=a;coutmax=maxn;可简化为:可简化为:max=(a=b) ? b : a;例:输入两个整数,按从小到大的顺序输出这两个数。#includevoid main()int a,b;couta;coutb;if(a=b)couta,bn;elsecoutb,an;一行可以写多条语句。一行可以写多条语句。另一种方法:如果另一种方法:如果a比比b大,则将大,则将a、b的的值交换后再输出值交换后再输出。第一个算法:交换两个变量的值#includevoid main()int a,b,t;couta;coutb;if(ab)t=a;a=b;b=t;couta
9、,bendl;可不可以写成:a=b;b=a;if分支语句如果不止一条,则分支语句如果不止一条,则须把这些语句用花括号括起来。须把这些语句用花括号括起来。用花括号括起来的语句称之为用花括号括起来的语句称之为复合语句。复合语句。if(条件)语句小结n单选条件:if (if () ) n 嵌套条件(多条件):if (if () 1) 1 else if( else if() 2) 2 else if else if else else nn 二选一条件:if (if () ) 1 else else 2 条件语句小结n上述三种形式中的 可以是一般的表达式,也可为一个变量也可为一个变量。表达式的值用来
10、表示“条件”,必须放在括号中。nif和else后的部分如果有多个语句,则必须用大括号 括起来,构成复合语句;对于单个语句,则可以不用大括号。条件语句小结nif和else后的还可以是if语句。如: if ( ) if ( ) 语句1 else ( ) 语句2 else if ( ) 语句3 else ( ) 语句4nelse不能单独使用,必须与最近最近的if配对。(语句行缩进)switch语句(开关语句)n与嵌套语句类似,用于多条件选择switch(switch() case case : 1: 语句序列语句序列1 1 breakbreak; case case : n: 语句序列语句序列n n
11、 breakbreak; defaultdefault: n+1 控制表达式控制表达式(整型、字符型整型、字符型)情况情况常数常数(整型、字符型)(整型、字符型)switch语句(开关语句)n switch语句的执行过程为q先计算switch控制表达式的值q然后,将该值与每个case分支中的常量表达式的值进行比较n如果相等,则执行该分支后面的语句序列,直到直到遇到一个breakbreak为止,结束switch结构;n如果没有一个相等,则执行defaultdefault分支中的语句序列;n如果既没有匹配的case,又没有default分支,则不执行该switch结构中的任何语句。课堂练习,找出语
12、法错误 #define m 4/宏定义const int n=3;float x; int a,b;a=3; b=4;switch(2*x) /A case 3.5: /B case a+b: /C case 1,2,3: /D case 3*m: /E case m+n: /F switch语句(开关语句)n“breakbreak”语句称为跳转语句跳转语句n用于跳出switch语句,终止switch语句的执行n在一个case分支中,如果没有没有breakbreak语句语句,则switch在执行完一个case分支之后,会继续执行继续执行下一个case分支语句n在一个case分支的语句序列中,b
13、reak语句通常都为最后一条语句。n“defaultdefault”为缺省分支缺省分支n相当于嵌套条件语句中的elsen它的作用是匹配“除除上述case之外之外的一切情况”ndefault分支语句可以放在switch语句中的任何位置,但通常为最后一个分支,因为在它之后在它之后的case分支不起任何作用不起任何作用例:要求按照考试成绩的等级打印出分数段 switch(grade) case a: cout“85-100n”; case b: cout“70-84n”; case c: cout“60-69n”; case d: cout“60n”; default: cout“errorn”;
14、?如果grade的值为c,输出结果是什么60-6960error多余输出?多余输出?每个每个case语句序列后缺少语句序列后缺少break语句!语句!switch(grade) case a: cout“85-100n”;break; case b: cout“70-84n”; break; case c: cout“60-69n”; break; case d: cout“60n”; break; default: cout“errorn”; 为了只输出对应标号对应的结果,可在语句后加上break语句! 多个case可以共用一组执行语句,例: case a: case b: case c:
15、cout60n”; break;在switch结构中,case的多个执行语句不需要用花括号括起来.需要缺省break语句情况又例,教材又例,教材P45使用switch语句的注意点n每个case常量表达式值必须互不相同常量表达式值必须互不相同,否则就会出现编译错误 。 nswitch后控制表达式必须是整数整数、字符或枚举类型的变量或常量,同样,每一个case分支后的常量表达式必须是由字面常量字面常量、宏定义的常量宏定义的常量、constconst常量构成的表达式,其值也必须是整数、字符或枚举类型的常量。且每一个每一个casecase分支只能判别一个常量。分支只能判别一个常量。(书例P46) ns
16、witch结构的执行部分为由多个case分支及可缺省的default分支组成的复合语句,switch语句下面的大括号不能省。 nswitch语句允许嵌套。循环结构语句循环结构语句循环结构 循环结构一般由两部分组成: 进入或退出循环的条件循环的条件:该条件决定是否继续下一轮循环。当该条件满足时,进入下一轮循环,否则退出循环。 循环体循环体:为每一轮循环所进行的操作,通常由一个语句序列构成。 条件条件a 块块成立成立不成立不成立AB 循环结构 while()语句语句 nwhile( )语句属于当型循环结构: while(while() nwhile( )语句的执行流程为q先计算循环条件表达式的值n
17、若不等于0,则执行循环体中的语句q循环体执行完毕后,再计算循环条件表达式的值,nq重复以上过程,直到条件循环表达式的值等于0时,退出循环。条件条件a 块块成立成立不成立不成立AB 循环结构应用while()语句的注意点nwhile后的“条件表达式”一定要用一对圆括弧“( )”括起来。n如果循环体中的语句多于一条时,应该用大括号“”括起来。n在循环体中必须有必须有改变“循环条件表达式”值的语句。否则,如果不采用其它方法退出循环,将不能退出循环,成为死循环。 nwhile循环可以嵌套。n留心边界值(循环次数)。试编程计算1+2+3+4+100的值。void main() int i=1,sum=0
18、; while(i=100) sum=sum+i; i+; coutsum ; 和变量,初值为和变量,初值为0!dowhile()语句语句 ndowhile()语句的结构属于直到型循环结构,其一般格式为: do do while( while(); ; ndowhile()语句的执行流程为q当程序运行到do时,立即执行循环体q然后计算循环条件表达式n如果循环条件表达式的值不为0,则继续执行循环体q如此反复,直到循环条件表达式的值为0,结束循环。 应用dowhile()语句的注意点n在while()中要注意的地方同样也适用于dowhile()语句n对dowhile()还要特别注意一点,即whil
19、e()while()后的后的分号不能少分号不能少 n在一般情况下,用while()语句和dowhile()语句处理同一个问题时,如果两者的循环体和条件表达式都相同,则他们的结果也一样。但是当while后面的条件表达式一开始就为一开始就为0 0时,两种循环的结果是不一样的。试编程计算1+2+3+4+100的值。void main() int i=1,sum=0; do sum=sum+i; i+; while(i=100) ; coutsum ; 与while循环的区别: 先执行循环体语句,再判断条件表达式,因此do/while循环至少循环一次,而while循环有可能一次循环都不执行!例:例:用
20、迭代法求用迭代法求a0a0的平方根。其迭代公式为:的平方根。其迭代公式为:x x0 0=a/2=a/2,x xn+1n+1=(x=(xn n+a/x+a/xn n)/2)/2。要求前后两次求出的。要求前后两次求出的x x的差的绝对值小于的差的绝对值小于1010-7-7。#include #include void main() float x0,x1,a; cina; if(a0) couta1e-5) x0=x1; x1=(x0+a/x0)/2; couta“的平方根为:”x1n;for语句语句for(for(1; 2; ) 非非00求解表达式求解表达式1表达式表达式2循环体循环体求解表达式
21、求解表达式3for()语句的后继语句()语句的后继语句for()语句的流程图控制表达式控制表达式赋初值表达式赋初值表达式修正表达式修正表达式定义循环变量定义循环变量或或对循环变量进对循环变量进行初始化行初始化改变表达式改变表达式2中中循环变量的值循环变量的值试用for循环编程求1+2+3+100的值void main() int i,sum=0; for(i=1;i=100;i+) sum=sum+i; cout“SUM is”sum;表达式1可以省略,但应写在for循环之前,如下:i=1;for(;i=100;i+) sum=sum+i;表达式3可以省略,但应写在for循环体内,如下:i=1
22、;for(; i=100; ) sum=sum+i; i+;两个两个“;”永不可缺省!永不可缺省!试编程输出100200之间的能被3整除的数#includevoid main()int i;for(i=100;i=200;i+)if(i%3=0) coutit;求解“在指定范围找某种特征值”的问题:1.范围可作为循环控制变量的计数范围。2.循环体中用“特征公式”对循环变量的每次取值进行特征筛选。?求解能被?求解能被11整除的三位数整除的三位数 break语句与语句与 continue语句语句nbreak语句的一般格式为: break; 立即结束整个循环过程,转而执行循环结构下面的语句。此时,通
23、常和if语句结合使用。ncontinue语句的一般格式如下: continue;只结束本次循环,忽视循环体中剩余语句,直接判断是否继续下次循环。#includevoid main() int i; for(i=100;i=200;i+) if(i%3=0) coutit; #includevoid main() int i; for(i=100;i=200;i+) if(i%3!=0) continue; coutit; 输出100200之间的能被3整除的数用用continue改写程序改写程序break语句与语句与 continue语句语句#includevoid main()int i;fo
24、r(i=100;i=200;i+)if(i%3!=0) break;coutit;#includevoid main()int i;for(i=100;i=200;i+)if(i%3!=0) continue;coutit;算法:让m被2到sqrt(m)之间的整数除,如果找到第一个能整除m的数,则立即退出整个循环,m不为素数,如果m不能被任何一个数整除,则m为素数。试编程判断整数m是否是素数#include#includevoid main()int i,m;coutm;for(i=2;isqrt(m)coutmtis a prime number!n;elsecoutmtis not a prime number!n;