高教类课件:C语言程序设计教程-第2套

PPT
  • 阅读 47 次
  • 下载 0 次
  • 页数 233 页
  • 大小 4.311 MB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
高教类课件:C语言程序设计教程-第2套
可在后台配置第一页与第二页中间广告代码
高教类课件:C语言程序设计教程-第2套
可在后台配置第二页与第三页中间广告代码
高教类课件:C语言程序设计教程-第2套
可在后台配置第三页与第四页中间广告代码
高教类课件:C语言程序设计教程-第2套
高教类课件:C语言程序设计教程-第2套
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 233
  • 收藏
  • 违规举报
  • © 版权认领
下载文档40.00 元 加入VIP免费下载
文本内容

【文档说明】高教类课件:C语言程序设计教程-第2套.ppt,共(233)页,4.311 MB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44669.html

以下为本文档部分文字说明:

C语言程序设计教程第1章共分为3个部分内容第1章C语言基本知识C语言是在上世纪70年代问世的,是目前最为流行的编程语言之一。随着C语言应用的不断深入,它又派生出多种版本,如MicrosoftC(简称MC)、BorlandTurboC(简称TC)。在上世纪80年代,随着面

向对象程序设计思想的流行,又在C语言的基础上产生了C++语言。同样C++语言也有多种版本,如BorlandC++、MicrosoftVisualC++等。【本章概览】第1章C语言基本知识C语言概述C语言程序的结构运行C程序的步骤与方法【本章重点】第1章C语言基本知识【本章目标】了解计算机编程

语言和语言的特点了解并配置TurboC2.0的集成环境,对源程序进行编译、链接并运行掌握C程序的基本组成1.1.1计算机编程语言按计算机语言的发展进程,可将计算机语言分为三类:1.机器语言以二进制代码(0和1)表示机器指令的一种语言,其程序能被计算机直接执行。2.汇编语言用助记符代

替机器指令,用变量代替各类地址,称为汇编语言(也称符号语言)。3.高级语言高级语言屏蔽了机器的细节,更接近于自然语言和数学语言,给编程带来了极大的方便。1.1C语言概述C语言程序开发的过程C源程序(.C文件).EXE文件.OBJ文件结果编译链接运行1.1C语言概述1.1.2C

语言的发展历史1967年为开发UNIX操作系统,KenThompson在BCPL程序设计语言的基础上,将其改造成B语言。1971年M.Ritchie改进B语言,并命名为C语言。随着UNIX操作系统的成功,C语言也获得巨大成功。1989年ANSI发布了一个完整的C语言标准,被

称为C89或ANSIC。ISO直接采用了C89作为C语言标准,有的资料上称其为C90。1990年ISO发布了最新的C语言规范,被称为C99。1999年ISO正式发布了C语言的新标准C11。2011年12月8日1.1C语言概述1.1.3C语言的特点C语言是一种理想的结构化程序设计语言,符合

现代编程风格的要求,提供了顺序、选择(分支)和循环三种基本结构的控制语句。用C语言编写的源程序具有较好的通用性和可移植性,基本上不做修改就能用于各种型号的计算机和各种操作系统。C语言的语法限制少,书写形式灵活,设计自由度大。特点

一特点二特点三1.1C语言概述1.2C语言程序的结构用C语言语句编写的程序称为C程序或C源程序。一个完整的C语言程序是由一个main函数(又称主函数)和若干个其他函数结合而成的,或仅有一个main函数构成。【例】#include"stdio.h"main(){pr

intf("Hello,World!");}输出结果:Hello,World!1.2C语言程序的结构【例】#include"stdio.h"main(){inta,b,add;/*定义三个int类型的变量*/a=12;b=34;add=a+b;/*将a与b之和放在变量

add中*/printf("a+b=%d\n",add);}输出结果:a+b=461.2C语言程序的结构【例】#include"stdio.h"intsum(intx,inty){intz;z=x+y;returnz;}main(){inta,b,a

dd;a=12;b=34;add=sum(a,b);printf("a+b=%d\n",add);}输出结果:a+b=461.2C语言程序的结构由以上可看出,C语言结构为:(1)一个C源程序至少包含一个main函数,或者

包含一个main函数和若干个其他函数。也就是说,C源程序是由函数构成的,函数是C源程序的基本单位。其他函数可以是系统提供的标准库函数,也可以是用户根据实际需要自己设计编写的函数。(2)一个函数的基本结构为:函数类型函数名(函数参数类型函数参数名,……){声明部分;执行部分;}1.2C语言程

序的结构(3)C程序的执行都是从main函数开始,并且一定结束于main函数,而不管main函数在程序中的位置如何。(4)函数体中的每一个语句都要以分号结束。C语言的书写格式是非常自由的,我们可以把多个语句写在

一行上,也可以把一个语句分写在多行上,系统是以分号判断一个语句结束的。(6)C语言中大小写字母是严格区分的。例如:main如果任何一个字母写成大写就是错的。(5)在程序的任何地方都可以加入以“/*”和

“*/”包围起来的注释,注释的作用是为了增加程序的可读性,它并不被系统执行。1.3运行C程序的步骤与方法1.3.1进入TurboC2.0集成环境从图中可以看出,TC主屏由四部分组成:主菜单、编辑窗口、信息窗口和功能键提示行。主菜单上的每个命令又都包含一个下

拉子菜单(Edit除外),编辑窗口是用来输入或装载源程序的,信息窗口用于查看编译和调试程序时的一些信息。TurboC2.0的主屏1.3.2配置运行环境配置运行环境,也就是设置好包含文件、库文件和TurboC系统所在的

目录,是非常关键的一部步。配置TurboC2.0运行环境1.3运行C程序的步骤与方法1.3.3编辑源程序编辑源程序,就是在编辑窗口中将事先编写好并已经自查过的源程序输入计算机或对已经存在的源程序文件进行修改的过程。如果是要输入一个新程序,应首先选择Fil

e>New菜单创建新文件。输入程序后可选择File>Save菜单进行保存。1.3运行C程序的步骤与方法1.3.4对源程序进行编译、链接并运行在TurboC2.0中,只要选择Run>Run命令或直接按快捷键【Ctrl+F9】就可以完成编译、链接、运行的工作。这里需要注意以下两点:

(1)程序的运行结果并不在这个窗口显示,不要因看不到运行结果就反复按【Ctrl+F9】键,否则会看到一堆重复的运行结果。(2)TurboC2.0的错误提示信息是一个比较模糊的信息,需要认真阅读源程序,不要因为看到信息窗口里出现了一堆错误信息就失

去信心,有时候一大堆错误信息后面其实只是一处小错误。1.3运行C程序的步骤与方法1.3.5查看运行结果只需要按【Alt+F5】键或选择Run>UserScreen命令,便切换到了用户屏,看到结果了。如果程序需要输入数据,则在我们按下【Ct

rl+F9】键后,屏幕就处于用户屏状态,等待用户正确输入所需的数据,输入结束程序运行后仍会回到集成环境的主屏,还要按上面介绍的方法切换到用户屏查看程序的运行结果。1.3运行C程序的步骤与方法1.4本章小结本章主

要讲述了C语言的基本知识、C语言程序的结构,以及运行C程序的步骤与方法。通过本章的学习,读者应了解计算机编程语言和语言的特点,掌握C程序的基本组成,了解并清楚配置C语言的集成环境,对源程序进行编译、链接并运行等方面的知识。C语言程序设计教程第2章共分为4个部分

内容第2章数据类型、运算符与表达式在C语言中,使用运算符可对变量和常量进行各种运算,而表达式是由运算符连接常量、变量、函数所组成的式子。对变量的说明可以包括三个方面:数据类型、存储类型和作用域。在本章中,我们只介绍数据类型说明,其他说明将在以后各章中陆续介绍。【本章概览】第2章数据类型、运算符与

表达式C语言的数据类型C语言的标识符C语言的运算符与表达式【本章重点】常量与变量第2章数据类型、运算符与表达式【本章目标】了解C语言中的数据类型、常量与变量的区别了解变量的初始化方法掌握整型、实型、字符型常量和变量的声明和使用方法掌握不同类型数据的相互转换,以及C语言的运算符和表

达式2.1C语言的数据类型指针类型整型数据类型基本类型构造类型短整型(shortint)字符型(char)实型(浮点型)长整型(longint)单精度(float)双精度(double)枚举类型(enum)数组类型共用体类型(union)结构体类

型(struct)空类型(void)2.1C语言的数据类型(1)基本数据类型:基本数据类型最主要的特点是:其值不可以再分解为其他类型。(2)构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。(3)指针类型:指针是一种具有重要作用的数据类型。它的值用来表示

某个变量在内存储器中的地址。(4)空类型:在调用函数值时,通常应向调用者返回一个函数值。2.2C语言的标识符2.2.1语言对标识符的规定(1)标识符只能由英文字母(A~Z,a~z)、数字(0~9)和下划线三种字符组成,且

第一个字符必须为字母或下划线。(2)大小写字符代表不同的标识符。例如:标识符abc与标识符ABC是两个不同的标识符。一般对变量命名用小写,符号常量命名用大写。(3)不能使用C语言关键字作为用户自定义标识符。2.2C语言的标识符2.2.2语言对标识符的分类(

1)关键字。关键字是具有特定含义的、专门用来说明C语言的特定成分的一类单词、单词缩写或单词组合,通常也称为保留字。(2)预定义标识符。在C语言中有其特定的含义,如正弦函数sin,输出函数printf,编译预处理

命令define等单词都有其固定的含义和用法。(3)用户自定义标识符。由用户根据需要定义的标识符称为用户自定义标识符。一般用来给变量、函数、数组或文件等命名。2.3常量与变量2.3.1常量1.整型常量整型常量就是整常数,是由一

