《初步程序设计》PPT课件.ppt

上传人:tia****nde 文档编号:14155863 上传时间:2020-07-08 格式:PPT 页数:96 大小:537KB
收藏 版权申诉 举报 下载
《初步程序设计》PPT课件.ppt_第1页
第1页 / 共96页
《初步程序设计》PPT课件.ppt_第2页
第2页 / 共96页
《初步程序设计》PPT课件.ppt_第3页
第3页 / 共96页
资源描述:

《《初步程序设计》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《初步程序设计》PPT课件.ppt(96页珍藏版)》请在装配图网上搜索。

1、简单程序设计,C+程序的一些基本要素,如描述数据的变量,常量,描述运算的运算符,表达式等等,同学们也初步了解了C+程序的一个基本概貌,其实一个大型的,完整的,实用的C+程序结构,它应该是由若干个源程序文件组成的,而每个源程序可以由若干个函数和预处理命令,全局变量定义说明组成,而一个函数则是由数据定义和执行语句组成,在面向对象的程序设计中,则通过类的定义、封装、调用来实现程序功能。虽然有多个C+程序文件,但它们中只允许一个main()函数。 一个面向过程的程序应包括以下两方面内容: (1) 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。 (2

2、) 对操作的描述。即操作步骤,也就是算法(algorithm),程序结构图,#include using namespace std; int a=3; int main( ) float b; b=4.5; coutab; return 0; ,财务软件的结构,首先进行需求分析和总体设计,我们知道财务软件的目的是用计算机来代替手工进行会计,财务核算,所以程序流程和业务模式一定要遵循财政部的会计准则。,总控程序,main.cpp,帐务处理,报表管理,工资核算,成本核算,固定资产,设置科目,凭证录入,数据查询,km.cpp,pz.cpp,look.cpp,团队,财务制度, 业务,数据库, 大型项

3、目的管理 与组织经验,语句,程序应该包括数据描述(由声明语句来实现)和数据操作(由执行语句来实现)。数据操作的任务是对已提供的数据进行加工。 C+中最小的独立单位是语句(statement)。语句一般是用分号结束的(复合语句是以右花括号结束的)。 C+语句可以分为以下4种: 1. 声明语句 如int a,b; 在C+中,声明语句可以出现在函数中的任何行,即可以放在其他程序语句可以出现的地方.,语句,2. 执行语句 通知计算机完成一定的操作。执行语句包括: (1) 控制语句,完成一定的控制功能。9种 if( )else (条件语句) for( ) (循环语句) while( ) (循环语句) d

4、owhile( ) (循环语句) continue (结束本次循环语句) break (结束switch或循环语句) switch (多分支选择语句) goto (转向语句) return (从函数返回语句),语句,(2) 函数和流对象调用语句。函数调用语句由一次函数调用加一个分号构成一个语句,例如 sort(x,y,z); / 调用sort函数 coutxendl; / 流对象调用语句 (3) 表达式语句。由一个表达式加一个分号构成一个语句。最典型的是: 由赋值表达式构成一个赋值语句。 i=i+1 / 是一个赋值表达式 i=i+1; / 是一个赋值语句 3. 空语句 ; 4. 复合语句 可以

5、用 把一些语句括起来成为复合语句。 z=x+y; coutzendl; ,简单输入输出,C+的输出和输入是用“流”(stream)的方式实现的。下图表示C+通过流进行输入输出的过程。,简单输入输出,cout语句的一般格式为 cout表达式1表达式2表达式n; 在定义流对象时,系统会在内存中开辟一段缓冲区,用来暂存输入输出流的数据。在执行cout语句时,先把插入的数据顺序存放在输出缓冲区中,直到输出缓冲区满或遇到cout语句中的endl为止,此时将缓冲区中已有的数据一起输出,并清空缓冲区。 int a = 5; char c = M; float x = 16.62 cout a c x end

