编程_C语言学习课件_谭浩强_~1216F(课堂PPT)_第1页
编程_C语言学习课件_谭浩强_~1216F(课堂PPT)_第2页
编程_C语言学习课件_谭浩强_~1216F(课堂PPT)_第3页
编程_C语言学习课件_谭浩强_~1216F(课堂PPT)_第4页
编程_C语言学习课件_谭浩强_~1216F(课堂PPT)_第5页
已阅读5页,还剩813页未读 继续免费阅读

下载本文档

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

文档简介

1、1第一章2l 本章要点本章要点3l 主要内容主要内容1.1 1.1 语言出现的历史背景语言出现的历史背景1.2 1.2 程序的特点程序的特点1.3 1.3 简单的简单的C C语言程序介绍语言程序介绍1.4 1.4 运行程序的步骤和方法运行程序的步骤和方法4 1.1 语言出现的历史背景C语言是国际上广泛流行的高级语言。C语言是在B语言的基础上发展起来的。B (BCPL)语言是1970年由美国贝尔实验室设计的, 并用于编写了第一个UNIX操作系统,在PDP 7上实现。优点:精练,接近硬件,缺点:过于简单,数据无类型。 1973年贝尔实验室的D.M.Ritchie 在B语言的基础上设计出了C语言,对

2、B取长补短,并用之改写了原来用汇编编写的UNIX,(即UNIX第5版),但仅在贝尔实验室使用。5 1.1语言出现的历史背景1975年UNIX第6版发布,C优点突出引起关注。1977年出现了可移植C语言编译程序 ,推动了UNIX在各种机器上实现 ,C语言也得到推广,其发展相辅相成。1978年影响深远的名著The C Programming Language由 Brian W.Kernighan和Dennis M.Ritchie 合著,被称为标准C。之后,C语言先后移植到大、中、小、微型计算机上,已独立于UNIX和PDP,风靡世界,成为最广泛的几种计算机语言之一。6 1.1语言出现的历史背景198

3、3年,美国国家标准化协会(ANSI)根据C语言各种版本对C的发展和扩充,制定了新的标准ANSI C ,比标准C有了很大的发展。1988年K & R按照 ANSI C修改了他们的The C Programming Language。1987年,ANSI公布了新标准87 ANSI C。1990年,国际标准化组织接受了87 ANSI C为ISO C 的标准(ISO98991990)。1994年,ISO又修订了C语言标准。目前流行的C语言编译系统大多是以ANSI C为基础进行开发的。7 1.1语言出现的历史背景 不同版本的C编译系统所实现的语言功能和语法规则又略有差别,因此读者应了解所用的C语

4、言编译系统的特点(可以参阅有关手册)。本书的叙述基本上以ANSI C 为基础。8 1.2 语言的特点(1)语言简洁、紧凑,使用方便、灵活。 32个关键字、9种控制语句,程序形式自由。(2)运算符丰富。34种运算符 。(3)数据类型丰富,具有现代语言的各种数据结构。(4)具有结构化的控制语句 ,是完全模块化和结构化的语言。 (5)语法限制不太严格,程序设计自由度大。 9 1.2 语言的特点(6)允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可直接对硬件进行操作。兼有高级和低级语言的特点 。(7)目标代码质量高,程序执行效率高。只比汇编程序生成的目标代码效率低10-20%。(8)

5、程序可移植性好(与汇编语言比)。基本上不做修改就能用于各种型号的计算机和各种操作系统。 10 1.2 语言的特点C+是由于开发大型应用软件的需要而产生的,并不是所有的人都要去编写大型软件。面向对象的基础是面向过程。C+是面向对象的语言,C是面向过程的,学起来比C语言困难得多,所以不太适合程序设计的初学者。既然有了面向对象的既然有了面向对象的C+C+语言,为什么还要学习语言,为什么还要学习C C语言?语言?11 1.3 简单的C语言程序介绍#include void main( ) printf (This is a C program.n); /*文件包含*/*主函数 */*函数体开始*/*输

6、出语句*/*函数体结束*/ main-主函数名, void-函数类型每个C程序必须有一个主函数main 是函数开始和结束的标志,不可省每个C语句以分号结束使用标准库函数时应在程序开头一行写: #include 说明:说明: 本程序的作用是输出一行信息本程序的作用是输出一行信息: :This is a C program.This is a C program.12例1.2 求两数之和#include #include void main( ) void main( ) / /* *求两数之和求两数之和* */ / int a,b,sum; int a,b,sum; / /* *声明,定义变量为