个或多个数字组成,可以有正、负号,但不能有小数点。在C语言中,使用的整常数有八进制、十六进制和十进制三种。此外,整型常量还有整型、长整型和无符号数之分。2.实型常量在C语言中,把带小数的数值称为实数或浮点数。C语言实型常量只使用十进制数。2.3常量与变量3.字符型常量字符型常量是由一对单

引号括起来的单个字符,在内存中占1个字节。例如:’A’,’b’,’2’,’%’,’;’等都是有效的字符型常量。C语言中常用的转义字符常量如下表。字符形式表示含义字符形式表示含义\n回车换行\\反斜杠字符\\t水平制表符\’单引号\v垂直制表符\”双引号\r回车符\ddd

三位八进制数代表一个字符\f换页符\xhh两位十六进制数代表一个字符\b退格键(Backspace)\0空值,其ASCII码值为02.3常量与变量4.符号常量用一个特定的符号来代替一个常量或字符串,这个符号称为符号常量。符号常量一般用大写字母表示,以便与其它

标识符相区别。符号常量的一般定义形式:#define符号常量常量(或“字符串”)2.3常量与变量2.3.2变量整型变量(int)实型变量(float和double)字符型变量(char)普通变量地址变量指针变量变量C语言中的变量类型1.变量的分

类2.3常量与变量C语言的基本数据类型类型标识符名字字节取值范围char字符型1ASCII字符代码int基本整型4-2147483648~2147483647short[int]短整型2-32768~32767long[int]长整型4-2147483648~2147483647unsig

ned[int]无符号整型40~4294967295unsignedshort[int]无符号短整型20~65535unsignedlong[int]无符号长整型40~4294967295float单精度浮点型4-1038~1038double双精度浮点型8-10308~10308void空值型

0无值2.3常量与变量2.整型变量整型变量是用来存放整型数据(即不带小数点的数),有以下4种类型:(1)基本整型:类型说明符为int,在内存中占2个字节。(2)短整型:类型说明符为shortint或short。所占字节和取值范围均与基本整型相同。(3)长整

型:类型说明符为longint或long,在内存中占4个字节。(4)无符号整型:类型说明符为unsigned。2.3常量与变量各类整型量所占内存字节数及表示范围类型说明符数的范围字节数int-32768~32767即-215~(215-1)2unsign

edint0~65535即0~(216-1)2shortint-32768~32767即-215~(215-1)2unsignedshortint0~65535即0~(216-1)2longint-214748364

8~2147483647即-231~(231-1)4unsignedlong0~4294967295即0~(232-1)42.3常量与变量3.实型变量实型变量又称浮点型变量,在计算机内存中,实数一律是以指数形式存放的,而不是小数的形式。实型数据一般占4个

字节(32位)内存空间,按指数形式存储。实型变量定义的类型说明符、位数、有效数字和所能表示的数值范围表类型说明符位数(字节数)有效数字数的范围float32(4)6~710-37~1038double64(8)15~1610-307~10308longdouble128(16)18~191

0-4931~1049322.3常量与变量4.字符型变量字符变量用来存储字符常量,即单个字符。字符变量的类型说明符是char。字符变量类型定义的格式和书写规则都与整型变量相同。5.变量的初始化在程序中常常需要对变量赋初值。C语言程序中可有多种方法为变量提供初值。初始化的一般形式为:类型

说明符变量=值,变量=值,……;2.3常量与变量2.3.3不同类型数据的相互转换1.自动转换应遵循的规则(1)若参与运算量的类型不同,则先转换成同一类型,然后进行运算。(2)转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转

成long型后再进行运算。(3)所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。(4)char型和short型参与运算时必须先转换成int型。2.3常量与变量2.强制类型转换强制类型转换是通过类型转换运算来实现

的。其一般形式为:(类型说明符)(表达式)在使用强制转换时应注意以下问题:(1)类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。(2)无论是强制转换或是自动转换

,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变变量定义时对该变量定义的类型。2.4C语言的运算符与表达式2.4.1算术运算符算术运算符用于各类数值运算,包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,

%)共五种。+:加法运算符或正值运算符(单目),如3+4、23+78、+13等。-:减法运算符或负值运算符(单目),如11-2、-5等。*:乘法运算符,如58*45、-2*12等。/:除法运算符,如125/45等。%:模运算符

,或称为求余运算符,如17%4、44%3等。五种运算符的优先级为:“*”、“/”、“%”的优先级高于“+”、“-”,即先乘除,后加减。2.4C语言的运算符与表达式2.4.2自增自减运算自增运算符(++)与自减运算符(--)都是单目运算符,都具有右结合

性,而且它们只能用于变量,不能用于常量或表达式。它们的作用是使运算对象加1或减1。自增自减运算可分为前缀形式和后缀形式,如:前缀形式:++ii自增1后再参与其他运算。――ii自减1后再参与其他运算。后缀形式:i++i参与运算后,i的值再自增1。i――i参与运算后,i的值再自减1。2.4C语言

的运算符与表达式2.4.3逗号运算符在C语言中逗号“,”也是一个运算符,称为逗号运算符。其功能是把若干个表达式连接起来组成一个表达式,称为逗号表达式。其一般形式为:表达式1,表达式2,……,表达式n其求值过程是从表达式1开始依次求各个表达式的值,并以表达式n的值作

为整个逗号表达式的值。逗号运算符的优先级别是所有运算符中最低的。2.4C语言的运算符与表达式2.4.4赋值运算符用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。赋值运

算符级别较低,结合方向为自右至左。1.简单赋值运算符简单赋值运算符记为“=”。由“=”连接的式子称为赋值表达式。其一般形式为:变量=表达式2.复合赋值运算符如:a+=b等于a=a+b,x/=a+b等于x=x/(a+b)。使用复合赋值运算符,可以简化代码,还可以提高编译效率。2.4C

语言的运算符与表达式2.4.5条件运算符这是一个三目运算符,用于条件求值。其一般形式为:表达式1?表达式2:表达式32.4.6关系运算符这是用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。要求两个操作数是同一种数据类型,其结果

为一个逻辑值,即关系成立时,结果为“真”,用1表示,否则结果为假,用0表示。运算规则如下:先计算表达式1的值,如果值为真(非0),则取表达式2的值为整个条件表达式的值,否则取表达式3的值为整个条件表达式的值。2.4C语言

的运算符与表达式2.4.7逻辑运算符逻辑运算真值表数据a数据ba&&ba||b!a非0非0110非000100非0011000012.4C语言的运算符与表达式2.4.8位运算符C语言中的位运算符运算符含义优

先级~按位取反1(高)<<左移2>>右移2&按位与3^按位异或4|按位或5(低)2.5本章小结本章主要讲述了C语言的数据类型、运算符和表达式。通过本章的学习,读者应了解C语言的数据类型,掌握C语言的字符集与标识符,掌握各种常量和变量的相关知识并会运用不同类型数据的相互转换

,了解C语言都有哪些运算符与表达式。C语言程序设计项目教程第3章共分为四个部分内容第3章C程序的结构化程序设计从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、选择结构(也称为分支结构)和循环结构。

这三种基本结构可以组成所有的各种复杂程序。C语言提供了多种语句来实现这些程序结构。本章就来介绍这些基本语句及其在程序中的应用。【本章概览】第3章C程序的结构化程序设计C程序的语句顺序结构循环结构【本章重点】选择结构第3章C程序的结构化程序设计【本章目标】了解C语言中语句的类型和特点

掌握选择、循环、跳转语句的功能与语法掌握常用语句的功能与语法3.1C程序的语句C程序的结构3.1C程序的语句表达式语句由表达式加上分号“;”组成。其一般形式为:3.1.1表达式语句表达式;3.1.2函

数调用语句由函数名、实际参数加上分号“;”组成。其一般形式为:函数名(实际参数表);3.1C程序的语句3.1.3控制语句控制语句用于控制程序的流程,以实现程序的各种结构方式,它们由特定的语句定义符组成

。C语言有九种控制语句,可分成以下三类:(1)条件判断语句:if语句,switch语句(2)循环执行语句:dowhile语句,while语句,for语句(3)转向语句:break语句,goto语句,continue语句,r

eturn语句3.1C程序的语句3.1.4复合语句把多个语句用括号{}括起来组成的一个语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句。3.1.5空语句只有分号“;”组成的语句称为空语句。空语句是什么也不

执行的语句。在程序中空语句可用来作空循环体。3.2顺序结构3.2.1赋值语句1.赋值语句的一般形式:变量=表达式;2.使用赋值语句应注意的问题(1)由于在赋值符“=”右边的表达式也可以又是一个赋值表达式。(2)注意在变量说明中给变量赋初值和赋值语句的区别。(3

)在变量说明中,不允许连续给多个变量赋初值。(4)注意赋值表达式和赋值语句的区别。3.2顺序结构3.2.2字符数据的输入与输出函数1.字符输入函数getchar()getchar函数的功能是在程序运行时让用户从键盘

上输入一个字符,其一般形式为:getchar()2.字符输出函数:putchar()putchar函数是字符输出函数,其功能是在显示器上输出单个字符。其一般形式为:putchar(字符变量或字符常量)3.2顺序结构3.2.3格式输入和输出函数1.格式输入函数scanf()其作用是让用户按指定格

式从键盘输入各种类型的数据。scanf函数的一般形式为:scanf("控制字符",地址表列)2.格式输出函数printf()其函数名最末一个字母f即为“格式”(format)的意思。其功能是按用户指定的格式,把指定的数据输出到显示器屏幕上。在前面的例题中我们已多次使用过

