《结构化程序设计》PPT课件.ppt_第1页
《结构化程序设计》PPT课件.ppt_第2页
《结构化程序设计》PPT课件.ppt_第3页
《结构化程序设计》PPT课件.ppt_第4页
《结构化程序设计》PPT课件.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计 第3章 结构化程序设计,while语句,二分支语句,else if语句,本章主要内容提示,嵌套的if else语句,switch语句,顺序语句,Do while语句,for语句,循环嵌套,转移控制语句,本章学习目标,知识目标 掌握顺序结构、选择结构和循环结构的三种结构设计 熟练掌握if、else-if、switch、break、for、while、do-while和continue 语句的使用 掌握多分支选择结构和循环的多重嵌套语句的使用,能力目标 具备解决实际问题的算法设计能力 掌握应用多分支结构和多重嵌套结构完成程序的设计,【学习提示】本章是C语言的基础知识,是其它程序设计语言通用的内容,需要大家勤奋学习,所有的案例都需要理解掌握,学习方法可以先以理解记忆为主,在自己不知道该如何写程序的情况下,背原有的算法,记思路,把源程序默写出来,最后分析提出是否能有其他解决方法。,3.1 顺序语句,【例 3-1】计算银行存款的本息,输入存款金额,存期,和年利率,根据公式计算存款到期时的本息合计,输出时保留两位小数。,#include /*标准输入输出头文件*/ #include void main() /*定义main函数,返回值为void无类型*/ int money,year;/*定义存放整数的存款金额money变量和年份year变量*/ double rate,sum;/*定义存放双精度形式的银行利率rate和本息合计sum*/ printf(“enter money:”); /*用printf函数提示输入存款金额*/ scanf(“%d”, /*输出本息合计*/ ,3.1 顺序语句,x = 0; i+; printf(); 注意:分号是语句终结符! 当用一对花括号与把一组说明和语句括在一起构成一个复合语句 【例3-2】 用*号输出字母C的图案。,#include “stdio.h“ void main() printf(“Hello C-world!n“); printf(“ *n“); printf(“ *n“); printf(“ * n“); printf(“ *n“); ,【例3-3】 编写程序用于小商店卖糖售货员算帐:奶糖每斤12.5元,水果糖每斤8.5元,巧克力每斤15.7元,要求输入各类水果糖的重量,打印出应付钱数,再输入顾客付款数,打印应找的钱数。,3.1 顺序语句,#include void main() float mSugar,fSugar,cSugar,money,remain; printf(“奶糖12.5元/斤,水果糖8.5元/斤,巧克力15.7元/斤n“); printf(“输入奶糖,水果糖,巧克力的重量,没有的输入0:n“); scanf(“%f,%f,%f“, ,3.2 二分支IF语句,【例3-4】解决由键盘输入3个整数,输出其中最大的值的问题。,#include void main(void ) int a,b,c,max; printf(“enter integer a,b, c:”); /*输入a,b,c的数据提示*/ scanf(“%d,%d,%d”, /*输出max的值*/ ,二分支IF语句两种形式: 语法形式一 if (表达式) 语句1 语法形式二 if (表达式) 语句1 else 语句2,3.2 二分支IF语句,else部分是任选的。在if语句执行时,首先计算表达式的值,如果其值为真(即,如果表达式的值非0),那么就执行语句1;如果其值为假(即,如果表达式的值为0),并且包含else部分,那么就执行语句2。 由于if语句只是测试表达式的数值,故表达式可以采用比较简捷的形式。最明显的例子是用if (表达式) 代替if (表达式!= 0 )有时这样既自然又清楚,但有时又显得比较隐秘。,【例3-5】试编程判断输入的正整数是否既是5又是7的整数倍。若是,则输出yes;否则输出no。,3.2 二分支IF语句,【思考】if中条件表达式是否可以改成 !x%5&!x%7 ?,【例3-6】判断输入的某一年是否是闰年,符合闰年的条件是: 1 能被4整除,但不能被100整除 2 能被400整除 满足以上条件之一都是闰年。,3.2 二分支IF语句,#include void main() int year; printf(“input year:n”); scanf(“%d”, ,3.3 ELSE IF语句,【例3-7】给出一百分制成绩,要求输出等级A,B,C,D,E,90分以上为A,80-89分为B,70-79为C,60-69为D,60分以下为E。,思考:如何通过不合法数据测试,即如果是不合法的数据,提示数据超出范围!,#include void main() int score; printf(“Please input student score:”); scand(“%d”, /*如果成绩=59分,输出E*/ ,一般的语法格式: if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 else if(表达式3) 语句n-1 这种嵌套的if语句构成的序列是编写多路判定的最一般的方法。各个表达式依次求值,一旦某个表达式为真,那么就执行与之相关的语句,从而终止整个语句序列的执行。,3.3 ELSE IF语句,3.3 ELSE IF语句,【例3-8】通过键盘输入字符,判断其为控制、数字、大写字母、小写字母和其他字母的哪一类。,#include “stdio.h“ void main( ) char c; printf(“Enter a char:“); cgetchar( ); /*从键盘读取输入的一个字符,然后分类判断 */ if(c0&cA&ca&cz) printf(“nThe char is a lower char. n“); else printf(“nThe char is an other char. n“); ,【例3-9】已知银行整存整取存款不同期限的月息利率分别为:一年时,月息利率0.001875,二年时,利息率为0.002325,三年时,利息率是0.002775,五年时,利息率是0.003000,输入存款的本金和年限,求到期时能从银行得到的利息与本金的合计。(利息的计算公式为:利息本金月息利率12 存款年限。,3.3 ELSE IF语句,#include “stdio.h“ void main() int year; float money,rate,total; /* money:本金 rate:月利率 total:本利合计 */ printf(“Enter money and year ?“); scanf(“%f%d“, ,3.4 嵌套的if else语句,【例3-10】计算分段函数,输入x的值,计算输出y的值,#include void main() int x,y; printf(“Enter x:”); scanf(“%d”, ,if(x=0) if(x0) y=1; else y=0; else y=-1;,y=-1; if(x!=0) if(x0) y=1; else y=0;,y=0; if(x=0) if(x0) y=1 else y=-1;,【思考】运行代码,将花括号的代码代换成代换1、代换2、代换3,结果如何,3.4 嵌套的if else语句,如果if else语句内嵌语句是另一条基本的if语句时,就形成了嵌套的if else语句,其一般形式为: if (表达式1) if(表达式2) 语句1 else 语句2 else if(表达式3) 语句3 else 语句4 经验:else与最近的还无else匹配的if匹配!建议在if语句嵌套的情况下尽可能使用花括号!,【思考】代换3的源代码改错,实现程序要求。,小结if语句,1.在几种形式的if语句中,if关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。 例如:if(a=5) 语句; if(b) 语句; 都是允许的。只要表达式的值为非0,即为“真”。 如在:if(a=5);中表达式是赋值表达式,其值等于赋给它的值,此例中永远为5(非0),所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。又如,有程序段: if(a=b) printf(“%d“,a); else printf(“a=0“); 本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。 在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。 2.在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用括起来组成一个复合语句。但要注意的是在之后不能再加分号。,3.5 switch实现多分支选择,switch语句直接处理多分支语句。 【例3-11】设计一个程序,输入某天是几月几日,要求算出这一天是本年的第几天。要算出某天是当年的第几天,应该将当年中本月之前所有月的天数相加,再加上本月的天数。但这里有一个闰年问题,二月是一个特殊月,如该年是闰年,则二月有29天,否则,便是28天,所以,还必须给出年份,以2005.3.5为例,先判断不是闰年,结果就是前两个月的天数再加上5天,即65天。,#include void main() int y,m,d,s; printf(“n Enter year-month-data:“); scanf(“%d-%d-%d“,case 5: /*m=5时,总天数就是输入的日加1,2,3,4月的天数*/ s=d+31+29+31+30; break; case 6: /*m=6时,总天数就是输入的日加1,2,3,4,5月天数*/ s=d+31+29+31+30+31; break; case 7: /*m=7时,总天数就是输入的日加1,2,3,4,5,6月的天数*/ s=d+31+29+31+30+31+30; break; case 8: /*m=8时,总天数就是输入的日加1,2,3,4,5,6,7月的天数*/ s=d+31+29+31+30+31+30+31; break; case 9: s=d+31+29+31+30+31+30+31+31; break; case 10: s=d+31+29+31+30+31+30+31+31+30; break; case 11: s=d+31+29+31+30+31+30+31+31+30+31; break; default: s=d+31+29+31+30+31+30+31+31+30+31+30; if(y%4=0 ,switch语句详解,switch语句是一种多路判定语句,它根据表达式是否与若干常量整数值中的 某一个匹配来相应地执行有关的分支动作。 语法格式: switch ( 表达式) case 常量表达式: 语句序列 case 常量表达式: 语句序列 default: 语句序列 执行过程: 【说明】switch关键字后面的表达式,可以是任意合法的表达式,每个case关键字后面的常量表达式的类型,必须与switch关键字的类型一致;default分支是任选的,各个case分支及default分支的出现次序是任意的,default子句可以省略不用;在case后的各常量表达式的值不能相同,否则会出现错误。 【注意】在case后,允许有多个语句,可以不用括起来。,【例3-12】编写简单的计算器程序:根据用户输入的两个操作数和运算符,显示 计算结果。 (设运算符包括,*,/。) #include “stdio.h“ void main() float data1,data2; /*定义两个操作数变量 */ char op; /*定义操作符 */ printf(“Enter your expression:“); scanf(“%f%c%f“,&data1,&op,&data2);/*输入要计算的表达式 */ switch (op) /*根据操作符对data1、data2进行相应运算 */ case : /*处理加法*/ printf(“%.2f%.2f%.2fn”,data1,data2,data1 data2); break;,switch语句详解,case : /*处理减法 */ printf(“%.2f%.2f%.2fn“,data1,data2,data1data2); break; case * : /*处理乘法 */ printf(“%.2f*%.2f%.2fn“,data1,data2,data1*data2); break; case /: /*处理除法 */ if (data20) /*若除数为0 */ printf(“Divisor is zero.n“); else printf(“%.2f/%.2f%.2fn“,data1,data2,data1/data2); break; default: /*输入其它运算符 */ printf(“Unkwown operater. n“); ,switch语句详解,3.6 while循环结构,循环程序实现的要素: 1循环变量的初值、终止值(循环退出条件,循环在什么条件下不执行),增值(循环变量的改变值,一般循环体内完成) 2循环体,需要重复执行的操作。,while循环结构,【例3-13】计算 void main() int i,sum=0; /*设置初值变量*/ i=1; while(i=100)/*判断循环条件是否成立,如果成立执行循环体*/ sum+=i; /*将变量i累加到和上。*/ i+; /*循环变量加1操作*/ printf(“1+2+100=%dn”,sum); ,while语句详解,while语句用来实现“当型”循环结构。 语法格式: while (表达式) 循环体语句 【说明】 1.while语句特点是“先判断,后执行”,如果表达式的值非0时,执行while语句中的内嵌语句,执行完循环体语句后再返回循环的开始部位,判断表达式的值,决定是否执行循环,当循环的条件为0时,退出循环。 2.循环体语句如果是多条语句,采用复合语句的形式,即采用符号把语句包含进来。 3.在循环体内应该包含改变循环条件表达式值的语句,否则会导致“死”循环。,while语句详解,【例3-14】输入一行字符,分别统计出其中英文字母、空格、数字和其他字母的个数。 #include void main( ) char c; int letter0,space0,digit0,other0; printf(“input a line letter:n“); while(cgetchar( )!n) if(ca &cA&c0&c9) /*判断是否为数字*/ digit; else /*其他字符*/ other; printf(“ letter%d,space%d,digit%d,other%dn“,letter,space,digit,other); ,【思考】为什么用getchar函数可以实现一行字符的输入并判断?该函数的具体参数使用办法。,while语句详解,【例3-15】编写程序计算并输出下列级数和,直到某项的绝对值小于为止。 #include #include /*fabs库函数在math文件中定义*/ void main() int k; /* 表示第k项*/ double sum,d,f; sum=1.0;k=0;f=1.0; while(fabs(d)=1.0e-4) /*当某一项的绝对值大于10-4退出循环*/ k+ ; f=-f ; /*符号变量取反*/ d=1.0/(k*(k+1); /*计算每一项*/ sum=sum+f*d; /*累加*/ printf(“sum=%lfn”,sum); ,3.7 do-while循环结构,【例3-16】从键盘输入一个正整数,逆序输出该整数。 #include void main() int number,nb; printf(“please input a interger“); scanf(“%d“, /*当原数没有全部依逆序取完,继续循环*/ ,do-while语句详解,Do-while语句用来实现直到型循环结构 一般的语法: do 循环体语句 while(表达式); 【注意】不要丢失while后面的分号! 【说明】 1do-while语句特点是“先执行,后判断”,先执行一次指定的循环体,当表达式的值为非0时,即为真时,返回继续执行循环体,否则当表达式的值为0时,退出循环。因此,不论最初表达式的值是否为1都执行一次循环体。 2循环体语句如果是多条语句,采用复合语句的形式,即采用符号把语句包含进来。 3在循环体内应该包含改变循环条件表达式值的语句,否则会导致“死”循环。,【例3-17】用二分法求方程在(10,10)之间的根。 方程式曲线如图3-12所示。,算法分析:逐步将包含有根的区间二分,通过判断函数值的符号,逐步对半缩小有根区间,直到区间缩小到容许误差范围,然后取区间中点为根的近似值,具体算法描述如下: 1设初值x1=-10,x2=10,则f(x1)0,计算中点。 2计算f(x0),如果足够逼近0,即与0差值在很小的范围内,则结果为x0,否则判断f(x0)与f(x1)和f(x2)哪一个异号。 3如果f(x0)0,则区间缩短为-10,x0之间。 4对缩短后区间继续取中值判断。,3.8 for 循环结构,【例3-17】Fabonacci数列: 1 1 2 3 5 8 13 21 34 #include void main() long int f1,f2; int i; f1=1;f2=1; /*定义f1,f2变量并初始化为1*/ for(i=1;i=10;i+) /*循环执行10次,每次输出2个数*/ printf(“%12ld %12ld”,f1,f2); if(i%2=0) printf(“n”);/*当i是偶数时换一次行,即每行输出4个数*/ f1=f1+f2; f2=f2+f1; /*计算数列每项*/ ,for语句详解,语法格式: for(表达式1;表达式2;表达式3) 循环体语句 for循环语句在功能上等价于下列的while循环语句: 表达式1; while(表达式2) 循环体语句; 表达式3; ,for语句详解,【说明】 (1)在for语句中,三个表达式中任何一个表达式都可以省略,但其中“;”不能省略; 比如说对于求100个数的和: for(i=1;i100) break;,for语句详解,以上五种循环语句等价,可以看出三个表达式都可以省略,但是注 意for中省略的表达式在其他位置以语句形式出现,否则可能导致死循 环,比如说在中省略了表达式2,则在循环体内加入判断语句和break 语句完成条件成立时退出循环体,否则就会导致死循环。 常使用的for语句的形式: for(循环体变量赋初值;循环退出条件;循环变量增值); (2)循环体语句如果是多条语句,采用复合语句的形式,即采用符号把语句包含进来; (3)表达式1除了设置循环变量的初值,也可以设置其他表达式,而且可以是逗号表达式; 比如说:for(sum=0,i=1;i=100;i+) sum+=i; (4)表达式3可以是关系表达式,逻辑表达式,也可以是数字或字符,只要其值非0,就执行循环体。,for语句举例,【例3-18】求100499之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。 #include void main() int i,j,k,m; for(m100;m500;m) im/100; /* 取百位 */ jm/10i*10; /* 取十位 */ km%10; /* 取个位 */ if (mi*i*ij*j*jk*k*k) /* 如满足条件,则输出 */ printf(“%5d“,m); ,循环语句小结,(1)三种语句都用来处理循环问题,可以互相代替。 (2)while和for语句是当型循环,do-while语句是直到型循环。所以在执行do-while语句时要考虑到即使条件不满足也会执行一次循环体。 (3)实际情况中,循环次数能估计出来的一般采用for循环完成,否则采用while或do-while语句实现。 (4)while和do-while循环在while后面指定循环条件,循环体中应包括使循环趋于结束的语句。 (5)用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句在表达式1中实现循环变量的初始化。,3.9 循环嵌套,【例3-19】打印九九乘法表。 #include void main() int i,j; for(i=1;i10;i+) for(j=1;j10;j+) printf(“%d*%d=%d “,i,j,i*j); printf(“n“); ,多重循环语句,循环嵌套,是指一个循环体中完整包含了另一个循环结构,有成多重 循环。在C语言中,允许循环结构多重嵌套,并且while、do-while和for 循环结构都可以嵌套,此外在一个循环体内可以包含各种完整的选择结 构,在一个选择结构的某个独立部分中,还可以包含完整的循环结构, 但是不允许相互之间有交叉,即选择或循环结构的结束语句在另外一个 循环或选择结构体内。 【例3-20】古典算数问题,搬砖:已知要搬36块砖,36人搬,男一人搬4 块砖,女一人搬3块砖,两个小孩合搬一块砖,要求一次搬完,请问男、 女、小孩各需多少人? 算法分析:采用穷举法完成,即假设男的人数为men,女的人数是women,小孩是children(必是偶数),则可得到如下方程式: 这个方程式的三个变量,两个方程式,应该解有多种。,多重循环语句,方法一: #include void main() int men,women,children; for(men=0;men36;men+) /*遍历所有的men人数*/ for(women=0;women36;women+) /*遍历所有的women人数*/ for(children=0;children36;children+)/*遍历所有的 children人数*/ if(men+women+children=36 /*判断两个方程式是否成立,如果成立,则是所得结果*/ ,多重循环语句,方法二: #include void main() int men,women,children; for(men=0;men9;men+) for(women=0;women12;women+) children=36-men-women; if(4*men+3*women+children/2.0=36) printf(“men is %d,women is %d,children is %d”,men,women,children); ,多重循环语句,【小结】两种代码的执行结果完全一致的,但是程序编码不一样,讨论那种好?显然,第二种好,因为选用两重for循环,循环执行的次数是12*9=108次,而第一种源代码循环执行次数是36*36*36=46656次,前者执行效率高,因此,实际编程时对于多重循环嵌套要考虑执行效率。 【思考】在if语句的括号中children/2.0,如果改为children/2可以吗?说明原因。,3.10 转移控制语句,【例3-21】求100200之间的所有素数,并输出 #include #include void main() int i,m,k,n=0; /*设计n变量用于输出10个素数后换行*/ for(m=100;mk) /判断内层循环是否正常退出,如果是,则m是素数*/ printf(“%d”,m); n+; /统计共有n个素数*/ if(n%10= =0) /每10个素数换行*/ printf(“n”); ,【思考】本题目大家可以先按照常规的素数判定方法解决,然后比较两种算法的优劣;同时,考虑if(ik)中条件是否能换成if(i= =k+1)?,break和continue语句,1break语句 退出语句,完成从当前的switch结构中退出,执行switch语句下面的 一个语句,也可以用于从循环体内跳出循环,但当然一个break只能退出 一重循环,即提前结束循环,接着执行循环语句下面的语句。 语法格式: break

温馨提示

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

评论

0/150

提交评论