7、整型声明,定义变量为整型* */ / / /* *以下以下3 3行为行为C C语句语句 * */ / a=123; b=456; a=123; b=456; sum=a+b; sum=a+b; printf(sum is %d printf(sum is %dn,sum);n,sum); /*/表示注释。注释只是给人看的,对编译和运行不起作用。所以可以用汉字或英文字符表示,可以出现在一行中的最右侧,也可以单独成为一行。说明:说明: 输出一行信息输出一行信息:sum is 579:sum is 57913例1.3 求3个数中较大者。#include #include void main( ) v

8、oid main( ) / /* * 主函数主函数* */ / int max(int x,int y); int max(int x,int y); / / 对被调用函数对被调用函数maxmax的声明的声明 * */ / int a, b, c; int a, b, c; / /* *定义变量定义变量a a、b b、c c * */ / scanf(scanf(d,d,d,&a,&b); d,&a,&b); / /* *输入变量输入变量a a和和b b的值的值* */ / c=max(a,b); c=max(a,b); / /* *调用调用maxmax函数函数

9、, ,将得到的值赋给将得到的值赋给c c * */ / printf(max=printf(max=dn,c); dn,c); / /* *输出输出c c的值的值* */ / 程序运行情况如下程序运行情况如下:8,5 8,5 ( (输入输入8 8和和5 5赋给赋给a a和和b)b)max=8 (max=8 (输出输出c c的值的值) )int max(int x, int y) int z; if (xy) z=x; else z=y; return (z); max(int x,int y); max(max(a a, ,b b);); 本程序包括main和被调用函数max两个函数。max函

10、数的作用是将x和y中较大者的值赋给变量z。return语句将z的值返回给主调函数main。14 1.3 简单的C语言程序介绍(1) C程序是由函数构成的。 这使得程序容易实现模块化。 (2) 一个函数由两部分组成: 函数的首部:例1.3中的max函数首部 int max(int x,int y ) 函数体:花括号内的部分。若一个函数有多个花括号,则最外层的一对花括号为函数体的范围。 函数体包括两部分 :声明部分:int a,b,c; 可缺省执行部分:由若干个语句组成。可缺省15 1.3 简单的C语言程序介绍函数的声明部分和执行部分都可缺省,例如:void dump ( ) 这是一个空函数,什么

11、也不做,但是合法的函数。 16 1.3 简单的C语言程序介绍小结:小结:(3) C程序总是从main函数开始执行的,与main函数的位置无关。(4) C程序书写格式自由,一行内可以写几个语句, 一个语句可以分写在多行上,C程序没有行号。(5) 每个语句和数据声明的最后必须有一个分号。(6) C语言本身没有输入输出语句。输入和输出的操作是由库函数scanf和printf等函数来完成的。C对输入输出实行“函数化”。17 1.4 运行程序的步骤和方法1.4.1 运行程序的步骤上机输入与编辑源程序对源程序进行编译与库函数连接运行目标程序18 1.4 运行程序的步骤和方法l目前使用的大多数C编译系统都是

12、集成环境(IDE)的。可以用不同的编译系统对C程序进行操作。l常用的有Turbo C 2.0、Turbo C+ 3.0、Visual C+等。 lTurbo C+ 3.0:是一个集成环境,它具有方便、直观和易用的界面,虽然它也是DOS环境下的集成环境,但是可以把启动Turbo C+ 3.0 集成环境的DOS执行文件tc.exe生成快捷方式,也可以用鼠标操作。lVisual C+:也可以用Visual C+对C程序进行编译。19将将Turbo C+ 3.0Turbo C+ 3.0编译程序装入磁盘某一目录下编译程序装入磁盘某一目录下例如:例如:放在放在C C盘根目录下一级盘根目录下一级TC3.0T

13、C3.0子目录下。子目录下。进入进入Turbo C+ 3.0集成环境集成环境在在DOS环境下环境下 C:TC3.0tc 20 找到可执行文件tc.exe,执行该文件。21 22 在编辑在编辑(EDIT) 状态下光标表示当前进行编辑的位状态下光标表示当前进行编辑的位置,在此位置可以进行插入、删除或修改,直到置,在此位置可以进行插入、删除或修改,直到自已满意为止。自已满意为止。 23保存:在编辑保存:在编辑(EDIT) (EDIT) 状态下光标表示当前进行编辑状态下光标表示当前进行编辑的位置,在此位置可以进行插入、删除或修改,的位置,在此位置可以进行插入、删除或修改,直到自已满意为止。直到自已满意

14、为止。 24(3) 对源程序进行编译对源程序进行编译选择“Compile”(或“Alt+F9”)对源程序进行编译。 c1.cpp源程序,出现1个错误(error) ,0个警告(warming)。 25(4) 将目标程序进行连接将目标程序进行连接 选择菜单“Compile” “Link” ,如果不出现错误,会得到一个后缀为.exe的可执行文件。 (5) 执行程序执行程序 选菜单“Run” “Run”( 或按“Ctrl+F9” 键)。(6) 退出Turbo C+ 3.0环境 选择“File”“Quit” 。 26第二章27l 本章要点本章要点28l 主要内容主要内容2.1 2.1 算法的概念算法的

