




已阅读5页,还剩128页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第3章 算法与程序设计基础,3.1 算法 3.2 算法的常用表示方法 3.3 结构化程序设计方法 3.4 C语句概述 补充:顺序结构程序设计 3.5 选择结构程序设计 3.6 循环程序设计 3.7 综合程序应用举例,目录,实验三,实验四,2,3.1 算法,3.1.1 算法的概念 3.1.2 算法的特性,本章,3,3.1.1 算法的概念 当我们要编写一个程序的时候,我们总要首先想好程序是干什么的?应该如何实现这些目标?(应该先进行什么处理、后进行什么处理?)所处理的数据的格式是什么?遇到一些复杂的问题,我们可能还需要考虑采用什么数学方法。这一切都涉及一个专业名词“算法”。 算法为解决一个实际问题而采取的方法和步骤 很多时候,程序设计者所面临的问题就是寻找一个合适的算法。例如,一个熟练的程序员,要设计一个下“五子棋”的游戏程序,对他而言,C语言的编程规则已经清楚。他所面对的核心问题是寻找一种可以模拟人下棋的算法。因此,算法在软件设计中具有重要的地位。正如著名的计算机科学家沃思(Nikiklaus Wirth)所指出的如下公式:,程序=数据结构+算法,4,【例3.1】求1+2+3+4+100=? 算法1 步骤1:1+2=3 步骤2:3+3=6 步骤3:6+4=10 步骤99:4950+100=5050 算法2 步骤1:0+100=100 步骤2:1+99=100 步骤3:2+98=100 步骤50:49+51=100 步骤51:100*50=5000 步骤52:5000+50=5050 算法3 步骤1:k=1,s=0 步骤2:如果k100,则算法结束,s即为所求的和,输出s;否则转向步骤3 步骤3:s=s+k,k=k+1 步骤4:转向步骤2,本节,5,3.1.2 算法的特性 一个方法要成为我们可以在程序设计中所使用的算法,需要具备如下特征: 1.有穷性 一个算法要在有限的步骤内解决问题(这里所说的步骤是指计算机执行步骤)。计算机程序不能无限地运行下去(甚至不能长时间地运行下去),所以一个无限执行的方法不能成为程序设计中的“算法”。 例如,求某一自然数N的阶乘:n!=1*2*3*n 这是一个算法。因为对任何一个自然数而言,无论这个数多大,总是有限的。用这个公式计算n!总是需要有限的步骤。 但是,以下计算公式则不能作为算法,因为其计算步骤是无限的:sum=1+1/1+1/2+1/3+1/n+,6,2.确定性 算法中操作步骤的顺序和每一个步骤的内容都应当是确定的,不应当是含糊不清的。它也不能有不同的解释存在,即不能具有“二义性”,不应当产生两种或多种以上的含义。 3.可行性 每一个算法是可行的,即算法中的每一个步骤都可以有效地执行,并得到确定的结果。 (例如:b=0,执行a/b) 4.有零个或多个输入 输入就是从外界取得必要的信息。一个算法可以有零个或多个输入,例如:输入一个年份,判断其是否是闰年。同时一个算法可以没有输入,例如:计算出5!是多少。 5.有一个或多个输出 算法的目的就求解,“解”就是我们想要得到的最终结果。输出是同输入有着某些特定关系的量。一个算法得到的最终结果就是输出。没有输出的算法是没有意义的。,本节,7,3.2 算法的常用表示方法,3.2.1 自然语言表示法 3.2.2 流程图 3.2.3 N-S结构流程图 3.2.4 伪代码表示法 3.2.5 用计算机语言表示算法,本章,8,3.2.1 自然语言表示法 自然语言是指人们在日常生活中使用的语言,如汉语、英语等。 比如对于以下这句话:如果A大于B,就给它加1。在理解时就可能出现歧义,是给A加1?还是给B加1。 对于以上的一段话,如果我们用C语言进行编程则为: if(AB) A=A+1; 对于某些程序员来说,自然语言通俗易懂。 缺点是:很冗长,不直观,而且容易发生歧义。 【例3.2】求m! 如果m=6,即求123456。我们先设s代表累乘之积,以t代表乘数,自然语言表示m!的算法为: 使s=1,t=1。 使st,得到的积仍放在s中。 使t的值加1。 如果tm,返回第步重新执行。如果tm,则不再返回,而停止循环,此时s中的值就是m!,输出s。,本节,9,3.2.2 流程图 流程图表示法就是用各种图框表示各种操作。这种表示法的优点是直观易于理解。流程图表示法是美国国家标准化协会ANSI(Amreican National Standard Institute)规定的。一些常用的流程图符号在Word中都可以通过“绘图”命令来绘制。 结构化程序设计中采用三种基本结构, 即顺序结构、选择结构和循环结构,这三种 基本结构有以下共同特点: 只有一个入口; 只有一个出口; 结构内的每一部分都有机会被执行到; 结构内不存在“死循环”(无终止的循环)。,10,顺序结构 A和B两个框是顺序执行的。 选择结构 选择结构或称分支结构,条件结构。此结构中必包含一个判断框,根据给定的条件P是否成立来进行选择。若P成立,则执行A框中的操作,否则,执行B框中的操作。 循环结构 循环结构又称重复结构,有两种:当型循环、直到型循环。,11,用流程图表示例3.2:,本节,12,3.2.3 N-S结构流程图 1973年美国学者I.Nassi 和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法都是在一个矩形框内,在该框内还包含其它的从属于它的框。或者说由一些基本的框组成一个大框。这种方法就以这两位学者的名字缩写而成,被称为“N-S图”。 N-S图可以表示的三种典型结构:,13,用N-S结构流程图表示例3.2:,本节,14,3.2.4 伪代码表示法 伪代码是用介于自然语言和计算机语言之间的文字和符号来表示算法,即计算机程序设计语言中具有的语句关键字用英文表示,其他的可用汉字,也可用英文,只要便于书写和阅读就可。用伪代码表示算法并无固定的、严格的语法规则,只要求把意思表达清楚,并且书写的格式清晰易懂即可。 【例3.3】求m! ,用伪代码表示的算法如下: 开始 从键盘输入一个正整数给m 置s的初值为1 置t的初值为1 当t=m,执行下面操作: 使s=st 使t=t+1 (循环体到此结束) 输出s的值 结束,本节,15,3.2.5 用计算机语言表示算法 用流程图或其他方法表示了算法,还要用计算机实现算法借助计算机语言编写程序,被计算机执行。用计算机解决一个问题,包括设计算法和实现算法两个部分。 计算机语言描述算法必须严格遵循所用语言的语法规则。 【例3.4】将求m!的算法用C语言表示。 #include void main() int t,s,m; printf(“n Please input a integer to m:“); scanf(“%d“, ,本节,16,3.3 结构化程序设计方法,要解决实际问题,编写程序的步骤是: 从目前的编程实践看,结构化程序设计的思路已经被绝大多数程序员所接受。人们普遍认为,必须采用结构化的程序设计方法。因为结构化程序具有结构清晰、便于阅读、便于修改和便于维护的优点。 结构化程序设计的基本思路是:把一个复杂的问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解的范围之内。,17,保证结构化程序采取的方法: 自顶向下 逐步细化(求精) 模块化设计 结构化编码 模块化:将一个大任务分成若干个较小的任务,较小的任务又细分为更小的任务,直到只能解决功能单一的任务为止模块(由函数来实现)。例如,工资管理系统,18,【例3.5】输入10个整数(每个数都3),打印出其中的素数。,19,本章,20,3.4 C语句概述,一个C语言程序的执行部分由语句组成。程序的各种功能(如输入、输出、计算、打印等)也由语句实现的。C语言的语句可分为声明语句、函数调用语句、表达式语句、 复合语句、控制语句以及不执行任何操作的空语句。 声明语句 说明语句用来定义变量的数据类型。如:int s,i; 函数调用语句 函数调用语句由函数名、实际参数加上分号组成。其一般形式为: 函数名(实际参数表); 执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,可以返回也可以不返回函数值。它相当于其他语言中的调用子程序。 例:printf(“ns=%d“,s);,21,表达式语句 表达式语句由表达式加上分号(;)组成。其一般形式为: 表达式; 如:a=b+c; y+; x*y; 执行表达式语句就是计算表达式的值。 注意:赋值语句和赋值表达式的区别。 空语句 空语句就是什么也没有的语句,也就是只有分号的语句。空语句不执行任何操作,但仍然有一定的用途。比如,预留位置或用来作空循环体。例:while(getchar()!=n) ; 这段程序的作用是:等待键盘输入,若输入非则继续等待重新输入,只有输入才结束。循环体只有一个空语句。如果没有这一个空语句,则会出现错误。,22,复合语句 把多个语句用大括号“”括起来组成的一个语句称复合语句。C语言的编译系统把复合语句作为是单条语句对待。例: b=c+d; a=e-f; printf(“%d%d“,b,a); 复合语句中的各条语句都以分号“;”结尾。注意,在大括号“”之后不要加分号。 控制语句 控制语句用于控制程序的流程,以实现程序的顺序、分支、循环等各种结构方式。 控制语句分为三类共九种: 1.条件判断语句:if、switch语句 2.循环执行语句:dowhile、while和for语句 3.转向语句:break、goto、continue和return语句,本章,23,补充:顺序结构程序设计,顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。 顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算、输出三部曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s=3.14159*r*r,输出圆的面积s。 不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如选择结构中的复合语句、循环结构中的循环体等。,24,【实验】以下的程序用于计算一个矩形的周长和面积。程序运行时提示输入长和宽的值,然后计算并输出该矩形的周长和面积。请将程序补充完整。 #include void main() float length; float width; float perimeter; /* 周长 */ float area; /* 面积 */ ,25,【补充例1】从键盘输入一个大写字母,要求改用小写字母输出。 #include void main() char c1,c2; c1=getchar(); printf(“%c,%dn“,c1,c1); c2=c1+32; printf(“%c,%dn“,c2,c2); 运行情况:,A A,65 a,97,26,【补充例2】输入三角形的三边长,求三角形面积。,假设:三边长a,b,c能构成三角形。 已知面积公式: 其中:s=(a+b+c)/2,27,#include #include void main() float a,b,c,s,area; scanf(“%f,%f,%f“, ,本章,运行情况:,28,3.5 选择结构程序设计,3.5.1 关系运算符和关系表达式 3.5.2 逻辑运算符和逻辑表达式 3.5.3 if语句 3.5.4 if语句的嵌套 3.5.5 条件运算符和条件表达式 3.5.6 switch语句 3.5.7 选择结构程序设计举例,本章,29,3.5.1 关系运算符和关系表达式 C语言提供6种关系运算符: 大于 = 大于或等于 = 等于 != 不等于 用关系运算符将两个表达式连接起来的式子,称关系表达式。如:ab,a+bb+c,(a=3)(b=5), ab)(bb 值为1 (ab)= =c 值为1 d=ab d的值为1 f=abc f的值为0,本节,优先级相同(高),优先级相同(低),30,3.5.2 逻辑运算符和逻辑表达式 C语言提供3种逻辑运算符: ! 逻辑非 & 逻辑与 | 逻辑或,逻辑运算的真值表,31,算术运算符、关系运算符、逻 辑运算符和赋值运算符的优先级: 如: (ab)&(xy) ab&xy (a= =b)|(x= =y) a= =b|x= =y (!a)|(ab) !a|ab 用逻辑运算符将关系表达式或逻辑量连接起来的式子称为逻辑表达式。逻辑表达式的值是一个逻辑“真”或“假”。C语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以数值0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。 例: 若a=4,则!a的值为0。 若a=4,b=5,则a&b的值为1,a|b的值为1,!a|b的值为1。 例:将数学关系式:0x100, 表达成逻辑式:x=0 & x=100 逻辑运算符两侧的运算对象还可以是任何类型的数据。 如: c & d,32,在逻辑表达式的求解中,并不是所有的逻辑运算符都执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。 如: a 逻辑表达式(m=ab)&(n=cd)使m=0,而n=1,33,例:要判断某一年是否是闰年。闰年的条件是符合下面二者之一:能被4整除,但不能被100整除;或能被400整除。 C语言的表达式: (year%4=0 & year%100!=0) | year%400=0,本节,34,3.5.3 if语句 选择结构往往依赖于所给出的条件,决定从给出的操作中选择一组去执行。 格式1:if (表达式)语句; 功能:如果表达式的值为真,做语句的内容;否则什么都不做。,任何类型,35,【例3.7】输入一个字符c,若c是字母,则输出“Yes!”。 #include void main() char c; c=getchar(); if(c=a 运行情况:,x Yes!,思考题:完善【补充例1 】。,36,例: #include void main() int s; printf(“nInput your score:“); /*输入提示信息*/ scanf(“%d“, /*如果s=60,输出pass!*/ 运行结果:,Input your score : 70 your score=70,pass!,37,【补充例3】已知两个变量x和y,比较它们的大小,使得x中的值大于y。 #include void main() int x,y,t; printf(“x=“); scanf(“%d“, ,x,y,两个数交换过程,思考题:从键盘输入3个整数a、b和c,编写程序将它们按从大到小排序。,38,【补充例】从键盘输入3个整数a、b和c,编写程序将它们按从大到小排序。 #include void main() int a,b,c,temp; printf(“Please input three numbers:“); scanf(“%d,%d,%d“, ,39,格式2:if (表达式) 语句1; else 语句2; 其意义为:若表达式的值为真,则执行“语句1”,否则执行“语句2”。若“语句1”或“语句2”为一条语句时,则可以去掉相应的。 例:if (h1.1) price=0; else price=50; 或:if (h1.1) price=0; else price=50;,任何类型,40,【例3.9】输入两个数并判断两数是否相等。 #include void main() int a,b; printf(“Enter integer a:“); scanf(“%d“, ,Enter integer a: 5 Enter integer b:7 a!=b,Enter integer a:10 Enter integer b:10 a=b,运行结果:,41,【补充例4】判断一个年份是否是闰年,并把结果输出。 #include void main() int year; printf(“请输入一个年份:“); scanf(“%d“, ,思考题:判断一个整数是奇数还是偶数,并把结果显示出来。,42,【补充例】判断一个数是奇数还是偶数,并把结果显示出来。 #include void main() int x; printf(“nPlease input a integer to x:“); scanf(“%d“, ,43,【补充例5】从键盘输入3个整数a、b和c,编写程序找出其中的最大数,输出结果。 #include void main() int a,b,c,max; printf(“Please input three numbers:“); scanf(“%d%d%d“, ,44,【例3.10】输入一个整数,若该数不为零,则输出。 #include void main() int x; scanf(“%d“, 运行结果:,-5 x=-5,45,if语句中应注意的问题 分支语句的复杂性关键在于表达式,表达式通常是逻辑表达式或关系表达式,但是也可以是其它表达式,甚至也可以是一个变量。例如: if (a=8); if (x); 只要表达式的值为非0,即为“真”,就执行其后的语句 在if语句中的表达式必须用括号括起来 如果要想在if语句中满足条件时执行一组(多个)语句,则必须把这一组语句用括起来组成一个复合语句。注意复合语句的之后不能加分号,本节,46,3.5.4 if语句的嵌套 前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,其一般形式如下: if(表达式1) if(表达式2) 语句1; else 语句2; else if(表达式3) 语句3; else 语句4;,47,【例3.11】编写程序,求下列分段函数的值。 -1 (x0) #include #include void main() float x; double z; printf(“nx=“); scanf(“%f“, ,if语句嵌套包含在else的后面,48,改写【例3.11】 ,将if语句的嵌套包含在if的后面。 #include #include void main() float x; double z; printf(“nx=“); scanf(“%f“, ,if语句嵌套包含在if的后面,49,if (表达式1) if (表达式2) 语句1; else if(表达式3)语句2; else 语句3; 上面的语句中的第1个else是与第2个if配对的,如果要改变这种默认的配对关系,可以在相应if条件选择语句上加上左、右花括号来确定新的配对关系。 如:if (表达式1) if (表达式2) 语句1; else if(表达式3)语句2; else 语句3;,else总是与它上面最近的且又没有配对的if语句进行配对,50,【例3.12】 写出下面程序的运行结果。 #include void main() int a,b,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); ,本节,51,3.5.5 条件运算符和条件表达式 条件表达式的一般形式为: 表达式1?表达式2:表达式3 表达式的执行顺序:计算表达式1的值,若为真,则计算表达式2的值,作为条件表达式的结果;否则计算表达式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 ? a:b,本节,52,3.5.6 switch语句 判断语句可以实现两个分支的程序流程。但编程中往往要求实现多个分支的程序流程,这就要使用多分支语句。 其一般形式为: switch (表达式) case 常量表达式1: 语句1; case 常量表达式2: 语句2; . . case 常量表达式n: 语句n; default: 语句n+1; ,整型、字符型、枚举型,53,执行过程是: 1.首先计算表达式的值,然后把表达式的值与其后的常量表达式值逐个相比较。 2.当表达式的值与某个常量表达式的值相等时,即执行该case后的语句。 3.如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。 4.若没有default语句,则退出此开关语句。 注意: 程序在执行完毕相应的case语句后不能退出,而是继续执行其后的其它语句。 格式中的表达式的作用为控制程序的流程。它的数值类型必须与case语句中常量表达式的类型一致。 所有常量表达式的类型必须相同,而它们的值必须不同。,54,若要执行完一个case的语句后,转到switch后的语句去执行,则要在该case语句的最后加上break语句(跳转语句),跳转到switch后的语句去执行。,switch语句与break语句连用图解,55,【例3.14】编写一个程序,要求输入学生的分数,输出其成绩的分数段,用A、B、C、D、E分别表示90分以上、8089分、7079分、6069分和不及格(059分)5个分数段。 #include void main() int score,grade; printf(“nInput a score(0100):“); scanf(“%d“,56,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(“grade=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!,57,【例3.15】从键盘输入一个日期,判断这一天是这一年中的第几天? #include void main() int day, month, year,sum, leap; printf(“n Please input year,month,dayn“); scanf(“%d,%d,%d“,58,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(year%400=0|(year%4=0 ,本节,运行结果如下: Please input year,month,day 2008,7,19 It is the 201th day.,59,3.5.7 选择结构程序设计举例 【例3.16】求一元二次方程ax2+bx+c=0的实数解,并显示结果,假设a0。 #include #include void main() float a,b,c,d; scanf(“%f%f%f“, ,60,【例3.17】 输入两个正整数a、b。其中a不大于31 , b最大不超过三位数。使a在左,b在右,拼成一个新的数c。例如a=23,b=30,则c为2330。若a=1,b=15,则c为115。 算法分析:抽象分析出以下数学模型,决定c值的计算公式如下: 当b为一位数时,c=a*10+b 当b为二位数时,c=a*100+b 当b为三位数时,c=a*1000+b 求c的公式:c=a*k+b。 (k的取值可以为:10,100或1000),61,#include void main() int a,b,c,k; printf(“nInput two positive integer number:“); scanf(“%d,%d“, ,62,【例3.18】个体工商户的生产经营所得,以每一纳税年度的收入总额,减除成本、费用以及损失后的余额,为全年应纳税所得额。其所得税税率表如下: 级数 全年应纳税所得额 税率(%) 1 不超过5000元的 5 2 超过5000元至10000元的部分 10 3 超过10000元至30000元的部分 20 4 超过30000元至50000元的部分 30 5 超过50000元的部分 35 #include void main() long int r; int s; double f; printf(“Input a integer to r:“); scanf(“%ld“,63,if (r0) s=(r-1)/5000; switch(s) 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“,f); else printf(“Input a data error!“); ,64,【例3.19 】 编程,输入两个实数a、b,再输入一个运算符(可以是+、-、*或/)。根据运算符计算并输出a、b两个数的和、差、积和商。 #include void main() float a,b; char c; scanf(“%f%f“, ,65,【例3.20 】给一个不多于5位的正整数,编程求:它是几位数,逆序打印出各位数字,若为两位以上的数,则判断该数是否为回文数。 #include void main() int a,b,c,d,e; long x; do printf(“n Please input a positive integer number to x:“); scanf(“%ld“, /*分解出个位数*/,66,if(a0) printf(“there are 5,%d %d %d %d %dn“,e,d,c,b,a); if(e=a ,67,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 are 1,%dn“,e); ,本节,68,3.6 循环程序设计,循环结构就是当给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。 在C语言中提供了四种实现循环结构的方法: (1)用 if 语句和 goto 语句构成的循环 (2)用 while 语句 (3)用 do -while 语句 (4)用 for 语句,69,3.6.1 goto语句以及用goto语句构成的循环 3.6.2 while语句 3.6.3 dowhile语句 3.6.4 for语句 3.6.5 多重循环 3.6.6 break语句 3.6.7 continue语句 3.6.8 循环程序设计举例,本章,70,3.6.1 goto语句以及用goto语句构成的循环 在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱。能避免使用goto则应避免使用,确实不得不用时,才使用goto。 goto语句称为无条件转向语句,其一般格式如下: goto 语句标号; goto语句的语义是改变程序流向,立即跳转到标号所标识的语句。 语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,并不影响该语句的执行,标号只起与goto句配合的作用。 C语言不限制程序中使用标号的次数,但各标号不得重名。 一般情况下,使用goto语句有两种情况: 与if语句一起构成循环结构; 从循环体中跳转到循环体外。,71,使用goto语句时应该注意以下几点: 跳转到一个循环内是非常危险的,应该极力避免这样做; 不能跳转到本函数外; goto语句越少用越好; 通常不主张向程序的前面跳转; 【例3.21】 用if语句和goto语句构成循环,求i。 #include void main() int i=1; /*存放自然数*/ int sum=0; /*存放和*/ loop: if (i=100) sum+=i; i+; goto loop; printf(“n1+2+3+100=%d“,sum); 运行结果:,1+2+3+100=5050,本节,72,3.6.2 while语句 while语句(当循环语句),其形式如下所示: while (表达式) 循环体语句; 或 while (表达式) 循环体语句; 其中表达式是循环条件。 while语句的执行过程: 计算表达式的值 若表达式的值为真(非0)时,则转到第步 若表达式的值为假(0),转到第步 执行循环体语句 转到第步执行 结束循环,执行while语句后的第一条语句,73,【例3.22】用while语句来实现求i。 #include void main() int i=1; int sum=0; while (i=100) sum+=i; i+; printf(“n1+2+3+100=%d“,sum); 说明: while语句一般用于事先不知道循环次数,在循环执行的过程中,根据条件来决定循环是否结束。 在循环体语句中可以是一条简单的语句,也可以是复合语句,若为复合语句则要用花括号括起来。 在循环体语句中,一定要有改变循环条件的语句,使循环能终止。,本节,74,3.6.3 dowhile语句 do while语句(直到型循环),其一般形式为: do 循环体语句; while (表达式); 其中表达式是循环条件。 do-while语句的执行过程是: 执行循环体语句, 判别表达式的值, 若表达式的值为真(非0),则转到第步 若表达式的值为假(0),则转到第步 结束循环,执行do while语句后的第一条语句。,75,【例3.23】 用do while语句来实现求i。 #include void main() int i=1; int sum=0; do sum+=i; i+; while(i=100); printf(“n1+2+3+100=%d“,sum); ,76,说明: dowhile语句一般用于事先不知道循环次数,在循环执行的过程中,根据条件来决定循环是否结束。 在循环体语句中可以是一条简单的语句,也可以是复合语句,若为复合语句则要用花括号括起来。 在循环体语句中,一定要有改变循环条件的语句,使循环能终止。 while(表达式)的后面一定要加分号,表示dowhile语句的结束。 do-while语句和while语句的区别在于: do while是先执行后判断,即do while至少执行一次循环体。 while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。while语句和do-while语句一般都可以相互改写。,77,【例3.24】while循环和do while循环的比较。 #include #include void main() void main() int m,n=1; int m,n=1; scanf(“%d“, ,程序运行结果: 5 n=46, m=11 再运行一次的结果: 11 n=12,m=12,程序运行结果: 5 n=46, m=11 再运行一次的结果: 11 n=1,m=11,本节,78,3.6.4 for语句 for语句也是一种循环语句,其功能是把某些语句重复执行若干次,不仅可以用于循环次数确定,而且也可以用于循环次数不确定的循环。其一般形式为: for(表达式1;表达式2;表达式3) 循环体语句 for语句的执行过程: 计算表达式1的值; 计算表达式2的值 若表达式2的值为真(非0),则执行循环体, 然后转到第 步; 若表达式2的值为假(0),则转到第步; 计算表达式3的值,转回第步重复执行; 循环结束,执行for语句后面的第一条语句。 在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。循环体可能多次执行,也可能一次都不执行。,79,【例3.25】求1000以内的奇数和。 #include void main() int i; long int sum=0; for (i=1;i1000;i+=2) sum+=i; printf(“n sum=%ldn“,sum); ,80,说明: for语句可用如下易理解的形式来描述: for(循环变量初值;循环条件;循环变量增值)循环体语句 也即表达式1相当于给循环变量赋初值,表达式2是一个条件表达式,表达式3是改变循环变量的值。 for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。表达式1省略,其后的分号不能省略。执行时跳过“求解表达式1”这一步,其它不变。 #include void main() int i=1; long int sum=0; for (;i1000;i+=2) sum+=i; printf(“n sum=%ldn“,sum); ,81,“表达式2”也可省略,其后的分号不能省略。此时等于没有循环条件,执行for语句时,就不要判断循环条件,也就认为表达式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); ,82,“表达式3”也可省略,此时应在循环体中有语句可以改变循环变量的值。否则循环也会变成死循环。 #include void main() int i; long int sum=0; for (i=1;i1000;) sum+=i; i+=2; printf(“n sum=%ldn“,sum); ,83,表达式1,表达式2,表达式3可以省略一个或两个,也可同时全部省略。如: for(;)循环体语句 表达式1,2,3可以是任何类型的表达式,包括逗号表达式。可以是与循环变量有关的表达式,也可以是与循环变量无关的表达式。 如:for(sum=0,i=1; i void main() int i; char c; for(i=0;(c=getchar()!=n;i+); /*printf(“%c“,c);*/ printf(“The sum is %dn“,i); 循环体可以是空语句。空语句可以用来实现延时,也就是在程序执行中等待一定的时间。如下为延时程序: for (i=1;i1000,i+);,84,【例3.28】 中国剩余定理:“有物不知几何,三三数余一,五五数余二,七七数余三,问:物有几何?”。编程求1000以内所有解。 编程思路:采用”穷举法”来解此题。 具体做法是:从所有可能解中,逐个进行试验,若满足条件,就得到一个解,否则不是,直到条件满足或判别出无解为止。,#include void main() int m,count=0; for(m=1;m=1000;m+) if (m%3=1 /*每行输出5个数*/ ,运行结果如下: 52 157 262 367 472 577 682 787 892 997,85,【补充例6】输出所有水仙花数,水仙花数是指一个三位数,其各位数字的立方和等于该数本身。例如,153是一个水仙花数,因为153=13+53+33。(穷举法) #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); ,153 370 371 407,本节,86,3.6.5 多重循环 在循环语句中又包含另一个循环语句时,我们称其为循环嵌套。在多重循环中,处于内部的循环称为内循环,处于外部的循环称为外循环。按循环嵌套的层数,可分别称二重循环、三重循环等等。 语言规定,内循环必须完全嵌套于外循环中,内、外循环不能交叉,并且内、外循环的循环控制变量不能同名。 在C语言中,凡是可以出现语句的地方,都可以出现循环语句。 【例3.29】打印如图下图所示的“九-九”乘法表。,87,算法分析: 外循环是输出行(用i作为循环控制变量i=19) 内循环是输出列(用j作为循环控制变量j=19) #include void main() int i,j; for(i=1;i=9;i+) /* 外循环,控制行 */ for(j=1;j=9;j+) /* 内循环,控制列 */ printf(“%d*%d=%dt“,i,j,i*j); printf(“n“); ,88,#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),如何输出?,89,【补充例】输出所有水仙花数。(多重循环、穷举法) 算法分析:设这三位数的百位数为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) printf(“%dn”,100*x+10*y+z); ,153 370 371 407,90,【例3.30】 有1、2、3、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 ,本节,91,3.6.6 break语句 break语句只用在switch语句或循环语句中,其作用是无条件跳出switch语句或跳出本层循环,转去执行后面的程序。 break语句的一般形式为: break; 使用break语句可以使循环语句有多个出口,使程序避免了一些不必要重复,提高了程序效率。 break语句与while循环语句连用格式: while(表达式1) 语句1; if(表达式2) break; 语句2; ,break与while连用,92,【例3.31】求当半径r为何值时,圆的面积大于100? #include void main() int r; float area,pi=3.1415927; for(r=1;r+) area=pi*r*r; if (area100) break; printf(“%fn“,area); printf(“r=%dn“,r); 注意:break语句不能用于switch和循环语句之外的任何其它语句中。,程序运行结果: 3.141593 12.566371 28.274334 50.2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 超声报告书写培训
- 九年级历史上册 第六单元 第17课 英国工业革命教学设计 华东师大版
- 初中校本研修培训
- 2025年全球电力评论报告(英文版)-EMBER
- 人教统编版必修 上册第六单元10(劝学 师说)10.2 师说第二课时教案
- 人教部编版七年级下册登幽州台歌教案设计
- 内蒙古鄂尔多斯市东胜区第一中学九年级化学上册 第四单元 课题2 水的净化教学设计 (新版)新人教版
- 2024中智天津人力资源服务有限公司基础招聘2人笔试参考题库附带答案详解
- 七年级数学上册 第5章 相交线与平行线5.1相交线 3同位角、内错角、同旁内角教学设计 (新版)华东师大版
- 感控管理培训
- 新风系统的施工组织方案
- 义务教育英语课程标准(2022年版) (1)
- 工程项目内部控制流程图表
- 百家姓全文带拼音打印版本
- 强夯试夯报告(共12页)
- 关于电商平台对入驻经营者的审核要求或规范文件
- 骨优导介绍PPT
- 道场迎请亡魂开五方科仪
- 毕业设计(论文)-四自由度工业机械手的设计
- 八下数学19.1.1-第1课时-常量与变量ppt课件
- 用Polyphen2和SIFT进行突变预测
评论
0/150
提交评论