算法与程序设计基础.ppt

上传人:ni****g 文档编号:568770708 上传时间:2024-07-26 格式:PPT 页数:133 大小:1.31MB
返回 下载 相关 举报
算法与程序设计基础.ppt_第1页
第1页 / 共133页
算法与程序设计基础.ppt_第2页
第2页 / 共133页
算法与程序设计基础.ppt_第3页
第3页 / 共133页
算法与程序设计基础.ppt_第4页
第4页 / 共133页
算法与程序设计基础.ppt_第5页
第5页 / 共133页
点击查看更多>>
资源描述

《算法与程序设计基础.ppt》由会员分享,可在线阅读,更多相关《算法与程序设计基础.ppt(133页珍藏版)》请在金锄头文库上搜索。

1、编程技术第3章 算法与程序设计基础3.1 3.1 3.1 3.1 算法算法算法算法3.2 3.2 3.2 3.2 算法的常用表示方法算法的常用表示方法算法的常用表示方法算法的常用表示方法3.3 3.3 3.3 3.3 结构化程序设计方法结构化程序设计方法结构化程序设计方法结构化程序设计方法3.4 C3.4 C3.4 C3.4 C语句概述语句概述语句概述语句概述补充:顺序结构程序设计补充:顺序结构程序设计补充:顺序结构程序设计补充:顺序结构程序设计3.5 3.5 3.5 3.5 选择结构程序设计选择结构程序设计选择结构程序设计选择结构程序设计3.63.63.63.6 循环程序设计循环程序设计循环

2、程序设计循环程序设计3.7 3.7 3.7 3.7 综合程序应用举例综合程序应用举例综合程序应用举例综合程序应用举例 目录目录目录目录 1编程技术3.1 算法3.1.1 3.1.1 算法的概念算法的概念3.1.2 3.1.2 算法的特性算法的特性 本章本章本章本章 2编程技术3.1.1 3.1.1 3.1.1 3.1.1 算法的概念算法的概念算法的概念算法的概念 当我们要编写一个程序的时候,我们总要首先想好程序是干什当我们要编写一个程序的时候,我们总要首先想好程序是干什么的?应该如何实现这些目标?么的?应该如何实现这些目标?( (应该先进行什么处理、后进行什么应该先进行什么处理、后进行什么处理

3、?处理?) )所处理的数据的格式是什么?遇到一些复杂的问题,我们可所处理的数据的格式是什么?遇到一些复杂的问题,我们可能还需要考虑采用什么数学方法。这一切都涉及一个专业名词能还需要考虑采用什么数学方法。这一切都涉及一个专业名词“算法算法”。 算法算法为解决一个实际问题而采取的方法和步骤为解决一个实际问题而采取的方法和步骤 很多时候,程序设计者所面临的问题就是寻找一个合适的算法。很多时候,程序设计者所面临的问题就是寻找一个合适的算法。例如,一个熟练的程序员,要设计一个下例如,一个熟练的程序员,要设计一个下“五子棋五子棋”的游戏程序,的游戏程序,对他而言,对他而言,C C语言的编程规则已经清楚。他