15、概念2.2 2.2 简单算法举例简单算法举例2.3 2.3 算法的特性算法的特性2.4 2.4 怎样表示一个算法怎样表示一个算法2.5 2.5 化程序设计方法化程序设计方法 29一个程序应包括两个方面的内容:对数据的描述:数据结构(data structure)对操作的描述:算法(algorithm)著名计算机科学家沃思提出一个公式: 数据结构数据结构 + 算法算法 = 程序程序数据结构算法程序设计方法语言工具数据结构算法程序设计方法语言工具完整的程序设计应该是:30 2.1 算法的概念 广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。方法1:1+2,+3,+4,一直加到100 加

16、99次方法2:100+(1+99)+(2+98)+(49 +51)+50 = 100 + 49100 +50 加51次对同一个问题,可有不同的解题方法和步骤例: 求1001nn31 2.1 算法的概念 为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。希望方法简单,运算步骤少。计算机算法可分为两大类别:数值运算算法:求数值解,例如求方程的根、求函数的定积分等。非数值运算:包括的面十分广泛,最常见的是用于事务管理领域,例如图书检索、人事管理、行车调度管理等。32 2.2 简单算法举例例例2.1: 求求12345 步骤1:先求12,得到结果2步骤2:将步骤1得到的乘积2

17、再乘以3,得到结果6步骤3:将6再乘以4,得24步骤4:将24再乘以5,得120如果要求如果要求1 12 210001000,则要写,则要写999999个步骤个步骤33 S1:使p=1。 S2:使i=2。 S3:使pi,乘积仍放在变量p中,可表示为:pip S4:使i的值加1,即i+1i。 S5:如果i不大于5,返回重新执行步骤S3以及其后的步骤S4和S5;否则,算法结束。最后得到p的值就是5!的值。可以设两个变量:可以设两个变量:一个变量代表被乘数,一个变量代表乘数。不另设变量存放乘积结果,而直接将每一步骤的乘积放在被乘数变量中。设p为被乘数,i为乘数。用循环算法来求结果, 算法可改写: 3

18、4S1:1pS2:3 iS3:pi pS4:i+2 pS5:若i11,返回S3。否则,结束。 如果题目改为:求1351000算法只需作很少的改动:35 用这种方法表示的算法具有通用性、灵活性。S3到S5组成一个循环,在实现算法时 要反复多次执行S3,S4,S5等步骤,直到某一时刻,执行S5步骤时经过判断,乘数i已超过规定的数值而不返回S3步骤为止。此时算法结束,变量p的值就是所求结果。36例例2.2 有有50个学生,要求将他们之中成绩在个学生,要求将他们之中成绩在80分以上者打印出来。设分以上者打印出来。设n表表示学号,示学号, n1代表第一个学生学号,代表第一个学生学号, 代表第代表第i个学

19、生学号。用个学生学号。用G代表学生代表学生成绩成绩 , gi代表第代表第i个学生成绩,算法表示如下个学生成绩,算法表示如下: S1:1 i S2:如果80,则打印和,否则不打印。 S3:i+1 i S4:如果i50,返回S2,继续执行。否则算法结束 变量i作为下标,用来控制序号(第几个学生,第几个成绩)。当i超过50时,表示 已对50个学生的成绩处理完毕,算法结束。37例例2.3 判定判定20002500年中的每一年是否闰年,将结果输出。年中的每一年是否闰年,将结果输出。 变量变量i i作为下标,用来控制序号作为下标,用来控制序号( (第几个学生,第几个成绩第几个学生,第几个成绩) )。当。当

20、i i超过超过5050时,表示时,表示 已对已对5050个学生的成绩处理完毕,算法结束。个学生的成绩处理完毕,算法结束。分析:分析:闰年的条件是:(1)能被4整除,但不能被100整除的年份都是闰年,如1996,2004年是闰年;(2)能被100整除,又能被400整除的年份是闰年。如1600,2000年是闰年。不符合这两个条件的年份不是闰年。 38设y为被检测的年份,算法可表示如下 :S1:2000 yS2:若y不能被4整除,则输出y “不是闰年”。然后转到S6。S3:若y能被4整除,不能被100整除,则输出y “是闰年”。然后转到S6。S4:若y能被100整除,又能被400整除,输出y“是闰年

21、”,否则输出“不是闰年”。 然后转到S6。S5: 输出y “不是闰年”。S6:y+1 yS7:当y2500时,转S2继续执行,如y2500,算法停止。39 以上算法中每做一步都分别分离出一些范围(巳能判定为闰年或非闰年),逐步缩小范围,直至执行S5时,只可能是非闰年。“其它” 包括能被4整除,又能被100整除,而不能被400整除的那些年份(如1990) 是非闰年。40例例2.4 求求算法如下 :1001991.4131211 S1:sign=1 S2:sum=1 S3:deno=2 S4:sign=(-1)sign S5:term=sign(1/deno) S6:sum=sum+term S7

