程序设计语言初步二.ppt
《程序设计语言初步二.ppt》由会员分享,可在线阅读,更多相关《程序设计语言初步二.ppt(140页珍藏版)》请在三一办公上搜索。
1、1,2,4.1 算法的概念4.2 算法的三种基本结构4.3 算法的描述方法4.4 结构化程序设计方法4.5 算法设计实例研究,提纲,3,程序设计的目的和步骤算法的描述方式计算机算法及其特性,4.1 算法的概念,4,4.1 算法的概念,一.程序设计的目的计算机科学与技术学科的根本问题是:什么能够被有效地自动化;设计程序的根本目的:让计算机帮助人们自动地完成所要处理的复杂任务;程序设计两个核心问题:“做什么”与“怎么做”;其中需求分析解决“做什么”,程序设计解决“怎么做”。,5,4.1 算法的概念,二.程序设计两步走对复杂问题,直接写出能解决该问题的计算机程序是困难的,为此,人们在进行程序设计时分
2、两步走:1)算法设计:不使用程序设计语言,而使用一种较简单明了的表达方式(例如自然语言)设计出求解问题的步骤序列-算法。2)程序编写:根据设计并描述好的算法,使用某种程序设计语言编写对应于该算法的程序。,6,三.算法的概念算法:是解决问题的步骤序列(操作序列)。,4.1 算法的概念,起床穿衣、叠被去水房洗漱回宿舍放洗漱用品骑车去食堂排队买饭吃饭交回餐具骑车去教室,描述的是活动和过程,7:20前离开宿舍7:50前离开食堂8:00前进入教室,描述的是操作执行后的状态,通过状态的转移来描述所执行的操作。,可能的活动:起床、穿衣叠被、洗漱等,可能的活动:骑车到食堂、排队买饭、吃饭、交回餐具,7,4.1
3、 算法的概念,四.计算机算法及其特性什么是计算机可执行的操作;要在计算机能力集上进行算法设计;算法必须具备的五个特性:可执行性:算法中的每一个步骤都是计算机可执行的(在计算机能力集范围内);确定性:算法中的每一个步骤,必须是明确定义的,不得有任何歧义性;有穷性:算法必须在执行有穷步之后结束;有输入信息的说明:对加工对象提要求;有输出信息的步骤:至少要输出问题答案。,8,例1 求12910,即10!,算法思路:计算机能力集只提供两数相乘的运算。N!=N(N-1)!10!=10 9!=10 9 8!=10 9 8 7!=.=10 9 8 2 1!先计算1!、再计算2!=2*1!、再计算3!=3*2
4、!,以此类推,直到计算出10!=10*9!。使用变量p,9,例1 求12910,即10!,第一种算法:,S1(求2!):先求21,得到结果2并赋值给变量p;即:21p;,S2(求3!):将步骤S1得到的乘积p(p=2)再乘以3,得结果6并 赋值给变量p;即:3 pp;,S3(求4!):将p(p=6)再乘以4,得24并赋值给变量p;即:4pp;,S4(求5!):将p(p=24)再乘以5,得120并赋值给变量p;即:5pp;,S9(求10!):将p(p=362880)乘以10,得3628800,10pp;,10,#includemain()int p;p=2*1;/求2!赋值给p p=3*p;/求
5、3!赋值给p p=4*p;p=5*p;p=6*p;p=7*p;p=8*p;p=9*p;p=10*p;/求10!赋值给p printf(%d,p);system(pause);return 0;,评价:求10!需要写9个赋值操作,算法过于繁琐!试想:求1000!的算法,11,对算法进行抽象:核心操作就是两数相乘ipp,反复相乘10-1=9次,i初始值为2,p初始值为1,每相乘一次i的值加1。根据上述分析,本题可利用循环结构求解:第1次循环用于求2!,第2次循环在第1次循环基础上求3!,,第9次循环在第8次循环基础上求10!,例1 求12910,即10!,12,定义两个变量p和i,p代表阶乘结果,
6、i代表本次循环要求的是i!;,循环条件:i10,循环体:p=i*p;(求i!)i=i+1;,i!,(i-1)!,例1 求12910,即10!,初始化:i=2;p=1,由于本次循环求得的i*p的值将作为下次循环p的值,故本次循环将i*p赋值给p,为下一次循环做准备。,13,S1:使i=2;S2:使p=1;/*变量初始化*/S3:执行ip,乘积仍放在变量p中,即ip=p;S4:使i的值加1,即i+1=i;S5:如果i=10,返回重新执行步骤S3以及其后的步骤S4和S5;否则,算法结束。最后得到p的值就是10!的值。,求12910算法思路:,“迭代”和“循环”:在程序设计中,重复执行同样操作的过程称
7、为“迭代”。程序中被重复执行的程序段称为“循环”。,14,例1源程序,#include main()int n,i,p;/n:存储要求阶乘的数;p:存储求得的阶乘;printf(input n:n);scanf(%d,15,练习1:输入十个整数,求出最大值、最小值。算法思路:采用迭代计算的方法 以求最大值为例,即:Max(N1)=N1Max(N2,N1)=N1 if N2=N1Max(N3,N2,N1)=Max(N3,Max(N2,N1).Max(Nn,Nn-1,N2,N1)Max(Nn,Max(Nn-1,N2,N1),定义变量max来存储前n-1个整数的最大值。第n个数将和max比较,决定前
8、n个数的最大值。,整个问题就被转变为求9次两个数的最大值。每一次都是读入一个数,和之前求得的最大数再去比较。,16,循环条件:i10,循环体:读入第i个整数n;如果nmax,则max=n;否则,如果nmin,则min=n;i=i+1;,循环初始化:读入一整数n;minn;max=n;i2;,请写出本题源程序,17,源程序:输入十个整数,求出最大值、最小值,#include#define COUNT 10 main()int i,n,max,min;/i:循环计数;n:读取的数;/max:当前最大值;min:当前最小值 scanf(%d,/代表接下去要读取的是第2个数,18,源程序:输入十个整数
9、,求出最大值、最小值(续),while(i max)/求最大数 max=n;else if(n min)/求最小数 min=n;i=i+1;printf(max number is%d,max);printf(min number is%d,min);system(pause);return 0;,19,例2 输入120个学生的学号和成绩,要求将他们之中成绩在60分以上者的学号和成绩打印出来。,循环结束条件:已经处理了120个学生的信息。为了计数当前输入的是第几个学生的信息,可以引入变量i,用于表示当前处理的学生顺序。循环体:1:读入第i个学生的学号和成绩(抽象出变量num和score);2:
10、如果score 60,则打印num和score,否则不打印;3:i+1=i;,问题分析:就是反复输入处理每一个学生的信息,处理120次。,20,输入120个学生的学号和成绩,要求将他们之中成绩在60分以上者的学号和成绩打印出来。,S1:1=i;S2:读入第i个学生的学号和成绩分别到变量num和score中;S3:如果score 60,则打印num和score;S4:i+1=i;S5:如果i120,则返回S2,继续执行;否则,算法结束。,循环处理模式:处理本次循环要做的任务;为下一次循环做准备;,21,4.1 算法的概念,练习2:请写出本题对应的程序,22,4.1 算法的概念,#include
11、main()int no,total,count;/no:学号。total:总学生数。count:计数 float score;/成绩 printf(how many int numbers do you want to input:n);scanf(%d,return 0;,23,例3 一个大于或等于3的正整数,判断它是否为一个素数(质数)。,所谓质数,是指除了1和该数本身外,不能被其他任何整数整除的数。例如,13是素数(质数)。因为它不能被2,3,4,12整除。由于素数在当代的密码学中扮演了中心的作用,所以该问题具有重要意义。判断一个数n(n3)是否为质数:将n作为被除数,将2到(n-1)
12、各个整数依次作为除数,如果都不能被整除,则n为素数。,4.1 算法的概念,24,判断质数,看n能否被2到(n-1)之间的各个整数整除:,变量抽象:n:存放被判断的整数;i:存放除 数,取值为2,n-1;r:存放n/i得到的余数,循环体:n被i除,得余数r;即n mod i=r;如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束;否则i+1=i;,循环条件:i=n-1,循环初始化:i=2,问题:当r为0时如何退出循环,结束算法?,25,判断质数,设置一个标记变量isPrim,初始值为0,当r为0时使isPrim值为1,在循环条件中加入对该变量值的判断,以决定是否提前退出循环,循环体:n
13、被i除,得余数r;即n mod i=r;如果r=0,表示n能被i整除,则打印n“不是素数”,令isPrim=1;否则i+1=i;,循环条件:i=n-1&isPrim=0,循环初始化:i=2;isPrim=0;,26,S1:输入n的值;S2:i=2;/*i 是除数*/S3:n被i除,得余数r;即n mod i=rS4:如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束;否则执行S5;S5:i+1=i;S6:如果in-1,返回S3;否则,打印n“是素数”,算法结束。,n:被判断的整数;i:被除数;r:存放n/i得到的余数,事实上,i只需2到 之间的整数整除即可。,27,4.1 算法的概念
14、4.2 算法的三种基本结构4.3 算法的描述方法4.4 结构化程序设计方法4.5 算法设计实例研究,提纲,28,4.2 算法的三种基本结构,三种控制结构(Bohra和Jacopini)顺序结构、选择结构、循环结构 顺序结构,按书写顺序执行的语句构成的程序段。,29,选择结构,根据给定的表达式是否成立而选择执行操作A或操作B。如果表达式成立,则执行操作A;如果表达式不成立,则执行操作B。操作B可以为空。,4.2 算法的三种基本结构,30,当型循环结构,4.2 算法的三种基本结构,C语言无直到型循环结构。比较:直到型循环结构和C语言中的do-while结构?,直到型循环结构,31,三种控制结构的共
15、同点 只有一个入口(a处)只有一个出口(b处)结构内的每一个部分都有机会被执行到 结构内不存在“死循环”(无终止的循环),4.2 算法的三种基本结构,由这三种基本结构顺序组成的算法结构,可以解决任何复杂问题!,32,4.1 算法的概念4.2 算法的三种基本结构4.3 算法的描述方法4.4 结构化程序设计方法4.5 算法设计实例研究,提纲,33,4.3 算法的描述方法,用自然语言描述 用流程图描述 用N-S流程图描述 用伪码描述 用计算机语言描述,34,4.3 算法的描述方法自然语言,文字冗长;不严格,易产生歧义(二义性);不方便描述分支和循环结构;,35,4.3 算法的描述方法流程图,流程图的
16、基本元素(ANSI规定),起止框,输入/出框,判断框,处理框,流程线,连接点,注释框,36,4.3 算法的描述方法流程图,流程图描述的选择结构,37,当型循环结构,直到型循环结构,流程图描述的循环结构,4.3 算法的描述方法流程图,38,连接点(小圆圈):用于将画在不同地方的流程线连接起来,39,求10!流程图,使用当型循环结构描述,40,打印学生序号及成绩流程图,41,判断质数的流程图,使用直到型循环结构描述,判断r是否为0,条件成立则跳出循环,42,练习:将以上流程图改成用当型循环结构表示。,该流程图中循环结构有两个出口!违反单入单出原则!,如何改进?,43,改进后的流程图:单入单出,设置
17、标志位isPrim,44,传统流程图的弊端 对流程线的使用没有严格限制,阅读困难;不能保证算法结构的单入单出特性;占用篇幅较多;,4.3 算法的描述方法N-S流程图,必须限制箭头的滥用,让流程只能顺序执行下去!保证结构化原则的流程描述工具N-S图,45,基本结构,4.3 算法的描述方法N-S流程图,p、p1表示的是判断条件;A、B框是操作;注意:A、B框可以是一个简单的操作(如读入数据或打印输出等),也可以是三种基本结构之一,顺序结构,选择结构,当型循环结构,直到型循环结构,46,例1 求10!的N-S流程图,4.3 算法的描述方法N-S流程图,47,例2 打印学生成绩N-S流程图,4.3 算
18、法的描述方法N-S流程图,48,例3 判断质数的N-S流程图,4.3 算法的描述方法N-S流程图,49,4.3 算法的描述方法伪码描述,流程图和N-S图画起来比较费事,适合于表示算法,而在算法设计中使用不是很理想。伪码 用介于自然语言和程序设计语言之间的文字和符号来描述算法。,【返回】,IF x is positive THEN print x ELSE print y,WHILE i60 THEN print score i加1,50,4.3 算法的描述方法,例4:利用泰勒级数:,计算正弦的值,直到最后一项绝对值小于10-6 时为止。,分析:求n项和的算法思路Sum(a1)=a1Sum(a1
19、,a2)=Sum(a1)+a2=a1+a2Sum(a1,a2,a3)=Sum(a1,a2)+a3Sum(a1,a2,an)=Sum(a1,a2,an-1)+an,51,4.3 算法的描述方法,算法的核心操作是求两数之和,其中第一个操作数是前一次求得的和。如何求第二个操作数?算法1:n决定了第n项因子的值,即第二个操作数;因此每一次可根据当前n的值计算出第二个操作数。请用NS图描述出算法1。,52,求sin(x)算法1,i代表下一个p是第几项,因此初值是1,变量抽象:x:存储未知数x的值;sum:存储和;p:存储当前待加的因子;i:当前待加的是第几个因子,53,问题:任何数据类型只能表示一定范围
20、内的数,当试图往变量中存储在范围之外的数,数据无法正确存储。求x的n次方和(2n-1)!时可能会导致结果太大而溢出。解决方法:1.用浮点型变量来保存(2n-1)!的结果2.改进算法算法2,54,4.3 算法的描述方法,=,算法2:设第i项因子表示为,考察 和 的关系。,=*(-1)*x2/(2i-1)*(2i-2),55,请用NS图描述算法2。,4.3 算法的描述方法,【源程序演示】,i代表下一个p是第几项,因此初值是1,56,#include#includemain()int i;float x;double sum,p;/p用于存放待加的那一项printf(input x:);scanf(
21、%f,57,4.1 算法的概念4.2 算法的三种基本结构4.3 算法的描述方法4.4 结构化程序设计方法4.5 算法设计实例研究,提纲,58,源自于对goto语句的争论goto语句详见程序设计教程436页,4.4 结构化程序设计方法,59,#include main()int count=1;start:/标号,是跟有冒号的标识符 if(count10)goto end;printf(%d,count);count=count+1;goto start;end:printf(n);system(pause);return 0;,1 2 3 4 5 6 7 8 9 10请按任意键继续.,运行效果
22、:,60,4.4 结构化程序设计方法,用三种基本结构组成的程序必然是结构化的程序,这种程序便于编写、阅读、修改和维护。结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计方法的基本思想:采用分而治之的方法,将一个复杂问题分解为相对简单的一些子问题,然后针对这些子问题进行求解。如果某个子问题仍然是比较复杂的,再进一步分解为子-子问题,直到所有问题都能够求解。求解问题的过程是分阶段进行的,每个阶段处理的问题都控制在人们容易理解和处理的范围内(67个之内)。,61,4.4 结构化程序设计方法,结构化程序设计方法自顶向下;逐步细化;模块化设计(函数);结构化编码(三种基本结
23、构)。,62,例4.13 利用辗转相除法求两个正整数的最大公约数。辗转相除法求最大公约数的数学定义如下:GCD(x,y)=y|xy and x MOD y=0 GCD(y,x MOD y)|xy and x MOD y 0;说明:先判断x能否被y整除,若可以,则最大公约数就是除数y;否则,则将y 作为被除数,x MOD y 作为除数继续上面的操作,直到x能否被y整除为止。,GCD(6,4),GCD(4,2),=,=,2,=,GCD(124,6),最大公约数为2,例如:求GCD(124,6)的过程为:,63,算法1,2,交换变量x和y的值:,自顶向下,逐步细化,64,最终算法1,算法设计任务结束
24、的标准是各步骤已精细到能用语句描述,即满足算法的5大特征标志算法设计任务结束。,65,算法2,思考:能否不借助于变量r,而是xy;y x%y?或者y x%y;x y,66,练习3:设计算法,求一个正整数的长度。算法1:例如num=12345,求num的长度第1步:去掉最低位,num=1234,长度len=1第2步:去掉最低位,num=123,长度len=2第3步:去掉最低位,num=12,长度len=3第4步:去掉最低位,num=1,长度len=4第5步:去掉最低位,num=0,长度len=5,算法中每一步的核心操作是从num中去掉最低位,长度len加1,67,68,假设num长度不超过8,例
25、如num=12345,求num的长度算法2:试探能被10的几次方除后商不为0第1步:num/107=0第2步:num/106=0第3步:num/105=0第4步:num/104!=0,说明长度为4+15,算法中每一步的核心操作是试探:num除10i后商是否0,69,增加对输入为0的判断,进一步细化,70,练习4:输入一个不超过8位的正整数,要求把这个整数分解为单个数字,然后打印出每一个数字(每一个数字之间用两个空格分开)。例如用户输入了4200,程序打印结果为:4 2 0 0。设计算法。第1步:得到num最高位4并输出,num=200第2步:得到num最高位2并输出,num=0第3步:得到nu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计语言 初步
链接地址:https://www.31ppt.com/p-6393188.html