4、所面对的核心问题是寻找语言的编程规则已经清楚。他所面对的核心问题是寻找一种可以模拟人下棋的算法。因此,算法在软件设计中具有重要的一种可以模拟人下棋的算法。因此,算法在软件设计中具有重要的地位。正如著名的计算机科学家沃思(地位。正如著名的计算机科学家沃思(NikiklausNikiklaus Wirth Wirth)所指出的所指出的如下公式:如下公式:程序程序= =数据结构数据结构+ +算法算法3编程技术【例例3.13.1】求求1+2+3+4+100=?1+2+3+4+100=?算法算法1 1 步骤步骤1 1:1+2=31+2=3 步骤步骤2 2:3+3=63+3=6 步骤步骤3 3:6+4=1

5、06+4=10 步骤步骤9999:4950+100=50504950+100=5050算法算法2 2 步骤步骤1 1:0+100=1000+100=100 步骤步骤2 2:1+99=1001+99=100 步骤步骤3 3:2+98=1002+98=100 步骤步骤5050:49+51=10049+51=100 步骤步骤5151:100*50=5000100*50=5000 步骤步骤5252:5000+50=50505000+50=5050算法算法3 3 步骤步骤1 1:k=1k=1,s=0s=0 步骤步骤2 2:如果:如果k100k100,则算法结束,则算法结束,s s即为所求的和,输出即为所

6、求的和,输出s s;否则转向步;否则转向步骤骤3 3 步骤步骤3 3:s=s=s+ks+k,k=k+1k=k+1 步骤步骤4 4:转向步骤:转向步骤2 2 本节本节本节本节 4编程技术3.1.2 3.1.2 3.1.2 3.1.2 算法的特性算法的特性算法的特性算法的特性 一一个个方方法法要要成成为为我我们们可可以以在在程程序序设设计计中中所所使使用用的的算算法法,需需要要具具备如下特征:备如下特征: 1.有穷性有穷性 一一个个算算法法要要在在有有限限的的步步骤骤内内解解决决问问题题(这这里里所所说说的的步步骤骤是是指指计计算算机机执执行行步步骤骤)。计计算算机机程程序序不不能能无无限限地地运

7、运行行下下去去(甚甚至至不不能能长长时时间间地地运运行行下下去去),所所以以一一个个无无限限执执行行的的方方法法不不能能成成为为程程序序设设计计中中的的“算法算法”。 例如,求某一自然数例如,求某一自然数N N的阶乘:的阶乘:n!=1*2*3*n!=1*2*3*n*n 这这是是一一个个算算法法。因因为为对对任任何何一一个个自自然然数数而而言言,无无论论这这个个数数多多大大,总是有限的。用这个公式计算总是有限的。用这个公式计算n!n!总是需要有限的步骤。总是需要有限的步骤。 但是,以下计算公式则不能作为算法,因为其计算步骤是无限但是,以下计算公式则不能作为算法,因为其计算步骤是无限的:的:sum

8、=1+1/1+1/2+1/3+sum=1+1/1+1/2+1/3+1/n+1/n+5编程技术 2.确定性确定性 算算法法中中操操作作步步骤骤的的顺顺序序和和每每一一个个步步骤骤的的内内容容都都应应当当是是确确定定的的,不不应应当当是是含含糊糊不不清清的的。它它也也不不能能有有不不同同的的解解释释存存在在,即即不不能能具具有有“二义性二义性”,不应当产生两种或多种以上的含义。,不应当产生两种或多种以上的含义。 3.可行性可行性 每每一一个个算算法法是是可可行行的的,即即算算法法中中的的每每一一个个步步骤骤都都可可以以有有效效地地执执行,并得到行,并得到确定的结果确定的结果。 (例如:(例如:b=

9、0,执行执行a/b) 4.有零个或多个输入有零个或多个输入 输输入入就就是是从从外外界界取取得得必必要要的的信信息息。一一个个算算法法可可以以有有零零个个或或多多个个输输入入,例例如如:输输入入一一个个年年份份,判判断断其其是是否否是是闰闰年年。同同时时一一个个算算法法可可以没有输入,例如:计算出以没有输入,例如:计算出5!5!是多少。是多少。 5.有一个或多个输出有一个或多个输出 算算法法的的目目的的就就求求解解,“解解”就就是是我我们们想想要要得得到到的的最最终终结结果果。输输出出是是同同输输入入有有着着某某些些特特定定关关系系的的量量。一一个个算算法法得得到到的的最最终终结结果果就就是是

10、输出。没有输出的算法是没有意义的。输出。没有输出的算法是没有意义的。 本节本节本节本节 6编程技术3.2 算法的常用表示方法3.2.1 3.2.1 自然语言表示法自然语言表示法3.2.2 3.2.2 流程图流程图3.2.3 N-S3.2.3 N-S结构流程图结构流程图3.2.4 3.2.4 伪代码表示法伪代码表示法3.2.5 3.2.5 用计算机语言表示算法用计算机语言表示算法 本章本章本章本章 7编程技术3.2.1 3.2.1 3.2.1 3.2.1 自然语言表示法自然语言表示法自然语言表示法自然语言表示法 自然语言是指人们在自然语言是指人们在日常生活中使用的语言日常生活中使用的语言,如汉语

11、、英语等。,如汉语、英语等。 比如对于以下这句话:比如对于以下这句话:如果如果A A大于大于B B,就给它加就给它加1 1。在理解时就可在理解时就可能出现歧义,是给能出现歧义,是给A A加加1 1?还是给?还是给B B加加1 1。 对于以上的一段话,如果我们用对于以上的一段话,如果我们用C C语言进行编程则为:语言进行编程则为: if(AB) A=A+1;if(AB) A=A+1; 对于某些程序员来说,自然语言通俗易懂。对于某些程序员来说,自然语言通俗易懂。 缺点是:很冗长,不直观,而且容易发生歧义。缺点是:很冗长,不直观,而且容易发生歧义。【例例3.23.2】求求m m!如果如果m=6m=6

12、,即求即求123456123456。我们先设。我们先设s s代表累乘之积,代表累乘之积,以以t t代表乘数,自然语言表示代表乘数,自然语言表示m!m!的算法为:的算法为: 使使s=1,t=1s=1,t=1。 使使stst,得到的积仍放在得到的积仍放在s s中。中。 使使t t的值加的值加1 1。 如果如果tmtm,返回第返回第步重新执行。如果步重新执行。如果tmtm,则不再返回则不再返回,而停止循环,此时,而停止循环,此时s s中的值就是中的值就是m!m!,输出输出s s。 本节本节本节本节 8编程技术3.2.2 3.2.2 3.2.2 3.2.2 流程图流程图流程图流程图 流流程程图图表表示

13、示法法就就是是用用各各种种图图框框表表示示各各种种操操作作。这这种种表表示示法法的的优优点点是是直直观观易易于于理理解解。流流程程图图表表示示法法是是美美国国国国家家标标准准化化协协会会ANSI(Amreican National Standard Institute)规规定定的的。一一些些常常用用的的流程图符号流程图符号在在Word中都可以通过中都可以通过“绘图绘图”命令来绘制。命令来绘制。 结构化程序设计中采用三种基本结构,结构化程序设计中采用三种基本结构,即即顺序结构、选择结构顺序结构、选择结构和和循环结构循环结构,这三种,这三种基本结构有以下共同特点:基本结构有以下共同特点: 只有一个

14、入口;只有一个入口; 只有一个出口;只有一个出口; 结构内的每一部分都有机会被执行到;结构内的每一部分都有机会被执行到; 结构内不存在结构内不存在“死循环死循环”(无终止的循环无终止的循环)。9编程技术 顺序结构顺序结构 A A和和B B两个框是顺序执行的。两个框是顺序执行的。 选择结构选择结构 选择结构或称分支结构,条件结构。此结构中必包含一个判断选择结构或称分支结构,条件结构。此结构中必包含一个判断框,根据给定的条件框,根据给定的条件P是否成立来进行选择。若是否成立来进行选择。若P成立,则执行成立,则执行A框框中的操作,否则,执行中的操作,否则,执行B框中的操作。框中的操作。 循环结构循环

15、结构 循环结构又称重复结构,有两种:当型循环、直到型循环。循环结构又称重复结构,有两种:当型循环、直到型循环。10编程技术用流程图表示例用流程图表示例3.23.2: 本节本节本节本节 11编程技术 3.2.3 N-S3.2.3 N-S3.2.3 N-S3.2.3 N-S结构流程图结构流程图结构流程图结构流程图 1973年美国学者年美国学者I.Nassi 和和B.Shneiderman提出了一种新的流程图提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法都形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法都是在一个矩形框内,在该框内还包含其它的从属于它的框。或者说

16、是在一个矩形框内,在该框内还包含其它的从属于它的框。或者说由一些基本的框组成一个大框。这种方法就以这两位学者的名字缩由一些基本的框组成一个大框。这种方法就以这两位学者的名字缩写而成,被称为写而成,被称为“N-S图图”。 N-S图可以表示的三种典型结构:图可以表示的三种典型结构:A B顺序结构顺序结构选择结构选择结构当型循环当型循环直到型循环直到型循环A当P成立A当P成立12编程技术用用N-S结构流程构流程图表示例表示例3.2: 输入输入ms=1t=1当当tm成立成立s=s tt=t+1输出输出s结束结束开始开始 本节本节本节本节 13编程技术 3.2.4 3.2.4 3.2.4 3.2.4 伪

17、代码表示法伪代码表示法伪代码表示法伪代码表示法伪伪代代码码是是用用介介于于自自然然语语言言和和计计算算机机语语言言之之间间的的文文字字和和符符号号来来表表示示算算法法,即即计计算算机机程程序序设设计计语语言言中中具具有有的的语语句句关关键键字字用用英英文文表表示示,其其他他的的可可用用汉汉字字,也也可可用用英英文文,只只要要便便于于书书写写和和阅阅读读就就可可。用用伪伪代代码码表表示示算算法法并并无无固固定定的的、严严格格的的语语法法规规则则,只只要要求求把把意意思思表表达达清清楚楚,并且书写的格式清晰易懂即可。并且书写的格式清晰易懂即可。【例例3.33.3】求求m! m! ,用伪代码表示的算

18、法如下:用伪代码表示的算法如下: 开始开始 从键盘输入一个正整数给从键盘输入一个正整数给m 置置s的初值为的初值为1 置置t的初值为的初值为1 当当t=m,执行下面操作:执行下面操作: 使使s=st 使使t=t+1 ( (循环体到此结束循环体到此结束) ) 输出输出s的值的值 结束结束 本节本节本节本节 14编程技术 3.2.5 3.2.5 3.2.5 3.2.5 用计算机语言表示算法用计算机语言表示算法用计算机语言表示算法用计算机语言表示算法 用流程图或其他方法表示了算法,还要用计算机实现算法用流程图或其他方法表示了算法,还要用计算机实现算法借助计算机语言编写程序,被计算机执行。借助计算机语

19、言编写程序,被计算机执行。用计算机解决一个问题,用计算机解决一个问题,包括设计算法和实现算法两个部分。包括设计算法和实现算法两个部分。 计算机语言描述算法必须严格遵循所用语言的计算机语言描述算法必须严格遵循所用语言的语法规则语法规则。【例例3.43.4】将求将求m!m!的算法用的算法用C C语言表示。语言表示。#include void main() int t,s,m; printf(n Please input a integer to m:); scanf(%d,&m); s=1; t=1; do s=s*t; t=t+1; while (t=m); printf(n%d!=%d,m,s

20、); 本节本节本节本节 15编程技术3.3 结构化程序设计方法 要解决实际问题,编写程序的步骤是:要解决实际问题,编写程序的步骤是: 从目前的编程实践看,结构化程序设计的思路已经从目前的编程实践看,结构化程序设计的思路已经被绝大多数程序员所接受。人们普遍认为,必须采用结被绝大多数程序员所接受。人们普遍认为,必须采用结构化的程序设计方法。因为结构化程序具有结构清晰、构化的程序设计方法。因为结构化程序具有结构清晰、便于阅读、便于修改和便于维护的优点。便于阅读、便于修改和便于维护的优点。 结结构构化化程程序序设设计计的的基基本本思思路路是是:把把一一个个复复杂杂的的问问题题的的求求解解过过程程分分阶

21、阶段段进进行行,每每个个阶阶段段处处理理的的问问题题都都控控制制在在人们容易理解的范围之内。人们容易理解的范围之内。16编程技术 保证结构化程序采取的方法:保证结构化程序采取的方法: 自顶向下自顶向下 逐步细化(求精)逐步细化(求精) 模块化设计模块化设计 结构化编码结构化编码 模块化模块化:将一个大任务分成若干个较小的任务,较小的任务又:将一个大任务分成若干个较小的任务,较小的任务又细分为更小的任务细分为更小的任务,直到只能解决功能单一的任务为止,直到只能解决功能单一的任务为止模模块(由函数来实现)。例如,块(由函数来实现)。例如,工资管理系统工资管理系统17编程技术【例例3.53.5】输入

22、输入1010个整数(每个数都个整数(每个数都3 3),打印出其中),打印出其中的素数。的素数。18编程技术 本章本章本章本章 19编程技术3.4 C语句概述 一个一个C C语言程序的执行部分由语句组成。程序的各种功能语言程序的执行部分由语句组成。程序的各种功能( (如输如输入、输出、计算、打印等入、输出、计算、打印等) )也由语句实现的。也由语句实现的。C C语言的语句可分为语言的语句可分为声声明语句明语句、函数调用语句函数调用语句、表达式语句表达式语句、 复合语句复合语句、控制语句控制语句以及不以及不执行任何操作的执行任何操作的空语句空语句。 声明语句声明语句声明语句声明语句 说明语句用来定

23、义变量的数据类型。说明语句用来定义变量的数据类型。如:如:int s,i; 函数调用语句函数调用语句函数调用语句函数调用语句 函函数数调调用用语语句句由由函函数数名名、实实际际参参数数加加上上分分号号组组成成。其其一一般般形形式式为:为: 函数名函数名( (实际参数表实际参数表);); 执执行行函函数数语语句句就就是是调调用用函函数数体体并并把把实实际际参参数数赋赋予予函函数数定定义义中中的的形形式式参参数数,然然后后执执行行被被调调函函数数体体中中的的语语句句,可可以以返返回回也也可可以以不不返返回回函数值。它相当于其他语言中的调用子程序。函数值。它相当于其他语言中的调用子程序。 例:例:p

24、rintf(ns=%d,s);20编程技术 表达式语句表达式语句表达式语句表达式语句 表达式语句由表达式语句由表达式表达式加上加上分号分号( (;) )组成。其一般形式为:组成。其一般形式为: 表达式表达式; 如:如:a=b+c; y+; x*y; 执行表达式语句就是计算表达式的值。执行表达式语句就是计算表达式的值。 注意:注意:赋值语句和赋值表达式的区别。赋值语句和赋值表达式的区别。 空语句空语句空语句空语句 空空语语句句就就是是什什么么也也没没有有的的语语句句,也也就就是是只只有有分分号号的的语语句句。空空语语句句不不执执行行任任何何操操作作,但但仍仍然然有有一一定定的的用用途途。比比如如

25、,预预留留位位置置或或用用来来作空循环体。作空循环体。例:例:while(getchar()!=n) ; 这这段段程程序序的的作作用用是是:等等待待键键盘盘输输入入,若若输输入入非非 则则继继续续等等待待重重新新输输入入,只只有有输输入入 才才结结束束。循循环环体体只只有有一一个个空空语语句句。如如果没有这一个空语句,则会出现错误。果没有这一个空语句,则会出现错误。21编程技术 复合语句复合语句复合语句复合语句 把把多多个个语语句句用用大大括括号号“”括括起起来来组组成成的的一一个个语语句句称称复复合合语语句句。C C语言的编译系统把复合语句作为是单条语句对待。语言的编译系统把复合语句作为是单

26、条语句对待。例:例: b=c+d; a=e-f; printf(%d%d,b,a); 复复合合语语句句中中的的各各条条语语句句都都以以分分号号“;”结结尾尾。注注意意,在在大大括括号号“”之后不要加分号。之后不要加分号。 控制语句控制语句控制语句控制语句 控制语句用于控制程序的流程,以实现程序的顺序、分支、循控制语句用于控制程序的流程,以实现程序的顺序、分支、循环等各种结构方式。环等各种结构方式。 控制语句分为三类共九种:控制语句分为三类共九种: 1.1.条件判断语句:条件判断语句:if、switch语句语句 2.2.循环执行语句:循环执行语句:dowhile、while和和for语句语句 3

27、.3.转向语句:转向语句:break、goto、continue和和return语句语句 本章本章本章本章 22编程技术补充:顺序结构程序设计顺顺序序结结构构的的程程序序设设计计是是最最简简单单的的,只只要要按按照照解解决决问问题题的的顺顺序序写写出出相相应应的的语语句句就就行行,它它的的执执行行顺顺序序是是自自上上而而下,依次执行。下,依次执行。 顺顺序序结结构构可可以以独独立立使使用用构构成成一一个个简简单单的的完完整整程程序序,常常见见的的输输入入、计计算算、输输出出三三部部曲曲的的程程序序就就是是顺顺序序结结构构,例例如如计计算算圆圆的的面面积积,其其程程序序的的语语句句顺顺序序就就是

28、是输输入入圆圆的的半半径径r,计算,计算s=3.14159*r*r,输出圆的面积,输出圆的面积s。不不过过大大多多数数情情况况下下顺顺序序结结构构都都是是作作为为程程序序的的一一部部分分,与与其其它它结结构构一一起起构构成成一一个个复复杂杂的的程程序序,例例如如选选择择结结构构中中的复合语句、的复合语句、循环结构中的循环体等。循环结构中的循环体等。23编程技术【实验实验】以下的程序用于计算一个矩形的周长和以下的程序用于计算一个矩形的周长和面积。程序运行时提示输入长和宽的值,然后计面积。程序运行时提示输入长和宽的值,然后计算并输出该矩形的周长和面积。请将程序补充完算并输出该矩形的周长和面积。请将

29、程序补充完整。整。#include void main() float length; float width; float perimeter;/* 周长周长 */ float area;/* 面积面积 */ 24编程技术【补充例补充例1】从键盘输入一个大写字母,要求改从键盘输入一个大写字母,要求改用小写字母输出。用小写字母输出。 #include void main() char c1,c2; c1=getchar(); printf(%c,%dn,c1,c1); c2=c1+32; printf(%c,%dn,c2,c2); 运行情况运行情况:A A,65a,9725编程技术【补充例补充

30、例2 2】输入三角形的三边长,求三角形面积。输入三角形的三边长,求三角形面积。假设:三边长假设:三边长a,b,c能构成三角形。能构成三角形。已知面积公式:已知面积公式: 其中:其中:s=(a+b+c)/2计算s计算面积结束开始输入三边长26编程技术#include #include void main() float a,b,c,s,area; scanf(%f,%f,%f,&a,&b,&c); s=1.0/2*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c); printf(a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2fn,a,b,c,s); pr

31、intf(area=%7.2fn,area);3,4,6a= 3.00,b= 4.00,c= 6.00,s= 6.50area= 5.33 本章本章本章本章 运行情况运行情况:27编程技术3.5 选择结构程序设计3.5.1 3.5.1 关系运算符和关系表达式关系运算符和关系表达式3.5.2 3.5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式3.5.3 if3.5.3 if语句语句3.5.4 if3.5.4 if语句的嵌套语句的嵌套3.5.5 3.5.5 条件运算符和条件表达式条件运算符和条件表达式3.5.6 3.5.6 switch语句语句3.5.7 3.5.7 选择结构程序设计举例选择

32、结构程序设计举例 本章本章本章本章 28编程技术3.3.3.3.5.1 5.1 5.1 5.1 关系运算符和关系表达式关系运算符和关系表达式关系运算符和关系表达式关系运算符和关系表达式 C语言提供语言提供6种种关系运算符关系运算符: 小于小于 = 大于大于 = = 大于或等于大于或等于 = = 等于等于 != != 不等于不等于 用关系运算符将两个表达式连接起来的式子,称用关系运算符将两个表达式连接起来的式子,称关系表达关系表达式式。如:如:ab,a+bb+c,(a=3)(b=5), ab)(bb值为值为1 1 (ab)= =c值为值为1 1 d=abd d的值为的值为1 1 f=abcf f

33、的值为的值为0 0 本节本节本节本节 优先级相同(高)优先级相同(低)29编程技术3.3.3.3.5.2 5.2 5.2 5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 C C语言提供语言提供3 3种种逻辑运算符:逻辑运算符: ! 逻辑非逻辑非 & & 逻辑与逻辑与 | | 逻辑或逻辑或假假假假真真真真假假假假真真假假假假真真真真假假真真假假真真假假假假真真真真真真假假假假真真真真a|ba&b!b!aba 逻辑运算的真值表逻辑运算的真值表高高低低30编程技术 算术运算符、关系运算符、逻算术运算符、关系运算符、逻辑运算符和赋值运算符的辑运算符和赋

34、值运算符的优先级优先级: 如:如: (ab)&(xy) ab&xy (a= =b)|(x= =y) a= =b|x= =y (!a)|(ab) !a|ab 用用逻逻辑辑运运算算符符将将关关系系表表达达式式或或逻逻辑辑量量连连接接起起来来的的式式子子称称为为逻逻辑辑表表达达式式。逻逻辑辑表表达达式式的的值值是是一一个个逻逻辑辑“真真”或或“假假”。C语语言言编编译译系系统统在在给给出出逻逻辑辑运运算算结结果果时时,以以数数值值1代代表表“真真”,以以数数值值0代代表表“假假”,但但在在判判断断一一个个量量是是否否为为“真真”时时,以以0代代表表“假假”,以以非非0代代表表“真真”。 例:例: 若

35、若a=4,则则!a的值为的值为0。 若若a=4,b=5,则则a&b的值为的值为1,a|b的值为的值为1,!a|b的值为的值为1。 例:例:将将数学关系式数学关系式:0x100, 表达成表达成逻辑式逻辑式:x=0 & xb)&(n=cd)使使m=0,而而n=1a ab bc c0(0(假假) )0(0(假假) )0(0(假假) )0(0(假假) )1(1(真真) )非非0(0(真真) )非非0(0(真真) )非非0(0(真真) )a ab bc c非非0(0(真真) )非非0(0(真真) )非非0(0(真真) )1(1(真真) )0(0(假假) )0(0(假假) )0(0(假假) )0(0(假假

36、) )32编程技术 例:要判断某一年是否是闰年。闰年的条件例:要判断某一年是否是闰年。闰年的条件是符合下面二者之一:能被是符合下面二者之一:能被4整除,但不能被整除,但不能被100整除;或能被整除;或能被400整除。整除。C语言的表达式:语言的表达式:(year%4=0 & year%100!=0) | year%400=0 本本本本节节节节 33编程技术3.5.3 if3.5.3 if3.5.3 if3.5.3 if语句语句语句语句 选择结构往往依赖于所给出的条件,决定从给出的选择结构往往依赖于所给出的条件,决定从给出的操作中选择一组去执行。操作中选择一组去执行。 格式格式1 1:if (表

37、达式表达式)语句语句; 功能:如果表达式的值为真,做语句的内容;否则功能:如果表达式的值为真,做语句的内容;否则什么都不做。什么都不做。任何类型任何类型34编程技术【例例3.73.7】输入一个字符输入一个字符c c,若,若c c是字母,则输出是字母,则输出“Yes!”Yes!”。#include void main() char c; c=getchar(); if(c=a & c=A & c=Z) printf(Yes!);运行情况运行情况: :x Yes!思考题:思考题:完善完善【补充例补充例1 】。35编程技术【补充例补充例3】已知两个变量已知两个变量x和和y,比较它们的大小,使得比较它

