C语言是所有本科生课程的一门核心课,也是现今使用最广泛的计算机语言。国内国外的C语言图书已经非常多了,但通过本书的翻译,我们觉得这本书还是很有引进价值,具体表现在它的以下几个特点上:* 本书是基于最新的C语言标准。* 在本书的最后给出了一个完整的应用程序开发示例PHONE BOOK。* 扩展讨论了C的指针。* 每章后面的"谨记"一节给出了很有用的编程提示以及可能容易出错的问题。* 每章后面的案例学习给出了24个真实的开发,展示了C程序的设计过程。* 87个程序设计范例向读者阐述了良好程序设计的基本原则。* 还有185个练习题和133道实践编程题。总之,本书的语言简洁易懂,示例非常丰富且具有很强的实际指导意义,是一本很好的C程序设计的教材。第3版前言作为使用最广泛的计算机语言,C是所有本科生课程的一门核心课。本书的第2版被很多学院和大学用作教材。在过去的几年中,本书还被一些重要的软件培训与开发公司用作培训教材。由于本书的独特性、与众不同的学习方法以及简明的写作风格,本书在学生和老师中很受欢迎。本书融入了过去10年中采用本书的学生和老师的很多反馈意见。本版的特点包括:* 根据读者的反馈,全书的内容和程序都做了重新评阅和修改。* 每章末尾的练习分成了两部分,即"复习题"和"编程练习"。* 每章都添加了针对本章内容的大量问答题和问题求解。* 在很多章中添加了"谨记"一节。该节列举出了一些有用的提示和容易出现的问题。* 新加的附录Ⅲ"电话簿程序",有助于读者全面体验C语言的特性。感谢给本书提供建议的老师和学生,这些建议极大地提高了本书的质量。E Balagurusamy第1版前言C是一种通用的结构化程序设计语言,它功能强大、高效且简洁。C集成了高级语言的特性和汇编语言的某些元素,因此,对程序员和计算机都很贴切。用C语言进行程序设计很流行,也很有趣。本书旨在教授读者如何使用C语言进行程序设计,不需要读者具有该语句的预备知识,适合于初学者和有经验的程序员。全书贯彻了"用示例学习"的概念。在深入介绍了C语言的每个特性之后,给出了一个完整的示例程序,用于演示说明其应用。每章末尾的"案例学习"不仅介绍了把C语言的特性集成在一起的常用方法,而且还显示了它在实际生活中的应用。只要有必要,就用图形来描述,以便于读者更好地理解。最后一章介绍了开发高效、无错误的C程序的一些指导原则。本书包含了100多个示例和程序。所有程序都使用与UNIX和MS-DOS操作系统兼容的编译器进行了测试,并适当地讨论了输出结果。这些程序还演示了良好编程风格的一般原则。译者序C语言是所有本科生课程的一门核心课,也是现今使用最广泛的计算机语言。国内国外的C语言图书已经非常多了,但通过本书的翻译,我们觉得这本书还是很有引进价值,具体表现在它的以下几个特点上:* 本书是基于最新的C语言标准。* 在本书的最后给出了一个完整的应用程序开发示例PHONE BOOK。* 扩展讨论了C的指针。* 每章后面的"谨记"一节给出了很有用的编程提示以及可能容易出错的问题。* 每章后面的案例学习给出了24个真实的开发,展示了C程序的设计过程。* 87个程序设计范例向读者阐述了良好程序设计的基本原则。* 还有185个练习题和133道实践编程题。总之,本书的语言简洁易懂,示例非常丰富且具有很强的实际指导意义,是一本很好的C程序设计的教材。本书的第2版被印度的很多学院和大学用作教材。在过去的几年中,本书还被一些重要的软件培训与开发公司用作培训教材。由于本书的独特性、与众不同的学习方法以及简明的写作风格,相信本书也会受到国内学生和老师的欢迎。本书由金名、张长富、冯华君、刘守燕、杨咏梅等译,张国清、潘华等人也参与了部分翻译和校对工作。欢迎广大读者指正。II面向对象设计UML实践(第2版)III译者序 目录第1章C语言概述 11.1C语言的历史 11.2C语言的主要特性 21.3示例程序1:显示一条消息 31.4示例程序2:两个数相加 61.5示例程序3:利息计算 71.6示例程序4:子例程的使用 91.7示例程序5:数学函数的使用 101.8C程序的基本结构 121.9编程风格 131.10运行一个程序 131.11UNIX系统环境下 141.11.1创建程序 141.11.2编译与链接 151.11.3运行程序 151.11.4创建自己的可运行文件 161.11.5多个源文件问题 161.12MS-DOS系统环境下 171.13复习题 181.14编程练习 19第2章常量、变量及数据类型 212.1概述 212.2字符集 212.3C标记符 222.4关键字与标识符 222.5常量 232.5.1整型常量 242.5.2实数常量 252.5.3单字符常量 252.5.4字符串常量 262.5.5反斜杠字符常量 262.6变量 262.7数据类型 272.7.1整数型 282.7.2浮点数类型 292.7.3void类型 302.7.4字符类型 302.8变量的声明 302.8.1基本类型的声明 302.8.2自定义类型的声明 322.9存储类的声明 332.10变量的赋值 342.10.1赋值语句 352.10.2从键盘读取数据 372.11符号常量的定义 402.11.1可修改性 402.11.2可理解性 402.12将变量声明为常量 412.13将变量声明为可变的 412.14数据的溢出 422.15案例学习 432.15.1平均数计算 432.15.2温度转换问题 442.16复习题 452.17编程练习 47第3章运算符与表达式 483.1概述 483.2算术运算符 483.2.1整数算术运算 493.2.2实数算术运算 503.2.3混合算术运算 503.3关系运算符 503.4逻辑运算符 523.5赋值运算符 523.6递增和递减运算符 543.7条件运算符 553.8逐位运算符 563.9特殊运算符 563.9.1逗号运算符 563.9.2sizeof运算符 573.10算术表达式 583.11表达式的计算 583.12算术表达式的优先级 593.13一些可计算性问题 613.14表达式中的类型转换 623.14.1隐式类型转换 623.14.2显示转换 643.15运算符的优先级及其关联 663.16数学函数 673.17案例学习 683.17.1销售人员的工资 683.17.2二次方程的求解 693.18复习题 713.19编程练习 73第4章输入输出操作管理 754.1概述 754.2读取一个字符 754.3写字符 784.4格式化输入 794.4.1整数输入 804.4.2实数输入 824.4.3字符串输入 834.4.4混合数据类型的读取 854.4.5错误输入的检测 854.4.6使用scanf函数时应记住的几个要点 874.5格式化输出 884.5.1整数的输出 894.5.2实数的输出 904.5.3单个字符的显示 924.5.4字符串的显示 924.5.5混合数据的输出 934.5.6提高输出的可读性 944.6案例学习 954.6.1库存报告 954.6.2可靠性图形 974.7复习题 994.8编程练习 101第5章判断与分支 1025.1概述 1025.2if判断语句 1025.3简单if语句 1035.4if...else语句 1065.5嵌套if...else语句 1095.6阶梯式else if语句 1125.7switch语句 1165.8? : 运算符 1195.9goto语句 1225.10案例学习 1255.10.1数值的分布范围 1255.10.2账单计算 1275.11复习题 1305.12编程练习 132第6章判断与循环 1356.1概述 1356.2while语句 1376.3do语句 1396.4for语句 1416.4.1简单的for循环语句 1416.4.2for循环的其他特性 1446.4.3for循环的嵌套 1466.5循环中的跳转 1486.5.1跳出循环 1486.5.2跳过循环的一部分 1526.5.3避免使用goto语句 1556.5.4简洁的测试表达式 1556.6案例学习 1566.6.1二项式系数表 1566.6.2柱状图 1586.6.3最小成本 1606.6.4描绘两函数的曲线图 1616.7复习题 1636.8编程练习 166第7章数组 1697.1概述 1697.2一维数组 1707.3一维数组的声明 1717.4一维数组的初始化 1737.4.1编译时初始化 1747.4.2运行时初始化 1757.5二维数组 1777.6二维数组的初始化 1817.7多维数组 1857.8动态数组 1867.9数组的其他 1867.10案例学习 1887.10.1数列的中值问题 1887.10.2标准偏差的计算 1907.10.3测试评分 1927.10.4产品与销售分析 1947.11复习题 2017.12编程练习 203第8章字符数组与字符串 2068.1概述 2068.2字符串变量的声明与初始化 2068.3使用scanf函数从终端读取字符串 2088.3.1读取文本行 2108.3.2使用getchar和gets函数 2108.4在屏幕上显示字符串 2138.4.1使用printf函数 2138.4.2使用putchar和puts函数 2168.5字符的算术运算 2178.6将字符串组合在一起 2198.7两个字符串的比较 2208.8字符串处理函数 2218.8.1strcat()函数 2218.8.2strcmp()函数 2228.8.3strcpy()函数 2228.8.4ctrlen()函数 2238.8.5其他字符串函数 2248.9字符串表 2268.10字符串的其他特性 2288.11案例学习 2298.11.1计算文本中的字数 2298.11.2客户列表处理程序 2318.12复习题 2338.13编程练习 235第9章自定义函数 2379.1概述 2379.2为什么需要自定义函数 2379.3多函数程序 2389.4自定义函数的元素 2409.5函数的定义 2419.5.1函数头 2419.5.2函数名与类型 2419.5.3形参列表 2429.5.4函数体 2429.6返回值及其类型 2439.7函数调用 2449.8函数声明 2469.9函数的类型 2489.10无参数无返回值的函数 2489.11有参数无返回值的函数 2509.12有参数有返回值的函数 2539.13无参数但有一个返回值的函数 2579.14返回多个值的函数 2579.15函数的嵌套 2599.16函数的迭代 2609.17将数组传递给函数 2619.17.1一维数组 2619.17.2二维数组 2659.18将字符串传递给函数 2669.19变量的作用域、可见性和生存期 2679.19.1自动变量 2679.19.2外部变量 2699.19.3外部声明 2719.19.4静态变量 2739.19.5寄存器变量 2749.19.6嵌套代码块 2759.20多文件程序 2769.21案例学习 2799.22复习题 2829.23编程练习 286第10章结构与联合 28810.1概述 28810.2结构的定义 28810.3声明结构变量 28910.4访问结构成员 29110.5结构的初始化 29210.6结构变量的复制与比较 29410.7单个成员的运算 29510.8结构数组 29610.9结构中的数组 29810.10结构中的结构 30010.11结构与函数 30210.12联合 30410.13结构的大小 30610.14位域 30610.15案例学习 30910.16复习题 31310.17编程练习 316第11章指针 31911.1概述 31911.2理解指针 31911.3访问变量的地址 32111.4指针变量的声明 32211.5指针变量的初始化 32311.6通过指针访问变量 32511.7指针链 32711.8指针表达式 32811.9指针的递增与比例因子 32911.10指针与数组 33011.11指针与字符串 33311.12指针数组 33511.13指针作为函数的参数 33611.14函数返回指针 33911.15指向函数的指针 34011.16指针与结构 34211.17案例学习 34611.17.1考试成绩处理程序 34611.17.2库存更新程序 34911.18复习题 35111.19编程练习 352第12章文件管理 35412.1概述 35412.2定义并打开文件 35512.3关闭文件 35612.4文件的输入输出操作 35712.4.1getc与putc函数 35712.4.2getw和putw函数 35812.4.3fprintf与fscanf函数 36012.5I/O操作的错误处理 36212.6随机访问文件 36512.7命令行参数 36912.8复习题 37212.9编程练习 373第13章动态内存分配与链表 37413.1概述 37413.2动态内存分配 37413.3用malloc函数分配一块内存 37513.4用calloc函数分配多个内存块 37713.5用free函数释放已用的空间 37813.6用realloc函数改变内存块的大小 37813.7链表的概念 38013.8链表的优点 38213.9链表的种类 38313.10再论指针 38413.11创建链表 38613.12插入一个数据项 38913.13删除一个数据项 39213.14链表的应用 39413.15案例学习 39613.15.1在已排序链表中插入数据 39613.15.2构建一个已排序的链表 39913.16复习题 40213.17编程练习 403第14章预处理器 40514.1概述 40514.2宏替换指令 40514.2.1简单宏替换 40614.2.2含参数的宏 40814.2.3宏嵌套 40914.2.4文件包含 41014.4编译器控制指令 41014.4.1情形1 41114.4.2情形2 41214.4.3情形3 41214.4.4情形4 41314.5ANSI C的其他预处理器指令 41414.5.1#elif指令 41414.5.2#pragma指令 41414.5.3#error指令 41514.5.4字符串化运算符 41514.5.5标记符粘贴运算符 41614.6复习题 41614.7编程练习 417第15章C程序开发指导原则 41815.1概述 41815.2程序设计 41815.2.1问题分析 41815.2.2勾勒程序结构 41815.2.3算法开发 41915.2.4控制结构 41915.3程序编码 42015.3.1自身文档化 42015.3.2语句构造 42115.3.3输入/输出格式 42115.3.4程序的通用性 42115.4常见的程序错误 42215.4.1丢失分号 42215.4.2误用分号 42215.4.3丢失括号 42315.4.4丢失引号 42415.4.5误用引号 42415.4.6使用不正确的注释字符 42415.4.7未定义变量 42515.4.8忽视了运算符的优先级 42515.4.9忽视了递增递减运算符的计算顺序 42615.4.10忽视了函数参数的说明 42615.4.11在函数调用中实参和形参类型不匹配 42615.4.12函数未声明 42715.4.13在scanf的参数中丢失了&运算符 42715.4.14超出了数组的边界 42815.4.15忘记了给字符串的空字符留出空间 42815.4.16使用未初始化的指针 42815.4.17丢失了间接运算符和地址运算符 42815.4.18在指针表达式中丢失括号 42915.4.19在宏定义语句中参数遗漏了括号 42915.5程序测试与调试 43015.5.1错误的类型 43015.5.2程序测试 43115.5.3程序调试 43215.6程序的效率 43215.6.1运行时间 43215.6.2内存需求 43215.7复习题 433附录I位级程序设计 435I.1概述 435I.2逐位逻辑运算符 435I.2.1逐位与操作 435I.2.2逐位或操作 437I.2.3逐位非或操作 437I.3逐位移位运算符 438I.4逐位求反运算符 438I.5屏蔽 439附录II 440附录III 441附录IV电话簿示例程序 444