版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第一章程序设计基本概念1.1程序和程序设计1.1.1C程序当今,计算机已广泛应用于社会生活的各个领域,成为大众化的现代工具。但是,不熟悉计算机的人仍然把它想象得十分神秘。其实,计算机不过是一种具有内部存储能力、由程序自动控制的电子设备。人们将需要计算机做的工作写成一定形式的指令,并把它们存储在计算机的内部存储器中,当人们给出命令之后,它就按指令操作顺序就自动进行。人们把这种可以连续执行的一条条指令的集合称为“程序二可以说,程序就是人与机器进行“对话”的语言,也就是我们常说的“程序设计语言”。目前,在社会上使用的程序设计语言有上百种,它们都被称为计算机的“高级语言”,如BASIC,PASCAL以及本书将介绍的C语言等。这些语言都是用接近人们习惯的自然语言和数学语言做为语言的表达形式,人们学习和操作起来感到十分方便。但是,对于计算机本身来说,它并不能直接识别由高级语言编写的程序,它只能接受和处理由0和1的代码构成的二进制指令或数据。由于这种形式的指令是面向机器的,因此也称为“机器语言”。我们把由高级语言编写的程序称为“源程序”,把由二进制代码表示的程序称为“目标程序”。如何把源程序转换成机器能够接受的目标程序,软件工作者编制了一系列软件,通过这些软件可以把用户按规定语法写出的语句一一翻译成二进制的机器指令。这种具有翻译功能的软件称为“编译程序”。每一种高级语言都有与它对应的编译程序。例如,C语言编译程序就是这样的•种软件,C语言编译程序的功能如图1.1所示。图1.1我们所写的每条C语句,经过编译(Compile)最终都将转换成二进制的机器指令。由C语言构成的指令序列称C源程序,按C语言的语法编写C程序的过程,称C语言的代码编写。C语言源程序经过C语言编译程序编译之后生成一个后缀为.OBJ的二进制文件(称为目标文件夹)。最后还要由称为“连接程序”(Link)的软件,把此.OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件。在DOS状态下,只须打入此文件的名字(而不必打入后缀.EXE),该执行文件就可运行。1.1.2程序设计简单的程序设计一般包括以下几个部分。.确定数据结构。根据任务书提出要求、指定的输入数据和输出的结果,确定存放数据的数据结构。.确定算法。针对存放数据的数据结构来确定解决问题、完成任务的一步一步的步骤。有关算法的概念将在下一节中介绍。.编码。根据确定的数据结构和算法,使用选定的计算机语言编写程序代码,输入到计算机并保存在磁盘上,简称编程。.在计算机上调试程序。消除山于疏忽而引起的语法错误或逻辑错误;用各种可能的输入数据对程序进行测试,使之对各种合理的数据都能得到正确的结果,对不合理的数据能进行适当的处理。.整理并写出文档资料。2算法学习计算机程序设计语言的目的,是要用语言作为工具,设计出可供计算机运行的程序。在拿到一个需要求解的问题之后,怎样才能编写出程序呢?除了选定合理的数据结构外,一般来说,十分关键的一步是设计算法,有了一个好的算法,就可以用任何•种计算机高级语言把算法转换为程序(编写程序)。算法是指为解决某个特定问题而采取的确定且有限的步骤。一个算法应当具有以下五个特性:.有穷性。一个算法应包含有限个操作步骤。也就是说,在执行若干个操作步骤之后,算法将结束,而且每一步都在合理的时间内完成。.确定性。算法中每一条指令必须有确切的含义,不能有二义性,对于相同的输入必能得出相同的执行结果。.可行性。算法中指定的操作,都可以通过已经实现的基本运算执行有限次后实现。.有零个或多个输入。在计算机上实现的算法,是用来处理数据对象的,在大多数情况下这些数据对象需要通过输入来得到。.有一个或多个输出。算法的目的是为了求“解”,这些“解”只有通过输出才能得到。算法可以用各种描述方法来进行描述,最常用的是伪代码和流程图。伪代码是•种近似高级语言但又不受语法约束的•种语言描述方式,这在英语国家中使用起来更方便。流程图也是描述算法的很好的工具,传统的流程图由图1.2中所示的儿中基本框组成。开始或终止处理框 输入输出框 判断框流程线连接点图1.2由这些框和流程线组成的流程图来表示算法,形象直观,简单方便,但是这种流程图对于流程线的走向没有任何限制,可以任意转向,在描述复杂的算法时所占篇幅较多,费时费力且不易阅读。随着结构化程序设计方法的出现,1973年美国学者LNassi和B.Shneiderman提出了一种新的流程图形式。这种流程图完全去掉了流程线,算法的每一步都用一个矩形框来描述,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。这种流程图用两位学者名字的第一个英文字母命名,称为N-S流程图。我们将在下一节中结合结构化程序设计中的一种基本结构来介绍这种流程图的基本结构。本书中的例题,由于比较简单,因此大都采用文字来进行描述,但要求读者读懂这两种流程图。.3结构化程序设计和模块化结构3.1结构化程序结构化程序由二种基本结构组成。.顺序结构。在本书第三章中将要介绍的如赋值语句,输入、输出语句都可构成顺序结构。当执行由这些语句构成的程序时,将按这些语句在程序中的先后顺序逐条执行,没有分支,没有转移。顺序结构可用图1.3所示的流程图表示,(a)是一般的流程图,(b)是N-S流程图。语句1语句1语句2 语句2(a) (b)图1.3.选择结构。在本书第四章中将要介绍的if语句、switch语句都可构成选择结构。当执行到这些语句时,将根据不同的条件去选择执行不同分支中的语句。选择结构可用图1.4所示的流程图表示,(a)是一般的流程图,(b)是N-S流程图。图1.4图1.4.循环结构。在本书第五章中将介绍不同形式的循环结构。它们将根据各自的条件,使同一组语句重复执行多次或一次也不执行。循环结构的流程图如图1.5和图1.6所示,其中(a)是一般流程图,(b)是N-S流程图。图1.5是当型循环。当型循环的特点是:当指定的条件满足(成立)时,就执行循环体,否则就不执行。图1.6是直到型循环,该循环的特点是:执行循环体直到指定的条件满足(成立),就不再执行循环。断表达式二>= 断表达式二>= 循环体V(a)图1.5当型循环当判断表达式满足循环体(b)已经证明,由二种基本结构组成的算法结构可以解决任何复杂的问题。由二种基本结构成的算法称为结构化算法;由三种基本结构所构成的程序称为结构化程序。(a) (b)图1.6直到型循环例1」先后输入若干个整数,要求打印出其中最大的数,当输入的数小于0时结束。用N-S流程图表示算法。解题思路是:先输入一个数,在没有其它数参加比较之前,它显然是当前最大的数,把它放到变量max中。让max始终存放当前已比较过的数中的最大值。然后输入第二个数,并与max比较。如果第二个数大于max,则将第二个数取代max中原来的值。如此先后输入和比较,每次比较后都将大者放在max中,当输入的数小于。时结束。最后max中的值就是输入的数中的最大者。根据此思路,画图N-S流程图(见图1.7)。变量x用来控制循环次数,当x>0时,执行循环体;在循环体内进行两个数比较和输入x值。从图1.7可见,在循环体的矩形框内包含一个选择结构。1.3.2模块化结构当计算机在处理较大的复杂任务时,所编写的应用程序经常山上万条语句所组成,需要由许多人共同完成。这时常常把这个复杂的任务分解成若干下子任务,每个子任务又分成很多小子任务,每个小子任务只完成一项简单的功能。在程序设计时,用一个个小模块来实现这些功能。程序设计人员分别完成一个或多个小模块。我们称这样的程序设计方法为“模块化”的方法,由一个个功能模块构成的程序结构为模块化结构。由于已把一个大程序分解成若干相对独立的子程序,每个子程序的代码一般不超过一页纸,因此对程序设计人员来说,编写程序代码已变得不再困难。这时只须对程序之间的数据传递作出统一规范,同•软件可由一组人员同时进行编写,分别时行调试,这就大大提高了程序编制的效率。软件编制人员在进行程序设计的时候,首先应当集中考虑主程序中的算法,写出主程序后再动手逐步子程序的调用。对于这些“子”程序也可用调试主程序的同样方法逐步完成其下一层子程序的调用。这就是自顶向下、逐步细化、模块化的程序设计。C语言是一种结构化程序设计语言。它直接提供了三种基本结构的语句;提供了定义“函数”的功能,在c语言中没有子程序的概念,它提供的函数可以完成子程序的所有功能;C语言允许对函数单独进行编译,从而可以实现模块化;另外还提供了丰富的数据类型。这些都为结构化程序设计提供了有力的工具。习题在TURBOC环境中用RUN命令运行一个C程序时,所运行的程序的后缀是.C语言源程序文件名的后缀是,经过编译后,生成的后缀是,经过连接后,生成文件的后缀是。结构化程序由 、、 三种基本结构组成。第二章C程序设计的初步知识C语言语法简洁,紧凑;使用方便,灵活;具有丰富的运算符和数据结构;并且能够通过函数实现程序的模块化。它既具有高级语言的一切功能,也具有低级语言的一些功能。因此它既可以用来编写系统软件,也可以用来编写应用软件。它是当前国际上广泛流行的一种计算机高级语言。简单C语言程序的结构和格式本节将通过一个简单的程序例子,介绍C程序的一些基本构成和格式,使读者对C语言程序有一个初步了解。例2.1输入矩形的两条边长,求矩形的面积。程序如下:#include"stdio.h"main()(floata,b,area;a=1.2; /*给矩形的两条边赋值*/b=3.6;area=a*b; /*f求出矩形的面积放入变量area*/printf("a=%f,b=%f,area=%f\n”,a,b,area); /*输出矩形的两条边长和面积*/)以上程序的运行结果如下:a=1.200000,b=3.600000,area=4.320000以上程序中,main是主函数名,C语言规定必须用main作为主函数名。其后的一对圆括号中间可以是空的,但这一对圆括号不能省略。程序中的第2行:main()是主函数的起始行。一个C程序可以包含任意多个不同名的函数,但必须有一个而且只能有一个主函数。一个C程序总是从主函数开始执行。在函数的起始行后面是函数体。函数体用左花括号开始,用右花括号“}”结束。其间可以有定义(说明)部分和执行语句部分。以上程序中的第4行就是程序的定义部分;第5行到第8行是程序的执行部分,执行部分语句称为可执行语句,必须放在说明部分之后,语句的数量不限,程序中由这些语句向计算机系统发出操作指令。定义语句用分号“;”结束,在以上程序中只有一个定义语句,对程序中所用到的每一个变量a、b、area进行定义并且说明它们为float类型。程序的第5、6行用两条语句分别给两条国赋值,第7行计算出矩形面积并赋给变量area,第8行按设计的格式把a、b、area的值输出到终端屏幕。C程序中的每一条执行语句都必须用分号结束,分号是C语句的一部分,不是语句之间的分隔符。C语言程序有比较自由的书写格式,但是过于“自由”的程序书写格式,往往使人们很难读懂程序,初学者应该从一开始就养成良好的习惯,使编写的程序便于阅读。在程序中可以对程序进行注释,注释部分必须用符号“/*”和“*/”括起来。“/*”和“*/”必须成对地出现,“/*”和“*/”之间不可以有空格。注释可以用西文,也可以用中文。注释可以出现在程序中任意合适的地方。注释部分对程序的运行不起作用。在注释中可以说明变量的含义、程序段的功能,以便帮助人们阅读程序。因此一个好的程序应该有详细的注释。程序中的第1行:include“stdio.h”通常称为命令行,命令行必须用号开关,最后不能加“;”,因为它不是C程序中的语句。一对双引号中的stdio.h是系统提供的文件名,该文件中包含着有关输入输出函数的信息;调用不同的标准库函数,应当包含不同的文件,以便能包含有关库函数的信息;应该调用哪个文件,将在以后章节中陆续介绍。常量、变量和标识符标识符在C语言中,标识符可用作变量名、符号名、函数名和后面将要学到的数组名、文件名以及一些具有专门含义的名字。合法的标识符山字母、数字或下划线组成,并且第一个字符必须为字母或下划线。下面的标识符都是合法的:area、PR_ini、a_array、si234、PlOlp以下都是非法的标识符:456P>cade-y、w.w、a&b在C语言的标识符中,大写字母和小写字母被认为是两个不同的字符,因此page和Page是两个不同的标识符。对于标识符的长度(即一个标识符允许的字符个数),一般的计算机系统规定取前8个字符有效,如果长于8个字符,多作的字符将不被识别。如number101和number102在计算机系统内则被认为是具有相同的标识符numberlOo有些系统允许取较长名字,读者在取名时应当了解所用系统的具体规定。C语言的标识符可分为以下三类。一.关键字C语言规定了一批标识符,它们在程序中都代表着固定的含义,不能另作它用。例如,用来说明变量类型的标识符int、float以及if语句中的if、else等都已有专门的用途,它们不能再用作变量名或函数名。C语言中的关键字请参考附录一。二.预定义标识符这些标识符在C语言中也都有特定的含义,如C语言提供的库函数的名字(如printf)和预编译处理命令(如define)等。C语言语法允许用户把这类标识符另作它用,但这将使这些标识符失去系统规定的愿意.鉴于目前各种计算机系统的C语言都一致把这类标识符作为固定的函数名或预编译处理中的专门命令使用,因此为了避免误解,建议用户不要把这些预定义标识符另作它用。三.用户标识符由用户根据需要定义的标识符称为用户标识符。一般用来给变量、函数、数组或文件等命名。程序中使用的用户标识符除要遵循起名规则外,还应注意做到“见名知义”,即选具有相关含义的英文单词或汉语拼音,如number1>red^yellow>green>work,以增加程序的可读性。如果用户标识符与关健字相同,程序在编译时将给出出错信息:如果与预定义标识符相同,系统并不报错,只是该预定义标识符将失去原定含义,代之以用户确认的含义;或者会引发一些运行时错误。常量在程序运行过程中,其值不能改变的量,称为常量。在C语言中,常量有不同的类型,有整型常量,实型常量,字符常量和字符串常量;即使是整型常量也还有短整型、长整型…….整型常量和实型常量也称数值型常量,它们有正值和负值区分。基本整型常量只用数字表示,必须不带小数点;如:12、-1、0等。实型常量通常用带小数点的数表示,如:3.14159、217828、0.0等。‘A','d'则是字符型常量。由此可见,常量的类型从字面形式即可区分,C编译程序就是以此来确定数值常量的类型的。用定义一个符号名的方法来代表一个常量可以用一个符号名来代表一个常量,但是这个符号名必须在程序中进行特别的“指定”。例2.2计算圆面积。#include"stdio.h"#definePI3.14159 /*定义符号名PI为3.14159*/main(){floatr,s;r=5.0;s=PI*r*r;printf("s=%f\n”,s);)程序运行结果如下:s=78.539749程序中用#define命令行(注意:不是语句)定义PI代表一串字符3.14159,在对程序进行编译时,凡本程序中出现PI的地方,编译程序均用3.14159这一串字符来替换,在这里,PI是一个用户自己选择的符号名,本程序中,可以把PI视为3.14159的替身。为了使之比较醒目,这种符号通常采用大写字母。用define进行定义时,必须用#号作为一行的开头,在#define命令行的最后不得加分号结束。有关#define命令行的作用,将在后续篇章中介绍,读者可以先按上述方法简单地使用。在很多C语言书中把#define命令行中定义的符号名也称为符号常量。变量其值可以改变的量称为变量。程序中所用到的每一个变量都应该有一个名字作为标识,它是属用户标识符。如例2」中的a、b和area就是由用户定义的变量名。变量名的命名规则应遵守标识符命名规则。一个变量实质上是代表了内存中的某个存储单元。程序中的变量a,就是指用a命名的某个存储单元,用户对变量a进行的操作就是对该存储单元进行操作;给变量a赋值,实质上就是把数据存入该变量所代表的内存单元中。C语言规定,程序中所要用到的变量应该先定义后使用。通常,对变量的定义放在函数的开头部分,但也可以放在函数的外部或复合语句的开头。象常量一样,变量也有类型的区分,如整型变量、实型变量、字符型变量等。C语言在定义变量的同时说明该变量的类型,系统在编译时就能根据定义及其类型为它分配相应数量的存储空间。整型数据整型常量在C语言中,整型常量可以用十进制、八进制和十六进制形式来表示。十进制基本常量用一串连续的数字来表示,如:32767、-32768、0等。八进制数用数字0开头(注意:不是字母。)。例如:010、011、016都是八进制数,它们分别代表十进制数8、9、14。因此,在C程序中不能在一个十进制整数前面加前导零。例如,不能把十进制数11写作011.注意:八进制数只能用合法的八进制数字表示,如,不能写成018,因为数字8不是八进制数字,但C编译程序对此并不报错,只是得不到正确的结果。十六进制数用数字0和字母x(或大写字母X)开头。例如:0x10、OXde、Oxf都是十六进制数,它们分别代表十进制数16、222、15。注意:十六制数只能用合法的十六进制数字表示,字母a、b、c、d、e、f,既可用大写也可用小写。整型常量又有短整型(shortint)、基本整型(int)、长整型(longint)和无符号型(unsigned)的区分。整型变量整型变量可以分为基本型、短整型、长整型和无符号型四种。本节只介绍基本类型的整型变量。基本型的整型变量用类型名关键字int进行定义,定义形式如下:intk; /*定义变量k为整型*/一个定义语句必须以一个";”号结束。在一个定义语句中也可以同时定义多个变量,变量之间用逗号隔开。如:inti,j,k; /*定义变量i、j、k为整型*/一般微机为基本型变量开辟2个字节(16个二进制位)的内存单元,并按整型数的存储方式存放数据。整型的变量只能存放整型数值。基本型整型变量中允许存放的数值范围是:-32768〜32767(B|J-2,5-(2,5-1))»当在程序中用以上方式定义变量i、j和k时,编译程序为变量i,j和k都开辟存储单元,但是并没有在存储单元中放置任何初值,因此在这些存储单元中,原有的信息(垃圾)并没有被清除,这时变量中的值是无意义的,称变量值“无定义”。C语言规定,可以在定义变量的同时给变量赋初值,也称变量初始化。如:main(){inti=l,j=0,k=2; /*定义i、j,k为整型变量,它们的初值分别为1、。和2*/}整型数据的分类在前两节中已经介绍过int类型的整型常量和整型变量。通常称int类型为基本整型。除此以外,C语言中还包括其它三种整数类型,它们是短整型(shortint)\、长整型(longint)、无符号型(unsigned),若不指定为无符号型,隐含的即为有符号型(signed)。不同的计算机系统对这几类整型所占用的字节数和数值范围有不同规定,表2.1列出了微型机(IBMPC机)中这些类型的整型数所占用的字节数和数值范围,表中方括号内的单词可写也可不写,各单词的先后次序无关紧要。signed用来说明“有符号”,不写signed也隐含为有符号。表2.1类型名称占用的字节数数值范围[signed]int2•32768〜32767[signed]short[int]2•32768〜32767[signed]long[int]4-2147483648〜2147483647unsigned[int]20〜65535unsignedshort[int]20〜65535unsignedlong[int]40〜4294967295若要表示一个长整型常量,则应该在一个整型常量后面加一个字母后缀1(L的小写)或L,如123L、3451、OL,123456L等,这些常量在内存中占四个字节。注意:一个足够大的数,如465356,虽然其面值是在长整型数的范围内,但由于数字后面未加后缀字母L,因此并不能代表一个长整型数。无论是短整型还是长整型数,都被识别为有符号整数,无符号整数在数字的末尾应该加上字母后缀u或U,若是长整型无符号整数常量,则应该加后缀lu或LU;短整型无符号常量的取值应在0〜65535范围内,长整型无符号常量的取值则在。〜4294967295的范围内。注意:无符号常量不能表示成小于0的负数,例如:-200U是不合法的。整数在内存中的存储形式计算机中,内存储器的最小存储单位称为“位(bite)”,每一个位中或者存放0,或者存放1,因此称为二进制位。大多数计算机把8个二进制位组成一个“字节(byte)”,并给每个字节分配一个地址。若干字节组成一个“字(word)”,用一个字来存放一条机器指令或一个数据。一个字含多少个字节随机机器而不同。如果-台计算机系统以两字节(16个二进制位)来存放一条机器指令,就称这台计算机的字长为16位;例如:16位微机,就是指以16位二进制位作为一个字的微型计算机。一个字节一般有8个二进制位,本书中把最右边的一位称为最低位,把最左边的一位称为最高位。在C语言中,一个int整数通常用两个字节存放;其中最高位(最左边的一位)用来存放整数的符号,若是正整数,最高位放置0,若是负整数,最高位放置1。因此,从最高位就立刻能判别出存放的•个整数是正整数还是负整数。一.正整数C语言中,当用两个字节存放一个整数时,例如整数5在内存中的二进制码为:0000000000000101对于正整数的这种存储形式称为用“原码形式”存放。因此用两个字节存放的最大正整数是:0111111111111111它的值为32767.为简单起见,书中对于整数5用一个字节00000101来表示。二.负整数C语言中,对于负整数,在内存中是以整数的“补码”形式存放。取某个二进制码的补码,如:00000101(十进制数5)的补码,步骤如下:求原码的反码。即:把1转换成0,把0转换成1.因此00000101的反码为11111010.把所求得的反码加1,即得原码的被码。因此11111010加1得1111011,这就是-5在内存中的二进制码。用两个字节表示即为:11111111111110112.要把内存中以补码形式存放的二进制码转换成十进制的负整数,步骤如下:先对各位取反。例如,有补码11H1010,取反后为00000101.将所得二进制数转换成十进制数。例如,00000101的十进制数为5.因为11111010的最高位为1,因此在所得的十进制数前面加负号,得-5.对所求得的数再减1,即为-6.由以上分析可知,由两个字节存放的最小整数是100000000000000000,它的十进制数为-32768;而-1的二进制码为uiinimnnu。读者可按以上步骤进行换算。三、无符号整数用两个字节存放一个整数时,若说明为无符号整数,其中最高位不再用来存放整数的符号,16个二进制位全部用来存放整数,因此无符号整数不可能是负数,这时,16个二进制位中全部都是1时,它所代表的整数就不再是-1而是65535,对此请读者动手自己验证。2.4实型数据实型常量实型常量又称实数。在C语言中可以用两种形式表示一个实型常量。一、小数形式即在数学中常用的实数形式,由数字和小数点组成(注意:必须要有小数点),如0.123、223、123.、0。等都是合法的实型常量。二、指数形式这种形式类似数学中的指数形式。在数学中,一个数可以用幕的形式来表示,如2.3026可以表示为0.2306X1()1、2.3026X10°,23.026X10”等形式。在C语言中,则以“e”或“E”后跟一个整数来表示以10为底数的界数。2.3026可以表示为0.2306E1、2.3026e0、6e-loC语言的语法规定,字母e(或E)之前必须要有数字,且e或E后面的指数为整数。如果写成:e3、.5e36、.e3、e等都是不合法的指数形式。注意,在字母e(或E)的前后以及数字之间不得插入空格。实型变量C语言中实型变量分为单精度型和双精度型两类,分别用类型名float和double进行定义。单精度型变量定义的形式如下:floata,b,c;双精度型变量定义的形式如下:doublex,y,z;在般计算机系统中,为float类型的变量分配4个字节的存储单元,为double类型的变量分配8个字节的存储单元,并按实型数的存储方式存放数据。实型的变量只能存储实型数;不能用整型变量存放一个实数,也不能用实型变量存放一个整数。在TURBOC中单精度实数的数值范围约在-1()38〜1()38之间,并提供7位有效位;小于10_38的数被处理成零值。双精度实数的数值范围约在-1()308〜1()3°8之间,并提供15〜16位有效位,具体精确到多少位与机器有关;小于10一308的数被处理成零值。因此,double型变量中存放的数据要比float型变量中存放的数据精确得多。我们已经介绍过,在程序中一个实数可以用小数形式表示,也可以用指数形式表示。但在内存中,实数一律是以指数形式存放的。注意:在计算机内存中可以精确地存放一个整数,不会出现误差,但整型数值的存放范围较小;使用实型数的范围大,但往往存在误差。可以给实型变量赋初值,如:main(){floata=1.5,b=0.0; /*定义a、b为实型变量,它们的初值分别为1.5和0.0*/)算术表达式基本的算术运算符在C语言中基本的算术去处符是:+、-、*、/、%。分别为加、减、乘、除、求余运算符。这些运算符需要两个运算对象,称为双目运算符。除求余运算符外,运算对象可以是整型,也可以是实型。如1+2、1.2*32。求余运算符的运算对象只能是整型。在“%”运算符左侧的运算数为被除数,右侧的运算数为除数,运算结果是两数相除后所得的余数.当运算量为负数时,所得结果的符号随机器而不同,在TURBOC中,符号与被除数相同。例如17%-3的结果为2,-19%4的结果为-3.“+”和“-”也可用作单目运算符,运算符必须出现在运算量的左边,运算量可为整型,也可为实型。如:-54、+3.9.说明:双目运算符两边运算数的类型必须一致才能进行操作。所得结果的类型与运算数的类型一致。例如1.0/2.0,其运算结果为0.5:1/2,其运算结果为0。如果双目运算符两边运算数的类型不一致,如一边是整型数,一边是实型数时,系统将自动把整型转换为实型数,使运算符两边的类型达到一致后,再进行运算。双目运算中,两边运算数的类型不一致时,类型转换规律见附录二。在C语言中,所有实型数的运算均以双精度方式进行。若是单精度数,则在尾数部分补0,使之转化为双精度数。运算符的优先级、结合性和算术表达式在C语言中,常量、变量、函数调用以及按C语言语法规则用运算符把运算数连起来的式子都是合法的表达式。凡是表达式都有一个值,即运算结果。一.算术运算符的优先级算术运算符的圆括号的优先级高低次序如下:()、+、-、*、/、%、+、一单目 双目同级同级同级高 ►低二、算术运算符和圆括号的结合性以上所列的运算符中,只有单目运算符“一”和“+”的结合性是从右到左,其余运算符的结合性都是从左到右。例如,表达式(5+1)/2的运算结果是3,圆括号的优先级高于除号;表达式5+1/2的运算结果是5,除号的优先级高于加号:表达式5*-2的运算结果是-10,单目运算符“一”的优先级高于乘号,这个表达式与5*(-2)等价。C语言运算符的优先级和结合方向见附录三。三、算术表达式用算术运算符和一对圆括号将运算量(或称操作数)连接起来的、符合C语法的表达式称为算术表达式。运算对象可以是常量、变量和函数等。例如:2+sqrt(c)*bo在计算机语言中,算术表达式求值规律与数学中的四则运算的规律类似,其运算规则和要求如下:在算术表达式中,可使用多层圆括号,但左右括号必须配对。运算时从内层圆括号开始,由内向外依次计算表达式的值。在算术表达式中,若包含不同优先级的运算符,则按运算符的优先级别由高到低进行,若表达式中运算符的级别相同,则按运算符的结合方向进行。例如表达式a+bv,因为加号和减号的优先级别相同,它们的结合性为从左到右,因此先计算a+b,然后把所得结果减去Co强制类型转换表达式强制类型转换表达式的形式如下:(类型名)(表达式)其中(类型名)称为强制类型转换运算符,可以利用强制类型转换运算符,将一个表达式的值转换成指定的类型。这种转换是根据人为要求而进行的。例如,表达式(int)3.234把3.234转换成整数3;表达式(double)(10%3)把10%3所得结果1转换成双精度数1.0.赋值表达式赋值运算符和赋值表达式在C语言中,“=”符号称为赋值运算符,由赋值运算符组成的表达式称为赋值表达,它的形式如下:变量名=表达式赋值号的左边必须是一个代表某一存储单元的变量名,或是代表某存储单元的表达式,对于初学者来说,只要记住等号左边必须是变量名即可。赋值号的右边必须是C语言中合法的表达式。赋值运算的功能是先求出右边表达式的值,然后把此值赋给等号左边的变量,确切地说,是把数据放入以该变量为标识的存储单元中去。例如,若a和b都被定义成int类型变量a=10 /*把常量10赋给变量a*/b=a /*把a中的值赋给变量b,a中的值不变*/在程序中可以多次给一个变量赋值,因此每赋一次值,与它相应的存储单元中的数据就被更新一次,内在中当前的数据就是最后一次所赋的那个数据。说明:赋值运算符的优先级别只高于逗号运算符,比其它任何运算的优先级都低,且具有自右向左的结合性。因此,对于如下的表达式:a=2+7/3由于所有其它运算符的优先级都比赋值运算符高,所以将先计算机赋值运算符右边的表达式的值,再把此值赋给变量a。赋值表达式x=y的作用是,将变量y所代表的存储单元中的内容赋给变量x所代表的存储单元,x中的原有的数据被替换掉;赋值后,y变量中的内容保持不变。此表达式应当读做“把右边的变量中的值赋予左边变量”,而不应读做“x等于y”。在赋值表达式x=x中,虽然赋值运算符两边的运算对象都是x,但出现在赋值号左边和右边的x具有不相同的含义。赋值号右边的x表示变量x所代表的存储单元中的值。赋值号左边的x代表以x为标识的存储单元。该表达式的含义是取变量x中的值放入到变量x中去。当然,这一操作并无实际意义。而n=n+l,则是合法的赋值表达式,其作用是取变量n中的值加1后再放入到变量n中;即,使变量n中的值增1.赋值运算符的左侧只能是变量不能是常量或表达式。如a+b=c是不合法的赋值表达式。赋值号右边的表达式也可以是一个赋值表达式,如a=b=7+l,按照运算符的优先级,以上表达式将先计算出7+1的值8;按照赋值运算符自右向左的结合性,将先把8赋给变量b,然后再把变量b的值赋给变量a。而表达式2=7+1=1)则是不合法的,因为在7+1=b中,赋值号的左边不是一个变量。在C语言中,“=”符号被视为一个运算符,a=19是一个表达式,而表达式应该有一个值,C语言规定最左边变量所得到的新值就是赋值表达式的值。C语言的赋值表达式可以作为语句中的某个成分出现在众多的语句或表达式中,因而比较难以掌握变量中的数值变化过程。因此要求读者在学习过程中建立正确的概念,才能准确掌握赋值表达式的运算规律。复合的赋值表达式在赋值运算符之前加上其它运算符可以构成复合赋值运算符。C语言规定可以使用10种复合赋值运算符,其中与算术运算有关的复合运算符是:+=、一=、*=、/=、%=(注意:两个符号之间不可以有空格)。复合赋值运算符的优先级与赋值运算符的优先级相同。表达式n+=l的运算规则等价于n=n+l,表达式n*=m+3的运算规则等价于n=n*(m+3),因为运算符“+”的优先级高于复合赋值运算符“*=”•其它依次类推。例2.3已有变量a,其值为9,计算表达式a+=a-=a+a的值。分析:因为赋值运算符与复合赋值运算符“一=”和“+=”的优先级相同,且运算方向自右至左,所以先计算“a+a”,因a的初值是9,所以该表达式的值为18;(2)再计算“a-=18",此式相当于“a=a-18",因a的值仍是9,所以表达式的值为一9:最后计算“a+=—9",此式相当于“a=a+(-9)”,因a的值此时已是-9,所以表达式的值为-18;由此可知,表达式a+a-=a+a的值是-18。赋值运算中的类型转换在赋值运算中,只有在赋值号右侧表达式的类型与左侧变量类型完全一致时,赋值操作才能进行。如果赋值运算符两侧的数据类型不一致,在赋值前,系统将自动先把右侧表达式求得的数值,按赋值号左边的变量的类型进行转换,也可以用强制类型转换的方式,人为地进行转换后赋给赋值号左边的变量。但这种转换仅限于数值数据之间,通常称为“赋值兼容”,对于另外一些数据,例如后面将要讨论的地址值就不能赋给一般的变量,称为“赋值不兼容”。在这里,特别需要指出的是在进行混合运算时整型数据类型之间的转换问题。在C语言的表达式中(不包括赋值表达式),如果运算符两边的整数类型不相同,将进行类型之间的转换。转换规则如下:运算符两边一个是短整型,一个是长整型,则短整型转换成长整型,然后进行运算。运算符两边一个是有符号整型,一个是无符号整型,则有符号整型转换成无符号整型,然后时行运算。在C语言的赋值表达式中,赋值号右边的值先转换成与赋值号左边的变量相同的类型,然后进行赋值。应当注意:当赋值号左边的变量为短整型,右边的值为长整型,短整型变量只能接受长整型数低位上两个字节中的数据,高位上两个字节中的数据将丢失;也就是说,右边的值不能超出短整型的数值范围,否则将得不到预期的结果。例如,若有以下定义和语句:inta;unsignedlongb;b=98304;a=b;printf(4t%d\n,,,a);则a中的值为-32768。因为98304(二进制数11000000000000000)已经超出短整型的数值范围(32767),a截取b中低16位中的值(二进制数1000000000000000),由于最高位为1,因此a中的值为-32768。(2)当赋值号左边的变量为无符号整型,右边的值为有符号整型时,把内存中的内容原样复制。右边数值的范围不应该超出左边的变量可以接受的数值的范围。同时需要注意,这时负数将转换为正数,例如,变量a被说明为unsigned类型,在进行了a=-l的赋值操作后,将使a中的值为65535.当赋值号左边的变量为有符号整型,右边的值为无符号整型时,赋值的机制同上。这时若最高位是1,将按负数处理。自加、自减运算符和逗号运算符自加运算符(++)和自减运算符(一一)一、自加运算符“++”和自减运算符“一一”的运算结果是使运算对象的值增1或减1.如i++,相当于i=i+l;i--,相当于i=i-l。因此,自加或自减运算本身也是一种赋值运算。二、++、一一运算符是单目运算符,运算对象可以是整型变量也可以是实型变量,不能是常量和表达式,因为不能给常量或表达式赋值;因此,如++3、(i+j)一一等都是不合法的。三、自加、自减运算符既可做为关缀运算符,也可做为后缀运算符而构成一个表达式,如++i、一一i、i++、i-等都是合法的表达式。但无论是作为前缀还是作为后缀运算符,对于变量本身来说自增1或自减1都具有相同的效果,但作为表达式来说却是有着不同的值。例如,若变量i为int类型,且已有值为5;则表达式++i,先进行i增1运算,表达式的值为6;一—i先进行i减1运算,表达式的值为4;i++表达式的值为5,i进行增1运算,使i中的值为6;i——表达式的值为5,i进行减1运算,使i中的值为4.四、++和一一运算符的结合方向是“自右至左二例如有一表达式-i++,i的左边是负号运算符,右边是自加运算符。负号运算符和自加运算符优先级相同;结合方向“自右至左”,即相当于对表达式一(i++)进行运算。如果需要输出表达式-i++的值,则应先取出i的值使用,输出-i的值为-3,然后使i增值为4.五、请不要在一个表达式中对同一个变量时行多次诸如i++或++i等运算,例如写成:i++*++i+i一*_i,这种表达式不仅可读性差,而且不同的编译系统对这样的表达式将作不同的解释,进行不同的处理,因而所得结果也各不相同。逗号运算符和逗号表达式“,”是C语言提供的一种特殊运算符,用逗号将表达式连接起来的式子称为逗号表达式。逗号表达式的一•般形式为:表达式1,表达式2,…,表达式n说明:逗号运算符的结合性为从左到右,因此逗号表达式将从左到右进行运算。即,先计算表达式1,最后计算表达式n»最后一个表达式的值就是此逗号表达式的值。如:(不,i++,++i,i+5)这个逗号表达式的值是10,i的值为5.(2)在所有运算符中,逗号运算符的优先级别最低。习题—.选择题以下选项中不正确的整型常量是A.12. B.-20C.1,000 D.456以下选项中正确的实型常量是A.0 B.3.1415 C.O.329X1O2D..871以下选项中不正确的实型常量是A.2.607E-1 B.0.8103e2 C.-77.77 D.456e-2以下选项中不合法的用户标识符是A.abc.c B.file C.Main D.PRINTF以下选项中不合法的用户标识符是TOC\o"1-5"\h\zA._123 B.printf C.A$ D.DimC语言中运算对象必需是整型的运算符是A.% B./ C.! D.**可以在C程序中用作用户标识符的一组标识是A.voidB.as_b3C.ForD.2cdefine_123-abc DOWORDIf case SIG若变量已正确定义并赋值,符合C语言语法的表达式是A.a=a+7; B.a=7+b+c,a++ C.int(12.3%4) D.a=a+7=c+b以下叙述中正确的是A、a是实型变量,C允许进行以下赋值a=10,因此可以这样说:实型变量中允许存放整型值。B、在赋值表达式中,赋值号右边既可以是变量也可以是任意表达式。C、执行表达式a=b后,在内存中a和b存储单元中的原有值都将被改变,a的值已由原值改变为b的值,b的值由原值变为0。D、已有a=3,b=5o当执行了表达式a=a+b,b=a-b,a=a-b之后,已使a中的值为5,b中的值为3.以下叙述中正确的是A、在C程序中无论是整数还是实数,只要在允许的范围内都能准确无误的表示。B、C程序由主函数组成。C、C程序由函数组成。D、C程序由函数和过程组成。TURBOC中int类型变量所占字节数是TOC\o"1-5"\h\zA.1 B.2 C.3 D.4不合法的十六进制数是A.oxffB.OXabc C.Oxll D.0xl9二、填空题若k为int整型变量且赋值11。请写出运算k++后表达式的值 和变量k的值 .若x为double型变量,请写出运算x=3.2,++x后表达式的值—和变量k的值 。函数体由符号一开始,用符号一结束。函数体的前面是一部分,其后是一部分。C语言中的标识符可以分为一、—和预定义标识符三类。在C语言程序中,用关键字一定义基本整型变量,用关键字一定义单精度型变量,用关键字一定义双精度型变量。把al、a2定义成单精度实型变量,并赋初值1的定义语句是.C程序中定义的变量,代表内存中的一个«表达式3.5+1/2的计算结果是«对以下数学式,写出三个等价的C语言表达式一、—、—.a-bc表达式s=10应当读作“计算机中内存储器的最小存储单位称一,其中能容纳的数是一o通常一个字节包含一个二进制位。在一个字节中能存放的最大(十进制)整数是一,它的二进制数的形式是一;最小(十进制)整数是一,它的二进制数的形式是。当计算机用两个字节存放一个整数时,其中能存放的最大(十进制)整数是一、最小(十进制)整数是一,它的二进制数的形式是—O在C语言中整数可用一进制数、一进制数和一进制数三种数制表示。三、上机改错题(读者最好在TURBOC环境下上机试一试,以便熟悉出错信息)。请指出以下C程序的错误所在#include"stdio.h";main();/*mainfunction*/floatr,s; /*/*risradius*/,/*sisareaofcircular*/*/r=5.0;s=3.14159*r*r;pritf("%f\n”,s)请指出以下C程序的错误所在#include"stdio.h"main/*mainfunction*/{floata,b,c,v; /*a,b,caresides,visvolumeofcube*/a=2.0;b=3.0;c=4.0v=a*b*c;printf(<<%f\n,,,v))第三章顺序结构本章所介绍的语句,将按它们在程序中出现的顺序逐条执行,由这样的语句的程序结构称为顺序结构。赋值语句在赋值表达式的尾部加上一个“;”,就构成了赋值语句也称表达式语句。例如a=b+c是赋值表达式,a=b+c;则是赋值语句;i=l,j=2是逗号表达式,而i=l,j=2;则是一条赋值语句。i++;i-;都是赋值语句,程序执行时,首先取出变量i中的值,加1或减1后再把新的数放入变量i中。赋值语句是一种可执行语句,应当出现在函数的可执行部分。C语言中可由形式多样的赋值表达式构成赋值语句,用法灵活,因此读者首先应当掌握好赋值表达式的运算规律才能写出正确的赋值语句。数据输出把数据从计算机内部送到计算机的外部设备上的操作称为“输出”。例如,把计算机运算结果显示在屏幕上或打印在纸匕或者送到磁盘上保留起来。从计算机外部设备将数据送入计算机内部的操作称为“输入”。C语言本身不提供用于输入和输出的语句。在C语言程序中,可以通过调用标准库函数提供的输入和输出函数来实现数据的输入和输出。printf函数的一般调用形式printf函数是C语言提供的标准输出函数,它的作用是在终端设备(或系统隐含指定的输出设备)上按指定格式进行输出。printf函数的一般调用形式如下:printf(格式控制,输出项表)如果在printf函数调用之后加上就构成了输出语句。例如:printf("a=%d,b=%d”,a,b);其中printf是函数名;在圆括号中用双引号括起来的字符串,如“a=%d,b=%d”称为格式控制串;a,b是输出项表中的输出项,它们都是printf函数的参数。在这里,格式控制的作用是:1、为各输出项提供格式转换说明格式转换说明的作用是将要输出的数据转换为指定的格式输出。它总是由“%”符号开始,紧跟其后的是格式描述符。当输出项为int类型时,系统规定用d作为格式描述字符,其形式为%d,如上面的例子;当输出项为float或double类型时,用f或e作为格式描述字符,其形式为%f或%e(对于double类型也可用%If或%le)。2,提供需要原样输出的文字或字符如以上输出语句中的“a=",“b=”等都是希望原样输出的字符。假若a,b的值分别为3和4,则以上输出的输出结果为:a=3,b=4。输出项表中的各输出项要用逗号隔开,输出项可以是合法的常量、变量或表达式。格式转换说明的个数要与输出项的个数相同,使用的格式描述符也要与它们一一对应且类型匹配。例如以下程序:main(){inti=2518;floata=3.1415;printf("i=%d,a=%f,a*10=%e\n,,,i,a,a*10);)运行后的输出结果为:i=2518,a=3.141500,a*10=3.141500e+01在以上printf的格式控制串中,i=按原样输出,在%d的位置上输出变量i的值,接着输出一个逗号和a=,在%f的位置上输出变量a的值,又输出一个逗号和a*10=,在%e的位置上输出表达式a*10的值,最后的\n是C语言中特定的转义字符,相当于一个转行符使得屏幕光标或打印机头移到下一行的开头,有关转义字符将在第六章中讨论,读者可在输出语句中先照此例使用。printf函数中常用的格式说明
每个格式说明都必须用“%”开头,以一个格式字符作为结束,在此之间可以根据需要插入“宽度说明"、左对齐符号“一”、前导零符号“0”等。.格式字符允许使用的格式字符和它们的功能如表3.1所示。在一些系统中,这些格式字符只允许用小写字母,因此建议读者使用小写字母,使程序具有通用性。表3.1格式字符说 明C输出一个字符d或i输出带符号的十进制整型数0以八进制无符号形式输出整型数(不带前导0)x或X以十六进制无符号形式输出整型数(不带前导Ox或0X)U按无符号的卜进制形式输出形型数f以带小数点的形式输出单精度和双精度数e或E以[-]m.dddddde土xx或[-]m.ddddddE土xx的指数形式输出单精度和双精度数。d的个数山精度指定。隐含的精度为6;若指定的精度为0,小数部分(包括小数点)都不输出g或GS由系统决定采用%f格式还是采用%e格式,以使输出宽度最小输出字符串中的字符,直到遇到“\0”。或者输出由精度指定的字符数P输出变量的内存地址%打印一个%.长度修饰符长度修饰符加在%和格式字符之间,对于长整型数一定要加l(long);h可用于短整型(short)或无符号短整型数的输出。.输出数据所占的宽度当使用%d、%c、%f、%e、…格式说明时,输出数据所占的宽度由系统决定(通常取数据本身的宽度,不加空格),并采用右对齐的形式。可以用以下三种方法人为控制输出数据所占的宽度。(1)在%与格式字符之间插入一个整数来指定输出宽度,注意,不能用变量。如果指定的输出宽度不够,并不影响数据的完整输出,系统会代之以隐含的输出宽度;如果指定的输出宽度多于数据实际所需宽度,数据右对齐,左边补以空格。表3.2例举了未指定宽度和指定输出宽度时的输出结果(从第一列开始)。表3.2输出语句输出结果printfC4%d\n,\42);printf("%5d\n”,42);printfC%f\nM,123.54);printf("%12f\n”,123.54);printfC4%e\n,\123.54);printf("%13e\n”,123.54);printf("%g\n”J23.5);printf("%8g\n”,123.5);421IIII142123.5400001.23540e+02Illi1.12540e+02123.51IIII1123.5(2)对于float或double类型的实型数可以有“整数1.整数2”的形式在指定宽度的同时来指定小数位的倍数。其中,“整数1”用以指定输出数据总的所占宽度,“整数2”称为精度。精度对于不同的格式字符有不同的含义。对于e、E或f,用以指定输出数据小数位所占位数。当输出数据的小数位多于“整数2”指定的宽度时,截去右边多余的小数,并对截去的第一位小数做四舍五入处理;当输出数据的小数位少于“数据2”指定的宽度时,在小数的最右边添0.当输出数据所占的宽度大于“整数1”指定的宽度时,小数位仍按上述规则处理,整数部分并不丢失。也可以用整数2”的形式来指定小数位的位数。这时输出数据的宽度由系统决定。若指定%.0,则不输出小数点和小数部分。对于g或G,用来指定输出的有效数字。对于整数,用来指定必须输出的数字个数,若输出的数字少于整数2指定的个数,则在数字前面加0补足;若输出的数字多于整数2指定的个数时,牛刀割鸡数字的实际宽度输出。对于字符串,用来指定最多输出的字符个数。表3.3例举了指定精度时的输出结果。表3.3输出语句输出结果printff4%5d\n,\42);00042printf(u%.0d\n,,,42);42printf("%8.3An”,123.55);II123.550printf(“%8.1f\n”,123.55);llllll123.6printfC%8.0f\n,\123.55);IIIIIIIIII124printf("%g\n”,123.56789);123.568printfC%.7g\n,,,l23.56789);123.5679printfCfc%.5s\nM,,,abcdefgM);abcdefg注意:输出数据的实际精度并不取决于格式控制中的域宽和小数的位宽,而是取决于数据在计算机内的存储精度。通常,系统对float类型提供7位有效数字,对于double类型提供15位或16位有效数字;格式控制中的域宽和小数的位宽指定的再大也不能改变数据的存储精度,所输出的多余位上的数字是无意义的。4o输出数据左对齐可以在指定输出宽度的同时指定数据左对齐是。这可在宽度前加一个“一”号来实现。表3.4例举了指定左对齐时的输出结果。输出语句输出结果printf("%6d\n”,123);printf(u%-6d##\nn,123);printfC%14.81f\n,\1.3455);printfC4%-14.81 1.3455);II123##123IIIII1##llllll1.34550000##1.34550000IIIII1##.使输出的数字总是有+号或一号可以在%和格式字符间(或指定的输出宽度前)加一个“+”号来实现。例如:printf(''%+d,%d+\n”,10,-10);输出结果为:+10,-10.在输出数据前加前导0可以在指定输出宽度的同时,在数据前面的多余空格处填以数字0.表3.5例举了加前导0时的输出结果。.在输出的八进制数前添加0,在输出的卜六进制数前添加Ox通常,在用格式字符。和x按八进制数和十六进制数的形式输出整数时,在数据的前面冻出现0和Ox,如果需要在输出的八进制数前添加0,在输出的卜六进制数前添加Ox,可在%号和格式字符。和x之间插入一个#号(注意:#号对其它格式字符通常不起作用)。表3.5输出语句输出结果printfC%6d\n,\12);printf(4u%06d\n,,,12);printf(“%10.5f\n”31415);printf(“%014.5f\n”,3.1415);min12000012III1113.1415000000001.34550例如:printfC'%o,%#o,%#x\n,\10,10,10,10);从第一列开始输出结果如"12,012,a,0xa3.2.3调用printf函数时的注意事项在调用printf函数进行输出时需要注意:.在格式控制串中,格式说明与输出项从左到右在类型上必须一一对应匹配。如不匹配,将导致数据不能正确输出,这时,系统并不报错。特别要提醒读者的是:在输出long整型数据时,一定要使用%Id格式说明,如果遗漏了字母1,只用了%d,将输出错误的数据。.在格式控制串中,格式说明与输出项的个数应该相同。如果格式说明的个数少于输出项的个数,多余的输出项不予输出;如果格式说明的个数多于输出项的个数,则对于多余的格式将输出不定值(或。值)。.在格式控制串中,除了合法的格式说明外,可以包含任意的合法字符(包括转义字符),这些字符在输出时将“原样照印”。.如果需要输出百分号%,则应该在格式控制串中用两个连续的百分号%%来表示。.在输出语句中改变输出变量的值,如:i=5;printf("%d%d\n”,,i,++i);则不能保证先输出i的值,然后再求i++,并输出。.printf函数的返回值通常是本次调用中输出字符的个数。3.3数据的输入scanf函数是C语言提供的标准输入函数,它的作用是在终端设备(或系统隐含指定的输入设备)上输入数据。scanf函数的一般调用形式如下:scanf(格式控制,输入项表)如果在scanf函数调用之后加上就构成了输入语句。例如:scanf("%d%d'',&a,&b);其中scanf是函数名,在圆括号中用双引号括起来的字符串如“%d%d”为格式控制串:&a,&b是输入项表中的两个输入项,它们都是scanf函数的参数。格式控制串的作用是指定输入时的数据转换格式,即格式转换说明。格式转换说明也是由“%”一切以,其后是格式描述符。当输入项为int类型时,系统规定用d作为格式描述字符,其形式为%d,如上面的例子;当输入项为float类型时,用f或e作为格式描述字符,其形式为%f或%e,输入项为double类型时,则必须用%If或%le作为格式描述符,否则输入的数据不正确。输入项表中的各输入项用逗号隔开,各输入项只能是合法的地址表达式,如上例中的&a和&b。变量a,b前的符号"&”是C语言中的求地址运算符,&a就是取变量a的地址,&b则是取变量b的地址。这也就是说,输入项必须是某个存储单元的地址。这一点,读者一定要给予充分的注意。scanf函数中常用的格式说明每个格式说明都必须用%开头,以一个“格式字符”作为结束。允许用于输入的格式字符和它们的功能如表3.6所示。在一些系统中,这些格式字符只允许用小写字母,因此建议读者使用小写字母,使程序具有通用性。表3.6格式字符说 明C输入一个字符d输入十进制整型数i输入整型数,整数可以是带前导0的八进制数,带前导Ox(或0X)的十0六进制数X以八进制形式输入整型数(可以带前导0,也可以不带)u以十六进制形式输入整型数(可以带前导Ox或0X,也可以不带)f(m无符号十进制整数e(le)以带小数点的形式或指数形式输入单精度(双精度)数s与f(l。的作用相同输入字符串说明:(1)在TURBOC环境下输入long整数时,在%和d之间必须加1;输入double型数时,在%和f(e)之间也必须加1.否则得不到正确的数据。(2)在格式控制中,格式说明的类型与输入项的类型,应该一--对应匹配。如果类型不匹配,系统并不给出出错信息,但不可能得到正确的数据。(3)在scanf函数中的格式字符前可以用•个整数指定输入数据所占宽度。但不可以对实型数指定小数位的宽度。(4)在格式控制串中,格式说明的个数应该与输入项的个数相同。若格式说明的个数少于输入项的个数时,scanf函数结束输入,多余的数据项并没从终端接受新的数据;若格式说明的个数多于输入项的个数时,scanf函数同样也结束输入。(5)当输入的数据少于输入项时,程序等待输入,直到满足要求为止。当输入的数据多于输入项时,多余的数据并不消失,而是留作下一个输入操作时的输入数据。(6)scanf函数在调用结束后将返回一个函数值,其值等于得到输入值的输入项的个数。3.3.3通过scanf函数从键盘输入数据当调用scanf函数从键盘输入数据时,最后一定要按下回车键(Enter键),scanf函数才能接受从键盘输入的数据。.输入数值数据当从键盘输入数值数据时,输入的数值数据之间用间隔符(空格符、制表符(Tab键)或回车符)隔开,间隔符数量不限。如果在格式说明中人为指定宽度时,也同样可用此方法输入。例如,假设a、b、c为整型变量,若有以下输入语句:scanf("%d%d%d”,&a,&b,&c);要求给a赋予10、给b赋予20、给c赋予30,则数据输入形式应当是:〈间隔符>10<间隔符>20(间隔符>30<CR>此处〈间隔符>可以是空格符、制表符(Tab键)或回车符,<CR>表示Enter健。.指定输入数据所占宽度可以在格式字符前加一个整数,用来指定输入数据所占宽度。当输入数值数据时,一些C编译系统并不要求必须按指定的宽度输入数据,用户可以像未指定宽度时的方式输入。.跳过输入数据的方法可以在格式字符和“%”之间加一个“*”号,它的作用是跳过对应的输入数据。例如:intal,a2,a3;scanfC4%d%*d%d%d,,,&aI,&a2,&a3);当输入以下数据时:1O|_JLJ20|_JLJ30|_Jl_l40<CR>将把10赋给al,跳过20,把30赋给a2,把40赋给a3。.输入的数据少于scanf函数要求输入的数据这时,多余的数据将留在缓冲区作为下一次输入操作的输入数据。.在格式控制串中插入其它字符读者首先应该明确:scanf函数中的格式控制串是为输入数据用的,其间的字符不能输出到屏幕上,因此,如果想在醉幕上输出字符串来提示输入,应该另外使用printf函数。若在scanf的格式控制串中插入了其它字符,则在输入时要求按一一对应的位置原样输入这些字符。例如:intal,a2,a3;scanf('*Inputa1,a2,a3:%d%d%d”,&a1,&a2,&a3);要求按以下的形式输入:Inputal,a2,a3:102030第一列注意,这里的‘'Inputal,a2,a3:''是用户输入的。字符的大小写、字符间的空格数必须和scanf的格式控制串中插入的字符串完全一致。又如:scanf("%d,%d,%d”,&al,&a2,&a3);逗号紧跟在格式字符之后,因此要求在每个输入数据之后紧跟一个逗号,以下输入的数据能正确读入:10,20,30以下输入的数据也能正确读入:10,20, 30以下输入的数据就不能正确读入,因为逗号没有紧跟在每个输入数据之后。10 ,20 ,30如果逗号不是紧跟在格式字符之后,如:scanf("%d,%d,%d”,&al,&a2,&a3);则只要求在输入数据之间插入逗号即可,因此以上的各种输入形式都能正确输入。3.4复合语句和空语句复合语句在C语言中,一对花括号“{}”不仅可用作函数体的开头和结尾的标志,也可用作复合语句的开头和结尾的标志;复合也可称为“语句块”,复合语句的语句形式如下:{语句1;语句2;…;语句n}用一对花括号把若干语句括起来构成一个语句组,一个复合语句在语法上视为一条语句,在一对花括号内的语句数量不限。例如:{a++;b*=a;printf("b=%d\n",b);}在复合语句内,不仅可以有执行语句,还可以有定义部分,定义部分应该出现在可执行语句的前面。空语句C程序中的所有语句都必须由一个分号“;”作为结束。如果只有一个分号,如:main(){;}这个分号也是条语句,称为“空语句”,程序执行时不产生任何动作。程序设计中有时需要加一个空语句来表示存在一条语句;但随意加分号也会导致逻辑上的错误,需要慎用。3.5程序举例例3.1以下程序由终端输入两个整数给变量x和y,然后输出x和y,在交换x和y中的
值后,再输出x和y,验证两个变量中的数是否正确地进行了交换。include“stdio.h"main(){intx,y,t;printf(44Enterx&y:\n");scanf(M%d%d,,,&x,&y);printf(4<x=%dy=%d\n,\x,y);t=x;x=y;y=t;以下是程序运行情况:Enterx&y:123 456<CR>以下是程序运行情况:Enterx&y:123 456<CR>x=123y=456x=456x=123(由第4行的printf输出)(从键盘输入两个整数,vCR>代表按Enter键)(由第6行的printf输出)(由第8行的printf输出)在程序中交换x和y两个变量中的数,不可以简单地用乂=丫;y=x;两条语句来实现,语句x=y;执行结果将把y中的值复制到x中,使y和x变量中具有相同的值,x中原有的值丢失,因此无法再实现两数的交换。为了不丢失x中原有的值,必须在执行x=y;之前,把x中的值放到一个临时变量中保存起来(在此,通过t=x;来实现),在执行了乂=丫;之后,再把保存在临时变量中的值赋给y(通过y=t;来实现)。例3.2输入一个double类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入后处理,然后输出此数,以便验证处理是否正确。程序如下:main(){doublex;printf(44Enterx:");scanf("%lF',&x);printfC(l)x=%f\n”,x);x=x*100;x=x+0.5;x=(int)x;x=x/100;printf(t4(2)x=%f\nM,x);}注意:在scanf函数中给double类型变量输入数据时,应该使用%If格式转换说明符,而输出时,对应的格式转换说明符可以是%If,也可以用%f。以上程序中,在main函数前省略了include"stdio.h”行,C语x程序中调用scanf和printf函数时,可以省略该命令行。习题一、选择题若a、b、c、d都是int类型变量且初值为0,以下选项不正确的赋值语句是A-.a=b=c=100;B、d++;C、c+b;D、d=(c=22)-(b++);以下选项中不是C语句的是A、{inti;i++;printf("%d\n”,i)}B、;C、a=5,c=10 D、{;}以下合法的C语言赋值语句是
C、a=58,b=58D、-i;C、a=58,b=58D、-i;D、不确定的值以下程序的输出结果是A>0B、1C、3main(){intx=10,y=3;printf(tt%d\n,,,y=x/y);}若变量已正确定义为int类型,要给a、b、c输入数据,以下正确输入语句是A、read(a,b,c) B、scanf(tt%d%d%d,,,a,b,c)C、scanf("%D%D%D”,&a,&b,&c)D、scanf(tt%d%d%d,\&a,&b,&c)若变量-正确定义为float类型,要通过赋值语句scanf("%f%f%『,&a,&b,&c)给a赋予10>b赋予22、赋予33,以下不正确的输入形式是A、10B、10.0,22.0,33.0C、10.0 D、10 2222 22.0 33.0 3333若变量已正确定义,要将a和b中的数进行交换,下面选项中不正确的是A、a=a+b,b=a-b,a=a-b; B、t=a,a=b,b=t;C、a=t;t=b;b=a; D、t=b;b=a;a=t;若变量已正确定义,以下程序段的输出结果是A、输出格式说明与输出项不匹配,输出无定值B、5.170000C、5.168000 D、5.169000x=5.16894printfC<%f\n,,,(int)(x*1000+0.5)/(float)1000);3.9若有以下程序段,c3中的值是A、0B、1/2C、0.5 D、1intc=l,c2=2,c3;c3=cl/c2;3.10若有以下程序段,其输出结果是A、0,0,-10B、0,0,5C、-10,3,-10 D、3,3,-10inta=0,b=0,c=0;c=(a-=a-5),(a=b,b+3);printf(44%d,%d,%d\n,\a,b,c);3.11当运行以下程序时,在键盘上从第一列开始输入9876543210<CR>(在此处vCR>代表Enter),则程序的输出结果是B、a=10,b=432,c=8765D、B、a=10,b=432,c=8765D、a=98,b=765.0,c=4321.0B、a=2,b=5D、a=%d„b=%dC、a=98,b=765.000000,c=4321.000000main(){inta;floatb,c;scanfC4%2d%3f%4f;&a,&b,&c);printf(**\na=%d,b=%f,c=%f\n,,,a,b,c);}以下程序的输出结果是A、a=%2,b=%5C、a=%%d,b=%%dmain(){inta=2,b=5;printff<a=%%d,b=%%d\n,\a,b);若int类型占两个字节,则以下程序段的输出是A、-1,-1B、-1,32767C、-1,32768 D、-1,65535main()inta=-l;printf("%d,%u\n'',a,a);以下程序段的输出是A、*496*B、* 496*C>*000496* D、输出格式符不合法intx=496;printf(44*%-6d*\n,,,x);以下程序段的输
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度场营销分公司智慧城市项目合作协议3篇
- 二零二五版商业街区场地租赁合作协议书6篇
- 2025年度高新技术产业常年法律顾问聘用协议3篇
- 二零二五年度企业税收筹划与税收筹划实施合同3篇
- 二零二五年度出口退税证明开具及国际金融服务合同3篇
- 二零二五年度港口码头租赁及港口货物装卸、仓储及配送服务协议8篇
- 二零二五年度土地承包经营权纠纷调解合同-@-2
- 2025草原禁牧与水资源保护管理协议合同3篇
- 2025年度个人个人借款合同信用评估标准3篇
- 二零二五食用油产品包装设计与印刷合同
- 中考模拟考试化学试卷与答案解析(共三套)
- 新人教版五年级小学数学全册奥数(含答案)
- 风电场升压站培训课件
- 收纳盒注塑模具设计(论文-任务书-开题报告-图纸)
- 博弈论全套课件
- CONSORT2010流程图(FlowDiagram)【模板】文档
- 脑电信号处理与特征提取
- 高中数学知识点全总结(电子版)
- GB/T 10322.7-2004铁矿石粒度分布的筛分测定
- 2023新译林版新教材高中英语必修一重点词组归纳总结
- 苏教版四年级数学下册第3单元第2课时“常见的数量关系”教案
评论
0/150
提交评论