c语言-简单的程序设计.ppt

上传人:max****ui 文档编号:3377349 上传时间:2019-12-12 格式:PPT 页数:51 大小:841.50KB
返回 下载 相关 举报
c语言-简单的程序设计.ppt_第1页
第1页 / 共51页
c语言-简单的程序设计.ppt_第2页
第2页 / 共51页
c语言-简单的程序设计.ppt_第3页
第3页 / 共51页
点击查看更多>>
资源描述
1,存储相关的单位有哪些?程序中如何使用内存空间进行数据存储的?C语言中都能处理哪些数据?每种数据具有哪些特点?程序中如何使用数据?(声明,初始化,赋值),复习,第三章,简单程序设计,3,导入,要想借助C语言来辅助我们解决问题,至少需要解决两方面的问题,一是根据问题需求的描述,找出解决问题的方法或步骤,即设计算法。二是C语言实现算法,最终解决问题。当我们使用C语言编写程序辅助解决问题时,一定是先在脑海里形成问题的处理逻辑,并把其步骤化后,才能够使用C语言编程实现。可见解决问题方法的设计和描述在程序设计中的重要作用,方法是整个过程的核心和灵魂,而好的描述方式则对后面的编程实现有着非常大的帮助,程序设计则是方法的实现工具。这些具体的方法和步骤,其实就是解决一个问题的算法。根据算法,依据各种规则编写计算机执行的命令序列,就是编制程序,而书写时需要遵守的规则即为语言的语法。本章将重点介绍算法的概念和描述方式,常用的输入输出语句,以及在此基础上的简单顺序C程序设计。,4,本章目标,理解算法,程序,数据在程序设计中的作用掌握算法的常用表示方式(流程图,伪代码)认识三种基本程序设计结构掌握常见的输入输出语句的使用方法练习编写简单的顺序结构程序,5,算法的概念,算法(Algorithm)是指完成一个任务所需要的具体步骤和方法。给定初始状态或输入数据,依据算法能够得出所要求或期望的终止状态或输出数据。或者说依据算法能够对一定规范的输入,在有限时间内获得所要求的输出。DonaldKnuth在他的著作TheArtofComputerProgramming里对算法下的定义:1.输入:一个算法必须有零个或以上输入量。2.输出:一个算法应有一个或以上输出量,输出量是算法计算的结果。3.明确性:算法的描述必须无歧义,以保证算法的实际执行结果是精确地符合要求或期望,通常要求实际运行结果是确定的。4.有限性:算法必须在有限个步骤内完成任务。5.有效性:又称可行性。能够实现,算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。,6,算法的概念,算法是计算机处理信息的本质,因为计算机程序本质上是通过一个算法来告诉计算机确切的步骤来执行一个指定的任务,如计算职工的薪水或打印学生的成绩单。需要说明的是,不是只有计算问题才有算法。例如,加工一张写字台,其加工顺序是:桌腿桌面抽屉组装,这就是加工这张写字台的算法。当然,如果是按“抽屉桌面桌腿组装”这样的顺序加工,那就是加工这张写字台有另一种算法,这其中没有计算问题。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。,7,算法的分类,通常计算机算法分为两大类:数值运算算法和非数值运算算法。数值运算是指对问题求数值解,例如对微分方程求解、对函数的定积分求解等,都属于数值运算范围。非数值运算包括非常广泛的领域,例如资料检索、事务管理、数据处理等。数值运算有确定的数学模型,一般都有比较成熟的算法。许多常用算法通常还会被编写成通用程序并汇编成各种程序库的形式,用户需要时可直接调用。例如数学程序库、数学软件包等。非数值运算的种类繁多,要求不一,很难提供统一规范的算法,更多的非数值运算是需要用户设计的。数据结构+算法=程序。算法是对程序控制结构的描述,是程序设计的灵魂,而数据结构是对程序中数据的描述。算法的处理对象必然是问题中所涉及到的相关数据,不能离开数据结构去抽象地分析程序的算法,也不能脱离算法去孤立地研究程序的数据结构,而只能从算法和数据结构的统一上去认识程序。,8,算法示例,例:有黑和蓝两个墨水瓶,但却错把黑墨水装在了蓝墨水瓶子里,而蓝墨水错装在了黑墨水瓶子里,要求编写算法实现将其互换。算法分析:这是一个非数值运算问题。因为两个瓶子的墨水不能直接交换,所以,解决这一问题的关键是需要引入第三个墨水瓶。设第三个墨水瓶为白色,其交换步骤如下:将黑瓶中的蓝墨水装入白瓶中;将蓝瓶中的黑墨水装入黑瓶中;将白瓶中的蓝墨水装入蓝瓶中;交换结束。上述的四个步骤即为解决此问题的算法,9,算法示例,例:计算长方形的面积(想法=算法?)写程序前需要清楚“做什么”和“怎么做”。“做什么”:主要从需求任务中获取,目标明确“怎么做”:包括两方面内容,一是做哪些事情才能达到解决问题的目的,二是做事情的先后顺序。算法解决的是“怎么做”的问题,1.接收用户输入的长方形长度和宽度两个值;2.判断长度和宽度的值是否大于零;3.如果大于零,将长度和宽度两个值相乘得到面积否则显示输入错误;4.显示面积。,算法,10,算法的表示,算法的基本特征是确定性,要求用一种精确的无歧义的描述语言对算法进行描述。因此,一个好的算法表达工具无论对算法的设计、描述、实现、程序的维护都必不可少。编程实现的细节是初学程序设计者的重点,随着学习的深入,算法才是整个程序设计的灵魂,也是程序员相互交流最多的问题。算法不同于程序,只是解决问题核心步骤的描述,并不包括程序设计的细节部分,需要采用合理的,大家都能看懂的方式表达出来。三种常见的表示方式1、自然语言表示2、流程图(传统流程图和N-S流程图)3、伪代码,11,算法的表示,用自然语言表示算法。通俗易懂,容易产生歧义,和程序设计语言相差太远。一般不使用用流程图表示算法。使用各种图框来表示解决问题的流程;美国ANSI提出的;直观形象,易于理解,建议初学者多使用。用N-S流程图表示算法。新的流程图形式,但由于老程序员大都习惯传统流程图,故未得到推广。用伪代码表示算法。伪代码是使用介于自然语言和计算机语言之间的文字和符号来描述算法无固定严格的语法要求,表达清楚既可。随着学习的深入,程序员自然就会习惯用此方法描述算法,12,传统流程图,所谓流程图,就是对给定算法的一种图形解法。流程图又称为框图,它用规定的一系列图形、流程线及文字说明来表示算法中的基本操作和控制流程,其优点是形象直观、简单易懂、便于修改和交流。美国国家标准化协会ANSI规定了一些常用的符号,表1-1中分别列出了标准的流程图符号的名称、表示和功能。这些符号已被世界各国的广大程序设计工作者普遍接受和采用。,13,传统流程图,14,传统流程图,15,常见算法举例穷举法,穷举法也称为枚举法,它的基本思想是:首先根据问题的部分条件预估答案的范围,然后在此范围内对所有可能的情况进行逐一验证,直到全部情况均通过了验证为止。若某个情况使验证符合题目的全部条件,则该情况为本题的一个答案;若全部情况验证结果均不符合题目的全部条件,则说明该题无答案。在实际应用问题中,许多问题需要用穷举法来解决。中国古代数学家张丘建在他的算经中曾提出著名的“百钱百鸡问题”,其题目如下:例题1-4:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?,16,常见算法举例穷举法,据题意可知,x、y、z的范围一定是0到100的正整数,那么,最简单的解题方法是:假设一组x、y、z的值,直接带入方程组求解,即在各个变量的取值范围内不断变化x、y、z的值,穷举x、y、z全部可能的组合,若满足方程组则是一组解。这样即可得到问题的全部解。可见,利用枚举法解题需要以下步骤:(1)分析题目,确定答案的大致范围。(2)确定列举方法。常用的列举方法有:顺序列举,排列列举和组合列举。(3)作试验,直到遍历所有情况。(4)试验完后可能找到与题目要求完全一致的一组或多组答案,也可能没找到答案,即证明题目无答案。枚举法的特点是算法简单,容易理解,但运算量较大。对于可确定取值范围但又找不到其它更好的算法时,就可以用枚举法。通常枚举法用来解决有几种组合、是否存在、求解不定方程等类型的问题。枚举法设计算法多以循环控制结构实现。,17,常见算法举例穷举法,这是程序设计中常用的两种算法,都是利用某些公式的递推性。最常见的例子是计算级数,一般给出数列后项与前项的递推公式,要求计算数列通项。例如:(1)f1(n)=2+f1(n-1),f1(1)=1f1(n)=1,3,5,7,这是首项为1公差为2的等差数列(等差级数)。(2)f2(n)=2f2(n-1),f2(1)=1f2(n)=1,2,4,8,这是首项为1公比为2的等比数列。(3)f3(n)=nf3(n-1),f3(1)=1f3(n)=1,2,6,24,这个数列的通项f3(n)=n!。(4)f4(n)=f4(n-1)+f4(n-2),f4(1)=1,f4(2)=1f4(n)=1,1,2,3,这就是有名的斐波那契数列。以上数列的共同特点是,在数列的未知项与已知项之间存在着一定关系,借助于已知项和这一关系,就可逐项求出未知项。计算这些数列通常用递推和递归两种算法。,18,常见算法举例分治法,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序)。分治法在高级语言中主要的一个思想是递归,在每一层递归上都有三个步骤:1.分解:将原问题分解为若干个规模较小,相对独立,与原问题形式相同的子问题。2.解决:若子问题规模较小且易于解决时,则直接解。否则,递归地解决各子问题。3.合并:将各子问题的解合并为原问题的解。,19,常见算法举例分治法,16枚硬币,其中有15枚重量相等,1枚是假币,较轻,你的任务是找出哪一枚是假币。为了完成任务,可以借助天平来进行比较。方法1:拿一枚去与其他15枚比较,最多15次就能出结果。方法2:分8组,每组2枚,每组比较一次,最多8次即可得出结果。方法3:先分2组,每组8枚;对较轻的一组再分为2组,每组4枚;对较轻的一组再分为2组,每组2枚,对较轻的一组进行比较,得出结果。分而治之的方法有时候也解释为将大的问题分解为若干个相对独立的小问题(小问题不一定与大问题同质),然后分别求出小问题的解,最后组合为整个问题的解。,20,C语句概述,表达式语句、流程控制语句、复合语句和空语句表达式语句:一个表达式及紧跟其后的分号构成,用于执行一些基本操作;如赋值语句,函数调用语句等。例如,max=a是赋值表达式,而max=a;就构成了赋值语句。printf(%d,a)是函数表达式,而printf(%d,a);是函数调用语句。x+y是算术表达式,而x+y;是语句。尽管x+y;无实际意义,实际编程中并不采用它,但x+y;的确是合法语句。流程控制语句:能够影响其他语句执行次序。分为选择结构语句和循环语句,将分别在第四章和第五章进行介绍。例如:if(ab)max=a;elsemax=b;,21,C语句概述,复合语句:用一对大括号括起一条或多条语句,称为复合语句。复合语句的一对大括号中无论有多少语句,复合语句只视为一条语句。例如,t=a;a=b;b=t;是复合语句,是一条语句,所以执行复合语句实际是执行该复合语句一对大括号中所有语句。注意,复合语句的“”后面不能出现分号,而“”前复合语句中最后一条语句的分号不能省略。如下面两种写法均是错误的复合语句:t=a;a=b;b=t;;t=a;a=b;b=t空语句:空语句由一个分号组成,它表示什么操作也不做。从语法上讲,它的确是一条语句。在程序设计中,若某处从语法上需要一条语句,而实际上不需要执行任何操作时就可以使用它。例如,在设计循环结构时,有时用到空语句。,22,赋值语句,1、简单赋值语句2、复合赋值语句二元运算符可以简写,+=-=*=/=%=3、赋值过程中的类型转换1)实型数据赋给整型变量2)整型数据赋给实型变量3)double型数据赋给float型变量4)float型数据赋给double型变量5)字符型数据赋给整型变量6)整型数据赋给字符型变量,23,函数调用语句,例如math.h头文件里包含了数学函数相关的类库:doublepow(doublex,doublen)其功能为计算x的n次幂,返回结果为double型假设主程序中有double型变量x,并已经赋初值,double型变量n,并已赋初值,则如果想调用pow函数计算x的n次幂,则使用范例如下:#includevoidmain()doublex=2,n=3,result=0;result=pow(x,n);功能描述-函数功能的说明返回值类型-函数调用后的结果类型,如果非空,通常在主程序中使用类型匹配的变量捕获函数调用后的返回值函数名-按名调用参数列表-需要处理的变量说明。函数对一定的数据进行处理,产生一定的结果输出。,24,语句块,为了说明一连串的语句是一个执行的整体,可将这些语句放在一对大括号里面,形成一个语句块。每个主程序本身就是一个语句块。一个语句块中的语句常常根据上下文的关系有不同程度的缩进,这些缩进本身对于程序的编译和执行没有影响,但恰当的缩进会使得程序结构更清晰易读。关于分号:分号是简单语句的结束符。语句块的开始大括号和结束大括号后都不要加分号。,25,数据的输入输出,(一).所谓输入输出是以计算机主机为主体而言的输出:从计算机向输出设备(显示器,打印机)输出数据输入:从输入设备(键盘,鼠标,扫描仪)向计算机输入数据.(二).C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的。示例如下:字符输入函数:getchar字符输出函数:putchar格式输入函数:scanf格式输出函数:printf在调用标准输入输出库函数时,文件开头应该有:#include,26,字符数据的输入输出,1、putchar()函数输出一个字符函数原型为:voidputchar(intc)调用方式为:putchar(c);/将c变量以字符形式输出到终端显示设备,变量c可以是字符型变量或者整型变量示例:intch1=97;charch2=a;putchar(ch1);putchar(n);putchar(ch2);,27,字符数据的输入输出,2、用getchar函数输入一个字符函数原型为:intgetchar()调用方式为:charch=getchar();/作用是将终端键盘输入的第一个字符保存到char型变量ch中示例:charch1;ch1=getchar();printf(“ch1=%cn”,ch1);,28,字符数据的输入输出,例3.4输入单个字符。#includevoidmain()charc;c=getchar();putchar(c);putchar(n);,29,简单的格式输出,1、用简单的printf函数输出数据printf函数(格式输出函数)的作用是向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据。printf函数的一般调用格式为:printf(格式控制,输出表列)/一一对应格式控制-是用双撇号括起来的字符串,它包括两种信息。格式说明。格式说明由“”和格式字符组成,如%d、%f、%c等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。普通字符。普通字符即原样输出的字符。例如上面printf函数中双撇号内的“a=”、逗号、空格和换行符。输出表列-输出变量的列表,多个变量间用逗号分隔,这些变量将格式控制字符串中的格式控制符形成一一对应的关系,即第一个变量将会根据第一个格式控制字符指定的形式输出,输出时替换第一个格式控制符,以此类推,有多少格式控制符,后面就应该有多少个变量,同时要注意格式控制符和变量类型的匹配。,30,简单的格式输出,printf函数的例子:printf(“a=%d,b=%fn,a,b);,函数名,输出表列,普通字符,若a=3,b=4输出为a=3,b=4,31,简单的格式输出,基本的格式字符有以下几种(1)%d:以十进制整型数据形式输出变量的值,通常对应整型变量。(2)%c:以字符形式输出变量的值,通常对应char型变量或小于255的整型变量。(3)%f:以浮点型数据形式输出变量的值,默认保留小数点后6位,通常对应float型和double型变量(4)%s:输出字符串(后面介绍)(5)%e:以指数形式输出变量的值,通常对应浮点型数据。(少用),32,简单的格式输出,例3.5字符数据的输出。#includevoidmain()charc=a;inti=97;printf(%c,%dn,c,c);printf(%c,%dn,i,i);,运行结果:,,33,简单的格式输出,例3.6输出实数时的有效位数。#includevoidmain()floatx,y;x=111111.111;y=222222.222;printf(%fn,x+y);,运行结果:.,结果中只有前七位是有效数字。由于x和y是单精度变量,所以x+y也只能保证7位的精度,后面几位是没有意义的。,34,简单的格式输出,例3.7输出双精度数时的有效位数。#includevoidmain()doublex,y;x=11111111.11111111;y=22222222.22222222;printf(%fn,x+y);,运行结果:33333333.333333,x和y是双精度变量,能提供16位精度,但是由于用%f格式输出,默认只能输出6位小数,有两位被省掉了。,35,重要复杂格式输出,%md,m指定了输出数据占的宽度,当位数小于m时右对齐,大于时按实际位数输出%-md,同上,只是对齐方式变为左对齐%m.nf,指定输出的实数共占列,其中有位小数。如果数值长度小于,则左端补空格。%-m.nf与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。%.nf,只要求小数点后保存n位,整数部分按实际输出以上方式通常用于格式化输出一组数据对齐,36,例3.14输出实数时指定小数位数。#includevoidmain()floatf=123.456;printf(“%f,%10f,%10.2f,%.2f%,-10.2fn”,f,f,f,f,f);,运行结果:123.456001,123.456001,123.46,123.46123.46,复杂格式输出,37,例3.15求3个圆的周长,输出结果时上下按小数点对齐,取两位小数。#include#definePI3.1415926voidmain()doubler1=1.53,r2=21.83,r3=123.71,s1,s2,s3;s1=2.0*PI*r1;s2=2.0*PI*r2;s3=2.0*PI*r3;printf(r1=%10.2fnr2=%10.2fnr3=%10.2fn,r1,r2,r3);,运行结果:r1=1.53r2=21.83r3=123.71,38,简单的格式输入,用简单的scanf函数输入数据scanf函数作用:按照变量在内存的地址将变量值存进去。一般格式:scanf(格式控制,地址表列)注意:scanf格式控制字符串中的普通字符要再输入的时候原样输入,如写scanf(“a=%d”,则在输入的时候要先写a=然后再给出要存储到变量a中的数据,即要通过键盘将数值5赋给a,则要输入“a=5”对于连续的数值输入,如语句“scanf(“%d%d%f%fn”,floatb;scanf(“%d%f,函数名,地址表列,一一对应,40,简单的格式输入,例3.8用scanf函数输入数据。#includevoidmain()inta,b,c;scanf(“%d%d%d”,运行情况:345(输入a,b,c的值,)3,4,5(输出a,b,c的值)a=3,b=4,c=53,4,5,41,简单的格式输入,修改程序,分析问题原因,#includevoidmain()inta,b,c;scanf(“%d%d%dn”,42,简单的格式输入,说明:(1)scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。(2)scanf语句中得格式控制字符串内一般只有格式控制符,不添加其他普通字符,如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符,一般格式控制字符串内不要有n。(3)在用“”格式输入字符时,空格字符和“转义字符”都作为有效字符输入,如果程序中有多个scanf语句进行字符输入,建议在每个scanf语句前加入语句“fflush(stdin);”,即先清空输入缓冲区,以避免前面输入产生的回车换行等字符产生影响。(4)在输入数据时,空格,“回车”、“跳格”(Tab)键或遇非法输入,认为该数据结束。(5)scanf中,输入float型数据,使用%f,而输入double型数据,需要使用%lf,而输出则统一用%f,43,程序设计的三种基本结构,顺序结构。各操作步骤是顺序执行的,是最简单的一种结构。所有语句按照排列的先后顺序,依次执行。选择结构。又称判断结构或者分支结构,根据是否满足条件而从两组操作中选择一种操作。此结构中必包含一个判断条件,根据给定条件是否成立而选择执行哪组操作,并且只执行一组操作教务系统学生,教师,教务人员,系部工作人员;循环结构。又称重复结构,即在一定条件下反复执行某一部分的操作。当给定条件p(如计数器n100;n初值为0)满足时执行一组操作,执行完后,条件p做相应的处理,再次判断条件p是否成立,如果成立则继续执行,否则退出。如往一个盒子里装球直到盒满例如word里的统计字数操作,打印5000个*构成图案的操作,44,程序设计的三种基本结构,45,三种结构总结,一个良好的程序,无论多么复杂,都可以由这3种基本结构组成。C语言提供了实现三种基本结构的语句,如用if语句可以实现选择结构,用for和while可以实现循环结构C语言属于结构化语言,面向过程的语言,46,顺序结构,顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。例如;a=3,b=5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为:c=a;a=b;b=c;执行结果是a=5,b=c=3如果改变其顺序,写成:a=b;c=a;b=c;则执行结果就变成a=b=c=5,不能达到预期的目的,初学者最容易犯这种错误。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三部曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s=3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。,47,顺序结构程序设计举例,例3.13输入三角形的三边长,求三角形面积。假设:三个边长a,b,c能构成三角形。已知面积公式:area=s=(a+b+c)/2,48,顺序结构程序设计举例,#include#includevoidmain()floata,b,c,s,area;scanf(“%f,%f,%f,数学函数库因为要用到其中的sqrt函数,49,顺序结构程序设计举例,例从键盘输入一个大写字母,要求改用小写字母输出。#includevoidmain()charc1,c2;c1=getchar();printf(%c,%dn,c1,c1);c2=c1+32;printf(%c,%dn,c2,c2);,运行情况:,,50,顺序结构程序设计举例,例3.15求x2方程的根。a,b,c由键盘输入,设。众所周知,一元二次方程式的根为x1=x2=可以将上面的分式分为两项:p=,q=x1=p+q,x2=p-q,51,顺序结构程序设计举例,#include#includevoidmain()floata,b,c,disc,x1,x2,p,q;scanf(a=%f,b=%f,c=%f,运行情况:,,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!