《结构化程序设计的开发g.ppt》由会员分享,可在线阅读,更多相关《结构化程序设计的开发g.ppt(39页珍藏版)》请在金锄头文库上搜索。
1、第第3章章 结构化程序设计的开发结构化程序设计的开发主要内容主要内容n理解算法,并会画流程图理解算法,并会画流程图n理解计数器控制的循环和用标理解计数器控制的循环和用标记控制的循环记控制的循环n理解复合语句理解复合语句, 类型转换运算类型转换运算符符n自增、自减和赋值运算符自增、自减和赋值运算符n条件运算符条件运算符n掌握掌握if和和if/else选择语句选择语句n掌握掌握while语句语句本章掌握以下算法本章掌握以下算法:1.判断一个数是否回文。判断一个数是否回文。2.2. 二二进制制转换为十十进制。制。3。求求阶层n!4. 求和求和sum算法的概念算法的概念一个程序应包括以下两个方面的内容
2、一个程序应包括以下两个方面的内容:1)对数据的描述对数据的描述: 在程序中要指定数据的类型的数据的组织形在程序中要指定数据的类型的数据的组织形式式, 即即数据结构数据结构.2)2) 对操作的描述对操作的描述: 即即解决一个问题要采取的步骤也就是解决一个问题要采取的步骤也就是解决一个问题要采取的步骤也就是解决一个问题要采取的步骤也就是算法算法。提出问题提出问题编写程序编写程序确定处理确定处理方案方案确定操作确定操作步骤步骤调试和运行调试和运行程序程序输出整理输出整理结果结果算法设计算法设计算法的表示方法算法的表示方法n n伪代码表示算法;伪代码表示算法;伪代码表示算法;伪代码表示算法;n n用传
3、统流程图表示算法;用传统流程图表示算法;用传统流程图表示算法;用传统流程图表示算法;n n用用用用N-N-N-N-S(I.NassiS(I.NassiS(I.NassiS(I.Nassi and B. and B. and B. and B. SchneidermanSchneidermanSchneidermanSchneiderman) ) ) )结构结构结构结构化流程图表示的算法;化流程图表示的算法;化流程图表示的算法;化流程图表示的算法;伪码是帮助程序员制定算法的智能化的信息语言伪码是帮助程序员制定算法的智能化的信息语言. 与日常英与日常英语类似语类似.例如例如:If stdudent
4、sgrade greater than or equal to 60 print “Passed”Else print “Failed”一般处理框一般处理框判断框判断框流流程程线线输入输出框输入输出框起止框起止框传统流程图传统流程图:优点:优点:直观形象,流程清直观形象,流程清晰,各种操作一目了然,晰,各种操作一目了然,不易产生二义;不易产生二义; 缺点缺点:流程图占面积大,:流程图占面积大,由于允许使用流程线,使由于允许使用流程线,使流程任意转移,容易使人流程任意转移,容易使人弄不清流程的思路。弄不清流程的思路。用用N-SN-S结构化流程图表示算法(结构化流程图表示算法(I I)顺顺序序结结
5、构构A块块B块块A块块B块块(a)传统流程图表示的顺序结构传统流程图表示的顺序结构(b)N-S图表示的顺序结构图表示的顺序结构用用N-SN-S结构化流程图表示算法(结构化流程图表示算法(IIII)选选择择结结构构A块块B块块(a)传统流程图表示的选择结构传统流程图表示的选择结构(b)N-S图表示的选择结构图表示的选择结构条件条件P条件条件PA块块B块块满足满足不满足不满足满足满足不满足不满足用用N-SN-S结构化流程图表示算法(结构化流程图表示算法(IIIIII)循循环环结结构构A块块A块块条件条件P当给定条件当给定条件P满足满足满足满足不满足不满足A块块A块块条件条件P直到给定条件直到给定条
6、件P不满足不满足不满足不满足满足满足当型循环结构当型循环结构直到型循环结构直到型循环结构用传统流程图表示算法用传统流程图表示算法求三个整数之和及平均值求三个整数之和及平均值.开始开始sum=num1+num2+num3aver=sum/3输出输出sum, aver的值的值结束结束输入输入num1,num2,num3aver=sum/3输出输出sum, aver的值的值输入输入num1,num2,num3sum=num1+num2+num3用传统流程图表示算法(举例)用传统流程图表示算法(举例)问问题题:输输入入10个个数数,打打印印出出其其中中正正数数counter10是是x0否否输入输入xc
7、ounter=counter+1是是否否终止终止开始开始打印打印xcounter=1counter+当当count0打印打印x是是否否两种不同流程图表示的算法(举例)两种不同流程图表示的算法(举例)n=,m=0n=n+1n50当当n50是是g60否否输入成绩输入成绩gn=n+1m=m+1是是输出输出m否否终止终止开始开始输出输出m的值的值n=0,m=0输入学生成绩输入学生成绩g60m=m+1是是否否n:存放输入人数存放输入人数m:存放不及格人数存放不及格人数问问题题:输输入入全全班班50个个同同学学成成绩绩,统统计计出出不不及及格格人人数数问问题题:输输入入全全班班50个个同同学学成成绩绩,统
8、统计计出出不不及及格格人人数数及及平平均均分分counter=1,m=0, total=0counter=50是是grade60否否输入成绩输入成绩gradecounter+m=m+1是是输出输出m, total/(count-1)否否终止终止开始开始counter:存放输入人数存放输入人数m:存放不及格人数存放不及格人数total:存放学生总成绩存放学生总成绩total+=grade复合语句复合语句把多个语句用括号把多个语句用括号括起来组成的一个语句称括起来组成的一个语句称复合语句。复合语句。 在程序中应把复合语句看成是在程序中应把复合语句看成是单条语单条语句句,而不是多条语句,例如,而不是
9、多条语句,例如 x=y+z; a=b+c; printf(“%d%d”,x,a); 是一条复合语句。复合语句内的各条语句都必是一条复合语句。复合语句内的各条语句都必须以分号须以分号“;”结尾,结尾,在括号在括号“”外不能加分号外不能加分号。强制类型转换运算符强制类型转换运算符n1)1)强制类型转换运算符强制类型转换运算符n利用强制类型转换运算符将一个表达式转换成所需类型。利用强制类型转换运算符将一个表达式转换成所需类型。n一般形式一般形式: : (类型名)(表达式)(类型名)(表达式)n( (double)adouble)a - -将将a a转换成转换成doubledouble类型类型n( (
10、int)(x+yint)(x+y) -) -将将x+yx+y的值转换成整型的值转换成整型n(float)(5%3)-(float)(5%3)-将将5%35%3的值转换成实型的值转换成实型n(float)(5/3)-(float)(5/3)-将将5/35/3的值的值(1)(1)转换成实型转换成实型n注意注意:1.:1.表达式应用括号括起来表达式应用括号括起来. .如果写成如果写成: :( (int)x+yint)x+y 则只将则只将x x转换成整数转换成整数, ,然后与然后与y y相加相加. .n 2. 2.在强制类型转换时在强制类型转换时, ,得到一个所需的中间变量得到一个所需的中间变量. .
11、原来变量的类型并未变化原来变量的类型并未变化. .自增、自减运算符自增、自减运算符n+和和-是两个是两个C语言自语言自加自减运算符。加自减运算符。n作用:使变量自增作用:使变量自增1或自或自减减1。n如:如: k=0; k+;/*k的值为的值为1*/ k=10; k-;/*k的值为的值为9*/注意:注意:n+、-只能用于变量,不能用于表达式。只能用于变量,不能用于表达式。 j+是合法的,(是合法的,(x+y)+是非法的。是非法的。n+、-可以放在变量的左边或右边。可以放在变量的左边或右边。 k=10;y=+k; /*k自加自加1后,把值赋给后,把值赋给y k=11,y=11 */ k=10;y
12、=k+; /*把把k的值赋给的值赋给y,然后自加然后自加1, y=10,k=11*/ n k=5; printf(“%d,%d”,k,k+);/5,5 k=5; printf(“%d,%d”,+k,k);/6,5 k=5; printf(“%d”,(k+)+(k+);/*10*/不同的开发环境不同的开发环境,运行运行结果有差异结果有差异,本例用本例用VC 条件运算符条件运算符格式格式: min=(x=60? Passed:Failed);grade=60? printf(passedn): printf(Failedn);条件运算符条件运算符n例如:输入任意字符,如果是小字母,则把他改成例如:
13、输入任意字符,如果是小字母,则把他改成大写。大写。 main() char ch; scanf(“%c”,&ch);/ch=getchar(); ch=(ch=a & ch 6) ? puts( 6) : puts(6原因是当表达式中存在有原因是当表达式中存在有符号类型和无符号类型符号类型和无符号类型时所有的操作数都自动转换为无符号类型时所有的操作数都自动转换为无符号类型。因此。因此-20变成了一个非常大的正整数,所以该表达式计变成了一个非常大的正整数,所以该表达式计算出的结果大于算出的结果大于6。 if 语句的三种形式语句的三种形式:1. 单单路路选择选择:n格式:格式:if (expres
14、sion) statementexprstatement非非0=0if(xy) printf(“%d”,x);printf(“%d”,y); exprstatement1statement2非非0=02. 双路选择双路选择u格式格式:if (expression) statement1 else statement2if (xy) max=x; else max=y;printf(“max=%d”,max);形式三形式三(多路选择):(多路选择):if ( expr1 ) statement1else if (expr2 ) statement2else if (expr3 ) stateme
15、nt3. else statementn expr1statemnt1非0=0expr2statemntnstatemnt2非0=0u执行过程:执行过程: 例:例:if (salary1000) index=0.4; else if (salary800) index=0.3; else if (salary600) index=0.2; else if (salary400) index=0.1; else index=0; 如:如:if(a=b&x=y) printf(“a=b,x=y”); if(3) printf(“OK”); if(a) printf(“%d”,a);l说明:说明:u
16、ifif后面的表达式类型任意后面的表达式类型任意u语句可以是复合语句语句可以是复合语句u if(x) if(x!=0) if(!x) if(x=0)1.已知已知int x=10,y=20,z=30;以下语句执行后以下语句执行后x,y,z的值是。的值是。 if(xy) z=x;x=y;y=z; A) x=10,y=20,z=30 B) x=20,y=30,z=30 C) x=20,y=30,z=10 D) x=20,y=30,z=20 示例示例2.以下程序运行结果是。以下程序运行结果是。#include main() int a=5,b=0,c=0; if(a=b+c)printf(*); el
17、se printf($); A) * B) $ C) *$ D) 显示错误信息显示错误信息示例示例3 以下程序的输出结果是以下程序的输出结果是 A)-1 1 B)0 1 C)1 0 D)0 0 main( ) int a= -1,b=1; if(+a0)& ! (b- =0) printf(%d %dn,a,b); else printf(%d %dn,b,a); 示例示例例如:求函数:例如:求函数: -1 x0程序程序程序程序1 1main()main() intint x,y; x,y; scanf(“%d”,&xscanf(“%d”,&x); ); if(x0) y=-1; if(x=0
18、) if(x0) y=1; else y=0; else y=-1; printf(“y=%d”,y);例:例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);修改:修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);实现实现if else 正确配对方正确配对方法:加法:加 /*在考试成绩大于等于在考试成绩大于等于90打印打印A, 8089打印打印B, 7079打印打印C,6069打印打印D,小于小于60打印打印E (书书P46页页)*/#include “stdio.
19、hmain() float grade; char ch; printf(input grade:); scanf(%f,&grade); if(grade=90) ch=A; else if(grade=80) ch=B; else if(grade=70) ch=C; else if(grade=60) ch=D; else ch=E; printf(%.1f-%cn,grade,ch); while语句语句n nwhilewhile语句的一般格式:语句的一般格式:语句的一般格式:语句的一般格式: while(while(表达式表达式表达式表达式) ) 语句语句语句语句 功能:当表达式为真
20、时执行语句,功能:当表达式为真时执行语句,功能:当表达式为真时执行语句,功能:当表达式为真时执行语句,一直到表达式为假时为止。一直到表达式为假时为止。一直到表达式为假时为止。一直到表达式为假时为止。条件语句非非00退退出出循循环环#include Stdio.hmain() float average; int counter,grade,total; total=0; counter=0; /*初始化阶段初始化阶段*/ printf(Enter grade,-1 to end:); scanf(%d,&grade); while(grade!=-1) total+=grade; counte
21、r+; printf(Enter grade,-1 to end:); scanf(%d,&grade); if(counter!=0) average=(float)total/counter; printf(Class average is %.2f,average); else printf(No grade were enteredn);/*( 书书P53) 求全求全班平均成绩的班平均成绩的程序程序,程序在每程序在每次运行时都能次运行时都能够处理任意个够处理任意个数的成绩数的成绩 */ /* 书书P56 输入每个学生的考试结果输入每个学生的考试结果(即输入即输入1或或2),计算每种类型
22、考试结果计算每种类型考试结果的个数的个数#include “stdio.hmain() int passes=0,failures=0,student=1,result; while(student8) printf(Raise tuitionn); getch();1.设有程序段:设有程序段: int k=10; while(k=0)k=k-1; 则下列描述正确的是。则下列描述正确的是。C A) 循环体语句执行一次循环体语句执行一次 B) while循环执行循环执行10次次 C) 循环体语句一次也不执行循环体语句一次也不执行 D) 死循环死循环2.下列程序段运行结果是。下列程序段运行结果是。
23、A a=1;b=2;c=2; while(abc)t=a;a=b;c-; printf(%d,%d,%d,a,b,c); A) 2,2,0 B) 2,1,0 C) 1,2,1 D) 2,1,13. 下列程序运行结果是。下列程序运行结果是。C main() int num=0; while(num=2) num+;printf(%3d,num); A) 1 B) 1 2 C) 1 2 3 D) 1 2 3 4程序举例程序举例:1. 求求 Sn=a+aa+aaa+aaa之值之值,其中其中a是一个数字是一个数字。分析:分析: 求和:求和: sum=sum+t; 求项数:求项数:t=t*10+a;2.
24、 判断判断x是否为素数。是否为素数。 分析:分析: 除除1和自身以外都不能被整除的数。和自身以外都不能被整除的数。3. 求求N! 分析:分析: N!=N*(N-1)! 求积:求积:s=s*t 求项数:求项数: t=t+1n4. 求求s=1!+3!+5!+19!n分析分析: 3!=3*2*1! 5!=5*4*3!n 求和求和: s=s+t;n 求项数求项数: t=t*(n+1)*(n+2) ;n=n+2;n 2 3 5 8 n 5.求求 s= + + + 前前20项之和。项之和。n 1 2 3 5n分析:分析: 初值:初值: a=2,b=1 n 分子:分子:t=a, a=a+b 分母:分母:b=
25、t n 求和:求和: s=s+a/bn 1. 求求 Sn=a+aa+aaa+aaa之值之值,其中其中a是一个数字是一个数字。#include void main() long s=0,t=0; int n,i=1; printf(Enter n:); scanf(%d,&n); while ( i=n) t=t*10+n; s=s+t;i+; printf(s=%ldn,s); 2. 判断判断x是否为素数。是否为素数。 #include void main() int x,i=2; printf(Enter x:); scanf(%d,&x); while ( ix) if (x%i=0) i
26、=x; i+; if (i=x+1) printf(%d不不是素数是素数n,x); else printf(%d是素数是素数n,x); 3. 求求20!#include void main() long t=1; int n=1; while ( n=20) t=t*n; n+; printf(t=%ldn,t); 4. 求求s=1!+3!+5!+19!#include void main() long s=0,t=1; int n=1; while ( n=19) s=s+t; t=t*(n+1)*(n+2); n=n+2; printf(s=%ldn,s); n 2 3 5 8 n 5.求求 s= + + + 前前20项之和。项之和。n 1 2 3 5#include void main() float a=2.0, b=1.0, s=0.0, t; int n=1; while ( n=20) s=s+a/b;t=a+b;b=a;a=t; n+; printf(s=%fn,s); 作业作业P69页页 3.11 3.13 3.25 3.29 3.30 3.35