38、们的大小,使得x中的值大于中的值大于y。#include void main() int x,y,t; printf(x=); scanf(%d,&x); printf(y=); scanf(%d,&y); if (xy) t=x;x=y;y=t; printf(%d,%d,x,y);xyt两个数交换过程两个数交换过程思考题:思考题:从键盘输入从键盘输入3 3个个整数整数a a、b b和和c c,编写程序,编写程序将它们按从大到小排序。将它们按从大到小排序。37编程技术 格式格式2 2:if (表达式表达式) 语句语句1; else 语句语句2; 其其意意义义为为:若若表表达达式式的的值值为为

39、真真,则则执执行行“语语句句1”1”,否否则则执执行行“语语句句2”2”。若若“语语句句1”1”或或“语语句句2”2”为为一一条条语语句时,则可以去掉相应的句时,则可以去掉相应的。 例:例:if (h1.1) price=0; else price=50; 或:或:if (h1.1) price=0; else price=50;任何类型任何类型39编程技术【例例3.9】输入两个数并判断两数是否相等。输入两个数并判断两数是否相等。#include void main() int a,b; printf(Enter integer a:); scanf(%d,&a); printf(Enter

40、integer b:); scanf(%d,&b); if(a=b) printf(a=bn); else printf(a!=bn);Enter integer a: 5 Enter integer b:7 a!=bEnter integer a:10 Enter integer b:10 a=b运行结果运行结果:40编程技术【补充例补充例4】判断一个年份是否是闰年,并把结果输出。判断一个年份是否是闰年,并把结果输出。#include void main() int year; printf(请输入一个年份请输入一个年份:); scanf(%d,&year); if (year%4=0 &

41、year%100!=0 | year%400= =0) printf(n%d 是闰年是闰年!n,year); else printf(n%d 不是闰年不是闰年!n,year); 思考题:思考题:判断一个整数是奇数还是偶数,并把结果显示出来。判断一个整数是奇数还是偶数,并把结果显示出来。41编程技术【补补充充例例5】从从键键盘盘输输入入3个个整整数数a、b和和c,编编写写程程序序找找出出其中的最大数,输出结果。其中的最大数,输出结果。#include void main() int a,b,c,max; printf(Please input three numbers:); scanf(%d%

42、d%d,&a,&b,&c); if(a=b) max=a; else max=b; if(maxc) max=c; printf(max=%dn,max); 43编程技术【例例3.103.10】输入一个整数,若该数不为零,则输出。输入一个整数,若该数不为零,则输出。#include void main() int x; scanf(%d,&x); if(x) /*等价于等价于 x!=0*/ printf(n x=%d,x);运行结果运行结果: :-5 x=-544编程技术ifififif语句中应注意的问题语句中应注意的问题语句中应注意的问题语句中应注意的问题 分分支支语语句句的的复复杂杂性性关

43、关键键在在于于表表达达式式,表表达达式式通通常常是是逻逻辑辑表表达达式式或或关关系系表表达达式式,但但是是也也可可以以是是其其它它表表达达式,甚至也可以是一个变量。例如:式,甚至也可以是一个变量。例如: if (a=8); if (x); 只只要要表表达达式式的的值值为为非非0,即即为为“真真”,就就执执行行其其后的语句后的语句 在在if语句中的语句中的表达式必须用括号括起来表达式必须用括号括起来 如如果果要要想想在在if语语句句中中满满足足条条件件时时执执行行一一组组(多多个个)语语句句,则则必必须须把把这这一一组组语语句句用用括括起起来来组组成成一一个个复复合合语语句。注意复合语句的句。注

44、意复合语句的之后不能加分号之后不能加分号 本节本节本节本节 45编程技术3.5.4 if3.5.4 if3.5.4 if3.5.4 if语句的嵌套语句的嵌套语句的嵌套语句的嵌套 前前二二种种形形式式的的if语语句句一一般般都都用用于于两两个个分分支支的的情情况况。当当有有多多个个分分支支选选择择时时,可可采采用用if-else-if语语句句,其其一一般般形形式式如如下:下: if(表达式表达式1) if(表达式表达式2) 语句语句1; else 语句语句2; else if(表达式表达式3) 语句语句3; else 语句语句4;46编程技术【例例3.113.11】编写程序,求下列分段函数的值。

45、编写程序,求下列分段函数的值。 -1 (x0)#include #include void main() float x; double z; printf(nx=); scanf(%f,&x); if (x0) z=log(x); else z=0; printf(z=%5.2fn,z);输入输入xz=-1z=log(x)z=0真真真真假假假假x0if语句嵌套包含语句嵌套包含在在else的后面的后面47编程技术改写改写【例例3.113.11】 ,将,将ifif语句的嵌套包含在语句的嵌套包含在ifif的后面。的后面。#include #include void main() float x;

46、double z; printf(nx=); scanf(%f,&x); if (x=0) if (x0) z=-1; else z=0; else z=log(x); printf(z=%5.2fn,z);if语句嵌套包含语句嵌套包含在在if的后面的后面48编程技术if (表达式表达式1) if (表达式表达式2) 语句语句1; else if(表达式表达式3)语句语句2; else 语句语句3; 上面的语句中的第上面的语句中的第1个个else是与第是与第2个个if配对的,如果要改变这种配对的,如果要改变这种默认的配对关系,可以默认的配对关系,可以在相应在相应if条件选择语句上加上左、右花括

47、号来条件选择语句上加上左、右花括号来确定新的配对关系。确定新的配对关系。如:如:if (表达式表达式1) if (表达式表达式2) 语句语句1; else if(表达式表达式3)语句语句2; else 语句语句3;表达式表达式1表达式表达式2表达式表达式3真真真真真真假假假假假假语句语句1语句语句2语句语句3嵌套的嵌套的if语句图解语句图解2elseelse总是与它上面最近的且又没有配对的总是与它上面最近的且又没有配对的ifif语句进行配对语句进行配对49编程技术【例例3.123.12】 写出下面程序的运行结果。写出下面程序的运行结果。#include void main() int a,b,

48、c; a=5;b=3;c=0; if(c) if(ab) printf(n max=%d,a); else printf(n max=%d,b); else printf(n c=%d,c); 本节本节本节本节 50编程技术3.5.5 3.5.5 3.5.5 3.5.5 条件运算符和条件表达式条件运算符和条件表达式条件运算符和条件表达式条件运算符和条件表达式 条件表达式的一般形式为:条件表达式的一般形式为: 表达式表达式1?表达式表达式2:表达式表达式3 表表达达式式的的执执行行顺顺序序:计计算算表表达达式式1的的值值,若若为为真真,则则计计算算表表达达式式2的的值值,作作为为条条件件表表达达