6、l; cout “Output is complete!” endl; 输出时字符之间是无间隔的,如果想让字符间有间隔,必须输出间隔符,简单输入输出,cin语句的一般格式为 cin变量1变量2变量n; 在用cin输入时,系统也会根据变量的类型从输入流中提取相应长度的字节。如有 char c1,c2; int a; float b; cinc1c2ab; 如果输入 1234 56.78 注意: 34后面应该有空格以便和56.78分隔开。 也可以按下面格式输入: 1 2 34 56.78 由于空格作为数据间隔符,所以不能用cin输入. 在组织输入流数据时,要仔细分析cin语句中变量的类型,按照相应

7、的格式输入,否则容易出错。,cin 与 cin.get( )的区别 (1) cin 例如: char c1, c2, c3; cinc1; /A cinc2c3; 程序执行到A行时,等待用户输入数据。 若输入:A b c 则 cin分别将字符A、b、c赋给变量c1、c2、c3。 cin 自动跳过输入的空白字符(包括空格,制表,backspace和回车等)。,简单输入输出,(2)cin.get() 例如: char c1, c2, c3; cin.get(c1); /B cin.get(c2); cin.get(c3); 程序执行到B行时,若输入:A b 则执行结果是:字符A、空格、字符b分别赋

8、给变量c1、c2、c3;输入行中仍保留回车符。 cin.get()把从键盘上输入的所有字符,包括空白字符,都作为输入字符赋给字符变量,简单输入输出,例子: char c1, c2, c3; coutc1c2c3; / C cout 程序继续执行并输出结果: c1 is ac2 is bc3 is c 可以看出,双引号中的的字符串常量照原样输出。,简单输入输出,请看下例: int i, j; float x, y; coutij; cinxy; cout 则程序输出: i=10j=20 x+y=13.1 输出时各数据间是无间隔的,因此应当有意输出一些间隔符,简单输入输出,上面介绍的是使用cout

9、和cin时的默认格式。但有时人们在输入输出时有一些特殊的要求,如在输出实数时规定字段宽度,只保留两位小数,数据向左或向右对齐等。 需要注意的是: 如果使用了控制符,在程序单位的开头除了要加iostream头文件外,还要加iomanip头文件。 举例: 输出数值性数据。,输入和输出格式控制,double a=123.456789012345; / 对a赋初值 (1) couta; 输出: 123.456 (2) coutsetprecision(9)a;输出: 123.456789 (3) coutsetprecision(6); 恢复默认格式(精度为6) (4) coutsetiosflags

10、(iosscientific)a; 输出: 1.234568e+02 int b=123456; / 对b赋初值 (1) coutb; 输出: 123456 (2) couthexb; 输出: 1e240 (3) coutsetw(10)b,b; 输出: 123456,123456 (4) coutsetfill(*)setw(10)b; 输出: *123456,输入和输出格式控制,各行小数点对齐。 double a=123.456,b=3.14159,c=-3214.67; coutsetiosflags(iosfixed);/浮点数以固定的小数位数 coutsetiosflags(iosr

11、ight)setprecision(2); coutsetw(10)aendl; coutsetw(10)bendl; coutsetw(10)cendl; 输出如下: 123.46 (字段宽度为10,右对齐,取两位小数) 3.14 -3214.67 先统一设置取两位小数、右对齐。这些设置对其后的输出均有效(除非重新设置),而setw只对其后一个输出项有效,因此必须在输出a,b,c之前都要写setw(10)。,输入和输出格式控制,程序结构,C+语言中的语句形式虽然不多,但是这些语句足以构成结构化程序设计的三种最基本结构,这三种的基本结构为: A. 顺序结构:是指语句是按先后顺序来执行,一 条接

