二C语言概述.docx
- 文档编号:24006056
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:13
- 大小:34.17KB
二C语言概述.docx
《二C语言概述.docx》由会员分享,可在线阅读,更多相关《二C语言概述.docx(13页珍藏版)》请在冰豆网上搜索。
二C语言概述
2.1C语言概况
2.1.1C语言的发展
C语言是国际上广泛流行的计算机高级程序设计语言,它是1973年由美国贝尔实验室设计发布的。
由于C语言既是一个非常成功的系统描述语言,又是一个相当有效的通用程序设计语言,所以,从C语言诞生至今虽然只有近二十年的历史,但其发展速度和应用范围却是任何一种程序设计语言所无法比拟的。
作为现代计算机语言的代表之一,C语言展现出强大的生命力。
对C语言的研究起源于系统程序设计的深入研究和发展。
1967年,英国剑桥大学的M.Richards在CPL(CombinedProgramming)语言的基础上,实现并推出了BCPL(BasicCombinedProgrammingLanguage)语言。
1970年,美国贝尔实验室的K.Thompson以BCPL语言为基础,设计了一种类似于BCPL的语言,称为B语言。
他用B语言在PDP-7机上实现了第一个实验性的UNIX操作系统。
1972年,贝尔实验室的DennisM.Ritchie为克服B语言的诸多不足,在B语言的基础上重新设计了一种语言,由于是B语言的后继,故称为C语言。
1973年,贝尔实验室的K.Thompson和DennisM.Ritchie合作,首先用C语言重新改写了UNIX操作系统,在当时的PDP-11计算机上运行。
此后,C语言作为UNIX操作系统上标准的系统开发语言,伴随着UNIX操作系统的发展,C语言越来越广泛的被人们接受和应用。
至此,C语言不断得到改进,但主要还是作为实验室产品在使用,因为它仍然依赖于具体的机器。
随着计算机的普及应用,人们希望C语言能够成为一种更加安全可靠、既不依赖于具体计算机也不依赖于具体操作系统的标准化的程序设计语言。
所以,1977年出现了独立于具体机器的C语言编译版本。
由于C语言的独立和推广,也推动了UNIX操作系统在各种机器上的迅速实现。
1978年,BrianW.Kernighan和DennisM.Ritchie(称K&R)正式出版了著名的《TheCProgrammingLanguage》一书,此书中介绍的C语言成为后来广泛使用的C语言版本基础,它被称为标准C语言。
C语言的标准化工作是从80年代初期开始的。
1983年,美国国家标准化协会(ANSI)根据各种C语言版本对C的扩充和发展,颁布了C语言的新标准ANSIC。
ANSIC比标准C有了很大的扩充和发展。
由于C语言的不断发展,1987年,美国国家标准化协会在综合各种C语言版本的基础上,又颁布新标准,为了与标准ANSIC区别,所以称为87ANSIC。
1990年,国际标准化组织ISO接受了87ANSIC作为ISOC的标准。
这是目前功能最完善、性能最优良的C新版本。
目前流行的C编译系统都是以它为基础的。
本书讲述的内容基本上是以ANSIC为基础,并参考87ANSIC。
目前在我国PC系列兼容机上常用的、实际使用频率比较高的C语言版本主要有:
BorlandInternational公司的TurboC(V2.0,V3.0);Microsoft公司的MicrosoftC(V5.0,V6.0,V7.0)和QuickC;ComputerInnovasions公司的C86(V2.3);Lattice公司的LatticeC(V4.0)等。
上一页 下一页
1.2算法和算法的表示
1.2.1算法的概念
1.算法的基本概念
什么是算法?
当代著名计算机科学家D.E.Knuth在他撰写的《THEARTOFCOMPUTERPROGRAMMING》一书中写到:
"一个算法,就是一个有穷规则的集合,其中之规则规定了一个解决某一特定类型的问题的运算序列。
"简单地说,任何解决问题的过程都是由一定的步骤组成的,把解决问题确定的方法和有限的步骤称作为算法。
需要说明的是,不是只有计算问题才有算法。
例如,加工一张写字台,其加工顺序是:
桌腿桌面抽屉组装,这就是加工这张写字台的算法。
当然,如果是按"抽屉桌面桌腿组装"这样的顺序加工,那就是加工这张写字台有另一种算法,这其中没有计算问题。
通常计算机算法分为两大类:
数值运算算法和非数值运算算法。
数值运算是指对问题求数值解,例如对微分方程求解、对函数的定积分求解、对高次方程求解等,都属于数值运算范围。
非数值运算包括非常广泛的领域,例如资料检索、事务管理、数据处理等。
数值运算有确定的数学模型,一般都有比较成熟的算法。
许多常用算法通常还会被编写成通用程序并汇编成各种程序库的形式,用户需要时可直接调用。
例如数学程序库、数学软件包等。
而非数值运算的种类繁多,要求不一,很难提供统一规范的算法。
在一些关于算法分析的著作中,一般也只是对典型算法作详细讨论,其它更多的非数值运算是需要用户设计其算法的。
下面通过三个简单的问题说明设计算法的思维方法。
例1-1:
有黑和蓝两个墨水瓶,但却错把黑墨水装在了蓝墨水瓶子里,而蓝墨水错装在了黑墨水瓶子里,要求将其互换。
算法分析:
这是一个非数值运算问题。
因为两个瓶子的墨水不能直接交换,所以,解决这一问题的关键是需要引入第三个墨水瓶。
设第三个墨水瓶为白色,其交换步骤如下:
①将黑瓶中的蓝墨水装入白瓶中;
②将蓝瓶中的黑墨水装入黑瓶中;
③将白瓶中的蓝墨水装入蓝瓶中;
④交换结束。
例1-2:
计算函数M(x)的值。
函数M(x)为:
其中,a,b,c为常数。
算法分析:
本题是一个数值运算问题。
其中M代表要计算的函数值,有两个不同的表达式,根据x的取值决定采用哪一个算式。
根据计算机具有逻辑判断的基本功能,用计算机解题的算法如下:
①将a、b、c和x的值输入到计算机;
②判断x≤a?
如果条件成立,执行第③步,否则执行第④步;
③按表达式bx+a2计算出结果存放到M中,然后执行第⑤步;
④按表达式a(c-x)+c3计算出结果存放到M中,然后执行第⑤步;
⑤输出M的值;
⑥算法结束。
例1-3:
给定两个正整数m和n(m≥n),求它们的最大公约数。
算法分析:
这也是一个数值运算问题,它有成熟的算法,我国数学家秦九韶在《算书九章》一书中曾记载了这个算法。
求最大公约数的问题一般用辗转相除法(也称欧几里德算法)求解。
例如:
设m35,n15,余数用r表示。
它们的最大公约数的求法如下:
35/15商2余数为5以n作m,以r作n,继续相除;
15/5商3余数为0当余数为零时,所得n即为两数的最大公约数。
所以35和15两数的最大公约数为5。
用这种方法求两数的最大公约数,其算法可以描述如下:
①将两个正整数存放到变量m和n中;
②求余数:
计算m除以n,将所得余数存放到变量r中;
③判断余数是否为0:
若余数为0则执行第⑤步,否则执行第④步;
④更新被除数和余数:
将n的值存放到m中,将r的值存放到n中,并转向第②步继续循环执行;
⑤输出n的当前值,算法结束。
如此循环,直到得到结果。
由上述三个简单的例子可以看出,一个算法由若干操作步骤构成,并且这些操作是按一定的控制结构所规定的次序执行。
如例1-1中的四个操作步骤是顺序执行的,称之为顺序结构。
而在例1-2中,则不是按操作步骤顺序执行,也不是所有步骤都执行。
如第三步和第四步的两个操作就不能同时被执行,它们需要根据条件判断决定执行哪个操作,这种结构称之为分支结构。
在例1-3中不仅包含了判断,而且需要重复执行。
如第二步到第五步之间的步骤就需要根据条件判断是否重复执行,并且一直延续到条件"余数为0"为止,这种具有重复执行功能的结构称之为循环结构。
2.算法的两要素
由上述三个例子可以看出,任何简单或复杂的算法都是由基本功能操作和控制结构这两个要素组成。
不论计算机的种类如何之多,但它们最基本的功能操作是一致的。
计算机的基本功能操作包括以下四个方面:
(1)逻辑运算:
与、或、非;
(2)算术运算:
加、减、乘、除;
(3)数据比较:
大于、小于、等于、不等于、大于等于、小于等于;
(4)数据传送:
输入、输出、赋值。
算法的控制结构决定了算法的执行顺序。
如以上例题所示,算法的基本控制结构通常包括顺序结构、分支结构和循环结构。
不论是简单的还是复杂的算法,都是由这三种基本控制结构组合而成的。
算法是对程序控制结构的描述,而数据结构是对程序中数据的描述。
因为算法的处理对象必然是问题中所涉及到的相关数据,所以不能离开数据结构去抽象地分析程序的算法,也不能脱离算法去孤立地研究程序的数据结构,而只能从算法和数据结构的统一上去认识程序。
但是,在计算机的高级语言中,数据结构是通过数据类型表现的,本书在第三章、第七章、第十章和第十一章中,将通过对C语言数据类型的详细描述说明数据结构在程序设计中的作用。
这里我们只讨论算法的问题。
需要强调的是,设计算法与演绎数学有明显区别,演绎数学是以公理系统为基础,通过有限次推演完成对问题的求解。
每次推演都是对问题的进一步求解,如此不断推演,直到能将问题的解完全描述出来为止。
而设计算法则是充分利用解题环境所提供的基本操作,对输入数据进行逐步加工、变换和处理,从而达到解决问题的目的。
上一页 下一页
2.3C语言的基本组成
任何程序设计语言如同自然语言一样,都具有自己一套对字符、单词及一些特定符号的使用规定,也有对语句、语法等方面的使用规则。
在C语言中,所涉及到的规定很多,其中主要有:
基本字符集、标识符、关键字、语句和标准库函数等。
这些规定构成了C程序的最小的语法单位。
例如,例2-2中的a、b、c、x是标识符,int、if是关键字,return(n)是语句,scanf和printf是标准库函数等,这些都是由C语言规定的基本字符组成。
1.基本字符集
一个C程序是C语言基本字符构成的一个序列。
C语言的基本字符集包括:
数字字符:
0、1、2、3、4、5、6、7、8、9
拉丁字母:
A、B、C、……、Z、a、b、c、……、z
(注意:
字母的大小写是可区分的。
如:
abc与ABC是不同的)
运算符:
+、-、*、/、%、=、<、>、<=、>=、!
=、==、<<、>>、&、|、
&&、||、^、~、(、)、[、]、->、.、!
、?
、:
、,、;
特殊符号和不可显示字符:
_(连字符或下划线)、空格、换行、制表符
对初学者来说,书写程序要从一开始就养成良好的习惯,力求字符准确、工整、清晰,尤其要注意区分一些字形上容易混淆的字符,避免给程序的阅读、录入和调试工作带来不必要的麻烦。
2.标识符
在程序中有许多需要命名的对象,以便在程序的其它地方使用。
如何表示在一些不同地方使用的同一个对象?
最基本的方式就是为对象命名,通过名字在程序中建立定义与使用的关系,建立不同使用之间的关系。
为此,每种程序语言都规定了在程序里描述名字的规则,这些名字包括:
变量名、常数名、数组名、函数名、文件名、类型名等,通常被统称为"标识符"。
C语言规定,标识符由字母、数字或下划线(_)组成,它的第一个字符必须是字母或下划线。
这里要说明的是,为了标识符构造和阅读的方便,C语言把下划线作为一个特殊使用,它可以出现在标识符字符序列里的任何地方,特别是它可以作为标识符的第一个字符出现。
C语言还规定,标识符中同一个字母的大写与小写被看作是不同的字符。
这样,a和A,AB、Ab是互不相同的标识符。
下面是合法的和不合法的两组C标识符:
合法的C标识不合法的C标识符说明
call_namecall...name(非字母数字或下划线组成的字符序列)
test3939test(非字母或下划线开头的字符序列)
_string1-string1(非字母或下划线开头的字符序列)
在C程序中,标识符的使用很多,使用时要注意语言规则。
在例2-2的程序中,a、b、c、x等就是变量名,main和sub是函数名,它们都是符合C语言规定的标识符。
ANSIC标准规定标识符的长度可达31个字符,但一般系统使用的标识符,其有效长度不超过8个字符。
3.关键字
C语言有一些具有特定含义的关键字,用作专用的定义符。
这些特定的关键字不允许用户作为自定义的标识符使用。
C语言关键字绝大多数是由小写字母构成的字符序列,它们是:
autobreakcasecharconstcontinuedefault
dodoubleelseenumexternfloatfor
gotoifintlongregisterreturnshort
signedsizeofstaticstructswitchtypedefunion
unsignedvoidvolatilewhile
4.语句
语句是组成程序的基本单位,它能完成特定操作,语句的有机组合能实现指定的计算处理功能。
所有程序设计语言都提供了满足编写程序要求的一系列语句,它们都有确定的形式和功能。
C语言中的语句有以下几类:
选择语句if,switch
流程控制语句循环语句for,while,do_while
转移语句break,continue,return,goto
C语句表达式语句
复合语句
空语句
这些语句的形式和使用见后续相关章节。
5.标准库函数
标准库函数不是C语言本身的组成部分,它是由C编译系统提供的一些非常有用的功能函数。
例如,C语言没有输入/输出语句,也没有直接处理字符串的语句,而一般的C编译系统都提供了完成这些功能的函数,称为标准库函数。
TurboC2.0编译系统提供了四百多个库函数,常用的有数学函数、字符函数和字符串函数、输入输出函数、动态分配函数和随机函数等几个大类。
在C语言处理系统中,标准库函数存放在不同的头文件(也称标题文件)中,例如,输入/输出一个字符的函数getchar和putchar、有格式的输入/输出函数printf和scanf等就存放在标准输入输出头文件stdio.h中,求绝对值函数和三角函数等各种数学函数存放在标准输入输出头文件math.h中。
这些头文件中存放了关于这些函数的说明、类型和宏定义,而对应的子程序则存放在运行库(.lib)中。
使用时只要把头文件包含在用户程序中,就可以直接调用相应的库函数了。
即在程序开始部分用如下形式:
#include<头文件名>或:
#include"头文件名"
标准库函数是语言处理系统中一种重要的软件资源,在程序设计中充分利用这些函数,常常会收到事半功倍的效果。
所以,读者在学习C语言本身的同时,应逐步了解和掌握标准库中各种常用函数的功能和用法,避免自行重复编制这些函数。
需要说明的是,不同C编译系统提供的标准库函数在数量、种类、名称及使用上都有一些差异,例如ANSIC标准建议的标准库函数有100多个,而TurboC2.0编译系统在此基础上扩充到了400多。
但就一般系统而言,常用的标准函数基本上是相同的。
附录C中列出了一些常用的标准库函数,有关的详细说明见第九章。
上一页 下一页
2.4C语言的上机执行过程
编写出C程序仅仅是程序设计工作中的一个环节,写出来的程序需要在计算机上进行调试运行,直到得到正确的运行结果为止。
2.4.1C程序的上机执行过程
C语言处理系统提供的开发环境是编译系统,所以,C程序的上机执行过程一般要经过如图2-1所示的四个步骤,即:
编辑、编译、连接和运行。
图中虚线框内是C编译系统提供的语言处理程序和C标准库函数,单线框内是用户程序。
下面分别说明上机执行过程。
(1)编辑C源程序。
编辑是用户把编写好的C语言源程序输入计算机,并以文本文件的形式存放在磁盘上。
其标识为:
"文件名.C"。
其中文件名是由用户指定的符合C标识符规定的任意字符组合,扩展名要求为".C",表示是C源程序。
例如file1.c、t.c等。
用于编辑源程序所使用的软件是编辑程序。
编辑程序是提供给用户书写程序的软件环境,可用来输入和修改源程序。
如DOS系统提供的全屏幕编辑程序edit;UNIX系统提供的文本行编辑程序ed;还有许多功能更强的专用编辑程序,如PE、NE,以及Windows系统提供的写字板,文字处理软件WPS、Word等都可以用来编辑C语言源程序。
一般语言系统也会带有自己的编辑程序。
(2)编译C源程序。
编译是把C语言源程序翻译成用二进制指令表示的目标文件。
编译过程由C编译系统提供的编译程序完成。
编译程序自动对源程序进行句法和语法检查,当发现错误时,就将错误的类型和所在的位置显示出来,提供给用户,以帮助用户修改源程序中的错误。
如果未发现句法和语法错误,就自动形成目标代码并对目标代码进行优化后生成目标文件。
目标程序的文件标识是:
"文件名.obj"。
这是系统规定的形式,扩展名".obj"是目标程序的文件类型标识。
不同的编译系统,或者不同版本的编译程序,它们的启动命令不同,生成的目标文件也不相同。
(3)程序连接。
目标程序计算机还是不能执行的。
程序连接过程是用系统提供的连接程序(也称链接程序或装配程序)将目标程序、库函数或其他目标程序连接装配成可执行的目标程序。
可执行程序的文件名为:
"文件名.exe",扩展名".exe"是可执行程序的文件类型标识。
绝大部分系统生成的可执行文件的扩展名是".exe",但UNIX系统中,生成的可执行文件自动确定为"a.out",除非在编译时用户特别规定自己的文件名。
有的C编译系统把编译和连接放在一个命令文件中,用一条命令即可完成编译和连接任务,减少了操作过程。
(4)运行程序。
运行程序是指将可执行的目标程序投入运行。
以获取程序处理的结果。
如果程序运行结果不正确,可重新回到第一步,重新对程序进行编辑修改、编译和运行。
与编译、连接不同的是,运行程序可以脱离语言处理环境。
因为它是对一个可执行程序进行操作,与C语言本身已经没有联系,所以可以在语言开发环境下运行,也可直接在操作系统下运行。
必须指出,对不同型号计算机上的C语言版本,上机环境各不相同,编译系统支持性能各异,上述步骤有些可再分解,有些也可集成进行批处理,但逻辑上是基本相同的。
目前在微机上常用的C语言编译系统中,BorlandInternational公司的TurboC和Microsoft公司的MicrosoftC、QuickC等都被广泛使用。
以下简单介绍TurboC2.0集成开发环境的使用,关于详细的使用说明以及其它C语言编译系统的介绍,请参阅本书的配套教材《C语言程序设计教程习题与上机指导》一书。
上一页 下一页
本章小结
本章介绍的基本内容有:
C语言的发展、特点、C程序的基本结构、C语言的基本组成以及C程序的上机执行过程。
C语言是功能强大计算机高级语言,它既适合于作为系统描述语言,又适合于作为通用的程序设计语言。
任何计算机语言都有一系列的语言规定和语法规则,C语言的基本规则是:
有自己规定的基本字符集、标识符、关键字、语句和标准库函数等;C程序的基本结构是:
程序由函数组成,函数由语句组成。
一个完整的C程序至少要有一个且仅有一个主函数main,可以有若干个子函数,也可以没有子函数。
这些子函数有用户自定义的函数,也有C编译系统提供的标准库函数。
每个函数都由函数说明和函数体两部分组成,函数体必须用一对花括号括起来。
语句是组成程序的基本单位,C语言中包含了四种基本语句:
流程控制语句、表达式语句、复合语句和空语句,它们完成各自特定的操作。
C程序中的每个语句都由分号作为结束标志。
在C程序中标识符的使用有其严格的规定,这些规定没有多少道理,所以几乎没有理解问题,只需要记忆。
一个C源程序需要经过编辑、编译和连接后才可运行,对C源程序编译后生成目标文件(.obj),对目标文件和库文件连接后生成可执行文件(.exe)。
程序的运行是对可执行文件而言的。
所以程序的开发需要语言处理系统的支持,选择一个功能强的语言处理系统可以使程序的开发工作事半功倍。
上一页 下一页
习题二
一、单项选择题
1-1.以下______不是C语言的特点。
A.语言的表达能力强B.语法定义严格
C.数据结构系统化D.控制流程结构化
1-2.C编译系统提供了对C程序的编辑、编译、连接和运行环境,以下可以不在该环境下进行的是______。
A.编辑和编译B.编译和连接
C.连接和运行D.编辑和运行
1-3.以下______不是二进制代码文件。
A.标准库文件B.目标文件
C.源程序文件D.可执行文件
1-4.下面各选项组中,均属于C语言关键字的一组是______。
A.auto,enum,includeB.switch,typedef,continue
C.signed,union,scanfD.if,struct,type
1-5下面四组字符串中,都可以用作C语言程标识符的是______。
A.printB.I\amC.signD.if
_mafscanf3mfty_pe
mx_2dmx_a.fx1#
aMb6AMBA&B5XY
1-6.以下不属于流程控制语句的是______。
A.表达式语句B.选择语句
C.循环语句源程序文件D.转移语句
1-7.下面描述中,不正确的是______。
A.C程序的函数体由一系列语句和注释组成。
B.注释内容不能单独写在一行上。
C.C程序的函数说明部分包括对函数名、函数类型、形式参数等的定义和说明;
D.scanf和printf是标准库函数而不是输入和输出语句。
1-8.下面描述中,正确的是______。
A.主函数中的花括号必须有,而子函数中的花括号是可有可无的。
B.一个C程序行只能写一个语句。
C.主函数是程序启动时唯一的入口。
D.函数体包含了函数说明部分。
二、填空题
1-9.一个完整的C程序至少要有一个_______函数。
1-10.标准库函数不是C语言本身的组成部分,它是由_______提供的功能函数。
1-11.C程序是以______为基本单位,整个程序由______组成。
1-12.常用的标准库函数有数学函数、字符函数和字符串函数、动态分配函数、随机函数和_______函数等几个大类。
1-13.标准库函数存放在_______文件中。
1-14.目标程序文件的扩展名是______。
1-15.程序连接过程是将目标程序、______或其他目标程序连接装配成可执行文件。
1-16.因为源程序是______类型的文件,所以它可以用具有文本编辑功能的任何编辑程序完成编辑。
三、应用题
1-17.你认为C语言的主要特点和用途是什么?
它和其它高级语言有什么不同?
1-18.C语言以函数为程序的基本单位,它有什么好处?
1-19.C语言程序结构的特点是什么?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 概述