计算机基础-程序结构.ppt

上传人:小飞机 文档编号:6606273 上传时间:2023-11-17 格式:PPT 页数:77 大小:429KB
返回 下载 相关 举报
计算机基础-程序结构.ppt_第1页
第1页 / 共77页
计算机基础-程序结构.ppt_第2页
第2页 / 共77页
计算机基础-程序结构.ppt_第3页
第3页 / 共77页
计算机基础-程序结构.ppt_第4页
第4页 / 共77页
计算机基础-程序结构.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

《计算机基础-程序结构.ppt》由会员分享,可在线阅读,更多相关《计算机基础-程序结构.ppt(77页珍藏版)》请在三一办公上搜索。

1、第四章 结构化程序设计和控制结构,结构化程序设计,上个世纪六十年代末,结构化程序设计,软件发展的一个重要的里程碑。结构化程序设计的思路将一个描述复杂的问题,系统地分解成足够小的和可管理的单元/模块,从而最终可以编写成可以正确执行的程序。因为该机制是将一个大规模的工作,系统地分解为更小的单元/模块,因此也被称为“系统分解”。,4-2,系统分解,系统分解实际上是执行任务的过程,即:对于一个工作单元,将它分解成一组更小的单元,而这组单元可以执行与大单元相同的任务。这种思想实际就是:从一个大的、复杂的任务开始,逐步将之分解到非常小的单元,对于这些小单元来说,是很容易编写出程序来执行的。既然该过程是一步

2、一步被应用,而每一步都是将一个相对复杂的任务精炼成一组更简单的子任务,那么这种过程也可以称为“逐步求精”。,4-3,三种结构:顺序,条件,重复,系统分解思想使用三种基本的控制结构来分解一个大规模的任务,这三种基本结构是:顺序,条件和重复。,4-4,顺序结构,顺序结构,就是将一个指定的任务分解成两个子任务,一个接着一个。也就是说,当执行完第一个子任务之后再继续执行下一个子任务而从第二个子任务返回第一个子任务的情况永远不会发生。长度单位换算的问题,4-5,执行第1部分,(b)顺序,执行第2部分,条件结构,条件结构,又称判定结构,根据条件的不同每次只执行两个子任务中的其中一个。当条件为真时,执行某一

3、个子任务,若为假则执行另一个。任何一个子任务都可以为空,也就是说,它可以“什么都不做”。但不管结果如何,当正确的子任务执行完后,程序始终向前行进,永远不会回头去再次测试条件。,4-6,子任务1,(c)条件,子任务2,测试条件,真,假,重复结构,重复结构,又称循环结构,只要条件为真就需要将某一个子任务多次执行时就将使用这种程序结构。当条件为真,执行这一子任务;子任务执行结束后,回头再次检测条件是否为真。只要被测试的条件为真,程序就会继续执行这一相同子任务。一旦条件不为真,程序就向前行进。,4-7,子任务,(d)重复,测试条件,真,假,4-8,控制结构,条件ifif-elseswitch重复whi

4、lefordo-while,4-9,if,if(condition)action;,condition,action,T,F,Condition,一个C表达式,TRUE(non-zero)或 FALSE(zero).Action,一条C语句,简单语句或复合语句.,4-10,示例,if(x=10)y=x*x+5;if(x=10)y=x*x+5;z=(2*y)/3;if(x=10)y=x*x+5;z=(2*y)/3;,复合语句;如果 x=10,都执行,如果x=10,执行第一条;第二条语句总会执行,换行和缩进风格,if语句通行的换行和缩进风格。这样的编程风格使得阅读该段代码的人能够很快的识别出如果条

5、件成立将被执行的部分。请记住,风格只是增强了代码的可读性,并不影响程序的执行。,4-11,4-12,更多示例,if(temperature=0)printf(At or below freezing point.n);if(key=K)numK+;if(month=4|month=6|month=9|month=11)printf(The month has 30 daysn);,4-13,常见错误,if(18=age=25)/*此条件总是为真*/num+;if(x=2)/*此条件总是为真*/y=3;/*变量y总会被赋值为3*/,4-14,if嵌套,if(x=3)if(y!=6)z=z+1;w

