第3章 控制语句_第1页
第3章 控制语句_第2页
第3章 控制语句_第3页
第3章 控制语句_第4页
第3章 控制语句_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章控制语句算法的基本控制结构有三种:顺序结构、选择结构和循环结构。为此,C++中提供了这三种控制语句,即顺序控制语句、选择控制语句和循环控制语句。3.1顺序控制语句所谓顺序结构,就是按照语句的顺序一条一条地执行。顺序控制语句是一类简单的语句,包括表达式语句、空语句和输入输出语句等。表达式语句是任何一个表达式加上一个分号。在C++程序中,有许多表达式语句。例如,以下都是表达式语句:a=1+n*2;x=3,y=10,c=1;a>b?a++:b++;

空语句是指只有一个分号的语句(“;”)。可见,空语句是一种不做任何操作的语句。该语句用在一些需要一条语句,但又不做任何操作的地方。3.1.1输出C++定义了运算符“<<”的iostream类,而“<<”就是用于处理内部类型的输出。使用cout输出流可在屏幕上显示字符和数字。C++提供了一些操纵符,可以直接嵌入到输入/输出语句中来实现I/O格式控制。注意:在使用setprecision和setw操纵符时要在程序开头包含iomanip.h。表3.1列出了几个常用的I/O流类库操纵符。操纵符名含义dec数值数据采用十进制表示hex数值数据采用十六进制表示oct数值数据采用八进制表示ws提取空白符endl插入换行符,并刷新流ends插入空字符setprecision(int)设置浮点数的小数位数(包括小数点)setw(int)设置域宽表3.1常用的I/O流类库操纵符1.显示常数使用cout可以显示字符串和数字,并可显示多个值。【例】分析以下程序的执行结果。#include<iostream.h>voidmain(){cout<<1.2345678<<endl;cout<<1<<2<<3<<4<<"\n";cout<<"VisualC++"<<6.0<<endl;}1.23457//只显示6个有效数字1234VisualC++62.八进制和十六进制数的输出在某些情况下,程序需要以八进制或十六进制数的形式输出。C++提供了简单的实现方法:只要在输出流中输出操纵符dec(十进制)、oct(八进制)或hex(十六进制)即可。

注意:一旦使用了进制操纵符,该操纵符的作用域一直连续到程序结束,或者遇到另一个进制操纵符。【例】分析以下程序的执行结果。#include<iostream.h>voidmain(){intn=100;cout<<"十进制:"<<dec<<n<<endl;cout<<"八进制:"<<oct<<n<<endl;cout<<"十六进制:"<<hex<<n<<endl;}十进制:100八进制:144十六进制:643.控制输出宽度C++提供的setw操纵符可以指定每个数值占用的宽度,即这个字符占用的最小字符长度。当用setw设置的宽度小于实际宽度时,该设置无效。

注意:setw操纵符只对紧跟着它的数值有效。如果要为多个数值设定宽度,必须多次使用setw操纵符。【例】分析以下程序的执行结果。#include<iostream.h>#include<iomanip.h>voidmain(){doublef=123.45;cout<<setw(10)<<1234567890<<endl;cout<<setw(10)<<f<<endl;cout<<setw(8)<<f<<endl;cout<<setw(6)<<f<<endl;cout<<setw(4)<<f<<endl;}执行结果:4.控制输出精度C++提供的setprecision操纵符可以设置显示数值的精度。

注意:一旦使用了setprecision操纵符,该操纵符的作用域一直连续到程序结束,或者遇到另一个setprecision操纵符。【例】分析以下程序的执行结果。#include<iostream.h>#include<iomanip.h>voidmain(){doubled=123.456789;cout<<d<<endl;cout<<setprecision(7)<<d<<endl;cout<<setprecision(8)<<d<<endl;cout<<setprecision(9)<<d<<endl;}123.457123.4568123.45679123.4567893.1.2输入C++提供了输入流cin,可以利用输入流cin读取键盘输入的字符和数字,并把它赋给指定的变量。从键盘上输入的数据通过cin接收,再由提取运算符“>>”送到程序指定的变量中。因此,用户输入数据时要避免输入的数据超出指定变量的值域。【例】分析以下程序的执行结果。#include<iostream.h>voidmain(){inti,j;cout<<"ij=";cin>>i>>j;cout<<i<<"+"<<j<<"="<<i+j<<endl;}ij=1245<Enter>12+45=573.2选择控制语句C++中的选择控制语句有if语句、if...else语句、if...elseif语句和switch语句。3.2.1if语句if语句用于在程序中有条件地执行某一语句序列,它有如下两种基本语法格式:

