具体描述
编辑推荐
本书可以作为“C语言程序设计”基础教材!此外,本书将ACM竞赛平台OJ(Online Judge)系统用于C语言的学习过程中,旨在帮助读者快速掌握C语言的基础知识和ACM/ICPC的基本答题方法。全书内容深入浅出、通俗易懂,可使读者在短时间内掌握编程要领。书中主要实例采用了ACM/ICPC规定的格式进行描述,所有程序均已在DEV C++上调试通过。本书配套资源下载地址为清华大学出版社网站本书页面,内容包括书中的全部实例的源代码文件。
内容简介
《C语言程序设计:零基础ACM、ICPC竞赛实战指南/清华开发者书库》是专为C语言爱好者及ACM/ICPC参赛者编写的入门级教程,针对C语言学习过程中普遍存在的重理论轻实践、重语法轻编程的现象,通过贯穿全书的大量实例来介绍C语言编程的方法和技巧。全书分为三个部分: 第一部分介绍C语言的基础性语法,包括标准程序框架、数据类型和控制结构; 第二部分介绍了常见的OJ(Online Judge)平台、使用方法及OJ系统的基本输入与输出的常见类型; 第三部分通过实例介绍了数组、函数和结构体编程过程中常用的知识点。
本书可以作为“C语言程序设计”课程的基础教材,也可作为参加ACM/ICPC竞赛的指导用书,并可作为各高校和相关培训机构的教学参考书。
内页插图
目录
第1章死记硬背
1.1引子
1.2死记硬背
1.2.1编程基本步骤
1.2.2记死
1.3初学者方法
第2章数据类型
2.1从A+B说起
2.2A+B继续
2.3基本数据类型
2.3.1数据类型与“模子”
2.3.2常量
2.3.3变量
2.3.4强制类型转换
2.4变量的命名规则
2.5拓展训练
第3章数据的控制台输入与输出
3.1printf()函数和scanf()函数
3.1.1printf()函数
3.1.2scanf()函数
3.2getchar()函数与putchar()函数
3.2.1字符输入函数getchar()
3.2.2字符输出函数: putchar()
3.3标准程序解读
3.3.1头文件
3.3.2函数
第4章控制结构
4.1从+1开始
4.2灌汤包
4.3顺序结构
4.4分支结构
4.4.1if语句
4.4.2switch语句
4.5循环结构
4.5.1while语句
4.5.2do�瞱hile语句
4.5.3for语句
4.6continue语句和break语句
4.6.1continue语句
4.6.2break语句
4.7实例分析
第5章运算符和表达式
5.1算术运算符
5.2逻辑运算符
5.2.1逻辑代数基础
5.2.2逻辑运算符
5.3关系运算符
5.4位运算
5.4.1按位与运算
5.4.2按位或运算
5.4.3按位异或运算
5.4.4求反运算
5.4.5左移运算
5.4.6右移运算
5.5表达式
5.5.1(算术)运算符的优先级与结合性
5.5.2赋值运算符
5.5.3逗号运算符和逗号表达式
5.5.4运算符优先级总结
5.6实例分析
第6章基本输入与输出
6.1OJ系统简介
6.2OJ系统使用说明
6.2.1OJ系统注册
6.2.2常见评判结果
6.2.3简单题
6.3基本输入与输出
6.3.1基本输入类型
6.3.2基本输出
6.4解题报告
第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.2.4实例分析
7.3字符数组
7.3.1字符数组的定义
7.3.2字符数组的初始化
7.3.3字符数组的引用
7.3.4字符串和字符串结束标志
7.3.5字符数组的输入与输出
7.4动态数组
7.4.1为什么引进动态数组
7.4.2动态数组的创建
7.5测试程序运行时间
7.6拓展训练
第8章自定义函数
8.1为什么要引入函数
8.1.1模块化程序设计思想
8.1.2函数分类
8.1.3实例分析
8.2函数定义
8.2.1函数定义形式
8.2.2函数参数
8.2.3函数的返回值
8.3函数调用
8.3.1函数调用形式
8.3.2函数声明
8.3.3函数声明和函数定义的区别
第9章结构体
9.1引子
9.2结构体基本概念
9.2.1结构体类型的定义
9.2.2结构体变量的定义
9.2.3结构体变量占据的内存空间
9.2.4结构体变量对结构体成员的引用
9.2.5结构体变量的赋值
9.3结构体类型的数组
9.3.1结构体数组变量的定义
9.3.2结构体数组的引用
9.3.3结构体数组的初始化
附录ADev C++安装说明
附录BDEV C++使用说明
附录C常见错误信息中英语句索引
附录D常用头文件及包含的函数
附录EC语言32个关键字和9种控制语句
参考文献
前言/序言
C语言功能丰富、表达能力强、使用灵活方便,20世纪90年代以来,C语言迅速在全世界普及推广。C语言具有高级语言的优点又有低级语言的特性,既适合编写操作系统软件,又能方便地开发领域应用软件。目前,C语言程序设计已经成为最为广泛的一门程序设计课程。依据基于世界范围内的资深软件工程师和第三方供应商提供作为指数的TIOBE开发语言排行榜(每月发布一次),C语言排名一直名列前茅。C语言是实践性很强的一门课程,必须不断地练习编程。在信息技术飞速发展的今天,如何将理论与实践有机结合,有效地推进素质教育和高水平人才培养,是新时期IT人才面临的新课题。
ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,ACM/ICPC)是由美国计算机协会(Association for Computing Machinery,ACM)主办,其目的是使大学生充分展示分析问题和运用计算机解决问题的能力。ACM/ICPC作为一项世界性的竞赛活动,自1970年开始至今,是世界范围内历史最悠久、规模最大的程序设计竞赛。正好迎合了当今社会对创新性IT人才的需求,竞赛较全面地考验学生对知识的综合运用能力、创造性地分析解决问题能力,所以在IT界具有超凡的影响力。该项赛事极大地提高了参赛同学的学习热情、实践动手能力、团队合作能力和创造创新能力。ACM/ICPC在线评判(Online Judge,OJ)系统是该项比赛的评判事务处理平台,提供了一个基于B/S结构的多用户在线系统,允许用户在线提交自己的解题代码,系统自动编译运行给出评判结果,并根据用户解题数和用时综合排出名次。
针对C语言学习过程中普遍存在的重理论轻实践、重语法讲解轻编程思想的现象,本书将“A+B”的示例程序贯穿全书,将ACM竞赛平台OJ系统用于C语言的教学讲解和自学过程中。全书分为三个部分: 第一部分为C语言的基础性语法,包括标准程序框架,数据类型和控制结构; 第二部分针对常见的OJ平台、使用方法及OJ系统的基本输入与输出等常见类型进行讲解; 第三部分为数组、函数和结构体。
本书主要特点: ①所讲解的程序框架是ACM/ICPC通用的标准框架; ②采用实例讲解方法引出理论; ③每个例程均已通过测试,确保能够正确编译并运行; ④详细讲解如何使用OJ系统进行编程实践。
本书适用人群: ①大学本科一年级没有学过C语言的学生; ②已学过或正在学C语言,但对已学内容不得要领的学生; ③有强烈参加ACM/ICPC竞赛愿望的学生; ④大学本科四年级考取研究生,复试阶段需要上机复试C语言的学生; ⑤有强烈提高自己编程能力欲望,但苦于找不到合适训练方法和习题的读者。
本书程序运行的操作系统为Windows 7,计算机硬件配置为Intel(R) Core(TM) i5 CPU M480 @2.67GHz,系统类型为64位操作系统。
本书作者是长期从事ACM/ICPC竞赛指导和C语言教学的一线教师,同时也一直致力于C语言教学改革,近三年来所带学生在计算机软件类学科竞赛中获得省级以上奖励三百余人次。
在本书的编写过程中,部分题目参考或改编自杭州电子科技大学和北京大学的在线评判(OJ)系统,在此表示感谢!
由于作者能力和水平所限,加之时间仓促,书中不足之处恳请广大专家、读者批评指正!在C语言程序设计竞赛相关书籍中,希望本书抛出的“砖”能够引出更多的“玉”!
编著者2015年2月
C语言程序设计:零基础ACM/ICPC竞赛实战指南 目录 第一部分:C语言基础篇 第一章:程序设计入门 1.1 什么是程序设计? 程序设计的概念与发展 算法与程序的关系 计算机语言的种类与选择 1.2 你的第一个C程序 搭建开发环境:安装GCC编译器 编写、编译与运行:Hello, World! 程序的基本构成:`include`, `main` 函数, `printf` 1.3 C语言的开发流程 源代码、目标文件、可执行文件的概念 编译、链接的过程解析 1.4 编程风格与规范 代码可读性的重要性 注释的艺术:单行注释与多行注释 命名规范:变量、函数、常量 代码缩进与排版 第二章:变量、数据类型与运算符 2.1 数据类型探秘 整型家族:`int`, `short`, `long`, `long long`,以及 `unsigned` 浮点型家族:`float`, `double`, `long double` 字符型:`char` 理解数据类型的存储空间与取值范围 类型转换:隐式转换与显式转换 2.2 变量的声明与初始化 变量的本质:内存中的命名空间 声明与初始化:让变量“活”起来 局部变量与全局变量的作用域 2.3 运算符的魔力 算术运算符:`+`, `-`, ``, `/`, `%` 关系运算符:`>`, `<`, `>=`, `<=`, `==`, `!=` 逻辑运算符:`&&`, `||`, `!` 赋值运算符:`=`, `+=`, `-=`, `=`, `/=`, `%=` 自增与自减运算符:`++`, `--` 位运算符:`&`, `|`, `^`, `~`, `<<`, `>>` 条件运算符(三目运算符):`?:` 运算符的优先级与结合性 第三章:流程控制结构 3.1 条件判断:程序的“选择” `if` 语句:单一条件判断 `if-else` 语句:两种情况的选择 `if-else if-else` 语句:多重条件判断 嵌套 `if` 语句:复杂的逻辑组合 `switch-case` 语句:多分支选择的优雅实现 3.2 循环迭代:程序的“重复” `while` 循环:先判断后执行 `do-while` 循环:先执行后判断 `for` 循环:计数循环的经典 循环的嵌套:构建复杂的重复模式 `break` 与 `continue`:跳出与跳过循环 3.3 流程控制的艺术 如何根据问题选择合适的控制结构 避免死循环与不必要的计算 第四章:函数:模块化编程的核心 4.1 函数的定义与声明 函数的意义:代码复用与模块化 函数定义:实现功能 函数声明(原型):告知编译器函数的存在 返回值类型与参数列表 4.2 函数的调用与传参 如何调用一个函数 值传递:函数内部对参数的修改不影响实参 理解函数调用栈 4.3 作用域与生命周期 局部变量与全局变量的生命周期 静态变量 (`static`):变量的“记忆” 4.4 递归函数:自我调用的魅力 递归的定义:解决大规模问题,分解为小规模问题 递归的基石:终止条件 经典的递归问题:阶乘、斐波那契数列 递归的优缺点与栈溢出风险 第五章:数组:数据的有序集合 5.1 一维数组 数组的定义与初始化 数组元素的访问与修改 数组的遍历 数组作为函数参数 5.2 多维数组 二维数组的定义与初始化 二维数组元素的访问 二维数组的遍历 多维数组作为函数参数 5.3 字符串:字符数组的特殊处理 C语言中字符串的表示:以 ` ` 结尾的字符数组 字符串的输入与输出:`scanf("%s", ...)` 与 `printf("%s", ...)` 常用的字符串处理函数:`strlen`, `strcpy`, `strcat`, `strcmp` (在``库中) 第六章:指针:内存地址的操纵者 6.1 指针的概念与定义 指针变量:存储内存地址的变量 地址运算符:`&` 解引用运算符:`` 6.2 指针与数组 数组名即首地址 指针算术:移动指针访问数组元素 使用指针遍历数组 6.3 指针与函数 指针作为函数参数:实现“引用传递” 函数返回指针:需要注意内存管理 6.4 指针的进阶 指向指针的指针 指向数组的指针 指向函数的指针 6.5 指针的注意事项 野指针:未初始化的指针 空指针:指向NULL的指针 悬挂指针:指向已被释放内存的指针 第七章:结构体与共用体:自定义数据类型 7.1 结构体:组合不同类型数据的容器 结构体的定义与声明 结构体变量的定义与初始化 访问结构体成员:`.` 运算符 结构体作为函数参数与返回值 指向结构体的指针:`->` 运算符 `typedef`:为结构体定义别名 7.2 共用体:节省内存的“共享”空间 共用体的定义与声明 共用体变量的内存布局 共用体的应用场景 7.3 枚举类型:命名一组整型常量 枚举的定义与使用 第八章:文件操作:数据的持久化存储 8.1 文件流的概念 文件与程序之间的数据传输 8.2 文件打开与关闭 `fopen()` 函数:以不同模式打开文件 文件模式:`"r"`, `"w"`, `"a"`, `"rb"`, `"wb"`, `"ab"` 等 `fclose()` 函数:关闭文件,释放资源 8.3 文件读写操作 字符读写:`fgetc()`, `fputc()` 字符串读写:`fgets()`, `fputs()` 格式化读写:`fscanf()`, `fprintf()` 二进制读写:`fread()`, `fwrite()` 8.4 文件定位 `fseek()` 函数:移动文件指针 `ftell()` 函数:获取当前文件指针位置 `rewind()` 函数:将文件指针移至文件开头 第二部分:ACM/ICPC竞赛进阶篇 第九章:数据结构初步 9.1 线性数据结构 顺序表(静态数组实现): 优缺点分析,基本操作实现。 链表: 单向链表:节点定义,插入,删除,查找,遍历。 双向链表:节点定义,插入,删除,查找,遍历。 循环链表:概念与应用。 栈: 栈的抽象数据类型(ADT)定义: LIFO(后进先出)。 基于数组和链表的实现。 基本操作:`push`, `pop`, `top`, `isEmpty`。 应用:表达式求值,括号匹配。 队列: 队列的抽象数据类型(ADT)定义: FIFO(先进先出)。 基于数组和链表的实现。 基本操作:`enqueue`, `dequeue`, `front`, `isEmpty`。 应用:广度优先搜索(BFS)。 9.2 非线性数据结构 树: 树的基本概念:根节点,子节点,父节点,叶子节点,深度,高度。 二叉树: 二叉树的定义与性质。 遍历方式:前序,中序,后序。 基于数组和链表的实现。 应用:表达式树,搜索二叉树。 图: 图的基本概念:顶点,边,度,连通分量。 图的表示:邻接矩阵,邻接表。 基本的图遍历算法: 深度优先搜索(DFS):递归与非递归实现,应用。 广度优先搜索(BFS):队列实现,应用。 第十章:算法设计基础 10.1 算法复杂度分析 时间复杂度:大O表示法,O(1), O(log n), O(n), O(n log n), O(n^2), O(2^n) 等。 空间复杂度:大O表示法。 如何分析算法的复杂度。 10.2 贪心算法 贪心算法的思想:局部最优推导全局最优。 典型问题:活动选择问题,背包问题(部分),霍夫曼编码。 判断一个问题是否适合使用贪心算法。 10.3 分治算法 分治算法的思想:分解,解决,合并。 典型问题:归并排序,快速排序,二分查找。 递归在分治算法中的应用。 10.4 动态规划 动态规划的思想:将大问题分解为子问题,记忆化搜索,避免重复计算。 状态定义与状态转移方程。 典型问题:斐波那契数列(优化),背包问题(0/1背包),最长公共子序列,最长递增子序列。 自底向上与自顶向下(记忆化搜索)两种实现方式。 10.5 回溯算法 回溯算法的思想:深度优先搜索,剪枝。 当搜索到某个状态时,如果发现当前路径不可能得到最优解,则回溯到上一步,尝试其他路径。 典型问题:N皇后问题,排列组合问题,迷宫求解。 10.6 查找算法 顺序查找 二分查找(前提:有序) 哈希查找(基本概念) 第十一章:数学在ACM/ICPC中的应用 11.1 数论基础 整除与模运算: 概念,性质,扩展欧几里得算法(求解线性同余方程)。 素数: 判定素数(试除法),筛法(埃拉托色尼筛法)。 最大公约数 (GCD): 欧几里得算法。 最小公倍数 (LCM): GCD与LCM的关系。 同余方程: 线性同余方程的求解。 模幂运算: 快速幂算法。 11.2 组合数学 排列与组合: 基本公式。 容斥原理: 解决包含“或”的关系的计数问题。 鸽巢原理: 证明存在性。 11.3 概率与期望 基本概率概念。 期望的线性性质。 利用期望解决问题。 第十二章:ACM/ICPC竞赛技巧与策略 12.1 理解题目 如何快速准确地读懂题目要求。 注意题目中的陷阱和特殊情况。 分析题目的输入输出格式。 12.2 编程实现 模块化编程:将代码拆分成函数。 代码的可读性与鲁棒性。 调试技巧:利用 `printf` 调试,学会使用调试器。 12.3 优化与效率 选择合适的数据结构和算法。 减少不必要的计算。 注意常数因子和边界条件。 12.4 常见的错误与陷阱 数组越界。 整数溢出。 浮点数精度问题。 死循环。 内存泄露(虽然C语言需要手动管理,但竞赛中通常题目不考察严格的内存管理)。 12.5 模拟题与实战演练 分析往届真题,了解题目难度和出题风格。 进行模拟比赛,提高在压力下的解题能力。 总结比赛经验,分析失误原因。 12.6 团队协作(针对团队赛) 沟通与协作的重要性。 分工与合作。 附录 C语言常用库函数速查 ACM/ICPC常见算法列表 参考资料推荐 --- 本指南旨在为C语言初学者提供坚实的编程基础,并在此基础上引导读者逐步深入ACM/ICPC竞赛所需的算法和数据结构知识。通过理论讲解、代码示例和习题练习,读者将能够掌握C语言的精髓,并逐步建立起解决算法竞赛题目的思维模式和实践能力。我们将从最基本的“Hello, World!”开始,一路探索变量、控制流、函数、指针、数组等核心概念,构建起扎实的C语言功底。 进阶部分将专注于ACM/ICPC竞赛的核心内容,深入讲解各种重要的数据结构,如链表、栈、队列、树和图,以及掌握核心算法设计思想,包括贪心、分治、动态规划和回溯。同时,我们将梳理数论、组合数学等与竞赛密切相关的数学知识,并分享实用的竞赛技巧和策略,帮助读者在实战中提升解题速度和准确率。 本书的目标是让每一位对编程竞赛充满热情的零基础学习者,都能在掌握C语言的基础上,一步步蜕变为能够独立思考、解决复杂算法问题的竞赛选手。我们相信,通过系统的学习和大量的练习,你一定能在ACM/ICPC的赛场上大放异彩。