6、=w+2;,if(x=3),等价于,4-15,if-else,if(condition)action_if;else action_else;,condition,T,F,示例,if(temperature0)printf(Above freeing.n);,4-16,示例,if(x)y+;z-;else y-;z+;,4-17,成绩等级换算级联的if-else,#include int main()char grade;/*成绩等级*/*获得输入值*/printf(“Enter the grade:”);scanf(%c,4-18,scanf,读入一个字符,格式说明“%c”,使得从键盘输入的

7、字符被赋值给grade。,4-19,If与else匹配,语法规则:else是与最靠近它的未匹配的if相匹配的,if(x!=10)if(y 3)z=z/2;else z=z*2;,if(x!=10)if(y 3)z=z/2;else z=z*2;,等价于,if(x!=10)if(y 3)z=z/2;else z=z*2;,不同于,使用大括号结合语句条件表达式:x?y:z,4-20,if-else:错误检查,#include int main()int dividend;int divisor;int result;printf(Enter the dividend:);scanf(%d,4-21

8、,4-22,while,while(test)loop_body;,test,loop_body,T,F,在条件为真的情况下重复执行一个语句。在每次重复执行这个语句之前,都要先检查条件。如果条件的值为逻辑真(非零),语句将被再次执行。,示例,#include int main()int i=0;while(i10)printf(%d,i);i=i+1;while语句适用于使用标志控制的循环。事先并不知道重复的次数,只知道循环需要继续直到某个事件(即标志)发生。,4-23,4-24,无限循环,#include int main()int i=0;while(i10)printf(%d,i);,4

9、-25,for,for(init;end-test;re-init)statement,init,test,loop_body,re-init,F,T,for,for循环,适用于记数器控制的循环。for循环是while循环的一种特殊情况,它适用于事先知道重复次数的情况。for循环可以使用while循环来构造(反之亦然)#include int main()int i;for(i=0;i10;i+)printf(%d,i);,4-26,4-27,示例,/*-这个循环会输出什么?-*/for(i=0;i=10;i+)printf(“%d”,i);,计算9的阶乘,#include int main(

10、)int i;int result=1;for(i=9;i1;i-)result=result*i;,4-28,常见错误,result=1;for(i=9;i1;i-);result=result*i;printf(result=%dn,result);printf(i=%dn,i);,4-29,4-30,循环嵌套,#include int main()int multiplicand;/*被乘数*/int multiplier;/*乘数*/*外层循环*/for(multiplier=1;multiplier10;multiplier+)/*内部循环*/for(multiplicand=1;m

11、ultiplicand=multiplier;multiplicand+)printf(%d*%d=%dt,multiplicand,multiplier,multiplicand*multiplier);printf(n);“t”,制表符,4-31,do-while,do loop_body;while(test);,loop_body,test,T,F,在循环体被执行一次之后再计算条件表达式的值,示例,i=0;do printf(%dn,i);i=i+1;while(i 10);,4-32,编程风格,对于以上三种类型的重复结构,哪些情况下采用while,哪些情况采用for,哪些情况采用do

12、-while?在大部分情况下,这三种结构可以互换使用。区别在于编程风格:为了提高代码的可读性,更好的将循环的目的传达给阅读代码的人,而选择恰当的结构。,4-33,4-34,switch,switch(expression)case const1:action1;break;case const2:action2;break;default:action3;,evaluateexpression,=const1?,=const2?,action1,action2,action3,T,T,F,F,switch,给编译器提供一个可以通过跳过一些测试以优化这些代码的机会。使用switch语句代替级联的