if(条件表达式)语句; if(条件表达式) { 语句序列; };【例】以下错误的语句为

A.if(x>y);B.if(x=y)&&(x!=0)x+=y;C.if(x!=y)scanf("%d",&x);elsescanf("%d",&y);D.if(x<y){x++;y++;}答:if语句的条件必须包含在一个括号中。本题答案为:B。3.2.2if...else语句如果希望在“条件表达式”为真和为假时分别执行不同的语句,则用else来引入条件表达式为假时执行的语句序列,这就是if...else语句,它根据不同的条件分别执行不同的语句序列,其语法形式如下: if(条件表达式) { 语句序列1; } else { 语句序列2; }【例】为了避免在嵌套的条件语句if-else中产生二义性,C语言规定:else子句总是与

配对。A.缩排位置相同的if B.同一行上的ifC.其之后最近的if D.其之前最近的if

答:本题答案为:D。【例】以下程序的输出结果是

。#include<stdio.h>main(){intx=2,y=-1,z=2;if(x<y)if(y<0)z=0;elsez+=1;printf("%d\n",z);}A.3 B.2C.1 D.0答:x<y为假,直接执行printf语句。本题答案为:B。【例】以下程序判断输入的年份是否为闰年(凡是能被400整除的,或不能被100整除但能被4整除的年份为闰年)。#include<iostream.h>voidmain(){ intyear,rem4,rem100,rem400; cout<<"输入年份:"; cin>>year; rem400=year%400; rem100=year%100; rem4=year%4; if((rem400==0)||((rem4==0)&&(rem100!=0))) cout<<year<<"是闰年"<<endl; else cout<<year<<"不是闰年"<<endl;}程序执行:输入年份:2006↙2006不是闰年3.2.3if...elseif语句if...elseif语句用于进行多重判断,其语法形式如下: if(条件表达式1)语句1; elseif(条件表达式2)语句2; … elseif(条件表达式n)语句n; else语句n+1;【例】以下程序将用户输入的分数转换成等级:A(≥90),B(80~89),C(70~79),D(60~69),E(<60)。 #include<iostream.h> voidmain() { floatx; cout<<"分数:";cin>>x; if(x>=90)cout<<"A"<<endl; elseif(x>=80)cout<<"B"<<endl; elseif(x>=70)cout<<"C"<<endl; elseif(x>=60)cout<<"D"<<endl; elsecout<<"E"<<endl; }3.2.4switch语句switch语句也称为开关语句,用于有多重选择的场合,测试某一个变量具有多个值时所执行的动作。switch语句的语法形式为: switch(整型表达式) { case整型常量表达式1:语句序列1; case整型常量表达式2:语句序列2; … case整型常量表达式n:语句序列n; default:语句n+1; }switch语句的执行顺序是:首先计算switch语句中“整型表达式”的值,然后在case语句中寻找值相等的整型常量表达式,并以此为入口标号,由此开始顺序执行。如果没有找到相等的整型常量表达式,则从“default:”开始执行。使用switch语句应注意下列问题:(1)整型表达式包括字符型或枚举型表达式。(2)各常量表达式的值不能相同,但次序不影响执行结果。(3)每个case分支可以有多条语句,但不必用{}。(4)每个case语句只是一个入口标号,并不能确定执行的终止点,因此每个case分支的最后应该加break语句,用来结束整个switch结构,否则会从入口点开始一直执行到switch结构的结束点。(5)当若干分支需要执行相同操作时,可以使多个case分支共用一组语句。如: case1: case2:printf(“case1和2\n”);注意:可以使用break退出switch语句的执行。如:case1:printf(“case1\n”);break; case2:printf(“case2\n”);【例】有以下程序:#include<stdio.h>main(){inta=15,b=21,m=0;switch(a%3){case0:m++;break;case1:m++;switch(b%2){default:m++;case0:m++;break;}}printf("%d\n",m);}程序运行后的输出结果是