12、着一条由上到下执行. B. 选择结构:是根据给定的条件进行判断,若条 件成立执行某些语句,不成立则执行其他一 些语句,也可以通过多条不同的条件来执行 多个不同的语句块 C. 循环结构:是根据循环条件反复执行某些语 句,直到条件不成立,顺序执行,例子: 输入三角形的边长,求三角形面积。 我们首先假设三边长为a, b, c,那么根据数学知识,我们得知三角形的面积为 area = sqrt(s(s-a)(s-b)(s-c) 其中 s = (a+b+c)/2 #include #include void main() float a, b, c, s, area; cin a b c; s = (a

13、+ b + c) / 2; area = sqrt(s(s-a)(s-b)(s-c); cout“其面积为:” areaendl; ,选择结构,“关系运算”在逻辑运算中是比较简单的一种类型,“关系运算”实际上就是“比较运算”,比较两个值的结果,数值比较其值大小,而字符比较按ASCII码值大小,比较的结果为“真”,在C+语言中以1表示,“假”就用0表示,如: a 1000; 该关系不成立,其值为0 a != A; 该关系成立,其值为1 其中 , !=都是关系运算符,关系运算符两边可以是常量,也可以是变量,如: a 3 ; 如果整形变量a = 5, 那么该关系成立,其值为 1,如果整形变量a =

14、1, 那么该关系不成立,其值为 0,1.关系运算符 C+ 提供了6种关系运算符(双目运算符): 、=、=、 =、!= 优先级:高于赋值运算符,低于算术运算符 内部:、=、 = 四种比 =、!=两种要高 如: ca+b c(a+b) ab!= c (ab)!=c a=bc a=(bc),关系运算符和关系表达式,2.关系表达式 用关系运算符将两个表达式连接起来的式子。表达式可以是算术表达式,关系表达式,逻辑表达式,赋值表达式或字符表达式. 其结果值为1(代表逻辑真)或0(代表逻辑假)。 如: a+b100 (a=3)(b=5) a b (ab)(bc) a6-2 -3-2-1 (如果 a=1,b=

15、2,c=3,d=4,上面结果 ? ),关系运算符和关系表达式,逻辑变量和常量,C+增加了逻辑型数据。逻辑型常量只有两个,即false(假)和true(真)。逻辑型变量要用类型标识符bool来定义,它的值只能是true和false之一。如 bool found,flag=false; found=true; /将逻辑常量true赋给found 由于逻辑变量是用关键字bool来定义的,因此又称为布尔变量。 设立逻辑类型的目的是为了看程序时直观易懂。 在编译系统处理逻辑型数据时,将false处理为0,将true处理为1。因此,逻辑型数据可以与数值型数据进行算术运算。如果将一个非零的整数赋给逻辑型变量

16、,则按“真”处理,如 flag=123; /赋值后flag的值为true coutflag; /输出为数值1,数学上 0 x = 100 在C+表示为 0x 例如:if(score = 85) cout= 60) cout“及格”endl; else cout“不及格”endl; 这种if语句的执行过程见下图(b)。,if 语句,if 语句,3. if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; else if(表达式m) 语句n; else 语句n+1; 流程图见下图 例如:if(score=85) cout=70) cout=60) c

17、out“及格”endl; else cout“不及格”endl;,if 语句,if 语句,市场西瓜价格规定如下: 重量低于公斤(含公斤)的,每公斤元 大于公斤,不足公斤(含公斤)的,每公斤元,公斤以上的,每公斤元,编程计算任意公斤的西瓜价格,if 语句,main() float weight, price; cout weight; if(weight = 5) price = 1.8 * weight; else if(weight = 10) price = 1.5 * weight; else price = 1.2 * weight; coutweight“斤西瓜的价格为:”price

