算法与程序设计基础.ppt_第1页
算法与程序设计基础.ppt_第2页
算法与程序设计基础.ppt_第3页
算法与程序设计基础.ppt_第4页
算法与程序设计基础.ppt_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编 程 技 术 第3章 算法与程序设计基础 3.1 3.1 算法算法 3.2 3.2 算法的常用表示方法算法的常用表示方法 3.3 3.3 结构化程序设计方法结构化程序设计方法 3.4 C3.4 C语句概述语句概述 补充:顺序结构程序设计补充:顺序结构程序设计 3.5 3.5 选择结构程序设计选择结构程序设计 3.63.6 循环程序设计循环程序设计 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 算法的概念算法的概念 当我们要编写一个程序的时候,我们总要首先想好程序是 干什么的?应该如何实现这些目标?(应该先进行什么处理、后 进行什么处理?)所处理的数据的格式是什么?遇到一些复杂的 问题,我们可能还需要考虑采用什么数学方法。这一切都涉及一 个专业名词“算法”。 算法为解决一个实际问题而采取的方法和步骤 很多时候,程序设计者所面临的问题就是寻找一个合适的算 法。例如,一个熟练的程序员,要设计一个下“五子棋”的游戏 程序,对他而言,C语言的编程规则已经清楚。他所面对的核心 问题是寻找一种可以模拟人下棋的算法。因此,算法在软件设计 中具有重要的地位。正如著名的计算机科学家沃思(Nikiklaus Wirth)所指出的如下公式: 程序=数据结构+算法 3 编 程 技 术 【例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 本节本节 4 编 程 技 术 3.1.2 3.1.2 算法的特性算法的特性 一个方法要成为我们可以在程序设计中所使用的算法,需要 具备如下特征: 1.有穷性 一个算法要在有限的步骤内解决问题(这里所说的步骤是指 计算机执行步骤)。计算机程序不能无限地运行下去(甚至不能 长时间地运行下去),所以一个无限执行的方法不能成为程序设 计中的“算法”。 例如,求某一自然数N的阶乘:n!=1*2*3*n 这是一个算法。因为对任何一个自然数而言,无论这个数多 大,总是有限的。用这个公式计算n!总是需要有限的步骤。 但是,以下计算公式则不能作为算法,因为其计算步骤是无 限的:sum=1+1/1+1/2+1/3+1/n+ 5 编 程 技 术 2.确定性 算法中操作步骤的顺序和每一个步骤的内容都应当是确定的 ,不应当是含糊不清的。它也不能有不同的解释存在,即不能具 有“二义性”,不应当产生两种或多种以上的含义。 3.可行性 每一个算法是可行的,即算法中的每一个步骤都可以有效地 执行,并得到确定的结果。 (例如:b=0,执行a/b) 4.有零个或多个输入 输入就是从外界取得必要的信息。一个算法可以有零个或多 个输入,例如:输入一个年份,判断其是否是闰年。同时一个算 法可以没有输入,例如:计算出5!是多少。 5.有一个或多个输出 算法的目的就求解,“解”就是我们想要得到的最终结果。输 出是同输入有着某些特定关系的量。一个算法得到的最终结果就 是输出。没有输出的算法是没有意义的。 本节本节 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 自然语言表示法自然语言表示法 自然语言是指人们在日常生活中使用的语言,如汉语、英语 等。 比如对于以下这句话:如果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。 本节本节 8 编 程 技 术 3.2.2 3.2.2 流程图流程图 流程图表示法就是用各种图框表示各种操作。这种表示法 的优点是直观易于理解。流程图表示法是美国国家标准化协会 ANSI(Amreican National Standard Institute)规定的。一些常 用的流程图符号在Word中都可以通过“绘图”命令来绘制。 结构化程序设计中采用三种基本结构, 即顺序结构、选择结构和循环结构,这三种 基本结构有以下共同特点: 只有一个入口; 只有一个出口; 结构内的每一部分都有机会被执行到; 结构内不存在“死循环”(无终止的循环)。 9 编 程 技 术 顺序结构 A和B两个框是顺序执行的。 选择结构 选择结构或称分支结构,条件结构。此结构中必包含一个判 断框,根据给定的条件P是否成立来进行选择。若P成立,则执 行A框中的操作,否则,执行B框中的操作。 循环结构 循环结构又称重复结构,有两种:当型循环、直到型循环。 10 编 程 技 术 用流程图表示例3.2: 本节本节 11 编 程 技 术 3.2.3 N-S3.2.3 N-S结构流程图结构流程图 1973年美国学者I.Nassi 和B.Shneiderman提出了一种新的流 程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部 算法都是在一个矩形框内,在该框内还包含其它的从属于它的框 。或者说由一些基本的框组成一个大框。这种方法就以这两位学 者的名字缩写而成,被称为“N-S图”。 N-S图可以表示的三种典型结构: A B 顺序结构选择结构 当型循环直到型循环 A 当P成立 A 当P成立 12 编 程 技 术 用N-S结结构流程图图表示例3.2: 输入m s=1 t=1 当tm成立 s=st t=t+1 输出s 结束 开始 本节本节 13 编 程 技 术 3.2.4 3.2.4 伪代码表示法伪代码表示法 伪代码是用介于自然语言和计算机语言之间的文字和符号来 表示算法,即计算机程序设计语言中具有的语句关键字用英文表 示,其他的可用汉字,也可用英文,只要便于书写和阅读就可。 用伪代码表示算法并无固定的、严格的语法规则,只要求把意思 表达清楚,并且书写的格式清晰易懂即可。 【例3.3】求m! ,用伪代码表示的算法如下: 开始 从键盘输入一个正整数给m 置s的初值为1 置t的初值为1 当t void main() int t,s,m; printf(“n Please input a integer to m:“); scanf(“%d“, s=1; t=1; do s=s*t; t=t+1; while (t则继续 等待重新输入,只有输入才结束。循环体只有一个空语句 。如果没有这一个空语句,则会出现错误。 21 编 程 技 术 复合语句复合语句 把多个语句用大括号“”括起来组成的一个语句称复合语 句。C语言的编译系统把复合语句作为是单条语句对待。例: b=c+d; a=e-f; printf(“%d%d“,b,a); 复合语句中的各条语句都以分号“;”结尾。注意,在大括 号“”之后不要加分号。 控制语句控制语句 控制语句用于控制程序的流程,以实现程序的顺序、分支、 循环等各种结构方式。 控制语句分为三类共九种: 1.条件判断语句:if、switch语句 2.循环执行语句:dowhile、while和for语句 3.转向语句:break、goto、continue和return语句 本章本章 22 编 程 技 术 补充:顺序结构程序设计 顺序结构的程序设计是最简单的,只要按照解决 问题的顺序写出相应的语句就行,它的执行顺序是自 上而下,依次执行。 顺序结构可以独立使用构成一个简单的完整程序 ,常见的输入、计算、输出三部曲的程序就是顺序结 构,例如计算圆的面积,其程序的语句顺序就是输入 圆的半径r,计算s=3.14159*r*r,输出圆的面积s。 不过大多数情况下顺序结构都是作为程序的一部 分,与其它结构一起构成一个复杂的程序,例如选择 结构中的复合语句、循环结构中的循环体等。 23 编 程 技 术 【实验】以下的程序用于计算一个矩形的周长 和面积。程序运行时提示输入长和宽的值,然 后计算并输出该矩形的周长和面积。请将程序 补充完整。 #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,65 a,97 25 编 程 技 术 【补充例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“, 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); printf(“area=%7.2fn“,area); 3,4,6 a= 3.00,b= 4.00,c= 6.00,s= 6.50 area= 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 switchswitch语句语句 3.5.7 3.5.7 选择结构程序设计举例选择结构程序设计举例 本章本章 28 编 程 技 术 3.3.5.1 5.1 关系运算符和关系表达式关系运算符和关系表达式 C语言提供6种关系运算符: 大于 = 大于或等于 = 等于 != 不等于 用关系运算符将两个表达式连接起来的式子,称关系表 达式。如:ab,a+bb+c,(a=3)(b=5), ab)(bb值为1 (ab)= =c值为1 d=abd的值为1 f=abcf的值为0 本节本节 优先级相同(高) 优先级相同(低) 29 编 程 技 术 3.3.5.2 5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 C语言提供3种逻辑运算符: ! 逻辑非 功能:如果表达式的值为真,做语句的内容;否 则什么都不做。 任何类型 34 编 程 技 术 【例3.7】输入一个字符c,若c是字母,则输出 “Yes!”。 #include void main() char c; c=getchar(); if(c=a printf(“nInput your score:“); /*输入提示信息*/ scanf(“%d“, printf(“nyour score=%d“,s); if (s=60) printf(“,pass!“); /*如果s=60,输出 pass!*/ 运行结果: Input your score : 70 your score=70,pass! 36 编 程 技 术 【补充例3】已知两个变量x和y,比较它们的大小, 使得x中的值大于y。 #include void main() int x,y,t; printf(“x=“); scanf(“%d“, printf(“y=“); scanf(“%d“, if (x void main() int a,b,c,temp; printf(“Please input three numbers:“); scanf(“%d,%d,%d“, if (ac,则交换b,c的值,此时保证c的值为最小*/ temp=b; c=b; b=temp; printf(“Three numbers after sorted: %d,%d,%dn“,a,b,c); 38 编 程 技 术 格式2:if (表达式) 语句1; else 语句2; 其意义为:若表达式的值为真,则执行“语句 1”,否则执行“语句2”。若“语句1”或“语句2” 为一条语句时,则可以去掉相应的。 例:if (h void main() int a,b; printf(“Enter integer a:“); scanf(“%d“, printf(“Enter integer b:“); scanf(“%d“, if(a=b) printf(“a=bn“); else printf(“a!=bn“); Enter integer a: 5 Enter integer b:7 a!=b Enter integer a:10 Enter integer b:10 a=b 运行结果: 40 编 程 技 术 【补充例4】判断一个年份是否是闰年,并把结果输出 。 #include void main() int year; printf(“请输入一个年份:“); scanf(“%d“, if (year%4=0 else printf(“n%d 不是闰年!n“,year); 思考题:判断一个整数是奇数还是偶数,并把结果显示出来 。 41 编 程 技 术 【补充例】判断一个数是奇数还是偶数,并把结果显 示出来。 #include void main() int x; printf(“nPlease input a integer to x:“); scanf(“%d“, if (x%2=0) /*x是偶数 if (x/2)*2=x )*/ printf(“n%d is a even number!“,x); else printf(“n %d is a odd number!“,x); 42 编 程 技 术 【补充例5】从键盘输入3个整数a、b和c,编写程序 找出其中的最大数,输出结果。 #include void main() int a,b,c,max; printf(“Please input three numbers:“); scanf(“%d%d%d“, if(a=b) max=a; else max=b; if(max void main() int x; scanf(“%d“, if(x) /*等价于 x!=0*/ printf(“n x=%d“,x); 运行结果: -5 x=-5 44 编 程 技 术 ifif语句中应注意的问题语句中应注意的问题 分支语句的复杂性关键在于表达式,表达式 通常是逻辑表达式或关系表达式,但是也可以是其它 表达式,甚至也可以是一个变量。例如: if (a=8); if (x); 只要表达式的值为非0,即为“真”,就执行 其后的语句 在if语句中的表达式必须用括号括起来 如果要想在if语句中满足条件时执行一组(多 个)语句,则必须把这一组语句用括起来组成一个复 合语句。注意复合语句的之后不能加分号 本节本节 45 编 程 技 术 3.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.11】编写程序,求下列分段函数的值。 -1 (x0) #include #include void main() float x; double z; printf(“nx=“); scanf(“%f“, if (x0) z=log(x); else z=0; printf(“z=%5.2fn“,z); 输入x z=-1 z=log(x)z=0 真 真假 假 x0 if语句嵌套包含 在else的后面 47 编 程 技 术 改写【例3.11】 ,将if语句的嵌套包含在if的后面。 #include #include void main() float x; double z; printf(“nx=“); scanf(“%f“, if (x 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); 本节本节 50 编 程 技 术 3.5.5 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 本节本节 51 编 程 技 术 3.5.6 switch3.5.6 switch语句语句 判断语句可以实现两个分支的程序流程。但编程 中往往要求实现多个分支的程序流程,这就要使用多 分支语句。 其一般形式为: switch (表达式) case 常量表达式1: 语句1; case 常量表达式2: 语句2; . . case 常量表达式n: 语句n; default: 语句n+1; 整型、字符型、枚举型 52 编 程 技 术 执行过程是: 1.首先计算表达式的值,然后把表达式的值与其后的常量表 达式值逐个相比较。 2.当表达式的值与某个常量表达式的值相等时,即执行该 case后的语句。 3.如表达式的值与所有case后的常量表达式均不相同时,则 执行default后的语句。 4.若没有default语句,则退出此开关语句。 注意: 程序在执行完毕相应的case语句后不能退出,而是继续执行 其后的其它语句。 格式中的表达式的作用为控制程序的流程。它的数值类型必 须与case语句中常量表达式的类型一致。 所有常量表达式的类型必须相同,而它们的值必须不同。 53 编 程 技 术 若要执行完一个case的语句后,转到switch后的语句去执行 ,则要在该case语句的最后加上break语句(跳转语句),跳转 到switch后的语句去执行。 switch语句与break语句连用图解 54 编 程 技 术 【例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“, 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(“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! 56 编 程 技 术 【例3.15】从键盘输入一个日期,判断这一天是这一 年中的第几天? #include void main() int day, month, year,sum, leap; printf(“n Please input year,month,dayn“); scanf(“%d,%d,%d“, 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=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(year%400=0|(year%4=0 else leap=0; if(leap=1 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.16】求一元二次方程ax2+bx+c=0的实数解, 并显示结果,假设a0。 #include #include void main() float a,b,c,d; scanf(“%f%f%f“, 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); else printf(“n The equation has no real root!“); 59 编 程 技 术 【例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) 60 编 程 技 术 #include void main() int a,b,c,k; printf(“nInput two positive integer number:“); scanf(“%d,%d“, if (a31|b999) printf(“Input data error!“); else if (b void main() long int r; int s; double f; printf(“Input a integer to r:“); scanf(“%ld“, 62 编 程 技 术 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!“); 63 编 程 技 术 【例3.19 】 编程,输入两个实数a、b,再输入一个运 算符(可以是+、-、*或/)。根据运算符计算并输出a 、b两个数的和、差、积和商。 #include void main() float a,b; char c; scanf(“%f%f“, c=getchar(); switch(c) 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; case /: printf(“%f/%f=%fn“,a,b,a/b);break; default: printf(“cant compute! “); 64 编 程 技 术 【例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“, while(x=100000) /* 确保输入的x是一个不高于5位的正整数 */ a=x/10000; /*分解出万位数*/ b=x%10000/1000; /*分解出千位数*/ c=x%1000/100; /*分解出百位数*/ d=x%100/10; /*分解出十位数*/ e=x%10; /*分解出个位数*/ 65 编 程 技 术 if(a0) printf(“there are 5,%d %d %d %d %dn“,e,d,c,b,a); if(e=a 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 else printf(“this number is not a huiwenn“); 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 are 1,%dn“,e); 本节本节 67 编 程 技 术 3.6 循环程序设计 循环结构就是当给定条件成立时,反复执行 某程序段,直到条件不成立为止。给定的条件称 为循环条件,反复执行的程序段称为循环体。 在C语言中提供了四种实现循环结构的方法: (1)用 if 语句和 goto 语句构成的循环 (2)用 while 语句 (3)用 do -while 语句 (4)用 for 语句 68 编 程 技 术 3.6.1 3.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 gotogoto语句以及用语句以及用gotogoto语句构成的循环语句构成的循环 在结构化程序设计中一般不主张使用goto语句,以免造成程 序流程的混乱。能避免使用goto则应避免使用,确实不得不用时 ,才使用goto。 goto语句称为无条件转向语句,其一般格式如下: goto 语句标号; goto语句的语义是改变程序流向,立即跳转到标号所标识的 语句。 语句标号是按标识符规定书写的符号,放在某一语句行的 前面,标号后加冒号(:)。语句标号起标识语句的作用,并不影响 该语句的执行,标号只起与goto句配合的作用。 C语言不限制程序中使用标号的次数,但各标号不得重名。 一般情况下,使用goto语句有两种情况: 与if语句一起构成循环结构; 从循环体中跳转到循环体外。 70 编 程 技 术 使用goto语句时应该注意以下几点: 跳转到一个循环内是非常危险的,应该极力避免这样做 ; 不能跳转到本函数外; goto语句越少用越好; 通常不主张向程序的前面跳转; 【例3.21】 用if语句和goto语句构成循环,求i。 #include void main() int i=1; /*存放自然数*/ int sum=0; /*存放和*/ loop: if (i void main() int i=1; int sum=0; while (i void main() int i=1; int sum=0; do sum+=i; i+; while(i #include void main() void main() int m,n=1; int m,n=1; scanf(“%d“, scanf(“%d“, do while(m void main() int i; long int sum=0; for (i=1;i void main() int i=1; long int sum=0; for (;i 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”也可省略,此时应在循环体中有语句可以改 变循环变量的值。否则循环也会变成死循环。 #include void main() int i; long int sum=0; for (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;i void main() int m,count=0; for(m=1;m void main() int m; int x,y,z; for (m=100;m void main() int i,j; for(i=1;i void main() int i,j; for (i=1;i void main() int x,y,z; for (x=1;x void main() int i,j,k,count=0; printf(“n“); for(i=1;i 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.265484 78.539818 r=6 92 编 程 技 术 【补充例7】韩信点兵问题。韩信有一队士兵,他想 知道有多少人,便让士兵排队报数。按从1到5报数, 最末一个士兵报的数为1;按从1到6报数,最末一个士 兵报的数为5;按从1到7报数,最末一个士兵报的数 为4;最后再按从1到11报数,最末一个士兵报的数为 10。编程计算韩信至少有多少兵。(break应用) 算法分析:设兵数为x,则按题意x应满足: x%5=1 for (x=1; ;x+) if(x%5=1 break; x=2111 练习:有一条长阶梯,若每步跨2阶, 最后剩下1阶;若每步跨3阶,最后剩 下2阶;若每步跨5阶,最后剩下4阶 ;若每步跨6阶,则最后剩下5阶;只 有每步跨7阶,最后才正好1阶不剩。 编程计算这条阶梯共有多少阶。 本节本节 94 编 程 技 术 3.6.7 continue3.6.7 continue语句语句 continue语句只能用在循环体中,其一般格式是: continue; 其语义是:结束本次循环,即不再执行循环体中continue语 句之后的语句,而是立即转入对循环条件的判断与执行。 应特别注意的是,continue语句只结束本层本次的循环,并 不跳出循环。 continue语句与while循环语句连用格式: while(表达式1) 语句1; if(表达式2) contimue; 语句2; continue与while连用 95 编 程 技 术 【例3.32】 从键盘输入整数,显示出其中的正整数, 若输入的是100,则退出。 #include void main() int x; do scanf(“%d“, if(x 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 break 97 编 程 技 术 3.6.8 3.6.8 循环程序设计举例循环程序设计举例 【补充例8】男、女生总计18个人,在一家饭店里吃饭, 共花了74元,每个男生各花5元,每个女生各花3元。利 用穷举法编程计算男、女生各有多少人。(穷举法) 算法分析:设男生x人,女生y人,根据题意有: x+y=18 5x+3y=74 且x、y应为整数,并满足下列条件:1x,y18 #include void main() int x,y; for(x=1;x void main() int x,y; for(x=1;x void main() int i,j,k; printf(“n i j kn“); for(i=1;i void main() int x,y,z; for (x=1;x #include void main() int n,j,k; printf(“n Input a integer to n:“); scanf(“%d“, k=n-1; j=2; while(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) 思考题:编写一个程序,输出100以内的所有素数。 105 编 程 技 术 #include #include void main() int n,j,k; for(n=2;n=k+1) printf(“%5d“,n); 106 编 程 技 术 【例3.36】利用格里高利公式求。直到最后一项的 值小于10-6为止。 算法分析:第1、3、5等奇数项为正数,偶数项为负数,分 母依次为1、3、5、7 pi存放结果 t存放第i项的值 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的值,直到最后一 项的值小于10-6为止。 108 编 程 技 术 【补充例】用近似公式: 求自然对 数的底e的值,直到最后一项的值小于10-6为止。 #include void main() int n; double e,p,t; e=0;p=t=1.0; for (n=1;t=1e-6;n+) e=e+t; /*累加运算*/ p*=n; /*做阶乘运算*/ t=1/p; printf(“e=%fn“,e); e=2.7182820 109 编 程 技 术 3.7 综合程序应用举例 【例3.37】对一批货物征收税金。价值在1万元以上 的货物征收5%的税金,在5000元以上,1万元以下 的货物征收3%的税金,在1000元以上,5000元以下 的货物征收2%的税金,1000元以下的货物免税。编 写程序,读入货物价格,计算并输出税金。 price void main() long x,price; float y; printf(“please enter price:“); scanf(“%d“, 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: case 9:y=0.03; break; default:y=0.05; printf(“revenue

温馨提示

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

评论

0/150

提交评论