22、:deno=deno+1 S8:若deno100返回S4,否则算法结束。单词作变量名,以使算法更易于理解:sum表示累加和,deno是英文分母(denom inator)缩写,sign代表数值的符号,term代表某一项。 反复执行S4到S8步骤,直到分母大于100为止。一共执行了99次循环,向sum累加入了99个分数。sum最后的值就是多项式的值。 41 例例2.5 对一个大于或等于对一个大于或等于3的正整数,判断它是不是一个素数。的正整数,判断它是不是一个素数。 概念:概念:所谓素数,是指除了1和该数本身之外,不能被其它任何整数整除的数。例如,13是素数。因为它不能被2,3,4,12整除。分

23、析:分析:判断一个数n(n3)是否素数的方法: 将n作为被除数,将2到(n-1)各个整数轮流作为除数,如果都不能被整除,则n为素数。 42算法如下 :S1:输入n的值S2:i=2 (i作为除数)S3:n被i除,得余数rS4:如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束。否则执行S5S5:i+1iS6:如果in-1,返回S3。否则打印 n “是素数”。然后结束。 实际上,n不必被2到(n-1)的整数除,只需被2到n/2间整数除,甚至只需被2到 之间的整数除即可。n43 2.3 算法的特性有穷性:包含有限的操作步骤。确定性:算法中的每一个步骤都应当是确定的。 有零个或多个输入:输入

24、是指在执行算法时需要从外界取得必要的信息。有一个或多个输出:算法的目的是为了求解,“解” 就是输出。 有效性:算法中的每一个步骤都应当能有效地执行,并得到确定的结果 。一个算法应该具有以下特点:一个算法应该具有以下特点:44 2.4 算法的表示可以用不同的方法表示算法,常用的有:自然语言传统流程图结构化流程图伪代码PAD图45 2.4.1 用自然语言表示算法 自然语言就是人们日常使用的语言,可以是汉语或英语或其它语言。用自然语言表示通俗易懂,但文字冗长,容易出现“歧义性”。自然语言表示的含义往往不大严格,要根据上下文才能判断其正确含义,描述包含分支和循环的算法时也不很方便。因此,除了那些很简单

25、的问题外,一般不用自然语言描述算法。 46 2.4.2 用流程图表示算法美国国家标准化协会ANSI(American National Standard Institute)规定了一些常用的流程图符号:起止框起止框判断框判断框处理框处理框输入输入/输出框输出框注释框注释框流向线流向线连接点连接点47例例2.6 将求将求5!的算法用流程图表示的算法用流程图表示如果需要将最后结果打印出来,可在菱形框的下面加一个输出框。 48 例例2.7 将例将例2.2的算法用流程图的算法用流程图表示。打印表示。打印50名名 学生中成绩在学生中成绩在80分以上者的学号和成绩。分以上者的学号和成绩。49如果如果包括这

26、个输入数据的部分,流程图为50 例例2.8 将例将例2.3判定判定闰年的算法用流程闰年的算法用流程图表示图表示 用流程图表示算法要比用文字描述算法逻辑清晰、易于理解。 51 例例2.9 将例将例2.4的算法用流程图表示的算法用流程图表示 1001991.413121152 例例2.10 将例将例2.5判断素数的算法用流程图判断素数的算法用流程图表示表示 53小结:流程图是表示算法的较好的工具。一个流程图包括以下几部分 :(1)表示相应操作的框;(2)带箭头的流程线;(3)框内外必要的文字说明。 54 2.4.3 三种基本结构和改进的流程图1.传统流程图的弊端 传统流程图用流程线指出各框的执行顺

27、序,对流程线的使用没有严格限制。因此,使用者可以毫不受限制地使流程随意地转向,使流程图变得毫无规律,阅读者要花很大精力去追踪流程,使人难以理解算法的逻辑。如图:55传统流程图的流程可以是: 这种如同乱麻一样的算法称为BS型算法,意为一碗面条(A Bowl of Spaghetti),乱无头绪。缺点:难以阅读、修改,使算法的可靠性和可维护性难以保证。解决办法:必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去。 562.三种基本结构 Bohra和Jacopini提出了以下三种基本结构: 顺序结构、选择结构、循环结构顺序结构、选择结构、循环结构 用这三种基本结构作为表示一个良好

28、算法的基本单元。57三种基本结构的图示: 顺序结构顺序结构选择结构选择结构58循环循环结构的图示: 当型当型(While型型)循环结构循环结构 直到型直到型(Until型型)循环循环 59三种基本结构的共同特点:(1)只有一个入口。 (2)只有一个出口。(请注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。)(3)结构内的每一部分都有机会被执行到。(4)结构内不存在“死循环”(无终止的循环)。 60 图中没有一条从入口到出口的路径通过A框不正确的流程表示:流程内的死循环61小结:由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结