13、if-else语句,4-35,switch语句的一般形式,switch(表达式)case 常量表达式1:/*语句1*/break;/*可选*/case常量表达式2:/*语句2*/break;/*可选*/case常量表达式n:/*语句n*/break;/*可选*/default:/*语句n+1*/,4-36,计算过程,首先计算switch后面的表达式的值,然后判定表达式的值与下面的哪个case后面的常量表达式的值相同。如果与某个值相同,那么执行该case后面的语句。,4-37,注意事项,switch后面的表达式必须是整型(int或char)。每一个case都由0条或多条语句组成,不需要用大括号分

14、隔。每一个case后面的常量表达式都必须是唯一的,不允许有重复。它还必须是一个常量表达式,不能是基于程序执行而变化的变量。break语句是可选的。break语句用于跳出switch结构,将控制流直接改变至switch的右括号之后。如果不使用break语句,那么控制流则从当前的case到达下一个。还可以包括一个default语句。如果switch表达式与任何一个case都不匹配的话,将会选择这种情况。如果没有给出default,并且表达式与任何一个常量都不匹配,那么不执行任何case。,4-38,编程风格,如果不包括default语句,最后一个case就不需要使用break。然而,在最后一个ca

15、se的后面包括break是一种好的编程习惯。如果在switch的末尾再添加一个case的话,就不需要给前面的一个case加break了。这是一种好的、具有保护性的编程风格。,4-39,4-40,示例switch代替级联的if-else,#include int main()char grade;/*成绩等级*/printf(“Enter the grade:”);scanf(“%c”,4-41,break,switch(a)case 1:printf(“A”);case 2:printf(“B”);default:printf(“C”);,If a is 1,prints“ABC”.If a

16、is 2,prints“BC”.Otherwise,prints“C”.,break,break语句也可以用于循环结构中。break语句使编译器生成提前跳出循环或者switch语句的代码。当用于循环结构时,break通过将控制跳出包含它的那层循环,使该层循环终止。/*这段代码产生输出为:1 2*/for(i=1;i10;i+)if(i%3=0)break;printf(%d,i);,4-42,continue,用于循环结构中的continue语句使编译器生成结束当前的循环,开始下一次重复的代码。/*这段代码产生输出为:1 3 5 7 9*/for(i=1;i10;i+)if(i%2=0)con

17、tinue;printf(%d,i);,4-43,4-44,使用控制结构解决问题,应用“自顶向下”方法,解决需要使用控制结构的问题。,问题1:计算自然对数之底e的近似值,级数展开式来计算的e的值。,4-45,步骤0,为计算中要包括的数据选择一个恰当的表示方法。既然级数处理的是小数,需要采用double型浮点数来表示在级数计算中调用的变量。,4-46,步骤1,问题的最初设计。包含四个阶段:初始化,获取输入,计算,输出结果。首先把所有需要初始化的数据初始化(一个程序必须要有正确的初始值才能真正解决问题。因此,每个算法的第一步是:初始化变量。)然后要求用户输入要计算的级数的项数之后计算出给定项数的级

18、数最后,打印出结果。分解为包含多项子任务的顺序结构。,4-47,初始化,获得输入n,计算级数,输出结果,步骤2,分解“计算级数”:对级数逐项进行计算,直到计算出用户指定的项数。注意:与for循环的流程图一致。,4-48,初始化,获得输入n,计算级数,输出结果,初始化循环计数器i,i=n?,再计算一项,i递增,真,假,计算级数,步骤3,分解“再计算一项”一个重要的子任务:计算一个数的阶乘,取阶乘结果的倒数,再加到当前的近似值上。,4-49,再计算一项,再计算一项,初始化阶乘结果result、循环计数器j,j=i?,result=result*j,j递增,假,真,加上1/result,C程序,#i