这个函数。printf函数调用的一般形式为:printf(“格式控制字符串”,输出表列)3.2顺序结构printf中的格式说明符及其意义格式说明符意义d输出十进制有符号整数,不输出正号o输出八进制无符号整数X或x输出十六进制无符号整数u输出无符号十进制整数f以小数形式输出单精度实型数,

小数点后默认输出6位小数E或e以标准指数形式(小数点前有且只有一个非0数字)输出单精度数,其中小数点后输出5位,指数为2位,共输出11位G或g选用f或e格式中输出宽度较少的一种格式输出单精度实型数,不输出无意义的0c输出单个字符s输出字符串3.3选择结构3.2.1关系运算与逻辑运算1.格

式输入函数scanf().在C语言中,关系运算符有以下几个:在这六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=,==和!=的优先级相同。关系表达式的一般形式为:表达式关系运算符表达式<小于<=小于或等于>大于>=大于

或等于==等于!=不等于3.3选择结构在C语言中,若想表示一个量x在两个数值0和1之间,需要用逻辑与运算符将两个关系表达式连起来,即写成:x>0&&x<1。2.C语言中的逻辑值3.C语言中的逻辑运算符C语言中提供了三种逻辑运算符:&&与

运算||或运算!非运算与运算符&&和或运算符||都是双目运算符,满足左结合性。非运算符!为单目运算符,具有右结合性。3.3选择结构逻辑运算符和其他运算符优先级的关系可表示如下:4.关系运算符及其优先次序!(非)→&&(与)→||(或)按照运算符的优先顺序可以得出: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.3选择结构3.2.2if语句1.if语句的三种基本形式C语言的if语句有三种基本形式,其用法如下。(1)第一种形式为

:if(表达式)语句如果表达式的值为真,则执行其后的语句,否则不执行该语句。(2)第二种形式为:if(表达式)语句1;else语句2;如果表达式的值为真,则执行语句1,否则执行语句2。3.3选择结构(3)第三种形式为:if(表达式1)语句1;elseif(表达式2)语句2;els

eif(表达式3)语句3;……elseif(表达式m)语句m;else语句n;依次判断各表达式的值,当某个表达式的值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。3.3选择结构2.if语句的嵌套当if语句中

的执行语句又是if语句时,则构成了if语句嵌套的情形,其一般形式可表示如下:if(表达式)if(表达式)语句;或者为:if(表达式)语句;elseif(表达式)语句;3.3选择结构3.2.3switch语

句在C语言中,提供了一种专门用于多分支选择的switch语句,其一般形式为:switch(表达式){case常量表达式:语句1;break;case常量表达式:语句2;break;case常量表达式:语

句3;break;……case常量表达式:语句n;break;default:语句n+1;break;}3.4循环结构3.4.1goto语句goto语句是一种无条件转移语句,goto语句的一般格式为:goto语句标号;goto语句通常使程序

层次不清,且不易读,不符合结构化程序设计的原则,因此不提倡使用。3.4循环结构3.4.2while语句while语句的一般形式为:while语句中的表达式一般是关系表达式或逻辑表达式,也可以是赋值或其他合法的表达式,还可以是一个变量或常

量,只要其值为真(非0)即可继续循环。while(表达式)语句;3.4循环结构3.4.3do_while语句do_while语句的一般形式为:do语句;while(表达式);do_while语句的功能为:先执行do后的语句,然后计算

while后的表达式,如果表达式的值为非0,接着执行do后的语句,直到while后的表达式的值为0。3.4循环结构3.4.4for语句在C语言中,for语句使用最为灵活,它完全可以取代while或do

_while语句。它的一般形式为:for(表达式1;表达式2;表达式3)语句;它的执行过程如下:(1)先求解表达式1。(2)求解表达式2,若其值为真(非0),则执行for里面的语句,然后执行第三步;若其值

为假(0),则结束循环,转到第E步。(3)求解表达式3。(4)转回上面第二步继续执行。(5)循环结束,执行for语句下面的一个语句。3.4循环结构for语句中变量初始化部分只在开始时执行一次,然后判断条件表达式,若为true,则执行代码块循环体,然后执行控制变量更新表达式,再回头来判断条件表达

式是否成立,以决定下一次循环;若条件表达式为false,则结束整个循环。3.4循环结构在使用for语句,应注意的一些问题:(1)for循环中的“表达式1”、“表达式2”和“表达式3”都是可选项,即可以缺省,但两个“;”不能缺

省。(2)可以省略“表达式1”,即把表达式1移到for语句前面。(3)可以省略“表达式2”,这时如不做其他处理便成为无限循环。(4)可以省略“表达式3”,这时可在语句体中加入修改循环控制变量的语句。3.4循环结构在使用for语句,应注

意的一些问题:(5)如果同时省略“表达式1”和“表达式3”,则for语句就变成了while语句。(6)3个表达式都可以省略。(7)表达式1可以是设置循环变量初值的赋值表达式,也可以是其他表达式。(8)表达式1和表达式3也可以是逗号表达式。(9)表达式2一般是关系

表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。3.4循环结构3.4.5循环语句的嵌套在一个循环体中又包含一个循环语句,称为循环的嵌套。while、do_while和for可以互相嵌套。在执行嵌套的循环时,应注意如下一些问题

:(1)只有在内层循环执行完后,才能开始下一次的外层循环。(2)要注意内层循环必须完全包含在外层循环中,循环是不能交叉的。(3)如果一个循环执行完后再执行另一个循环,这称为并列循环。并列循环允许使用相同的

循环变量,而嵌套的循环应避免使用相同的循环变量。3.4循环结构【例】输出九九表#include<stdio.h>main(){inti,j;for(i=1;i<10;i++)printf("%4d",i);printf("\n------------------------

---------------------\n");for(i=1;i<10;i++)for(j=1;j<10;j++)printf((j==9)?"%4d\n":"%4d",i*j);}3.4循环结构运行结果:123456789--------------------------------

--------1234567892468101214161836912151821242748121620242832365101520253035404561218243036424854714212835

4249566381624324048566472918273645546372813.4循环结构3.4.6break语句和continue语句break语句的一般形式为:break;continue语句的一般形式为:co

ntinue;3.5本章小结本章主要讲述了C程序的结构化程序设计,即C程序的语句、顺序结构、选择结构和循环结构。通过本章的学习,读者应了解C程序的一般结构和五种语句的形式,掌握如何使用赋值语句,并掌握字符数据、格式的输入和输出函数,重点掌握如何使用顺序结构、选择结构和循环结构中的各种语句。C语

言程序设计项目教程第4章共分为3个部分内容第4章利用数组处理批量数据数组是同类型数据的有序集合,一个数组中的所有数据都来自同一类型,如一个正文行可以看作是由字符组成的字符数组。数组用一个统一的名字来标识,数组中每一个数据称为元素,每一个数

组元素可用数组名和下标来唯一的确定。【本章概览】第4章利用数组处理批量数据一维数组二维数组【本章重点】字符数组第4章利用数组处理批量数据【本章目标】了解一维、二维和字符数组的定义了解字符串和字符串结束的标志,已经用于字符串处理的几个函数掌握一维、二维的引用,及初始化方法4.1一维

数组4.1.1一维数组的定义类型标识符数组名[常量表达式]一维数组的定义形式为:数组的存放形式如下:从定义中可以看出,数组名是一个标识符,其后方括号中只能是一个常量,不能是变量,它表示数组元素的个数。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]4.1一维数组4.

1.2一维数组元素的引用数组名[下标表达式]数组元素的一般引用形式为:定义数组时,数组名后的[]内只能是常量,而在引用数组元素时,数组名后的[]中可以是常量,也可以是变量或表达式。4.1一维数组【例】求一组学生的平均成绩#include<s

tdio.h>#defineNUM5main(){intgrade[NUM],i,total;floataverage;total=0;printf("pleaseinput%dscores\n",NUM);for(i=0;i〈NUM;i++){printf(

"grade[%d]=",i);scanf("%d",&grade[i]);total=total+grade[i];}average=(float)total/NUM;printf("average=%0.2f\n",average);}4.1一维数组运行结果:pl

easeinput5scoresgrade[0]=90grade[1]=65grade[2]=97grade[3]=57grade[4]=78average=77.404.1一维数组4.1.3一维数组的初始化

static类型说明符数组名[常量表达式]={值,值……值};1.一维数组的初始化赋值的一般形式2.对数组的初始赋值的规定(1)只给部分元素赋初值。(2)只能给元素逐个赋值,不能给数组整体赋值。(3)如不给数组赋初值,则对静态数组和外部数组,其全部元素初值均为0,而对其他存储类型的数组,其各元

素的初值均为随机值。(4)如给全部元素赋初值,则在数组定义中可以不给出数组元素的个数。4.2二维数组4.2.1二维数组的定义类型说明符数组名[常量表达式1][常量表达式2]…;1.二维数组定义的一般形式

2.二维数组行排列4.2二维数组4.2.2二维数组元素的引用数组名[下标][下标]二维数组的元素也称为双下标变量,其表示形式为:4.2.3二维数组的初始化二维数组初始化也是在定义二维数组时给各元素赋以初值。二维数组可按行分段赋值,也可按行连续赋值。对于二维数组赋初始值还有以下说明:(1)可

以只对部分元素赋初值,未赋初值的元素自动取0值。(2)如对全部元素赋初值,则第一维的长度可以不给出。4.3字符数组4.3.1字符数组的定义用来存放字符的数组称为字符数组。字符数组定义的形式与前面介绍的数值数组相同。4.3.2字符数组的初始化对数组的各元素分别赋予字符值,赋初值后的情形如下图所示。

Thisisastringstr[0]str[1]str[2]str[3]str[4]str[5]str[6]str[7]str[8]str[9]str[10]str[11]str[12]str[13]str[14]s