29、构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。62扩展:只要具有上述四个特点的都可以作为基本结构。可以自己定义基本结构,并由这些基本结构组成结构化程序。此图符合基本结构的特点63 这是一个多分支选择结构,根据表达式的值决定执行路线。虚线框内的结构是一个入口一个出口,并且有上述全部的四个特点。由此构成的算法结构也是结构化的算法。可以认为这是由三种基本结构所派生出来的。64 2.4.4 用N-S流程图表示算法 1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。

30、全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本的框组成一个大的框。这种流程图又称N-S结构化流程图。65 N-S流程图用以下的流程图符号: (1)顺序结构(2)选择结构(3)循环结构66 用三种N-S流程图中的基本框,可以组成复杂的N-S流程图。图中的A框或B框,可以是一个简单的操作,也可以是三个基本结构之一。 A框可以是一个选择结构 B框可以是一个循环结构 67例例2.11 将例将例2.1的求的求5!算算法用法用N-S图表示图表示68例例2.12 将例将例2.2的算法的算法用用N-S图表示。(打图表示。(打印印50名学生中成绩高名学生中成绩高于于80分的学

31、号和成绩)分的学号和成绩)没有输入数据69例例2.12 将例将例2.2的算法的算法用用N-S图表示。(打图表示。(打印印50名学生中成绩高名学生中成绩高于于80分的学号和成绩)分的学号和成绩)有输入数据70例例2.13 将例将例2.3判定闰判定闰年的算法用年的算法用N-S图表示图表示71例例2.14 将例将例2.4的算法用的算法用N-S图图表示表示1001991.413121172例例2.15 将例将例2.5判别素数的算法判别素数的算法用用N-S流程图表示。流程图表示。传统流程图分析:出口出口1出口出口2此图不符合基本结构特点!由于不能分解为三种基本结构,就无法直接用N-S流程图的三种基本结构

32、的符号来表示。因此,应当先作必要的变换。73例例2.15 将例将例2.5判别素数的算法判别素数的算法用用N-S流程图表示。流程图表示。传统流程图变换为:一个出口一个出口74用用N-S流程图表示:流程图表示:75N-S图表示算法的优点比文字描述直观、形象、 易于理解;比传统流程图紧凑易画。尤其是它废除了流程线,整个算法结构是由各个基本结构按顺序组成的,N-S流程图中的上下顺序就是执行时的顺序。用N-S图表示的算法都是结构化的算法,因为它不可能出现流程无规律的跳转,而只能自上而下地顺序执行。76小结:一个结构化的算法是由一些基本结构顺序组成的。在基本结构之间不存在向前或向后的跳转,流程的转移只存在

33、于一个基本结构范围之内(如循环中流程的跳转);一 个非结构化的算法可以用一个等价的结构化算法代替,其功能不变 。如果一个算法不能分解为若干个基本结构,则它必然不是一个结构化的算法。77 2.4.5 用位代码表示算法概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。特点:它如同一篇文章一样 ,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便 、格式紧凑,也比较好懂,也便于向计算机语言算法(即程序)过渡。用处:适用于设计过程中需要反复修改时的流程描述。78 IF x is positive THEN print x ELSE print -x也可以

34、用汉字伪代码表示:也可以用汉字伪代码表示: 若若 x为正为正 打印打印 x 否则否则 打印打印 -x也可以中英文混用,如:也可以中英文混用,如: IF x 为正为正 print x ELSE print -x例: “打印x的绝对值”的算法可以用伪代码表示为:79开始开始 置置t的初值为的初值为1 置置i的初值为的初值为2 当当i=5,执行下面操作:,执行下面操作: 使使t=ti 使使i=i+1 循环体到此结束循环体到此结束 输出输出t的值的值 结束结束也可以写成以下形式:也可以写成以下形式: BEGIN算法开始算法开始 1t 2 i while i5 ti t i+1 i print t EN

35、D算法结束算法结束例例2.16 求求5!。用伪代码表示算法:。用伪代码表示算法:80例例2.17 输出输出50个学生中成绩高于个学生中成绩高于80分者的学号和成绩。分者的学号和成绩。用伪代码表示算法:用伪代码表示算法:BEGIN算法开始算法开始 1 i while i50 input ni and gi i+1 i 1 i while i50 if gi80 print ni and gi i+1 i END算法结束算法结束81 2.4.6 用计算机语言表示算法概念:用计算机实现算法。计算机是无法识别流程图和伪代码的。只有用计算机语言编写的程序才能被计算机执行。因此在用流程图或伪代码描述出一个

36、算法后,还要将它转换成计算机语言程序。 特点:用计算机语言表示算法必须严格遵循所用的语言的语法规则,这是和伪代码不同的。用处:要完成一件工作,包括设计算法和实现算法两个部分。设计算法的目的是为了实现算法。82#include void main( ) int i,t; t=1; i=2; while(i=5) t=t*i; i=i+1; printf(%dn,t); 例例 2.20 将例将例2.16表示的算法(求表示的算法(求5!)用)用C语言表示。语言表示。83应当强调说明:写出了C程序,仍然只是描述了算法,并未实现算法。只有运行程序才是实现算法。应该说,用计算机语言表示的算法是计算机能够执