19、nclude int main()double e=1;/*e的近似值*/int result;/*阶乘计算结果*/int i,j;/*重复变量*/int numOfTerms;/*计算的项数*/printf(Number of terms(must be 1 or larger):);scanf(%d,4-50,可以一次声明多个相同类型的变量,变量之间以逗号隔开例如,int i,j;,4-51,问题2:找出100200之间的素数,步骤0选择一个合适的数据类型来表示和这个问题有关的各种数据。因为素数的特点只适用于整数,因此在计算中选择整数数据类型。,4-52,步骤1,问题的最初设计。包含一个任

20、务:显示100200之间的素数。,4-53,显示位于100200之间的素数,步骤2,分解子任务:检查每个位于100到200之间的整数,如果是素数则显示出来。计数器控制的循环,4-54,显示位于100200之间的素数,初始化num=100,num=200?,显示素数,num=num+1,真,假,步骤3,分解“显示素数”子任务:判定当前的数字是否是素数,如果是素数就显示出来。任何位于100到200之间不是素数的数,至少有一个从2到14之间的除数。,4-55,显示素数,没有除数?,num是素数,将其显示,真,假,显示素数,用2到14之间的整数去除num,步骤3,步骤4,精炼“用2到14之间的整数去除

21、一个数”子任务:用2到14之间的所有整数去除当前的数,并且判断是否可以整除。计数器控制的循环结构。,4-56,divisor=14?,计算num/divisor,真,假,初始化除数divisor=2,divisor=divisor+1,用2到14之间的整数去除num,标志变量,如何记录某个数可以被2到14之间的整数整除?在内部循环开始之前,设标志变量prime为TRUE。如果在2到14之间找到了一个除数,设标志为FALSE,并跳出内部循环。内部循环结束后,如果prime保持为TRUE,就说明由外部循环产生的数没有除数,是素数。利用宏替换,定义两个符号名TRUE和FALSE,分别映射为1和0。,

22、4-57,C程序,#include#define FALSE 0#define TRUE 1int main()int num;int divisor;int prime;/*从100开始直到200*/for(num=100;num=200;num+)prime=TRUE;/*假设该数是素数*/*测试num是否是素数*/for(divisor=2;divisor=14;divisor+)if(num%divisor)=0)prime=FALSE;break;if(prime)printf(The number%d is primen,num);,4-58,问题3:计算字符串“int”出现的次数

23、,由键盘键入一行字符,计算这行字符包含多少个字符组合“int”。步骤0:需要处理由用户输入的字符数据。最适合的类型是字符类型,即char。实际上,对于输入一行字符,最好的表示方法是字符数组,或字符串。,4-59,步骤1,包括两个子任务:处理输入和输出结果,4-60,处理输入,输出结果,步骤2,分解“处理输入”子任务中由于一次只能读入用户输入的一个字符,并进行处理。该子任务需要一个字符接一个字符处理,直到到达一行字符的末尾采用标志控制的循环。末尾是换新行字符,即“n”。,4-61,处理输入,处理下一个字符,更多字符?,假,真,处理输入,步骤3,细化“处理下一个字符”。检查输入的字符,记录下是否连

24、续出现了“int”字符组合。,4-62,处理下一个字符,获得下一个字符,遇到i?,假,遇到n?,假,遇到t?,假,GotI=0,GotIN=0.,真,GotI=1.GotIN=0.,真,if GotIN,GotIN=0.if GotI,GotIN=1.GotI=0.,真,if GotIN,count+.GotI=0.GotIN=0.,GotI和GotIN:记录可能出现的3种状态在遇到字符i后,状态为GotI=1,GotIN=0;在遇到字符组合in后,状态为GotI=0,GotIN=1;在遇到字符组合int后,计数器count加1,且状态为GotI=0,GotIN=0;遇到其他字符组合,状态为G

25、otI=0,GotIN=0。,4-63,C程序,#include#define FALSE 0#define TRUE 1int main()char nextChar;/*字符串中的下一个字符*/int gotI=FALSE;/*表明i是否被找到*/int gotIN=FALSE;/*表明in是否被找到*/int count=0;/*记录次数*/printf(Enter your string:);doscanf(%c,4-64,switch(nextChar)case i:gotI=TRUE;gotIN=FALSE;break;case n:if(gotIN)gotIN=FALSE;if(

26、gotI)gotIN=TRUE;gotI=FALSE;break;case t:if(gotIN)count+;gotI=FALSE;gotIN=FALSE;break;default:gotI=FALSE;gotIN=FALSE;while(nextChar!=n);printf(count=%dn,count);,4-65,小结,一般不可能从一开始就知道所有的情况。当发现有困难的时候,不要轻易放弃。在碰到问题时(实际上这是大部分问题都会遇到的情况),应该看看是否能够理解问题中的某一部分,然后从这一点扩展出去。问题就像一道谜题,起初含糊,但是研究得越多,问题越容易被“击破”。一旦明白了这个问

