《C语言程序设计进阶教程》一导读

简介: 本文讲的是C语言程序设计进阶教程一导读,市面上有成百上千种关于编程的书籍,其中有很多都是关于C语言编程的,那么为什么我还要写这本书呢?为什么建议你花时间读它呢?这本书跟其他书有什么不同呢?跟很多作者一样,我写这本书是因为我觉得有必要,觉得这本书中的方法比其他书中的更好。

screenshot

前  言

为什么要写这本书
本文讲的是C语言程序设计进阶教程一导读,市面上有成百上千种关于编程的书籍,其中有很多都是关于C语言编程的,那么为什么我还要写这本书呢?为什么建议你花时间读它呢?这本书跟其他书有什么不同呢?跟很多作者一样,我写这本书是因为我觉得有必要,觉得这本书中的方法比其他书中的更好。
我将现在已有的关于编程的书分为两类:入门和进阶。入门类书是给初学者写的,一般都假设读者没有编程基础,所以主要是介绍基本的概念。通常以“Hello World!”程序开始,也就是将“Hello World!”输出到电脑屏幕的程序。这种类型的书主要是一步步地介绍语言特点,包括关键词、数据类型、控制结构、字符串、文件操作等,而这些书一般都有一个特点:程序很短,一般是1~2页。这很奏效,因为短程序有助于解释编程语言的新概念。如果把学编程语言比作学自然语言,如英语、汉语、法语、韩语等,这些书就相当于教导如何造句和撰写短段落。
第二类书是写给有程序开发经验的读者的。这些书主要介绍解决现实中的问题的程序,比如关于电脑游戏或者图像。而这类书的例子一般很长,有些甚至几千行代码,因此不会全部印在书本上。书中只会解释程序的其中一部分,而源程序一般保存在CD或者某个网址上。这类书一般不会再介绍如何编程,而是大多专注于解决特定问题的算法研究,有时包括算法性能的详细信息。读者不可能再找到类似于“Hello World!”这样的例子。再比作自然语言的例子,这类书就是在教导如何撰写可能超过20页的短篇小说。
问题是,从写一个段落到写一篇小说,这种跨越太难了。
一本针对中级编程能力的学生的书
市面上很少有针对中级编程能力学生的书籍。这些学生往往已经掌握了编程的基本知识,在看到if或者while时不会茫然,知道如何创建函数和调用函数,有能力编写几十上百行的短代码,却不知道如何处理上千行的程序。他们经常会犯错误,因为大多数入门级的书籍只教导如何编写正确的程序,却不会教导避免常见的错误。他们往往对大多数的概念和那些可以帮助提高编程能力的工具都不太熟悉,他们需要这样一个台阶:可以帮助他们从有能力编写短代码到有能力编写解决现实问题的程序。
现在入门和进阶的空档已经被数据结构和算法的书籍填充了一部分,这类图书一般提供实现数据结构或算法的完整例子。然而这并不是最合适的解决方法,这类图书致力于介绍数据结构和算法,却罕有提供帮助读者编写正确代码的信息。事实上,它们大多只提供程序,而很少解释。它们往往不解释编程概念,比如函数需要一个指针作为实参的原因或者深拷贝与浅拷贝之间的差异等。因此,读者只能自学这些编程技巧。
为了迎合这个需求,我写下这本针对中级编程能力的学生的书,本书适合作为学习编程的第二本教材。
避免出错和调试的重点
我们可以看到有很多关于如何编程的书籍,却很少关于开发软件的书籍。开发软件不是简单地输入代码,它需要更多的知识和技能。为了弥补这种不足,最好就是去研究什么是对的、什么是错的。只解释如何编写正确的程序是不够的,还需要解释常见的错误并将它们与正确的程序进行对比。
一次疏忽可能使程序运行出乎意料,甚至是某些情况下运行正确而另一些情况下出错。这种类型的错误往往很难发现,更别说更正了。本书将介绍一些常见的错误以教导读者如何避免这些错误。调试过程在大多数书中都不会涉及,罕有书籍会提到“调试器”这个词,以至于有些读者都不知道这类工具的存在。学会如何使用调试器一般不超过30分钟,这可以帮助程序员节省很多时间。关于如何使用调试器和调试策略的书籍则更少了。
程序设计和离散数学
程序设计和离散数学是计算机科学中的两个重要学科,然而,大多数书籍都将这两个主题分开,所以很少会在编程的书籍中看到数学公式,同样也很难在离散数学中看到代码。在本书中,这两个主题紧密结合,我相信读者可以从中学到更多的知识。
为什么本书使用C语言?
C语言诞生于20世纪60年代后期和20世纪70年代早期。在C语言发明之后,很多语言也相继出现,这些语言也深受C语言的影响。除了它的历史影响之外,C语言的简单易用也保证了它在几乎所有现代化平台中的重要地位。与许多操作系统一样,Linux是就用C语言编写的,Android基本都是用Java编写的但仍有叫作JNI(Java Native Interface,Java本地接口)的C语言接口。大多数计算机语言都可以与C语言进行通信或通过C语言进行通信,事实上这对一种编程语言而言是有用的,因为大多数操作系统接口都使用C语言。当一个全新的系统被设计出来,C语言通常是第一种(很多情况下是唯一一种)被系统支持的编程语言。
对于具有中级编程能力的学生来说,C语言是一个很好的选择,因为学习C语言需要了解很多计算机概念。langpop.com网站对比了编程语言的受欢迎程度,得出C语言是最受欢迎的语言,紧接着是Java。IEEE Spectrum中的一个报告将编程语言进行排行,主要考虑四类软件:移动应用、企业软件、嵌入式系统和网页。其中嵌入式系统中最受欢迎的就是C语言。四种类型都考虑时,前五名编程语言如下所示:

  1. Java(100%)
  2. C(99.3%)
  3. C++(95.5%)
  4. Python(93.4%)
  5. C#(92.4%)
    可以发现,基于C的编程语言(C、C++、C#)占据了前五席的三席。而Java是受C++影响的。

为什么需要读这本书?
如果你是计算机科学、计算机工程或者电子工程专业的学生,那么就绝对应该读本书。本书包含了很多基本概念,这些概念对于理解计算机中程序的运行方式十分重要。如果你是工程、科学、数学或者技术专业的学生,在学习工作中就很有可能需要用到计算机,而阅读本书将会有很大帮助。即便你不是上述专业的学生,仍然可以在本书中学到很多有用的概念(比如递归)。
作者、审稿人及封面设计师
作者简介
Yung-Hsiang Lu 是美国印第安纳州西拉法叶普渡大学电子与计算机工程学院的副教授。他是美国计算机协会(ACM)的杰出科学家和演说家。2011年8~12月,曾是新加坡国立大学计算机科学系的客座副教授。他在美国加利福尼亚州斯坦福大学电子工程系取得博士
学位。
审稿人简介
Aaron Michaux是美国印第安纳州西拉法叶普渡大学电子与计算机工程学院的一名研究生。他在澳大利亚昆士兰科技大学取得计算机科学学士学位,在加拿大新布伦瑞克圣托马斯大学获得心理学学士学位。Aaron在重新回到学校攻读博士学位之前已经作为专业程序员工作了10年。他的研究方向主要围绕计算机视觉和人类视觉感知。
Pranav Marla是美国印第安纳州西拉法叶普渡大学电子与计算机工程学院的一名本科生。他主修的专业是计算机科学。在计算机工程、心理学和哲学上也稍有涉猎。他希望可以专攻机器学习和人工智能。
封面设计师简介
本书封面是由Kyong Jo Yoon描绘的。他是一名韩国画家,经常在自然场景中加入英雄人物。他是韩国美术协会的一名顾问,他的作品在美国伊利诺伊州芝加哥市的安内森美术馆中展出。
软件开发中的规则
如果由于软件错误,银行每天将你的钱减少0.1%,你会满意吗?你能接受每个月都少走40分钟的手表吗?这两种情况都是“成功了99.9%”,但却都让人无法接受。计算机现在用在很多应用程序中,有些甚至会影响人类的安全。即使你编写的程序在99.9%的时间里都可以正确地运行,那也有可能会在剩余的0.1%的时间里危害人类的生命。这是绝对让人无法接受的,这是一个失败的程序。因此,99.9%的成功就是失败。
如果你住在加州的帕萨迪纳,现在想去纽约,你会走哪条路呢?也许你会去洛杉矶机场,然后坐飞机去纽约。但是纽约在帕萨迪纳的东边,而机场在帕萨迪纳的西边。你为什么不直接开车去东边呢?你为什么要绕路去机场呢?如果你直接开车去东边,而不是去机场排队的话,你就离纽约越来越近了啊。答案很简单:相对于汽车来讲,飞机这一交通工具更适合长途旅行。在程序开发中,有许多用以管理大型软件的开发工具,你需要学习这些工具。没错,学习使用工具会消耗一些时间,但是如果你使用不合适的工具或者不使用工具的话,将浪费更多的时间。花些时间学习使用编程工具将在软件开发和调试时节省大量时间。
尽管经过了数十年的努力,现在的计算机依然没有达到智能化的水平。计算机无法猜测你的想法。如果你写的程序让计算机去做一件错事,那么计算机就会跟随指令去做。如果你的程序是错的,那就是你的责任。计算机无法猜测你的想法。在很多例子中,计算机程序中一个微小的错误就可以造成巨大的财产损失,甚至危及人类的生命。缺少一个分号“;”或者用“,”取代“. ”,程序将无法执行。计算机程序不能容忍任何微小的错误。
通过测试方案并不能保证程序的正确性。测试只能得出一个程序有错误的结论但不能表明一个程序是正确的。为什么呢?测试方案能覆盖所有可能的情景吗?覆盖全部情景是非常困难的,而且在很多情况下是不可能的。因为测试方案很难检测特殊行为,所以一些问题可能会隐藏在你的程序中。
产生正确的输出并不意味着程序是正确的。你会认为一架已经安全起飞并着陆的飞机是安全的吗?如果飞机在漏油,你会在登机前要求航空公司维修飞机吗?如果航空公司回复:“之前没有人受伤,说明这架飞机是安全的。”你会接受航空公司的回应吗?如果司机闯红灯而没出事故的话,是否意味着闯红灯是安全的呢?一个可以产生正确输出的程序就像是一架安全着陆的飞机。可能有很多问题隐藏在安全的表面之下。很多工具可以检测人类隐藏的健康问题,比如X–射线,核磁共振以及超声波扫描。我们也需要工具来检测出隐藏在电脑程序中的问题。即使程序可以产生正确的输出,我们也要对它们进行修改。
你必须假设程序会出问题,并开发出检测和改正问题的策略。在写程序时,应该每次只专注于一小部分。在仔细检查并确保没有问题之后再进行下一部分。对于大多数程序,你需要为了测试这些小的模块而编写额外的程序。虽然这些测试代码并不包含在最终的程序中,但是编写测试程序可以节省大量时间。有时,测试代码可能会比程序本身还要多。我自己的经验建议1:3的比例:最终程序中的1行代码,需要3行测试代码。
没有什么工具可以取代一个清醒的大脑。工具可以提供一些帮助,但是对概念清晰深刻的理解才是最重要的。如果你想成为一名优秀的程序员,那么你需要完全理解每一个细节。不要指望工具可以替你思考:它们做不到。
源代码
本书中所有的程序都可以从github.com上获取。请使用下面的命令获取文件:
…………………………………………
$ git clone ‘https://github.com/yunghsianglu/IntermediateCProgramming.git
$是Linux终端的shell提示符
…………………………………………

目录

1.1 编译
1.2 重定向输出
2.1 值和地址
2.2 栈
2.3 调用栈
2.3.2 函数实参
2.3.3 局部变量
2.3.4 值地址
2.3.5 数组
2.3.6 获取地址
2.4 可见度
2.5 习题
2.5.1 绘制调用栈I
2.5.2 绘制调用栈II
2.6.1 绘制调用栈I
2.6.2 绘制调用栈II
2.7 在DDD(命令行调试程序)上检测调用栈
第3章 预防、检测及消除bug
3.1.1 编程前
3.1.2 编程中
3.1.3 编程后
3.2 常见错误
3.2.1 未初始化变量
3.2.2 错误数组下标
3.3 后执行式和交互式调试
3.4 生产代码与测试代码分离

原文标题:C语言程序设计进阶教程一导读

相关文章
|
4月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
132 20
|
5月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
284 16
|
5月前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
170 18
|
5月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
126 18
|
5月前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
130 13
|
5月前
|
存储 安全 C语言
【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
分支的语句,这可能不是预期的行为,这种现象被称为“case穿透”,在某些特定情况下可以利用这一特性来简化代码,但在大多数情况下,需要谨慎使用。编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。根据提示,在右侧编辑器补充代码,计算并输出最终预测的身高。分支下的语句,提示用户输入无效。常量的值必须是唯一的,且在同一个。语句的作用至关重要,如果遗漏。开始你的任务吧,祝你成功!,程序将会继续执行下一个。常量都不匹配,就会执行。来确保程序的正确性。
210 10
|
5月前
|
小程序 C语言
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: 任务描述 相关知识 编程编写一个程序,从键盘输入3个变量的值,例如a=5,b=6,c=7,然后将3个变量的值进行交换,使得a=6,b=7,c=5。面积=sqrt(s(s−a)(s−b)(s−c)),s=(a+b+c)/2。使用输入函数获取半径,格式指示符与数据类型一致,实验一下,不一致会如何。根据提示,在右侧编辑器补充代码,计算并输出圆的周长和面积。
120 10
|
5月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
144 3
|
5月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
135 2
|
5月前
|
存储 C语言
【C语言程序设计——循环程序设计】利用数列的累加和求 sinx(头歌实践教学平台习题)【合集】
项的累加和,一般会使用循环结构,在每次循环中计算出当前项的值(可能基于通项公式或者递推关系),然后累加到一个用于存储累加和的变量中。在C语言中推导数列中的某一项,通常需要依据数列给定的通项公式或者前后项之间的递推关系来实现。例如,对于一个简单的等差数列,其通项公式为。的级数,其每一项之间存在特定的递推关系(后项的分子是其前项的分子乘上。,计算sinx的值,直到最后一项的绝对值小于。为项数),就可以通过代码来计算出指定项的值。对于更复杂的数列,像题目中涉及的用于近似计算。开始你的任务吧,祝你成功!
159 6