37、行的算法。84 2.5 结构化程序设计方法一个结构化程序 就是用高级语言表示的结构化算法。用三种基本结构组成的程序必然是结构化的程序,这种程序便于编写、便于阅读、便于修改和维护。 结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计方法的基本思路是:把一个复杂问题的求解过程 分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。 85采取以下方法来保证得到结构化的程序:自顶向下;逐步细化;模块化设计;结构化编码。两种不同的方法:自顶向下,逐步细化;自下而上,逐步积累。86 用这种方法逐步分解,直到作者认为可以直接将各小段表达为文字语句为止。这种方法就叫

38、做“自顶向下,逐步细化”。 87自顶向下,逐步细化方法的优点: 考虑周全,结构清晰,层次分明,作者容易写,读者容易看。如果发现某一部分中有一段内容不妥,需要修改,只需找出该部分修改有关段落即可,与其它部分无关。我们提倡用这种方法设计程序。这就是用工程的方法设计程序。88模块设计的方法:模块化设计的思想实际上是一种“分而治之”的思想,把一个大任务分为若干个子任务,每一个子任务就相对简单了。在拿到一个程序模块以后,根据程序模块的功能将它划分为若干个子模块,如果这些子模块的规模还嫌大,还再可以划分为更小的模块。这个过程采用自顶向下方法来实现。子模块一般不超过50行。划分子模块时应注意模块的独立性,即

39、:使一个模块完成一项功能,耦合性愈少愈好。 89第三章90l 本章要点本章要点91l 主要内容主要内容3.1 C3.1 C的数据类型的数据类型3.2 3.2 常量与变量常量与变量3.3 3.3 整型数据整型数据3.4 3.4 浮点型数据运行浮点型数据运行3.5 3.5 字符型数据字符型数据 92l 主要内容主要内容3. 3.变量赋初值变量赋初值 3.7 3.7 各类数值型数据间的混合运算各类数值型数据间的混合运算 3.8 3.8 算术运算符和算术表达式算术运算符和算术表达式 3.9 3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式 3.10 3.10 逗号运算符和逗号表达式逗号运算符和逗号

40、表达式 93 3.1 C的数据类型C语言提供了以下一些数据类型。 94 3.2 常量与变量3.2.1 常量和符号常量常量和符号常量在程序运行过程中,其值不能被改变的量称为常量常量区分为不同的类型:整型 100,125,-100,0实型 3.14 , 0.125,-3.789字符型 a, b,2字符串 a, ab,123295例3.1 符号常量的使用#define PRICE 30#define PRICE 30#include #include void main ( )void main ( ) int num, total;int num, total; num=10;num=10; to

41、tal=num total=num * * PRICE; PRICE; printf(total=%dn,total);printf(total=%dn,total); 用一个标识符代表一个常量。符号常量的值在其作用域内不能改变,也不能再被赋值。 运行结果:运行结果: total=300total=300 程序中用#define命令行定义PRICE代表常量30,此后凡在本文件中出现的PRICE都代表30,可以和常量一样进行运算如再用赋值语句给PRICE赋值是错的 PRICE=40;/* 错误,不能给符号常量赋值96 3.2 常量与变量3.2.2变量变量变量代表内存中具有特定属性的一个存储单元,

42、它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。变量名实际上是一个以一个名字对应代表一个地址,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。97 3.2 常量与变量 变量命名的规定:语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。 例:例:sum,_total, month, Student_name, lotus_1_2_,BASIC, li_ling M.D.John, ¥123,3D64,ab 98 3.2 常量与变量编译系统将大写字母和小写

43、字母认为是两个不同的字符。 建议变量名的长度最好不要超过8个字符。在选择变量名和其它标识符时,应注意做到“见名知意”,即选有含意的英文单词 (或其缩写)作标识符。要求对所有用到的变量作强制定义,也就是“先定义,后使用” 。99 3.3 整型数据3.3.1整型常量的表示方法整型常量的表示方法 整型常量即整常数。在语言中,整常数可用以下三种形式表示:(1)十进制整数。 如:如:123, -456.4。(2)八进制整数。以0头的数是八进制数。 如:如:0123表示八进制数123,等于十进制数83,-011表示八进制数-11,即十进制数-9。100 3.3 整型数据(3)十六进制整数。以0 x开头的数