49、式式的的结结果果;否否则则计计算算表表达达式式3的的值值,作作为为条条件件表达式的结果。表达式的结果。 优先级:优先级:高于赋值运算符,低于算术和关系运算符。高于赋值运算符,低于算术和关系运算符。 例:例:max=ab?a:b相当于相当于 max=(ab)?a:b) ab?a:b+1相当于相当于 (ab)?a:(b+1) 条件运算符的结合方向为条件运算符的结合方向为“自右至左自右至左”。 例:例:ab?a:cd?c:d 相当于相当于 ab?a:(cd?c:d) 例:例: if (a=b) max=a; else max=b; 可以用条件运算符来表示为:可以用条件运算符来表示为:max=ab ?

50、 a:b 本节本节本节本节 51编程技术3.5.6 switch3.5.6 switch3.5.6 switch3.5.6 switch语句语句语句语句 判断语句可以实现两个分支的程序流程。但编程中判断语句可以实现两个分支的程序流程。但编程中往往要求实现多个分支的程序流程,这就要使用多分支往往要求实现多个分支的程序流程,这就要使用多分支语句。语句。 其一般形式为:其一般形式为: switch (表达式表达式) case 常量表达式常量表达式1: 语句语句1; case 常量表达式常量表达式2: 语句语句2; . . case 常量表达式常量表达式n: 语句语句n; default: 语句语句n

51、+1; 整型、字符型、枚举型整型、字符型、枚举型52编程技术 执行过程是执行过程是: 1.1.首首先先计计算算表表达达式式的的值值,然然后后把把表表达达式式的的值值与与其其后后的的常常量量表表达达式值逐个式值逐个相相比较比较。 2.2.当当表表达达式式的的值值与与某某个个常常量量表表达达式式的的值值相相等等时时,即即执执行行该该casecase后的语句。后的语句。 3.3.如如表表达达式式的的值值与与所所有有casecase后后的的常常量量表表达达式式均均不不相相同同时时,则则执执行行defaultdefault后的语句。后的语句。 4.4.若没有若没有defaultdefault语句,则退出

52、此开关语句。语句,则退出此开关语句。 注意注意: : 程程序序在在执执行行完完毕毕相相应应的的casecase语语句句后后不不能能退退出出,而而是是继继续续执执行行其其后的其它语句。后的其它语句。 格格式式中中的的表表达达式式的的作作用用为为控控制制程程序序的的流流程程。它它的的数数值值类类型型必必须须与与casecase语句语句中中常量表达式常量表达式的的类型一致类型一致。 所有所有常量表达式的类型常量表达式的类型必须必须相同相同,而它们的,而它们的值值必须必须不同不同。53编程技术 若若要要执执行行完完一一个个case的的语语句句后后,转转到到switch后后的的语语句句去去执执行行,则则

53、要要在在该该case语语句句的的最最后后加加上上break语语句句(跳跳转转语语句句),跳跳转转到到switch后的语句去执行。后的语句去执行。 switch语句与语句与break语句连用图解语句连用图解54编程技术【例例3.143.14】编编写写一一个个程程序序,要要求求输输入入学学生生的的分分数数,输输出出其其成成绩绩的的分分数数段段,用用A A、B B、C C、D D、E E分分别别表表示示9090分分以以上上、80808989分分、70707979分分、60606969分分和和不不及及格格(0 05959分分)5 5个分数段。个分数段。#include void main() int

54、score,grade; printf(nInput a score(0100):); scanf(%d,&score); grade=score/10; switch (grade) case 0: case 1: case 2: case 3: case 4: case 5: printf(grade=E!n); break;55编程技术 case 6: printf(grade=D!n); break; case 7: printf(grade=C!n); break; case 8: printf(grade=B!n); break; case 9: case 10: printf(g

55、rade=A!n); break; default: printf(The score is out of range!n); 运行结果如下:运行结果如下:Input a score(0100):50 grade=E!再运行一次:再运行一次:Input a score(0100):90 grade=A!56编程技术【例例3.153.15】从键盘输入一个日期,判断这一天是这一年从键盘输入一个日期,判断这一天是这一年中的第几天?中的第几天?#include void main() int day, month, year,sum, leap; printf(n Please input year,

56、month,dayn); scanf(%d,%d,%d,&year,&month,&day); switch(month) /*先计算某月以前月份的总天数先计算某月以前月份的总天数sum*/ case 1: sum=0;break;case 2: sum=31;break;case 3: sum=31+28;break;case 4: sum=31+28+31;break;case 5: sum=31+28+31+30;break;case 6: sum=31+28+31+30+31;break;case 7: sum=31+28+31+30+31+30;break; case 8: sum=

57、31+28+31+30+31+30+31;break;case 9: sum=31+28+31+30+31+30+31+31;break;case 10: sum=31+28+31+30+31+30+31+31+30;break;case 11: sum=31+28+31+30+31+30+31+31+30+31;break;57编程技术 case 12: sum=31+28+31+30+31+30+31+31+30+31+30;break;default: printf(input error of month); sum=sum+day; /*再加上该月的天数再加上该月的天数*/ if(y

58、ear%400=0|(year%4=0&year%100!=0) /*判断是不是闰年判断是不是闰年*/ leap=1; else leap=0; if(leap=1&month2) /*如果是闰年且月份大于如果是闰年且月份大于2,总天数应再加一天总天数应再加一天*/ sum+; printf(It is the %dth day.,sum); 本节本节本节本节 运行结果如下:运行结果如下:Please input year,month,day 2008,7,19 It is the 201th day.58编程技术3.5.7 3.5.7 3.5.7 3.5.7 选择结构程序设计举例选择结构程序

59、设计举例选择结构程序设计举例选择结构程序设计举例【例例3.163.16】求一元二次方程求一元二次方程axax2 2+bx+c=0+bx+c=0的实数解,并显示的实数解,并显示结果,假设结果,假设a0a0。#include #include void main() float a,b,c,d; scanf(%f%f%f,&a,&b,&c); d=b*b-4*a*c; if (d0) printf(nx1=%f,(-b+sqrt(d)/(2*a); printf(nx2=%f,(-b-sqrt(d)/(2*a); else if (d=0) printf( n x1=x2=%f,(-b)/(2*a

60、); else printf(n The equation has no real root!);59编程技术【例例3.173.17】 输入两个正整数输入两个正整数a a、b b。其中。其中a a不大于不大于31 31 , b b最大不超过三位数。使最大不超过三位数。使a a在左,在左,b b在右,拼成一个新的数在右,拼成一个新的数c c。例如例如a=23,b=30a=23,b=30,则,则c c为为23302330。若。若a=1a=1,b=15b=15,则,则c c为为115115。 算法分析:抽象分析出以下数学模型,决定算法分析:抽象分析出以下数学模型,决定c值的计算公式如下:值的计算公式

61、如下: 当当b为一位数时,为一位数时,c=a*10+b 当当b为二位数时,为二位数时,c=a*100+b 当当b为三位数时,为三位数时,c=a*1000+b 求求c的公式:的公式:c=a*k+bc=a*k+b。 (k的取值可以为:的取值可以为:10,100或或1000) 60编程技术#include void main() int a,b,c,k; printf(nInput two positive integer number:); scanf(%d,%d,&a,&b); if (a0|b31|b999) printf(Input data error!); else if (b10) k

62、=10; else if (b100) k=100; else if (b1000) k=1000; c=a*k+b; printf(na=%2d, b=%3d, c=%5d,a,b,c); 61编程技术【例例3.183.18】个体工商户的生产经营所得,以每一纳税年个体工商户的生产经营所得,以每一纳税年度的收入总额,减除成本、费用以及损失后的余额,为度的收入总额,减除成本、费用以及损失后的余额,为全年应纳税所得额。其所得税税率表如下:全年应纳税所得额。其所得税税率表如下: 级数级数 全年应纳税所得额全年应纳税所得额 税率(税率(% %) 1 1 不超过不超过50005000元的元的 5 5 2

63、 2 超过超过50005000元至元至1000010000元的部分元的部分 1010 3 3 超过超过1000010000元至元至3000030000元的部分元的部分 2020 4 4 超过超过3000030000元至元至5000050000元的部分元的部分 3030 5 5 超过超过5000050000元的部分元的部分 3535#include void main() long int r; int s; double f; printf(Input a integer to r:); scanf(%ld,&r);62编程技术 if (r0) s=(r-1)/5000; switch(s)

64、case 0: f=r*0.05;break; case 1: f=5000*0.05+(r-5000)*0.1;break; case 2: case 3: case 4: case 5: f=5000*0.05+5000*0.1+(r-10000)*0.2;break; case 6: case 7: case 8: case 9: f=5000*0.05+5000*0.1+20000*0.2+(r-30000)*0.3;break; default: f=5000*0.05+5000*0.1+20000*0.2+20000*0.3+(r-50000)*0.35; printf(f=%f,

65、f); else printf(Input a data error!); 63编程技术【例例3.19 3.19 】 编程,输入两个实数编程,输入两个实数a a、b b,再输入一个运算,再输入一个运算符(可以是符(可以是+ +、- -、* *或或/ /)。根据运算符计算并输出)。根据运算符计算并输出a a、b b两两个数的和、差、积和商。个数的和、差、积和商。#include void main() float a,b; char c; scanf(%f%f,&a,&b); c=getchar(); switch(c) case +: printf(%f+%f=%fn,a,b,a+b);bre

66、ak; case -: printf(%f-%f=%fn,a,b,a-b);break; case *: printf(%f*%f=%fn,a,b,a*b);break; case /: printf(%f/%f=%fn,a,b,a/b);break; default: printf(cant compute! ); 64编程技术【例例3.20 3.20 】给一个不多于给一个不多于5 5位的正整数,编程求:位的正整数,编程求:它是它是几位数,几位数,逆序打印出各位数字,逆序打印出各位数字,若为两位以上的数,若为两位以上的数,则判断该数是否为回文数。则判断该数是否为回文数。#include vo

67、id main() int a,b,c,d,e; long x; do printf(n Please input a positive integer number to x:); scanf(%ld,&x); while(x=100000) /* 确保输入的确保输入的x是一个不高于是一个不高于5位的正整数位的正整数 */ a=x/10000; /*分解出万位数分解出万位数*/ b=x%10000/1000; /*分解出千位数分解出千位数*/ c=x%1000/100; /*分解出百位数分解出百位数*/ d=x%100/10; /*分解出十位数分解出十位数*/ e=x%10; /*分解出个位

68、数分解出个位数*/ 65编程技术if(a0) printf(there are 5,%d %d %d %d %dn,e,d,c,b,a); if(e=a&d=b) printf(this number is a huiwenn); else printf(this number is not a huiwenn);else if(b0) printf(there are 4,%d %d %d %dn,e,d,c,b); if(e=b&d=c) printf(this number is a huiwenn); else printf(this number is not a huiwenn);

69、 66编程技术 else if(c0) printf(there are 3,%d %d %dn,e,d,c); if(e=c) printf(this number is a huiwenn); else printf(this number is not a huiwenn); else if(d0) printf(there are 2,%d %d %dn,e,d); if(e=d) printf(this number is a huiwenn); else printf(this number is not a huiwenn); else if(e0) printf(there a

70、re 1,%dn,e); 本节本节本节本节 67编程技术3.6 循环程序设计 循环结构就是当给定条件成立时,反复执行某程循环结构就是当给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为序段,直到条件不成立为止。给定的条件称为循环条循环条件件,反复执行的程序段称为,反复执行的程序段称为循环体循环体。 在在C语言中提供了四种实现循环结构的方法:语言中提供了四种实现循环结构的方法:(1)用)用 if 语句和语句和 goto 语句构成的循环语句构成的循环(2)用)用 while 语句语句(3)用)用 do -while 语句语句(4)用)用 for 语句语句68编程技术3.6.1 3