tr[15]4.3字符数组4.3.3字符串和字符串结束标志在C语言中,是没有字符串变量的,通常用一个字符数组来存放一个字符串。字符串总是以'\0'作为串的结束符,这个结束标志是由系统自动加上的。例#include<stdio.h>main(){staticcharc[]="B

ASIC\ndBASE";printf("%s\n",c);}运行结果:BASICdBASE4.3字符数组4.3.4字符数组的引用和输入输出对字符数组,既可以一个元素一个元素地来引用,也可以整体当作一个字符串来引用。单个字符的引用,可以一次引用字符数组中的一个元素,得到一个字符。【例

】输出一个字符串#include<stdio.h>main(){staticcharc[11]={'I','','a','m','','a','','g','i','r','l'};inti;for(i=0;i<11;i++)printf("%c",c[i]);print

f("\n");}运行结果:Iamagirl4.3字符数组4.3.5用于字符串处理的几个函数1.字符串输入——gets()函数2.字符串输出——puts()函数3.字符串比较——strcmp()函数5.字符串连接——strcat()函数4.字符串拷贝——strcpy()函数6

.求字符串长度──strlen()函数(len是length的缩写)7.将字符串中大写字母转换成小写──strlwr()函数8.将字符串中小写字母转换成大写──strupr()函数4.4本章小结本章主要讲述了一维数组、二维数组和字符数组。通过本章的学习,读者应了解一维、二维和字符

数组的定义;掌握一维、二维引用;掌握一维、二维和字符数组的初始化方法;了解字符串和字符串结束的标志,并知道用于字符串处理的几个函数。C语言程序设计项目教程第5章共分为6个部分第5章用函数实现模块化程序设计所有的高级语

言中都有子程序这个概念,用子程序来实现模块的功能。在C语言中,子程序的作用是由函数来完成的。一个C程序可以由一个主函数和若干个函数构成。由主函数调用其他函数,其他函数之间也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。【本章概览】在TurboC2.0中,规定所有变量在使用

前都必须加以说明。一条变量说明语句由数据类型和其后的一个或多个变量名组成。变量的存储属性解决的问题是:变量的值放在什么地方、变量的空间何时分配、何时释放、变量在哪个语句区间内可以使用。第5章用函数实现模块化程序设计函数的基本知识、函数的参数和函数的值函数的调用、数组作函数参数【本章重点】局部

变量和全局变量,以及变量的存储类类型内部函数和外部函数第5章用函数实现模块化程序设计【本章目标】了解函数的定义和声明方法、函数的形参、实参和函数值的意义和使用方法掌握局部变量和全局变量的声明和使用方法掌握函数的三种调用方式、使用数组作为函数参数的方法掌握内部

函数和外部函数的声明和使用方法掌握在不同程序间使用全局变量的方法5.1.1函数定义的一般形式类型说明符函数名(){类型说明语句}5.1函数的基本知识1.无参函数的一般形式2.有参函数的一般形式类型说明符函数名(形式参数表)形式参数类型说

明{类型说明语句}5.1.2函数的声明类型说明符被调函数名();5.1函数的基本知识1.传统格式2.现代格式类型说明符被调函数名(类型说明符形参,类型说明符形参…);或者是类型说明符被调函数名(类型说明符,类型说明符…);5.1.3函数的

定义、声明和调用的区别(2)把函数头下面的函数体去掉,然后在函数头后面加一个分号,就成了函数的声明。5.1函数的基本知识(1)函数的定义时函数头下面一定要有函数体,也就是{}括起来的一个程序段,函数头后面千万不要有分号。函数头中有函数的类型以及

各形参的类型说明。(3)调用函数时,只需要写出函数名,如果该函数是无参函数,函数名后面直接加一对小括号就行了;如果被调函数是有参的,这时要在小括号里写出实参,但实参不要加类型说明。5.2.1形参和实参5.2函数的

参数和函数的值函数的形参和实参具有以下特点:(1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。(2)实参可以是常量、变量、表达式、函数调用等,无论实参是何种类型的量,在进行函数调用时,

它们都必须具有确定的值,以便把这些值传送给形参。(3)实参和形参在数量、类型和顺序上应严格一致,否则会发生“类型不匹配”错误。(4)在函数调用过程中,形参的值发生改变,而实参中的值不会变化。5.2.2函数的值5.2函数的参数和函数的值对函数的值(或称函数返回值)有的说明:(1)函数的值只

能通过return语句返回主调函数。(2)函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类型为准,自动进行类型转换。(3)如函数值为整型,在函数定义时可以省去类型说明。(4)不返回函数值

的函数,可以明确定义为“空类型”,类型说明符为“void”。5.3.1函数调用的方式5.3函数的调用1.函数表达式。如:z=max(x,y);2.函数语句。如:printf("%d",a);scanf("%d",&b);3.函数实参。如:printf(“%d”,max(x,y)

);5.3.2嵌套调用5.3函数的调用函数的嵌套使用【例】计算s=22!+32!5.3函数的调用longf1(intp){intk;longr;longf2(int);k=p*p;r=f2(k);returnr

;}longf2(intq){longc=1;inti;for(i=1;i<=q;i++)c=c*i;returnc;}main(){inti;longs=0;for(i=2;i<=3;i++)s=s+f1(i

);printf("\ns=%ld\n",s);}5.3.3递归调用5.3函数的调用一个函数直接或间接地调用它自身称为递归调用,这种函数称为递归函数。在C语言中,允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归

函数将反复调用其自身。每调用一次就进入新的一层。【例】用递归法计算n!5.3函数的调用longff(intn){longf;if(n<0)printf("n<0,inputerror");elseif(n==0||n==1)f=1

;elsef=ff(n-1)*n;return(f);}main(){intn;longy;printf("\ninputainteagernumber:\n");scanf("%d",&n);y=ff(n);printf("%d!=%ld",n,y);}5

.4.1数组元素作为函数参数5.4数组作函数参数说明:(1)用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。(2)在普通变量或下标变量作函数

参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送,是把实参变量的值赋予形参变量,而形参变量的值变化是不会影响实参的。数组元素就是下标变量,它与普通变量并无区别。数组元素只能用作函数实参,其用法与普通变量完全相同:在发生函数调

用时,把数组元素的值传送给形参,实现单向值传送。【例】写一函数,统计字符串中字母的个数5.4数组作函数参数intisalp(charc){if(c>='a'&&c<='z'||c>='A'&&c<='Z')retu

rn(1);elsereturn(0);}main(){inti,num=0;charstr[255];printf("Inputastring:");gets(str);for(i=0;str[i]!='\0';i++)if(isalp(str[i]))num++;puts(str);pri

ntf("num=%d\n",num);}5.4.2数组名作为函数的实参5.4数组作函数参数说明:(1)用数组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数据类型必须一致,否则结果将出错。(2)C编译系统

对形参数组大小不作检查,所以形参数组可以不指定大小。(3)果形参数组某元素的值发生了变化,在函数调用完毕返回主调函数时这个值会被保留,也就是实参数组对应元素的值就变了。数组名作函数实参时,要求形参也是一个数组形式,并且和相对应的实参必须是类型相同的数组,实参数组与形参数

组在主调函数和被调函数中都必须有明确的数组说明。【例】用简单选择法对数组进行排序5.4数组作函数参数voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(array[j]<array[k

])k=j;if(k!=i){t=array[i];array[i]=array[k];array[k]=t;}}}【例】用简单选择法对数组进行排序5.4数组作函数参数main(){voidsort(in

tarray[],intn);inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}5

