《计算机基础程序结构.ppt》由会员分享,可在线阅读,更多相关《计算机基础程序结构.ppt(77页珍藏版)》请在优知文库上搜索。
1、第四章第四章 结构化程序设计结构化程序设计和控制结构和控制结构结构化程序设计结构化程序设计 上个世纪六十年代末,结构化程序设计,软件发上个世纪六十年代末,结构化程序设计,软件发展的一个重要的里程碑。展的一个重要的里程碑。结构化程序设计的思路结构化程序设计的思路 将一个描述复杂的问题,系统地分解成足够小的和可管理将一个描述复杂的问题,系统地分解成足够小的和可管理的单元的单元/模块,从而最终可以编写成可以正确执行的程序。模块,从而最终可以编写成可以正确执行的程序。因为该机制是将一个大规模的工作,系统地分解因为该机制是将一个大规模的工作,系统地分解为更小的单元为更小的单元/模块,因此也被称为模块,因
2、此也被称为“系统分解系统分解”。4-2系统分解系统分解 系统分解实际上是执行任务的过程,即:对于一系统分解实际上是执行任务的过程,即:对于一个工作单元,将它分解成一组更小的单元,而这个工作单元,将它分解成一组更小的单元,而这组单元可以执行与大单元相同的任务。组单元可以执行与大单元相同的任务。这种思想实际就是:从一个大的、复杂的任务开这种思想实际就是:从一个大的、复杂的任务开始,逐步将之分解到非常小的单元,对于这些小始,逐步将之分解到非常小的单元,对于这些小单元来说,是很容易编写出程序来执行的。单元来说,是很容易编写出程序来执行的。既然该过程是一步一步被应用,而每一步都是将既然该过程是一步一步被
3、应用,而每一步都是将一个相对复杂的任务精炼成一组更简单的子任务一个相对复杂的任务精炼成一组更简单的子任务,那么这种过程也可以称为,那么这种过程也可以称为“逐步求精逐步求精”。4-3三种结构:顺序,条件,重复三种结构:顺序,条件,重复 系统分解思想使用三种基本的控制结构来分解一系统分解思想使用三种基本的控制结构来分解一个大规模的任务,这三种基本结构是:顺序,条个大规模的任务,这三种基本结构是:顺序,条件和重复。件和重复。4-4顺序结构顺序结构 顺序结构,就是将一个指定的任务分解成两个子顺序结构,就是将一个指定的任务分解成两个子任务,一个接着一个。也就是说,当执行完第一任务,一个接着一个。也就是说
4、,当执行完第一个子任务之后再继续执行下一个子任务个子任务之后再继续执行下一个子任务而从而从第二个子任务返回第一个子任务的情况永远不会第二个子任务返回第一个子任务的情况永远不会发生。发生。长度单位换算的问题长度单位换算的问题4-5执 行 第 1部分(b)顺序执 行 第 2部分条件结构条件结构 条件结构,又称判定结构,根据条件的不同每次条件结构,又称判定结构,根据条件的不同每次只执行两个子任务中的其中一个。只执行两个子任务中的其中一个。当条件为真时,执行某一个子任务,若为假则执行另一个当条件为真时,执行某一个子任务,若为假则执行另一个。任何一个子任务都可以为空,也就是说,它可以任何一个子任务都可以
5、为空,也就是说,它可以“什么都什么都不做不做”。但不管结果如何,当正确的子任务执行完后,程但不管结果如何,当正确的子任务执行完后,程序始终向前行进,永远不会回头去再次测试条件序始终向前行进,永远不会回头去再次测试条件。4-6子任务1(c)条件子任务2测试条件真假重复结构重复结构 重复结构,又称循环结构,只要条件为真就需要重复结构,又称循环结构,只要条件为真就需要将某一个子任务多次执行时就将使用这种程序结将某一个子任务多次执行时就将使用这种程序结构。构。当条件为真,执行这一子任务;子任务执行结束当条件为真,执行这一子任务;子任务执行结束后,回头再次检测条件是否为真。后,回头再次检测条件是否为真。
6、只要被测试的条件为真,程序就会继续执行这一只要被测试的条件为真,程序就会继续执行这一相同子任务。一旦条件不为真,程序就向前行进相同子任务。一旦条件不为真,程序就向前行进。4-7子任务(d)重复测试条件真假4-8控制结构控制结构条件条件ifif-elseswitch重复重复whilefordo-while4-9ifif(condition)action;conditionactionTFCondition,一个C表达式,TRUE(non-zero)或 FALSE(zero).Action,一条C语句,简单语句或复合语句.4-10示例示例if(x=10)y=x*x+5;if(x=10)y=x*x+
7、5;z=(2*y)/3;if(x=10)y=x*x+5;z=(2*y)/3;复合语句;如果 x=10,都执行如果x=10,执行第一条;第二条语句总会执行换行和缩进风格换行和缩进风格 if语句通行的换行和缩进风格。语句通行的换行和缩进风格。这样的编程风格使得阅读该段代码的人能够很快这样的编程风格使得阅读该段代码的人能够很快的识别出如果条件成立将被执行的部分。请记住的识别出如果条件成立将被执行的部分。请记住,风格只是增强了代码的可读性,并不影响程序,风格只是增强了代码的可读性,并不影响程序的执行。的执行。4-114-12更多示例更多示例if(temperature=0)printf(At or b
8、elow 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-14if嵌套嵌套if(x=3)if(y!=6)z=z+1;w=w+2;if(x=3)&(y!=6)z=z+1;w=w+2;等价于等价于4-15if-elseif(condition)act
9、ion_if;else action_else;conditionaction_ifaction_elseTF示例示例if(temperature=0)printf(At or below freeing point.n);elseprintf(Above freezing.n);等价于等价于if(temperature0)printf(Above freeing.n);4-16示例示例if(x)y+;z-;else y-;z+;4-17成绩等级换算成绩等级换算级联的级联的if-else#include int main()char grade;/*成绩等级成绩等级*/*获得输入值获得输入值*
10、/printf(“Enter the grade:”);scanf(%c,&grade);/*执行换算执行换算*/if(grade=A)printf(90100n);else if(grade=B)printf(8089n);else if(grade=C)printf(7079n);else if(grade=D)printf(6069n);else if(grade=E)printf(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;不同于 使用大括号结合语句使用大
11、括号结合语句 条件表达式:条件表达式:x?y:z4-20if-else:错误检查:错误检查#include int main()int dividend;int divisor;int result;printf(Enter the dividend:);scanf(%d,÷nd);printf(Enter the divisor:);scanf(%d,&divisor);if(divisor!=0)result=dividend/divisor;printf(The result of the division is%d.n,result);elseprintf(A diviso
12、r of zero is not allowed.n);4-214-22whilewhile(test)loop_body;testloop_bodyTF在条件为真的情况下重复执行一个语句。在在条件为真的情况下重复执行一个语句。在每次重复执行这个语句之前,都要先检查条每次重复执行这个语句之前,都要先检查条件。如果条件的值为逻辑真(非零),语句件。如果条件的值为逻辑真(非零),语句将被再次执行。将被再次执行。示例示例#include int main()int i=0;while(i10)printf(%d,i);i=i+1;while语句适用于使用语句适用于使用标志控制标志控制的循环。的循环。
13、事先并不知道重复的次数,只知道循环需要继续直到某个事先并不知道重复的次数,只知道循环需要继续直到某个事件(即标志)发生。事件(即标志)发生。4-234-24无限循环无限循环#include int main()int i=0;while(i10)printf(%d,i);4-25forfor(init;end-test;re-init)statementinittestloop_bodyre-initFTfor for循环,适用于循环,适用于记数器控制记数器控制的循环。的循环。for循环是循环是while循环的一种特殊情况,它适用于事循环的一种特殊情况,它适用于事先知道重复次数的情况。先知道重
14、复次数的情况。for循环可以使用循环可以使用while循环来构造(反之亦然)循环来构造(反之亦然)#include int main()int i;for(i=0;i10;i+)printf(%d,i);4-264-27示例示例/*-这个循环会输出什么?这个循环会输出什么?-*/for(i=0;i=10;i+)printf(“%d”,i);计算计算9的阶乘的阶乘#include int main()int i;int result=1;for(i=9;i1;i-)result=result*i;4-28常见错误常见错误result=1;for(i=9;i1;i-);result=result*
15、i;printf(result=%dn,result);printf(i=%dn,i);4-294-30循环嵌套循环嵌套#include int main()int multiplicand;/*被乘数被乘数*/int multiplier;/*乘数乘数*/*外层循环外层循环*/for(multiplier=1;multiplier10;multiplier+)/*内部循环内部循环*/for(multiplicand=1;multiplicand=multiplier;multiplicand+)printf(%d*%d=%dt,multiplicand,multiplier,multipli
16、cand*multiplier);printf(n);“t”,制表符,制表符4-31do-whiledo loop_body;while(test);loop_bodytestTF在循环体被执行一次之后再计算在循环体被执行一次之后再计算条件表达式的值条件表达式的值示例示例i=0;do printf(%dn,i);i=i+1;while(i 10);4-32编程风格编程风格 对于以上三种类型的重复结构,哪些情况下采用对于以上三种类型的重复结构,哪些情况下采用while,哪些情况采用,哪些情况采用for,哪些情况采用,哪些情况采用do-while?在大部分情况下,这三种结构可以互换使用。在大部分情况下,这三种结构可以互换使用。区别在于编程风格:为了提高代码的可读性,更区别在于编程风格:为了提高代码的可读性,更好的将循环的目的传达给阅读代码的人,而选择好的将循环的目的传达给阅读代码的人,而选择恰当的结构。恰当的结构。4-334-34switchswitch(expression)case const1:action1;break;case const2:action2;break;defau