27、题提供了什么条件,要求做什么,以及如何运行,就可以回到第一步重新开始系统的分解过程。,4-66,【一个小题目】,下面是一个C程序,其想要输出20个减号,不过,粗心的程序员把代码写错 了,你需要把下面的代码修改正确,不过,你只能增加或是修改其中的一个字符,请你给 出三种答案。int n=20;for(int i=0;in;i-)printf(-);,4-67,【1】int n=20;for(int i=0;-in;i-)printf(-);【2】int n=20;for(int i=0;in;n-)printf(-);【3】int n=20;for(int i=0;i+n;i-)printf(-

28、);,4-68,习题书面作业,4.1 当x等于0、1和2时,下列代码片段的输出各是什么?1)if(1=x=0)printf(“True.”);else printf(False.);2)if(1=x,4-69,4)if(x=0)printf(x equals 0n);else if(x=1)printf(x equals 1n);else printf(x does not equal 0 or 1n);5)switch(x)case 0:printf(x equals 0n);case 1:printf(x equals 1n);break;default:printf(x does not

29、 equal 0 or 1n);break;,4-70,4.2 下列代码片段的输出是什么?1)int i;int sum=0;for(i=1;i0)i-;printf(%d,i);,4-71,4)int i=1;int sum=0;do if(i%7=0)sum=sum+i;i+;while(sum0);printf(%d,i);,4.3 如下代码的输出是什么?int input;int i;int j;int sum=0;scanf(%d,4-72,4.4 如下代码的输出是什么?1)int i;int j;for(i=4;i=1;i-)for(j=1;j=i;j+)printf(#);for

30、(j=1;j=4-i;j+)printf(*);printf(n);,4-73,2)int i;for(i=1;i=5;i+)switch(i%5)case 0:printf(“*”);break;case 1:printf(“#”);break;default:printf(“n”);case 2:printf(“,4.5 改写如下代码片段,要求不使用continue语句,仍然实现这段代码的功能。for(i=1;i10;i+)if(i%2=0)continue;printf(%d,i);,4-74,习题上机作业,4.6 使用if-else语句,完成第三章习题:判断某个整数是否可以被7整除。4

31、.7 改写第三章图3.2中的程序,将条件表达式改为if-else语句:从键盘读入两个整数,将两个整数中较大的数输出。4.8 使用if-else语句,编写一个C程序:根据输入的月份数,输出该月份的天数。注意,2月的天数问题。4.9 编写一个C程序,计算如下函数:f(n)=f(n-1)+f(n-2)初始条件为:f(0)=1,f(1)=14.10 编写一个C程序,计算计算9的阶乘。要求使用while循环。,4-75,4.11 编写一个C程序:根据键盘输入的整数n,在第一行输出一个1,第二行输出2个2,第三行输出3个3,直到第n行输出n个n结束。例如,如果输入为4,则输出如下:12233 344 4 4,4-76,4.12 编写C程序:计算的近似值。可以使用如下级数展开式来计算的值。(要求项数n从键盘输入。)4.13 选做题编写C程序:从键盘输入一行字符,判断这行字符是否是合法的e-mail地址。合法的e-mail地址为:在前至少需要出现一个字母,在和句点之间至少一个字母,在句点后至少一个字母。,4-77,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号