第一章 C语言程序设计概述汇总.pdf
第一章 C 语言程序设计概述1.11.1程序和程序设计语言程序和程序设计语言计算机是在程序的控制下工作的。要让计算机能够正常的运行,需要预先编写好计算机工作步骤的指令序列,即系统程序;要利用计算机来解决一个具体的实际问题,同样需要编写程序,即应用程序。这些都要进行程序设计工作。1.1.11.1.1 程序与程序设计程序与程序设计所谓程序,就是一系列遵循一定规则和思想并能正确完成指定工作的代码(也称为指令的序列)。通常一个计算机程序主要描述两部分的内容,其一是描述问题的每个对象及他们之间的关系,即数据结构的内容;其二是描述对这些对象进行处理的动作、动作的先后顺序,即求解的算法。因此,程序也可以用经典的公式来表示:程序数据结构算法所谓程序设计,就是根据计算机要完成的任务,提出相应的需求,在此基础上设计数据结构和算法,然后用某种程序设计语言编写相应的程序代码。一个设计合理的数据结构往往可以简化算法,而且一个好的程序有可靠性、易读性、可维护性等良好特性。1.1.21.1.2 程序设计语言程序设计语言程序设计语言是人与计算机交流的工具,是用来书写计算机程序的工具。程序设计的语言有几百种,最常用的不过十多种。按照程序设计语言发展的过程,可以分为三类。1.1.机器语言机器语言机器语言是由 0 和 1 这样的二进制代码按一定规则组成的、能被机器直接理解和执行的指令集合。机器语言中的每一条语句实际上是一条二进制形式的指令代码(即机器指令),机器指令一般由操作码和操作数两个部分组成,操作码表示该指令所要完成的功能,操作数指出完成这个功能所需要的数据或数据在内存中的地址。例如,某种计算机上计算A=15+10 的机器语言程序如下:10110000 00001111把 15 放入累加器 A 中00101100 0000101010 与累加器 A 中的值相加,结果仍放入A 中111110100结束,停机用机器语言编写的程序,计算机可以直接识别和执行,因而执行效率高。但由于不同的机器,其指令系统不同,因此机器语言程序通用性差。另外,机器语言的指令不直观,难认、难记、难理解、难修改、易出错。因此,很少有人用机器语言直接编程。2.2.汇编语言汇编语言为了便于理解和记忆,人们采用能够帮助记忆的指令助记符来代替机器语言指令代码中的操作码,用地址符号或十进制数来代替操作数。指令助记符一般采用描述该指令功能的英文单词的缩写,如用 ADD 表示加法操作、SUB 表示减法操作、JMP 表示程序跳转等等。这种指令助记符的语言就是汇编语言,又称为符号语言。例如,上述计算 A=15+10 的汇编语言程序如下:MOVA,15把 15 放入累加器 A 中ADDA,1010 与累加器 A 中的值相加,结果仍放入A 中HLT结束,停机计算机不能直接执行用汇编语言编写的程序,必须由一种专门的翻译程序(即汇编程序)将汇编语言源程序翻译成机器语言程序,计算机才能执行。3.3.高级语言高级语言机器语言和汇编语言都是面向机器的语言,一般称为低级语言。它们对机器的依赖性很大,用它们开发出的程序通用性差,而且要求程序的开发者必须熟悉和了解计算机硬件的每一个细节,因此,它们面对的用户一般是计算机专业人员。随着计算机技术的发展及计算机应用领域的不断扩大,计算机用户的队伍也在不断壮大,而且这个队伍中绝大部分人不是计算机专业人员。为此,从20 世纪 50 年代中期开始,逐步发展了面向问题的程序设计语言,称为高级语言。高级语言与具体的计算机硬件无关,其表达方式接近于被描述的问题,接近于自然语言和数学语言,易为人们接受和掌握。用高级语言编写程序要比用低级语言容易得多,大大简化了程序的编制和调试过程,使编程效率得到大幅度的提高。例如,上述计算 A=15+10 的 BASIC 语言程序如下:A=15+10 15与 10 相加的结果放入 A 中PRINT A 输出 AEND 程序结束用高级语言编写的程序易学、易读、易修改,通用性好。但是,计算机同样不能直接执行高级语言程序,必须经过语言处理程序的翻译后才能被机器接受。下面列出几种最常用的高级语言及其最适用的领域:Basic教学和微小型应用程序的开发 Fortran科学及工程计算程序的开发 Pascal专业教学和应用程序的开发 C中、小型系统程序的开发 C+面向对象程序的开发2 Java Internet上应用的重要编程语言Visual Basic面向对象程序的开发 Cobol商业、交通和银行等行业应用程序的开发 Lisp人工智能程序的开发 Prolog人工智能程序的开发1.1.31.1.3语言处理程序语言处理程序计算机可以直接识别和执行的只能是机器语言程序。用汇编语言和高级语言编写的程序,都必须经过一个翻译过程才能转换为计算机所能识别的机器语言程序,实现这个翻译过程的工具是语言处理程序,即翻译程序。翻译程序除了要完成语言间的转换外,还要进行语法、语义等方面的检查。针对不同的程序设计语言编写出的程序,有各自的翻译程序,互相不通用。翻译程序可分为汇编程序和高级语言翻译程序;高级语言翻译程序有两种工作方式:解释方式和编译方式,对应的是解释程序和编译程序。1.1.汇编程序汇编程序汇编程序是一种由专业的软件开发商提供的系统软件,它能将用汇编语言编写的源程序翻译成某种类型的计算机的机器语言程序,即目标程序,这一翻译过程称为汇编。图1.1 是汇编程序的功能示意图。汇编语言源程序汇编机器语言目标程序执行执行结果汇编程序图 1.1汇编过程示意图汇编程序通常是将一条汇编语言指令翻译成一条机器语言指令。在翻译的过程中,还要对每一条指令进行语法检查,若有错误,就中断汇编过程,并以某种方式输出错误的类型及有关信息,以便用户进行修改。若没有错误,就自动生成相应的目标程序,再经过一定处理之后,便可以运行了。运行的是可执行的目标代码,与源程序及汇编程序无关。若源程序作了某些修改,则必须再重新进行汇编。2.2.解释程序解释程序解释程序的工作过程是将高级语言源程序一句一句地读入,每读入一个语句都要对它进行分析和解释,若有错误就即时中断其解释过程,并通知用户进行修改,若没有错误就按照解释结果执行所要求的操作。其工作过程如图1.2 所示。高级程序源程序一句一句地解释并执行图 1.2解释过程示意图3执行结果解释程序BASIC、LISP 等语言采用解释方式。解释方式灵活、方便,交互性好,解释执行程序的过程中也不会产生目标程序。但因为是边解释边执行,所以程序的执行速度很慢,如果源程序中出现循环结构,解释程序也要重复多次地解释循环体中的每一条语句,造成很大浪费,而且解释方式在运行源程序时离不开翻译程序。3.3.编译程序编译程序编译程序的功能是将用高级语言编写的源程序翻译成机器语言程序,即目标程序,这一翻译过程称为编译。但目标程序还不能立即装入机器执行,因为还没有连接成一个整体,在目标程序中还可能要调用一些其他语言编写的程序和标准程序库中的标准子程序,所有这些程序通过连接程序将目标程序和有关的程序库组合成一个完整的可执行程序。产生的可执行程序可以脱离编译程序和源程序独立存在并反复使用。故编译方式执行速度快,但每次修改源程序后,都必须重新编译。其工作过程如图1.3 所示。图 1.3编译过程示意图源程序编译程序目标程序连接连接程序可执行程序执行执行结果与汇编程序不同的是,编译程序往往需要将一条高级语言的语句转换成若干条机器语言指令,而且翻译的过程也要复杂得多。一般高级语言(C/C+、PASCAL、FORTRAN、COBOL等)都是采用编译方式。1.1.41.1.4 设计程序的基本原则设计程序的基本原则要设计出一个好的程序,必须了解利用计算机解决实际问题的过程,掌握程序设计的基本技术,熟练地掌握一种程序设计语言。计算机解决问题的基本过程如图1.4 所示。分析问题确定问题解决方案确定实现算法编写程序整理程序运行程序图 1.4 计算机解决问题的基本过程如何才能编写出高质量的程序呢?下面是设计程序时应遵循的基本原则:(1)正确性。正确性是指程序本身必须具备且只能具备程序设计规格说明书中所列举的全部功能。它是判断程序质量的首要标准。(2)可靠性。可靠性是指程序在多次反复使用过程中不失败的概率。(3)简明性。简明性的目标是要求程序简明易读。(4)有效性。程序在计算机上运行需要使用一定数量的计算机资源,如CPU 的时间、存储器的存储空间。有效性就是要在一定的软、硬件条件下,反映出程序的综合效率。(5)可维护性。程序的维护可分为校正性维护、适应性维护和完善性维护。一个软件的4可维护性直接关系到程序的可用性,因此应特别予以关注。(6)可移植性。程序主要与其所完成的任务有关,但也与它的运行环境有着一定的联系。软件的开发应尽可能远离机器的特征,以提高它的可移植程度。为了有效地进行程序设计,不仅要掌握一门高级语言,还应该学会对各类问题拟定出有效的解题步骤即算法设计。有了正确的算法,才能够编制程序。算法的好坏,决定了程序的优劣,因此,程序设计的核心任务之一就是设计算法。1.2算法所谓算法,就是问题的求解方法。例如,期末考试前的复习计划,就是“复习算法”;到医院看病,先挂号,后诊断、检查,再取药等,是“看病算法”。在计算机中,把解题过程的准确而完整地描述称为解题算法。一个算法由一些操作组成,而这些操作又是按一定的控制结构所规定的次序执行的,也就是算法由操作与控制结构两个要素组成。一个算法应该具有如下特点:(1)有穷性:一个算法应该包含有限的操作步骤,而不能是无限的;并且能在有限的时间内完成。(2)确定性:每一个步骤都是确定的,而不能是含糊的、模棱两可的。(3)有效性:每一个步骤都能得到有效地执行,并得到确定的结果。(4)有零个或多个输入:所谓输入是指执行算法时需要从外界取得必要的信息。(5)有一个或多个输出:算法的目的就是为了求解,“解”就是输出。上述所讲的算法特性,约束人们去正确地书写算法,使之能够正确无误地执行,达到求解问题的预期效果。同时,算法还应该具有直观、清晰、易懂的表示形式,以利于维护、修改和交流。1 1简单算法举例简单算法举例例例 1.11.1给出求 x1+x2+x3+x4+x5 的值的算法。算法分析如下:(1)手工计算的算法。采用手工计算的步骤为:将 x1 与 x2 相加,得到两个数之和;将上一步的和与 x3 相加,得到三个数之和;将上一步的和与 x4 相加,得到四个数之和;将上一步的和与 x5 相加,得到五个数之和。这种算法虽然是正确的,但太繁琐。如果要求x1+x2+x100,则要写 99 个步骤,显然是不可取的。(2)适合计算机处理的算法。该算法能更加简洁地表达上述解题过程,并具有通用性。先定义几个变量:设置变量 s 表示多项式之和,其初值为零;设置变量a 表示多项式中的5一项,它的值可以为 x1,x2,x5;用 i 记录被加了几次,其初值为1。解题步骤为:s0;i1;axi;(使 a 等于多项式中的第 i 项)ss+a;(求和,并将结果保留在s 中)ii+1;(计数增值)若 i 5,则重复,各步;否则,计算结束;输出 s。2 2算法的表示算法的表示算法的表示,有多种不同的方法。如自然语言、传统流程图、结构化流程图、伪代码、PAD图等。(1)自然语言。自然语言就是人们日常使用的语言,可以是汉语、英语或其他语言。这样的算法通俗易懂,但文字冗长,容易出现“歧义性”,在表示包含分支和循环的算法时,不太方便和直观。因此,除了很简单的问题以外,一般不用自然语言表示。(2)传统流程图。流程图(Flowchart)是用一些框图、线条及文字说明来描述算法。美国国家标准化协会 ANSI 规定了一些常用的流程图符号。如表1.1 所示。用三种基本结构作为表示一个良好算法的基本单元,由它们可以嵌套、组合,形成复杂的程序流程图。图1.5 表示了三种基本结构的传统流程图。其中,(a)表示顺序结构,(b)表示选择结构,(c)表示当型循环结构,(d)表示直到型循环结构。顺序结构。图 1.5(a)中,两个框是顺序执行的。即先执行“处理 1”框所指定的操作,接着执行“处理 2”框所指定的操作。选择结构,又称分支结构。图1.5(b)中,当条件满足时执行“处理1”框,否则执行“处理 2”框。循环结构,又称重复结构。图1.5(c)中,首先判断条件是否满足,若条件满足,则执行“处理”框指定的操作,之后返回再判断条件,由此构成循环,直至条件不满足为止;图1.5(d)中,先执行“处理”框指定的操作,之后判断条件是否满足,若条件不满足,就返回执行“处理”框指定的操作,直到条件满足为止。处理 12处理(a)顺序结构(b)选择结构(c)当型循环结构(d)直到型循环结构图 1.5 三种基本结构的传统流程图满足条件处理 1处理 2不满足条件满足处理不满足处理条件不满足满足6表 1.1传统流程图常用的符号图形名称说明流向线表示算法流程方向;箭头方向为入口,相背方向为出口开始、结束框开始框仅有流向线从其流出,而结束框仅有流向线流入处理框也称矩形框,表示确定的处理、步骤输入输出框表示原始数据的输入和处理结果的输出判断框允许有一个入口,两个或两个以上的可选择的出口连接点用来将画在不同地点的流程线连接起来功能调用框表示执行模块或子程序注释框用于书写注释信息流程图形象、直观,便于交流,广泛使用。例例 1.21.2输入一个整数,将它倒过来输出。例如,输入12345,输出为 54321。试给出其算法。流程图见图 1.6。定义变量 x输入一整数给 xx0?是不是d=x%10;输出 d;x=x/10 的整数;程序结束图 1.6 用传统流程图表示算法例例 1.31.3从键盘输入 100 个数,求出这 100 个数的累加和,并找出它们的最大值和最小值。试用传统流程图表示解决这个问题的算法。流程图见图 1.7。7程序结束图 1.7 传统流程图的应用输出变量 sum,max,min 的值xmin是min=ximax是不是max=xsum=sum+xi=i+1(3)N-S 流程图。随着结构化程序设计的兴起,简化了控制流向,出现了N-S 图。N-S 图是美国学者 I.Nassi 和 B.Shneiderman 提出的一种新的流程图形式。N-S 图中去掉了传统流程图中带箭头的流向线,全部算法以一个大的矩形框表示,该框内还可以包含一些从属于它的小矩形框,适于结构化程序设计。图 1.8 表示了结构化程序设计的三种基本结构的N-S 流程图表示。其中,(a)表示顺序结构,(b)表示选择结构,(c)表示当型循环结构,(d)表示直到型循环结构。处理 1处理 2(a)顺序结构成立处理 1条件 P不成立处理 2当 P 成立时处理(c)当型循环处理直到 P 成立时为止(d)直到型循环(b)选择结构图 1.8三种基本结构的 N-S 流程图8例例 1.41.4从键盘输入一个整数,判别该数是否为素数。素数,也称为质数,是指只能被 1及其自身整除且大于 1 的正整数,如 2、3、5、7 等都是素数。用 N-S 流程图表示解决这个问题的算法。N-S 流程图见图 1.9。(4)伪代码。伪代码是一种介于自然语言和计算机语言之间的文字和符号来表示的算法,每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便、格式紧凑,也比较好懂,便于向计算机语言算法(即程序)过渡。例例 1.51.5 将例 1.2 的算法用伪代码表示。输入一个整数给 x;while(x0)d=x%10;输出 d;x=将 x/10 得到的整数;(5)计算机语言。计算机是无法识别流程图和伪代码的,只有用计算机语言编写的程序才能被计算机执行(当然还要经过翻译等处理)。因此,在用流程图或伪代码表示出一个算法后,还要将它转换称计算机语言程序。用计算机语言表示算法必须严格遵循所用语言的语法规则,这是和伪代码不同的。例例 1.61.6 将例 1.2 的算法用 C 语言表示。#include main()int x,d;是输出 n 是素数是从键盘输入一个数给 nw=0;i=2r=n%i(求 n 除以 i 的余数)r=0?不是w=1i=i+1直到 i=n 或 w=1 时为止w=0?不是输出 n 不是素数图 1.9 判断素数的 N-S 流程图9x=12345;while(x!=0)d=x%10;printf(“%d”,d);x=x/10;在这里,读者只需大体看懂它即可,在以后的各章中会详细介绍C 语言有关的使用规则。应当强调说明的是,写出了C 程序,仍然只是表示了算法,并未实现算法,只有运行程序才是实现算法。应该说,用计算机语言表示的算法是计算机能够执行的算法。1.3 结构化程序设计方法程序设计是一门技术,需要相应的理论、技术、方法和工具来支持。就程序设计方法和技术而言,主要经过了结构化程序设计和面向对象的程序设计阶段。结构化程序设计强调程序设计风格和程序结构的规范化,提倡结构清晰。良好的程序设计风格可以使程序结构清晰合理,使程序代码便于维护。著名的“清晰第一,效率第二”的论点已成为当今主导的程序设计风格。结构化程序设计方法的基本思路是,把一个复杂的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。结构化设计方法的主要原则可以概括为自顶向下,逐步细化,模块化,限制使用GOTO 语句。(1)自顶向下。程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。先从最上层总体目标开始设计,逐步使问题具体化。(2)逐步求精。对复杂问题,应设计一些目标做过渡,逐步细化。(3)模块化。一个复杂的问题,肯定是由若干稍简单的问题组成。模块化是把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,每个小目标成为一个模块。(4)限制使用 GOTO 语句。用三种基本结构组成的程序必然是结构化程序,这种程序便于编写、阅读、修改和维护。这就减少了程序出错的机会,提高了程序的可靠性,保证了程序的质量。例例 1.71.7求 35000 之间的所有素数(质数)。分析:我们采用自上向下、逐步细化的方法来处理这个问题。即先把这个问题分解为二个相对较小的问题:判别某数是否为素数;利用循环判别 35000 之间的所有的数是否为素数,若是就把它输出。把这两个小问题分别用两个程序模块来实现,并由此给出解决这个问题的程序流程图。图 1.10(a)是判别 35000 之间的所有的数是否为素数,若是就把它输出的流程图。但其内容还是笼统的、抽象的,因为还没有解决怎样才能实现“判别某数是否为素数”的功能,需要10进一步“细化”。在这里我们给出一种算法:用整数 i 除以从 2、3、4一直到 i-1 的每一个正整数,如果都除不尽,则 i 是素数,否则,只要其中有一个被除数能除尽,则 i 就不是素数。其实现算法如图 1.12(b)所示,该程序模块运行结束后,若变量 flag 的值为 1,则 i是素数,否则 i 不是素数。是i=3当 i5000 时i 是否为素数不是能flag=0w=2,flag=1当 wi-1 时i 能否被 w 整除不能输出 i 的值i=i+1w=w+1(a)(b)图 1.10输出 35000 之间所有的质数到此为止,已全部细化完毕。每一部分都可以分别直接用高级语言的语句来表示。由此可以看出:“自顶向下、逐步细化”是结构化程序设计方法的核心。应当学会利用这种方法把一个总的任务(即抽象化的要求)逐步具体化。可以说,逐步细化的过程是使求解问题“由抽象到具体”的过程。1.4C 语言程序的基本结构C 语言是目前国际上流行的一种结构化的程序设计语言,它不仅是开发系统软件的很好工具,而且也是开发应用软件的很好的程序设计语言。因此,它深受广大程序设计者的欢迎。1.C1.C 程序的特点程序的特点C 语言之所以能被推广并广泛应用,概括地说主要有如下特点:(1)中级语言C 语言通常被成为中级语言,这并不意味着C 语言的功能不如高级语言,而是因为它把高级语言的先进思想与汇编语言的控制和灵活性有机地结合了起来。作为中级语言,C 语言允许对位、字节和地址这些计算机功能中的基本成分进行操作。(2)结构化语言C 语言是便于进行模块化程序设计的语言,它是由一系列函数所组成,这种结构便于把一个大型程序划分为若干相对独立的模块,模块间通过函数调用来实现相互连接;C 语言直接支持顺序、选择和循环三种典型的基本结构(见第三章至第五章),使程序设计人员便于使用“自顶向下、逐步求精”的结构化程序设计技术。(3)可移植性C 语言程序具有较高的可移植性。所谓可移植性,指的是可以把为某种计算机编写的软11件运行在另一种机器或操作系统上。C 语言不包含依赖硬件的输入输出机制,其输入输出是由独立于 C 语言的库函数来实现的,这样就使 C 语言程序本身不依赖于硬件系统,也便于在不同的机器系统间移植。2.2.几个简单的几个简单的 C C 程序程序通过介绍几个简单的 C 程序,使读者对 C 程序有一个大概的了解。这些例子虽然简单,但反映了一般 C 程序的特点以及基本组成。例例 1.81.8 编写一个 C 程序,其功能是显示字符串“how are you”。#include main()printf(“how are you n”);这是一个简单而完整的C 语言程序。如果将这个程序利用编辑程序输入进计算机,并经过编译和连接后,运行结果是在显示器屏幕的当前光标位置处显示如下字符串:How are you其中 main 函数是“主函数”,每一个 C 程序都必须有一个 main 函数。函数体由花括号 括起来。本例中主函数内只有一个输出语句,printf()是由系统提供的标准库函数,它完成输出功能。双引号内的字符串原样输出。“n”是换行符,即在输出 how are you 后回车换行。语句最后有一个分号“;”。在使用标准函数库中的输入输出函数时,编译系统要求程序提供有关的信息,程序第 1行“#include”的作用就是用来提供这些信息的,在此读者不必深究,这在后面章节中有详细的介绍。例例 1.91.9 求两数之和。#include main()/*求两数之和*/int a,b,sum;/*这是定义变量*/a=88;b=99;sum=a+b;printf(“sum is%dn”,sum);本程序的作用是求两个整数a 和 b 之和 sum。/*/表示注释部分,为了便于理解,这里采用汉字来注释,当然也可以用英语或汉语拼音来注释。注释可以加在程序的任何位置,它只是用来给人看的,在程序编译和运行时不起作用。第 4 行是变量定义部分,定义 a 和 b 为整型(int)变量。第5、6 行是两个赋值语句,将整数值88 和 99 分别赋值给变量 a 和 b。第7 行是将 a+b 的结果赋值给变量 sum,第 8 行中“%d”是输出函数的“格式说明”,表示要12在这个位置输出一个“十进制整数”。printf 函数中括弧内最右端的sum 是要输出的变量,现在它的值为 187(即 88+99 之值),因此程序运行的结果是:sumis187例例 1.101.10 编程实现求两个数的最大数。#include main()/*主函数*/intmax(int x,int y);/*对被调用函数 max 的声明*/int a,b,c;/*定义变量*/scanf(“%d,%d”,&a,&b);/*输入变量 a 和 b 的值*/c=max(a,b);/*调用 max 函数,将得到的值赋给 c*/printf(“max=%d”,c);/*输出 c 的值*/intmax(int x,int y)/*定义 max 函数,函数值为整型,x,y 为形式参数*/int z;/*max 函数中用到的变量 z,也要加以定义*/if(x y)z=x;elsez=y;return(z);/*将 z 的值返回,通过 max 带回调用函数处*/本程序包括两个函数:主函数 main 和被调用的函数 max。max 函数的作用是将 x 和 y中较大者的值赋给变量 z,并用 return 语句将 z 的值返回给主函数 main。返回值是通过函数名 max 带回到 main 函数的调用处。程序第 4 行是对被调用函数 max 的声明,由于在 main函数中要调用 max 函数,而 max 函数的位置在 main 函数之后,为了使编译系统能够正确认识和调用 max 函数,需要在调用 max 函数之前对 max 函数进行声明,这在后面章节中有详细介绍。main 函数中的 scanf 是“输入函数”的名字,scanf 函数的参数“%d,%d”表示在这里要“输入”的数是两个“十进制整数”,并且要用“,”分隔;参数“&a”和“&b”中的“&”是 C 语言的一种运算符,由它来获取某个变量在存储器中的地址,scanf 函数的作用是:将从键盘输入的两个数值分别送入到变量a 和 b 的地址所标识的存储单元中,也就是给变量a 和 b 输入数值。在 main 函数的第 6 行调用 max 函数,在调用时将实际参数 a 和 b 的值分别传送给 max函数中的形式参数 x 和 y。通过执行max 函数得到一个返回值(即max 函数中变量 z 的值),把这个值再赋给变量 c。然后输出 c 的值。printf 函数中双引号内的“max=%d”,在输出时,其中“%d”将由 c 的值取代之,“max=”原样输出。程序运行情况如下:18,26(输入 18 和 26 给 a 和 b,“”表示 Enter 键)max=26(输出 c 的值)13本例的程序用到了函数调用、实参和形参等概念,我们在这里只作了简单的解释。读者如果对此不大理解,可以先不予以深究,以后在学到有关章节的内容时,问题自然迎刃而解。3.3.关于关于 C C 程序的几点说明程序的几点说明(1)程序是由函数构成的。一个源程序至少包含一个函数(main 函数),也可以包含一个 main 函数和若干个其它函数。因此,函数是程序的基本单位,被调用的函数可以是系统提供的库函数(例如 printf 和 scanf 函数),也可以是用户根据需要自己编制设计的函数,如例.10 中的 max 函数。的函数相当于其它语言中的子程序,可以说语言是一种函数式的语言,C 语言程序中的全部工作都是由函数来完成的。的函数库十分丰富,标准提供了一百多个库函数,Turbo 和 MS.0 提供了三百多个库函数,语言的这种特点使得模块化的程序设计方法更加容易实现。(2)一个函数由函数的首部和函数体两个部分组成。函数的首部包括函数名、函数类型、函数属性、函数参数(形参)名、形式参数类型,例如例1.10 中的 max 函数的首部为:intmax(intx,inty)函数类型函数名参数类型参数名函数名后面必须跟一对圆括号,但括号中的函数参数可以没有,如main()。函数体,即函数首部下面的花括号内的内容。如果一个函数内有多个花括号,则最外层的一对花括号为函数体的范围。函数体一般包括:声明部分,在这一部分,对程序中要使用的变量进行定义,对要调用的函数进行声明,如例1.10 的 main 函数中的 int a,b,c;和 intmax(int x,int y);就是完成变量的定义和函数的声明。执行部分,由若干个语句组成。当然,在某些情况下也可以没有变量定义部分(如例.8 的程序)。甚至可以既无变量定义也无执行部分。如:dump()它是一个空函数,什么也不干,但它也是一个合法的函数。(3)一个程序总是从 main 函数开始执行的,而不论 main 函数在整个程序中的位置如何。在程序中 main 函数可以放在程序最前头;也可以放在程序的最后;或在一些函数之前,在另一些函数之后。(4)程序书写格式自由,一行内可以写多个语句,一个语句也可以分写在多行上。建议在编写程序时养成良好的习惯,采用缩进式,即将同一层次对齐,低一个层次的往后缩进几个字符位置。这样可以做到层次清晰,同时增加程序的可读性。(5)每个语句和数据定义的最后必须有一个分号。分号是语句的必要组成部分。例如:ssi;语句后的分号不可缺省,即使是程序中的最后一个语句也应包含分号。(6)语言本身没有输入输出语句,输入和输出操作都是由库函数scanf 和 printf 等函数来完成的。对输入输出实行“函数化”。(7)可以用*对程序中的任何部分作注释。一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。14习习题题一、名词解释(1)程序(2)程序设计(3)机器语言(4)汇编程序(5)高级语言(6)编译程序(7)解释程序(8)算法(9)结构化的程序设计二、简述题1.设计程序时应遵循哪些基本原则?2.算法的要素是什么?算法具有哪些特点?3.算法的表示形式有哪几种?4.有哪三种基本结构?5.传统流程图与 N-S 流程图最大的区别是什么?三、用传统流程图、N-S 图分别表示求解以下问题的算法。1.有 3 个数 a,b,c,要求按由大到小的顺序把它们输出。2.依次将 10 个数输入,求出其中最大的数和最小的数并输出。3.求 1+2+3+100 的值。4.求 12310 的值。5.求下列分段函数的值。Y=3X(X1)4X-1(X=1)5(X-1)+6(1X5)6-3X(X5)6.求 100200 之间的所有素数。7.求一元二次方程 ax+bx+c=0 的根。分别考虑 d=b-4ac 大于 0、等于 0 和小于 0 三种情况。四、注释下面 C 程序的各个组成部分。main()int a,k,m;a=10;k=2;m=1;a=(k+m)*k/(k-m);printf(%dn,a);2215