程序结构和流程控制语句
程序结构和流程控制语
句
集团标准化小组:[VVOPPT-JOPP28-JPPTL98-LOPPNN]
C ++的语句类型
C++程序的组成:一个C++程序可以由若干个源程序文件组成,一个源程序文件可以有若干个函数和编译预处理命令组成,一个函数由函数说明部分和函数执行部分组成,函数执行部分由数据定义和若干个执行语句组成。语句是组成程序的基本单元。C++语言的语句可以分成以下六大类:
(1)说明语句:对变量、符号常量、数据类型的定义性说明
例如:int a,b,c; //定义整型变量a 、b 、c
① 仅向编译系统提供说明信息,在程序执行期间并不执行任何操作。
如,定义变量语句int a,b,c;是告诉编译系统为变量a 、b 、c 各分配4个字节的存储空间用于存放变量的值。程序执行时,该语句就不起任何作用了。 ② 说明语句可出现在函数内、外,允许出现语句的任何地方。 (2)控制语句:能改变程序执行顺序完成控制功能的语句。
C++中控制语句主要有:
(3)函数和流对象调用语句:函数调用语句又一次函数调用加一个分号构成一个语句,如:
【例1】分析下面程序的功能: #include
using namespace std;
int max(int a,int b) //自定
义函数
{ if(a>b) return a; else return b; }
int main()
{ int a,b,m;
cout<<"Input a,b:"; cin>>a>>b;
m=max(a,b); //函数调用语
句
cout<<"max="< (4)表达式语句:由一个表达式后加一个分号构成一个语句。 例如:由一个赋值表达式加一个分号构成一个赋值表达式语句:y=x*x+2*x; if ( ) ~ else ~ switch for( ) ~ while ( ) ~ do ~ while ( ) continue break return 注意: i=i+1 //是一个赋值表达式 i=i+1; //是一个赋值语句 (5)空语句:;只有一个分号所构成的语句称为空语句。下面就是一个空语句: ; 空语句什么也不做,它将在特殊的时候是有用的,讲循环时再细讲。(6)复合语句(语句块):用{ }将若干语句括起来构成的语句。“{ }”后不再需要分号。 复合语句主要用于控制语句中。 例如:{t=a;a=b;b=t;} //实现a,b数值的交换。 程序的三种基本结构即顺序结构、分支结构和循环结构,都是通过语句来实现的。 1.顺序结构:按语句顺序依次执行的结构称为顺序结构。 2.分支结构 (1)两路分支:在两种可能的操作中按条件选取一个执行的结构称为分支结构。 (2)多路分支:在多种可能的操作中按条件选取一个执行的结构称为分支结构, 3.循环结构:在人们所要处理的问题中常常遇到需要反复执行某一操作的情况,计算机实现这一操作的程序就要用到循环结构。 循环结构有两种形式,即当型循环结构和直到型循环结构。 分支语句 分支语句用于实现分支程序设计。分支程序有两路分支结构和多路分支结构,两路分支结构可用if 语句实现,多路分支结构可以用嵌套的if 语句或switch 语句实现。 1.if 语句的三种形式 (1)单选条件语句 语句格式:if (<表达式>) <语句> 执行过程:当表达式的值为非0 否则不执行语句。 说明: ① 表达式必须用“( )”括起来; ② 语句只能是单个语句或复合语句。 (2)两选条件语句 语句格式:if (<表达式>) <语句1> else <语句2> 执行过程:当表达式的值为非0(真)时,执行语句1, 否则执行语句2。 (3)多选条件语句 多选条件语句的格式为: if (<表达式1>) <语句1> else if (<表达式2>) <语句2> else if (<表达式2>) <语句3> ...... else if (<表达式n-1>) <语 句n-1> else <语句n> 单选条件语句执行过程图 两选条件语句执行过程图 多分支结构流程图 【例2】 输入两个整数a 和b ,用单选条件语句实现输出其中较大的一个数。 程序流程图如右图所示。程序如下: #include int a,b,max; cout<<"Input a,b:"; cin>>a>>b; max=a; if (b>max) max=b; cout<<"max="< 程序执行后屏幕显示: Input a ,b : 3 8 max=8 【例3】 输入两个整数a 和b ,用两选条件语句实现输出其中较大的一个数。 程序流程图如右图所示,程序代码如下: #include int a,b,max; cout<<"Input a,b:"; cin>>a>>b; if (a>b) max=a; else max=b; cout<<"max="< 程序执行后提示: Input a ,b : 3 8 max=8 求两个数中的最大值流程图 求两个数中的最大值流程图 【例4】已知下列分段函数,要求编一程序,输入x ,输出相应的y 的值。 分段函数 程序流程图如右图所示。程序代码如下: #include using namespace std; int main() { float x,y; cout<<"请输入一个实数x="; cin>>x; if (x<0) y=x+1; else if (x<10) y=x*x-5; else y=x*x*x; cout<<"y="< 程序执行后提示: 请输入一个实数x=3 y=4 2.if 语句的嵌套 在if 语句中又包含一个或多个if 语句称为if 语句的嵌套。其一般格式为: if (<表达式1>) if (<表达式2>) <语句1> else <语句 else if (<表达式3>) <语句3> else <语句4> 分段函数流程图 x 2 -5 0≤x<10 y= x+1 x<0 x 3 x ≥10 【例5】使用if 语句嵌套的方法实现【例4】 程序流程图及程序代码如下: #include using namespace std; int main() { float x,y; cout<<"请输入一个实数x="; cin>>x; if (x>=0) if (x>=10) y=x*x*x; else y=x*x-5; else y=x+1; cout<<"y="< return 0; } 程序执行后提示: 请输入一个实数x= -3 y=-2 注意:在该程序中,内层的if 语句嵌套在外层的if 语句的if 部分。C++规定if 语句嵌套使用时,else 与if 的的配对关系是:else 总是与其前面最近的还没有配对的if 进行配对。例如: 分段函数流程图 【例6】 求三个整数a 、b 、c 中的最大者,a 、b 、c 由键盘输入。(自行完成) #include using namespace std; int main() { int a,b,c,max; cout<<"请输入三个整数a,b,c:"; cin>>a>>b>>c; if (a>b) if (a>c) max=a; else max=c; else if (b>c) max=b; else max=c; cout<<"a,b,c 中最大的数max="< 2.switch 语句(开关语句):实现多路分支程序。 语句格式 switch (<条件表达式>) { case <常量表达式1>:〔<语句1>〕 case <常量表达式2>:〔<语句2>〕 ...... case <常量表达式n-1>:〔<语句n-1>〕 〔default:<语句n>〕 } 说明: (1)条件表达式与常量表达式只能是整型或字符型表达式; (2)每个case 后面的常量表达式的值必须互不相同; (3)一个case 后可有多个语句(不必用花括号),也可以没有任何语句。 注意:在执行switch 语句的过程中,每当执行完一个case 后面的语句后,程序会不加判断地自动执行下一个case 后面的语句。每个case 后面的常量表达式只起语句标号的作用,是switch 语句中执行各语句的入口,并不在此进行条件判断 【例7】输入0~6的整数,将其转换成对应的星期几。 程序代码如下: #include using namespace std; int main() { int a; cout<<"请输入一个0-6的整数(分别对应周日至周六):"; cin>>a; switch (a) { case 0:cout<<"Sunday\n"; case 1:cout<<"Monday\n"; case 2:cout<<"Tuesday\n"; case 3:cout<<"Wednesday\n"; case 4:cout<<"Thursday\n"; case 5:cout<<"Friday\n"; default:cout<<"Input data error.\n"; } system("pause"); return 0; } 3.b reak 语 句: 中止 当前语句的执行,并跳转到下一条语句处执行。 语句格式:break; 若将上例程序中switch语句的内嵌代码改写如下,请分析结果; case 0:cout<<" Today is Sunday\n";break; case 1:cout<<" Today is Monday\n";break; case 2:cout<<" Today is Tuesday\n";break; case 3:cout<<" Today is Wednesday\n";break; case 4:cout<<" Today is Thursday\n";break; case 5:cout<<" Today is Friday\n";break; case 6:cout<<" Today is Saturday\n";break; default:cout<<"Input data error.\n"; 注意:从开关语句的执行过程可知,任一开关语句均可用条件语句来实现,但并不是任何条件语句均可用开关语句来实现,这是由于开关语句限定了表达式的取值类型,而条件语句中的条件表达式可取任意类型的值。 【例8】 商店打折售货。购货金额数量越大,折扣越大。具体标准如下(m :购货金 am> cin>>m; if (m>=2000) c=8; else c=m/250; switch (c) { case 0:d=0;break; case 1:d=5;break; case 2: case 3:d=7.5;break; case 4: case 5: case 6: case 7:d=10;break; case 8:d=15;break; } f=m*(1-d/100.0); cout<<"f="< 【例9】2005年修改后的《中华人民共和国个人所得税法》规定,个人所得,应纳个人所得税。 具体办法是,每月收入总和扣除1600元后的金额为应缴纳所得税额,应纳税所得额不超过500元的税率为5%,超过500元至2000元的部分税率为10%,超过2000元至5000元的部分税率为15%, 超过5000元至20000元的部分税率为20%超过20000元至40000元的部分税率为25%,超过40000元至60000元的部分税率为30%,超过60000元至80000元的部分税率为35%,超过80000元至100000元的部分税率为40%,超过100000元的部分税率为45%。现要求编写程序,从键盘上输入某人本月的总收入,输出应缴纳的税额。 (要求学生自行完成) 循环语句(共三种,即while,do…while和for) 在人们所要处理的问题中常常遇到需要反复执行某一操作的情况。被重复执行的程序段为循环程序,实现循环结构的语句称为循环语句。在C++中,循环语句有while语句、do…while语句和for语句。 1.while语句Array(1)作用:实现“当型”循环结构。即当条件成 立时冲复执行while (2)格式:while (<表达式>) 语句 执行流程图如右图所示 while语句执行过程图相关说明: ①上述格式中的<表达式>称为循环条件表达式, 一般为关系表达式或逻辑表达式,必须用“( )”括起来; ②语句称为循环体,也称While的内嵌语句,可以是单个或复合语句。(3)执行过程:先计算表达式的值,当表达式值非0时重复执行指定的语句;当表达式值为0时结束循环。 【例10】:求从键盘上输入一个正整数n,计算S=1+2+3+4+……+n,并输出到屏幕上。 分析:由于n可能是不断变化的,因而计算S值的程序不可能依次列出1~n个数,要完成以上的累加求和运算,可设两个整型变量sum和i,sum存放累加的和,i 从1变化到n,并按下列步骤进行操作: (1)给sum赋值0,i赋值1; //循环初始化 (2)令sum=sum+i,i=i+1; //循环体与循环修改 (3)若i≤n,则重复执行步骤(2); //判断循环是否结束 (4)输出sum的值。 //结束处理 在以上步骤中,步骤(2)和步骤(3)是需要重复执行的操作,其工作流程如下图所示。这种重复执行的操作可由程序中的循环结构来完成。下面用while语句来实现。 说明: (1)while语句是先判断表达式i≤n是否成立, 若条件成立,则将sum加i后赋给sum及i增加1; 若条件不成立,则不执行相应语句,退出循环。 (2)当表达式的值一开始不成立,语句一次也不执行。 如当输入n为0时,i≤n不成立,语句sum=sum+i;和i++;一次也不执行。 (3)在循环体中必须有不断修改循环条件的语句,能使循环最终结束而不形成“死循环”。如i++;语句,使i不断加1,直到大于n为止。 【例10】:求从键盘上输入一个正整数n ,计算S=1+2+3+4+……+n,并输出到屏幕上。 程序代码和程序流程图如下: #include int i,n,sum; cout<<"请输入一个正整数n="; cin>>n; sum=0; i=1; while (i<=n) { sum=sum+i; i++; } cout<<" sum="< system("pause"); return 0; } 【例11】用while 语句计算T=n!(n!=1×2×3×4…×n)。 程序代码和程序流程图如下(用while 语句): #include int i,n,mult; cout<<"请输入一个正整数n="; cin>>n; mult=1; i=1; while (i<=n) { mult=mult*i; i++; } cout<<"mult="< 求1到n 累加和的流程图 求1到n 连乘积的流程图 2.do…while 语句 (1)作用:实现“直到型”循环结构。即重复执 行while (2)格式: do <语句> while (<表达式>); 注意:这里的语句与表达式跟上面讲到的while 语句当中的意义完全相同,只是 while 语句是先判断条件再执行循环体语句,而在do…while 语句的执行过程是:先执行语句,然后计算表达式的值,当表达式值非0时重复执行语句;直到表达式值为0才结束循环。 【例12】用do…while 语句实现【例10】 程序流程图及程序代码如下: #include int i,n,sum; cout<<"请输入一个正整数n="; cin>>n; sum=0; i=1; do { sum=sum+i; i++; } while(i<=n); cout<<"1到"< return 0; } 说明: (1)do…while 语句是先执行sum=sum+i;和i++;语句,后判断表达式i≤n 是否成立。 若条件成立,则继续执行循环体;若条件不成立,则不执行相应语句,退出 循环。 (2)即使表达式的值一开始就不成立,语句仍要执行一次。 如当输入n 为0时,i≤n 不成立,但语句sum=sum+i;和i++;也要执行一 次。 求累加和流程图 do-while 执行过程图 (3)在循环体中要能不断修改循环条件的语句,最终能使循环结束,否则会形成“死循环”。 【例13】用do…while语句实现【例11】。(要求学生自行完成程序流程图并调试程序) 3.for 语句 for 语句的一般格式为: for (<表达式1>;<表达式2>;<表达式3>) <语句> 说明: (1)表达式1称为循环初始化表达式,通常为循环变量赋初值; (2)表达式2称为循环条件表达式,通常是关系表达式或逻辑表达式作循环结束条件; (3)表达式3称为循环增量表达式,通常为赋值表达式,简单情况下为循环变量增量。 (4)语句部分为循环体,它可以是单个或复合语句。 for 语句的执行过程 (1)计算表达式1的值; (2)计算表达式2的值, 若表达式2的值为非0(“真”)时,则 转到(3); 若表达式2的值为0(“假”)时,则结 束循 环; (3)执行循环体语句; (4)计算表达式3的值,返回(2)继续执行。 for 语句的执行过程如右图所示。 3.for 语句可以和下列while 语句等效: <表达式1>; while (<表达式2>) { <语句> <表达式3>; } 【例14】用for 语句实现【例10】 #include int i,n,sum; cout<<"请输入一个正整数n="; cin>>n; sum=0; for(i=1;i<=n;i++) sum=sum+i; cout<<"1到"< for 语句执行过程图 T <语句> ② for (< ③ for 执行步骤图 在上例中,表达式1:i=1完成对循环变量i 的初始化赋值工作,使i 的初值为1; 表达式2:i<=n 判断循环变量i 的值是否小于或等于n ,若不成立则结束 循环; 若成立则执行sum=sum+i;语句,再执行表达式3; 表达式3:i++,使用循环变量i 加1。转表达式2继续判断i<=n 是否成 立。 说明: (1)for 语句中的三个表达式都可省略,但其中的两个分号不能省略; (2)若表达式1省略,则应在for 语句之前给循环变量赋初值。 例如:i=1; for(;i<=n;i++) sum=sum+i; (3)若表达式2省略,则不判断循环条件,循环无终止地进行下去,形成“死循 环”,即认为表达式2始终为真,因此表达式2通常不能省略; (4)若表达式3省略,则在循环体中应有能不断修改循环条件的语句。 例如:for (i=1;i<=n;) { sum=sum+i; i++; } (5)若省略表达式1和表达式3,只有表达式2,即只给出循环条件。 例如:i=1; for (;i<=n;) { sum=sum+i; i++; } 此时,for 语句和while 语句完全相同。上述语句相当于: i=1; while (i<=n) { sum=sum+i; i++; } (6)表达式1和表达式3可以是一个简单的表达式,也可以是其它表达式,当然 可以是逗号表达式,即用逗号“,”隔开的多个简单表达式,它们的运算顺序是从左到右顺序进行。例如:for(sum=0,i=1;i<=n;i++) sum=sum+i; 由此可见,用for 语句比用while 语句书写更简洁。 【例15】用for 语句【例11】(学生自行完成) 核心代码就一句话:for(t=1.0,i=1;i<=n;i++) t=t*i; 【例16】分析下列程序的执行过程,指出其功能。 三种循环语句的比较 (1)while 与for 语句为先判断后执行(当型:可能一次也不执行循环体); do…while 语句是先执行判断(直到型:循环体至少执行一次)。 (2)三种语句都是循环条件为真时执行循环体,为假时结束循环。 (3)在循环体至少执行一次的情况下,三种循环语句构成的循环结构可以相互转换。 实际上,用得最多的是for 语句,其次是while 语句,而do…while 语句用得较少。 #include using namespace std; int main() { int i; float t,sum; sum=0; for(i=1;i<=20;i++) { t=1.0/(i*(i+1)); sum=sum+t; } cout<<"S="< 4.循环语句的嵌套 循环语句中又包含有循环语句的结构称为循环语句的嵌套。循环语句的嵌套又称多重循环。当一个循环语句的循环体中只含一层循环语句时,称双重循环;若第二层循环语句的循环体中还包含一层循环语句时,称三重循环,等等。三种循环语句可以互相嵌套。 【例17】利用公式 ++++ =4 *3*2*113*2*112*111e 求e 的近似值。 #include int i,j; float e,t,p; e=1.0; //e 存放累加和,先赋初值1.0 for(i=1;i<=10;i++) //外循环,求10项的和 { t=1.0; //t 存放连乘积,先赋 初值1.0 for(j=1;j<=i;j++) //内循环,求i! t=t*j; //分别将j 乘以t ,再赋给t ,实现连乘 p=1.0/t; //求每一项p e=e+p; //将p 加入到e 中,实现累加 } cout<<"e="< system("pause"); return 0; } 【例18】编写程序打印如右表所示九九 表: #include cout<<"*"<<'\t'; for(i=1;i<=9;i++) cout< for(i=1;i<=9;i++) { cout< for(j=1;j<=i;j++) //内循环控制第二个乘数j从1变到i cout< } system("pause"); return 0; } 5.break语句: 除了能终止switch语句外,还可以终止单循环语句的执行,也可以从多重循环循环语句的内循环体跳到外循环体。 【例19】输入一个正整数,判断该数是否是素数。 #include using namespace std; int main() { int i,a; cout<<"Input an integer:"; cin>>a; for(i=2;i<=a-1;i++) if (a%i==0) break; //若a能被i整除,则a不是素数,用break退出。