.1.1局部变量5.5局部变量和全局变量(1)主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。(2)形参变量是属于被调用函数的局部变量,实参变量是属于主函数的局部变量。(3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,

互不干扰,也不会发生混淆。(4)在复合语句中也可定义变量,其作用域只在本复合语句范围内。1.局部变量的作用域局部变量是指在函数内部说明的变量,其作用域仅限于该函数内,离开该函数后再使用这种变量是非法的。关于局部变量的作用域,要说明的几点:5.1.2全局变量5.5局部变量和全局变

量2.全局变量也称为外部变量,是在函数外部定义的变量。全局变量都是静态存储的。3.在多个文件间使用全局变量。4.静态全局变量(用static定义的外部变量)。静态全局变量就是指只在定义它的源程序文件中可用而在其他源文件中不可用的变量,即静态全局变量的作用域被限制在其所在的源程序文件。1.全局变

量是可见的。全局变量在整个程序内部都是“可见的”,可以被任何一个函数使用,并且在整个程序的运行中都保留其值。变量的4种存储类别5.5局部变量和全局变量类型性能autoexternstaticregister外部内部记忆能力noyesyesyesno多个函数共享noy

esyesnono不同文件共享noyesnonono初始化赋值random000random作用域当前函数整个程序当前文件当前函数当前函数5.6.1动态变量5.6变量的存储类型1.自动变量系统在执行过程中自动建立和

撤消的变量。系统默认变量的存储类别为自动变量。定义自动变量的语法格式是:动态变量是在程序执行的某一时刻被动态地建立,并在另一时刻被动态地撤消的一种变量。它们存在于程序的局部,也只在这个局部中可以使用。动态变量分为自动变量和寄存器变量。[auto]数据类型

变量名[=初值表达式]…;2.寄存器变量5.6变量的存储类型数据存储在寄存器中的变量称为寄存器变量。寄存器变量具有与自动变量完全相同的性质,只是该种变量放在寄存器中。从寄存器中存取数据的速度比从内存中存取数据快得多,

因此通常把使用频率较高的变量定义为register类别。启用自动寄存器变量选择项5.6.2静态变量5.6变量的存储类型静态变量有如下特点:(1)静态变量的存储空间在程序的整个运行期间是固定的。系统在编译时就为静态变量分配存储单元,程序一开始执行便被建立,直到该程序执行结

束时都是存在的。(2)静态变量的初始化是在编译时进行的。在定义时只能使用常量或常量表达式进行显式初始化。未进行显式初始化时,系统编译时将它们初始化为0。静态变量定义的语法格式是:static数据类型变量名[=初始化常量表达式]

,…;(3)静态变量的值具有可继承性。5.6.3外部变量5.6变量的存储类型1.外部变量是全局变量在函数外部定义的变量称为外部变量。外部变量的作用范围是从定义点开始到本文件结尾。外部变量在整个程序运行期间都存在。2.外部变量使用的几种情况(1)限定本文件中的外部变量只在本

文件中使用。(2)外部变量的作用域在本文件范围内扩充。(3)将外部变量的作用域扩充到其它文件。5.7.1内部函数(静态函数)5.7内部函数和外部函数如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其他文件中的函数调用,这种函数称为内部函数。这种用法

与全局变量类似,例如:static函数类型函数名(函数参数表){……}5.7.2外部函数5.7内部函数和外部函数在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数。定义这类函数的格式如下:[extern]函数类型函数名

(函数参数表){……}[extern]函数类型函数名(参数类型表)[,函数名2(参数类型表2)……];调用外部函数时,只需要对其进行说明:5.8本章小结本章主要讲述了函数的基本知识、函数的参数和函数的值、函数的调用,以及数组作函数参数,局部变量和全局变量、变量的存储类型,以及内部函数和外部

函数。通过本章的学习,读者应了解函数定义的一般形式、函数的声明,掌握函数的形参和实参以及函数的值;掌握函数调用的方式、嵌套调用和递归调用;了解数组元素作为函数参数、数组名作为函数的实参等;掌握局部变量和全局变量的声明、作用域和使用方法;掌握自动变量

、寄存器变量、静态变量、外部变量的基本语法格式和使用方法;了解如何使用内部函数和外部函数。C语言程序设计项目教程第6章共分为6个部分第6章善于利用指针指针是C语言的特色之一,也是C语言的一种重要数据类型。能否正确使用指针是高效灵活地使用C语言编程的一个标志。每一个学习和使用C语言的人,

都应当深入地学习和熟练地掌握指针。使用指针可以实现间接访问、动态存储分配、对函数实参所指对象内容进行修改,还可以方便地处理数组和字符串,以及有效地表示复杂的数据结构。【本章概览】第6章善于利用指针指针变量数组指针和字符串指针【本章重点】函数指针和指数指针二级指针第6章善于

利用指针【本章目标】了解指针的概念掌握指针数组的用法掌握变量指针、数组指针、字符串指针和函数指针的用法6.1变量的地址和指针变量6.1.1变量的地址程序中每一个变量系统都会在内存中分配相应大小的内存单元,用以存放变量的值。同时,内存中的每一个内存单元都有一个唯一

的编码,我们称之为内存单元的地址。在C语言中,我们就把地址形象地称为“指针”。也就是说,一个变量的地址就称为该变量的“指针”。6.1.2指针变量指针变量定义的一般形式为:数据类型*指针变量名;6.1变量的地址和指针变量指针运算的运算符包含*和&两个。其中,“*”为取值运算符,也称为间接访问运

算符;“&”为取地址运算符。它们都为一元运算符,结合方向为自右向左。例如:&a为变量a的地址,*p为指针变量p所指向的变量的内容,即利用指针变量间接访问所指对象的内容时使用“*”运算符。6.1变量的地址和指针变量【例】程序分析#include<stdio.h>main(){inta,b,*p1,

*p2,*p;p1=&a;p2=&b;scanf("%d,%d",&a,&b);printf("a=%d,b=%d\n",*p1,*p2);p=p1;p1=p2;p2=p;printf("a=%d,b=%d\n

",*p1,*p2);}运行结果:12,34a=12,b=34a=34,b=126.1变量的地址和指针变量交换前后的示意图如下图所示,可以看到程序中交换的是p1和p2的值,也就是p1和p2所指对象变了,而对象本身并没变。指针交换效果一6.2数组指针6.2.1数组指针

的运算1.自增(++)和自减(--)运算:可使指针变量指向当前数组元素的下一个和上一个元素。2.指针变量加或减一个整数:指针变量加或减一个整数n就是使指针变量指向同一数组中当前元素后面或前面第n个元素。3.

指向同一数组的两个指针变量相减:就是这两个指针变量所指元素下标的差值。4.指向同一数组的两个指针变量进行关系运算。6.2数组指针6.2.2数组元素的指针指向数组元素的指针其实和指向同类型的变量的指针是一样的。例如:inta[10],*p;则p=&a[i];就让指针变量p指向了数组中的元素a[i

],这里0≤i≤1。6.2数组指针6.2.3数组名作函数实参数组名是一个常量,代表数组的首地址。因此数组名只能作函数实参,不能作形参。当数组名作函数实参时,形参可以是一个同类型的数组,也可以是一个基类型与数

组类型相同的指针变量,此时传递过去的是实参数组的起始地址。1.实参与形参都为数组2.实参用数组名,形参用指针变量3.实参用指针变量,形参用数组形式4.实参与形参都用指针变量6.2数组指针6.2.4指向二维数组元素的指针变量设有一个

二维数组定义如下:inta[3][4];a是一个二维数组名,我们可以把二维数组a看作是特殊的一维数组,这一维数组的数组名为a[i](i=0,1,2)。也就是说,数组a有3行,即3个元素:a[0]、a[1]和a[2]。而每

一个元素a[i]又是一个一维数组,它包含4个元素,即a[i][0]、a[i][1]、a[i][2]和a[i][3]。如果有定义:inta[3][4],*p;p=&a[0][0];则数组元素a[i][i]的值可表示为:a[i][j]、*(a

[i]+j)、*(*(a+i)+j)、*(p+4*i+j)、p[4*i+j]。数组元素a[i][j]的地址可表示为:&a[i][j]、a[i]+j、*(a+i)+j、p+4*i+j、&p[4*i+j]。6.2数组指针6.2.5指向一维数组的指针变量在C语言中,还可以定义指向包含m个元素的一维数

组的指针变量。定义形式如下:数据类型(*指针变量名)[m];如:则p为指向含有3个int型数据元素的一维数组的指针变量。如果这时p先指向a[0](即p=&a[0]),则p+1不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位。inta[2][3],(*

p)[3];6.2数组指针【例】用指向一维数组的指针表示二维数组元素#include<stdio.h>main(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inti,

j,(*p)[4];p=a;/*即p=&a[0]*/printf("enteri,j:");scanf("%d,%d",&i,&j);printf("a[%d][%d]=%d\n",i,j,*(*(p+i)+j));pr

intf("a[%d][%d]=%d\n",i,j,*(*(a+i)+j));for(i=0;i<3;i++){p=a;printf("\ni=%d:",i);p+=i;for(j=0;j<4;j++)printf("%d\t",(*p)[j]);}printf("\

n");}6.2数组指针运行结果:enteri,j:2,3a[2][3]=12a[2][3]=12i=0:1234i=1:5678i=2:91011126.3字符串指针6.3.1字符串的表示形式在C语言中,可以有两种方法访问一个字符串,

一种是我们前面介绍的字符数组,还有一种就是用字符指针。2.用字符指针指向一个字符串1.用字符数组存放一个字符串6.3字符串指针6.3.2字符串指针作函数参数字符串指针作函数参数,可以将一个字符串的地址从一个函数传递到另

一个函数。和我们前面介绍的数组名作函数参数一样,实参与形参也可以有四种结合方式。而且如果在被调函数中改变了字符串的内容,主调函数中可以得到改变了的字符串。6.3字符串指针#include<stdio.h>voidcopy_str(charf

rom[],charto[]){inti=0;while(from[i]!='\0'){to[i]=from[i];i++;}to[i]='\0';}main(){chara[]="IloveChina.";charb[]="Helloworld.";printf("

stringais%s\nstringbis%s\n",a,b);copy_str(a,b);printf("stringais%s\nstringbis%s\n",a,b);}【例】用函数调用实现字符串的拷贝6.4函数指针6.4.1指

向函数的指针变量在C程序中,可以用一个指针变量指向函数,然后通过该指针变量调用此函数。函数的地址和变量的地址不同,它表示调用该函数时,从某个地址开始执行,而函数名也代表了这个地址。指向函数的指针变量定义的形式为:数据类型(*指针变量名)()其中,数据类型为指针所指函数的类型。例如:

int(*f)();6.4函数指针6.4.2返回指针值的函数函数的返回值可以是int型、float型、char型等,也可以返回一个指针值,也就是地址。这种返回指针值的函数的定义形式为:函数类型*函数名(形参表){函数体}例如:int*f

(intx,inty);就是对一个函数f作的声明。此时函数f有两个int型的参数,而这个函数的返回值则是一个指向int型数据的指针。返回指针值的函数与指向函数的指针在定义形式上是有区别的。6.5指针数

组6.5.1指针数组的定义和使用一个数组,其元素均为指针类型数据,称为指针数组。也就是说,指针数组中的每一个元素都相当于一个指针变量。指针数组常用于处理若干个字符串。指针数组的定义形式为:数据类型*数组名[数组长度];例如:i

nta[3][2]={1,2,3,4,5,6};int*p[3]={a[0],a[1],a[2]};p为指针数组,p中含有3个元素,每个元素都是指向int型数据的指针。上面的定义中让p[0]指向了二维数组a的第一行,

p[1]指向了第二行,p[2]指向了第三行。6.5指针数组6.5.2命令行参数在C语言中,main函数也可以带参数。在DOS命令提示符下,通过命令行把实参数据传给main函数所在的程序,也可以在TurboC集成开发环境下,通过菜单Options>A

rguments设置。带参数的main函数的形式为:main(intargc,char*argv[])命令行的一般形式为:程序名参数1参数2……参数n这时,形参argc表示命令行中参数的个数,形参指针数组argv中的各元素依次存放命令行中被空格

分隔开的字符串的首地址,即argv[0]指向程序名字符串,argv[1]指向参数1字符串,以此类推。6.6二级指针6.5.2命令行参数二级指针也就是指向指针的指针。定义一个指向指针数据的指针变量的形式为:数据类型**指针变量名;其中,数据类

型是一级指针所指对象的数据类型,例如:float**q,*p,x;则q为二级指针,p为一级指针。p可以指向x,而q可以指向p,即:p=&x;q=&p;6.6二级指针二级指针通常与指针数组联用。二级指针指向指针数组,指针数组中的元素再指向

数据类型数组。如下图所示。6.7本章小结本章主要讲述了变量的地址和指针变量、数组指针、字符串指针、函数指针、指针数组,以及二级指针。通过本章的学习,读者应了解变量的地和指针变量的基本知识;掌握数组指针的运算、数组元素的指针、数组名做函数实参

;掌握字符串的表现形式、字符串指针作为函数参数;掌握指向函数的指针变量和返回指针值的函数;掌握指针数组的定义和使用、命令行参数;了解二级指针的形式。C语言程序设计项目教程第7章共分为4个部分第7章建立自己的数据类型在C语言中,结构类型是一种

数据结构,可以把多种类型组织成一个整体,它相当于其他高级语言中的记录;“联合”也是一种构造类型的数据结构,在一个“联合”内可以定义多种不同的数据类型,一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这在前面的各种数据类型中都是办

不到的。【本章概览】C语言提供的“枚举”的类型,在其定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。第7章建立自己的数据类型结构类型使用方法联合类型使用方法【本章重点】枚

举类型使用方法第7章建立自己的数据类型【本章目标】了解结构类型的一般形式和定义掌握引用自身的结构以及链表操作掌握结构变量的引用和初始化,了解结构数组和指向结构的指针掌握联合和枚举的定义、说明,以及其变量的赋值和使用方法7.1结构类型7.1.1结构类型的一般形式struct结构名{成员列表};结构是

一种“构造”而成的数据类型,在说明和使用之前必须先定义它,也就是构造它,如同在说明和调用函数之前要先定义函数一样。结构类型的一般形式为:定义中的成员列表是对结构中的每一个成员分别进行声明,每一个成员的类型既可以是基本类型,也可以是事先定义的结构类型。7.1结构类型7.1.2结

构变量的定义3.直接说明结构变量。1.先定义结构类型,然后用它来定义结构变量,就像定义其他类型的变量一样。2.在定义结构类型的同时定义结构变量。对结构变量的定义可以有以下三种方法:7.1结构类型7.1.3结构变量的引用结构变量名.成员名在C语言中,除了允许具有相同类型的结构变量相互

赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算等都是通过结构变量的成员来实现的。表示结构变量成员的一般形式是:这里的“.”叫做成员运算符,是左结合的,具有最高的优先级。结构变量的赋值就是给各成员赋值,可用输入语句或赋值语句来完成。7.1

结构类型7.1.4结构变量的初始化如果结构变量是全局变量或为静态变量,则可对它作初始化赋值,即在定义时指定初始值。对局部或自动结构变量不能作初始化赋值。【例】外部结构变量初始化structstu/*定义结构*/{intnum;c

har*name;charsex;floatscore;}boy2,boy1={102,"Zhangping",'M',78.5};main(){boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,boy2.name);print

f("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}7.1结构类型【例】静态结构变量初始化main(){staticstructstu/*定义静态结构变量*/{intnum;char*name;charsex;flo

atscore;}boy2,boy1={102,"Zhangping",'M',78.5};boy2=boy1;printf("Number=%d\nName=%s\n",boy2.num,boy2.nam

e);printf("Sex=%c\nScore=%f\n",boy2.sex,boy2.score);}7.1结构类型7.1.5结构数组数组的元素既可以是基本类型的,也可以是结构类型的,因此可以构成结构数组。结构数组的每一个元素都相当于一个同类型的结构变量,引用结构数组元素

的方式实际上就是引用数组元素和引用结构成员的结合。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。该群体中各个成员的结构组成都是一致的,即数组元素的类型一致。结构数组的

定义方法和结构变量相似,只需说明它为数组类型即可。7.1结构类型结构数组的结构数组各元素在内存中的存放7.1结构类型7.1.6指向结构的指针结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。结构指针变量说

明的一般形式为:struct结构名*结构指针变量名有了结构指针变量,就能更方便地访问结构变量的各个成员。其访问的一般形式为:(*结构指针变量).成员名或为:结构指针变量->成员名7.1结构类型7.1.7结构指针变量作函数参数使用指针,即用指针变量作函数参数进行传送。这时由实参

传向形参的只是地址,从而减少了时间和空间的开销。这是因为虽然指针变量也占用空间,但是比起结构而言要少的多,而且指针变量占用的空间大小固定,更便于变量传递。【例】计算一组学生的平均成绩和不及格人数(用结构指针变量作函数参数编程)。structstu{intnum;char*name;

charsex;floatscore;}boy[5]=7.1结构类型main(){structstu*ps;voidave(structstu*ps);ps=boy;ave(ps);}voidave(structstu*ps){intc=0,i;floatave,s=0;for(i=0;i<5;i

++,ps++){s+=ps->score;if(ps->score<60)c+=1;}main(){structstu*ps;voidave(structstu*ps);ps=boy;ave(ps);}voidave(structstu*ps){intc=0,i;floatave,s=

0;for(i=0;i<5;i++,ps++){s+=ps->score;if(ps->score<60)c+=1;}7.1结构类型printf("s=%f\n",s);ave=s/5;printf("average=%f\ncount=%d\n",ave,c);}本程序中定义了函数ave

,ps为其形参为结构指针变量。boy被定义为外部结构数组,在整个源程序中有效。在main函数中定义说明了结构指针变量ps,并把boy的首地址赋予它,使ps指向boy数组。然后以ps作实参调用函数ave,在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。

7.1结构类型7.1.8引用自身的结构在C语言中,提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。常用的内存管理函数有以下三个:1.分配内存空间函数malloc。其调用形式为:2.分配内存空间函数calloc

。其调用形式为:3.释放内存空间函数free。其调用形式为:(类型说明符*)malloc(size)(类型说明符*)calloc(n,size)free(void*ptr);7.1结构类型7.1.9链表操作1.链表的结构

2.链表的基本操作种类(1)建立链表。(2)结构的查找与输出。(3)插入一个结点。(4)删除一个结点。7.1结构类型【例】写一个函数,在链表中按学号查找该结点TYPE*search(TYPE*head,intn){TYPE*p;in

ti;p=head;while(p->num!=n&&p->next!=NULL)p=p->next;/*不是要找的结点后移一步*/if(p->num==n)return(p);if(p->num!=

n&&p->next==NULL)printf("Node%dhasnotbeenfound!\n",n}7.2联合7.2.1联合的定义一个联合类型必须经过定义之后,才能把变量说明为该联合类型。定义一个联合类型的一般形式为:union联合名{成员表};成员表中含有若干成员,

成员的一般形式为:类型说明符成员名7.2联合联合变量名.成员名对联合变量的赋值、使用都只能是对变量的成员进行。联合变量的成员表示为:有一个教师与学生通用的表格,教师数据有姓名、年龄、专业、教研室四项,学生有姓名、年龄、专业、班级四项。编程输入人员数据,再以表格输出。7.2.3联合变量的赋值和使用程

序如下:【例】教师与学生联合变量的赋值和使用7.2联合main(){struct{charname[10];intage;charjob;union{intclass;charoffice[10];}depa;}body[2];int

n,i;for(i=0;i<2;i++){printf("inputname,age,jobanddepartment\n");scanf("%s%d%c",body[i].name,&body[i]

.age,&body[i].job);7.2联合if(body[i].job=='s')scanf("%d",&body[i].depa.class);elsescanf("%s",body[i].depa.office);}

printf("name\tagejobclass/office\n");for(i=0;i<2;i++){if(body[i].job=='s')printf("%s\t%3d%3c%d\n",body[i].name,body[i].age,body[i].job,body[i

].depa.class);elseprintf("%s\t%3d%3c%s\n",body[i].name,body[i].age,body[i].job,body[i].depa.office);}}7.3枚举enum枚举名{枚举值表};枚举类型定义的一般形式为

:enumweekday{sun,mou,tue,wed,thu,fri,sat};7.3.1枚举的定义该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值,只能是七天中的某一天。在枚举值表中应罗列出所有可用值,这些值也称为枚举元素,例如:

7.3枚举enumweekday{sun,mou,tue,wed,thu,fri,sat};enumweekdaya,b,c;如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。设有变量a、b、c被说明为上述的weekday,可采用下述任一种方式:enumw

eekday{sun,mou,tue,wed,thu,fri,sat}a,b,c;7.3.2枚举变量的说明或者为:或者为:enum{sun,mou,tue,wed,thu,fri,sat}a,b,c;7.3枚举(1)枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚

举weekday的元素再作以下赋值:sun=5;mon=2;sun=mon;都是错误的。在枚举类型的使用中,有以下几个规定:(2)枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1,…,sat值为6。7.3.3枚举类型变量

的赋值和使用(3)只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。7.4类型定义符typedef其中,int是整型变量的类型说明符。实际上,int的完整写法为integer。为了增加程序的可读性,可把整型说明符用typedef定义为:inta,b;typede

fintINTEGER类型定义符typedef允许由用户为数据类型取“别名”。例如,有整型量a、b,其说明如下:typedef定义的一般形式为:typedefint*PINT;7.5本章小结通过本章的学习,读者应了解结构的一般形式、结构变量的定义,掌

握结构的引用和初始化,了解结构数组和指向结构的指针,掌握链表的操作;掌握联合和枚举的定义、联合变量的说明,以及联合变量的复制和使用方法。本章主要讲述了结构、联合和枚举的使用方法。C语言程序设计项目教程第8章共分为4个部分第8章对文

件的输入输出在C语言中,所谓“文件”是指一组相关数据的有序集合。在使用这个数据集时需要一个标识符号,也就是这个数据集合的名称,叫做该文件的文件名。文件通常存储在光碟、磁盘等外部介质上,在使用时才会将其调入到内存中。【本章概览】第8章对文件的输入输出文件的基本

知识文件的打开和关闭【本章重点】文件的读写和定位文件的监测函数第8章对文件的输入输出【本章目标】了解文件的类型及特点掌握文件读写出错的检测方法掌握文件的打开、关闭、读写和定位方法8.1文件的基本知识8.1.1文件的类型如果站在一个计算机用户的角度来看

,可把文件可以下两种。1.从计算机用户的角度分类(1)普通文件(2)设备文件2.从文件编码的方式来分类(1)ASCII文件(2)二进制文件如果从文件编码的方式来分类,可把文件可分为以下两种。8.1文件的基本知识8.1.2文件指针在C语言中,用一个指针变量指向一个文件,这个指针称为文

件指针。通过文件指针就可对它所指的文件进行各种操作。文件指针的一般形式为:FILE*指针变量标识符;其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。8.1文件的基本知识8.1.3流(stream)

和文件(file)TurboC2.0为编程者和被访问的设备之间提供了一层抽象的东西,称之为“流”,而将具体的实际设备叫做文件。流是一个逻辑设备,具有相同的行为。因此,用来进行磁盘文件写操作的函数也同样可以用来进行打印机的写入。8.1.4关于C的库文件C语言提供了丰

富的系统文件,称为库文件。C的库文件分为两类,一类是扩展名为“.h”的文件,称为头文件;另一类是函数库,包括了各种函数的目标代码,供用户在程序中调用。8.2文件的打开与关闭8.2.1文件的打开(fopen())函数fopen函数用来打开一个文件,其

函数原型为:FILE*fopen(char*filename,*type);其调用格式为:文件指针名=fopen(文件名,文件类型与使用方式);其中,“文件指针名”必须是被说明为FILE类型的指针变量;“文件名”对应于字符指针变量file

name,是被打开文件的文件名;“文件类型与使用方式”对应于字符指针变量type,是指文件的类型和操作要求。8.2文件的打开与关闭文件类型规定字符含义"rt"或"r"只读打开一个文本文件,只允许读数据"wt"或"w"只写打开或建立一个文本文件,只允许写数据"at"或"a"追加

打开一个文本文件,并在文件末尾写数据"rb"只读打开一个二进制文件,只允许读数据"wb"只写打开或建立一个二进制文件,只允许写数据"ab"追加打开一个二进制文件,并在文件末尾写数据"rt+"读写打开一个文本文件

,允许读和写"wt+"读写打开或建立一个文本文件,允许读写"at+"读写打开一个文本文件,允许读,或在文件末追加数据"rb+"读写打开一个二进制文件,允许读和写"wb+"读写打开或建立一个二进制文件,允许读和写"ab+"读写打开一个二进制

文件,允许读,或在文件末追加数据8.2文件的打开与关闭8.2.2文件的关闭(fclose()函数)fclose()函数用来关闭一个由fopen()函数打开的文件。其函数原型为:intfclose(FILE*strea

m);该函数返回一个整型数,可以根据此返回值判断文件是否成功关闭。正常关闭文件后,fclose函数返回值为0。如返回非零值,则表示关闭文件时发生错误。8.3文件的操作8.3.1字符读写函数(fputc和fgetc)1.fput

c函数fputc函数的功能是把一个字符写入指定的文件中,其函数原型为:intfputc(ch,fp);其中,参数ch是待写入到文件中去的字符,可以是字符常量或变量;fp是一个FILE类型的指针变量。Fputc的作用就是把字符(ch值)输出到fp所指向

的文件中去。8.3文件的操作8.3.1字符读写函数(fputc和fgetc)2.fgetc函数fgetc函数的功能是从指定的文件中读一个字符,该文件的打开方式只能是只读或读写方式打开的文件。该函数的调用形式为:ch=fgetc(fp);参数fp是指向文件的指针变量,ch为字符型变量。8.3文件的

操作【例】从键盘输入字符,并将其写入到一个文件中,直到按下键盘上的“#”键,结束该程序的运行#include<stdio.h>main(){FILE*fp;charch;if((fp=fopen("ft.txt

","w+"))==NULL){printf("Cannotopenfilestrikeanykeyexit!");getch();exit(1);}printf("Pleaseinputsomeword,

theywillbesaveinft.txt:\nIfyouwanttoexitpress\"#\"\n");8.3文件的操作ch=getchar();while(ch!='#’){fputc(ch,fp);ch=getchar();}fclose(fp);}

运行结果:8.3文件的操作8.3.2字符串读写函数(fputs和fgets)1.读字符串函数(fgets)fgets函数的功能是从指定的文件中读一个字符串到字符数组中。其调用格式为:fgets(字符数组名,n,文

件指针);其中,n是一个正整数,表示从文件中读出的字符串不超过n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。如果在读出n-1个字符之前,遇到了换行符或EOF,则读出结束。fgets函数也有返回值,其返回值是字符数组的首地址。8.3文件的操作2.写字符串函数(fputs

)fputs函数的功能是向指定的文件写入一个字符串,其调用形式为:fputs(字符串,文件指针)其中,字符串可以是字符串常量,也可以是字符数组名,或指向字符数组的字符指针变量,例如:fputs("IamaChinese.",fp);其意义是把字符串"IamaCh

inese."写入fp所指的文件之中。8.3文件的操作8.3.3数据块读写函数(fread和fwrite)fread函数和fwrite函数可用来读写一组数据,如一个数组元素、一个结构变量的值等。它们的一般调用形式为:fread(b

uffer,size,count,fp);fwrite(buffer,size,count,fp);其中,buffer是一个指针。在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。siz

e表示数据块的字节数,count表示要读写的数据块块数,fp表示文件指针。8.3文件的操作【例】把一个浮点数组以二进制方式写入文件abc.dat中#include<stdio.h>main(){floatf[6]={3.2,-4.34,25.04,0.1,50.56,80

.5};/*定义浮点数组并初始化*/FILE*fp;fp=fopen("abc.dat","wb");/*创建一个只写二进制文件*/fwrite(f,sizeof(float),6,fp);/*将6个浮点数写入文件中*/fclose(fp);/*

关闭文件*/}8.3文件的操作8.3.4格式化读写(fscanf函数和fprintf函数)fscanf函数和fprintf函数与前面使用的scanf和printf函数的功能相似,都是格式化读写函数。两者的区别在于:fscanf函数和f

printf函数的读写对象不是键盘和显示器而是磁盘文件。这两个函数的调用格式为:fscanf(文件指针,格式字符串,输入表列);fprintf(文件指针,格式字符串,输出表列);例如:它的作用是将整型

变量j与字符型变量ch的ASCII码,按照%d和%c的格式输出到fp指向的磁盘文件中。fprintf(fp,"%d,%c",j,ch);8.3文件的操作8.3.5文件的定位函数1.rewind函数rewind函数的功能

是把文件内部的位置指针移到文件首。此函数无返回值。2.fseek函数其中:“文件指针”指向被移动的文件;“位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB时不会出错。fseek函数用来

移动文件内部位置指针,函数调用形式:fseek(文件指针,位移量,起始点);8.3文件的操作8.3.6文件检测函数1.读写文件出错检测函数ferror其函数调用格式为:2.文件出错标志和文件结束标志置0函数其功能为:本函数用于清除出错标志和文件结束标志,使它们为0值。cl

earerr函数的调用格式为:ferror(文件指针);其功能为:检查文件在用各种输入输出函数进行读写时是否出错。如ferror返回值为0表示未出错,否则表示有错。clearerr(文件指针);8.4典型程序实例【例】统计某文件中字符的个数#include"stdio.h"main(){FIL

E*fp;longnum=0L;if((fp=fopen("fname.dat","r"))==NULL){pirntf("Openerror\n");exit(0);}while(!feof(fp)

){fgetc(fp);num++;}printf("num=%1d\n",num-1);fclose(fp);}8.5本章小结通过本章的学习,读者应了解文件的类型、文件指针、流和文件、库文件等知识点;理解文件如何打开和关闭;掌握字符读写函数、字符串读

写函数、数据块读写函数、格式化读写函数、文件的定位函数,以及文件的检测函数。本章主要讲述了文件的基本知识、文件的打开和关闭,以及文件的操作。C语言程序设计项目教程第9章共分为三个部分第9章编译预处理命令C语言与其他高级

语言的一个重要区别是可以使用预处理命令和具有预处理的功能,这些预处理命令是由ANSIC统一规定的,但它们不是C语言本身的组成部分,而是C编译程序的一部分。所有的预处理命令都要以#开头且占用一个单独的书写行。C语言提供的预处理命

令主要有四种:宏定义、文件包含、条件编译和行控制,本章主要介绍前三种。【本章概览】第9章编译预处理命令带参数和不带参数的宏定义文件包含和条件编译【本章重点】第9章编译预处理命令【本章目标】掌握宏定义方法掌

握条件编译方法掌握文件包含方法9.1宏定义9.1.1不带参数的宏定义(符号常量)不带参数的宏定义通常用作一个指定的标识符来代表一个字符串,它的一般格式为:1.不带参数的宏定义的一般格式#define标识符字符串#define是宏定义命令

,标识符称为宏名,一般习惯用大写字母表示,以便和变量名加以区别。在编译预处理时,将程序中在该命令之后出现的所有的标识符都用后面的字符串代替,这个过程叫“宏展开”或“宏替换”。9.1宏定义2.不带参数的宏定义的一些

说明(1)宏名一般用大写。(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义。(3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。(4)宏定义末尾不加分号。(5)宏定义写在函数的花

括号外边,作用域为其后的程序,通常在文件的最开头。(6)可以用#undef命令终止宏定义的作用域。(7)宏定义可以嵌套。(8)字符串""中永远不包含宏。(9)宏定义不分配内存,变量定义分配内存。9.1宏定义9.1.2带参数的宏定义带参数的宏定义也称为函数宏,它的定义

格式为:1.带参数的宏定义的格式#define标识符(参数表)字符串#defineF(x)(x)*(x)#defineMAX(x,y)((x>y)?x:y)对带参数的宏定义在宏替换时,不仅要将程序中出现的标识符用字符串代替,还要进行

参数的替换。字符串中要包含在括弧中指定的参数。如:9.1宏定义2.带参数的宏定义的一些说明(1)对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。(2)在宏定义时,在宏名与带参数的括号之间不应加空格,否则将空格以后的字符都作为替

代字符串的一部分。9.1宏定义3.带参数的宏和函数的调用的区别(1)函数调用时是把实参的值传递给形参,而宏替换时不需要计算实参的值。(2)函数中的实参和形参都要定义类型,并且对应的实参和形参的类型要一致,而宏不存在类型问题,宏名和参数都无类型。(3)函数调用是在程序运

行时进行的,而宏的替换是在编译时进行的。(4)函数调用需要占用临时的内存单元,而宏的替换不需要占用内存单元。(5)宏替换后可能会使源程序变长,而函数调用不会使源程序变长。9.2文件包含9.2.1文件包含的一般形式#include"文件名"C语言提供了#i

nclude命令来实现“文件包含”的操作。其一般形式为:或#include<文件名>两种形式的区别:用双引号时,系统首先在当前文件所在的文件目录中寻找被包含文件,如找不到,再到存放C库函数头文件的目录中

寻找。而用尖括号时,只在存放C库函数头文件的目录中寻找被包含文件。9.2.2文件包含的几点说明(1)一个#include命令只能指定一个被包含文件,如果要包含n个文件,要用n个#include命令。(2)如果文件1

包含文件2,而文件2要用到文件3的内容,则可在文件1中用两个#include命令分别包含文件2和文件3,而且文件3应该出现在文件2之前。这样,如果文件2只被文件1包含而不会出现在其它场合,则在文件2中无须再包含3。(3)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。(4)被

包含文件与其所在的文件在预编译后已成为同一个文件(而不是两个文件),因此,如果被包含文件中有全局静态变量,它也在包含它的文件中有效,不必用extern声明。(5)在#include命令中,文件名可以用双引号或尖括号括起来,二者都是合法的。9.2文件包含【例】建立头文件,并加以引用建立头

文件“myhead.h”,其内容为:#defineN5#defineM1N*3引用头文件#include"myhead.h"#include<stdio.h>#defineM2N*2main(){inti;i=M1+M2;printf("%d\n",i);}9.2文件包含运行结果:259

.3.1常用条件编译命令的形式9.3条件编译1.#ifdef指令#ifdef指令的格式如下:#ifdef标识符程序段1#else程序段2#endif它的作用是当所指定的标识符已经被#define命令定义过,则编译程序段1,否则编译程序段2。

其中,#else部分也可以没有。9.3条件编译2.#ifndef指令#ifndef指令的格式如下:#ifndef标识符程序段1#else程序段2#endif它的作用是当标识符未被定义过则编译程序段1,否则编译程序段2。与第一种形式的作用相反。其中,#e

lse部分也可以没有。9.3条件编译3.#if指令#if指令的格式如下:#if表达式程序段1#else程序段2#endif它的作用是当表达式的值为真时就编译程序段1,表达式的值为假时就编译程序段2。9.3条件编译4.#elif指令#elif预

处理指令综合了#else和#if指令的作用。例如:#defineTWOmain(){#ifdefONEprintf("1\n");#elifdefinedTWOprintf("2\n");#elsepr

intf("3\n");#endif}最后输出结果是2。9.3条件编译5.#endif指令#endif用于终止#if预处理指令。例如:#defineDEBUG0main(){#ifDEBUGprint

f("Debugging\n");#endifprintf("Running\n");}由于程序定义DEBUG宏代表0,所以#if条件为假,不编译后面的代码直到#endif,所以程序直接输出Running。如果去掉#define语句,效果是一样的。9.

3条件编译9.3.2其他一些标准指令(1)#error指令将使编译器显示一条错误信息,然后停止编译。(2)#line指令可以改变编译器用来指出警告和错误信息的文件号和行号。(3)#pragma指令没有正式的定义。编

译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。9.4本章小结本章主要讲述了宏定义、文件包含,以及条件编译等知识。通过本章的学习,读者应掌握带参数和不带参数的宏定义的一般格式及其相关说明;了解条件包含的一般形式和相关说明;

理解常用条件编译的形式,并能灵活运用。C语言程序设计项目教程第10章共分为3个部分第10章位运算C语言既具有高级语言的特点,有具有低级语言的功能。前面介绍的各种运算都是以字节作为最基本位进行的,但在很多系统程序中常要求在位

(bit)一级进行运算或处理。C语言提供了位运算的功能,因而C语言也能像汇编语言一样用来编写系统程序。【本章概览】第10章位运算位运算符和位运算位域的使用方法【本章重点】第10章位运算【本章目标】掌握位运算的定义掌握位域的概念、声明和使用方法掌握各种位

运算的功能及相应的位运算符10.1位运算符和位运算C语言提供了六种位运算符,如表11-1所示。这六种基本位运算中除了取反运算以外都是二目运算,而且操作数只能是字符型或整型量。位运算符运算符功能优先级&按位与3|按位

或5(低)^按位异或4~取反1(高)<<左移2>>右移210.1位运算符和位运算10.1.1按位与运算按位与运算符“&”是双目运算符,其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结

果位才为1,否则为0。参与运算的数以补码方式出现。【例】按位与运算main(){inta=9,b=5,c;c=a&b;printf("a=%d\nb=%d\nc=%d\n",a,b,c);}10.1位运算符和位运算10.1.2按位或运算按位或运算符“|”是双目运算符,其功能是参

与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。【例】按位或运算main(){inta=9,b=5,c;c=a|b;printf("a=%d\nb=%d\nc=%d\n",a,

b,c);}10.1位运算符和位运算10.1.3按位异或运算按位异或运算符“^”是双目运算符,其功能是参与运算的两数各对应的二进位相异或。当两对应的二进位相异时,结果为1。【例】按位异或运算main(){inta=9;a=a^15;printf("a=%d\n",a);}10.1位运

算符和位运算10.1.4求反运算求反运算符~为单目运算符,具有右结合性,其功能是对参与运算的数的各二进位按位求反。【例】整数进行求反运算Main(){Inta=9;a=~a;printf(“a=%d\n”,a);}10.1位运算符和位运算10.1.5左移运算左移运算符“<<”是双目运算符,其功能把

“<<”左边的运算数的各二进位全部左移若干位。由“<<”右边的数指定移动的位数,高位丢弃,低位补0。【例】左移运算Main(){Inta=9;a=a<<5;printf(“a=%d\n”,a);}运行结果为:a=28810.1位

运算符和位运算10.1.6右移运算右移运算符“>>”是双目运算符,其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1。最高位是补0或是补1取决于编译系统的规定

。TurboC和很多系统规定为补1。Main(){Inta=9;a=a>>5;printf(“a=%d\n”,a);}【例】右移运算运行结果为:a=010.2使用位域10.2.1位域的定义位域定义与结构定义相仿,其形

式为:struct位域结构名{位域列表};其中,位域列表的形式为:类型说明符位域名:位域长度10.2使用位域10.2.1位域变量的声明(1)一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一字节

起存放该位域,也可以有意使某位域从下一单元开始。(2)由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。(3)位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。10.2使用位域10.2.2位域的使用位域的使用和结构成员的使

用相同,其一般形式为:位域变量名.位域名位域允许用各种格式输出。10.3典型例题解析【例】设字符型变量x的值是064,计算机表达式“~x^<<2&x”的值【分析】首先注意变量x的值是八进制整型常量,表示成8位二进制数为:00110100;其次,分析表达式中的位运算符的优先

级别,可知该表达式相当于(~x)^((x<<2)&x)。下面可以依次进行计算,部分计算结果如下:x00110100~x11001011x<<211010000(x<<2)&x00010000(~x)^((x<<2)&x)110

11011二进制数11011011对应的八进制数是0333,所以表达式的值是0333。10.3典型例题解析【例】将a进行循环右移,例如原来右端3位移到最左端3位【分析】不能直接使用>>运算符,因为>>运算符使左面添0或1。main(){unsigneda,b,c;intn;scanf("a

=%o,n=%d",&a,&n);b=a<<(16-n);c=a>>n;c=c|b;printf("%o\n%o",a,c);}10.4本章小结本章主要讲述了位运算符和位运算、使用位域等相关知识。通过本章的学习,读者应掌握按位与运算、按位或运算、按位异或运算、

求反运算、左移运算和右移运算;了解位域的定义,理解位域的使用方法。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?