1、第3章 程序设计初步,程序设计“做什么”、“怎么做”,写出语句,安排好它们的执行顺序,保证它的正确性和具有较高的效率,这就是算法需要解决的问题。 1、算法程序=算法+数据结构 算法为解决一个问题而采取的方法和步骤。可分为两大类别:数值算法和非数值算法。,3.1 面向过程的程序设计和算法,2、算法的表示 自然语言、流程图、伪代码、用计算机语言表示算法,每一个程序单位由以下几个部分组成: (1)预处理命令;(2)声明部分;(3)函数。如: #include using namespace std; int a=3; 全局变量int main( ) /函数首部 float b; 局部变量b=4.5;
2、 coutab; return 0; ,3.2 C+程序和语句,首部,全局变量和局部变量的有效范围。,C+程序结构可以用下图表示。,程序应该包括数据描述(由声明语句来实现)和数据操作(由执行语句来实现)。C+程序中最小的独立单位是语句。一般是用分号结束的(复合语句是以右花括号结束的)。C+语句可以分为以下4种: 1. 声明语句如 using namespace std; int a,b;int max(int x,int y); 等等。,2. 执行语句通知计算机完成一定的操作。执行语句包括: (1) 控制语句。完成一定的控制功能。C+有9种控制语句。 (2) 函数和流对象调用语句。函数调用语句
3、由一次函数调用加一个分号构成一个语句,例如sort(x,y,z); coutxendl; /流对象调用语句 (3) 表达式语句。由一个表达式加一个分号构成一个语句。如 i=i+1 /是一个赋值表达式i=i+1; /是一个赋值语句,3. 空语句只有一个分号的语句。下面是一个空语句:; 4. 复合语句用 把一些语句括起来成为复合语句。如: z=x+y;if(z100) z=z-100;coutz;注意:复合语句中最后一个语句中最后的分号不能省略。,赋值语句是由赋值表达式加上一个分号构成。 (1) 赋值号“”是一个运算符,可以写成a=b=c=d; (2) 区别赋值表达式与赋值语句的概念。例如if(a
4、=b)0) cout00) cout0endl;,3.3 赋值语句,C+的输出和输入是用“流”(stream)的方式实现的。下图表示C+通过流进行输入输出的过程。,3.4 C+的输入与输出,1、 输入流与输出流的基本操作一般格式cout变量1变量2变量n; 注意:一个插入运算符“”不能输出多个项:couta,b,c; /错误couta+b+c; /正确在用cout输出时,系统会自动判别输出数据的类型,并按相应的类型输出。 如 couta b cendl;,一个cout语句可以分写成若干行。如 coutThis is a simple C+ program.endl;,可以写成 cout“Thi
5、s is “a C+ “program.“endl;,也可写成cout“This is “; cout “a C+ “;cout “program.“;coutendl;,以上3种情况的输出均为This is a simple C+ program.,每行末尾无分号,语句最后有分号。,语句最后有分号,类似地,一个cin语句可以分写成若干行。如cinabcd;,可以写成cinab cd;,也可以写成cina;cinb;cinc;cind;,也可以分多行输入数据: 12 34,以上3种情况均可以从键盘输入:1 2 3 4,putchar函数(字符输出函数)putchar函数的作用是向终端输出一个字
6、符。例如 putchar(c);getchar函数(字符输入函数)此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符。getchar函数没有参数,其一般形式为getchar( )函数的值就是从输入设备得到的字符。,3、用getchar和putchar 函数进行字符的输入和输出,scanf函数一般格式是 scanf(格式控制,输出表列)printf函数的一般格式是printf(格式控制,输出表列),4、用scanf和printf函数进行输入和输出,例3.5 求一元二次方程式ax2+bx+c=0的根。#include x1=(-b+sqrt(b*b-4*a*c)/(2*a); x2=(-
7、b-sqrt(b*b-4*a*c)/(2*a);,3.5 编写顺序结构的程序,将数学表达式正确地写成合法的C+表达式。,3.6 关系运算和逻辑运算,例如,购物在1000元以下的打九五折,1000元及以上的打九折。流程如图所示。if (amount1000) tax=0.95; else tax=0.9; pay=amount*tax;,关系运算(比较运算) 关系表达式:用关系运算符将两个表达式连接起来的式子。 关系运算符、= 优先级相同 (高)= 、!= 优先级相同 (低)优先次序:,1、关系运算和关系表达式,分析: 952,x=95+2ca+b,ab=c,a=bc 关系表达式的一般形式可以表
8、示为:表达式 关系运算符 表达式其中的“表达式”可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式。如ab, a+bb+c,(a=3)(b=5), ab)(b52 f得到的值为0,逻辑型常量(又称布尔常量)只有两个,即false(假)和true(真)。逻辑型变量(又称布尔变量)要用类型标识符bool来定义,它的值只能是true和false之一。如bool found, flag=false; found=true; 逻辑型数据可以与数值型数据进行算术运算,false为0,true为1。如果将一个非零的整数赋给逻辑型变量,则按“真”处理,如flag=123; /赋值后flag的值为
9、truecoutflag; /输出为数值1。,2、逻辑常量和逻辑变量,逻辑表达式:用逻辑运算符将两个关系表达式连接起来的式子。C+提供3种逻辑运算符:(1) & (2) | (3) ! 例如:a & b 、a|b 、 !a 书中表3.2为逻辑运算的“真值表”。优先次序:(1) (2),3、逻辑运算和逻辑表达式,例如:(ab) & (xy) 可写成 ab & xy(a=b) | (x=y) 可写成 a=b | x=y(!a) | (ab) 可写成 !a | ab 逻辑表达式的一般形式可以表示为:表达式 逻辑运算符 表达式 例如: (1) 若a=4,则!a的值为0。 (2) 若a=4,b=5,则a
10、 & b的值为1。 (3) a,b值同前,a-b|a+b的值为1。 (4) a,b值同前,!a | b的值为1。 (5) 4 & 0 | 2 的值为1。,练习: 1、12|21; 95 & 52; !25;2、已知int i=32,j=1,k=3; !(!(true|false) (true & false) & !(true|false) i&j&k-3 34-i|k j!=k & i!=k !(i=6) (53) & (31) 53 & 31 531 !i|(j-k) & i & !(k-3|i*k),1 0 0 1 1 0 1 1 0 0,例如,要判别某一年(year)是否为闰年。闰年的
11、条件是符合下面两者之一: 能被4整除,但不能被100整除。能被100整除,又能被400整除。可以用一个逻辑表达式来表示:(year % 4 = 0 & year % 100 != 0) | year % 400 = 0 可以加一个“!”用来判别非闰年:!(year % 4 = 0 & year % 100 != 0) | year % 400 = 0) 也可以用下面的逻辑表达式判别非闰年:(year % 4 != 0) | (year % 100 = 0 & year % 400 !=0),3.7 选择结构和if语句,选择结构有:(1)if语句 (2)多分支结构switch语句(3)?:运算,
12、1、if语句的3种形式 (1)if(表达式)语句 单分支结构 例如:if(xy) coutxendl;,(2)if(表达式)语句1 else 语句2 双分支结构 例如: if (xy) coutx;else couty;写出求|x|的代码。,(3)if(表达式1) 语句1 /多分支结构else if(表达式2) 语句2else if(表达式3) 语句3else if(表达式m) 语句melse 语句n,说明: (1) 3种形式的if语句都是由一个入口进来,经过对“表达式”的判断,分别执行相应的语句,最后归到一个共同的出口。这种形式的程序结构称为选择结构。 (2) 在if后面是一个用括号括起来的
13、表达式,它是判断的“条件”,一般是逻辑表达式或关系表达式。 (3) 在if和else后面可以只含一个内嵌的操作语句,也可以是一个复合语句。,例:若int型变量x的值小于y的值时,则将x与y的值互换;否则,将x与y的值各加上100。if(xy) int temp; temp=x;x=y;y=temp;else x=x+100;y=y+100; ,复合语句,问题:为什么要使用temp变量?,例1 求三角形的面积。 例2 编写一个程序,计算:,例3 输入一个字符,判断该字符是否为小写字母,若是则将其转换为大写字母然后输出,否则原样输出。 分析:(1) 小写字母:a=ch=z (2) 小写字母转换成大
14、写:ch-32,在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:if( )if( )语句1 内嵌ifelse 语句2 elseif( )语句3 内嵌ifelse 语句4 注意if与else的配对关系。规定:else总是与它上面最近的、且未配对的if配对(“就近”原则)。否则会产生二义性(两个if将“争夺“同一个else!)。,2、if语句的嵌套,例:比较两个数的大小。 int main() int a,b;coutab;if(ab)coutb“endl;elseif(a=b) cout“a=b“endl;elsecout“ab“endl; return 0; ,例: if
15、 (a=b)if(b=c)cout“a=b=c“;else cout“a!=b“;,修改: if (a=b) if(b=c)cout“a=b=c“;else cout“a!=b“;,实现if else 正确配对方法:加 ,例 考虑下面程序输出结果:int main() int x=100,a=10,b=20;int v1=5,v2=0;if(ab)if(b!=15)if(!v1)x=1;elseif(v2) x=10;x=-1;coutx;,结果:-1,int main() int a,b,c;coutabc;if(a=b) if(a=c) cout=c) coutbendl;else cou
16、tcendl; return 0; ,例:找出三个数中的最大者,并输出。,条件运算符(? :) 例如,若有以下if语句:if (ab) max=a;else max=b;,3.8 条件运算符和条件表达式,max=(ab)?a:b;,其中“(ab)?a:b”是一个“条件表达式”。有3个操作对象,称三目(元)运算符。一般形式为:表达式1 ? 表达式2 表达式3条件运算符的执行顺序:,条件,条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。如 x? ab如果已定义x为整型变量,若x=0,则条件表达式的值为字符b的ASCII码。表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型
17、为二者中较高的类型。如 xy?1:1.5如果xy,值应为1,由于C+把1.5按双精度数处理,双精度的类型比整型高,因此,将1转换成双精度数,以此作为表达式的值。,例3.7 输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。char ch;cinch;ch=(ch=A ,if ( ch = A ,用switch语句来实现多分支选择结构。 一般形式:switch(表达式) case 常量表达式1:语句1case 常量表达式2:语句2.case 常量表达式n:语句ndefault:语句n+1,3.9 多分支选择结构和switch 语句,例:根据
18、考试成绩的等级打印出百分制分数段。,void main () char grade ;cout grade ;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 “ ; ,观察不同输入时的输出结果,执行流程,switch ( grade ) case a :case A : cout “ 85_100 n “ ; break ;case b :case
19、B : cout “ 70_84 n “ ; break ;case c :case C : cout “ 60_69 n “ ; break ;case d :case D : cout “ 60 n “ ; break ;default : cout “ error n “ ;,最后一个子句(default)可以不加break语句。,流程图见下图。,因此,应该在执行一个case子句后,使用break语句使流程跳出switch结构,即终止switch语句的执行。,注:多个case可以共用一组执行语句,如.case A: case B: case C: cout60n“;break;.当gra
20、de的值为A、B或C时都执行同一组语句。,例1:输入两个整数x、y,然后输入运算符op(+, -, *, /, %),程序负责计算出结果并显示在屏幕上。要求程序执行后的输入输出界面可设计为:First integer x:789Second integer y:10Operator op(+, -, *, /, %):%789%10=9,3.10 编写选择结构的程序,例3.9 运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下: s250km 没有折扣250s500 2折扣500s1000 5折扣1000s2000 8折扣2000s3000 10折扣3000s 15折扣设每公里每
21、吨货物的基本运费为p,货物重为w,距离为,折扣为d,则总运费f的计算公式为 f = p * w * s * (1 - d),while语句 Do while 语句For 语句一、用while语句构成循环当型循环。形式如下:while (条件表达式) 语句,3.11 循环结构和循环语句,执行过程: 特点:先判断表达式,后执行语句。,例3.10 求1+2+3+100。 用流程图表示算法。 int main( ) int i=1,sum=0;while (i=100) sum=sum+i;i+; cout“sum=“sumendl;return 0; ,注:(1)循环体有一个以上的语句,应该用花括号
22、。(2)在循环体中应有使循环趋向于结束的语句。,二、用do-while语句构成循环特点:先执行循环体,然后判断循环条件是否成立。 其一般形式为:do 语句while (表达式); 执行过程: 流程如图所示。,例3.11 用do-while语句求1+2+3+100。先画出流程图。int main( ) int i=1,sum=0;do sum=sum+i;i+;while (i=100);coutsum=sumendl;return 0;,三、用for语句构成循环,一般格式为:for(表达式1;表达式2;表达式3) 语句,可是任何合法的表达式,但一般用来给循环变量赋初值。,可是任一合法的表达式,
23、该表达式用来设置循环的条件,其值为true或其他非0值时,则执行循环体中的语句,否则退出循环。,用来修改循环变量的值,也可是其他任一合法的表达式。,执行过程:如图,也可理解为如下格式: for(循环变量赋初值;循环条件;循环变量增值) 语句,例如,用 for 语句的求和式 的程序。,int main () int i , sum = 0 ;for ( i =1 ; i = 100 ; i + )sum + = i ;cout “ sum = “ sum endl ;return 0; ,例如 for(i=1;i=100;i+)sum=sum+i;,i=1; while(i=100) sum=s
24、um+i;i+; ,for(表达式1;表达式2;表达式3) 语句,; while ( 表达式2 ) 语句表达式3;,等价于,表达式间的分号不可省,说明: (1) “表达式1”主要是给循环变量及其它相关变量赋初值,也可以是其他表达式。 “表达式1”只被执行一次。 (2) “表达式2”一般是关系表达式(如i=100)或逻辑表达式(如ab & xy) 。 (3) for语句中的3个表达式并不一定需要存在。必须注意每个表达式后的分号不能省略。如果三个表达式都省略,for语句的形式如下: for(;) 语句在循环体内必须有其他控制循环执行的语句,否则会形成死循环。,例如:,(1) i =1 ; /缺省表
25、达式1for ( ; i = n ; i + ) sum = sum + i ; ,(2) for ( i =1; ; i + ) sum = sum + i ;if (i n) break ; /缺省表达式2,(3) for ( i =1; i = n ; ) sum = sum + i ;i + + ; /缺省表达式3,(4) for ( i =1; i = n ; sum + = i + + ) ; /缺省循环体,(5) for ( i =1; sum + = i + + , i = n ; ) ; /缺省表达式3和循环体,(6) i = 1; /缺省全部 for 的表达式for ( ;
26、 ; ) sum + = i + + ;if ( i n ) break ; ,注意逗号表达式,四、几种循环的比较,1、用while语句 int main() int n;cin n;int i=2,f=1; /循环初始化while (i = n) f *= i;i+; /下一次循环准备cout “factorial of “ n “ = “ f endl;return 0; ,下面将用三种循环语句来解决同一个问题:求 n!,2、用do-while语句do f *= i;i+; while (i = n);,3、用for语句for (i=2,f=1; i=n; i+) f *= i;,一个循环
27、体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。3种循环可以互相嵌套。如下图:,3.12 循环的嵌套,第1层,第2层,第n层,for ( ) for ( ) while ( ) ,外层,内层1,内层2,内层n,while ( ) while () for ( ) ,例:找出100200间的全部素数。 分析: 编写程序如下:,break语句用于循环结构和switch结构中,无条件地结束switch语句,或循环语句,转向执行语句块的后续语句。 break; continue语句只用于循环体中,终止当前一次循环。continue;区别:continue语句
28、只结束本次循环,而不是终止整个循环的执行;而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,3.13 break语句和continue语句,(2) while(表达式1 ) 语句1if(表达式2) continue;语句2 ,(1) while(表达式1) 语句1if(表达式2)break;语句2 ,continue,例3.12 用下面公式求的近似值。/41-1/3+1/5-1/7 + 直到最后一项的绝对值小于10-7为止。,3.14 编写循环结构的程序,int s=1;double n=1,t=1,pi=0;while(fabs(t)1e-7) pi=pi+t; n=n
29、+2;s=-s; t=s/n; pi=pi*4;,例2. 求最大数最小数。任意输入n个数,找出其中的最大数以及最小数并显示出来。如输入输出界面可设计为:Please input 10 numbers:12 0.56 35.89 556 -10.2 77 999 -256 82 21max=999min=-256求解方法:循环n次,每次输入一个数并处理(比大小,大者放max,小者放min)。,for(int i=1; ix; if(i=1) max=min=x; /第一个数既是最大数又是最小数else /非第一数时 if(xmax) max=x; if(xmin) min=x; ,实例3. 打印
30、乘法九九表(二重循环的例子)使程序执行后的输出结果具有如下“式样“:1*1= 1 1*2= 2 1*3= 3 1*8= 8 1*9= 92*1= 2 2*2= 4 2*3= 6 2*8=16 2*9=183*1= 3 3*2= 6 3*3= 9 3*8=24 3*9=278*1= 8 8*2=16 8*3=24 8*8=64 8*9=79*1= 9 9*2=18 9*3=27 9*8=72 9*9=81int main() for(int i=1; i=9; i+) for(int j=1; j=9; j+)cout“ “i“*“j“=“setw(2)i*j;coutendl; return
31、0; ,实例4. 打印图形。输出如右图的图形。int main() int i,j; for(i=1; i=5; i+) /共印5行 for(j=1; j=5-i; j+) cout ; /第i行时,印“*“前先空5-i格for(j=1; j=2*i-1; j+) cout*; /而后连印2*i-1个“*“coutendl; return 0;,*,1、张三说李四在说谎,李四说王五在说谎,王五说张三和李四都在说谎。现在问:这三人中到底谁说的是真话,谁说的是假话? (a&!b | !a&b) & (b&!c | !b&c) | (c&a+b=0 | !c&a+b!=0)2、阶乘尾数零的个数。100!的末尾有多少个零? 3、有限5位数。个位数为6且能被3整除的五位数共有多少个?,4、高次方的尾数。求13的确3次方的最后三位数。,