c语言--简单的程序设计.ppt_第1页
c语言--简单的程序设计.ppt_第2页
c语言--简单的程序设计.ppt_第3页
c语言--简单的程序设计.ppt_第4页
c语言--简单的程序设计.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,存储相关的单位有哪些? 程序中如何使用内存空间进行数据存储的? C语言中都能处理哪些数据?每种数据具有哪些特点? 程序中如何使用数据?(声明,初始化,赋值),复习,第三章,简单程序设计,3,导入,要想借助C语言来辅助我们解决问题,至少需要解决两方面的问题,一是根据问题需求的描述,找出解决问题的方法或步骤,即设计算法。二是C语言实现算法,最终解决问题。 当我们使用C语言编写程序辅助解决问题时,一定是先在脑海里形成问题的处理逻辑,并把其步骤化后,才能够使用C语言编程实现。可见解决问题方法的设计和描述在程序设计中的重要作用,方法是整个过程的核心和灵魂,而好的描述方式则对后面的编程实现有着非常大的帮助,程序设计则是方法的实现工具。 这些具体的方法和步骤,其实就是解决一个问题的算法。根据算法,依据各种规则编写计算机执行的命令序列,就是编制程序,而书写时需要遵守的规则即为语言的语法。 本章将重点介绍算法的概念和描述方式,常用的输入输出语句,以及在此基础上的简单顺序C程序设计。,4,本章目标,理解算法,程序,数据在程序设计中的作用 掌握算法的常用表示方式(流程图,伪代码) 认识三种基本程序设计结构 掌握常见的输入输出语句的使用方法 练习编写简单的顺序结构程序,5,算法的概念,算法(Algorithm)是指完成一个任务所需要的具体步骤和方法。给定初始状态或输入数据,依据算法能够得出所要求或期望的终止状态或输出数据。或者说依据算法能够对一定规范的输入,在有限时间内获得所要求的输出。 Donald Knuth在他的著作The Art of Computer Programming里对算法下的定义: 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)=1 f1(n)=1,3,5,7, 这是首项为1公差为2的等差数列(等差级数)。 (2)f2(n)=2 f2(n-1),f2(1)=1 f2(n)=1,2,4,8, 这是首项为1公比为2的等比数列。 (3)f3(n)=n f3(n-1),f3(1)=1 f3(n)=1,2,6,24, 这个数列的通项f3(n)=n!。 (4)f4(n)= f4(n-1)+ f4(n-2),f4(1)=1,f4(2)=1 f4(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; else max=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头文件里包含了数学函数相关的类库: double pow(double x, double n) 其功能为计算x的n次幂,返回结果为double型 假设主程序中有double型变量x,并已经赋初值,double型变量n,并已赋初值,则如果想调用pow函数计算x的n次幂,则使用范例如下: #include void main() double x = 2,n = 3, result = 0; result = pow(x, n); 功能描述 - 函数功能的说明 返回值类型 - 函数调用后的结果类型,如果非空,通常在主程序中使用类型匹配的变量捕获函数调用后的返回值 函数名 - 按名调用 参数列表 - 需要处理的变量说明。函数对一定的数据进行处理,产生一定的结果输出。,24,语句块,为了说明一连串的语句是一个执行的整体,可将这些语句放在一对大括号里面,形成一个语句块。 每个主程序本身就是一个语句块。 一个语句块中的语句常常根据上下文的关系有不同程度的缩进,这些缩进本身对于程序的编译和执行没有影响,但恰当的缩进会使得程序结构更清晰易读。 关于分号:分号是简单语句的结束符。语句块的开始大括号和结束大括号后都不要加分号。,25,数据的输入输出,(一).所谓输入输出是以计算机主机为主体而言的 输出:从计算机向输出设备(显示器,打印机)输出数据 输入:从输入设备(键盘,鼠标,扫描仪)向计算机输入数据. (二).C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的。示例如下: 字符输入函数: getchar字符输出函数:putchar 格式输入函数: scanf 格式输出函数: printf 在调用标准输入输出库函数时,文件开头应该有:#include ,26,字符数据的输入输出,1、 putchar( )函数输出一个字符 函数原型为:void putchar(int c) 调用方式为:putchar(c); / 将c变量以字符形式输出到终端显示设备,变量c可以是字符型变量或者整型变量 示例: int ch1 = 97; char ch2 = a; putchar(ch1); putchar(n); putchar(ch2);,27,字符数据的输入输出,2、用getchar函数输入一个字符 函数原型为: int getchar() 调用方式为: char ch = getchar(); /作用是将终端键盘输入的第一个字符保存到char型变量ch中 示例: char ch1; ch1 = getchar(); printf(“ch1 = %cn”, ch1);,28,字符数据的输入输出,例3.4 输入单个字符。 #include void main() char c; 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 字符数据的输出。 #include void main() char c=a; int i=97; printf(“%c, %dn“,c,c); printf(“%c, %dn“,i,i); ,运行结果:, ,,33,简单的格式输出,例3.6 输出实数时的有效位数。 #include void main() float x,y; x=111111.111; y=222222.222; printf(“%fn“,x+y); ,运行结果: .,结果中只有前七位是有效数字。由于x和y是单精度变量,所以x+y也只能保证7位的精度,后面几位是没有意义的。,34,简单的格式输出,例3.7 输出双精度数时的有效位数。 #include void main() double x,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 输出实数时指定小数位数。 #include void main() float f=123.456; printf(“%f,%10f,%10.2f,%.2f%,-10.2fn”,f,f,f,f,f); ,运行结果: 123.456001,123.456001, 123.46,123.46 123.46,复杂格式输出,37,例3.15求3个圆的周长,输出结果时上下按小数点对齐,取两位小数。 #include #define PI 3.1415926 void main ( ) double r1=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.2fn r2=%10.2fn r3=%10.2fn“, r1,r2,r3); ,运行结果: r1= 1.53 r2= 21.83 r3= 123.71,38,简单的格式输入,用简单的scanf函数输入数据 scanf函数作用:按照变量在内存的地址将变量值存进去。 一般格式:scanf(格式控制,地址表列) 注意:scanf格式控制字符串中的普通字符要再输入的时候原样输入,如写scanf(“a=%d”, 则在输入的时候要先写a=然后再给出要存储到变量a中的数据,即要通过键盘将数值5赋给a,则要输入“a=5” 对于连续的数值输入,如语句“scanf(“%d%d%f%fn”, &a, &b, &c, &d)”;在输入时可以采用空格或回车作为两个数据间的输入分隔符,同printf函数,是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。变量a对应的地址可以用&a来表示,39,简单的格式输入,scanf函数的例子:假设有如下变量声明 int a; float b; scanf(“%d%f“, ,函数名,地址 表 列,一一对应,40,简单的格式输入,例3.8 用scanf函数输入数据。 #include void main() int a,b,c; scanf(“%d %d %d”, ,运行情况: 3 4 5 (输入a,b,c的值,) 3,4,5 (输出a,b,c的值) a=3,b=4,c=5 3, 4, 5,41,简单的格式输入,修改程序,分析问题原因,#include void main() int a,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,三种结构总结,一个良好的程序,无论多么复杂,都可以

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论