版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言概述1.1C语言的发展简史和特点1.C语言的诞生与发展(1)在C语言诞生以前,系统软件主要是用汇编语言编写的。由于汇编语言程序依赖于计算机硬件,其可读性和可移植性都很差;但一般的高级语言又难以实现对计算机硬件的直接操作(这正是汇编语言的优势),于是人们盼望有一种兼有汇编语言和高级语言特性的新语言。(2)C语言是贝尔实验室的KenThompson于70年代初研制出来的,后来又被多次改进,并出现了多种版本。80年代初,美国国家标准化协会(ANSI),根据C语言问世以来各种版本对C语言的发展和扩充,制定了ANSIC标准(1989年再次做了修订)。本书以ANSIC新标准来介绍。(3)目前,在微机上广泛使用的C语言编译系统有MicrosoftC、TurboC、BorlandC等。虽然它们的基本部分都是相同的,但还是有一些差异,所以请大家注意自己所使用的C编译系统的特点和规定(参阅相应的手册)。本书选定的上机环境是TCV2.0(DOS操作系统)。
2.C语言的特点
C语言同时具有汇编语言和高级语言的优势。(1)语言简洁、紧凑,使用方便、灵活(见表1.1)。(2)运算符极其丰富(共34种,见附录III)。(3)生成的目标代码质量高,程序执行效率高。(4)可移植性好(较之汇编语言)。(5)可以直接操纵硬件。
3.在C语言中,除实现顺序、选择和循环三种基本结构等的9条控制语句外,输入输出操作均由标准库函数(不是C语言的组成部分)来实现。所以学习C语言,不仅要学习这9条控制语句和各种运算符,而且要学习并掌握常用标准库函数的使用。[Return]
1.2C语言程序的结构与书写规则1.2.1C语言程序的总体结构
一个完整的C语言程序,是由一个main()函数(又称主函数)和若干个其它函数结合而成的,或仅由一个main()函数构成。[案例1.1]仅由main()函数构成的C语言程序。/*案例代码文件名:AL1_1.C*//*功能:仅由main()函数构成的C语言程序示例*/main(){printf(“ThisisaCprogram.\n”);}程序运行结果:
ThisisaCprogram.[程序演示][案例1.2]由main()函数和1个其它函数max()构成的C语言程序。/*案例代码文件名:AL1_2.C*//*功能:由main()函数和1个其它函数max()构成的C语言程序示例*/intmax(intx,inty){return(x>y?x:y);}main(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“max=%d”,c);}程序运行情况:
8,5←┘max=8[程序演示][案例1.3]改写[案例1.2],交换main()函数和max()函数的前后位置。源程序略。程序运行情况:
69←┘max=91.函数是C语言程序的基本单位。main()函数的作用,相当于其它高级语言中的主程序;其它函数的作用,相当于子程序。2.C语言程序总是从main()函数开始执行。一个C语言程序,总是从main()函数开始执行,而不论其在程序中的位置。当主函数执行完毕时,亦即程序执行完毕。习惯上,将主函数main()放在最前头。
1.2.2函数的一般结构
任何函数(包括主函数main())都是由函数说明和函数体两部分组成。其一般结构如下:
[函数类型]函数名(函数参数表)函数说明部分
{
说明语句部分;执行语句部分;函数体部分
}
1.使用的语法符号约定
[...]──方括号表示可选(即可以指定,也可以缺省)
……──省略号表示前面的项可以重复
|──多(含2)中选1
2.函数说明由函数类型(可缺省)、函数名和函数参数表三部分组成,其中函数参数表的格式为:数据类型形参[,数据类型形参2……]例如,[案例1.2]中的函数max(),其函数说明各部分如图1-1所示。函数类型函数名函数参数表
↓↓↓intmax(intx,inty)
图1-1函数说明部分结构图注意:在旧标准中,函数可以缺省参数表。3.函数体在函数说明部分的下面、大括号(必须配对使用)内的部分。函数体一般由说明语句和可执行语句两部分构成:(1)说明语句部分说明语句部分由变量定义、自定义类型定义、自定义函数说明、外部变量说明等组成。
(2)可执行语句一般由若干条可执行语句构成。图1-2是[案例1.2]的main()函数体的示意图。/*主函数main()*/main(){intnum1,num2;变量定义部分
printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);可执行语句部分函数体
scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}
图1-2函数体结构示意图
4.说明(1)函数体中的变量定义语句,必须在所有可执行语句之前。下面程序中变量定义语句“intmax;”的位置是非法的:main(){intx,y; /*变量定义语句:定义2个整型变量x、y*/x=3; /*可执行的赋值语句:将3赋值给变量x*/y=6; /*可执行的赋值语句:将6赋值给变量y*/intmax; /*变量定义语句:出现在可执行的赋值语句“x=3;”和“y=6;”之后,非法!*/max=x>y?x:y;printf(“max=%d\n”,max);}解决办法很简单,请读者自己思考。(2)如果不需要,也可以缺省变量定义语句。1.2.3源程序书写格式1.所有语句都必须以分号“;”结束,函数的最后一个语句也不例外。2.程序行的书写格式自由,既允许1行内写几条语句,也允许1条语句分写在几行上。例如,[案例1.2]的主函数main(),也可改写成如下所示的格式:……
main(){intnum1,num2;printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}如果某条语句很长,一般需要将其分写在几行上。3.允许使用注释。C语言的注释格式为:/*……*/例如,在[案例1.1]和[案例1.2]中,以及本节其它部分给出的源程序中,凡是用“/*”和“*/”括起来的文字,都是注释。(1)“/*”和“*/”必须成对使用,且“/”和“*”、以及“*”和“/”之间不能有空格,否则都出错。
技巧:为避免遗漏必须配对使用的符号,例如注释符号、函数体的起止标识符(花括号)、圆括号等等,在输入时,可连续输入这些起止标识符,然后再在其中进行插入来完成内容的编辑。在起止标识符嵌套时,以及相距较远时,这样做更有必要。
(2)注释的位置,可以单占1行,也可以跟在语句的后面。(3)如果1行写不下,可另起1行继续写。(4)注释中允许使用汉字。在非中文操作系统下,看到的是一串乱码,但不影响程序运行。
[Return]1.3C语言的语句和关键字
1.3.1C语言的语句
与其它高级语言一样,C语言也是利用函数体中的可执行语句,向计算机系统发出操作命令。按照语句功能或构成的不同,可将C语言的语句分为五类。1.控制语句控制语句完成一定的控制功能。C语言只有9条控制语句,又可细分为三种:(1)选择结构控制语句
if()~else~,switch()~(2)循环结构控制语句
do~while(),for()~,while()~,break,continue(3)其它控制语句
goto,return
2.函数调用语句函数调用语句由一次函数调用加一个分号(语句结束标志)构成。例如,printf("ThisisaCfunctionstatement.");3.表达式语句表达式语句由表达式后加一个分号构成。最典型的表达式语句是,在赋值表达式后加一个分号构成的赋值语句。例如,“num=5”是一个赋值表达式,而“num=5;”却是一个赋值语句。4.空语句空语句仅由一个分号构成。显然,空语句什么操作也不执行。例如,下面就是一个空语句:;5.复合语句复合语句是由大括号括起来的一组(也可以是1条)语句构成。例如:
main(){……{……}/*复合语句。注意:右括号后不需要分号。*/……}复合语句的性质:(1)在语法上和单一语句相同,即单一语句可以出现的地方,也可以使用复合语句。(2)复合语句可以嵌套,即复合语句中也可出现复合语句。1.3.2关键字
C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。
(1)数据类型关键字(12个):char,double,enum,float,int,long,short,signed,struct,union,unsigned,void
(2)控制语句关键字(12个):break,case,continue,default,do,else,for,goto,if,return,switch,while
(3)存储类型关键字(4个):auto,extern,register,static
(4)其它关键字(4个):const,sizeof,typedef,volatile[Return]1.4TurboCV2.0的基本操作1.运行一个C语言程序的一般过程2.TC的启动、退出与命令菜单3.编辑并保存一个C语言源程序4.编译、连接──单个源程序文件5.运行与查看结果6.编辑下一个新的源程序[Return]1.运行一个C语言程序的一般过程
TurboC是一个集源程序编辑、编译、连接、运行与调试于一体、用菜单驱动的集成软件环境。运行一个C语言程序的一般过程:(1)启动TC,进入TC集成环境。(2)编辑(或修改)源程序。(3)编译。如果编译成功,则可进行下一步操作;否则,返回(2)修改源程序,再重新编译,直至编译成功。(4)连接。如果连接成功,则可进行下一步操作;否则,根据系统的错误提示,进行相应修改,再重新连接,直至连接成功。(5)运行。通过观察程序运行结果,验证程序的正确性。如果出现逻辑错误,则必须返回(2)修改源程序,再重新编译、连接和运行,直至程序正确。(6)退出TC集成环境,结束本次程序运行。[Return]2.TC的启动、退出与命令菜单
(1)启动TurboC:tc←┘[画面演示]启动TurboC后,其主菜单条横向排列在屏幕顶端,并被激活,其中File主项成为当前项。主菜单的下面,是Edit(编辑)窗口和Message(消息)窗口。两个窗口中,顶端横线为双线显示的,表示该窗口是活动窗口。编辑窗口的顶端为状态行,其中:.Line1Col1:显示光标所在的行号和列号,即光标位置。.Insert:表示编辑状态处于“插入”。当处于“改写”状态时,此处为空白。.d:NONAME.C:显示当前正在编辑的文件名。显示为“NONAME.C”时,表示用户尚未给文件命名。屏幕底端是7个功能键的说明,以及NumLock键的状态(显示“NUM”时,表示处于“数字键”状态;空白,表示“控制键”状态)。
(2)命令菜单的使用
1)按下功能键F10,激活主菜单。如果主菜单已经被激活,则直接转下一步。
2)用左、右方向键移动光带,定位于需要的主项上,然后再按回车键,打开其子菜单(纵向排列)。
3)用上、下方向键移动光带,定位于需要的子项上,回车即可。执行完选定的功能后,系统自动关闭菜单。注意:菜单激活后,又不使用,可再按F10/Esc键关闭,返回原来状态。
(3)退出TurboC
退出TC有两种方法:
1)菜单法:File|Quit(先选择File主项,再选择并执行Quit子项)
2)快捷键法:Alt+“X”(先按下Alt键并保持,再按字母键X,然后同时放开)[Return]3.编辑并保存一个C语言源程序
(1)激活主菜单,选择并执行File|Load项(快捷键键:F3)。(2)在“LoadFileName”窗口,输入源程序文件名。文件名的输入有两种方法:直接输入和选择输入。1)直接输入按照文件名的组成字符串,逐个字符输入即可。如果是已经存在的文件,系统就在编辑窗口显示该文件的内容,可供编辑、修改。如果是新文件,则给出一个空白编辑窗口,可供输入新的源程序。如果该文件不在当前目录下,则需要冠以路径名和(或)盘符。2)选择文件(仅适用于已经存在的源程序文件)
①空回车,打开当前目录下、后缀为.C的所有文件的文件名窗口。
②用上、下、左、右方向键,将光带定位于所需的文件名上。
③按回车键。
(3)常用编辑操作在编辑源程序过程中,随时都可以按F2键(或File|Save),将当前编辑的文件存盘,然后继续编辑。这是一个良好的习惯!关于在线帮助:在任何窗口(或状态)下,按F1键激活活动窗口(或状态)的在线帮助:.下一页──PageDown,返回上一页──PageUp.关闭在线帮助、返回原窗口(或状态)──Esc.返回前一个在线帮助屏──Alt+F1(无论在线帮助是否被激活).返回在线帮助索引──F1:激活在线帮助后,再按F1,则返回在线帮助索引,以便查询其它类别在线帮助信息。.查询库函数的在线帮助信息──^F1:将光标移到需要查询函数名的首字符上,然后键入^F1,即可获得该库函数的在线帮助信息。注:为简化描述,用“^”代表“Ctrl”键。^Fn就是Ctrl+Fn,下同。[Return]
4.编译、连接──单个源程序文件
选择并执行Compile|MakeEXEFile项(快捷键:F9),则TC将自动完成对当前正在编辑的源程序文件的编译、连接,并生成可执行文件。如果源程序有语法错误,系统将在屏幕中央的“Compiling”(编译)窗口底端提示“Error:Pressanykey”(错误:按任意键)。此时,按空格键,屏幕下端的“Message”(消息)窗口被激活,显示出错(或警告)信息,光带停在第一条消息上。这时“Edit”(编辑)窗口中也有一条光带,它总是停在编译错误在源代码中的相应位置。注意:当用上、下键移动消息窗口中的光带时,编辑窗口中的光带也随之移动,始终跟踪源代码中的错误位置![Return]
5.运行与查看结果
(1)运行当前正在编辑的源程序文件选择并执行Run|Run项(快捷键:^F9),程序运行结束后,仍返回到编辑窗口。当你认为自己的源程序不会有编译、连接错误时,也可直接运行(即跳过对源程序的编译、连接步骤)。这时,TC将一次完成从编译、连接到运行的全过程。(2)查看运行结果选择并执行Run|UserScreen项(快捷键:Alt+F5)。查看完毕后,按任一键返回编辑窗口。如果发现逻辑错误,则可在返回编辑窗口后,进行修改;然后再重新编译、连接、运行,直至正确为止。[Return]
6.编辑下一个新的源程序
选择并执行File|New项即可。如果屏幕提示如下确认信息:
NONAME.Cnotsaved.Save?(Y/N)如果需要保存当前正在编辑的源程序,则键入“Y”,进入下一步操作;否则,键入“N”(不保存),跳转到(2)。(1)系统提示换名:
<d:><path>\NONAME.C直接输入你给源程序文件起的名字即可。(2)系统给出一个空白的编辑窗口,可以开始编辑下一个新的源程序。[Return]2.1算法的概念一个程序应包括对数据的描述和对数据处理的描述。
1.对数据的描述,即数据结构。数据结构是计算机学科的核心课程之一,有许多专门著作论述,本课程就不再赘述。
在C语言中,系统提供的数据结构,是以数据类型的形式出现的。
2.对数据处理的描述,即计算机算法。算法是为解决一个问题而采取的方法和步骤,是程序的灵魂。为此,著名计算机科学家沃思(NikiklausWirth)提出一个公式:
数据结构+算法=程序
(以厨师做菜为例)实际上,一个程序除了数据结构和算法外,还必须使用一种计算机语言,并采用结构化方法来表示。广义的说,算法是指为解决一个问题而采取的方法和步骤。(以生活为例)2.2简单算法举例
【例2.1】求1ⅹ2ⅹ3ⅹ4ⅹ5。设p为被乘数,i为乘数,则算法如下:S1:使p=1;S2:使i=2;S3:使pⅹi,乘积仍放在变量p中,可表示为pⅹi=>p;S4:使i的值加1,即i+1=>i;S5:如果i不大于5,返回重新执行步骤S3以及其后的步骤S4和S5;否则,算法结束。【例2.2】有50个学生,要求将他们之中成绩在80分以上者打印出来。
n1—表示第一个学生学号ni--表示第i个学生学号
g1—表示第一个学生成绩gi--表示第i个学生成绩则算法如下:S1:1=>iS2:如果gi≥80,则打印ni和gi,否则,不打印。S3:i+1=>i。S4:如果i≤50,则返回S2,继续执行;否则,算法结束。【例2.3】判定2000~2500年中的每一年是否为闰年,将结果输出。闰年的条件:(1)能被4整除,但不能被100整除的年分。(2)能被100整除,又能被400整除的年分。算法可表示如下:设y为被检测的年分,可采取以下步骤:S1:2000=>yS2:若y不能被4整除,则输出y“不是闰年”。然后转到S5S3:若y能被4整除,不能被100整除,则输出y“是闰年”。然后转到S5S4:若y能被100整除,又能被400整除,则输出y“是闰年”,否则输出y“不是闰年”然后转到S5S5:y+1=>yS6:当y≦2500时,转S2级继续执行,否则算法停止。2.3算法的特性一个算法应该具有以下特点:1.有穷性2.确定性3.有零个或多个输入4.有一个或多个输出5.有效性例如:b=0;a/b;算法的输出不一定就是计算机的打印输出,一个算法得到的结果就是算法的输出。没有输出的算法是没有意义的。2.4算法的表示为了表示一个算法,可以用不同的方法.常用的有自然语言、传统流程图、结构化流程图、伪代码、PAD图等。2.4.1用自然语言表示算法
优点:通俗易懂。缺点:文字允长,易产生歧义。2.4.2用流程图表示算法起止框输入输出框判断框处理框流程线连接点注释框图2.3流程图符号或
图2.4选择结构
图2.5连接点原因:避免交差
判断框的特点:一个入口,两个出口注释框不是流程图中必要的部分,不反映流程和操作,只是为了对流程图中某些框的操作做必要的补充说明,以便阅读。例2.1的算法流程图如下:例2.2的算法流程图如下:开始1=>p2=>ipⅹi=>pi+1=>ii>5结束NYY开始1=>ii+1=>ii>50结束NYgi>80N打印ni,gi
综上所述,流程图一般包括以下几个部分:(1)表示相应操作的框。(2)带箭头的流程线。(3)框内外必要的文字说明。流程图的优点:直观形象。缺点:对复杂算法篇幅大,费时。
2.4.3三种基本结构和改进的流程图传统的流程图结构混乱,阅读费时,特别是对有多个循环和分支的算法。为了解决这一问题,人们制定了几种基本结构,整个算法的结构就可以由这几种基本结构组合而成。(1)顺序结构(2)选择结构(3)循环结构
ABab顺序结构ABabpYN选择结构1AabpYN选择结构2AabpY当循环结构abpN直到循环结构A以上三种基本结构,有以下共同特点:(1)只有一个入口。(2)只有一个出口。注意,菱形判断框的出口和基本结构的出口的区别。(3)结构内的每一部分都有机会执行。(4)结构内不存在“死循环”。只要具有上述四个特点的都可以作为基本结构。ABpA同学们思考一下,下列三个流程图中,有哪几个是由基本结构组成?开始1=>p2=>ipⅹi=>pi+1=>ii>5结束NYY开始1=>ii+1=>ii>50结束NYgi>80N打印ni,gi2.4.4用N-S表示流程图表示算法没有流程线的流程图,所有算法写在一个矩形框内,分别也对应有三种基本结构,如下所示:AB顺序结构PABNY选择结构当P成立A循环结构1直到P成立A循环结构2注意:每个处理框可以是一个简单操作,也可以是三个基本结构之一。例2.1、2.2、2.3的N-S流程图分别如下图所示:例21例22例22例23请同学们思考一下,图2.12能转换成N-S图吗?如何改进?综上所述,可以看出与传统流程图比较,N-S流程图有如下优点:(1)文字描述直观、形象、易于理解;(2)比传统流程图紧凑易画。(3)图中位置在上面的先执行,在下面的后执行。注意:一个结构化算法是由一些基本结构顺序组成的,对于非机构化算法可以用一个结构化算法来代替(例如:图2.12转换为图2.34)2.4.6用计算机语言表示算法【例2.20】将例2.13表示的算法(求闰年)用C语言表示。main(){inty=2000;for(y=2000;y<=2500;y++){ if(y%4!=0){ printf("%disnotrunnian\n",y);continue;} elseif((y%4==0)&&(y%100!=0)){ printf("%disrunnian\n",y);continue; } elseif((y%100==0)&&(y%400==0)){ printf("%disrunnian\n",y);continue;}else printf("%disnotrunnian\n",y);}}2.5结构化程序设计方法
结构化程序设计强调程序设计风格和程序结构的规范化,其基本的思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。具体步骤如下:(1)自顶向下;(2)逐步细化;(3)模块化设计;(4)结构化编码;以写文章为例。【例2.22】将1到1000之间的素数打印出来。
(1)挖去1;(2)用下一个未被挖去的数P去除P后面个数,把P的倍数挖掉;(3)检查P是否小于n的平方根的整数部分,如果是则返回(2)继续执行,否则就结束。(4)纸上剩下的就是素数。3.1C语言的数据类型C语言提供的数据结构,是以数据类型形式出现的。具体分类如下:1.基本类型分为整型、实型(又称浮点型)、字符型和枚举型四种。2.构造类型分为数组类型、结构类型和共用类型三种。3.指针类型。在第10章中介绍。4.空类型C语言中的数据,有常量和变量之分,它们分别属于上述这些类型。本章将介绍基本类型中的整型、实型和字符型三种数据。[Return]3.2常量和变量3.3.1常量
1.常量的概念
在程序运行过程中,其值不能被改变的量称为常量。
2.常量的分类
(1)整型常量,例如:123(2)实型常量,例如:3.14(3)字符常量,例如:‘A’(4)符号常量,例如:PI常量的类型,可通过书写形式来判别。3.3.2变量1.变量的概念在程序运行过程中,其值可以被改变的量称为变量。2.变量的两个要素(1)变量名。每个变量都必须有一个名字──变量名,变量命名遵循标识符命名规则。(2)变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。3.标识符命名规则(1)有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。(2)有效长度:随系统而异,但至少前8个字符有效。如果超长,则超长部分被舍弃。例如,由于student_name和student_number的前8个字符相同,有的系统认为这两个变量,是一回事而不加区别。在TCV2.0中,变量名(标识符)的有效长度为1~32个字符,缺省值为32。(3)C语言的关键字不能用作变量名(见附录II)。注意:C语言对英文字母的大小敏感,即同一字母的大小写,被认为是两个不同的字符。习惯上,变量名和函数名中的英文字母用小写,以增加可读性。思考题:在C语言中,变量名total与变量名TOTAL、ToTaL、tOtAl等是同一个变量吗?标识符命名的良好习惯──见名知意:所谓“见名知意”是指,通过变量名就知道变量值的含义。通常应选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名。例如,name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资)。4.变量的定义与初始化在C语言中,要求对所有用到的变量,必须先定义、后使用;且称在定义变量的同时进行赋初值的操作为变量初始化。(1)变量定义的一般格式数据类型变量名[,变量名2……];例如,floatradius,length,area;(2)变量初始化的一般格式数据类型变量名=初值;例如,floatradius=2.5;[Return]3.3整型数据3.4.1整型变量
1.分类
根据占用内存字节数的不同,整型变量又分为4类:(1)基本整型(类型关键字为int)。(2)短整型(类型关键字为shortint)。(3)长整型(类型关键字为longint)。(4)无符号整型。无符号型又分为无符号基本整型(unsignedint)、无符号短整型(unsignedshort)和无符号长整型(unsignedlong)三种,只能用来存储无符号整数。2.整型变量的定义int变量名1,变量名2,….;例如:inta,b;3.占用内存字节数与值域
4.整型数据在内存中的存放方式
以补码形式存放在内存中。正数的补码是其本身,负数的补码是其绝对值的二进制码按位取反加1。inta=10;
intb=-10;0000000000001010类型字节数取值范围signedint2-32768~32767即-215~(215-1)unsignedint20~65535即0~(216-1)signedshortint2-32768~32767即-215~(215-1)unsignedshortint20~65535即0~(216-1)longint4-231~(231-1)unsignedlongint40~4294967295即0~(231-1)11111111111101105.整型变量的溢出当赋给变量的值超出了变量所允许的值域范围所产生的现象叫溢出。例如:inta=32767;intb=a+1;b的值是多少?3.4.2整型常量1.三种表示形式整型常量即整常数,在C语言中可用三种形式表示:(1)十进制。例如10、36。(2)八进制(以数字0开头)。例如012。(3)十六进制(以数字0+小写字母x开头)。例如0x36。2.分类(1)基本整型。在16位机中,用2字节存储,其数据范围与int型变量一样。(2)长整型(在数值后面加“L(l)”)。对超出基本整型值域的整型常量,可使用长整型常量表示,其取值范围可达-231~(231-1)。例如,123l、315L等。3.类型匹配规则类型匹配规则为:一个整型常量,可以赋给能容纳下其值的整型变量。例如,其值在-215~(215-1)的整型常量,可以赋给int型变量和longint型变量;其值在-231~(231-1)的整型常量,就只能赋给longint型变量。注意:常量无unsigned型。但一个非负整型常量,只要它的值不超过相应变量的值域(即取值范围),也可以赋给unsigned型变量。3.4实型数据3.5.1实型变量
存放形式:
一个是型数据一般在内存中占四个字节,按照指数形式存储(24位表示小数部分,8位表示指数部分)。例如:3.14159在内存中的存储形式如下:分类:
(1)单精度型。类型关键字为float,一般占4字节(32位)、提供7位有效数字。
(2)双精度型。类型关键字为double,一般占8个字节、提供15~16位有效数字。
实型数据的舍入误差超出有效位后的数据会被丢弃,从而产生了误差。[例3.2]main(){floata,b;a=123456.789e5;b=a+2;printf(“%f\n”,b);}3.5.2实型常量
1.表示形式
实型常量即实数,在C语言中又称浮点数,其值有两种表达形式:
(1)十进制形式。例如3.14、9.8。(2)指数形式:<尾数>E(e)<整型指数>。例如3.0E+5等。
例如:以下选项中合法的实型常数是______。
A)5E2.0
B)E-3
C).2E0
D)1.3E
2.关于类型
实型常量不分float型和double型,通常按double型来处理。一个实型常量,可以赋给一个实型变量(float型或double型)。例如:f=2.45678*4523.653.6字符型数据3.6.1字符常量1.字符常量的定义用一对单引号括起来的单个字符,称为字符常量。例如,‘A’、‘1’、‘+’等。2.转义字符C语言还允许使用一种特殊形式的字符常量,就是以反斜杠“\”开头的转义字符,常见的转义字符表如下(P48)。
【例3.3】转义字符的使用
main()
{printf(“\x4F\x4B\x21\n”); /*等价于printf(“OK!\n”);*/
printf(“\x15\xAB\n”);
}程序运行结果如下:
OK!
§½字符形式含义ASCII代码\n换行10\t水平制表9\b退格8\r回车13\f换页12\\反斜杠字符“\”92\’单撇字符39\”双撇字符34\ddd1到3位8进制数代表的字符\xhh1到2位16进制数代表的字符3.6.2字符变量字符变量的类型关键字为char,一般占用1字节内存单元。1.变量值的存储
字符变量用来存储字符常量。将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到内存单元中。例如,charc1,c2;//定义两个字符变量:c1,c2*c1=’a’;c2=’b’;//给字符变量赋值注意:一个字符变量中只能存放一个字符,而不能存放一个字符串。2.特性字符数据在内存中存储的是字符的ASCII码─一个无符号整数,其形式与整数的存储形式一样(如图3.4所示),所以C语言允许字符型数据与整型数据之间通用。(1)一个字符型数据,既可以字符形式输出,也可以整数形式输出。
[案例3.4]字符变量的字符形式输出和整数形式输出。
main()
{charch1,ch2;
ch1='a';ch2='b';printf(“ch1=%c,ch2=%c\n”,ch1,ch2);
printf(“ch1=%d,ch2=%d\n”,ch1,ch2);
}
程序运行结果:
ch1=a,ch2=b
ch1=97,ch2=98(2)允许对字符数据进行算术运算,此时就是对它们的ASCII码值进行算术运算。
[案例3.5]字母的大小写转换
main()
{charch1,ch2;
ch1=‘a’;ch2=‘B’;
printf(“ch1=%c,ch2=%c\n”,ch1-32,ch2+32);
/*用字符形式输出一个大于256的数值*/
printf("ch1+200=%d\n",ch1+200);
printf("ch1+200=%c\n",ch1+200);
printf("ch1+256=%d\n",ch1+256);
printf("ch1+256=%c\n",ch1+256);
}注意:字符数据只占一个字节,故只能存放0~255内的整数。程序运行结果:ch1=A,ch2=bch1+200=297ch1+200=)ch1+256=353ch1+256=a 思考题:用字符形式输出一个大于256的数值,会得到什么结果?3.6.3字符串常量1.字符串常量的概念和字符串长度字符串常量是用一对双引号括起来的若干字符序列。字符串中字符的个数称为字符串长度。长度为0的字符串(即一个字符都没有的字符串)称为空串,表示为“”(一对紧连的双引号)。例如,“Howdoyoudo.”、“Goodmorning.”等,都是字符串常量,其长度分别为14和13(空格也是一个字符)。
如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。例如:(1)C:\msdos\v6.22→"C:\\msdos\\v6.22"
(2)Isay:"Goodbye!"→"Isay:\"Goodbye!\"“2.字符串的存储C语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个'\0'作为字符串的结束标志。
如果有一个字符串为“CHINA”,则它在内存中的实际存储如下所示:最后一个字符'\0'是系统自动加上的,它占用6字节而非5字节内存空间。CHINA\0综上所述,字符常量'A'与字符串常量"A"是两回事:(1)定界符不同:字符常量使用单引号,而字符串常量使用双引号;(2)长度不同:字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数;(3)存储要求不同:字符常量存储的是字符的ASCII码值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志’\0’。请同学们思考下面的语句是否有错?charC;C=‘A’;C=“A”;3.6变量赋初值
赋初值是指在定义变量的同时给其赋值,也称变量初始化。例如:
floatf=3.156;charc=‘b’;inta,b,c=3;inta=3,b=3,c=3;
但是,inta=b=c=3;是非法的。初始化是在程序运行时执行的。
inta;inta=3;a=3;3.7混合运算
请思考下面表达式的特点以及其运算结果?10+’a’+1.5-8765.1234*’b’
在C语言规定,对由不同类型数据组成的表达式进行运算时,先将不同类型转换成同一类型,然后进行运算。转换时遵循以下优先级。高doublefloatlongunsigned
低intchar,short
上面表达式的值为:-858873.5932003.8算术运算与算术表达式在C语言中,除控制语句和输入输出函数外,其它所有基本操作都作为运算符处理(见P55)。
1.五种基本算术运算符
+、-(减法/取负)、*、/、%(求余数)(1)关于除法运算/C语言规定:两个整数相除,其商为整数,小数部分被舍弃。例如,5/2=2,对于负数一般“向零取整”。
(2)关于求余数运算%要求两侧的操作数均为整型数据,否则出错。
2.表达式和算术表达式(1)表达式的概念用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合C语言语法规则的式子,称为表达式。
单个常量、变量或函数,可以看作是表达式的一种特例。将单个常量、变量或函数构成的表达式称为简单表达式,其它表达式称之为复杂表达式。(2)算术表达式的概念表达式中的运算符都是算术运算符。例如,3+6*9、(x+y)/2-1等,都是算术表达式。3.运算符的优先级与结合性(1)C语言规定了运算符的优先级和结合性。优先级规定了运算符的运算先后。结合性规定了当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。自左至右的结合方向,称为左结合性。反之,称为右结合性。结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。(2)表达式求值1)按运算符的优先级高低次序执行。例如,先乘除后加减。2)如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向(结合性)进行。例如,算术运算符的结合方向是“自左至右”,即:在执行“a–b+c”时,变量b先与减号结合,执行“a-b”;然后再执行加c的运算。4.强制类型转换可以利用强制类型转换将一个表达式转换成所需类型,其基本格式如下:(类型名)表达式当被转换的表达式是一个简单表达式时,外面的一对圆括号可以缺省。例如,(double)a(等价于(double)(a))/*将变量a的值转换成double型*/(int)(x+y) /*将x+y的结果转换成int型*/(float)5/2(等价于(float)(5)/2)/*将5转换成实型,再除以2(=2.5)*/(float)(5/2) 注意:强制转换类型得到的是一个所需类型的中间量,原表达式类型并不发生变化。思考:inta=5,b;floatf;f=(float)a;b=a;思考b的值是多少?5.自增(++)、自减(--)运算++和--是单目运算符,每运算一次使变量的值增1或减1。如:++i,--i//在使用i之前,先使i的值加(减)1i++,i--//在使用i之后,再使i的值加(减)1注意:(1)虽然i++和++i都是使i的值自加1,即i=i+1,但却有区别;
例如:intj,i=3;j=++i;j=i++;(2)只能用于变量,不能用于常量或表达式。例如:++1,--1,(a+b)++//都是非法的(3)其结合方式是“从右至左”。例如:-i--相当于-(i--)思考:下列函数输出的结果是什么,i最终的值是多少?
main(){inti=3;intj=(i++)+(i++)+(i++);printf(“%d,%d”,i,j);return0;}[案例3.4]自增、自减运算符的用法与运算规则示例。main(){intx=6,y;printf("x=%d\n",x); y=++x; printf("y=++x:x=%d,y=%d\n",x,y);y=x--; printf("y=x--:x=%d,y=%d\n",x,y);}程序运行结果:x=6y=++x:x=7,y=7y=x--:x=6,y=7 3.9赋值运算与赋值表达式1.赋值运算赋值符号“=”就是赋值运算符,它的作用是将一个表达式的值赋给一个变量。赋值运算符的一般形式为:变量=赋值表达式
例如,x=5
y=(float)5/2
如果表达式值的类型与被赋值变量的类型不一致,系统自动地将表达式的值转换成被赋值变量的数据类型,然后再赋值给变量。
思考题:假设变量num的数据类型为float,其值为2.5,则执行“num=(int)num”后,num的值等于多少?2.复合赋值运算复合赋值运算符是由赋值运算符之前再加一个双目运算符构成的。复合赋值运算的一般格式为:变量双目运算符=表达式
└──┬──┘
复合赋值运算符它等价于:变量=变量双目运算符(表达式)。当表达式为简单表达式时,表达式外的一对圆括号才可缺省,否则可能出错。例如,x+=3 /*等价于x=x+3*/y*=x+6 /*等价于y=y*(x+6),而不是y=y*x+6*/C语言规定的10种复合赋值运算符如下:+=,-=,*=,/=,%=; /*复合算术运算符(5个)*/&=,^=,|=,<<=,>>=; /*复合位运算符(5个)*/3.赋值表达式由赋值运算符或复合赋值运算符,将一个变量和一个表达式连接起来的表达式,称为赋值表达式。(1)一般格式
变量赋值运算符表达式(2)赋值表达式的值任何一个表达式都有一个值,赋值表达式也不例外。被赋值变量的值,就是赋值表达式的值。例如,“a=5”这个赋值表达式,变量a的值“5”就是它的值。a=5+(c=6)注意:赋值表达式与赋值语句之间的区别a=b=c//是赋值表达式a=b=c;//是赋值语句4.1C语句概述C程序是由若干源程序构成,源程序又是若干函数组成,而函数却是由若干数据和语句构成,所以C语句是基础中的基础。4.1.1有效语句的条件
条件:①必须能产生机器操作,并完成一定操作任务。
②必须有一个分号作为语句标志。例如:inta=4;return1;注意:有分号作为结尾的并不一定是语句;例如:inta;//不是语句,只是定义了一个变量程序应该包括数据描述(由声明部分来实现)和数据操作(由语句实现)。4.1.2分类(1)控制语句(有9个,见P68)作用:完成控制功能例如:if(x>y)z=x;elsez=y;(2)函数调用语句作用:完成函数调用例如:a=max(7,8);(3)表达式语句由任一表达式加一个分号构成;例如:i=i+1;//赋值语句
i++;(4)空语句
;(5)复合语句:由一对{}括起来的多个语句构成的语句4.3C语言中的输入输出
输入:从输入设备(键盘、磁盘、扫描仪)向计算机输入数据.
输出:从计算机向外部输出设备(显示器、打印机、磁盘)输出数据。(1)C语言本身不提供输入输出语句,输入输出是由函数来实现。一般由C语言的库函数提供,有如下几类:输入:getchar(),scanf(),gets()
输出:putchar(),printf(),puts()(2)使用C语言库函数时,要用“#include”命令将头文件包含进来。例如:#include<stdio.h>
或#include“stdio.h”
[案例4.1]已知圆半径radius=1.5,求圆周长和圆面积。
main()
{floatradius=1.5,length,area,pi=3.1415926;
length=2*pi*radius; /*求圆周长*/
area=pi*radius*radius; /*求圆面积*/
printf(“radius=%f\n”,radius); /*输出圆半径*/
printf(“length=%7.2f,area=%7.2f\n”,length,area);}
程序运行结果如下:
radius=1.500000length=9.42,area=7.07
4.4格式化输出——printf()函数printf()函数的作用:向计算机系统默认的输出设备输出一个或多个任意类型的数据。4.4.1printf()函数的一般格式printf(”格式控制”,输出列表);例如:printf(”%d,%c”,i,c);1.格式控制(由三部分组成)(1)格式控制符。格式控制符的一般形式如下:%[宽度][.精度][类型]
例如:%7.2f
常用的类型字符如表4.1所示,常用的宽度和精度指示符如表4.2所示。(2)普通字符──格式字符串中的普通字符,原样输出。例如,[案例4.1]中的printf(”radius=%f\n“,radius);(3)转义字符例如,[案例4.1]中printf()函数中的‘\n’就是转义字符,输出时产生一个“换行”操作。2.输出列表输出列表是可选的。如果要输出的数据不止1个,相邻2个之间用逗号分开。下面的printf()函数都是合法的:(1)printf("Iamastudent.\n");
(2)printf("%d",3);
(3)printf("a=%fb=%5d\n",a,a+3);
必须强调:“格式控制符”中的格式指示符,必须与“输出列表”中、输出项的数据类型一致,否则会引起输出错误。
4.1.2格式指示符
输出不同类型的数据,要使用不同的类型转换字符。
1.%d──以带符号的十进制整数形式输出。
[案例4.2]类型转换字符d的使用。
main(){intnum1=123;longnum2=123456;/*用3种不同格式,输出int型数据num1的值*/printf("num1=%d,num1=%5d,num1=%-5d,num1=%2d\n",num1,num1,num1,num1);/*用3种不同格式,输出long型数据num2的值*/printf("num2=%ld,num2=%8ld,num2=%5ld\n",num2,num2,num2);printf("num1=%ld\n",num1);} [程序演示]程序运行结果如下:num1=123,num1=□□123,num1=123□□,num1=123num2=123456,num2=□□123456,num2=123456num1=58327163 %o──八进制、无符号形式输出%x──十六进制、无符号形式输出%u──以十进制、无符号形式输出%l──输出长整型数所谓无符号形式是指,不论正数还是负数,系统一律当作无符号整数来输出。例如,printf("%d,%o,%x\n",-1,-1,-1);输出结果:-1,177777,ffff(分析原因:补码)
2.%f──以小数形式、按系统默认的宽度,输出单精度和双精度实数。[案例4.3]类型转换字符f的使用。main(){floatf=123.456;doubled1,d2;d1=1111111111111.111111111;d2=2222222222222.222222222;printf("%f,%12f,%12.2f,%-12.2f,%.2f\n",f,f,f,f,f);printf("d1+d2=%f\n",d1+d2);printf(“%e,%g”,f,f);}
程序运行结果如下:
123.456001,□□123.456001,□□□□□□123.46,123.46□□□□□□,123.46d1+d2=3333333333333.3330101.234560e+02,123.456
本案例程序的输出结果中,数据123.456001和3333333333333.333010中的001和010都是无意义的,因为它们超出了有效数字的范围。
%e以标准指数形式输出整数部分大于等于1、小于10,小数点占1位,小数部分占6位,指数部分占4位,其中e占一位,指数符号占一位,指数占2位,共计12位。例如:printf(“%e”,12.0);输出如下:
1.200000e+01%g让系统根据数值的大小,自动选择%f或%e格式、且不输出无意义的零。3.类型转换字符c──输出一个字符(只占一列宽度)。[案例4.4]类型转换字符c的使用。
main(){charc='A';inti=65;printf("c=%c,%5c,%d\n",c,c,c);printf("i=%d,%c",i,i);}程序运行结果如下:
c=A,□□□□A,65i=65,A
需要强调的是:在C语言中,整数可以用字符形式输出,字符数据也可以用整数形式输出。将整数用字符形式输出时,系统首先求该数与256的余数,然后将余数作为ASCII码,转换成相应的字符输出。4.类型转换字符s──输出一个字符串。[案例4.5]类型转换字符s的使用。/*案例代码文件名:AL3_10.C。*/main(){printf("%s,%5s,%-10s","Internet","Internet","Internet");printf("%10.5s,%4.5s\n","Internet","Internet");} [程序演示]程序运行结果如下:Internet,Internet,Internet□□,□□□□□Inter,Inter注意:系统输出字符和字符串时,不输出单引号和双引号。
4.1.3
使用说明(1)printf()可以输出常量、变量和表达式的值。但格式控制中的格式说明符,必须按从左到右的顺序,与输出项表中的每个数据一一对应,否则出错。例如,printf("str=%s,f=%d,i=%f\n","Internet",1.0/2.0,3+5,"CHINA");是错误的。(2)格式字符x、e、g可以用小写字母,也可以用大写字母。使用大写字母时,输出数据中包含的字母也大写。除了x、e、g格式字符外,其它格式字符必须用小写字母。例如,%f不能写成%F。(3)格式字符紧跟在“%”后面就作为格式字符,否则将作为普通字符使用(原样输出)。例如,printf(”c=%c,f=%f\n“,c,f);中的第一个c和f,都是普通字符。4.5格式化输入——scanf()函数scanf()函数是用来从外部输入设备向计算机主机输入数据的。
4.5.1scanf()函数的一般格式
[案例4.6]已知圆柱体的底半径radius=1.5,高high=2.0,求其体积。
main()
{floatradius=1.5,high=2.0,pi=3.14159,vol;
vol=pi*radius*radius*high;/*求体积*/
printf(“vol=%7.2f\n”,vol); /*输出求出的体积*/
} [案例4.7]已知圆柱体的底半径为radius,高为high,求其体积。
main(){floatradius,high,vol,pi=3.1415926;printf("Pleaseinputradius&high:");scanf("%f%f",&radius,&high);vol=pi*radius*radius*high;printf("radius=%7.2f,high=%7.2f,vol=%7.2f\n",radius,high,vol);}
程序运行结果如下:
Pleaseinputradius&high:1.5□2.0↙radius=□□□1.50,high=□□□2.00,vol=□□14.14
在程序中给计算机提供数据,可以用赋值语句,也可以用输入函数。在C语言中,可使用scanf()函数,通过键盘输入,给计算机同时提供多个、任意的数据。1.scanf()函数的一般格式scanf("格式字符串",输入项首地址表);(1)格式字符串。格式字符串可以包含3种类型的字符:格式指示符、空白字符(空格、Tab键和回车键)和非空白字符(又称普通字符)。格式指示符与printf()函数的相似,空白字符作为相邻2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024正式的地区代理合同范文
- 工程合同功能解析
- 水利工程维修贷款合同
- 2024医院药品供销合同
- 农业领域合作协议范本
- 2024年咨询顾问合作简单协议书
- 彩色钢板工程承包协议书
- 集装箱海运合同范本
- 2024建筑业合同范本范文
- 2024个人房产转让合同
- 防校园欺凌-课件(共28张PPT)
- 第6章 智能网联汽车测评技术
- 单向板结构设计
- 《强化学习理论与应用》环境
- 普通高等学校学生转学申请表
- 房租、水、电费(专用)收据Excel模板
- 习近平总书记关于教育的重要论述研究学习通章节答案期末考试题库2023年
- 重症急性胰腺炎ppt恢复课件
- 2022江苏省沿海开发集团限公司招聘23人上岸笔试历年难、易错点考题附带参考答案与详解
- 乡镇卫生院6S管理内容和要求
- 数学教育概论 第3版
评论
0/150
提交评论