内容简介
C语言是国内外使用最广泛的程序设计语言之一,更是高等院校工科学生应该具备的基础知识。学会使用C语言进行程序设计,也是计算机工作者必备的一项基本功。
本书系统而全面地介绍了C语言的知识,适合零基础的读者自学。在内容方面,由于位运算多用于检测和控制领域,常规编程较少触及,各类考试也很少涉及,故本书未将此部分内容纳入。
与一般的C语言教材相比,本书增加了“预备知识”和“VC环境下C语言的运行与调试”两部分内容。前者主要解决晦涩难懂的补码问题,有助于读者理解C语言整型数据的存储;后者则有助于读者上机考试。书中每道例题的输出结果,均以屏幕截图的方式提供,原滋原味地呈现给读者,便于分析程序。
本书可作为普通高等院校及大专院校各专业的C语言教材,亦可供读者自学C语言使用,尤其适合作为各类C语言考试的培训教材。
前 言
计算机程序设计语言现今已有数百种,常用的也有数十种,但很少有哪一种语言像C语言那样充满活力,流行近半个世纪经久不衰;也很少有哪一种语言像C语言那样在中国如此普及。国家计算机等级考试中,各级考试均离不开C语言的身影;国内高等院校几乎都把计算机文化基础和C语言作为理工科学生步入计算机领域的"敲门砖",C语言程序设计已成为理工科学生必备的技能之一。
C语言是20世纪70年代初期推出的编译型程序设计语言。经过近半个世纪的发展,C语言表现出了强大的生命力,已经从早期在少数小型机机种上使用的算法语言,发展成了当今在各类平台上普遍使用的通用程序设计语言。因为C语言具有强大的处理功能,特别是在某些方面可以替代汇编语言,所以熟练掌握C语言是现代计算机工作者应具备的基本条件,也是学习更高层次面向对象的C++语言的必备基础。
在近半个世纪的发展过程中,C语言的体系日臻完善,功能不断增强。与此相应,各种新型的C编译系统相继问世,C语言已从早期的"传统模式"发展为当前的"现代模式"。
鉴于目前流行的C语言编译系统大多数是以ANSI C89为基础开发的,所以本书以C89为基础并结合当前最常用的VC集成开发环境进行介绍,同时兼顾过去20年非常流行的Turbo C集成环境。总而言之,本书的宗旨在于向读者呈现一本内容新颖、系统全面、按现代编程风格介绍C语言程序设计的书籍。
本书共分为11章,各章的主要内容说明如下。
第1章介绍C语言的基础。考虑到计算机零基础读者的需要,本章适量增加了一些C语言预备知识。
第2章以VC为背景,介绍运行C语言程序的步骤与方法,并通过典型案例,介绍C语言程序的调试方法。
第3章介绍C语言的基本数据类型、常量、变量以及C语言的各种运算符与表达式。
第4章从结构化程序设计的角度,介绍C程序的流程设计,同时融入算法的概念。
第5章介绍最简单的构造类型--数组。
第6章介绍各种类型的函数,以及函数间数据传递的方法。
第7章介绍编译预处理。
第8章讨论C语言最重要的概念--指针及其特性。
第9章介绍C语言的另一种构造类型--结构体与共用体,同时,还介绍枚举类型和用typedef定义既有类型的方法。
第10章从实用出发,介绍用C语言处理文件的方法。
第11章为项目实践,用一个大案例贯穿本书的主要知识点。书后的附录列出了ASCII码表、C语言关键字、常用库函数以及运算符的优先级与结合性。
此处提请读者注意:全书中紧随程序代码后的是程序的运行结果截图。在各截图标题栏中显示的文件名及路径仅是作者调试程序时使用的临时文件名和路径。
本书作者在多年从事C语言教学和软件开发的基础上,参考了国内外有关的C语言著作,参考了因特网上诸多的优秀程序,并参照了近几年来一直延用的《2013年计算机二级C语言程序设计考试大纲》,完成了编著工作。因此,本书既可作为普通高等院校及大专院校的教材使用,又可供参加各类计算机考试的人员学习和参考。
本书由天津工业大学的杨连贺教授、天津市信息安全测评中心的赵玉玲、天津广播电视大学的丁刚副教授主编,池明文、李俊荣为副主编。在本书的编写过程中,还得到了天津大学软件学院的刘石英副研究员、高翔副研究员、曹军老师、沈士强老师的热情帮助和指导。天津农学院计算机与信息工程学院的靳润昭教授、烟台大学计算机与控制工程学院的贺利坚副教授、西北工业大学计算机学院的张彦春副教授提供了不少案例,天津工业大学计算机科学与软件学院的硕士研究生董禹龙和房超在程序调试方面也做了不少工作,在此一并向他们表示衷心的感谢。
限于作者的经验和水平,书中的错误与不足之处在所难免,希望得到专家和读者的批评指正。
作 者
2017年2月于天津工业大学
目 录
第1章 C语言基础 11.1 计算机语言的概念 21.2 C语言的发展和特点 31.2.1 概述 31.2.2 C语言的发展历史 41.2.3 C语言的特点 51.3 计算机中数的表示及进制转换 61.3.1 数制的概念 61.3.2 数码、基数与位权 61.3.3 各种进制之间的转换 71.4 字节和位的概念 91.5 整数的表示方法--原码、反码和补码 101.5.1 整数的原码表示 101.5.2 整数的反码表示 101.5.3 整数的补码表示 101.6 书写程序时应遵循的规则 111.7 C语言程序的结构 111.7.1 源程序结构 111.7.2 C语言的字符集 131.7.3 C语言的词汇 141.8 简单的C程序举例 151.9 运行C语言程序的步骤和方法 17第2章 VC环境下C程序的运行和调试 192.1 在VC下运行一个C程序 202.1.1 启动VC 202.1.2 编辑程序 202.1.3 编译程序 212.1.4 运行程序 222.2 在VC下调试C程序的方法 232.2.1 VC调试功能简介 232.2.2 使用VC调试C程序的方法 26第3章 数据描述 313.1 C语言的数据类型 323.2 常量和变量 333.2.1 常量和符号常量 333.2.2 变量 343.3 整型数据 343.3.1 整型常量的表示方法 343.3.2 整型变量 363.4 实型数据 403.4.1 实型常量的表示方法 403.4.2 实型变量 413.4.3 实型常数的类型 423.5 字符型数据 423.5.1 字符常量 423.5.2 转义字符 433.5.3 字符变量 443.5.4 字符数据在内存中的存储形式及使用方法 443.5.5 字符串常量 453.6 为变量赋初值 463.7 算术运算符和算术表达式 463.7.1 C语言的运算符简介 473.7.2 算术运算符和算术表达式 473.8 赋值运算符和赋值表达式 503.9 逗号运算符和逗号表达式 523.10 各类数值型数据之间的混合运算 533.11 本章小结 56习题 57第4章 C程序的流程设计 594.1 C语句概述 604.2 赋值语句 624.3 数据输入输出的概念及在C语言中的实现 634.4 字符数据的输入输出 634.4.1 putchar函数(字符输出函数) 634.4.2 getchar函数(键盘输入函数) 644.5 格式输入与输出 654.5.1 printf函数(格式输出函数) 654.5.2 scanf函数(格式输入函数) 684.6 结构化程序设计的方法 744.7 顺序结构程序设计 764.7.1 顺序结构的程序 764.7.2 顺序结构程序的案例实训 764.8 选择结构程序设计 774.8.1 关系运算符和关系表达式 774.8.2 逻辑运算符和逻辑表达式 794.8.3 if语句 814.8.4 switch语句 894.8.5 分支结构程序的案例实训 914.9 循环结构程序的设计 944.9.1 概述 944.9.2 goto语句以及用goto语句构成的循环 954.9.3 while语句 954.9.4 do-while语句 984.9.5 for语句 1004.9.6 循环的嵌套 1034.9.7 几种循环的比较 1034.9.8 break语句和continue语句 1044.9.9 循环结构程序的案例实训 1064.10 本章小结 110习题 113第5章 数组 1175.1 一维数组的定义和引用 1185.1.1 一维数组的定义方式 1185.1.2 一维数组元素的引用 1195.1.3 一维数组的初始化 1215.1.4 一维数组应用举例 1225.2 二维数组的定义和引用 1235.2.1 二维数组的定义 1235.2.2 二维数组元素的引用 1245.2.3 二维数组的初始化 1265.2.4 二维数组程序举例 1275.3 字符数组 1285.3.1 字符数组的定义 1285.3.2 字符数组的初始化 1285.3.3 字符数组的引用 1295.3.4 字符串及其结束标志 1295.3.5 字符数组的输入输出 1305.3.6 字符串处理函数 1325.4 案例实训 1355.5 本章小结 138习题 139第6章 函数 1436.1 概述 1446.2 函数定义的一般形式 1456.3 函数的参数和函数的值 1476.3.1 形参和实参 1476.3.2 函数的返回值 1496.4 函数的调用与被调用函数的声明 1506.4.1 函数调用的一般形式 1506.4.2 函数调用的方式 1506.4.3 被调用函数的声明和函数原型 1526.5 函数的嵌套调用 1536.6 函数的递归调用 1556.7 数组作为函数参数 1576.8 局部变量和全局变量 1636.8.1 局部变量 1636.8.2 全局变量 1656.9 变量的存储类别 1676.9.1 动态存储方式与静态存储方式 1676.9.2 auto变量 1686.9.3 用static声明局部变量 1686.9.4 register变量 1706.9.5 用extern声明外部变量 1706.10 内部函数和外部函数 1726.10.1 内部函数 1726.10.2 外部函数 1726.10.3 建立包含多个文件的程序 1746.11 案例实训 1776.12 本章小结 181习题 183第7章 编译预处理 1897.1 概述 1907.2 宏定义 1907.2.1 无参宏的定义 1907.2.2 带参宏定义 1937.3 文件包含 1997.4 条件编译 2007.5 案例实训 2027.6 本章小结 203习题 204第8章 指针 2078.1 指针的基本概念 2088.2 变量的指针和指向变量的指针变量 2098.2.1 定义一个指针变量 2098.2.2 指针变量的引用 2108.2.3 指针变量作为函数参数 2148.2.4 关于指针变量几个问题的进一步说明 2188.3 数组的指针和指向数组的指针变量 2218.3.1 指向数组元素的指针 2228.3.2 通过指针引用数组元素 2238.3.3 数组名与指针变量作为函数的参数 2278.3.4 指向多维数组的指针和指针变量 2358.4 字符串的指针和指向字符串的指针变量 2398.4.1 字符串的表示形式 2398.4.2 字符串指针变量与字符数组的区别 2448.5 函数指针变量 2448.6 指针型函数 2468.7 指针数组和指向指针的指针 2478.7.1 指针数组的概念 2478.7.2 指向指针的指针 2518.7.3 main函数的参数 2538.8 有关指针的数据类型和指针运算小结 2548.8.1 有关指针的数据类型小结 2548.8.2 指针运算小结 2558.8.3 void指针类型 2568.9 案例实训 2568.10 本章小结 258习题 259第9章 结构体与共用体 2639.1 结构体类型的定义 2649.2 结构体变量的说明 2659.3 结构体变量成员的引用方法 2679.4 结构体变量的赋值 2689.5 结构体变量的初始化 2689.6 结构体数组的定义 2699.7 结构体指针变量的说明和使用 2719.7.1 指向结构体变量的指针 2719.7.2 指向结构体数组的指针 2739.7.3 结构体指针变量作为函数参数 2749.8 动态存储分配 2769.9 用指针处理链表 2789.9.1 链表概述 2789.9.2 链表的建立和输出 2799.10 共用体 2889.10.1 共用体的定义 2889.10.2 共用体的引用 2899.11 枚举类型 2909.11.1 枚举类型的定义和枚举变量的说明 2909.11.2 枚举类型变量的赋值和使用 2909.12 用typedef定义已有类型 2929.13 案例实训 2939.14 本章小结 295习题 298第10章 文件的输入输出 30310.1 文件概述 30410.2 文件指针 30510.3 文件的打开与关闭 30510.3.1 文件的打开(fopen函数) 30510.3.2 文件的关闭(fclose函数) 30710.4 文件的顺序读写 30710.4.1 字符读写函数fgetc和fputc 30710.4.2 字符串读写函数fgets和fputs 31110.4.3 数据块读写函数fread和fwrite 31310.4.4 格式化读写函数fscanf和fprintf 31410.4.5 文件结束检测函数feof 31610.5 文件的随机读写 31610.5.1 文件定位函数 31710.5.2 文件随机读写 31710.6 文件读写的出错检测 31810.7 案例实训 31910.8 本章小结 321习题 321第11章 项目实践 32511.1 题目要求 32611.2 系统分析 32611.3 系统设计 32611.3.1 总体设计 32611.3.2 详细设计 32711.4 系统实施 33411.5 关于项目实践的几点说明 345附录A ASCII代码表 347附录B C语言中的关键字 349附录C C语言的常用库函数 351附录D 运算符的优先级与结合性 359参考文献 361