71、.6.1 gotogoto语句以及用语句以及用gotogoto语句构成的循环语句构成的循环3.6.2 while3.6.2 while语句语句3.6.3 do3.6.3 dowhilewhile语句语句3.6.4 for3.6.4 for语句语句3.6.5 3.6.5 多重循环多重循环3.6.6 break3.6.6 break语句语句3.6.7 continue3.6.7 continue语句语句3.6.8 3.6.8 循环程序设计举例循环程序设计举例 本章本章本章本章 69编程技术3.6.1 3.6.1 3.6.1 3.6.1 gotogotogotogoto语句以及用语句以及用语句以及用

72、语句以及用gotogotogotogoto语句构成的循环语句构成的循环语句构成的循环语句构成的循环 在在结结构构化化程程序序设设计计中中一一般般不不主主张张使使用用goto语语句句,以以免免造造成成程程序序流流程程的的混混乱乱。能能避避免免使使用用goto则则应应避避免免使使用用,确确实实不不得得不不用用时时,才才使使用用goto。 goto语句称为无条件转向语句,其一般格式如下:语句称为无条件转向语句,其一般格式如下: goto 语句标号语句标号; goto语句的语义是改变程序流向,立即跳转到标号所标识的语句。语句的语义是改变程序流向,立即跳转到标号所标识的语句。 语语句句标标号号是是按按标

73、标识识符符规规定定书书写写的的符符号号,放放在在某某一一语语句句行行的的前前面面,标标号号后后加加冒冒号号(:)。语语句句标标号号起起标标识识语语句句的的作作用用,并并不不影影响响该该语语句句的的执行,标号只起与执行,标号只起与goto句配合的作用。句配合的作用。 C语言不限制程序中使用标号的次数,但各标号不得重名。语言不限制程序中使用标号的次数,但各标号不得重名。 一般情况下,使用一般情况下,使用goto语句有语句有两种两种情况:情况: 与与if语句一起构成循环结构;语句一起构成循环结构; 从循环体中跳转到循环体外。从循环体中跳转到循环体外。70编程技术 使用使用goto语句时应该语句时应该

74、注意注意以下几点:以下几点: 跳转到一个循环内是非常危险的,应该极力避免这样做;跳转到一个循环内是非常危险的,应该极力避免这样做; 不能跳转到本函数外;不能跳转到本函数外; goto语句越少用越好;语句越少用越好; 通常不主张向程序的前面跳转;通常不主张向程序的前面跳转;【例例3.213.21】 用用ifif语句和语句和gotogoto语句构成循环,求语句构成循环,求i i。 #include void main() int i=1; /*存放自然数存放自然数*/ int sum=0; /*存放和存放和*/ loop: if (i=100) sum+=i; i+; goto loop; pri

75、ntf(n1+2+3+100=%d,sum); 运行结果:运行结果: 1+2+3+100=5050i=1i=110010001sum i12336410549501005050101 本节本节本节本节 71编程技术3.6.2 while3.6.2 while3.6.2 while3.6.2 while语句语句语句语句 while语句语句( (当循环语句当循环语句) ),其形式如下所示:,其形式如下所示: while ( (表达式表达式) ) 循环体语句循环体语句; 或或 while ( (表达式表达式) ) 循环体语句循环体语句; 其中表达式是循环条件。其中表达式是循环条件。 while语句的

76、语句的执行过程执行过程: 计算表达式的值计算表达式的值若表达式的值为真若表达式的值为真( (非非0)0)时,则转到第时,则转到第步步若表达式的值为假若表达式的值为假(0)(0),转到第,转到第步步 执行循环体语句执行循环体语句 转到第转到第步执行步执行 结束循环,执行结束循环,执行while语句后的第一条语句语句后的第一条语句72编程技术【例例3.223.22】用用whilewhile语句来实现求语句来实现求i i。 #include void main() int i=1; int sum=0; while (i=100) sum+=i; i+; printf(n1+2+3+100=%d,s

77、um); 说明:说明: whilewhile语句一般用于事先语句一般用于事先不知道循环次数不知道循环次数,在循环执行的过程中,根,在循环执行的过程中,根据条件来决定循环是否结束。据条件来决定循环是否结束。 在循环体语句中可以是一条简单的语句,也可以是复合语句,若为复在循环体语句中可以是一条简单的语句,也可以是复合语句,若为复合语句则要用花括号括起来。合语句则要用花括号括起来。 在循环体语句中,一定要有改变循环条件的语句,使循环能终止。在循环体语句中,一定要有改变循环条件的语句,使循环能终止。i=1i=1100100 本节本节本节本节 73编程技术3.6.3 do3.6.3 do3.6.3 do

78、3.6.3 dowhilewhilewhilewhile语句语句语句语句 do while语句语句( (直到型循环直到型循环) ),其一般形式为:,其一般形式为: do 循环体语句循环体语句; while ( (表达式表达式) ); 其中表达式是循环条件。其中表达式是循环条件。 do-while语句的语句的执行过程执行过程是:是: 执行循环体语句,执行循环体语句, 判别表达式的值,判别表达式的值,若表达式的值为真若表达式的值为真(非非0),则转到第,则转到第步步若表达式的值为假若表达式的值为假(0),则转到第,则转到第步步 结束循环,执行结束循环,执行do while语句后的第一条语句。语句后

79、的第一条语句。74编程技术【例例3.233.23】 用用do whiledo while语句来实现求语句来实现求i i。 #include void main() int i=1; int sum=0; do sum+=i; i+; while(i=100); printf(n1+2+3+100=%d,sum);i=1i=1100100思考题:思考题: 1 1、求、求i i,n n由键盘输入。由键盘输入。 2 2、求、求i i,即求,即求n!n!,n n由键盘输入。由键盘输入。 3 3、求、求n n以内的偶(奇)数之和。以内的偶(奇)数之和。i=1i=1n ni=1i=1n n75编程技术 说

80、明:说明: dowhile语句一般用于事先语句一般用于事先不知道循环次数不知道循环次数,在,在循环执行的过程中,根据条件来决定循环是否结束。循环执行的过程中,根据条件来决定循环是否结束。 在循环体语句中可以是一条简单的语句,也可以在循环体语句中可以是一条简单的语句,也可以是复合语句,若为复合语句则要用花括号括起来。是复合语句,若为复合语句则要用花括号括起来。 在循环体语句中,一定要有改变循环条件的语句在循环体语句中,一定要有改变循环条件的语句, ,使循环能终止。使循环能终止。 while(表达式表达式)的后面一定要加分号的后面一定要加分号,表示表示dowhile语句的结束。语句的结束。 do-

81、while语句语句和和while语句语句的的区别区别在于:在于: do while是是先先执执行行后后判判断断,即即do while至至少少执执行行一一次循环体。次循环体。 while是是先先判判断断后后执执行行,如如果果条条件件不不满满足足,则则一一次次循循环环体体语语句句也也不不执执行行。while语语句句和和do-while语语句句一一般般都可以都可以相互改写相互改写。 76编程技术【例例3.243.24】whilewhile循环和循环和do whiledo while循环的比较。循环的比较。 #include #include void main() void main() int m

82、,n=1; int m,n=1; scanf(%d,&m); scanf(%d,&m); do while(m=10) n+=m; n+=m; m+; m+; while(m=10); printf(n=%d,m=%d,n,m); printf(n=%d,m=%d,n,m); 程序运行结果:程序运行结果:5 n=46, m=11再运行一次的结果:再运行一次的结果:11 n=12,m=12程序运行结果:程序运行结果:5 n=46, m=11再运行一次的结果:再运行一次的结果:11 n=1,m=11 本本本本节节节节 77编程技术3.6.4 for3.6.4 for3.6.4 for3.6.4 f

83、or语句语句语句语句 for语语句句也也是是一一种种循循环环语语句句,其其功功能能是是把把某某些些语语句句重重复复执执行行若若干干次次,不不仅仅可可以以用用于于循循环环次次数数确确定定,而而且且也也可可以以用用于于循循环环次次数数不不确确定定的循环。其一般形式为:的循环。其一般形式为: for(表达式表达式1;表达式表达式2;表达式表达式3) 循环体语句循环体语句 for语句的语句的执行过程执行过程: 计算表达式计算表达式1的值;的值; 计算表达式计算表达式2的值的值若表达式若表达式2的值为真的值为真(非非0),则执行循环体,则执行循环体, 然后转到第然后转到第 步;步;若表达式若表达式2的值

84、为假的值为假(0),则转到第,则转到第步;步; 计算表达式计算表达式3的值,转回第的值,转回第步重复执行;步重复执行; 循环结束,执行循环结束,执行for语句后面的第一条语句。语句后面的第一条语句。 在整个在整个for循环过程中,循环过程中,表达式表达式1只计算一次,表达式只计算一次,表达式2和表达式和表达式3则可能计算多次则可能计算多次。循环体可能多次执行,也可能一次都不执行。循环体可能多次执行,也可能一次都不执行。 78编程技术【例例3.253.25】求求10001000以内的奇数和。以内的奇数和。#include void main() int i; long int sum=0; fo

85、r (i=1;i1000;i+=2) sum+=i; printf(n sum=%ldn,sum); 79编程技术 说明:说明: for语句可用如下易理解的形式来描述:语句可用如下易理解的形式来描述: for(循环变量初值;循环条件;循环变量增值)循环体语句循环变量初值;循环条件;循环变量增值)循环体语句 也即表达式也即表达式1 1相当于给循环变量赋初值,表达式相当于给循环变量赋初值,表达式2 2是一个条件表是一个条件表达式,表达式达式,表达式3 3是改变循环变量的值。是改变循环变量的值。 forfor语句的一般形式中的语句的一般形式中的“表达式表达式1 1”可以省略,此时应在可以省略,此时应

86、在forfor语句之前给语句之前给循环变量赋初值循环变量赋初值。表达式。表达式1 1省略,其后的分号不能省略。省略,其后的分号不能省略。执行时跳过执行时跳过“求解表达式求解表达式1”1”这一步,其它不变。这一步,其它不变。#include void main() int i=1; long int sum=0; for (;i1000;i+=2) sum+=i; printf(n sum=%ldn,sum);80编程技术 “表达式表达式2”也可也可省略省略,其后的分号不能省略。此时等于没有循,其后的分号不能省略。此时等于没有循环条件,执行环条件,执行forfor语句时,就不要判断循环条件,也就

87、认为表达式语句时,就不要判断循环条件,也就认为表达式2 2始终为真。此时循环体一定要有一条始终为真。此时循环体一定要有一条语句语句能够能够跳出循环跳出循环否则就是一否则就是一个死循环。个死循环。 #include void main() int i; long int sum=0; for (i=1;i+=2) if (i=1000) break; /* break跳转语句,跳出跳转语句,跳出for循环语句循环语句 */ sum+=i; printf(n sum=%ldn,sum); 81编程技术 “ “表达式表达式3 3”也可也可省略省略,此时应在循环体中有语句可以,此时应在循环体中有语句可

