主页 > 网页设计 > 小白入门学习C语言,应该先看哪几本书?

小白入门学习C语言,应该先看哪几本书?

2022-06-19 05:28来源:m.sf1369.com作者:宇宇

真正是新手的话,我想哪一本书都不值得推荐。问这个问题,应该更注重的是如何学习,而不是哪一本书。

现在随便一本书估计都好几百页,很厚很厚。就算你有足够的耐心一点一点啃掉它,等你学完也已经好长时间过去了,绝大部分想学习c语言的新手都在这里被劝退了。

c语言也只是一种工具,最重要的是先学会使用它。深入它的原理应该在有较为全面的认识后进行。就像电脑一样,使用它很愉快,但要是一开始就给你一本书,让你一点点了解它,再顺着计算机原理,如何开机,如何登陆,如何使用鼠标这样的路线开始,估计就没那么愉快了。

现在网络资源很多,随便找找资料,就能够知道如何搭建自己的编程环境,写一些简单的程序。能看到自己的程序运行,产生效果,才会有成就感,继续学下去,对不对。

等你感觉c语言也不过如此时,或者计划深入学习时,才是开始学习c语言细节的时候,这时你才能明白c语言为何如此,带着你之前的实践经验去学,才是收获最大的。

至于选择哪一本书,太简单了,现在随便一本畅销书都可以,都是差不多的。

入门,如果选书的话,应该选择简单易懂的书,最好薄一点,通常大学里面C语言教程都比较适合入门。一上来就《C Primer Plus》这些大部头是非常不建议的,这种书不建议通读,作为工具书反而比较合适。

学习一门语言应该是先从大体上对它有点认识,然后逐步深入。入门不要死扣细节钻牛角尖。

关键还是多练习,平时可以试想是否可以开发一些小工具来辅助工作和学习,培养程序员的思维方式。

当你能对基本语法熟悉的时候,可以阅读操作系统原理有关的书,毕竟C和操作系统是息息相关的,同时可以看看别人写的代码,自己试着调试,不明白的可以翻翻大部头或者网上搜索一下。

最后提醒,有些程序员喜欢用一些偏僻冷门的语法来表示自己的高深,请不要这样子做,第一,这样容易露怯,真正高手不需要这样的伎俩;第二,你的同事和上司会很不喜欢,这样的代码不易读,就不容易维护,甚至过了若干时间,你自己都不明白什么意思就尴尬了。高级编程语言能出现,其中一个原因就是为了避免晦涩难懂,简洁干净易懂的程序才是程序员应该写的。

设计C语言算法时,怎样才算合格?感觉算法好难,基于数组的归并排序算法该如何理解?

谢邀。

我的上个回答简要讨论了下什么是算法,并且介绍了C语言程序开发中比较基本的数组排序算法——插入排序法,如果题主看了,应该有助于理解本题。

事实上,让C语言编程具有魅力的是算法,拿到问题,能够设计出解决方案并且完成代码的是程序员,只会按照步骤编码的是码农。

这是上个回答的主题,有朋友看到也有感而发:在评论区说,“程序是骨架,算法才是灵魂”。的确,C语言程序只是指令,计算机只会冷冰冰的按照指令办事,它并不能解决问题,真正解决问题的还是人。

什么样的算法才是好的算法呢?假设计算机是无限快的,并且存储器是免费的无限大的,那最好的算法就是最容易实现的算法。

然而,计算机也许是快的,但它们不是无限快。存储器也许是廉价的,但不是免费的。所以计算时间是一种有限资源,存储器的空间也一样。优秀的程序员应该尽力设计出开销更小的算法。

下面再讨论下C语言程序开发中,数组的归并排序算法,这种算法也是比较经典的排序法,在数组元素非常多的情况下,效率远远高于插入排序法。

什么是归并排序呢?归并排序的定义,希望了解“一本正经”的官方书面定义可以自行百科。这里就不写了,因为“冷冰冰的”书面定义对不了解它的人来说太难懂。

我打算用一些容易理解的例子来解释它。假设有一个C语言数组需要排序,那数组长度为多长最简单呢?显然是长度为 1 时,排序最简单,什么都不需要做,就能够排好序。

归并排序的基本思路就是这样:把长数组一直拆分下去,直到最后不能拆分为止,这时长数组被拆分为若干个长度为 1 的数组,长度为 1 的数组显然是排好序的了。

例如下图是一个长度为 5 的数组,为了排序,先把它拆分到不能继续拆为止。

接着,只要把这些排好序的子数组按照从小到大的顺序合并,就可以得到最终排好序的数组了。

好了,现在知道归并排序的算法了,那怎样使用 C语言编程完成这个算法呢?

使用C语言编程实现归并排序算法归并排序算法总体可以分为两步:拆分数组,合并数组。先来看看怎样使用C语言实现数组的拆分。

使用C语言拆分数组对数组拆分有多种方法,这里选择平分法。

如果使用 start 表示数组头,end 表示数组尾,每次平均拆分,都会将数组分为 start 到 mid,和 mid+1 到 end 两部分,其中 mid 表示中间点,所以 mid = (start+end)/2。就这样一直拆分下去,直到不能继续拆分为止。

不能拆分时,start 应该不再小于 end。拆分数组的数学描述完毕了,容易看出,递归(如果题主对C语言的递归不理解,可以查看我之前的问答或者文章。)非常适合解决这样的问题。我们现在用C语言来实现这样的拆分,先确定递归的基础条件:

拆分过程会在 start 不再小于 end 时停下。其他情况时,拆分会继续下去,相关C语言代码如下,请看:

divide(start, mid); 负责拆分前半段,divide(mid+1, end); 负责拆分后半段。这样的 divide 函数可以把数组拆分到不可拆分为止。

使用C语言合并数组使用 divide 函数把数组拆分完毕后,就可以按照从小到大的顺序把各个元素合并到原来的数组了。

由于两个子序列都已经排好序了,所以 merge() 函数的C语言代码很简单,每次循环取两个子序列中最小的元素进行比较,将较小的元素取出放到最终的排序序列中,如果其中一个子序列的元素已取完,就把另一个子序列剩下的元素都放到最终的排序序列中。

使用C语言实现数组的归并排序数组的拆分和合并函数都写好了,可以把它俩结合起来,实现数组的排序了。

测试C语言实现的归并排序这里使用 8 个元素的数组做测试:

编译并执行这段C语言代码,发现数组被成功排序了。

到这里,相信题主应该明白如何使用C语言实现数组的归并排序了。它和插入排序算法都属于排序算法,但是二者的效率差异性却很大。

程序员一般如何衡量算法的效率呢?数组的插入排序法和归并排序法的效率差异性到底有多大呢?我之前的文章已经比较详细的讨论过,题主可以点击我的主页查看。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

学习算法是有基础要求的,尤其是一些复杂的算法,比如:离散数学,数理逻辑,数据结构等,所以学习算法肯定会觉得难。算法的好坏评估标准通俗的讲就是效率高低,不仅包括时间效率,还包括空间效率。算法学习建议先学习一些简单的,再逐步深入。

相关推荐

怎样把几张照片拼成一个长图

网页设计 2024-01-17

网页图片设计要点有哪些?

网页设计 2023-12-22

如何建立一个学校的表白墙?

网页设计 2023-11-23