44、是16进制数。 如:如:0 x123,代表16进制数123,等于十进制数 291。 -0 x12等于十进制数10。 3.3.2 整型变量整型变量 (1)(1)整型数据在内存中的存放形式整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的。 如如: : int i; /* 定义为整型变量 */ i=10; /* 给i赋以整数10 */ 101 3.3 整型数据十进制数10的二进制形式为1010,Turbo C 2.0和Turbo C+ 3.0为一个整型变量在内存中分配2个字节的存储单元(不同的编译系统为整型数据分配的字节数是不相同的,VC+ 6.0则分配4个字节)。数值是以补码(comp

45、lement) 表示的。 102 3.3 整型数据(2)(2)整型变量的分类整型变量的分类共六种共六种有符号基本整型有符号短整型有符号长整型无符号基本整型无符号短整型无符号长整型(signed)int (signed)short (int )(signed) long (int)unsigned intunsigned short (int)unsigned long (int) 注意:注意:括号表示其中的内容是可选的.103 3.3 整型数据整数类型的有关数据:104 3.3 整型数据例如:整数13在内存中实际存放的情况:105 3.3 整型数据(3)(3)整型变量的定义整型变量的定义: :

46、 规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。 例如例如: : int a,bint a,b(指定变量、为整型) unsigned short c,d;unsigned short c,d;(指定变量、为无符号短整型) long e,f;long e,f;(指定变量、为长整型)106例3.2 整型变量的定义与使用#include #include void main()() int a,b,c,d; /*指定、为整指定、为整型变量型变量* unsigned ; *指定为无符号整型变指定为无符号整型变量量* 12;-24;10; ; printf(,);,); 可以看到不同

47、种类的整型数据可以进行算术运算 运行结果:运行结果: , 107例3.3 整型数据的溢出#include #include void main()void main()int a,b; int a,b; a=32767; a=32767; b=a+1; b=a+1; printf(“%d,%dn”,a,b); printf(“%d,%dn”,a,b); 数值是以补码表示的。一个整型变量只能容纳-3276832767范围内的数,无法表示大于32767或小于-32768的数。遇此情况就发生“溢出”。运行结果:运行结果: 32767,-3276832767,-32768108 3.3 整型数据3.3

48、.3 整型常量的类型整型常量的类型 (1)一个整数,如果其值在-32768+32767范围内,认为它是int型,它可以赋值给int型和long int型变量。 (2) 一个整数,如果其值超过了上述范围,而在-2147483637+2147483647范围内,则认为它是为长整型。可以将它赋值给一个long int型变量。 109 3.3 整型数据(3) 如果所用的C版本(如Turbo C)分配给short int与int型数据在内存中占据的长度相同,则它的表数范围与int型相同。因此一个int型的常量同时也是一个short int型常量,可以赋给int型或short int型变量。110 3.3

49、 整型数据(4) 一个整常量后面加一个字母u或U,认为是unsigned int型,如12345u,在内存中按unsigned int规定的方式存放(存储单元中最高位不作为符号位,而用来存储数据)。如果写成-12345u,则先将-12345转换成其补码53191,然后按无符号数存储。111 3.3 整型数据(5) 在一个整常量后面加一个字母l或L,则认为是long int型常量。 例如: 123l.432L.0L 用于函数调用中。如果函数的形参为long int型,则要求实参也为long int型。112 3.4 浮点型数据3.4.13.4.1浮点型常量的表示方法浮点型常量的表示方法两种表两种

50、表示形式示形式小数小数指数指数0.1230.1233e-33e-3注意注意: :字母e(或E)之前必须有数字,且e后面的指数必须为整数 113 3.4 浮点型数据规范化的指数形式:规范化的指数形式: 在字母e(或E)之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字. 例如例如: : 123.456可以表示为: 123.456e0, 12.3456e1, 1.23456e2, 0.123456e3, 0.0123456e4, 0.00123456e 其中的1.23456e31.23456e3称为“规范化的指数形式”。114 3.4 浮点型数据3.4.2 浮点型变量浮点型变量(1)(

51、1)浮点型数据在内存中的存放形式浮点型数据在内存中的存放形式 一个浮点型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。系统把一个浮点型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。115 3.4 浮点型数据(2) (2) 浮点型变量的分类浮点型变量的分类 浮点型变量分为单精度(float型)、双精度(double型)和长双精度型(long double)三类形式。116例3.4 浮点型数据的舍入误差#include #include void main()void main()float a,b;float a,b; a

52、= 123456.789e5; a = 123456.789e5; b = a + 20 ; b = a + 20 ; printf(“%fn”,b); printf(“%fn”,b); 一个浮点型变量只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确地表示该数。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数运行结果:运行结果: 123456.789e5123456.789e5117 3.4 浮点型数据3.4.3 浮点型常量的类型浮点型常量的类型 C编译系统将浮点型常量作为双精度来处理。 例如例如:f = 2.45678 * 4523.65 系统先把2

