描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302507710丛书名: 高等学校计算机基础教育规划教材
? 以VC 2010为编程环境,所有例题、习题都在VC 2010环境下调试通过。
? 概念清晰,通俗易懂,突出应用,注重趣味性和实用性,更加易学易用。
? 以“适用”加“实用”为原则,教材内容更加精简,重点更加突出。
? 结合编者实践经验,详细介绍了VC 2010环境C程序的调试和运行方法,强化编程实践训练。
本书体系合理,篇幅适中,重点突出,文字通俗易懂,内容由浅入深,知识点言简意赅,是初学者学习C语言程序设计的理想教材,可作为高等院校学生学习C语言程序设计课程的主教材,也适合计算机培训班或自学的读者使用。
第1章C程序设计入门1
1.1概述1
1.1.1程序和程序设计语言1
1.1.2C语言的起源和发展2
1.1.3C语言的特点3
1.2简单的C程序4
1.2.1简单的C程序举例4
1.2.2C程序的结构8
1.2.3C程序的调试与运行环境9
1.3基本数据类型11
1.3.1整型数据12
1.3.2实型数据16
1.3.3字符型数据18
1.4运算符和表达式23
1.4.1运算符优先级及结合性23
1.4.2数据类型转换24
1.4.3算术运算符和算术表达式26
1.4.4赋值运算符和赋值表达式27
1.4.5逗号运算符和逗号表达式29
1.4.6 和–运算符30
1.4.7sizeof运算符31
1.5宏常量与常变量32
1.5.1宏常量32
1.5.2常变量33
1.6位运算34
复习与思考38
习题138
第2章顺序结构程序设计41
2.1编程逻辑与技术41
2.1.1算法及算法的描述工具41
2.1.2程序设计的基本过程44
2.1.3结构化程序设计方法45
2.2C语言的语句类型47
2.3数据的输入与输出48
2.3.1字符输入与输出函数49
2.3.2格式输入与输出函数50
2.4常用计算函数60
2.4.1数学库函数60
2.4.2伪随机函数61
2.5程序举例62
复习与思考67
习题267
〖1〗〖3〗C语言程序设计(第3版)目录〖3〗〖3〗第3章选择结构程序设计70
3.1关系运算符和关系表达式70
3.1.1关系运算符70
3.1.2关系表达式71
3.2逻辑运算符和逻辑表达式72
3.2.1逻辑运算符72
3.2.2逻辑表达式72
3.3if语句74
3.3.1if语句的三种形式74
3.3.2if语句的嵌套78
3.4条件运算符和条件表达式79
3.5switch语句81
3.6程序举例84
复习与思考91
习题391
第4章循环结构程序设计98
4.1当型循环与直到型循环98
4.1.1当型循环结构98
4.1.2直到型循环结构98
4.2循环语句99
4.2.1while语句99
4.2.2dowhile语句101
4.2.3for语句103
4.3循环的嵌套105
4.4break语句和continue语句108
4.4.1break语句108
4.4.2continue语句109
4.5程序举例110
复习与思考122
习题4122
第5章函数130
5.1函数的定义与调用130
5.1.1函数的定义131
5.1.2函数的返回值132
5.1.3函数的调用134
5.2函数间的参数传递140
5.2.1实参与形参的传递方式140
5.2.2局部变量与全局变量142
5.2.3局部变量的存储类别145
5.2.4全局变量的存储类别147
5.3函数的嵌套调用148
5.4函数的递归调用150
复习与思考155
习题5156
第6章数组165
6.1一维数组165
6.1.1一维数组的定义与引用165
6.1.2一维数组的初始化168
6.1.3一维数组应用举例169
6.2二维数组174
6.2.1二维数组的定义与引用174
6.2.2二维数组的初始化176
6.2.3二维数组应用举例178
6.3字符数组182
6.3.1字符数组的定义与初始化182
6.3.2字符串与字符数组184
6.3.3字符数组的输入与输出185
6.3.4常用字符串处理函数188
6.3.5字符数组应用举例192
6.4数组作为函数参数195
6.4.1用一维数组名作为函数参数195
6.4.2用二维数组名作为函数参数201
复习与思考203
习题6203
第7章指针211
7.1指针的概念212
7.2指针的操作214
7.2.1取地址运算符&与指针运算符214
7.2.2使用指针实现地址传递216
7.2.3使用简单指针的例子219
7.3数组和指针220
7.3.1指向数组元素的指针220
7.3.2指针与整数的加减法221
7.3.3指针的类型与指针间的减法222
7.3.4指向字符串的指针223
7.3.5使用指针处理一维数组的应用举例226
7.4指针数组与多级指针229
7.4.1指针数组229
7.4.2二级指针及多级指针231
7.4.3使用指针数组作为main函数的参数233
7.5数组的指针与函数的指针235
7.5.1指向数组的指针235
7.5.2行指针与列指针236
7.5.3函数指针与指针函数237
复习与思考240
习题7241
第8章结构体与共用体249
8.1结构体类型与结构体变量249
8.1.1结构体类型的声明249
8.1.2结构体类型变量的定义250
8.1.3结构体类型变量的引用252
8.1.4结构体类型变量的初始化254
8.2结构体数组255
8.2.1结构体数组的定义与引用255
8.2.2结构体数组应用举例256
8.3结构体指针259
8.3.1指向结构体变量的指针259
8.3.2指向结构体数组的指针260
8.3.3将结构体指针作为函数参数262
8.4共用体266
8.5枚举类型269
8.6用typedef自定义类型名272
复习与思考274
习题8274
第9章动态数组与链表282
9.1内存动态分配与动态数组282
9.1.1常用的内存动态分配函数282
9.1.2动态数组284
9.2链表286
9.2.1链表的基本概念286
9.2.2创建动态链表286
9.2.3输出动态链表289
9.2.4动态链表的删除操作290
9.2.5动态链表的插入操作291
9.2.6动态链表的应用举例292
复习与思考296
习题9296
第10章文件300
10.1文件的基本概念300
10.1.1字节流300
10.1.2缓冲文件系统300
10.1.3文件类型指针301
10.1.4文件位置指针及文件打开方式301
10.2文件的打开与关闭302
10.2.1文件的打开302
10.2.2文件的关闭303
10.3文件的读写304
10.3.1字符读写函数304
10.3.2格式读写函数307
10.3.3数据块读写函数310
10.3.4其他读写函数312
10.4文件的定位313
复习与思考314
习题10315
第11章综合应用案例——股票交易系统322
11.1功能模块设计322
11.2数据结构设计323
11.3函数功能描述324
11.4编制程序331
11.5运行程序342
11.5.1VC 2010下的多文件管理342
11.5.2文件包含343
11.5.3调试运行344
附录A基本ASCII码表346
附录B运算符和结合性348
附录CC语言关键字350
附录DVC 2010环境下的常用库函数352
附录E基于VC 2010环境下的C语言程序运行步骤与方法361
附录FVC英文版中通用错误代码分析378
参考文献381
编委会顾问: 陈国良李廉
主任: 冯博琴
副主任: 周学海管会生卢先和
委员: (按姓氏音序为序)
边小凡陈立潮陈炼陈晓蓉鄂大伟
高飞高光来龚沛曾韩国强郝兴伟
何钦铭胡明黄维通黄卫祖黄志球
贾小珠贾宗福李陶深宁正元裴喜春
钦明皖石冰石岗宋方敏苏长龄
唐宁九王浩王贺明王世伟王移芝
吴良杰杨志强姚琳俞勇曾一
战德臣张昌林张长海张莉张铭
郑世钰朱敏朱鸣华邹北骥秘书: 袁勤勇前 言
C语言是当今世界上广泛流行的一门程序设计语言,深受广大程序员和编程爱好者的喜爱。C语言不仅适用于开发系统软件,而且也是用于开发应用软件和进行大规模科学计算的常用编程语言。
由于C语言的基本概念复杂,内容丰富,使用灵活,一些初学者会发现,学习C语言的过程是一个充满挫折的艰难过程。一方面觉得学习C语言内容枯燥,难度大;另一方面即便学完了C程序设计课程,但一旦要用C语言来独立编写一些解决实际问题的程序时会感到无从下手。为此,作者通过认真分析和研究,并结合长期从事C程序设计课程教学的实践经验,于2008年编写了《C语言程序设计》一书,由清华大学出版社出版,至今共出版了两个版次。
《C语言程序设计》一书在使用中得到了广大读者的肯定,并提出了不少宝贵的意见,在此表示感谢。此次对本书做第二次修订,主要基于以下原因:
(1) 现代计算机技术不断发展,C语言及编程技术也在发展中,教材内容要与时俱进,推陈出新。
(2) 作者在教学实践和教学改革中积累了一些新的经验,对学生的学习心理有了更深刻的认识和了解。
(3) 广大读者和同仁对本书提出了一些新的建议与期望。
为此,在继续保持前两版写作风格和特色的基础上,对本书主要做了以下修订:
(1) 以VC 2010为编程环境,所有例题、习题都在VC 2010环境下调试通过。
(2) 考虑到C语言的发展和系统兼容性问题,增加了部分C99标准的新规定,所有程序风格均采用如下所示的C99标准形式: int main( )
{
return 0;
}(3) 去掉了“预处理”和“位运算”两章,把宏常量和基本位运算符的内容放在了第1章;考虑到内容的关联性,把关系运算和逻辑运算的内容调整到第3章。
(4) 为了进一步巩固和综合应用各章知识,了解和掌握大型程序的设计方法,按照软件工程的方法编写了综合应用案例一章,并将项目管理和文件包含等内容融入其中。(5) 重新组织课后习题,依照“巩固基础、综合应用、拓展创新”三个层次,呈阶梯式递进形式。
(6) 结合作者实践经验,在附录中增加了VC 2010环境C程序的调试运行方法,强化编程训练。
经修订后,本书内容共分为以下11章:
第1章 C程序设计入门介绍C语言的特点、程序结构、C语言的基本数据类型、基本运算符和表达式、宏常量和常变量、基本位运算。
第2章 顺序结构程序设计介绍程序设计的基本方法、C语句的分类、基本的输入输出处理以及顺序结构程序设计的基本方法。
第3章 选择结构程序设计介绍关系运算和逻辑运算、C语言中实现选择结构的语句以及选择结构程序设计的基本方法。
第4章 循环结构程序设计介绍C语言中实现循环结构的语句和循环结构程序设计的基本方法,还介绍了应用循环的一些常用算法,如级数求和问题、穷举法、递推法以及求素数方法等。
第5章 函数介绍函数的定义、调用以及函数参数的传递方式,函数的嵌套调用和递归调用方法,全局变量和局部变量,变量的存储类别等。
第6章 数组介绍一维数组、二维数组以及字符数组的定义、引用和初始化方法,数组名作为函数参数的调用方式,以及应用数组的一些算法,如排序、查找、求最大最小值、矩阵运算等。
第7章 指针介绍指针的概念,指针变量的定义和引用,以及指向变量的指针、指向数组的指针、指向字符串的指针、指向函数的指针和多级指针等概念和应用。
第8章 结构体与共用体介绍结构体类型、共用体类型和枚举类型的定义,以及相关变量的定义、引用、初始化和应用方法。
第9章 动态数组与链表介绍C语言中实现动态存储分配的标准函数,以及动态数组和链表的概念和应用。
第10章 文件 介绍C语言中文件的基本概念,文件的打开和关闭方法以及文件的读写和定位方法。
第11章 综合应用案例介绍综合应用各章知识,按照软件工程的方法开发一个股票交易系统程序设计和实现的全过程。
本书由向艳、周天彤担任主编并由向艳统稿,第1、2、10章由潘亚平和程起才共同编著,第3、4、5、6、8、9、11章由向艳编著,第7章由周天彤编著,附录由周天彤和程起才共同编著。希望通过此次修订,使本书内容更丰富,条理更清晰,实用性更强,更有利于读者学习。由于作者水平有限,书中不足在所难免,再次恳请读者批评指正。
学习C语言程序设计是一个循序渐进的过程。建议读者在学习中依照“一读、二仿、三写”三个步骤,即先多读一些好的程序;然后模仿实例编写相似的程序,并能举一反三;最后独立编写程序,提高编程能力。
编者2018年3月〖1〗〖3〗C语言程序设计(第3版)前言〖3〗〖3〗
在C语言中,函数是组成程序的基本单位。利用函数可实现程序的模块化,使程序设计简单、直观,提高程序的易读性、可维护性和编写效率。有以下两类函数:
(1) 标准库函数
这类函数由C语言编译系统提供,用户可直接使用,例如常用的printf函数、scanf函数、sqrt函数等。在使用这些库函数时,需要用文件包含命令#include将包含该函数定义的头文件添加到当前的C程序中。
(2) 用户自定义函数
这类函数由用户自己编写,以解决用户的一些特定问题。用户在编写程序时,如果一个程序段在程序不同处多次出现,就可以把这段程序取出来,单独建一个函数,以后凡是程序中需要执行这段程序时,只需要调用这个函数就可以了。多次调用同一个函数,可以减少编写程序的工作量,减少程序的代码长度,且程序的结构也显得简洁、清楚。
5.1函数的定义与调用
函数的构建即为函数的定义,C语言中所有函数的定义是平行的,且相互独立,故在定义一个函数时,不能包含其他函数的定义,各个函数之间没有从属的关系。使用函数即为函数的调用,函数只有调用时才能被执行。
在函数的调用关系中,一般把调用其他函数的函数称为主调函数,被其他函数所调用的函数称为被调函数。main函数只能被系统调用,因而相对于其他函数而言,main函数只能是主调函数,除此之外其他任何函数既可以作为主调函数,也可作为被调函数。
一个C程序一般由一个main函数和若干其他函数构成,但有且仅有一个main函数。C程序的执行是从main函数开始,在调用完其他函数后,再回到main函数结束。
5.1.1函数的定义
C语言规定,在程序中用到的所有函数,除了C编译系统提供的标准库函数外,其他用户自定义函数必须要“先定义,后使用”。函数的定义主要包括: 指定函数的名字,以便以后按名调用;指定函数的类型;指定函数参数的名字和类型,以便调用函数时向它们传递数据;指定函数应当执行的操作,也就是函数的功能,这是最重要的。
函数定义的一般形式如下: 函数类型函数名(类型 形参1,类型 形参2,…)
{
声明部分
语句
}其中第一行为函数首部,包括函数类型、函数名和函数参数;后面用一对大括号括起来的部分是函数体,包含了函数要执行的相关语句。
例如,定义一个求两个整数和的函数。/函数名为sum,函数类型为int,形参为x和y,形参类型为int/
int sum(int x,int y)
{/函数体,完成求两个数和的功能/
intz;
z=x y;
return(z);
}〖1〗〖3〗C语言程序设计(第3版)第5章函数〖3〗〖3〗说明:
(1) 函数名可以是符合C语言规定的标识符,命名规则与变量一样,通常使用有意义的符号表示。在同一程序中,函数名应该是唯一的,不能重名。
(2) 函数类型是指函数返回值的数据类型,函数返回值通过函数体中的return语句带回。当函数不要求带回值时,应该用void标识函数类型。关键字void是一种数据类型,用它标识的对象是无值的,又称“空类型”。
(3) 根据实际需要,函数可以没有形参,由此函数又可分为有参函数和无参函数。带有形参的函数称为有参函数,不带形参的函数称为无参函数。无参函数的定义中,形参表为空,但函数名后的一对“( )”不能省略。
无参函数定义一般形式为: 函数类型函数名( )
{
声明部分
语句
}例如,定义无参函数。/函数名为printstar,形参表为空/
void printstar()
{
printf(“\n”);
}(4) 对于有参函数,在函数定义时,必须分别说明所有形参的数据类型,形参可以是变量、数组等,形参与形参之间用“,”分隔。
例如: int sum(int x,int y)
{
intz;
z=x y;
return(z);
}(5) 函数体用一对大括号{}括起,由声明部分和语句部分组成。声明部分包括对函数内使用的一些变量和一些被调函数的原型进行声明的语句,语句部分包含实现该函数功能的可执行语句序列。
(6) C语言函数体内可以不包含任何语句,此类函数称为空函数。
空函数定义的一般形式为;函数类型函数名( )
{}例如: void dummy( )
{}由于在空函数的函数体中没有任何语句,函数被调用时,实际上什么操作也不做,那么定义空函数有什么意义呢?按照模块化设计思想,编写一个程序时,往往要分成几个模块,分别用一些函数来实现。在编程的初期,一般先编写最基本的模块,其他模块会在以后一一补上,这样可以将这些模块先取一个函数名,然后设计为一个空函数,目的是在程序中占据一席之地,等以后扩充程序功能时再具体编写这个函数。这对于较大程序的编写、调试以及功能扩充是十分方便的。
5.1.2函数的返回值
若函数要返回一个函数值,函数体内就应该至少包含一个返回语句。返回语句在函数中的功能是返回主调函数,同时将计算结果(函数返回值)带回主调函数。其一般格式为: return (表达式);或return表达式;return语句的执行过程是: 先计算return 语句中表达式的值,然后返回主调函数并将计算结果带回。
例如,求两个数的最大值函数。float max(float x,float y) /max函数的定义,求两个数的最大值/
{ float z;
if(x>y) z=x;
else z=y;
return z;
}以上函数需要把求得的最大值返回给主调函数,故语句returnz; 的作用是返回主调函数并将计算结果z值带回。
说明:
(1) 一个函数中可以有一个以上的return语句,当执行到某个return语句时,该语句就起作用。
例如,有多个return语句的函数。float min(float x,float y)
{
if(xelsereturn y;
}以上函数执行时,若条件x(2) return语句中表达式的类型一般应和函数定义时的函数类型相一致。如果函数类型和return语句中表达式值的类型不一致,则系统自动将表达式值的类型转换为与函数类型一致的类型。
例如,函数类型和return语句中表达式值类型不一致的函数。int max(float x,float y)
{ float z;
if(x>y) z=x;
else z=y;
returnz;
} 以上函数类型定义为整型,而return语句中的z为实型,二者不一致,故执行return语句时,系统要先将变量z的值转换为整型,然后函数带回一整型值返回给主调函数。
(3) 函数类型为void类型时,表示函数不带回任何值,此时在函数中不需要有return语句。当这类函数被执行时,遇到函数体最后的}结束,并返回主调函数。
5.1.3函数的调用
在定义了一个函数后,它不会自动执行,必须被调用后才能被执行。但要注意函数在被调用之前必须先定义,然后才能被其他函数调用。
1. 函数调用的一般形式
函数调用的一般形式为: 函数名(实参表)其中实参可以是常量、变量或表达式,之间用逗号分开。在实参表中,实参的个数、顺序和类型必须与函数定义时形参的个数、顺序和类型相一致。
函数调用的执行过程:
(1) 对于有参函数。先计算实参表中各个实参表达式的值,一一对应地赋给相应的形参;对于无参函数,则不需要此操作。
(2) 转去执行被调函数,即进入被调函数,执行被调函数相关语句。当执行到return语句时,计算并带回return语句中表达式的值(函数类型为void的函数不需要带回),返回到主调函数的调用处。
(3) 继续执行主调函数中后续的语句。
【例51】求两个数的最大值。
编程点拨: 前面已定义了一个求两个数最大值的max函数,为了调用并执行该函数,需要再定义一个main函数,main函数的功能是输入任意两个数,调用max函数求出最大值,然后输出结果。程序如下: #include
float max(float x,float y) /函数max的定义,求两个数的最大值/
{ float z;
if(x>y) z=x;
else z=y;
return(z); /返回计算结果/
}
intmain()
{ float a,b,c;
scanf(“%f%f”,&a,&b);
c=max(a,b); /调用函数max并将函数返回值赋给c/
printf(“max=%f\n”,c); /输出计算结果/
return 0;
}运行结果:
以上程序的执行过程是: 首先执行main函数中的scanf语句,输入两个数2.3和1.8分别给变量a和b,然后调用max函数,即max(a,b),此时会将实参a、b的值赋给对应的形参x、y,执行max函数,求出最大值(变量z的值)。当执行到语句return z; 时,返回到main函数中c=max(a,b);语句处,同时把最大值也带回此处并赋值给变量c,继续执行main函数中后续语句直至结束。程序中函数的调用控制流程如图51所示。
图51例51函数调用过程
【例52】计算并输出一个圆台两底面积之和。
编程点拨: 可定义三个函数,其中area函数计算圆台两底面积之和,printstar函数输出一行星号,main函数输入圆台两底的半径,然后分别调用前面两个函数计算并输出结果。程序如下: #include
float area(float x,float y)/area函数的定义,求一个圆台两底面积之和/
{
floats;
s=3.1415(xx yy);
return s;
}
void printstar() /printstar函数的定义,输出一行星号/
{ int i;
for(i=0;i<40;i )
printf(“”);
printf(“\n”);
}
int main()
{
floatr1,r2,s; /r1和r2代表圆台两底的半径/
printstar(); /调用printstar函数/
scanf(“%f,%f”,&r1,&r2);
s=area(r1,r2); /调用area函数/
printf(“s=%.2f\n”,s);
printstar(); /调用printstar函数/
return 0;
}运行结果:
2. 函数调用的方式
函数被调用时,依据它在主调函数中出现的形式和位置,可以有以下几种调用方式:
(1) 函数调用语句方式
这种调用形式是直接在函数调用后面加分号,作为一个语句来调用。例如,在例52代码中的语句: printstar();这种调用方式一般是针对函数类型为void型,函数不需要返回值,仅完成一些操作。例如,例52代码中的printstar函数功能是输出一行星号。
(2) 函数表达式方式
这种调用形式是把函数调用放在一个表达式中,调用结束后函数会带回一个值。例如,例52代码中的语句: s=area(r1,r2);这种调用方式通常可出现在赋值语句中,或者出现在算术表达式中作为一个运算分量参与运算。
(3) 函数参数方式
这种调用方式是把函数调用作为一个函数的实参,调用结束后的返回值就作为实参的值。
【例53】求三个数中的最大值。
编程点拨: 本题可在例51的基础上,在main函数中增加一条语句: m=max(max(a,b),c);程序如下: #include
float max(float x,float y) /max函数的定义,求两个数的最大值/
{ float z;
if(x>y) z=x;
else z=y;
return(z);
}
intmain()
{ float a,b,c,m;
scanf(“%f%f%f”,&a,&b,&c);
m=max(max(a,b),c); /两次调用max函数求出最大值/
printf(“max=%f\n”,m);
return 0;
}运行结果:
以上程序第一次调用max(a,b)求出a、b两个数中的最大值,然后将结果作为max函数第二次调用的第一个实参,从而求出a、b、c三个数中的最大值。
3. 函数的原型声明
在例52中,三个函数的调用关系是: main函数分别调用area函数和printstar函数,三个函数在程序中定义的顺序为(参看例52): 定义area函数
定义printstar函数
定义main函数因为area函数和printstar函数之间没有调用关系,所以area函数和printstar函数在程序中定义的顺序可任意,但如果将main函数的定义位置放在printstar函数或area函数定义之前,例如调整函数定义顺序后的程序如下: #include
int main()
{
floatr1,r2,s;
printstar(); /调用printstar函数/
scanf(“%f,%f”,&r1,&r2);
s=area(r1,r2); /调用area函数/
printf(“s=%.2f\n”,s);
printstar(); /调用printstar函数/
return 0;
}
float area(float x,float y)/area函数的定义/
{
floats;
s=3.1415(xx yy);
return s;
}
void printstar() /printstar函数的定义/
{ int i;
for(i=0;i<40;i )
printf(“”);
printf(“\n”);
}运行以上程序时会发现系统提示错误。那么,造成这种现象的原因是什么呢?
原来C程序在进行编译时是从上到下逐行进行的。例如,当系统编译到main函数中的语句s=area( r1, r2);时,由于area函数定义在main函数之后,系统无法确定area是不是函数名,也无法判定实参的个数和类型是否正确,因而无法进行正确性检查,从而会出现错误。对printstar函数的调用亦会如此。
解决此类问题的方法就是在函数被调用之前,需要对被调函数作出“声明”。对函数声明是为了便于编译系统对函数调用的合法性进行检查,即调用函数时,检查函数名、函数类型、形参的类型、个数和顺序是否与被调函数定义的一致。
通常,把函数首部称为函数原型。由于函数原型包含了对函数调用的合法性进行检查的主要内容,故在写函数声明语句时,可以简单地在函数原型后面加一个分号。例如,对例52中area函数的原型声明语句: float area(float x,float y);由于对函数调用的合法性进行检查时,并不关心形参名,故函数声明时可以不用给出形参名。例如,对例52中area函数的原型声明语句也可如下: float area(float ,float);根据以上介绍,函数原型声明可用以下两种形式之一:
形式1: 函数类型函数名(参数1类型,参数2类型,…);
形式2: 函数类型函数名(参数1类型参数名1,参数2类型参数名2,…);
采用第一种形式比较精炼,而采用第二种形式只需要照抄函数首部就可以了,不易出错。
函数原型声明语句一般可放在程序的开头部分(在所有函数定义之前),也可放在主调函数定义的说明部分。
【例54】不改变程序功能,仅调整例52中三个函数定义的顺序。
方法一函数原型声明在主函数说明部分: #include
int main()
{
floatr1,r2,s;
float area(float,float);/area函数原型声明/
void printstar(); /printstar函数原型声明/
printstar();
scanf(“%f,%f”,&r1,&r2);
s=area(r1,r2);
printf(“s=%.2f\n”,s);
printstar();
return 0;
}
float area(float x,float y)
{
floats;
s=3.1415(xx yy);
return s;
}
void printstar()
{ int i;
for(i=0;i<40;i )
printf(“”);
printf(“\n”);
}方法二函数原型声明在程序开始部分: #include
float area(float,float);/area函数原型声明/
void printstar(); /printstar函数原型声明/
int main()
{
floatr1,r2,s;
printstar();
scanf(“%f,%f”,&r1,&r2);
s=area(r1,r2);
printf(“s=%.2f\n”,s);
printstar();
}
float area(float x,float y)
{
floats;
s=3.1415(xx yy);
return s;
}
void printstar()
{ int i;
for(i=0;i<40;i )
printf(“”);
printf(“\n”);
}方法一中,由于函数原型声明放在主函数内部,因此声明仅在主函数内部有效;方法
![插图](https://static.easterneast.com/file/easternspree/img/604801e4f0f22467a5776435_468628.jpg)
![插图](https://static.easterneast.com/file/easternspree/img/604801e9f0f22467a5776436_468629.jpg)
![插图](https://static.easterneast.com/file/easternspree/img/604801eef0f22467a5776437_468630.jpg)
![插图](https://static.easterneast.com/file/easternspree/img/604801f3f0f22467a5776438_468631.jpg)
![插图](https://static.easterneast.com/file/easternspree/img/604801f7f0f22467a5776439_468632.jpg)
![插图](https://static.easterneast.com/file/easternspree/img/604801fbf0f22467a577643a_468633.jpg)
评论
还没有评论。