。A.1 B.2C.3 D.4答:a%3=0,执行m++和printf语句。本题答案为:A。3.3循环控制语句循环控制语句提供重复处理的能力,当某一特定条件为真时,循环语句就重复执行,并且每循环一次,就会测试一下循环条件,如果为假,则循环结束,否则继续循环。C++支持三种格式的循环控制语句:while、do和for语句。三者可以完成类似的功能,不同的是它们控制循环的方式。3.3.1while语句while语句的一般形式为:while(条件表达式)语句;当“条件表达式”的运算结果为真时,则重复执行“语句”。每执行一次“语句”后,就会重新计算一次“条件表达式”,当该表达式的值为假时,循环结束。【例】设有以下程序段:intx=0,s=0;while(!x!=0)s+=++x;printf("%d",s);则______。A.运行程序段后输出0 B.运行程序段后输出1C.程序段中的控制表达式是非法的 D.程序段执行无限次答:x=0,!x=1,!x!=0为真,执行s+=++x,++x返回1,x=1,s=s+1=1;x=1,!x=0,!x!=0为假,不再执行循环语句。本题答案为:B。3.3.2do语句do语句的一般形式为:do语句;while(条件表达式);do语句每一次循环执行一次“语句”,然后计算“条件表达式”是否为真,如果是,则继续执行循环,否则结束循环。与while语句不同的是,do循环中的“语句”至少会执行一次,而while语句当条件第一次就不满足时,语句一次也不会被执行。【例】有以下程序段:intn=0,p;do{scanf("%d",&p);n++;}while(p!=12345&&n<3);此处do-while循环的结束条件是

。A.p的值不等于12345并且n的值小于3B.p的值等于12345并且n的值大于等于3C.p的值不等于12345或者n的值小于3D.p的值等于12345或者n的值大于等于3答:do-while循环的结束条件为!(p!=12345&&n<3),即p==12345||n>=3。本题答案为:D。3.3.3for语句for语句通常用于预先知道循环次数的情况,其一般形式为:for(初始化语句;表达式1;表达式2)语句;其中,“初始化语句”可以是一个定义语句或表达式语句,一般用于对一组变量进行初始化或赋值。“表达式1”用于控制循环,当它的值为真时,循环会继续下去,而它一旦为假,则终止循环。“表达式2”在每次循环执行完成后执行,一般用于改变控制循环的变量。“语句”在“表达式1”为真时执行。具体来说,for循环的执行过程为:①执行“初始化语句”;②计算“表达式1”的值;③如果“表达式1”的值为真,先执行后面的“语句”,再执行“表达式2”,然后转向步骤②;如果“表达式1”的值为假,则结束循环。【例】以下程序的输出结果是

。#include<stdio.h>main(){inta=0,i;for(i=1;i<5;i++){switch(i) { case0: case3:a+=2; case1: case2:a+=3; default:a+=5; }}printf("%d\n",a);}A.31 B.13C.10 D.20答:i=1,执行a+=3和a+=5语句,a=8;i=2,执行a+=3和a+=5语句,a=16;i=3,执行a+=2、a+=3和a+=5语句,a=26;i=4,执行a+=5语句,a=31。本题答案为:A。【例】下面程序的功能是:计算1到10之间奇数之和及偶数之和,请填空。#include<stdio.h>main(){inta,b,c,i; a=c=0; for(i=0;i<10;i+=2) {a+=i;

;c+=b; } printf("偶数之和=%d\n",a); printf("奇数之和=%d\n",c);}答:参见本节要点1。for循环中i扫描所有偶数,b扫描所有奇数。本题答案为:b=i+1。3.4跳转语句跳转语句用于中断当前一段程序的执行,跳转到其他地方继续执行。跳转语句包括break、continue和goto语句。3.4.1break语句break语句将使程序从当前的循环语句(do、while和for)内跳转出来,接着执行循环语句后面的语句。【例】以下程序的输出结果是

。#include<stdio.h>main(){ inti=0,a=0; while(i<20) {for(;;) {if(i%10==0)break; elsei--; } i+=11; a+=i; } printf("%d\n",a);}A.21 B.32C.33 D.1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论