53、.45678和4523.65作为双精度数,然后进行相乘的运算,得到的乘也是一个双精度数。最后取其前7位赋给浮点型变量f。如是在数的后面加字母f或F(如1.65f, 654.87F),这样编译系统就会把它们按单精度(32位)处理。118 3.5 字符型数据 3.5.1 字符常量字符常量(1)用单引号包含的一个字符是字符型常量(2)只能包含一个字符a,A, 1a,A, 1abcabc、“a”a”119 3.5 字符型数据 有些以有些以“”开头的特殊字符称为转义字符开头的特殊字符称为转义字符n 换行t 横向跳格r 回车 反斜杠ddd ddd表示1到3位八进制数字xhh hh表示1到2位十六进制数字1

54、20例3.5 转义字符的使用#include #include void void ()() ( ab ct ab ct derftgnderftgn); ; printf(htibbj kn); printf(htibbj kn);打印机上的显示结果:打印机上的显示结果: fab c gde h jik显示屏上的运行结果:显示屏上的运行结果: f gde j k121 3.5 字符型数据 3.5.2字符变量字符变量字符型变量用来存放字符常量,注意只能放一个字符。字符变量的定义形式如下:char c1,c2;在本函数中可以用下面语句对c1,c2赋值: c1a;c2 b ;一个字符变量在内存中占

55、一个字节。 122 3.5 字符型数据 3.5.3 字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法一个字符常量存放到一个字符变量中,实际上并不是把该字符的字型放到内存中去,而是将该字符的相应的ASCII代码放到存储单元中。这样使字符型数据和整型数据之间可以通用。注意: 一个字符数据既可以以字符形式输出,也可以以整数形式输出。123例3.6 向字符变量赋以整数。 #include #include void main()void main() char c1,c2; char c1,c2; c1=97; c1=97; c2=98; c2=98; printf(“%c

56、 %cn”,c1,c2); printf(“%c %cn”,c1,c2); printf(“%d %dn”,c1,c2); printf(“%d %dn”,c1,c2); 在第和第4行中,将整数97和98分别赋给c1和c2,它的作用相当于以下两个赋值语句:c1;c2; 因为a和b的ASCII码为97和98运行结果:运行结果: 97 9897 98124例3.7 大小写字母的转换 #include #include void main()void main() char c1,c2 char c1,c2; c1=a;c1=a; c2=b; c2=b;c1=c1-32;c1=c1-32;c2=c2

57、-32;c2=c2-32; printf(“ printf(“c c cc,c1,c2c1,c2);); 程序的作用是将两个小写字母a和b转换成大写字母A和B。从代码表中可以看到每一个小写字母比它相应的大写字母的ASCII码大32。语言允许字符数据与整数直接进行算术运算。 运行结果:运行结果: 125 3.5 字符型数据 有些系统(如Turbo C)将字符变量定义为signed char型。其存储单元中的最高位作为符号位,它的取值范围是-128127。如果在字符变量中存放一个ASCII码为0127间的字符,由于字节中最高位为0,因此用%d输出字符变量时,输出的是一个正整数。如果在字符变量中存放

58、一个ASCII码为128255间的字符,由于在字节中最高位为1,用%d格式符输出时,就会得到一个负整数。 126 3.5 字符型数据3.5.4字符串常量字符串常量字符串常量是一对双撇号括起来的字符序列.合法的字符串常量:“How do you do.”, “CHINA”, “a” , “$123.45”可以输出一个字符串,如printf(“How do you do.”);127 3.5 字符型数据 是字符常量,”是字符串常量,二者不同。 如:如:假设被指定为字符变量 :char c c=a; ”a”;c”CHINA”; 结论:结论:不能把一个字符串常量赋给一个字符变量。128规定:在每一个字

59、符串常量的结尾加一个 “字符串结束标志”,以便系统据此判断字符串是否结束。规定以字符作为字符串结束标志。 如:如:如果有一个字符串常量” ,实际上在内存中是: 它占内存单元不是个字符,而是个字符,最后一个字符为。但在输出时不输出。 3.5 字符型数据129 3.6 变量赋初值 字符串常量(1)语言允许在定义变量的同时使变量初始化如如: : int a=3; / 指定为整型变量,初值为 float f=3.56; / 指定为浮点型变量,初值为.56 char c= a; / 指定为字符变量,初值为a 130 3.6 变量赋初值 (2)可以使被定义的变量的一部分赋初值。 如如: : int a,b

60、,c=5; 表示指定、为整型变量,但只对初始化,c的初值为(3)如果对几个变量赋以同一个初值, 应写成:int a=3,b=3,c=3; 表示、的初值都是。 不能写成 int a=b=c3; 注意:注意:初始化不是在编译阶段完成的而是在程序运行时执行本函数时赋初值的,相当于有一个赋值语句。 131 3.7 各类数值型数据间的混合运算 混合运算:整型(包括int,short,long)、浮点型(包括float,double)可以混合运算。在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算.说明: 这种类型转换是由系统自动进行的。132 3.8 术运算符和算术表达式3.8.1 运算符简介运算符简介 的运算符有以下几类:的运

温馨提示

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

评论

0/150

提交评论