88、以改变循改变循环变量的值环变量的值。否则循环也会变成死循环。否则循环也会变成死循环。 #include void main() int i; long int sum=0; for (i=1;i1000;) sum+=i; i+=2; printf(n sum=%ldn,sum); 82编程技术 表达式表达式1 1,表达式,表达式2 2,表达式,表达式3 3可以可以省略省略一个或两个,也可同时一个或两个,也可同时全部省略。如全部省略。如: : for(;)循环体语句循环体语句 表达式表达式1,2,3可以是可以是任何类型任何类型的表达式,包括逗号表达式。可以的表达式,包括逗号表达式。可以是与循环

89、变量有关的表达式,也可以是与循环变量无关的表达式。是与循环变量有关的表达式,也可以是与循环变量无关的表达式。如:如:for(sum=0,i=1; i1000;i+=2) sum+=i;又如:又如: for(;(c=getchar()!=n;) printf(%c,c);【例例3.273.27】 从键盘接收字符并显示字符的个数。从键盘接收字符并显示字符的个数。 #include void main() int i; char c; for(i=0;(c=getchar()!=n;i+); /*printf(%c,c);*/ printf(The sum is %dn,i); 循循环环体体可可以以

90、是是空空语语句句。空空语语句句可可以以用用来来实实现现延延时时,也也就就是是在在程程序执行中等待一定的时间。如下为延时程序:序执行中等待一定的时间。如下为延时程序: for (i=1;i1000,i+);83编程技术【例例3.283.28】 中中国国剩剩余余定定理理:“有有物物不不知知几几何何,三三三三数数余余一一,五五五五数数余余二二,七七七七数数余余三三,问问:物物有有几几何何?”。编编程求程求10001000以内所有解。以内所有解。编程思路:编程思路:采用采用”穷举法穷举法”来解此题。来解此题。具具体体做做法法是是:从从所所有有可可能能解解中中,逐逐个个进进行行试试验验,若若满满足足条条

91、件件,就得到一个解就得到一个解,否则不是,直到条件满足或判别出无解为止。,否则不是,直到条件满足或判别出无解为止。#include void main() int m,count=0; for(m=1;m=1000;m+) if (m%3=1 & m%5=2 & m%7=3) printf(%5d,m); count+; if(count%5=0) printf(n); /*每行输出每行输出5个数个数*/ 运行结果如下:运行结果如下: 52 157 262 367 472 577 682 787 892 99784编程技术【补补充充例例6 6】输输出出所所有有水水仙仙花花数数,水水仙仙花花数数

92、是是指指一一个个三三位位数数,其其各各位位数数字字的的立立方方和和等等于于该该数数本本身身。例例如如,153153是是一一个水仙花数,因为个水仙花数,因为153=1153=13 3+5+53 3+3+33 3。(穷举法)(穷举法)#include void main() int m; int x,y,z; for (m=100;m=999;m+) x=m/100;/* 分解出百位数分解出百位数 */y=m/10%10; /* 分解出十位数分解出十位数 */z=m%10;/* 分解出个位数分解出个位数 */if (x*x*x+y*y*y+z*z*z=m) printf(%dn,m); 15337

93、0371407 本节本节本节本节 85编程技术3.6.5 3.6.5 3.6.5 3.6.5 多重循环多重循环多重循环多重循环 在循环语句中又包含另一个循环语句时,我们称其为在循环语句中又包含另一个循环语句时,我们称其为循环嵌套循环嵌套。在多重循环中,处于内部的循环称为内循环,处于外部的循环称为外在多重循环中,处于内部的循环称为内循环,处于外部的循环称为外循环。按循环嵌套的层数,可分别称循环。按循环嵌套的层数,可分别称二重循环二重循环、三重循环三重循环等等。等等。 语言规定,内循环必须完全嵌套于外循环中,内、外循环不能语言规定,内循环必须完全嵌套于外循环中,内、外循环不能交叉,并且内、外循环的

94、循环控制变量不能同名。交叉,并且内、外循环的循环控制变量不能同名。在在C语言中,凡是可以出现语句的地方,都可以出现循环语句。语言中,凡是可以出现语句的地方,都可以出现循环语句。【例例3.293.29】打印如图下图所示的打印如图下图所示的“九九- -九九”乘法表。乘法表。 86编程技术算法分析:算法分析:外循环是输出行外循环是输出行( (用用i作为循环控制变量作为循环控制变量i=19) )内循内循环是是输出列出列( (用用j作为循环控制变量作为循环控制变量j=19) )#include void main() int i,j; for(i=1;i=9;i+) /* 外循环,控制行外循环,控制行

95、*/ for(j=1;j=9;j+) /* 内循环,控制列内循环,控制列 */ printf(%d*%d=%dt,i,j,i*j); printf(n);87编程技术 #include void main() int i,j; for (i=1;i=9;i+) for (j=1;j=i;j+) printf(%d*%d=%dt,i,j,i*j); printf(n); 思考题:思考题:在屏幕上输出如下图所示乘法口诀表。在屏幕上输出如下图所示乘法口诀表。要保证输出的是三角的格式,必须满足列坐标要保证输出的是三角的格式,必须满足列坐标(j)不大于行坐标不大于行坐标(i),即,即(j=i)如何输出?

96、88编程技术【补充例补充例】输出所有水仙花数。输出所有水仙花数。(多重循环、穷举法)(多重循环、穷举法) 算法分析:算法分析:设这三位数的百位数为设这三位数的百位数为x,十位数为十位数为y,个位数为个位数为z。按水仙花数的定义有:按水仙花数的定义有: x3+y3+z3 =100x+10y+z(1x9,0y9,0z9,且且x,y,z都是都是整数整数) #include void main() int x,y,z; for (x=1;x=9;x+) for (y=0;y=9;y+) for (z=0;z=9;z+) if (x*x*x+y*y*y+z*z*z=100*x+10*y+z) print

97、f(“%dn”,100*x+10*y+z); 15337037140789编程技术【例例3.303.30】 有有1 1、2 2、3 3、4 4个数字,能组成多少个互不相个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?同且无重复数字的三位数?都是多少?#include void main() int i,j,k,count=0; printf(n); for(i=1;i5;i+) /*以下为三重循环以下为三重循环*/ for(j=1;j5;j+) for (k=1;k5;k+) if (i!=k&i!=j&j!=k) /*确保确保i、j、k三位互不相同三位互不相同*/ count+;

98、 printf(%d%d%d ,i,j,k); if(count%10=0)printf(n); printf(ncount=%dn,count); 本节本节本节本节 90编程技术3.6.6 break3.6.6 break3.6.6 break3.6.6 break语句语句语句语句 break语语句句只只用用在在switch语语句句或或循循环环语语句句中中,其其作作用用是是无无条条件件跳跳出出switch语句或跳出本层循环,转去执行后面的程序。语句或跳出本层循环,转去执行后面的程序。 break语句的一般形式为:语句的一般形式为: break; 使使用用break语语句句可可以以使使循循环环

99、语语句句有有多多个个出出口口,使使程程序序避避免免了了一一些些不必要重复,提高了程序效率。不必要重复,提高了程序效率。 break语句与语句与while循环语句连用格式:循环语句连用格式: while(表达式表达式1) 语句语句1; if(表达式表达式2) break; 语句语句2; break与与while连用连用 91编程技术【例例3.313.31】求当半径求当半径r r为何值时,圆的面积大于为何值时,圆的面积大于100100?#include void main() int r; float area,pi=3.1415927; for(r=1;r+) area=pi*r*r; if (

100、area100) break; printf(%fn,area); printf(r=%dn,r); 注意:注意:break语句不能用于语句不能用于switch和循环语句之外的任何其它语和循环语句之外的任何其它语句中。句中。 程序运行结果:程序运行结果:3.14159312.56637128.27433450.26548478.539818r=692编程技术【补补充充例例7 7】韩韩信信点点兵兵问问题题。韩韩信信有有一一队队士士兵兵,他他想想知知道道有有多多少少人人,便便让让士士兵兵排排队队报报数数。按按从从1 1到到5 5报报数数,最最末末一一个个士士兵兵报报的的数数为为1 1;按按从从1

101、1到到6 6报报数数,最最末末一一个个士士兵兵报报的的数数为为5 5;按按从从1 1到到7 7报报数数,最最末末一一个个士士兵兵报报的的数数为为4 4;最最后后再再按按从从1 1到到1111报报数数,最最末末一一个个士士兵兵报报的的数数为为1010。编编程程计计算算韩韩信至少有多少兵。信至少有多少兵。(breakbreak应用)应用)算法分析:算法分析:设设兵数为兵数为x,则按题意,则按题意x应满足:应满足:x%5=1 & x%6=5 & x%7=4 & x%11=10采用采用穷举法穷举法对对x从从1开始逐个试验,第一个使得上述开始逐个试验,第一个使得上述关系式成立的关系式成立的x值即为所求。

102、值即为所求。 93编程技术#include void main() int x; for (x=1; ;x+) if(x%5=1 & x%6=5 & x%7=4 & x%11=10) printf(x=%dn,x); break; x=2111练练习习:有有一一条条长长阶阶梯梯,若若每每步步跨跨2 2阶阶,最最后后剩剩下下1 1阶阶;若若每每步步跨跨3 3阶阶,最最后后剩剩下下2 2阶阶;若若每每步步跨跨5 5阶阶,最最后后剩剩下下4 4阶阶;若若每每步步跨跨6 6阶阶,则则最最后后剩剩下下5 5阶阶;只只有有每每步步跨跨7 7阶阶,最最后后才才正正好好1 1阶阶不不剩剩。编编程计算这条阶梯共

103、有多少阶。程计算这条阶梯共有多少阶。 本节本节本节本节 94编程技术3.6.7 continue3.6.7 continue3.6.7 continue3.6.7 continue语句语句语句语句 continue语句只能用在循环体中,其一般格式是:语句只能用在循环体中,其一般格式是: continue; 其其语语义义是是:结结束束本本次次循循环环,即即不不再再执执行行循循环环体体中中continue语语句句之之后的语句,而是立即转入对循环条件的判断与执行。后的语句,而是立即转入对循环条件的判断与执行。应应特特别别注注意意的的是是,continue语语句句只只结结束束本本层层本本次次的的循循环

104、环,并并不不跳跳出循环出循环。 continue语句与语句与while循环语句连用格式:循环语句连用格式: while(表达式表达式1) 语句语句1; if(表达式表达式2) contimue; 语句语句2; continue与与while连用连用 95编程技术【例例3.323.32】 从键盘输入整数,显示出其中的正整数,若从键盘输入整数,显示出其中的正整数,若输入的是输入的是100100,则退出,则退出。 #include void main() int x; do scanf(%d,&x); if(x0) continue; printf(%dn,x); while(x!=100); 96

