版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章程序设计基础
1.1C语言简介
1.1.1C程序结构
1.简单C程序实例
【例1.1】求任意两个整数之和。
#include”stdio.h”/*编译予处理命令,表示将stdio.h(标准输入输出源文件包含到本源文件中,以便本源程序调用*/
main() /*主函数首部*/
{ /*函数体开始*/
inta,b,sum; /*声明部分,定义3个整型变量*/
a=123;b=456; /*给变量赋值*/
sum=a+b; /*变量a和b加,其和赋给变量sum*/
printf(“Thesumis%d\n”,sum);/*把运算结果输出到显示终端*/
}
运行结果:
Thesumis579【例1.2】编写程序求任意三个整数中的最小值。
#include“stdio.h”
main()/*main函数的首部*/
{/*main函数体的开始*/
intn1,n2,n3;/*定义三个整型变量*/
intminnum;/*定义变量minnum,用于存放最小值*/
printf(“\nEnterthreeintegers:”);/*输出提示信息*/
scanf(“%d,%d,%d”,&n1,&n2,&n3);/*读入变量的值*/
minnum=min(n1,n2,n3);/*调用自定义函数min*/
printf("\nMinimumis:%d",minnum);/*输出minnum的值*/
} /*main函数体的结束*/
intmin(intx,inty,intz)/*min函数的首部*/
{intm;/*定义1个整型变量*/
m=x;/*假定第一个数最小*/
if(y<m)m=y;/*如果第二个数更小,则修改m*/
if(z<m)m=z;/*如果第三个数更小,则修改m*/
returnm;/*将m的值作为函数值返回*/
}/*min函数体的结束*/
2.函数的构成
一个函数由函数首部和函数体两部分组成。
intmin(intx,inty,intz)函数首部:int为函数的类型,min为函数名,括号内为形式参数表。
{函数体的开始
intm;函数的声明部分
m=x;
if(y<m)m=y; 函数体
if(z<m)m=z; 执行部分
returnm;
}函数体的结束3.C程序的一般形式如下:
预编译处理命令
全局变量定义
main()
{
声明部分
执行部分
}
sub1()/*自定义函数1*/
{
……
}
……
subn()/*自定义函数n*/
{
……
}
1.1.2
C程序的结构特点●一个源程序有一个且只能有一个main函数(又称主函数)。C程序的执行总是从main函数开始的,在调用其它函数后,最后回到main函数中结束整个程序的执行。●C程序书写格式自由。既允许在一行内写多个语句,也允许将一个语句分写在多行上,但每个语句必须以分号结束。●C语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,用来编写各种系统程序,又能用来编写不依赖计算机硬件的应用程序,而且能够直接访问计算机的物理地址,实现汇编语言的大部分功能,即具有低级语言的功能。●生成的目标程序质量高,一般只比汇编程序生成的目标代码效率低10%~20%,而且C程序的可移植性好。
●
C语言适合于多种操作系统,如WINDOWS、UNIX,也适用于多种机型。
●
“/*……*/”表示对函数或语句的功能作注释。在“/”和“*”之间不能有空格,且“/*”和“*/”必须配对使用。注释是供人阅读的,并不参与编译和运行。注释可以出现在程序的任何地方,添加必要的注释可以提高程序的可读性。
●源程序中可以使用预处理命令(如include命令、define命令),预处理命令以“#”开头,一般预处理命令应放在源文件或源程序的最前面。
●C语言是一个锻炼编程思想的语言,适合初学程序设计的学员学习。1.1.3
C语言的历史
●C语言的前身是ALGOL60语言。它描述算法很方便,但是它离硬件比较远,不适合用来编写系统程序。●1963年,英国的剑桥大学在ALGOL60语言的基础上添加了硬件处理的功能,推出CPL语言。但CPL语言规模比较大,难以实现。●1967年英国剑桥大学的MatinRichards对CPL语言作了简化,推出了BCPL语言。●1970年美国贝尔实验室以BCPL语言为基础,又作了进一步简化,设计出更简单且更接近硬件的B语言,并用B语言写第一个UNIX操作系统。●但B语言过于简单,功能有限。1972年至1973年间,贝尔实验室在B语言的基础上设计出了C语言。C语言既保持了BCPL和B语言的优点(精练、接近硬件),又克服了它们的缺点(过于简单、数据无类型等)。
●最初,C语言被用来编写UNIX操作系统,但由于C语言的强大功能和各方面的优点逐渐为人们认识,C开始迅速传播,成为当代最优秀的程序设计语言之一。
●多年来C语言在各种计算机上的迅速推广,导致了许多C语言版本,为了明确定义与机器无关的C语言,1983年,美国国家标准化协会(ANSI)根据C语言问世以来各种版本对C的发展和扩充,制定了新的标准,称为ANSIC。1987年,ANSIC又公布了新标准87ANSIC。1990年,国际标准化组织ISO接受87ANSIC为ISOC的标准。1.1.4C语言的优点
①语言简洁、紧凑,使用方便、灵活。C语言一共只有32个关键字,9种控制语句,程序书写形式自由,主要用小写字母表示。
②运算符丰富,可以实现其他高级语言难以实现的运算。
③实践结构丰富,能够实现各种复杂的数据结构的运算。
④具有结构化的控制语句,用函数作为程序的模块单位,便于实现程序的模块化。
⑤语法控制不严格,程序设计自由度大。
⑥允许访问物理地址,实现汇编语言的大部分功能,直接对硬件进行操作。
⑦生成的目标代码质量高,程序执行效率高,一般只比汇编语言生成的目标代码效率低10%-20%。。
⑧程序的可移植性好。
⑨具有丰富的库函数,编译效率高。1.1.4C语言的不足
●运算符多,难以掌握。
●对变量类型约束不严格,常常为了类型转换上的方便不要求类型检查,导致有些情况下即使要求类型一致,但实际类型不一致也不出错,而产生莫名其妙的运算结果,影响程序的安全性。
●C语言中对数组进行处理时对数组元素的下标不做越界检查,若程序中引用数组元素时越界,容易造成数据的混乱,甚至产生更严重的错误。
●C语言比其他高级语言较难掌握。1.1.5C语言的发展
1.C与C++
●用c语言编写大型程序时,程序员要考虑的东西很多,所以很容易出错,降低了效率,于是产生了c++,c++是c的升级版。
●c只有面向过程的程序设计,c++中包括面向过程程序设计,和面向对象程序设计。c++使用面向对象的方法,杜绝了C面向过程的缺陷,在进行大项目编程时效率倍增。
●C的特点是语言体积小,效率高,语言灵活,给程序的限制小,而且可以方便的对底层进行操作,所以它非常适合于开发操作系统,驱动程序,嵌入式等对速度要求较高的程序。
●C++向下完全兼容C,C++与C相比最显著的变化就是增加了类的概念,也就是增加了面向对象的成分,可以比较容易的描述人类的思维,使得软件的开发和维护变得相对简单,直接降低了软件的成本。但因为C++是面向对象的语言,这本身就制约他的速度,所以C++适合开发大型项目。
2.C/C++与Java
●JAVA是跨平台的语言,主要分三个方向:
JavaEE(企业级应用开发)
JavaME(桌面应用程序开发)
JavaSE(手机应用开发)。
●
Java去掉了C/C++的有可无的语言元素,如指针运算、结构、枚举、联合类型、typedefs、#define、释放内存等功能,所以Java语言很精炼,减少了平常出错的50%;
●
Java实现了C++的面向对象技术但有增强,并增加了一些很有用的功能,如自动收集碎片的功能;Java解释器只需215K的RAM,因此,较C++更轻便,更精简。
●从功能的角度看,Java提供了一个功能强大语言的所有功能,但几乎没有一点含混特征。从形式上看,Java设计成C++形式,让大家很容易学习。3.C与C#
●c#是微软公司为了实现平台统一和与java争夺市场为.NETFramework量身订做的程序语言,
●
C#拥有C/C++的强大功能以及VisualBasic简易使用的特性,和C++与Java一样是面向对象(object-oriented)的程序语言,但又是第一个面向组件(Component-oriented)的程序语言。
●
C#与Java有着惊人的相似,但是与Java又有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,它是微软公司.NETwindows网络框架的主角,擅长于开发网络方面的程序。
综上所述,C语言不但历史悠久,特点明显,至今仍然得到广泛的应用,而且目前流行的C++、Java、C#等语言都是在C语言的基础上发展起来的,所以大多数高等学校至今仍然把C语言作为学生学习程序设计的入门语言。1.2程序设计的基本概念
1.2.1算法
算法--为了解决某个问题(包括数学问题和逻辑问题)或 为了完成某项任务所要执行的若干有限的操作步骤。
例:用自然语言表示的三个数从小到大的排序算法。
①输入三个数x、y、z;
②将x与y比较,若x>y,交换x与y的值;
③将x与z比较,若x>z,交换x与z的值;
④将y与z比较,若y>z,交换y与z的值;
⑤输出此时的三个数x、y、z。
1.2.2算法的特性和目标
1.算法必须具有以下五个特性:
①有输入:有零个或多个输入数据;
②有输出:有一个或多个输出数据;
③确定性:每一个步骤必须确定地定义,不能模凌两可;
④有穷性:一个算法必须在执行有限步之后终止,而且每一 步都能在有限时间内;
⑤可行性:算法中有待完成的每一步运算都是可执行的,即 可以在计算机的能力范围内用有限的时间完成。
2.算法的优劣
①可读性:算法不仅仅是让计算机来执行的,更要让人来阅读,可读性好的算法有助于调试程序、发现和修改错误,使得日后对软件功能的扩展、维护易于实现。一个算法应当思路清晰、层次分明、简单明了。
②健壮性:指算法能够对非法的输入做出合理的处理,而不是产生莫名其妙的结果。
③高效率与低存储空间需求:指解决特定问题的算法的执行时间应尽量的短,算法执行过程中需要的存储空间应尽量的小。1.2.3算法的表示
1.用自然语言表示算法
2.用传统流程图表示算法开始输入xx=0y=-1x<0y=0y=1输出y结束YNYN表1.1传统流程图常用符号
符号符号名称
含义
起止框表示算法的开始和结束输入输出框表示输入输出操作处理框表示对框内的内容进行处理判断框表示对框内的条件进行判断流程线表示流程的方向连接点表示两个具有同一标记的“连结点”应连接成一个点注释框表示对流程图中某些框的操作做必要的补充说明传统流程图的优缺点:
优点:表示算法直观形象,算法的逻辑流程一目 了然,便于理解。
缺点:
①画起来比较麻烦
②由于允许使用流程线,使用者可以随心所 欲,使流程可以任意转移,造成阅读和修 改上的困难。结构化程序设计是为了克服传统流程图的缺点结构化程序设计包括三种基本程序结构
顺序结构
选择结构循环结构真处理A处理B假条件
选择结构处理A处理B
顺序结构假真
处理A条件
当型循环结构假
处理A真条件
直到型循环结构①顺序结构
顺序地执行按先后次序排列的每一个基本的处理单位。处理A处理B
顺序结构②选择结构
根据判断条件的成立与否,选择执行不同的处理过程。当判断条件成立是,执行处理过程A,否则执行处理过程B。处理A处理B假条件
选择结构③循环结构
根据一定的条件,对某些语句重复执行。被重复执行的部分称为循环体。
A.当型循环 B.直到型循环
当型循环结构真假
处理A条件
直到型循环结构
处理A条件假真3.用N-S流程图表示算法
⑴N-S流程图的主要特点:是取消了流程线,不允许有随意的控制流,整个算法的流程写在一个矩形框内。
⑵
N-S流程图表示的三种基本结构如下:
①顺序结构,如图1.6所示。
②选择结构,如图1.7所示。图1.6顺序结构处理A处理B图1.7分支结构
条件
处理A处理B成立不成立③循环结构。
当型循环结构的N-S流程图如图1.8所示。
直到型循环结构的N-S流程图如图1.9所示。
当条件成立时继续
处理A图1.4当型循环结构
处理A图1.5直到型循环结构直到条件成立时结束对三个数进行从小到大排序的算法
输入x、y、z
x>y?YN
交换x、y
x>z?YN交换x、z
y>z?YN
交换y、z
输出x、y、z4.用伪码表示算法
伪码-------用一种介于自然语言和计算机语言之间的 文字和符号来描述算法。
例如,用伪码描述上述算法:
inputx,y,z
x→max
ify>maxtheny→max
ifz>maxthenz→max
outputmax
伪码不能在计算机上实际执行,但是用伪码表示算法方便友好,便于向计算机程序过渡。伪码的表现形式灵活自由、格式紧凑,没有严谨的语法格式
1.3程序设计方法
要想设计高质量的程序,除了熟练掌握程序设计语言的语法功能,还要注重程序设计方法和设计技巧,在实践中不断地深化了解程序设计的内涵,才能逐步提高程序设计的能力。1.3.1程序设计的步骤
简单的程序设计步骤一般包含以下几部分。
①分析问题,确定数据结构
根据问题的具体要求进行分析抽象为相应的数学模 型, 确定存放数据的数据结构。
②确定算法
根据数据结构和确定的解决方案设计出具体的操作 步骤(用流程图清晰、直观的表示出来)。
③编写程序
选用合适的程序设计语言以书面形式描述算法,即形成 用程序设计语言编制的源程序。
④调试运行程序
试运行和检验编写好的计算机程序,发现问题即进行修 改,直至得出正确的结果。
⑤建立文档资料
对程序进行整理和分析,并建立相应的文档资料以便日 后维护和修改。1.3.2结构化程序设计方法
结构化程序设计方法是为了克服软件危机
在上世纪六十年代,随着计算机的发展,软件规模和复杂性的不断增加,在大型软件开发工作中出现了许多问题,如软件开发的进度被推迟、成本超出预算等。人们开始认识到软件开发的复杂性,由此提出了“结构化程序设计方法”,旨在提高程序的可读性,保证软件的质量,降低软件的成本,提高软件开发和维护的效率。迄今为止,结构化程序设计方法仍然是一种广为使用的计算机软件开发方法。●结构化程序设计方法的目标是编写清晰、可读性好、易修改性强的程序。
●结构化程序设计方法要求程序仅由三种基本结构。而且,要求每个程序模块是单入口单出口的;程序中没有永远执行不到的语句,没有死循环即无终止的循环。
●结构化程序设计方法要求采用“模块化”的设计方法。模块化的思想就是“分而制之”,将一个复杂的任务,分解成若干个功能单一、相对独立的小任务来进行设计,每个小任务就是一个模块,每个模块由三种基本结构组成。模块的功能要独立、简单,这样才能使程序具有灵活性和可靠性。结构化程序设计过程采用“自顶向下,逐步求精”的策略。
自顶向下,是指模块的划分要从问题的顶层向下逐层分解、逐 步细化,直到最底层达到最简单的功能模块。
逐步求精,是指在将抽象问题分解为若干个相对独立的小问题 时,要逐级的由抽象到具体、由粗到细、由表及里进行细 化,直到将问题细化到可以用程序的三种基本结构来实施 为止。1.4程序设计风格
程序设计包含着程序员的大量个人行为,所以必定有个性化的一面。编程风格是指程序结构形式、行文方式的编写特点。编程风格实际上是一种编程原则,是根据软件技术发展需要提出来的,也是程序设计工作者实践经验的总结。高质量的程序必须具有良好的易读性、易理解性和易维护性,因此必须具有清晰、合理的结构、简明易懂的编码,直观标准的格式。正像内功深厚的武林高手出招往往平淡无奇一样,编程高手也不会使用奇门怪招。编程风格最重要的两条是简单和清晰。本节主要介绍编程过程中初学者主要应该注意的几个问题。1.4.1符号的命名
●符号的命名首先要符合源程序的语法规定,如长度不能超过 规定,使用规定的字符及数字等。更重要的是要见名知 意,容易理解。
●一般不要使用单个字母作符号名,试想如果一本小说里的人 和物都是以单个英文字母命名的,这样的小说还能读得 下去吗?有部分程序员喜欢用拼音给符号命名,其实许 多中国人尚且不懂拼音字母,用拼音命名的符号名怎么 能和世界接轨?怎么能走向世界?
●符号名应尽量用英文名词,这样就能达到见名知意的目的。●符号命名也要采用有经验的程序员已经形成的传统,比如宏 定义用大写字母表示如:PRICE;全局变量以大写字母 开头,如:Student、School;有的程序员在变量名前 加上变量类型的首字母,如*pflag表示flag是指针变量、 ilength表示length是整型变量,对增加程序的易读性也 很有帮助。1.4.2程序文档
根据软件工程学的观点,软件不仅仅是数据结构+算法,还包括文档。文档是程序的重要部分。事实上,注释甚至要占到源程序篇幅的三分之一。
1.序言性注释
序言性注释是在程序或模块的开头为本程序或程序段做的说明。例如可以在每个函数的开头安排一个序,说明下列内容:
(1)标志(程序名、日期、版本号)。
(2)函数的用途,采用的方法(算法)及数据结构。
(3)使用方法。
(4)函数的开发历史和所做的改动。
(5)程序之外的参考文档。2.解释性注释(功能性注释)
一般插在程序正文中,经常写在程序语句之后,用“;”或“/*”与程序语句隔开,其目的是为阅读和理解程序提供解释说明,以便说明程序为什么要这样做以及做什么。解释性注释包括下列内容:
(1)对所定义的每一个变量和常量都要说明它们是什么以 及应如何使用。
(2)对程序的每一个段落(或代码块)都加以注释,简要 说明其目的和作用。
(3)指明程序每一重要部分的结束位置,如果该位置原来 不够明显的话。
(4)解释程序中使用的某种技巧或意义不够明确的语句, 最好不要使用这种意义不明确的语句。
(5)无论何时如果程序作了改动,要保证文档作相应的修 改。1.4.3源程序的书写格式
程序中的空格、空行以及缩格是文档的重要形式,它们可以明显地增加程序的易读性,使用户一眼就能判断出程序的哪些部分相互有关,何处会发生中断,以及每个循环包含哪些语句,或一个条件语句的每种选择包含哪些语句。1.4.4语句构造
构造语句是编写程序的一个主要任务。构造语句的基本原则是简单、直接。
1.最好一行只写一条语句。
2.尽量避免使用复杂的条件测试。
3.尽量排除对“非”条件的测试。
4.避免使用多维数组,避免多重循环嵌套或条件嵌套。
5.简化表达式,利用括号使表达式的运算次序更加清晰。1.4.5输入输出
输入/输出风格与人机交互的方式有关,一般应遵循下列原则:
1.保持简单的输入格式,应保证输入数据和规定的数据格式的 一致性。
2.检查所有输入数据的有效性,并有完备的出错处理措施。
3.用标记标明交互的输入请求,规定可以使用的选择值或边 界值。
4.使用数据结束标记,不要要求用户指定数据的数目。
5.对所有输出加标记,并设计出赏心悦目的输出报告。
养成良好的编程风格并不是轻而易举的,但是千里之行,始于足下,如果从学习编程的第一天开始就注意编程风格的养成,持之以恒,日积月累,就一定会形成良好的编程习惯。1.5C语言程序的调试与运行
高级语言程序要经过编译才能被计算机执行
二进制机器语言程序
C语言源程序C语言编译程序1.5.1C语言程序的调试与运行过程
①编辑:将C语言程序输入编辑器中。②编译:C语言程序经过编译或解释翻译成二进制目标程序。
●编译过程由编译程序(Compiler)完成,编译程序将 发现大多数语法错误并且发出“出错信息”,
●用户需要重新调用编辑程序改正这些错误,然后再进 行编译,直到编译成功,产生目标(.obj)文件。③连接:将编译产生的目标程序、程序中使用到的库函数及其 它目标程序连接成可执行(.exe)程序。④执行:运行(Run)可执行程序,检查输出结果,如果结果 不正确,则返回编辑窗口对源程序进行修改,然后重复 上述过程直到结果正确无误。1.5.2C语言程序上机操作和调试TurboC2.0C语言集成开发环境FileEditRunCompileProjectOptionDebugBreak/Watch
Line1Col3InsertIndentFillUnindent*D:NONAME.C
编辑窗口
Message
信息窗口
F1-HelpF5-ZoomF6-SwitchF7-TraceF8-StepF9-MakeF10-Menu
File装入或保存文件、退出TCEdit编辑。也可用Word编辑,保存为.TXT文件Run编译、连接、运行当前程序Compile编译当前程序Project管理多文件工程Option 设置编译和连接程序的各个选项Debug 设置各调试选项Break/Watch设置断点和监视表达式Insert 使编辑程序处于插入状态Indent 自动缩进,换行时与上一行行首对齐F1-HelpF5-Zoom 使光标所在窗口放大到满屏F6-Switch 使光标在编辑窗口和信息窗口之间切换F7-Trace 逐行执行程序并深入到各函数 F8-Step 逐行执行程序但跳过各函数F9-Make 编译并连接程序F10-Menu 使光标跳到顶端主菜单TurboC上机步骤1.启动TurboC2.建立源程序文件●在编辑窗口中编辑
●如用Word编辑,保存为.txt文件3.装入已有文件
F10→File→Load→键入文件名→4.另存为其它文件
F10→File→Writeto→键入Newname→5.编译程序Alt+C→Compile→
Alt+F9
必须改正Error才能生成.OBJ文件
Warning可不修改6.连接程序
Alt+C→CompileLinkExeFile7.运行程序Alt+RRunAlt+F9只有结果正确,才能认为程序正确3.掌握调试技巧,提高调试效率
程序编写好后,必须进行调试(Debug),只有“调通”了的程序,才能交付运行。
最有用的两种调试技巧:
(1)设置/清除断点
(2)单步调试4.程序中可能出现的错误(1)错误种类 ①编译错误一般是语法错误。 ②运行错误一般是语义错误,如除数为0,或者数据太 大,如超过整型(int)数据范围。 ③逻辑错误一般是算法错误。(2)出错处理
当我们开发或者调试某个程序的时候,错误相当容易发生。程序员是负责纠正程序错误的,当程序中的大大小小的错误不断被程序员纠正之后,程序最终将会运行起来而不带任何警告或错误信息。之后,这种调试成功的子程序可以转变为产品形式的版本。(3)错误信息实例
Invalidfunctionnumber 无效函数号
Filenotfound 文件找不到
Pathnotfound 路径找不到
Memoryblocksdestroyed 存储区被破坏
Invalidformat 无效格式
Invalidaccesscode 无效存取代码
Invaliddata 无效数据
Invaliddrivespecified 定义无效设备
Notsamedevice 不是同一设备
Nosuchfileordirectory 没有该文件或目录
Toomanyopenfiles 打开的文件太多
Badfilenumber 文件号不恰当
Invalidargument 无效变量
Resulttoolarge 运算结果太大
Statementmissing;in…语句缺少“;”
Filealreadyexists 文件已存在
Undeclaredsymbolin… 符号未声明
Undefinedsymbolinfunction 函数在有未定义的变量名
Unknownerror 不认识的错误习题1
1.简答题
(1)构成C语言程序的基本单位是什么?
(2)一个C语言程序至少包含一个什么函数?
(3)C语言程序中的语句都是用什么符号结束的?
(4)在一个C语言程序中,注释部分两侧的分界符分别是什么?
(5)什么叫算法?它具有哪点特性?算法有哪几种表示方法?
(6)程序设计的基本步骤是什么?
(7)结构化程序设计包括哪几种基本结构?
(8)好的程序设计风格主要包括哪些方面?
(9)C语言具有哪些特点?
(10)既然有那么多程序设计语言,为什么把C语言作为入门语言学习?2.用传统流程图和N-S结构图分别表示以下算法
(1)已知圆的半径,求其圆周长和面积。
(2)输入一个学生成绩,如果成绩及格,则输出“passed”信息;否则输出“failed”信息。
(3)输入10个数后,将其中最大的数打印输出。
(4)输入50个数,统计出其中正数的个数。
(5)判断一个数是否既能被5整除,又能被7整除。第2章
数据类型、运算符及表达式在C语言中,为解决问题,要采用各种类型的数据,数据的类型不同,它所表达的数据范围、精度和所占据的存储空间均不相同,本章主要讨C语言的3种基本数据类型:整型、浮点型、字符型。
2.1
c语言的数据类型几种聚合类型:
数组指针结构体共用体、位域和枚举五种基本数据类型:
字符型整型单精度实型双精度实型空类型基本数据类型
数据类型基本类型构造类型指针类型空类型整型实型字符型数组类型结构体类型共用体类型枚举类型
双精度型单精度型基本类型的前面可以有各种修饰符:
修饰符用来改变基本类型的意义,以便更准确地适应各种情况的需求。
signed(有符号)
unsigned(无符号)
long(长型符)short(短型符)2.2常量的概念
程序运行过程中其值不能被改变的量称为常量。
2.2.1整型常量
也叫整常数,是由一个或多个数字所组成的,可以有正负号。C整型常量可以用十进制整数、八进制整数和十六进制整数三种不同的形式表示。
1)十进制整数。如:215,-236,0等。
2)八进制整数。如:04,-016,0237等(分别代表十进制数4,-14,159)。
以数字0开头,以区别于十进制数。
3)十六进制整数。如:0x123,-0x1fa,0x64等(分别代表十进制数291,-506,100)。
以数字0加小写(或大写)字母x开头。
2.2.2实型常量
又称实数或浮点数。C实型常量只使用十进制,它有两种表示形式:
1)十进制形式。如:0.235,.235,-23.5,0.0,45.237等都 是十进制形式的实数。
2)指数形式。如:-1.254E-3表示-1.254×10-3 0.123e5表示0.123×105
说明:实型常量不分float型和double型。如果实型常量跟有后缀f或F,则被当作float型,否则C语言编译系统总是将其处理成双精度型。一个实型常量可以赋给一个实型变量(float型或double型)
2.2.3字符型常量
1.定义
用一对单引号括起来的单个字符,称为字符常量。例如: ‘a’、‘A’、‘1’、‘+’
字符常量具有值,它的值就是该字符的ASCII代码,在内存中占一个字节。如:
c=‘A’与c=65这两个赋值语句是相同的。2.转义字符----以反斜杠“\”开头的转义字符,将反斜杠“\”后面的字符转变为另外一种含义。使用这种方法可以表示任何输出的字母字符、专用字符、控制字符和图形字符。转义字符功能ASCII记号\a响铃BEL\b退一格BS\ddd1~3位八进制数所代表的ASCII字符ddd\f走纸换页FF\n换行NL(NF)\r回车(不换行)CR\t横向跳到下一个输出区HT\v竖向跳格VT\xhh1~2位十六进制数所代表的ASCII字符hh\\反斜杠字符\\’单引号字符’\”双引号字符”\?问号字符?\0空Null例2-1用转义字符输出可打印字符和不可打印字符。
main()
{
printf(“please\t\H\n”);
}
程序运行结果如下:
please□□H
2.2.4字符串常量
1.字符串常量的定义
●字符串常量是用一对双引号括起来的字符序列。
●字符串中字符的个数称为字符串长度。
▼长度为0的字符串(即一个字符都没有的字符 串)称为空串,表示为””(一对紧连的双引号)。
▼空格也是一个字符,长度为1。
例如:”Howareyou.”长度为12
”Goodmorning.”长度为13。
●如果反斜杠和双引号作为字符串中的有效字符,则必须 使用转义字符。
例如:C:\msdos\v6.22→“\\C:msdos\\v6.22”
Isay:“Iamastudent.”→
“Isay:\”Iamastudent.\””
2.字符串的存储
C语言规定:存储字符串常量时,由系统在字符串的末尾自动加一个‘\0’作为字符串的结束标志。
如字符串”CHINA”在内存中的实际存储:
CHINA\0提示:
字符常量‵a′与字符串常量“a“的不同之处:
(1)定界符不同:字符常量使用单引号,而字符串常量使用双 引号;
(2)长度不同:字符常量的长度为1,而字符串常量的长度,可 以是0,也可以是某个整数;
(3)存储要求不同:字符常量存储字符的ASCII码值,而字符串 常量,除了要存储有效的字符外,还要存储结束标志符 "\0"。2.3变量
变量----其值可以改变的量称为变量。
变量的标识符----一个变量由一个名字来标识,此名字称为该 变量的标识符(应尽可能以有意义的名字来标识变量, 以增加程序的易读性)。
变量的存储单元----存储单元中存放变量的值。
变量的地址----存储单元的地址。
注意:变量名、变量值和变量的地址是三个不同的概念,变量 名与内存中的某一存储单元相联系,经过编译后变量名 都用变量地址代替;而变量值是指存放在该存储单元中 的数据的值。同一个变量名对应的变量在不同的时刻可 以有不同的值。
35a
图2-1不同时刻变量的存储单元存储不同的值a补讲标识符
(1)字符集
C语言的字符集是指C程序中允许出现的字符,分为以下几类:
英文字母(大、小写):A,B,C,…,Z;a,b,c,…,z
数字:0,1,2,…,9
特殊字符:+,
,*,/,%,=,_,(,)~,!,◎,#,$,^,&,[,],\,.,
,“,{,},?,|以及空格等
转义字符:\n,\t,\v,\b,\r,\f,\a,\“,\
,\\,\ddd,\xhh等
(2)标识符
C语言中各种对象的名字。由字母(a-z,A-Z)、数字(0-9)和下划线(_)组成,并且第一个字符必须为字母或下划线。标识符包括:符号常量名、变量名、函数名、类型名、文件名。例如,合法的标识符和变量名:
data1,Day,x,program_1,aver,sum
非法的标识符和变量名:
J.Agate,$50,a<b,3x在C语言中,大写字母和小写字母的含义是不同的.
(3)标识符的分类
关键字又称保留字,是C语言中一类特殊的标识符。每个关键字有固定的含义,用户不能改变关键字的用途。用户标识符用户自定义标识符是用户根据自己的需要而定义的标识符。为提高程序的可读性,建议用户使用有意义的名字来定义标识符。用户标识符不能与关键字同名。2.3.1变量的声明
变量有各种类型,在使用之前必须加以说明:
inti;/*说明i为整型变量*/
shortc,d,e;/*说明c,d,e为短整型变量*/
unsignedlongp,g;/*说明p,g为无符号长整型变量*/
floatx,y;/*说明x,y为单精度型变量*/
doublez;/*说明z为双精度型变量*/
charch1,ch2;/*说明ch1,ch2为字符型变量*/2.3.2变量的初始化
在定义变量时,给变量赋值称为变量的初始化。
如inta=5,b;在定义变量a和b的同时给变量a赋值为5,是对变量a进行初始化。
如inta,b;
a=5;先定义两个整型变量a和b,然后给变量a赋值为5,不是初始化。
注:前者是对变量a进行初始化,后者是对变量a赋值。
1.整形变量整型变量的基本类型符号为int。
1)整型变量的分类----根据其占用内存字节数的不同分为以下六种类型:
(1)基本整型。类型关键字为int。
(2)短整型。类型关键字为short[int]。
(3)长整型。类型关键字为long[int]。
在上述三种类型前加上无符号整型标记unsigned,则只能用来存储无符号整数。于是又有下列类型的整型变量:
(4)无符号基本整型。类型关键字为unsignedint。
(5)无符号短整型。类型关键字为unsignedshort[int]。
(6)无符号长整型。类型关键字为unsignedlong[int]。2)整型变量的值域整型数据类型16位机32位机所占位数取值范围所占位数取值范围int16-32768~3276732-231~(231-1)short16-32768~3276716-32768~32767Long32-231~(231-1)32-231~(231-1)unsignedint160~65535320~232unsignedshort160~65535160~65535unsignedlong320~(231-1)320~(231-1)3)整型匹配规则
整型变量的类型匹配规则----一个整型常量,可以赋值给能容纳其值的整型变量。
例2-2写出程序运行结果。
main()
{inta,b;
longx;
unsignedy;
a=-123;
b=456;
x=50000;
y=a+b+x;
printf(“%d%d%ld%u\n”,a,b,x,y);
}
运行结果:
-1234565000050333
2.实型变量
1)实型变量在内存中的存放情况----通常按指数形式存储,并分成小数部分和指数部分分别存放。不同类型的实型变量所占存储空间不同,而小数部分占位越多则数据的有效位数越多,精度越高;指数部分占位越多,则可表示的数值范围越大。
2)实型变量分为三类:
(1)单精度型。用float表示,一般占4个字节(32bit)、 提供6~7位有效数字,例如:
floatx,y;指定x,y为单精度实型变量。
(2)双精度型。用double表示,一般占8个字节(64bit)、 提供15~16位有效数字,例如
doublea,c;指定a,c为双精度实型变量。
(3)长双精度型。用longdouble表示,一般占16个字节 (128bit)、提供18~19位有效数字,用得很少。例2-3
分析下面程序的运行结果。
main()
{
floata;doubleb;
a=123456789.888;
b=123456789.888;
printf(“a=%fb=%f\n”,a,b);
}
运行结果:
a=123456792.000000b=123456789.8880003.字符变量
1)字符变量的定义:
字符变量是用来存放字符常量的,一个字符变量只能存放一个字符,而不是一个字符串。它的类型关键字用char,占用一个字节的内存单元。
例如:charc1,c2;/*定义两个字符变量:c1,c2*/
c1=‘a’;c2=‘b’;/*给字符变量赋值*/
2)字符变量数据的存储形式及其使用特点:
●将一个字符常量存储到一个字符变量中,实际上是将该字符的ASCII码值(无符号整数)存储到字符内存单元中。
●ASCII码值的形式与整数的存储形式是一样的。因此C语言允许字符型数据与整型数据之间通用,并且允许对字符数据进行算术运算。[例2-4]对字符型数据进行算术运算并输出字符变量的字符形式及整数形式。
/*程序功能:将字母进行大、小写转换,并输出转换结果和字母的ASCII码值*/
main()
{
charcl,c2;
c1=‘a’;c2=‘B’;
c1=cl-32;c2=c2+32;/*字母的大、小写转换*/
printf(“cl=%c,c2=%c\n”,cl,c2);/*以字符形式输 出字符变量*/
printf(“cl=%d,c2=%d\n”,c1,c2);/*以整数形式输 出字符变量*/
}
程序运行结果:
c1=A,c2=b
c1=65,c2=982.4运算符与表达式
●运算符是表示某种操作的符号。
●运算符的操作对象称为运算数。
●用运算符把运算数连接起来形成的有意义的式子叫做表达式。2.4.1算术运算符与表达式
(1)加法运算符或取正值运算符:+,如1+2、+2。
(2)减法运算符或取负值运算符:-,如2-1、-2。
(3)乘法运算符:*,如1*2。
(4)除法运算符:/,如5/2。
注意,C语言规定:两个整数相除,其商为整数,小数部 分被舍弃(称为舍尾取整)。如5/2=2。如果操作数 中有负数,取整通常采取“向零取整”的方法。如5/- 3=-1
(5)求余运算符,或称模运算符:%,运算符两边均要求是 整数,否则出错。如9%5,结果为4。
●表达式----用运算符和括号将运算对象(常量、变量和函数等) 连接起来组成的符合C语言语法规则的式子。
●单个常量、变量或函数,可以看做是表达式的一种特例。称 为简单表达式。否则称为复杂表达式。
●算术表达式的概念----表达式中的运算符都是算术运算符的 表达式。
例如:2+3
a*b-6%9+a/(x+y)补充:运算符的优先级与结合性
1.C语言中算术运算符的优先级和结合性
算术运算符中取正(负)值运算为单目运算,其余为双目运算。
结合性----当一个操作数两侧的运算符具有相同的优先级时, 该操作数先与哪边的运算符结合,自左至右的结合方 向,称为左结合性。反之,称为右结合性。
结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其他运算符都是左结合性。
运算种类结
合
性优先级+,
(单目)右结合性高低*,/,%左结合性+,
(双目)左结合性2.表达式求值
●按运算符的优先级高低次序执行。例如:先乘除后加减。
●如果在一个运算对象(或称操作数)两侧的运算符的优先级 相同,则按C语言规定的结合方向(结合性)进行。
例如:算术运算符的结合方向是“自左至右”,即:
在执行”a-b+c时,变量b先与减号结合,执行〝a-b〞; 然后再执行加c的运算。2.4.2赋值运算符及赋值表达式1.赋值运算符(1)基本赋值运算符(”=”)变量名
=
表达式如SUM=28;将赋值运算符右边表达式的值存放到以左边变量名所代表的存储单元中。(2)复合赋值运算符一般形式为:
变量
双目运算符=
表达式等价于:变量=变量双目运算符(表达式)例如:
i+=5等价于:i=i+5x*=y+8等价于:
x=x*(y+8)C语言共有10种:+=,-=,*=,/=,%=,<<=,>>=,&=,∧=,‖=2.赋值表达式
由赋值运算符或复合赋值运算符,将一个变量和一个表达式连接起来而形成的表达式,称为赋值表达式。赋值表达式的一般格式:
<变量><(复合)赋值运算符><表达式>
例:x=a*b-6%9+a/(x+y);
a+=a-a*a;
赋值表达式的求解过程
●任何一个表达式都有一个值。
●将赋值运算符右侧的表达式的值赋给左边的变量,赋值表达 式的值就是被赋值变量的值。
例如:x=5这个赋值表达式的值为5(x变量的值也是5)。说明:赋值运算符的左边必须是变量,右边的表达式可以是常量、变量、表达式和函数调用表达式。一个表达式有一个值及其类型,等于计算表达式所得结果的值和类型。赋值表达式作为表达式也是有值的,它的值就是左边变量的最终值。赋值运算符的优先级和结合性赋值运算符的优先级低于算术运算符。例如:x*=3+y%6中优先级最高的是“%”,然后是“+”,最低的是“*=”。赋值运算符具有右结合性。若出现多个赋值运算符,则从右向左结合.如:
x=y=z=0相当于:x=(y=(z=0))提示:<1>赋值表达式中的“表达式”又可以是一个赋值表达式。例如:a=(b=1),把b=1的值赋给a,所以整个赋值表达式值就等于1,即a=1。赋值运算符按照“自右向左”的组合顺序,因此〝a=(b=1)〞就等价于〝a=b=1〞。(即右结合性)<2>赋值表达式也可以包含复合赋值运算符。如a+=a-=a*=a,如果a的初值是2,此赋值表达式的运算过程是:先计算〝a*=a〞的值,即相当于a=a*a=2*2=4。再计算〝a-=4〞的值,即相当于a=a-4=4-4=0。最后计算〝a+=0〞的值,即相当于a=a+0=0+0=0。赋值的类型转换
如果表达式值的类型,与被赋值变量的类型不一致,但都是数值型或字符型时,系统自动地将表达式的值转换成被赋值变量的数据类型,然后再赋值给变量。
<1>将实型数据(单、双精度实数)赋给整型变量时,舍弃实数的小数部分,在内存中以整数形式存放,如a为整型变量,运行〝a=1.2;〞的结果是a的值为1。
<2>将整型数据赋给单、双精度变量时,数值不变,但以浮点形式存放在变量的存储单元中。如有a=12,而a是float变量,运行时,先将12转换成12.00000,然后再存放到a中。若a是double型变量,则先将12转换成12.0000000000000,再以双精度浮点数形式存放到变量a中。
<3>将一个双精度数据赋给一个单精度变量时,截取前面7位有效数字,存放到单精度变量的存储单元中,但要注意范围不能溢出。
2.4.4关系运算符与关系表达式在程序中经常需要比较两个量的大小关系,用来决定程序下一步的走向。比较两个量的运算符称为关系运算符。1.关系运算符在C语言中有以下关系运算符,如表2-4所示:关系运算符关系表达式说明<
x<y小于<=x<=y小于或等于>
x>y大于>=x>=y大于或等于==x==y等于!=x!=y不等于说明:
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=,==和!=的优先级相同。2.关系表达式关系表达式的一般形式为:表达式关系运算符表达式
例如:a+b>c-d,x>3/2,'a'+1<c,-i-5*j==k+1;都是合法的关系表达式。
由于表达式也可以是关系表达式。因此也允许出现嵌套的情况,例如:a>(b>c),a!=(c==d)等。
关系表达式的值是“真”和“假”,用“1”和“0”表示。
如5>0的值为“真”,即为1。(a=3)>(b=5),由于3>5不成立,故其值为假,即为0。【例2.6】关系表达式实例:
voidmain(){charc='k';inti=1,j=2,k=3;floatx=3e+5,y=0.85;printf("%d,%d/n",'a'+5<c,-i-2*j>=k+1);printf("%d,%d/n",1<j<5,x-5.25<=x+y);printf("%d,%d/n",i+j+k==-2*j,k==j==i+5);}
字符变量是以它对应的ASCII码参与运算的。对于含多个关系运算符的表达式,如k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。2.4.5逻辑运算符
与逻辑表达式1.逻辑运算符
C语言中提供了三种逻辑运算符:&&与运算,双目运算符,具有左结合性||或运算,双目运算符,具有左结合性!非运算,单目运算符,具有右结合性2.逻辑运算符优先次序
逻辑非 !高 算术运算符 关系运算符<、<=、>、>= 同
==、!= 同 逻辑与 &&
逻辑或 ||
赋值运算符 =低
例:a>b&&c>d等价于(a>b)&&(c>d)!b==c||d<a等价于((!b)==c)||(d<a)a+b>c&&x+y<b等价于((a+b)>c)&&((x+y)<b)3.逻辑运算的值
逻辑运算的值也为“真”和“假”两种,用“1”和“0”来表示。其求值规则如下:
1)与运算&&
参与运算的两个量都为真时,结果才为真,否则为假。例如,5>0&&4>2,由于5>0为真,4>2也为真,相与的结果也为真。
2)或运算||
参与运算的两个量只要有一个为真,结果就为真。两个量都为假时,结果为假。例如:5>0||5>8,由于5>0为真,相或的结果也就为真。
3)非运算!
参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:!(5>0)的结果为假。
虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,凡是非“0”的数值作为“真”。
例如:由于5和3均为非“0”因此5&&3的值为“真”,即为1。
又如:5||0的值为“真”,即为1。4.逻辑表达式
逻辑表达式的一般形式为:
表达式逻辑运算符表达式
逻辑表达式中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。
例如:(a&&b)&&c。根据逻辑运算符的左结合性,上式也可写为:a&&b&&c。逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。【例2.7】逻辑表达式。voidmain(){charc='k';inti=1,j=2,k=3;floatx=3e+5,y=0.85;printf("%d,%d/n",!x*!y,!!!x);printf("%d,%d/n",x||i&&j-3,i<j&&x<y);printf("%d,%d/n",i==5&&c&&(j=8),x+y||i+j+k);}
本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x||i&&j-3式,先计算j-3的值为非0,再求i&&j-3的逻辑值为1,故x||i&&j-3的逻辑值为1。对i<j&&x<y式,由于i<j的值为1,而x<y为0,故表达式的值为1和0相与,最后为0。对i==5&&c&&(j=8)式,由于i==5为假,即值为0,该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+y||i+j+k由于x+y的值为非0,故整个或表达式的值为1。2.4.6条件运算符与条件表达式
1.条件运算符条件运算符为?和:,它是一个三目运算符,即有三个参与运算的量。
2.条件表达式
1)由条件运算符组成条件表达式的一般形式为:
表达式1?表达式2:表达式3
2)求值规则
条件表达式的求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。3)条件表达式的使用
条件表达式通常用于赋值语句之中。
如条件语句:
if(a>b)max=a;
elsemax=b;
可用条件表达式写为
max=(a>b)?a:b;
执行该语句的语义是:如a>b为真,则把a赋予max,否则把b赋予max。使用条件表达式时,还应注意以下几点:
(1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此max=(a>b)?a:b
可以去掉括号而写为:max=a>b?a:b。
(2)
条件运算符由“?”和“:”组成,是一对运算符,不能分开单独使用。
(3)条件运算符的结合方向是自右至左。
例如:
a>b?a:c>d?c:d
应理解为a>b?a:(c>d?c:d)
这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。【例2.8】求两个整数的最大值。main(){inta,b,max;printf("\ninputtwonumbers:");scanf("%d%d",&a,&b);printf("max=%d",a>b?a:b);}2.4.7逗号运算符与逗号表达式
C语言提供一种用逗号运算符〝,〞连接起来的式子,称为逗号表达式。逗号运算符又称顺序求值运算符。
1.逗号表达式的一般形式及求解过程
逗号表达式的一般形式:
表达式1,表达式2,……,表达式n
逗号表达式的求解过程:由逗号隔开的一系列表达式从自左至右依次计算各表达式的值,“表达式n”即最后一个表达式的值为整个逗号表达式的值。
例如:逗号表达式〝a=2+3,a*6,a/3〞,先求解a=2+3,得a=5;再求a*6=30,由于a*6的值30没赋给a变量,所以再求a/3时,a的值仍为5,a/3=1,所以最后逗号表达式的值等于1。
又例如:求逗号表达式〝(a=2*3,a*4),a+4〞的值,先求解a=2*3,得a=6;再求a*4=24;由于a*4的值没有赋给a变量,a的值仍然是6,所以最后求解a+4=10,逗号表达式的值为10。2.逗号在C语言中不同情况下的作用
并不是任何地方出现的逗号,都是逗号运算符。很多情况下,逗号仅用作分隔符。
1)逗号在变量说明表和初始值表中起分隔作用。例如:
intx,y,z[6];
2)在函数的参数表中,逗号作为各参数的分隔符。例如:语句printf(〝%d,%d,%d〞,x,y,z);中的逗号是分隔符。但是如果改为:printf(〝%d,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医博士科护理培训考试题库及答案
- 交通安全法规学习:2026年驾驶员考试及答案
- 2026三年级数学上册 四边形单元测试
- 2026六年级数学上册 分数除法建模能力
- 2026二年级数学下册 克和千克关键能力
- 体检者隐私保护制度
- 2026八年级下语文修辞手法评价技巧
- 人力资源四项制度
- 五官科住院部制度
- 车间绩效及质量奖惩制度
- 2026年安徽城市管理职业学院单招职业适应性测试题库带答案详解(新)
- 应急管理干部警示教育以案促改心得体会
- 冀教版八年级英语下册Lesson28 Ms Lius Great Idea 核心素养教案
- 2026年小学六年级下册劳动教育教学计划
- 2026春小学科学青岛版(五四制2024)三年级下册教学计划、教案及每课教学反思(附目录)
- 2026年内蒙古化工职业学院单招综合素质考试题库及一套参考答案详解
- 2026上海交通大学医学院招聘91人考试备考题库及答案解析
- 2026年南京铁道职业技术学院单招职业适应性考试题库附答案详解(夺分金卷)
- 2026年春季人教PEP版五年级下册英语教学计划含教学进度表
- (2026年)海姆立克法急救培训课件
- 湖北2025年湖北科技学院招聘19人笔试历年参考题库附带答案详解
评论
0/150
提交评论