C++程序设计 第三章 程序设计初步
3.1 面向过程的程序设计和算法 3.2 C++程序和语句 3.3 赋值语句 3.4 C++的输入与输出 3.5 编写顺序结构的程序 3.6 关系运算和逻辑运算 3.7 选择结构和if语句 3.8 条件运算符和条件表达式 3.9 多分支选择结构和switch语句 3.10 编写选择结构的程序 3.11 循环结构和循环语句 3.12 循环的嵌套 3.13 break语句和continue语句 3.14 编写循环结构的程序
3.1 面向过程的程序设计和算法 在面向过程的程序设计中,程序设计者必须指定计算机执行的具体步骤,程序设计者不仅要考虑程序要“做什么”,还要解决“怎么做”的问题,根据程序要“做什么”的要求,写出一个个语句,安排好它们的执行顺序。怎样设计这些步骤,怎样保证它的正确性和具有较高的效率,这就是算法需要解决的问题。
3.1 算法的概念 一个面向过程的程序应包括以下两方面内容: (1) 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。 (2) 对操作的描述。即操作步骤,也就是算法(algorithm)。 对于面向过程的程序,可以用下面的公式表示: 程序=算法+数据结构 作为程序设计人员,必须认真考虑和设计数据结构和操作步骤(即算法)。 算法是处理问题的一系列的步骤。算法必须具体地指出在执行时每一步应当怎样做。
3.2 C++程序和语句 一个程序包含一个或多个程序单位。每一个程序单位由以下几个部分组成: (1) 预处理命令。如#include命令和#define命令。 (2) 声明部分。例如对数据类型和函数的声明,以及对变量的定义。 (3) 函数。包括函数首部和函数体,在函数体中可以包含若干声明语句和执行语句。 如下面是一个完整的C++程序:
#include <iostream> //预处理命令 using namespace std; //在函数之外的声明部分 int a=3; //在函数之外的声明部分 int main( ) //函数首部 { float b; //函数内的声明部分 b=4.5; //执行语句 cout<<a<<b; //执行语句 return 0; //执行语句 } 如果一个变量在函数之外进行声明,此变量是全局变量,它的有效范围是从该行开始到本程序结束。如果一个变量在函数内声明,此变量是局部变量,它的有效范围是从该行开始到本函数结束。C++程序结构可以用图3.1表示。
图3.1
声明语句 如:int a,b; 在C++中,对变量(以及其他对象)的定义被认为是一条语句,并且可以出现在函数中的任何行,即可以放在其他程序语句可以出现的地方。这样更加灵活,可以很方便地实现变量的局部化(变量的作用范围从声明语句开始到本函数或本块结束)。
2. 执行语句 通知计算机完成一定的操作。执行语句包括: (1) 控制语句,完成一定的控制功能。C++有9种控制语句: ① if( )~else~ (条件语句) ② for( )~ (循环语句) ③ while( )~ (循环语句) ④ do~while( ) (循环语句) ⑤ continue (结束本次循环语句) ⑥ break (中止执行switch或循环语句) ⑦ switch (多分支选择语句) ⑧ goto (转向语句) ⑨ return (从函数返回语句)
(2) 函数和流对象调用语句。函数调用语句由一次函数调用加一个分号构成一个语句,例如 sort(x,y,z); //函数调用语句 cout<<x<<endl; //流对象调用语句 (3) 表达式语句。由一个表达式加一个分号构成一个语句。i=i+1 //是一个赋值表达式 i=i+1; //是一个赋值语句 任何一个表达式的最后加一个分号都可以成为一个语句。 3. 空语句 下面是一个空语句: ; 即只有一个分号的语句,它什么也不做。 4. 复合语句 可以用 { }把一些语句括起来成为复合语句。如下面是一个复合语句。 { z=x+y; if(z>100) z=z-100; cout<<z; }
3.3 赋值语句 赋值语句是由赋值表达式加上一个分号构成。 C++中的赋值号“=”是一个运算符,可以写成: a=b=c=d; //多重赋值语句 在C++中,赋值表达式可以包括在其他表达式之中 例如:if((a=b)>0) cout<<″a>0″<<endl;
3.4 C++的输入与输出 输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。 C++的输出和输入是用“流”(stream)的方式实现的。图3.2和图3.3表示C++通过流进行输入输出的过程。
图3.2 图3.3
C++的输入与输出 有关流对象cin、cout和流运算符的定义等信息是存放在C++的输入输出流库中的,因此如果在程序中使用cin、cout和流运算符,就必须使用预处理命令把头文件stream包含到本文件中: #include <iostream> 常常把由cin和流提取运算符“>>”实现输入的语句称为输入语句或cin语句;把由cout和流插入运算符“<<”实现输出的语句称为输出语句或cout语句。
*3.4.1 输入流与输出流的基本操作 cout语句的一般格式为 cout<<表达式1<<表达式2<<……<<表达式n; cin语句的一般格式为 cin>>变量1>>变量2>>……>>变量n; 在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl(或′\n′)为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。输出流中的数据在系统默认的设备(一般为显示器)输出。
一个cout语句可以分写成若干行。如 cout<<″This is a simple C++ program.″<<endl; 可以写成 cout<<″This is ″ //注意行末尾无分号 <<″a C++ ″ <<″program.″ <<endl; //语句最后有分号 也可写成多个cout语句,即 cout<<″This is ″; //语句末尾有分号 cout <<″a C++ ″; cout <<″program.″; cout<<endl; 以上3种情况的输出均为 This is a simple C++ program.
注意: 不能用一个插入运算符“<<”插入多个输出项: cout<<a,b,c; //错误,不能一次插入多项 cout<<a+b+c; //正确,这是一个表达式 在用cout输出时,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出 一个cin语句可以分写成若干行。如 cin>>a>>b>>c>>d; 从键盘输入: 1 2 3 4 ↙ 也可以分多行输入数据:
*3.4.2 在输入流与输出流中使用控制符 上面介绍的是使用cout和cin时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。C++提供了在输入输出流中使用的控制符(有的书中称为操纵符),见书中表3.1。 需要注意的是: 如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。 举例: 输出双精度数。
下面是整数输出的例子: double a=123.456789012345; // 对a赋初值 (1) cout<<a;输出:// 123.457 (2) cout<<setprecision(9)<<a; //输出: 123.456789 (3) cout<<setprecision(6);恢复默认格式(精度为6) (4) cout<< setiosflags(ios∷fixed);输出: 123.456789 (5) cout<<setiosflags(ios∷scientific)<<a;输出: 1.234568e+02 (6) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a; 输出: 1.2346e02 下面是整数输出的例子: int b=123456;对b赋初值 (1) cout<<b;输出: 123456 (2) cout<<hex<<b; 输出: 1e240 (3) cout<<setiosflags(ios∷uppercase)<<b;输出: 1E240 (4) cout<<setw(10)<<b<<′,′<<b; 输出: 123456,123456 (5) cout<<setfill(′*′)<<setw(10)<<b;输出: **** 123456 (6) cout<<setiosflags(ios∷showpos)<<b;输出: +123456 如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐。
#include <iostream> #include <iomanip> 例3.1 各行小数点对齐。 #include <iostream> #include <iomanip> using namespace std; int main( ) { double a=123.456,b=3.14159,c=-3214.67; cout<<setiosflags(ios∷fixed)<<setiosflags(ios∷right)<<setprecision(2); cout<<setw(10)<<a<<endl; cout<<setw(10)<<b<<endl; cout<<setw(10)<<c<<endl; return 0; } //输出如下: 123.46 //字段宽度为10,右对齐,取两位小数) 3.14 -3214.67
3.4.3 用getchar和putchar 函数进行字符的输入和输出 C++还保留了C语言中用于输入和输出单个字符的函数,使用很方便。其中最常用的有getchar函数和putchar函数。 1. putchar函数(字符输出函数) putchar函数的作用是向终端输出一个字符。例如 putchar(c); 它输出字符变量c的值。
例3.2 输出单个字符。 #include <iostream> //或者包含头文件stdio.h: #include <stdio.h> using namespace std; int main( ) {char a,b,c; a=′B′;b=′O′;c=′Y′; putchar(a);putchar(b);putchar(c);putchar(′\n′); putchar(66);putchar(79);putchar(89);putchar(10); return 0; } 运行结果为 BOY
2. getchar函数(字符输入函数) 此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。getchar函数没有参数,其一般形式为getchar( )函数的值就是从输入设备得到的字符。 例3.3 输入单个字符。 #include <iostream> using namespace std; int main( ) {char c; c=getchar( ); putchar(c+32); putchar(′\n′); return 0; } 在运行时,如果从键盘输入大写字母′A′并按回车键,就会在屏幕上输出小写字母′a′。 请注意,getchar( )只能接收一个字符。
3.4.4 用scanf和printf函数进行输入和输出 在C语言中是用printf函数进行输出,用scanf函数进行输入的。C++保留了C语言的这一用法。在此只作很简单的介绍。 scanf函数一般格式是 scanf(格式控制,输入表列) printf函数的一般格式是 printf(格式控制,输出表列)
例3.4 用scanf和printf函数进行输入和输出。 #include <iostream> using namespace std; int main( ) {int a; float b; char c; scanf(″%d %f %c″,&a,&b,&c); //注意在变量名前要加地址运算符& printf(″a=%d,b=%f,c=%c\n″,a,b,c); return 0; } 运行情况如下: 12 67.98 A ↙(本行为输入,输入的3个数据间以空格相间) a=12,b=67.980003,c=A(本行为输出) 输入的整数12送给整型变量a, 67.98送给单精度变量b,字符′A′送给字符变量c,。
3.5 编写顺序结构的程序 例3.5 求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入,它们的值满足b2-4ac≥0。 根据求x1,x2的算法。它可以编写出以下C++程序: #include <iostream> #include <cmath> //由于程序要用到数学函数sqrt,故应包含头文件cmath using namespace std; int main( ) {float a,b,c,x1,x2; cin>>a>>b>>c; x1=(-b+sqrt(b*b-4*a*c))/(2*a); x2=(-b-sqrt(b*b-4*a*c))/(2*a); cout<<″x1=″<<x1<<endl; cout<<″x2=″<<x2<<endl; return 0; }
编写顺序结构的程序 运行情况如下: 4.5 8.8 2.4 ↙ x1=-0.327612 x2=-1.17794 4.5 8.8 2.4 ↙ x1=-0.327612 x2=-1.17794 如果程序中要用到数学函数,都要包含头文件cmath(也可以用老形式的头文件math.h,但提倡使用C++新形式的头文件)。在写程序时,一定要注意将数学表达式正确地转换成合法的C++表达式。 可以看到: 顺序结构的程序中的各执行语句是顺序执行的。这种程序最简单,最容易理解。
3.6 关系运算和逻辑运算 往往要求根据某个指定的条件是否满足来决定执行的内容。例如,购物在1000元以下的打九五折,1000元及以上的打九折。 C++提供if语句来实现这种条件选择。如 if (amount<1000) tax=0.95; //amount代表购物总额,tax代表折扣 else tax=0.9; //若amount<1000,tax=0.95,否则tax=0.9 pay=amount*tax; //pay为实付款 流程可以用图3.4表示。 图3.4
3.6.1 关系运算和关系表达式 C++的关系运算符有: ① < (小于) ② <= (小于或等于) 优先级相同 (高) ① < (小于) ② <= (小于或等于) 优先级相同 (高) ③ > (大于) ④ >= (大于或等于) ⑤ == (等于) ⑥ != (不等于) 优先级相同 (低)
例如: c>a+b 等效于 c>(a+b) a>b==c 等效于(a>b)==c a==b<c 等效于a==(b<c) a=b>c 等效于a=(b>c) 用关系运算符将两个表达式连接起来的式子,称为关系表达式。 关系表达式的值是一个逻辑值,即“真”或“假”。例如,关系表达式“5==3”的值为“假”,“5>=0”的值为“真”。在C和C++中都用数值1代表“真”,用0代表“假”。 如果有以下赋值表达式:设:a=3;b=2;c=1; d=a>b 则d得到的值为1 f=a>b>c f得到的值为0 ?
3.6.2 逻辑常量和逻辑变量 关系表达式的值(真或假)分别用数值1和0代表。C++有逻辑型数据。逻辑型常量只有两个,即false(假)和true(真)。 逻辑型变量要用类型标识符bool来定义,它的值只能是true和false之一。 如:bool found,flag=false; //定义逻辑变量found和flag,并使flag的初值为false found=true; //将逻辑常量true赋给逻辑变量found 由于逻辑变量是用关键字bool来定义的,因此又称为布尔变量。逻辑型常量又称为布尔常量。所谓逻辑型,就是布尔型。
3.6.3 逻辑运算和逻辑表达式 有时只用一个关系表达式还不能正确表示所指定的条件。 C++提供3种逻辑运算符: (1) && 逻辑与 (相当于其他语言中的AND) (2) || 逻辑或 (相当于其他语言中的OR) (3) ! 逻辑非 (相当于其他语言中的NOT) 逻辑运算举例如下: a && b 若a,b为真,则a && b为真。 a||b 若a,b之一为真,则a||b为真。 !a 若a为真,则!a为假。 书中表3.2为逻辑运算的“真值表”。
逻辑运算和逻辑表达式 在一个逻辑表达式中如果包含多个逻辑运算符,按以下的优先次序: (1) !(非)→ &&(与)→ (或),即“!”为三者中最高的。 (2) 逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。 例如: (a>b) && (x>y) 可写成 a>b && x>y (a==b) || (x==y) 可写成 a==b || x==y (!a) || (a>b) 可写成 !a || a>b 将两个关系表达式用逻辑运算符连接起来就成为一个逻辑表达式,上面几个式子就是逻辑表达式。
逻辑运算和逻辑表达式 逻辑表达式的一般形式可以表示为: 表达式 逻辑运算符 表达式 表达式 逻辑运算符 表达式 逻辑表达式的值是一个逻辑量“真”或“假”。采取的标准是: 如果其值是0就认为是“假”,如果其值是非0就认为是“真”。 在C++中,整型数据可以出现在逻辑表达式中,在进行逻辑运算时,根据整型数据的值是0(逻辑量假)或非0 (逻辑量真) ,然后参加逻辑运算。 实际上,逻辑运算符两侧的表达式可以是任何类型的数据,如字符型、浮点型或指针型等。系统最终以0和非0来判定它们属于“真”或“假”。例如′c ′ && ′d′的值为1。
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。 3.7 选择结构和if语句 if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。 3.7.1 if语句的3种形式 1. if(表达式)语句 例如: if(x>y) cout<<x<<endl; 这种if语句的执行过程见图3.5(a)。 2. if(表达式)语句1 else 语句2 if (x>y) cout<<x; else cout<<y; 见图3.5(b)。
图3.5
3. if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 … else if(表达式m) 语句m else 语句n
例3.6 求三角形的面积。 #include <iostream> #include <cmath> //使用数学函数时要包含头文件cmath #include <iomanip> //使用I/O流控制符要包含头文件iomanip using namespace std; int main( ) { double a,b,c; cout<<″please enter a,b,c:″; cin>>a>>b>>c; if (a+b>c && b+c>a && c+a>b) { //复合语句开始 double s,area; //在复合语句内定义变量 s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); cout<<setiosflags(ios∷fixed)<<setprecision(4); //指定输出的数包含4位小数 cout<<″area=″<<area<<endl; //在复合语句内输出局部变量的值 } //复合语句结束 else cout<<″it is not a trilateral!″<<endl; return 0; } //please enter a,b,c:2.45 3.67 4.89↙ area=4.3565
3.7.2 if语句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下: if( ) if( ) 语句1 else 语句2 内嵌if else if( )语句3 else 语句4 内嵌if 应当注意if与else的配对关系。else总是与它上面最近的、且未配对的if配对。
注意:如果if与else的数目不一样,为顺利的实现程序,可以加花括号来确定配对关系。例如: { if ( ) 语句1} //这个语句是上一行if语句的内嵌if else 语句2 //本行与第一个if配对 这时{ }限定了内嵌if语句的范围,{ }外的else不会与{ }内的if配对。关系清楚,不易出错。
3.8 条件运算符和条件表达式 条件运算符要求有3个操作对象,称三目(元)运算符,它是C++中惟一的一个三目运算符。条件表达式的一般形式为: 表达式1 ? 表达式2 ∶表达式3 条件运算符的执行顺序是:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。“max=(a>b)?a:b” 的执行结果是将条件表达式的值赋给max。也就是将a和b二者中的大者赋给max。
3.9 多分支选择结构和switch 语句 switch语句是多分支选择语句,用来实现多分支选择结构。 它的一般形式如下: {case 常量表达式1:语句1 case 常量表达式2:语句2 ... case 常量表达式n:语句n default:语句n+1 }
例如,要求按照考试成绩的等级打印出百分制分数段,可以用switch语句实现: switch(grade) {case ′A′: cout<<″85~100\n″; case ′B′: cout<<″70~84\n″; case ′C′: cout<<″60~69\n″; case ′D′: cout<<″<60\n″; default : cout<<″error\n″; } 说明: (1) switch后面括号内的“表达式”,允许为数值、字符、枚举。 (2) 当switch表达式的值与某一个case子句中的常量表达式的值相匹配时,就执行此case子句中的内嵌语句,若所有的case子句中的常量表达式的值都不能与switch表达式的值匹配,就执行default子句的内嵌语句。
(3) 每一个case表达式的值必须互不相同,否则就会出现互相矛盾的现象。 (4) 各个case和default的出现次序不影响执行结果。例如,可以先出现“default:…”,再出现“case ′D′:…”,然后是“case ′A′:…”。 (5) 执行完一个case子句后,流程控制转移到下一个case子句继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行switch语句时,根据switch表达式的值找到与之匹配的case子句,就从此case子句开始执行下去,不再进行判断。 (6) 应该在执行一个case子句后,使流程跳出switch结构,即终止switch语句的执行。可以用一个break语句来达到此目的。 switch(grade) {case ′A′: cout<<″85~100\n″;break; case ′B′: cout<<″70~84\n″;break; case ′C′: cout<<″60~69\n″;break; case ′D′: cout<<″<60\n″;break; default : cout<<″error\n″;break; }
最后一个子句(default)可以不加break语句。如果grade的值为′B′,则只输出“70~84”。流程图见图3.7。 图3.7
在case子句中虽然包含一个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本case子句中所有的执行语句。 ... case ′A′: case ′B′: case ′C′: cout<<″>60\n″;break; ... 当grade的值为′A′、′B′或′C′时都执行同一组语句。
3.10 编写选择结构的程序 }//运行情况如下: 例3.8 编写程序,判断某一年是否为闰年。 3.10 编写选择结构的程序 例3.8 编写程序,判断某一年是否为闰年。 #include <iostream> using namespace std; void main(void) { int year; bool IsLeapYear; cout << "Enter the year: "; cin >> year; IsLeapYear = ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)); if (IsLeapYear) cout << year << " is a leap year "<< endl; else cout << year << " is not a leap year"<< endl; }//运行情况如下: ① 2005↙ 2005 is not a leap year. ② 1900↙ 1900 is a leap year.
3.11 循环结构和循环语句 在人们所要处理的问题中常常遇到需要反复执行某一操作的情况。这就需要用到循环控制。许多应用程序都包含循环。顺序结构、选择结构和循环结构是结构化程序设计的3种基本结构,是各种复杂程序的基本构造单元。因此程序设计者必须熟练掌握选择结构和循环结构的概念及使用方法。
3.11.1 用while语句构成循环 形式:while (表达式) 语句 执行顺序: 先判断表达式的值,为 true 时,再执行语句。 可以是复合语句,其中必须含有改变条件表达式值的语句。 执行顺序: 先判断表达式的值,为 true 时,再执行语句。
例3.10 求1+2+3+…+100。 用流程图表示算法,见图3.10。 根据流程图写出程序: #include <iostream> using namespace std; int main( ) {int i=1,sum=0; while (i<=100) { sum=sum+i; i++; } cout<<″sum=″<<sum<<endl; 运行结果为 sum=5050
3.11.2 用do-while语句构成循环 一般形式 执行顺序 与while 语句的比较: do 语句 while (表达式) 可以是复合语句,其中必须含有改变条件表达式值的语句。 执行顺序 先执行循环体语句,后判断条件。 表达式为 true 时,继续执行循环体 与while 语句的比较: While 语句执行顺序 先判断表达式的值,为true 时,再执行语句
图3.11 图3.12 用do-while语句构成循环
例3.11 用do-while语句求1+2+3+…+100。 先画出流程图,见图3.12。 可编写出下面的程序: #include <iostream> using namespace std; int main( ) {int i=1,sum=0; do { sum=sum+i; i++; }while (i<=100); cout<<″sum=″<<sum<<endl; return 0; }
3.11.3 用for语句构成循环 语法形式 for (表达式1;表达式2;表达式3) 语句 循环前先求解 每次执行完循环体后求解 循环条件判定 C++中的for语句使用最为广泛和灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。
说明: (1) for语句的一般格式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。 (2) 表达式1可以是设置循环变量初值的赋值表达式。 (3) 如果表达式2不能省略,即不判断循环条件,循环无终止地进行下去。 (4) 表达式2一般是关系表达式(如i<=100)或逻辑表达式(如a<b && x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。 (5)表达式3包括使循环趋于结束的操作(修正循环变量)。
3.11.4 几种循环的比较 (1) 3种循环都可以用来处理同一问题,一般情况下它们可以互相代替。 (2) while和do-while循环,是在while后面指定循环条件的,在循环体中应包含使循环趋于结束的语句(如i++,或i=i+1等)。 for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。 (3) 用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。
3.12 循环的嵌套 一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。 3种循环(while循环、dowhile循环和for循环)可以互相嵌套。例如,下面几种都是合法的形式: (1) while( ) {┆ while( ) {…} }
(2) do {┆ {…}while( ); }while( ); (3) for(;;) {…} } (6) do {┆ for (;;) {…} }while( ); (4) while( ) {┆ do {…}while( ); ┆ } (5) for(;; ) {…}
3.13 break语句和continue语句 break语句 continue 语句 Goto语句 Break语句用于强制退出循环语句以及switch 语句的执行,程序流程转到直接执行循环体后面的语句。不宜用在别处。 continue 语句 结束本次循环,程序流程转去执行对条件的判断,如果这时循环条件为真,则开始下一次循环,否则终止循环(continue语句不能用在switch语句中)。 Goto语句 大量使用goto语句将会使程序的流程无规律,降低程序的可读性,程序设计中提倡少使用goto语句。
break和continue语句 continue语句使流程结束本次循环,进入下次循环,并不结束整个循环 while(表达式1) { : if(表达式2) break; : } continue语句使流程结束本次循环,进入下次循环,并不结束整个循环 while(表达式1) { : if(表达式2) continue; : }
图3.18 图3.19
3.14 编写循环结构的程序 例3.12 用下面公式求π的近似值。π/4≈1-1/3+1/5-1/7+…直到最后一项的绝对值小于10-7为止。 根据给定的算法很容易编写程序如下: #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main( ) {int s=1; double n=1,t=1,pi=0; while((fabs(t))>1e-7) {pi=pi+t; n=n+2;
s=-s; t=s/n; } pi=pi*4; cout<<″pi=″<<setiosflags(ios∷fixed)<<setprecision(6)<<pi<<endl; return 0; 运行结果为 pi=3.141592 注意: 不要把n定义为整型变量,否则在执行“t=s/n;”时,得到t的值为0(原因是两个整数相除)。
例3.13 求Fibonacci数列前40个数。这个数列有如下特点:第1、2个数为1、1。从第3个数开始,每个数是其前面两个数之和。即 F1=1 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n≥3) 这是一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少? 可以从书中表3.4看出兔子数的规律。 根据给出的每月兔子总数的关系,可编写程序如下:
#include <iostream> #include <iomanip> using namespace std; int main( ) {long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++) {cout<<setw(12)<<f1<<setw(12)<<f2; //设备输出字段宽度为12, 每次输出两个数 if(i%2==0) cout<<endl;//每输出完4个数后换行,使每行输出4个数 f1=f1+f2; //左边的f1代表第3个数,是第1、2个数之和 f2=f2+f1; //左边的f2代表第4个数,是第2、3个数之和 } return 0;
例3.14 找出100~200间的全部素数。 编写程序如下: #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main( ) {int m,k,i,n=0; bool prime; //定义布尔变量prime for(m=101;m<=200;m=m+2) //判别m是否为素数,m由101变化到200,增量为2 {prime=true; //循环开始时设prime为真,即先认为m为素数 k=int(sqrt(m)); //用k代表根号m的整数部分 for(i=2;i<=k;i++) //此循环作用是将m被2~根号m除,检查是否能整除 if(m%i==0) //如果能整除,表示m不是素数
{ prime=false; //使prime变为假 break; //终止执行本循环 } if (prime) //如果m为素数 {cout<<setw(5)<<m; //输出素数m,字段宽度为5 n=n+1; //n用来累计输出素数的个数 if(n%10==0) cout<<endl; //输出10个数后换行 cout<<endl; //最后执行一次换行 return 0;
例题 1)While(int i=0) i-- 求循环次数 2)int i=5; do {cout<<i--<<endl; i--; } while(i!=0); 求循环次数 3)for (int i=0,j=10;i=j=10;i++,j--) 求循环次数 无限 无限
例题 下列语句不是死循环的是? int i=100; while (1) { i=i%100+1; if (i= =20) break } int i,sum=0; for (i=1;;i++) sum=sum+1; int k=0; do { ++k; } while (k>=0); Int s=3379; while (s++%2+3%2) s++;