105、编程技术【例例3.333.33】 求连续的奇数和,当奇数和刚好超过求连续的奇数和,当奇数和刚好超过10001000时时停止计算,并按运行结果输出。程序中有两空,请读者停止计算,并按运行结果输出。程序中有两空,请读者补充,使之能实现上述功能。补充,使之能实现上述功能。 #include void main() int i,sum=0; for(i=1;i+) if(i%2=0) ; sum+=i; if(sum1000) ; printf(1+3+5+%d=%dn,i,sum); 本节本节本节本节 continue break97编程技术3.6.8 3.6.8 3.6.8 3.6.8 循环程序设

106、计举例循环程序设计举例循环程序设计举例循环程序设计举例【补补充充例例8 8】男男、女女生生总总计计1818个个人人,在在一一家家饭饭店店里里吃吃饭饭,共共花花了了7474元元,每每个个男男生生各各花花5 5元元,每每个个女女生生各各花花3 3元元。利利用穷举法编程计算男、女生各有多少人。用穷举法编程计算男、女生各有多少人。(穷举法)(穷举法)算法分析:算法分析:设男生设男生x人,女生人,女生y人,根据题意有:人,根据题意有:x+y=185x+3y=74且且x、y应为整数,并满足下列条件:应为整数,并满足下列条件:1x,y18#include void main() int x,y; for(x

107、=1;x=18;x+)/* 男生人数的取值男生人数的取值 */ for(y=1;y=18;y+)/* 女生人数的取值女生人数的取值 */ if(x+y=18 & x*5+y*3=74) printf(男生:男生:%dt女生:女生:%dtn,x,y);思思考考题题:鸡鸡兔兔同同笼笼问问题题:已已知知鸡鸡和和兔兔总总头头数数为为3030,总总脚脚数数为为9090,求求鸡鸡兔兔各各有多少只有多少只? ?男生:男生:10女生:女生:898编程技术【例例3.353.35】某某人人想想将将手手中中一一张张100100元元的的人人民民币币换换成成5 5元元、1 1元元和和0.50.5元元面面值值的的零零钞钞

108、,但但要要求求最最后后的的零零钞钞总总数数为为100100张张, ,且要求每种零钞的数量不少于且要求每种零钞的数量不少于1 1张。问有哪几种组合?张。问有哪几种组合? 算算法法分分析析: 这这是是一一个个数数学学问问题题,我我们们先先抽抽取取它它的的数数学学模模型型:设设5元元的的票票i张张,1元元的的票票j张张,0.5元元票票k张张。可可以以列列出:出: i+j+k=100 5i+j+0.5k=100 (也可写成:也可写成:10i+2j+k=200) 三三个个变变量量只只能能列列出出两两个个方方程程式式,不不能能解解。通通过过计计算算机用机用穷举法穷举法。 5元元1元元5角角i=1j=1k=

109、198j=2k=198 j=94k=198i=2 j=1k=198j=94k=198 i=19 100编程技术#include void main() int i,j,k; printf(n i j kn); for(i=1;i20;i+) for(j=1;j95;j+) for(k=1;k=98;k+) if (i+j+k=100) & (10*i+2*j+1*k=200) printf(%7d%7d%7dn,i,j,k); 运行结果如下:运行结果如下: i j k 1 91 8 2 82 16 3 73 24 4 64 32 5 55 40 6 46 48 7 37 56 8 28 64

110、9 19 72 10 10 80 11 1 88思思考考题题:百百鸡鸡问问题题:一一只只公公鸡鸡5 5元元,一一只只母母鸡鸡3 3元元,三三只只小小鸡鸡1 1元元。现现要要求求用用100100元元买买100100只只鸡鸡,且且要要求求每每种种鸡鸡的的数数量量不不少少于于只只。问问公公鸡鸡、母母鸡、小鸡各买多少只鸡、小鸡各买多少只? ?101编程技术【例例3.343.34】从键盘输入一个整数从键盘输入一个整数n n,判断判断n n是否为素数。是否为素数。 编编程程思思路路:让让n被被2到到n-1除除,如如果果n能能被被2n-1之之中中任任何何一一整整数数整整除除,则则n非非素素数数;如如果果n不

111、不能能被被2n-1之之间间的的任一整数整除,则任一整数整除,则n是素数。是素数。素数即质数,指只能被素数即质数,指只能被1 1和它本身整除的数。和它本身整除的数。最佳方法:最佳方法:让让n被被2到到 除,如果除,如果n能被能被2 之中任之中任何一整数整除,何一整数整除,n非素数;如果非素数;如果n不能被不能被2 之间的任一之间的任一整数整除,则整数整除,则n是素数。是素数。104编程技术#include #include void main() int n,j,k; printf(n Input a integer to n:); scanf(%d,&n); k=n-1; j=2; while

112、(j=k+1) printf(n %d is a prime number!n,n); else printf(n %d is not a prime number!n,n); sqrt(n)思考题:思考题:编写一个程序,输出编写一个程序,输出100100以内的所有素数。以内的所有素数。105编程技术【例例3.363.36】利用格里高利公式求利用格里高利公式求。直到最后一项的值直到最后一项的值小于小于1010-6-6为止。为止。 算法分析:算法分析:第第1、3、5等奇数项为正数,偶数项为负数,分母依等奇数项为正数,偶数项为负数,分母依次为次为1、3、5、7pi存放结果存放结果t存放第存放第i项

113、的值项的值i表示第表示第i项的分母项的分母k表示第表示第i项的分子项的分子107编程技术#include #include void main() float k,i; double t,pi; pi=0; t=1.0; i=1; k=1.0; do pi=pi+t; i=i+2; k=-k; t=k/i; while(fabs(t)=1e-6); pi=pi*4; printf(n pi=%fn,pi) ; 本节本节本节本节 运行结果:运行结果:pi=3.141591思考题:思考题:用近似公式:用近似公式:求自然对数的底求自然对数的底e e的值,直到最后一的值,直到最后一项的值小于项的值小于

114、1010-6-6为止。为止。108编程技术3.7 综合程序应用举例【例例3.373.37】对一批货物征收税金。价值在对一批货物征收税金。价值在1 1万元以上的货万元以上的货物征收物征收5%5%的税金,在的税金,在50005000元以上,元以上,1 1万元以下的货物征收万元以下的货物征收3%3%的税金,在的税金,在10001000元以上,元以上,50005000元以下的货物征收元以下的货物征收2%2%的的税金,税金,10001000元以下的货物免税。编写程序,读入货物价元以下的货物免税。编写程序,读入货物价格,计算并输出税金。格,计算并输出税金。price1000 对应对应01000price5

115、000 对应对应1、2、3、45000price10000 对应对应5、6、7、8、910000price 对应对应10、11、12、price/1000110编程技术#include void main() long x,price; float y; printf(please enter price:); scanf(%d,&price); x=price / 1000; switch(x) case 0:y=0; break; case 1: case 2: case 3: case 4:y=0.02; break; case 5: case 6: case 7: case 8: ca

116、se 9:y=0.03; break; default:y=0.05; printf(revenue=%f,price*y);111编程技术【例例3.383.38】 编程打印楼梯,同时在楼梯上方打印两个笑编程打印楼梯,同时在楼梯上方打印两个笑脸。用音符代表台阶,如图所示脸。用音符代表台阶,如图所示 。#include void main() int i,j; printf(%c%cn,1,1);/*输出两个笑脸输出两个笑脸*/ for(i=1;i11;i+) for(j=1;j=i;j+) printf(%c%c,14,14);/*输出两个音符输出两个音符*/ printf(n); 笑脸的笑脸

117、的ASCII值是值是1音阶的音阶的ASCII值是值是14 112编程技术【补充例补充例9 9】打印如下所示的图案。打印如下所示的图案。 #include #define N 7 void main() int i,j; for(i=1;i=N;i+) for(j=1;j=2*i-1;j+) printf(*); printf(n); 算法分析:算法分析:F 每个星号的个数可由行和列确定。设变量每个星号的个数可由行和列确定。设变量i为行,为行,变量变量j为第为第i行所对应的星号的个数,则:行所对应的星号的个数,则:j=2*i-1F 外循环控制行数,内循环控制每行星号的个数外循环控制行数,内循环控

118、制每行星号的个数113编程技术【补充例补充例1010】打印如下所示的图案。打印如下所示的图案。 #include #include #define N 7 void main() int i,j; for (i=1;i=N;i+) for (j=1;j=N-abs(N-(2*i-1);j+) printf(*); printf(n); 算法分析:算法分析:F 设变量设变量i为行,变量为行,变量j为第为第i行所对应的星号的个数,行所对应的星号的个数,则:则:j=7-|7-(2i-1)|N必须是奇必须是奇数数114编程技术【补充例补充例1111】编写一个循环程序,打印出如下图案。编写一个循环程序,

119、打印出如下图案。 #include #include #define N 7 void main() int i,j; for(i=1;i=N;i+) for(j=1;j=abs(N+1)/2-i);j+) printf( ); for(j=1;j=N-abs(N-(2*i-1);j+) printf(*); printf(n); 思考题:思考题:打印如下所示图案打印如下所示图案ABBBCCCCCDDDDDDDEEEEEEEEEDDDDDDDCCCCCBBBAF 设变量设变量i为行,变量为行,变量j为第为第i行所对应的星号的个数,行所对应的星号的个数,则:则:j=7-|7-(2i-1)|F 每

120、个星号前的空格数与行的关系是:每个星号前的空格数与行的关系是:j=|4-i|115编程技术【例例3.393.39】 输入一行字符,分别统计出其中英文字母、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。空格、数字和其它字符的个数。#include void main() char c;int letters=0,space=0,digit=0,others=0;printf(please input some characters:n);while(c=getchar()!=n)/* 当输入字符为当输入字符为n时结束循环时结束循环 */ if(c=a&c=A&c=0&c=9)

121、 digit+; else others+; printf(all in all:char=%d space=%d, digit=%d,others=%dn, letters,space,digit,others); 116编程技术【例例3.403.40】任何一个整数的立方都可以写成一串相邻奇任何一个整数的立方都可以写成一串相邻奇数之和。著名的尼科梅彻斯(数之和。著名的尼科梅彻斯(NicomachusNicomachus)定理。)定理。 如:如:1 13 3=1=1 2 23 3=3+5=3+5 3 33 3=7+9+11=7+9+11 4 43 3=13+15+17+19=13+15+17+

122、19 编程,从键盘输入一个整数编程,从键盘输入一个整数n n,求,求n n3 3是哪些奇数是哪些奇数之和。之和。 【分析分析】从上面各式可以看出以下的规律:从上面各式可以看出以下的规律:n n3 3是是n n个相邻的奇数个相邻的奇数之和。如果知道各式的第一个奇数则也就知道所有的奇数了。从给之和。如果知道各式的第一个奇数则也就知道所有的奇数了。从给出的各式可以看出:组成出的各式可以看出:组成1 13 3的的1 1个奇数的奇数序列中第个奇数的奇数序列中第1 1个奇数是个奇数是1 1,组成组成2 23 3的的2 2个奇数的奇数序列中第个奇数的奇数序列中第1 1个奇数是个奇数是3 3,组成,组成3 3

