1、13:32:34,1,C + 程序设计教程(第二版),第二章 基本编程语句 Chapter 2 Basic Programming Statements,清华大学出版社 钱 能,13:32:34,2,第二章内容,说明语句 ( Declarative Statements ) 条件语句 (Condition Statements ) 循环语句 ( Loop Statements ) 循环设计(Loop Designs ) 输入输出语句( Input/Output Statements ) 转移语句 ( Move Statements ) 再做循环设计(More Loop Designs ),13
2、:32:34,3,1. 说明语句 ( Declarative Statements ),数据说明:求解问题所使用的数据是什么性质,进行什么运算,表达范围如何,必须预先说明 说明方式: 既要指明其名字,也要指明其是什么类型,还可以顺便初始化如:int a;double d = 3.5; 说明数据的另一个目的是创建一个所需大小的实体空间给该名字,以便存储所用的数据值 若数据名字没有说明,使用其便是非法的,13:32:34,4,过程(函数)说明: 求解中需要通过函数调用来实施求解时,便要对函数的性质进行说明,说明其返回类型,参数类型,参数个数 函数说明分函数声明和函数定义两种: 函数声明是说明函数的
3、名字,函数的返回类型,以及函数的参数和个数如: double area(double ra); 函数定义是在函数声明的基础上,对整个实现过程进行详细定义如: double area(double ra) return ra*ra*3.14; ,13:32:34,5,调用函数就是使用函数名字,使用名字前必须清楚名字的性质,所以必须先对函数进行声明 运行程序中,会涉及到被调用函数的执行,所以凡是被调用的函数都必须有函数定义,不管该定义在程序的什么位置如: double sphere(); / 声明 int main() double result = sphere(); / 调用 coutr; r
4、eturn r*r*3.14; ,13:32:34,6,. 条件语句(Condition Statements ),if语句的两种形态:,语句1,条件,语句1,条件,语句2,是,是,否,否,13:32:34,7,对应语句:if(ab)coutaendl;if(a=b)coutaendl;elsecoutbendl;,13:32:34,8,错综复杂时,必须注意两义性:if(x0)if(x50)cout”x is ok.n”;elsecout”x is not ok.n”;,正解:else从属于紧挨的ifif(x0)if(x 50)cout”OKn”;elsecout”NOT OKn”;,误解:e
5、lse从属于外面的ifif(x0)if(x 50)cout”OKn”;elsecout”NOT OKn”;,13:32:34,9,条件表达式:对于if(x) a = 327981;else b = 327981;可表示为:x ? a=327981 : b=327981;如果a和b为同类型,则还可以:(x?a:b) = 327981;,13:32:34,10,switch多分支语句:switch(整数表达式)case value1:语句1; break;case value2:语句2; break;default:语句n; 等价于:if(整数表达式=value1)语句1;else if(整数表达
6、式=value2)语句2;else语句n;,13:32:34,11,虽然switch有等价的复合if表示, 而且,分支判断值只能是整数,显得应用范围狭窄, 但是switch在使用上的直观和灵活形式, 使得其仍具有编程价值. 如:break可选,甚至case可以重叠:case value1:语句1; case value2:语句2; case v1:case v2:case v3: 语句;,13:32:34,12,3. 循环语句 ( Loop Statements ),for循环结构:,13:32:34,13,对应语句为:for(int i=1; i=10; i+)cout”hello.n”;,
7、循环初始状态,条件判断,状态修正,循环体,13:32:34,14,每次循环体执行,都改变循环状态,直到条件不满足而终止.如,设置求和的初始值,交给循环计算,完成循环后,输出求和结果:int sum = 0; for(int i=1; i=100; i+) sum = sum+i; coutsumendl;,循环开始,循环结束,13:32:34,15,因为并不是所有循环都有明显的循环初始状态和状态修正的,所以,while循环是一种for循环的简洁形式.如,同样的求和:int sum=0, i=1; while(i=100)sum += i+; coutsumendl;,循环开始,循环结束,13:
8、32:34,16,4. 循环设计 ( Loop Designs ),(1)简单字符图形的双重循环M MM MMM MMMM MMMMM MMMMMM MMMMMMM MMMMMMMM MMMMMMMMM MMMMMMMMMM,13:32:34,17,分析方法:该图形一共10行,每一行增加一个字符,所以,应循环10次,每次输出一行,其循环模式为: for(int i=1; i=10; +i) 输出第i行(循环)换行 行 i M个数1 1 12 2 23 3 34 4 4 . 10 10 10,13:32:34,18,for(int i=1; i=10; +i) for(int j=1; j=i;
9、 +j)cout”M”;coutendl; ,13:32:34,19,(2)判断素数:(利用数学定律) mij 假定ij, 则 i2ijmj2 即 i2mj2 即 imjbool isPrime(int m) double sqm=sqrt(m*1.0);for(int i=2; i=sqm; +i)if(m%i=0) return false; return true;,13:32:34,20,5. 输入输出语句( Input/Output Statements ),标准输出流: 可以控制输出格式cout3)3); / 0 false coutfixed12345.678; / 12345.
10、678000 coutscientific123456.678; / 1.234568e+05,13:32:34,21,控制宽度和填充字符的操作是带参数的,注意width(n)为一次性操作,即第二次显示时将不再有效。默认为width(0),表示仅显示数值。例如:cout.width(5); cout.fill(S); cout coutsetw(6)setfill($)27endl; / 输出: $27,13:32:34,22,文件流的输入出操作与标准输入出基本相同,只是需要以一定方式打开和关闭 如,将文件a.in打开,逐行读入字符,输出到文件a.out:ifstream in(“a.in”)
11、;ofstream out(“a.out”);for(string s; getline(in, s); )outsendl;其中文件流读入操作总是伴随着状态返回,判断状态就可以确定文件是否正常读入,如getline(in,s)当读到文件尾时,便返回false,以使循环结束,13:32:34,23,. 转移语句 ( Move Statements ),break除了用在switch之外,主要的是用在终结本次循环for(int i; ; ) for( ; ; )/ .if(i=1)break;/ .a=1;/ . ,break跳到此处,13:32:34,24,continue一般是用条件判断执行
12、的,通过反条件,可以免去continue的使用,所以,它用来构筑良好的程序风格for(int n=100; n=200; +n)if(n%3=0)continue;coutnendl;免去continue的情形:for(int n=100; n=200; +n)if(n%3!=0)coutnendl;,13:32:34,25,goto的程序段除了系统跟踪和架构困难外,阅读也相对复杂:int a;goto Init;Forward:a = a + 1;Print:coutaendl;goto Down;Init:a = 1;goto Print;Down:if(a100) goto Forwar
13、d;等价于:for(int i=1; i=100; +i)couti“n”;,13:32:34,26,break语句的可取之处:/ 用break语句的代码段 bool flag=false; / 用于做退出记号 for(int i=1; i100; +i)for(int j=1; j100; +j)if(i*j=651)flag=true;break;else/ .if(flag) break; / goto语句的代码段 for(int i=1; i100; +i) for(int j=1; j100; +j)if(i*j=651) goto End;/ . End:,13:32:34,27,
14、7. 再做循环设计( More Loop Designs ),逻辑判断类的语句控制结构: for(所有可能情况) / 可为多重循环if(条件1不满足) continue;if(条件2不满足) continue;/ if(条件n不满足) continue;输出所要的结果,13:32:34,28,百鸡问题的例子: for(int c=1; c=13; +c) for(int h=1; h=18; +h) for(int s=1; s=96; +s) if(7*c+5*h+s/3-100) continue; if(c+h+s-100) continue; if(s%3) continue; cou
15、t“Cock:“c “, Hens:“h “, Chicks:“100-c-hendl; ,13:32:34,29,级数逼近问题 前后项之差与0的邻域(精度要求)的比较作为循环退出条件,是控制精度的必要方法 项值计算 由循环变量,根据通项公式,直接求第i项的值 也可先给出第一项的值,然后反复根据前项求后项,13:32:34,30,求级数 的例子: double sum=0, item=1; for(int n=1; abs(item)1e-6; +n) item *= (-1.0)*(2*n-3)/(2*n-1); sum += item; cout“Pi = “ setiosflags(ios:fixed) sum*4endl;,