《程序设计基础(C语言)》是为了适应高职高专教学改革的需要而编写的,全书主要内容包括C程序的结构,算法及算法的描述,c语言基础,流程控制语句,函数,数组,结构体、共用体和枚举类型,文件等,较全面地反映了c语言的全貌。《程序设计基础(C语言)》在内容的组织上打破了同类教材的传统结构,突出了重点,分散了难点。主要表现在:一是将编译预处理和位运算并入c语言基础,降低了教学要求;二是将指针的相关知识以应用为原则,分散到相关章节中,便于学生学习和掌握。同时,《程序设计基础(C语言)》内容完全覆盖了“全国计算机等级考试(二级C)考试大纲”中C语言部分的知识点,并且在习题中选入部分历年考试的原题,为学习者参加全国计算机等级考试提供帮助。
《程序设计基础(C语言)》可以作为高职高专类学校计算机专业的教材,也适合有关人员自学使用。
本书是按照高等学校基础教育改革的要求,由西安航空技术高等专科学校计算机工程系组织编写的。
程序设计技术是信息技术人员的基本功。随着计算机技术的进步和高校教学改革的不断深入,C语言由原来计算机专业高年级学生学习的专业课程,逐渐变成了低年级学生学习程序设计的入门课程、基础课程。教学目的和教学对象的变化,要求必须对这门课程的教学内容和教学方法进行改革。我系近年来在这方面进行了有益的尝试,对改革的成果进行了总结和提炼,编写了这本教材。
本书以《程序设计基础》命名,是为了突出这门课程作为入门性课程的特点。在这门课程中,核心是程序设计的基本思想和方法。但思想和方法又不能凭空存在,必须以某种方式表达出来,C语言是表达这种思想和方法的一种非常优秀的工具。本书以C语言的语法为线索,逐渐地融入程序设计的基础知识,使学生在学习C语言的过程中,潜移默化地接受、理解和掌握程序设计的基本思想和方法。当然,作为入门性的课程,也不能期望在这门课程中解决所有的问题。因此,在本书中,我们只介绍最基本的、学生能够理解和掌握的程序设计思想和方法,而程序设计中一些经典的思想和方法,留到其他课程中去解决。
本书还有一个特点,就是把c语言中应用最灵活、学生学习时感觉难度最大的指针进行了分解。在书中,我们把指针的相关知识,按照它的作用分解到各个章节中。这样不但分散了难点,而且使学生知道什么时候必须使用指针,该如何使用指针。解决了指针这个难点,C语言的教学就成功了一半。
本书由杨俊清教授任主编,负责全书的组织和统稿工作,并编写了第1章。石锋担任副主编,并编写了第7章。参加编写的人员还有:程传旭,编写了第2、3章;陈庆荣,编写了第4章;张少应,编写了第5章;彭寒,编写了第6章;王建,编写了第8、9章;曹国震,编写了第10章。
由于作者水平有限,书中疏漏之处在所难免,恳请读者批评指正。
第1章 程序设计概述
1.1 程序工作原理
1.1.1 冯·诺伊曼原理
1.1.2 计算机的构成原理
1.2 程序设计语言
1.2.1 程序设计语言的发展
1.2.2 典型高级语言
1.2.3 程序设计语言发展趋势
1.3 算法概述
1.4 c语言程序设计
1.4.1 C语言的发展历史
1.4.2 C语言的特点
1.4.3 c语言程序基本结构
1.4.4 C语言程序的开发环境
习题
第2章 C语言基础
2.1 标识符与关键字
2.2 简单数据类型
2.2.1 常量与变量
2.2.2 整型
2.2.3 实型
2.2.4 字符型
2.2.5 不同类型数据的混合运算
2.3 简单计算
2.3.1 算术运算与算术表达式
2.3.2 赋值运算符与赋值表达式
2.3.3 自加、自减和逗号运算
习题
第3章 顺序结构程序设计
3.1 c语句概述
3.1.1 C程序基本结构
3.1.2 C语句分类
3.1.3 c结构化程序设计
3.2 数据的输入与输出
3.2.1 printf函数
3.2.2 scanf函数
3.2.3 其他输入腧出函数
3.3 编译预处理命令
3.3.1 宏定义
3.3.2 文件包含
3.3.3 条件编译
3.4 函数简介
3.4.1 函数定义和调用的一般方法
3.4.2 库函数的调用
3.5 顺序结构程序设计举例
习题
第4章 选择程序设计
4.1 关系运算和逻辑运算
4.1.1 关系运算符和关系表达式
4.1.2 逻辑运算符和逻辑表达式
4.2 分支流程控制语句
4.2.1 if语句
4.2.2 switch语句
4.2.3 条件运算符
4.3 选择语句的嵌套
4.4 选择结构程序设计举例
习题
第5章 循环结构程序设计
5.1 循环流程控制语句
5.1.1 while语句
5.1.2 do-while语句
5.1.3 for语句
5.2 循环嵌套
5.3 break语句和continue语句
5.3.1 break语句
5.3.2 continue语句
5.4 循环结构程序设计举例
5.4.1 穷举
5.4.2 迭代
习题
第6章 函数
6.1 函数的定义和调用
6.1.1 函数概述
6.1.2 函数的定义
6.1.3 函数的调用
6.2 函数问地址的传递
6.2.1 指针的概念
6.2.2 指针变量
6.2.3 指针变量的对象
6.2.4 函数间传递地址
6.3 函数间函数的传递
6.3.1 函数的地址
6.3.2 指向函数的指针变量
6.3.3 在函数之间传递函数
6.4 函数的递归调用
6.5 变量的作用域
6.5.1 内部变量
6.5.2 外部变量
6.5.3 内部函数和外部函数
6.6 变量的存储属性
6.6.1 变量及其存储属性
6.6.2 动态内部变量和静态内部变量
习题
第7章 数组
7.1 一维数组
7.1.1 数组概述
7.1.2 一维数组的定义和初始化
7.1.3 一维数组元素的引用
7.1.4 简单排序算法
7.2 函数问一维数组的传递
7.2.1 一维数组元素地址的表示
7.2.2 利用指针变量访问一维数组
7.2.3 在函数间传递一维数组
7.3 二维数组
7.3.1 二维数组的定义和初始化
7.3.2 二维数组元素的引用
7.4 函数问二维数组的传递
7.4.1 二维数组元素的地址表示法
7.4.2 利用行指针变量访问二维数组元素
7.4.3 函数之问二维数组的传递
习题
第8章 字符串
8.1 字符串
8.1.1 字符串常量
8.1.2 字符串的存储
8.1.3 字符串的表示
8.2 函数间字符串的传递
8.2.1 单个字符串的传递
8.2.2 多个字符串的传递
8.2.3 main函数的参数
8.2.4 字符串处理函数
习题
第9章 结构体、共用体和枚举类型
9.1 结构体
9.1.1 结构体的类型定义
9.1.2 结构体数据的定义和引用
9.2 单链表
9.2.1 动态存储分配
9.2.2 单链表概述
9.2.3 单链表的基本操作
9.3 共用体和枚举类型
9.3.1 共用体
9.3.2 枚举类型
9.4 typedef定义类型
习题
第10章 文件
10.1 文件概述
10.1.1 文件和文件指针
10.1.2 文件操作的一般过程
10.1.3 文件的打开与关闭
10.2 文件的读写
10.2.1 fprintf和fscanf函数
10.2.2 fputc和fgetc函数
10.2.3 fputs和fgets函数
10.2.4 fwrite和fread函数
10.3 文件定位
10.3.1 rewind函数
10.3.2 fseek函数
习题
附录A 常用字符ASCII代码表
附录B 运算符的优先级和结合性
附录C 标准库函数
(3)健壮性:正确的输入能得到正确的输出,这是算法必须具有的特性之一。但当遇到非法输入时,算法应能做出反应或处理(如提示信息等),而不会产生不需要的或不正确的结果。
例如,在算法中总是采用较简单的方法以及模块化函数以增强算法的易读性;采用步骤较少的求解方法以提高算法的时间效率;对可能发生的各种现象及输入形式给出应对措施以提高算法的健壮性。
要确定一个算法是适合的、“好”的算法,就需要进行算法分析。算法分析的两个主要方面是分析算法的时间效率和空间效率,目的是以求改进算法或对不同的算法进行比较。鉴于目前情况下运算空间较为充足,我们把算法的时间效率分析作为主要内容。
算法运行的时间分析和程序运行的时间分析是有区别的。同一算法由不同的程序员所编写的程序有优劣之分,程序运行的时间也就有所不同;程序在不同的机器上运行的速度又和机器本身的速度有关。而我们感兴趣的是对解决问题的算法作时间上的度量分析,或对解决同一问题的两种或两种以上的算法运行时问加以比较。