123、3 3的的3 3个奇数的奇个奇数的奇数序列中第数序列中第1 1个奇数是个奇数是7 7,组成,组成4 43 3的的4 4个奇数的奇数序列中第个奇数的奇数序列中第1 1个奇数个奇数是是1313,从中我们可以推出:组成,从中我们可以推出:组成x x3 3的的x x个奇数的奇数序列中第一个奇个奇数的奇数序列中第一个奇数为数为x*(x-1)+1x*(x-1)+1。117编程技术#include void main() int i,x,t; scanf(%d,&x); printf(n); t=x*(x-1)+1; for(i=1;i=x-1;i+) printf(%d+,t); t=t+2; print

124、f(%d=%dn,t,x*x*x); 运行结果:运行结果:10 91+93+95+97+99+101+103+105+107+109=1000118编程技术【例例3.433.43】输入两个整数,用辗转相除法输入两个整数,用辗转相除法( (欧几里德算法欧几里德算法) )求它们的最大公约数求它们的最大公约数和最小公倍数和最小公倍数。#include void main() int m,n,r,p; scanf(%d%d,&m,&n); p=m*n; while(m%n!=0) r=m%n; m=n; n=r; printf(%dn,n); printf(%dn,p/n); 设两数为设两数为m、n,

125、如果如果m除以除以n的余数为的余数为0,则,则n就是就是两数的最大公约数两数的最大公约数,否则转到否则转到执行;执行;m除以除以n得余数得余数r,令,令m=n,n=r;转到转到继续执行。继续执行。119编程技术【补补充充例例1212】有有一一对对兔兔子子从从出出生生后后第第3 3个个月月起起每每个个月月都都生生一一对对兔兔子子,小小兔兔子子长长到到第第3 3个个月月后后每每个个月月又又生生一一对对兔兔子子。假假设设所所有有兔兔子子都都不不死死,问问每每个个月月的的兔兔子子总总数数为为多多少少?(?(假假设求前设求前4040个月个月) ) 算法分析:算法分析:每个月的兔子总数排列起来是每个月的兔

126、子总数排列起来是Fibonacci(斐斐波波那那契契)数数列列,这这个个数数列列有有如如下下特特点点:第第1、2个个数数为为1、1,从第,从第3个数开始,每个数是其前两个数之和。即:个数开始,每个数是其前两个数之和。即: F1=1 (n=1) F2=1 (n=2) Fn=Fn-1+Fn-2 (n3)120编程技术#include void main() int f1=1,f2=1,f3; int i; printf(%15d%15d,f1,f2); for(i=3;i=40;i+) f3=f1+f2;/*求数列的下一项求数列的下一项*/ printf(%15d,f3); f1=f2;/*f1中

127、放数列的前两项的值中放数列的前两项的值*/ f2=f3;/*f2中放数列的前一项的值中放数列的前一项的值*/ if(i%4=0)/*每一行输出每一行输出4个数个数*/ printf(n); 121编程技术【补补充充例例1313】猴猴子子吃吃桃桃问问题题。猴猴子子第第一一天天摘摘下下若若干干个个桃桃子子,当当即即吃吃了了一一半半,还还不不过过瘾瘾,又又多多吃吃了了一一个个。第第二二天天早早上上又又将将剩剩下下的的桃桃子子吃吃掉掉一一半半,又又多多吃吃了了一一个个。以以后后每每天天早早上上都都吃吃了了前前一一天天剩剩下下的的一一半半零零一一个个。到到第第1010天天早早上上想再吃时,就只剩一个桃子

128、了。求第一天共摘多少桃子。想再吃时,就只剩一个桃子了。求第一天共摘多少桃子。#include void main() int day,x; x=1; for(day=9;day0;day-) x=(x+1)*2; printf(total=%dn,x);122编程技术【补补充充例例1414】一一球球从从100m100m高高度度自自由由落落下下,每每次次落落地地后后反反跳跳回回原原高高度度的的一一半半,再再落落下下。求求它它在在第第1010次次落落地地时时,共共经过多少经过多少m m?第第1010次反弹有多高?次反弹有多高?#include void main() float s=100,h=s

129、/2; int n; for(n=2;n=10;n+) s=s+2*h; h=h/2; printf(s=%fn,s); printf(h=%fn,h);123编程技术【补充例补充例1515】求求SnSna aaaaaaaaaaaaaaaaa之值之值, ,其中其中a a是是一一个个数数字字,n n由由键键盘盘输输入入。例例如如:2 222222222222222222222222(22222(此时此时n=5) n=5) 。#include void main() int a,n,i; int s=0,x=0; printf(a,n=); scanf(%d,%d,&a,&n); for(i=1;

130、i=n;i+) x=x*10+a; s=s+x; printf(a+aa+aaa+.=%dn,s);n个个a124编程技术【补补充充例例1616】一一个个数数如如果果恰恰好好等等于于它它的的因因子子之之和和,这这个个数数就就称称为为“完完数数”。例例如如,6 6的的因因子子为为1 1、2 2、3 3,而而6=1+2+36=1+2+3,因因此此6 6是是完完数数。编编写写程程序序找找出出10001000以以内内的的所所有有完完数数,并并按按下下面面格格式式输输出出其其因因子子:“6 6 Its Its factors factors are are 1,2,3”1,2,3”。#include v

131、oid main() int m,s,i; for (m=2;m1000;m+) s=0; for (i=1;i=m/2;i+) if (m%i)=0) s=s+i; if (s=m) printf(%d Its factors are ,m); for (i=1;i=m/2;i+) if (m%i=0) printf(%d,i); printf(n); 125编程技术【补充例补充例1717】将一个正整数分解质因数。例如:输入将一个正整数分解质因数。例如:输入120120,打印出,打印出120=2*2*2*3*5120=2*2*2*3*5#include void main() int n,i

132、; printf(n please input a number:); scanf(%d,&n); printf(%d=,n); for(i=2;i=n;i+) while(n!=i) if(n%i=0) printf(%d*,i); n=n/i; else break; printf(%d,n); 126编程技术【补充例补充例1818】验证哥德巴赫猜想:任意大于等于验证哥德巴赫猜想:任意大于等于4 4的偶数,的偶数,可以用两个素数之和表示。可以用两个素数之和表示。例如:例如: 4=2+2 6=3+3 8=3+5 98=19+79 32764=16073+16691用键盘输入一个充分大的偶数,

133、输出该偶数的素数之和。用键盘输入一个充分大的偶数,输出该偶数的素数之和。for (i=2;i=n/2;i+)for (k=2;k=sqrt(i);k+)127编程技术算法分析:算法分析: (1)从键盘输入一个数从键盘输入一个数n,若该不是偶数,则重输入重,若该不是偶数,则重输入重输,直到满足条件为止;输,直到满足条件为止; (2)利用循环语句,利用循环语句,求出求出i从从2到到n/2之间中的素数之间中的素数,若,若不为素数,则不为素数,则i+,重新判断,重新判断i是否为素数;若为素数,则是否为素数;若为素数,则判断判断j=n-i是否为素数。是否为素数。 (3)若若j为素数,则输出为素数,则输出

134、n=i+j,且每行输出,且每行输出5个式子。个式子。#include #include void main() int i,j,k,m,n,count=0; do printf(Please enter a even number to n:); scanf(%d,&n); while(n4 | n%2!=0); /*保证输入的是一个保证输入的是一个4的偶数的偶数*/128编程技术for(i=2;i=n/2;i+) for(k=2;ksqrt(i) /*i是素数是素数*/ j=n-i; for(m=2;msqrt(j) /*n-i是素数是素数*/ count+; printf(%5d=%4d+

135、%4d ,n,i,j); if(count%4=0) printf(n); 本章本章本章本章 129编程技术 1实验目的实验目的了解了解C语言中逻辑真语言中逻辑真(非非0)和逻辑假和逻辑假(0)的表示方法的表示方法;掌握逻辑运算符和逻辑表达式的表示方法;掌握逻辑运算符和逻辑表达式的表示方法;使用单步执行查看程序运行的过程,理解并掌握使用单步执行查看程序运行的过程,理解并掌握if语句和语句和switch语句;语句;能正确使用能正确使用break语句。语句。 2实验内容实验内容从键盘上输入一个正整数,判断它是否能被从键盘上输入一个正整数,判断它是否能被2整除,同时又整除,同时又能被能被3整除。若某

136、个正整数满足上述条件,则将其输出,否则给出整除。若某个正整数满足上述条件,则将其输出,否则给出不能同时被不能同时被2和和3整除的提示信息。运行程序,分别输入整除的提示信息。运行程序,分别输入6和和7,查看,查看输出结果。输出结果。130编程技术根据输入的根据输入的x值,计算值,计算z的值。的值。 -2*x/ ,x0程序运行三次,分别输入负数,零和正数,(如:程序运行三次,分别输入负数,零和正数,(如:-1,0,1),查),查看程序的运行结果。看程序的运行结果。 可以采用单步执行查看可以采用单步执行查看if语句的执行过程。语句的执行过程。对一批货物征收税金。价值在对一批货物征收税金。价值在1万元

137、以上的货物征收万元以上的货物征收5%的税的税金,在金,在5000元以上,元以上,1万元以下的货物征收万元以下的货物征收3%的税金,在的税金,在1000元以元以上,上,5000元以下的货物征收元以下的货物征收2%的税金,的税金,1000元以下的货物免税。元以下的货物免税。编写程序,读入货物价格,计算并输出税金。编写程序,读入货物价格,计算并输出税金。运行程序四次,分别输入运行程序四次,分别输入20000,6590,4620,890(其它类似数据(其它类似数据也可),查看程序运行结果。也可),查看程序运行结果。 3写出实验报告写出实验报告 本章本章本章本章 131编程技术 1实验目的实验目的熟悉并

138、掌握熟悉并掌握while循环、循环、do-while循环和循环和for循环的表示方法;循环的表示方法;掌握循环程序设计中常用的一些算法,如穷举法、递推法;掌握循环程序设计中常用的一些算法,如穷举法、递推法;在循环程序设计中能正确使用在循环程序设计中能正确使用break语句和语句和continue语句;语句;使用单步执行和设置使用单步执行和设置watch窗口查看变量的中间结果等方法窗口查看变量的中间结果等方法调试程序。调试程序。2实验内容实验内容(1) 编写一个程序,输出所有在编写一个程序,输出所有在500与与1000之间的所有素数,之间的所有素数,要求每行输出要求每行输出5个素数。运行程序,查

139、看输出结果。个素数。运行程序,查看输出结果。(2) 根据公式根据公式sin(x)=x-x3/3!+x5/5!-x7/7!+来计算来计算x的正弦的正弦值,直到最后一项的绝对值小于值,直到最后一项的绝对值小于10-7时停止。时停止。x的值由键盘输入。的值由键盘输入。程序运行三次,分别输入负数,零和正数,(如:程序运行三次,分别输入负数,零和正数,(如:-1,0,1),查),查看程序的运行结果。可以采用单步执行和查看变量中间结果来调试看程序的运行结果。可以采用单步执行和查看变量中间结果来调试程序。程序。132编程技术(3) 编程:输入两个正整数,用辗转相除法(也称欧几里德编程:输入两个正整数,用辗转相除法(也称欧几里德法)求二者的最大公约数,并求它们的最小公倍数。法)求二者的最大公约数,并求它们的最小公倍数。分别用分别用while语句、语句、do-while语句和语句和for语句来编写上述程序,比语句来编写上述程序,比较三者的异同。较三者的异同。 3写出实验报告写出实验报告 本章本章本章本章 133

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号