18、endl; / 可以采用最简单的if格式,怎么写 ?,main() float weight, price; cout weight; if(weight 5 ,在if语句中,满足条件时要执行多条语句时,应将多条语句用 括起来 if (表达式) 语句; if(表达式) 语句1; 语句2; 语句3; 如: if(x y) x = 10; y = 20; ,if 语句,在if语句中又包含一个或多个if语句,我们称为if语句嵌套,它的一般形式为: if (表达式) if(表达式) 语句; else 语句; else if(表达式) 语句; else 语句; C语言规定,else 总是和它上面最近的i

19、f配对,所以我们处理嵌套if语句时,一定要处理好if和else之间的关系。,if 语句嵌套,main() int a, b; a = b = 5; if( a != 1) if( b = 1) cout a += b endl; else cout a -= b endl; cout a + b endl; else 应该和if(b = 1)匹配, 应该右移,和if(b=1)对齐,所以书写格式也很重要,if 语句嵌套,如果在if语句中,不管条件表达式真或假,都只执行一个同一变量的赋值语句,那么我们就可以采用条件运算符来表达它的一般形式为: 表达式1 ?表达式2:表达式3 执行顺序:先求解表达式

20、1的值,若非0(真)则返回表达式2的值,否则返回表达式3的值。 如: if (a b) max = a; else max = b; 采用条件运算符后就很简单: max = (a b) ? a : b ; 条件运算符优先赋值运算符,但比关系运算符和算术运算符都低 如:max = (a b) ? a : b + 1 等同于 max = (a b) ? a : (b + 1),条件运算符,例子:输入一个字符(不管大写或小写),最后以小写输出。 main() char ch; cin ch; ch = (ch = A 提问: 输入一个整数, 输出该数的绝对值,条件运算符,main() int a;

21、cin a; cout (a0)?-a:a endl; ,switch 多分支语句,switch语句是多分支选择语句,用来实现多分支选择结构。它的一般形式如下: switch(表达式) case 常量表达式1:语句1 case 常量表达式2:语句2 . case 常量表达式n:语句n default:语句n+1 其中 switch,case,default为关键字,说明: 1. 表达式可以为整型、字符型、枚举型 2. 各case中的常量必须互不相等 3. 表达式的值依次跟case语句中的某常量相比较,如 果相等,则执行其后面的语句;如果都不匹配,则 执行default后的语句。 4. 执行过程

22、中如果碰到 break 语句,就退出整个 switch语句,继续执行switch后的语句; 5. default语句是可选择的,根据需要,可有可无。,switch 多分支语句,switch 多分支语句,例如:要求按照考试的等级打印出百分制分数段. switch(grade) case A: printf(“85100n”); break case B: printf(“7084n”); break; case C: printf(“6069n”); break; case D: printf(“ 60n”); break; default : printf(“Error Graden”); ,

23、例子:运输公司对所运货物实行分段计费。设运输里程为s,则运费打折情况如下: s250 不打折扣 250=s500 2%折扣 500=s10005%折扣 1000=s20008%折扣 2000=s300010%折扣 3000=s15%折扣 设每公里每吨的基本运费为p,货物重量为w,折扣为d,则总运费f为:f=p*w*s*(1-d) 设计程序,当输入p、w和s后,计算运费f。,switch 多分支语句,算法 1、输入每吨运费p、货物重量w、运输里程s; 2、根据运输里程s计算折扣d; 3、计算总运费f=p*w*s*(1-d); 4、输出计算结果; 算法细化: 2、根据运输里程s计算折扣d 分析:如

24、果用switch语句,必须使表达式符合语法要 求,分析发现,里程s的分段点均是250的倍 数,因此,将里程s除以250,取整数商,便得 到若干整数值。,switch 多分支语句,switch(c=s/250) case 0: d=0; break; case 1: d=0.02; break; case 2: case 3: d=0.05; break; case 4: case 5: case 6: case 7: d=0.08; break; case 8: case 9: case 10: case 11:d=0.1;break; default:d=0.15; ,s250 不打折扣 2

25、50=s500 2%折扣 500=s1000 5%折扣 1000=s2000 8%折扣 2000=s3000 10%折扣 3000=s 15%折扣,switch 多分支语句,#include #include void main( ) int c,s; float p,w,d,f; coutpws; c=s/250; switch(c) case 0: d=0; break; case 1: d=0.02; break; case 2: case 3: d=0.05; break; case 4: case 5: case 6: case 7: d=0.08; break; case 8:ca

26、se9:case10:case11:d=0.1;break; default:d=0.15; ,switch 多分支语句,f=p*w*s*(1-d); cout运输单价为pt重量为wt 里程为sendl; cout折扣为dendl; cout运费为fendl; ,switch 多分支语句,上机题: 设计一个计算器程序,实现加、减、乘、除 运算,譬如在键盘上输入 3+5,那么计算机应 该输出 3+5=8。,循环结构,在人们所要处理的问题中常常遇到需要反复执行某一操作的情况。这就需要用到循环控制,许多应用程序都包含循环。 顺序结构、选择结构和循环结构是结构化程序设计的 3 种基本结构,是各种复杂程

27、序的基本构造单元。因此程序设计者必须熟练掌握选择结构和循环结构的概念及使用方法。 1. while 结构 2. do while 结构 3. for 结构,while语句也称为当循环。 语句格式为: while (表达式) 循环体语句;,while 结构,例子:求1+2+3+4+100的值。,N个连续整数相加算法 1、设置变量i用来放被加数,变量sum用来放和值,并初始化; 2、从第一个数开始,依次将被加数赋给i,并进行操作sumsum+i; 3、输出sum; 细化算法2: while(还有被加数) i=当前被加数; sum += i; i准备接受下一个被加数; ,while 结构,源程序如下

28、: #include void main( ) int i=1,sum=0; /循环初始条件 while(i=100) sum+=i; i+; /修改循环条件 coutsum=sumendl; ,while 结构,注意: 在有循环语句的程序中,通常循环开始前对循环条件进行初始化;而在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。 C+表达方式灵活,上例中的循环语句还可以写成: while (i=100) sum += i+;,while 结构,do-while语句称为直到循环, 格式为: do 循环体语句; while( 表达式 );,do while 结构,do/wh

29、ile语句和while语句的区别: 区别是: do/while语句至少执行一次循环体后 再判断循环条件是否满足;while语句先判断条件是否满足,然后才执行循环体。,do while 结构,void main( ) int i=1,sum=0; do sum += i; i +; while(i=100); coutsum=sumendl; ,例子:用迭代法求a的平方根近似值。求平方根的迭代公式为: 要求前后两个迭代根之差小于10- 5。,迭代法求解:a是已知正数,x0是迭代初值,给x0 一个值,假定 x0=a/2;则用迭代公式依次计算: x1=(x0+a/x0)/2;x2=(x1+a/x1)

30、/2; xk+1=(xk+a/xk)/2; 当|xk+1 xk|(是一个较小的正数)时,迭代终止, 取xk+1的值为a的平方根近似值。,do while 结构,算法: 1、输入a(a0)及较小正数delta(也可用常变量); 2、x0=a/2; 用迭代公式算 x1=(x0+a/x0)/2; 3、while(|x1x0|=delta) x0=x1 ;/把最近的值给x 0 ; x1=(x0+a/x0)/2; /求xk+1时只需要知道xk的值,所以只需2个变量; 4、取x1的值为a的平方根近似值,输出。 3步骤很适合用do/while语句实现: x1=a/2; do x0=x1; x1=(x0+a/

31、x0)/2; while(|x1x0|=delta);,do while 结构,#include #include void main( ) float x0,x1,a; couta; if(a=1e-5); couta的平方根为:x1endl; ,do while 结构,例子:输入一段文本,统计文本的行数、单词数及字符数。假定单词之间以空格或跳格或换行符间隔,且文本开始没有空行。 算法分析: 1、逐个读入文本中的字符,直到读到一个输入结束符EOF为止。 2、如何算行数?行结束标志为读到字符n; 3、如何算单词数?设一个变量isword,读到字符时 isword=1,读到间隔符时isword=

32、0;如果读到一个 字符而此时isword值为0,则说明刚开始读一个单 词;(如果读到一个间隔符而此时isword值为1, 则说明刚读完一个单词; ) 4、如何算字符数?,do while 结构,算法: 1、设置变量line、word、ch分别代表行数、单词数、非分隔字符数,并初始化;设置变量isword来辅助统计单词数; 2、do 从键盘读入一个字符c; if(c=n) line+; if(是单词开头) word+; if(c不是分隔符) ch+; while(c!= EOF ); 3、输出统计结果。,do while 结构,#include void main() char c; int l

33、ine=0,word=0,ch=0,isword=0; do c=cin.get(); if(c=n) line+; /遇换行符行数+1 if(c!= ,do while 结构,格式:for (; ; ) 循环体语句;,for 结构,for语句、while语句、do/while语句实现相同的功能:1+2+3+4+100,int i=1,sum=0; /循环初始条件 while(i=100) sum+=i; i+; /修改循环条件 ,int i=1,sum=0; /循环初始条件 dosum+=i; i+; /修改循环条件 while(i=100);,for( int i=1,sum=0; i=1

34、00; i+ ) sum+=i; /*习惯上:表达式1:循环初始条件;表达式2:循环终止条件;表达式3:修改循环条件*/,for 结构,一般来说,已知循环次数的用for比较方便,未知次数可以用while等其他循环结构。 例子:求出100到900之间的“水仙花数”,“水仙花数“是指一个三位数,其各位数字的立方之和等于该数本身。 如 153 = 1*1*1 + 5*5*5 + 3*3*3 main() int i, a, b, c; for (i = 100; i = 999; i +) a=i/100; /* a 为百位数 b=i/10a*10; /* b 为十位数 c=i%100; /* c

35、为个位数 if(i=a*a*a+b*b*b+c*c*c) couti“=”a“*”a“*”a“+” b“*”b“*”b“+” c“*”c“*”cendl; ,for 结构,3 种循环都可以用来处理同一问题,一般情况下 它们可以互相代替。 (2) while和do-while循环,是在while后面指定循环条件的,在循环体中应包含使循环趋于结束的语句(如i+,或i=i+1等)。 for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。 (3) 用while和do-while循环时,

36、循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。,几种循环的比较,循环的嵌套,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。 3 种循环(while循环、dowhile循环和for循环)可以互相嵌套。例如,下面几种都是合法的形式:,while( ) while( ) ,for(; ; ) while( ) ,do for (; ;) while( );,循环的嵌套,同学们分析一下下列程序的结果: main() int i = 5; while (i - 0) do cout

37、 2); i +; ,结果: 4 3 2 1 0,break 语句只能用在switch语句和循环语句中,用来跳出switch语句或提前终止循环,转去执行switch语句或循环语句之后的语句。 一般格式为: break; 在for循环中可以用break结束循环: for(; ;) if() break; ,break 语句,如:求面积大于100的最小圆的半径(整数) for(r = 1;r 100) break; cout 100,则执行break语句,就提前终止循环。r=6时,循环就结束啦。,break 语句,continue 语句只能用在循环语句中,用来终止本次循环。当程序执行到contin

38、ue语句时,将跳过其后尚未执行的循环体语句,开始下一次循环。下一次循环是否执行仍然取决于循环条件的判断。 continue 语句与 break 语句的区别在于,continue 语句结束的只是本次循环,而 break 结束的是整个循环。 例:输出1100内3的倍数。 for (i=1;i=100;i+) if(i%3 != 0) continue; cout setw(6) i; ,continue 语句,例子: 设计程序输出Fibonacii数列的前20项,要求 每行输出5个数据。 Fibonacii数列定义如下:,算法分析:除了第0项和第1项外,每一项都是由类似方法产生,即前两项之和;所以

39、求当前项时,只需要记住前两项;程序不需要为每一项设置专用变量; 属 递推算法。,循环结构的应用,算法: 1、设置变量n表示第几项,变量f0和f1用来记住当前项f2之前的两项 ;变量初始化n=0; 2、while(当前项不到第20项) if(当前项是第0项) f0=0; if(当前项是第1项) f1=1; if(当前项是第2项或更高项) f2=f0+f1; 按要求输出 f2 ; f0=f1; f1=f2; /记住最近两项 当前项后移一位; ,循环结构的应用,#include #include void main() int f0=1,f1=1,f2; coutsetw(5)f0setw(5)f1

40、; for(int n=2;n20;n+) f2=f0+f1; if(n%5=0) coutendl; /控制每行2个数据 coutsetw(5)f2; f0=f1; f1=f2; ,循环结构的应用,运行结果: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181,循环结构的应用,例子:输入n值,计算1+1/1!+1/2!+1/n! 我们知道 n! = 1x2x3x.n 算法分析: 设置结果变量sum=1,然后让循环变量i从1循环到n 2. 对于每个i,求出i!,然后1.0/i!加入到sum中. i! 阶乘的求法: jc

41、 = 1; for(k=1;k=i;k+) jc=jc*k;,循环结构的应用,#include void main() int i, n, jc; float sum = 1; cout n; jc = 1; for(i=1; i = n; i +) jc = jc * i; sum = sum + 1.0 / jc; cout sum end; ,循环结构的应用,例子: 给定正整数m,判定其是否为素数。 分析:如果m2,m是素数的条件是不能被2,3,,(取整)整除。因此可以用2,3,,(取整)逐个去除m,如果被其中某个数整除了,则m不是素数,否则是素数。算法属于穷举法。 1、输入被测数m(m

42、2);令整型变量 k= sqrt(m) 2、判断m是否素数:设置辅助整型变量i, 使i从2开始 直到k依次测试m能否整除i, 若能,则不是素数; for(i=2;i=k;i+)if(m%i=0) break; /条件满足,m不是素数,停止测试,结束for语句 3、根据i是否已达到k,输出结果是否为素数。,循环结构的应用,#include #include void main() int m,i,k; coutm; if(m=2) coutk) coutm是素数endl; else coutm不是素数endl; ,循环结构的应用,例子:大奖赛评分程序,在唱歌比赛中,一般有若干个评委,记分规则:去

43、掉一个最高分和最低分,再计算平均分。试编写一个在百分制记分的情况下的程序实现(穷举法)。 算法分析: 本问题的关键在于找出所有分中的最大值和最小值,我们假设设置一个变量max,它的初始值为0,来记录最大值,然后对所有分进行穷举,如果还有比max更大的,则把它赋给max,待所有分都穷举完毕后,则max就是最大值,求最小值的方法也类似。,循环结构的应用,#include const int mNumber = 7; void main() int iScore, i, max = 0, min = 100; float fSum = 0; for(i = 1; i iScore; fSum +=

44、iScore; if(iScore max) max = iScore; if(iScore min) min = iScore; cout “最后得分:” (fSum-max-min)/(mNumber-2); ,循环结构的应用,例子: 世界数学史上著名的“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何? 分析:设鸡翁、母、雏分别为i,j,k,根据题 意可得: i*5+j*3+k/3*1=100; i+j+k=100; 两个方程无法解出三个变量,只能将各种可能的取值代入,其中能满足两个方程的就是所需的解,因此这是枚举算法(也叫穷举法)的应用。 i

45、、j、k可能的取值有哪些?分析可知,百钱最多可买鸡翁20,鸡母33,鸡雏300。,循环结构的应用,算法: for(i=0;i=20;i+) for(j=0;j=33;j+) for (k=0;k=300;k+) if(i+j+k=100) 这个算法使用三重循环,执行时间函数是方阶,循环体将执行20*33*300=198000次。 我们希望在算法上改进一下,如能减少一重循环,将大大缩短运行时间。 实际上,当i、j确定时,k就可由题目要求确定为100-i-j,因此实际上只要用i、j去测试,用钱数检测就可以了。循环体将执行: 20*33=660次。,循环结构的应用,#include #include

46、 void main() int i,j,k; cout 公鸡 母鸡 小鸡endl; for(i=0;i=20;i+) for(j=0;j=33;j+) k=100-i-j; if(5*i+3*j+k/3=100) ,循环结构的应用,例子: 输入一个非负的整数,将其反向后输出。例如 输入24789,变成98742输出。 算法分析: 1、将整数的各个数位逐个位分开,一个一个分别输 出。 2、将整数各位数字分开的方法是,通过对10进行求 余得到个位数,然后将整数缩小十倍,再求余, 并重复上述过程,分别得到十位、百位,直到 整数的值变成0为止。,循环结构的应用,算法: 1、输入非负整数 n; 2、w

47、hile(n != 0) n 对 10 取余,得 n的当前个位数并输出; n 整除 10 并赋给 n,即去掉个位数, 十位变个位,百位变十位,; ,循环结构的应用,程序如下: #include void main() long n; cout n; while(n 0) cout n % 10; n = n/10; ,循环结构的应用,例子: 猜数游戏 由计算机随机产生一个100以内的正整数,请一个人来猜,如果猜对了,则游戏结束, 计算机输出猜的次数;否则计算机给出提示,告诉所猜的数是大了还是小了,继续猜数,直到猜对为止. void main() int num, x, count = 0; n

48、um = rand(0); do cout x; count +; if(xnum) cout “太大,再试!” endl; if(xnum) cout “太小,再试!” endl; while(x != num); cout “你猜对了,次数是:” count endl; ,循环结构的应用,例子: 打印下三角形乘法九九表 1 2 3 4 5 6 7 8 9 - 1 2 4 3 6 9 4 8 12 16 5 10 15 20 25 6 12 18 24 30 36 7 14 21 28 35 42 49 8 16 24 32 40 48 56 64 9 18 27 36 45 54 63 7

49、2 81,循环结构的应用,分析: 1、计算机的输出是按行进行的,因此可以先用一个循 环语句输出第一行表头和第二行的横线。 2、表中各行数据的输出可以用下面的算法描述: for (i=1; i10; i+) 输出第i行数据; / A coutendl; / 准备输出下一行 ,循环结构的应用,3、第A行需要进一步细化。由于第i行数据是一组有 规律的数列,每个数的值是其所在行与列的乘 积,因此输出第i行可以: for(j=1;j10;j+) coutsetw(5)i*j; 4、按上述算法输出的每一行都将有九列,即打印出 的是矩形表而不是下三角形表。进一步分析发现 每一行的列数与所在行数相关,因此要输

50、出三角 形表,上面的循环语句需稍作修改: for(j=1;j=i;j+) coutsetw(5)i*j; 将此语句放到顶层算法的A行即可。,循环结构的应用,#include #include void main() for(int i=1;i10;i+) coutsetw(5)i; coutendl; for(int i=1;i10;i+) cout“-”; coutendl; for(i=1;i10;i+) for(int j=1;j=i;j+) coutsetw(5)i*j; / 输出表中数据 coutendl; / 准备输出下一行 ,循环结构的应用,1. 分析输出下列程序的结果 main() char i=A, j=G; for( ;i=j;i+,j-) coutij; 2. 编写程序,计算圆柱体的侧面积、底面积、体积。 半径和高从键盘输入,输出计算结果(要有文字说 明)。,编程作业,3、求1000以内的所有完数(指一个数恰好等于它的包括1在内的所有因子之和)。如6123 4. 编程打印出下列图案: (如果是 n 层呢),编程作业,* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!