我现在才开始玩2048游戏在线玩,是不是落伍了

2048作者自述:我的游戏为什么会火_新浪教育_新浪网
2048作者自述:我的游戏为什么会火
  Gabriele Cirulli 今年 20 岁,目前居住在意大利,自学了 UI 设计和网页开发。他最先将 2048 的开源版本放到 Github 上,由此引发了风靡全球的狂潮,各种衍生版本层出不穷。更多信息可以访问他的个人博客、Github 和 Twitter。  来源:伯乐在线
  翻译:菜鸟浮出水
  前几周对我来说是一个漫长而疯狂的时间。三月份,我因为好玩,制作了一款叫 2048 的游戏,然后以开源的形式发布在 Github 上了。在接下来的几周时间里,它意外成为了世界范围内的热门话题,而且超过了两千三百万的人玩过了。
  这段时间是我生命中最激动人心的一段时间,同时也是压力最大的一段时间。知道你所创造的东西被数百万人玩到并且喜欢,这是一种非常棒的感觉。对于大多数人而言(包括我自己),这会带来继续创作新东西的动力。与此同时,当你创作的东西世界闻名的时候,你必须要面对一堆新的挑战。如果你从来没有面对过这样的压力,来自别人的关注和别人对你的期望会把你压垮。
  在这篇文章中,我会和你们分享我所经历的一切,以及我是如何处理它们的,既站在个人的角度也从专业的角度进行阐述。我也会解释到底是什么样的心路历程让我改变了我的想法而去制作这个游戏的手机版本。
  这是一篇很长的文章,但是我希望这篇文章能够带来一些有意义的想法,并且能够帮助那些可能要面对类似问题的人。
  一切是怎么开始的
  我利用周末的时间写了 2048 这个游戏,仅仅只是好玩而已。我以前被两个游戏所吸引,它们分别是 1024! 和 2048。这两个游戏我都喜欢玩,我想用一种不同的视觉展现效果和更快速的动画来创造我自己的版本,只是试试看自己行不行。在那个时候,我还不知道有款叫 Threes 的游戏,它是所有这类游戏的原型(包括 2048)。
  Asher Vollmer 和 Greg Wohlwend 作为 Threes 的开发者,已经证明了他们在开发这款游戏的时候投入了大量的时间和精力。就 Threes 的模仿者都大红大紫的现状,他们最近表达了他们的不平。我理解他们的感受,我也对他们在创造 Threes 中付出的努力和心血表示由衷的敬佩。2048 确实欠他们的。
  在制作 2048 的过程中,我决定把项目托管到 Github 上去,并且通过 Github 完成项目。由于这是一个大部分都基于别人工作的项目,所以我不想把它设为私有的项目。
  当我完成了这个游戏之后,我就通过 Github Pages 发布了它,并把它发表在 Designer News 上,仅仅只是为了看看大家反馈的效果而已。
  接下来的一天,我从朋友那里收到了一条消息,让我看看 Hacker News 的首页。有人把 2048 发布在那里了,而且现在被顶到了第一的位置。通过 Google Analytics 的报告可以知道,现在有上千人在 Hacker News 的网站上。我完全无法相信发生的这一切。
  尽管这就像互联网常见的爆炸新闻一样,来的快去的也快,我还是花了一整天的时间查看这条帖子的状态。看到关注数目持续上升使我非常兴奋,同时还有一点害怕。
  我完全被那些积极回应的评论震惊了。每个人都在谈论他们是如此的喜欢这款游戏,简直就停不下来,甚至在上班时间也在玩。
  接下来的几天
  我以为大家对 2048 的兴趣很快便会过去,但是接下来的几天,大家的热情始终如一。事实上,大家更加关注这个游戏了。从某种意义上来说,2048 不仅仅成为了 Hacker News 读者中的一个热门话题(它成为了 Hacker News 历史上被点赞次数排名第三的话题),它还在 Twitter,Facebook 甚至是在线下被广泛谈论。看到它渐渐成为一个全球范围的话题让我感到一点小小的不适。
  与此同时,我的收件箱开始被那些喜欢这个游戏的玩家的来信占满,也有一些开发者希望能够得到我的授权来开发手机应用赚钱。
  我面临的第一个问题就是我到底应该拿 2048 这个游戏怎么办,以及我该如何回复这些邮件。尽管 2048 对于我而言只是个小项目,而且我也没有对它寄予什么希望,我周围的人都建议我应该趁这个机会拿它好好赚一笔。
  就我个人来说,我不太喜欢要拿 2048 这款游戏来赚钱的想法,因为它毕竟是基于别人的游戏而来的。
  另外一个让我无比苦恼的是,为了专注于 2048 这款游戏,我必须要放弃我的其他项目。那时,我正在做一个 freelance 的项目,而专注于 2048 意味着我必须要停止那个项目或者是结束它。
  把 2048 做成手机游戏,那是我不熟悉的一个领域,即使如此,我也必须要足够快,这样才能成为第一款 2048 的手游。这个想法吓到我了,因为这会让我跳出安逸的生活状态,而我对将要面对的问题一无所知。
  这两个原因在那几天里一直折磨着我。我觉得没有任何可以摆脱这种痛苦的途径,任何我做的决定都会让我陷入麻烦。
  一方面,我可以抓住这个机会(而且这个机会看起来会是一生中唯一的一次)并且获得回报,代价是误导玩家,让他们分不清到底哪个游戏才是最初的创意。
  另一方面,我可以什么都不做继续我的生活。而我知道,事后当别人告诉我,我错过了这个机会的时候,我一定会后悔。
  最终,我说服了自己,我决定什么都不做,因为我认为这是结束我所面临的压力的唯一办法。我决定让游戏继续开源,而且我不会做手机版。
  在做了那个决定之后,我立马就感觉舒服多了。这使我觉得我做了一个正确的决定,我不会后悔了。
  回到原点
  在接下来的几天里,我依然觉得轻松。
  那段时间,游戏的手机版本已经出来了。这些手机版中很多甚至都没有经过我的同意,或者其他参考的游戏的开发者的同意,当然其中的一些也指出了是模仿我的游戏。在看了 Threes 开发者们对此的反应后,我觉得不是由我导致的这一切,真好,当初那个决定果然是正确的。
  我周围的很多人并不这么认为。我的朋友和家人认为我的决定糟糕透顶,但是同时我认为我只是丢掉了一个我不会想拥有第二次的机会罢了。
  最初,他们的意见不会烦到我。我知道,我选择的这种方式摆脱了之前遇到的压力,而且在我的考虑中,这比金钱或者名声要重要的多。
  但是这种感觉没有持续太长时间。几天之后,那些我认为我已经成功摆脱掉的问题都卷土重来了,甚至比以前还要严重。我开始后悔浪费掉了这个机会,而且我感觉的到,我的行为让我周围的人失望了。更让我感到糟糕的是,被别人制作的 2048 游戏登上了 AppStore 的榜首。
  一线希望
  我已经被我的状况搞到发狂了,但我还是有理由快乐起来。
  即使有的人不在乎拿别人的劳动成果去赚钱,在开源社区依然有很多有创造力的人在乎游戏从何而来。他们只想让游戏变得更好,甚至是把它带到一个全新的高度。
  看到数不清的各种版本的 2048 游戏的出现让我感到开心多了。我非常愉快的玩各种各样的版本,开心的看着他们能够创造出什么奇特的游戏。
  人们充满激情的翻版这个游戏,把它做成各种完全不同的版本。发现别的人在努力的把你创造的东西发扬光大是一件幸福的事情,特别是你的作品能带给人们快乐,而你又享受这种感觉。
  改变主意
  感谢我的家人和朋友做出的努力,我意识到,唯一的办法,让我不觉得我失去了一个机会就是去接受它,去创造一个手机应用。我不会为了钱而做这件事情。事实上,钱也对我并不重要。真正重要的是我没有浪费一个机会,无论最后的结果是成功或是失败。
  人们会这么想我呢?在每一次采访中,我都说,因为道德的原因,我不会从游戏中赚取一分钱。我认为,如果我改变了我的主意,我会被认为是伪君子,而我确实不想成为那种人。
  最难受的是,这个决定会让那些对我寄予期望的人感到背叛。毕竟,我改变了我的主意,并做了一件我已经说过绝对不做的事情。这让我难受了好几天,但是最后让我接受这一切的是我知道,我不是为了钱而改变自己的想法。我选择去做是为了不让我在接下来的日子里感到错过了一个机会。
  由于我的决定,那些把我以前说的话放在心上,并且钦佩我所做出的决定的人们很可能会感到被骗了。这也是我写这篇文章的理由之一:我想给我如此矛盾的选择做一个解释,这个选择是在什么样特殊的情况下做出的。
  但愿我做这个决定的前因后果可以解释我的行为。如果不行,我希望至少能够帮助别人了解到这一切是怎么来的。
  开发应用
  我仍然认为保持游戏的原样仅仅只是把它打包成一个应用是不好的。2048 本来就不是我的游戏。相反,它是属于那些相信它的无数的贡献者们,我没有权利把它拿来己用。如果我想要这个决定看起来合理,那么我必须认真考虑如何创造这个应用。
  最后,它花了我一个整个月的时间来开发,从最初的一点点开始到最后的细心打磨,精益求精。
  作为一个 web 开发者,而且没有任何的手机开发经验,我无法一开始就做一个各方面都正规的 iOS 或者 Android 应用。所以,我决定使用 Phonegap。Phonegap 允许你使用 HTML,CSS 和 JavaScript 像 web 开发一样来构建一个手机应用。
  使用 Phonegap 的问题是,如果你想要构建一个看起来像样的应用,你就要花很大的功夫。幸运的是,我想制作的是一个游戏,这意味着我不需要非常仔细的考虑不同操作系统上的界面效果。
  我想要这个应用拥有一个菜单,因为在应用启动的时候直接把玩家放进游戏里不是一个非常好的体验。一个菜单同样也可以让我介绍新的游戏模式,这会给游戏添彩的。
  我想要游戏逻辑是通用的,这样能够在创建一个新的游戏模式时,只需要定义一个对象,然后用类似“hook”的方式插入到游戏核心里去,并且可以非常容易的修改表现行为。
  我最终从头开始一点点的构建这个应用的核心。我从开源的 2048 版本里保留的唯一的代码是移动图块的代码,这能够给玩家带来原汁原味的体验。由于这个应用的代码目前是闭源的(但是我也许会在未来把它开源了),所以如果我使用了别人贡献的代码就不公平了。
  代码库最后发现比 web 版本的要大 3 倍,大部分的代码都是全新的。
  在构建这个应用的过程中,我发现了很多提高和精简代码和接口的方式。我非常想要把这些优化提进开源的 2048 版本里。我也想要重构开源 2048 的代码,使它成为开源社区的一笔财富。
  如果你对我最后实现的游戏感兴趣的话,你可以下载 iOS 和 Android. 版本进行体验。我希望你会喜欢它。
  但愿这篇文章能够给你们带来关于 2048 火爆背后的一些有意义的新观点,即使我处理这种状况的方式也许不是最佳的方式。
  我所做出的大部分选择是基于我自己的感受来的,并且目的是为了解决自己的问题,而非是从项目中获得什么。
  我希望这篇文章能够合理的解释我是如何又是为什么做出每一个决定的,并希望能够帮助任何遇到这些问题的人,让他们能够明白所要面对的到底是什么。
  特别说明:由于各方面情况的不断调整与变化,新浪网所提供的所有考试信息仅供参考,敬请考生以权威部门公布的正式信息为准。
文章关键词:
&&|&&&&|&&&&|&&
您可通过新浪首页顶部 “”, 查看所有收藏过的文章。
所高校高招分数线信息)
教育部直属
你所在省市
<option value="年
<option value="年
<option value="年
<option value="年
<option value="年
<option value="年
<option value="年
<option value="年
<option value="年
本科提前批
<option value="
<option value="
<option value="
<option value="
<option value="
<option value="
<option value="
<option value="
请用微博账号,推荐效果更好!
看过本文的人还看过&p&刚刚用 Python 秋招完的小应届来回答一下。&/p&&p&&br&&/p&&p&秋招的时候 Python 的岗位确实不多,尤其是像 BAT 这样的一线公司,基本上 Python 岗位都是运维开发和测试开发。二三线互联网还是有不少 Python 岗位的,例如饿了么、爱奇艺、头条等,而且因为投的人不多,所以竞争力比较小。&/p&&p&&br&&/p&&p&但是只会 Python 肯定是不行的,面试的过程中基本上没有问过 Python 语言的相关东西,如果是面的后端开发,可能会问一下用的后端框架的源码,然后就是各种 CS 的基础知识:算法与数据结构、操作系统、计算机网络、数据库,这些问得比较多,然后就是简历中的项目了。&/p&&p&&br&&/p&&p&除了 Python 外,最好还要懂一门静态语言(Java/C++),一门函数式语言(Haskell/Lisp/Scala),大厂的面试其实对语言的要求不是很高,比如面过某 C++ 岗位,全程算法都是用 Python 写的,还和面试官讨论了一下 range() 为什么设计成左闭右开的形式。&/p&&p&&br&&/p&&p&想要用 Python 找到一份好工作(后端方向),可以给一点小小的建议:&/p&&ol&&li&科班出身的话,各种基本知识应该是没问题的,不是科班的话可能这一块需要补一补(* 为备选);&/li&&ol&&li&算法&数据结构:《算法》、*《算法导论》(搭配 MIT 6.006 食用更加)&/li&&li&操作系统&计算机组成原理:《深入理解计算机系统》&/li&&li&计算机网络:《自顶向下方法》、*《TCP/IP 协议(卷一)》、《UNIX 网络编程(卷一)》(强烈推荐,基本上和网络相关的比较难的一些问题这本书都有讲,可以挑一部分看)&/li&&li&编译原理:这个我没具体看书,直接写了几个解释器然后了解了个大概,书的话好像有《30天自制编译器》比较浅显易懂&/li&&li&数据库:《MySQL 必知必会》、《高性能 MySQL》(从此各种数据库优化面试题手到擒来)&/li&&li&Linux:《鸟哥的私房菜》、*《Linux 命令行与 Shell 脚本编程大全》&/li&&li&和面试官扯淡:《程序员修炼之道——从小工到专家》&/li&&/ol&&li&Python 语法虽然很简单,但是要看的东西其实很多&/li&&ol&&li&基本的语法看官方的 Tutorials 就可以了,Python 2 和 Python 3 都要会,之间的一些主要的区别要知道&/li&&li&学会了语法可以看《Python Cookbook》、《Fluent Python》,这两本书相当于进阶的书,学完功力 double,当然可能看一遍是不能完全吸收的,以后可以用到的时候再回去刷一下&/li&&li&看完上面两本书并刷过一些代码之后应该对 Python 的一些常用标准库比较熟悉了,然后可以开始系统看一下标准库(慢慢刷吧,这是个大工程)&/li&&li&熟悉某一个后端框架,我选的是 Flask,因为比较简单,代码也不多,花一点时间把源代码看懂,知道一个 Flask app 从头到尾的运行过程,有时间可以自己写一个 web framework,实现基本的路由和 context 功能,当然还有 bottle 更简单,原理大同小异,读一下 &a href=&//link.zhihu.com/?target=https%3A//www.python.org/dev/peps/pep-3333/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PEP 3333 -- Python Web Server Gateway Interface v1.0.1&/a&&/li&&/ol&&li&一般科班出身的在学 Python 前肯定会 Java/C++,这一部分也有很多的推荐,就不说了&/li&&li&其实面试过程中会问很多项目和设计类的问题,这种东西只能慢慢学习了,平时可以刷一刷 PyCon、各种博客、演讲之类的来提高姿势,YouTube 上有很多这种资源&/li&&/ol&&p&&br&&/p&&p&可以看到,要真的把上面所有的东西都学完不是一两个月能搞定的,这还不包括准备项目的时间。如果真的能学得不错了(70%)的样子,应该拿个一线二线大厂的 offer 还是没问题的。&/p&
刚刚用 Python 秋招完的小应届来回答一下。 秋招的时候 Python 的岗位确实不多,尤其是像 BAT 这样的一线公司,基本上 Python 岗位都是运维开发和测试开发。二三线互联网还是有不少 Python 岗位的,例如饿了么、爱奇艺、头条等,而且因为投的人不多,所以竞…
&p&当然是:《计算机网络》、《计算机组成原理》、《计算机操作系统》、《数据结构》。&/p&&p&接下来,请听我对他们之间存在的联系的解释:&/p&&p&计算机系统是由硬件和软件两部分组成,《计算机组成原理》讲述的是计算机的硬件组成原理,《操作系统》讲述的是配置在计算机硬件上的第一层软件,而《计算机组成原理》和《操作系统》就组成了一台PC机,而《计算机网络》则是实现了一台台独立的PC机之间的联系,实现了PC机之间的数据共享,而计算机的最终任务就是数据的处理,而处理的这些数据有不同的《数据结构与算法》,不同的《数据结构与算法》决定了计算机处理数据的效率。他们就组成了计算机技术中最核心最基础的知识。&/p&
当然是:《计算机网络》、《计算机组成原理》、《计算机操作系统》、《数据结构》。接下来,请听我对他们之间存在的联系的解释:计算机系统是由硬件和软件两部分组成,《计算机组成原理》讲述的是计算机的硬件组成原理,《操作系统》讲述的是配置在计算机硬…
&figure&&img src=&https://pic2.zhimg.com/v2-d4e04b4c0f655cd137e601cb47afa81c_b.jpg& data-rawwidth=&638& data-rawheight=&335& class=&origin_image zh-lightbox-thumb& width=&638& data-original=&https://pic2.zhimg.com/v2-d4e04b4c0f655cd137e601cb47afa81c_r.jpg&&&/figure&&p&&b&问:1 如何查看当前的Linux服务器的运行级别?&/b&&br&&br&答: ‘who -r’ 和 ‘runlevel’ 命令可以用来查看当前的Linux服务器的运行级别。&br&&br&&b&问:2 如何查看Linux的默认网关?&/b&&br&&br&答: 用 “route -n” 和 “netstat -nr” 命令,我们可以查看默认网关。除了默认的网关信息,这两个命令还可以显示当前的路由表。&br&&br&&b&问:3 如何在Linux上重建初始化内存盘镜像文件?&/b&&br&&br&答: 在CentOS 5.X / RHEL 5.X中,可以用mkinitrd命令来创建初始化内存盘文件,举例如下:&br&&/p&&blockquote&# mkinitrd -f -v /boot/initrd-$(uname -r).img $(uname -r)&/blockquote&&p&如果你想要给特定的内核版本创建初始化内存盘,你就用所需的内核名替换掉 ‘uname -r’ 。&br&&br&在CentOS 6.X / RHEL 6.X中,则用dracut命令来创建初始化内存盘文件,举例如下:&/p&&blockquote&# dracut -f&/blockquote&&p&以上命令能给当前的系统版本创建初始化内存盘,给特定的内核版本重建初始化内存盘文件则使用以下命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# dracut -f initramfs-2.x.xx-xx.el6.x86_64.img 2.x.xx-xx.el6.x86_64
&/code&&/pre&&/div&&p&&b&问:4 cpio命令是什么?&/b&&br&&br&答: cpio就是复制入和复制出的意思。cpio可以向一个归档文件(或单个文件)复制文件、列表,还可以从中提取文件。&br&&br&&b&问:5 patch命令是什么?如何使用?&/b&&br&&br&答: 顾名思义,patch命令就是用来将修改(或补丁)写进文本文件里。patch命令通常是接收diff的输出并把文件的旧版本转换为新版本。举个例子,Linux内核源代码由百万行代码文件构成,所以无论何时,任何代码贡献者贡献出代码,只需发送改动的部分而不是整个源代码,然后接收者用patch命令将改动写进原始的源代码里。&br&&br&创建一个diff文件给patch使用,&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# diff -Naur old_file new_file & diff_file
&/code&&/pre&&/div&&p&旧文件和新文件要么都是单个的文件要么都是包含文件的目录,-r参数支持目录树递归。&br&&br&一旦diff文件创建好,我们就能在旧的文件上打上补丁,把它变成新文件:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# patch & diff_file
&/code&&/pre&&/div&&p&&b&问:6 aspell有什么用 ?&/b&&br&&br&答: 顾名思义,aspell就是Linux操作系统上的一款交互式拼写检查器。aspell命令继任了更早的一个名为ispell的程序,并且作为一款免费替代品 ,最重要的是它非常好用。当aspell程序主要被其它一些需要拼写检查能力的程序所使用的时候,在命令行中作为一个独立运行的工具的它也能十分有效。&br&&br&&b&问:7 如何从命令行查看域SPF记录?&/b&&br&&br&答: 我们可以用dig命令来查看域SPF记录。举例如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&linuxtechi@localhost:~$ dig -t TXT google.com
&/code&&/pre&&/div&&p&&b&问:8 如何识别Linux系统中指定文件(/etc/fstab)的关联包?&/b&&br&&br&答:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# rpm -qf /etc/fstab
&/code&&/pre&&/div&&p&以上命令能列出提供“/etc/fstab”这个文件的包。&br&&br&&b&问:9 哪条命令用来查看bond0的状态?&/b&&br&&br&答:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&cat /proc/net/bonding/bond0
&/code&&/pre&&/div&&p&&b&问:10 Linux系统中的/proc文件系统有什么用?&/b&&br&&br&答: /proc文件系统是一个基于内存的文件系统,其维护着关于当前正在运行的内核状态信息,其中包括CPU、内存、分区划分、I/O地址、直接内存访问通道和正在运行的进程。这个文件系统所代表的并不是各种实际存储信息的文件,它们指向的是内存里的信息。/proc文件系统是由系统自动维护的。&br&&br&&b&问:11 如何在/usr目录下找出大小超过10MB的文件?&/b&&br&&br&答:&/p&&blockquote&# find /usr -size +10M&/blockquote&&p&&b&问:12 如何在/home目录下找出120天之前被修改过的文件?&br&&/b&&br&答:&/p&&blockquote&# find /home -mtime +120&/blockquote&&p&&b&问:13 如何在/var目录下找出90天之内未被访问过的文件?&/b&&br&&br&答:&/p&&blockquote&# find /var ! -atime -90&/blockquote&&p&&b&问:14 在整个目录树下查找文件“core”,如发现则无需提示直接删除它们。&/b&&br&&br&答:&/p&&blockquote&# find / -name core -exec rm {} ;&/blockquote&&p&&b&问:15 strings命令有什么作用?&/b&&br&&br&答: strings命令用来提取和显示非文本文件中的文本字符串。(LCTT 译注:当用来分析你系统上莫名其妙出现的二进制程序时,可以从中找到可疑的文件访问,对于追查入侵有用处)&br&&br&&b&问:16 tee 过滤器有什么作用 ?&/b&&br&&br&答: tee 过滤器用来向多个目标发送输出内容。如果用于管道的话,它可以将输出复制一份到一个文件,并复制另外一份到屏幕上(或一些其它程序)。&/p&&blockquote&linuxtechi@localhost:~$ ll /etc | nl | tee /tmp/ll.out&/blockquote&&p&在以上例子中,从ll输出可以捕获到 /tmp/ll.out 文件中,并且同样在屏幕上显示了出来。&br&&br&&b&问:17 export PS1 = ”$LOGNAME@hostname:$PWD: 这条命令是在做什么?&/b&&br&&br&答: 这条export命令会更改登录提示符来显示用户名、本机名和当前工作目录。&br&&br&&b&问:18 ll | awk ‘{print $3,”owns”,$9}’ 这条命令是在做什么?&/b&&br&&br&答: 这条ll命令会显示这些文件的文件名和它们的拥有者。&br&&br&&b&问:19 :Linux中的at命令有什么用?&/b&&br&&br&答: at命令用来安排一个程序在未来的做一次一次性执行。所有提交的任务都被放在 /var/spool/at 目录下并且到了执行时间的时候通过atd守护进程来执行。&br&&br&&b&问:20 linux中lspci命令的作用是什么?&/b&&br&&br&答: lspci命令用来显示你的系统上PCI总线和附加设备的信息。指定-v,-vv或-vvv来获取越来越详细的输出,加上-r参数的话,命令的输出则会更具有易读性。&/p&&p&&br&&/p&&p&原文出处: Pradeep Kumar
&/p&&p&译文出处:Linux中国 - ZTinoZ&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//linux.cn/article-4790-1.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&linux.cn/article-4790-1&/span&&span class=&invisible&&.html&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&b&——————————————————————&/b&&/p&&p&你想更深入了解学习Linux知识体系,你可以看一下我们花费了一个多月整理了上百小时的几百个知识点体系内容:&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.magedu.com/74163.html/%3Flinux_wenzhang_zhihu_xiujiang_linuxgaoxinxunlianying_& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【超全整理】《Linux云计算从入门到精通》系列实战笔记全放送&/a&&/p&&p&为了方便大家学习,我建立了一个Python交流群,目前群内已经有2000多个小伙伴,学习寂寞的小伙伴不妨一起来玩~群号:&/p&&p&&/p&
问:1 如何查看当前的Linux服务器的运行级别? 答: ‘who -r’ 和 ‘runlevel’ 命令可以用来查看当前的Linux服务器的运行级别。 问:2 如何查看Linux的默认网关? 答: 用 “route -n” 和 “netstat -nr” 命令,我们可以查看默认网关。除了默认的网关信息,…
&figure&&img src=&https://pic3.zhimg.com/v2-139b196aed9b50ba1eea931_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic3.zhimg.com/v2-139b196aed9b50ba1eea931_r.jpg&&&/figure&&p&&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&实验楼&/a&上有很多C++的实战项目,从简单到进阶,学习每个项目都可以掌握相应的知识点。&/p&&ul&&li&如果你还是C++新手的话,那么这个C++的项目列表你可以拿去练手实战开发,毕竟学编程动手实践是少不了的!&/li&&li&如果你不知道C++可以用来做哪些项目,可以应用在哪些地方,那么,这个项目列表拿去吧,可以看看C++可以做什么!&/li&&/ul&&p&&b&C++项目列表:&/b&&/p&&h2&&b&1、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/558& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 实现太阳系行星系统&/a&&/b&&/h2&&p&项目使用 C++实现 OpenGL GLUT 实现一个简单的太阳系行星系统,将涉及一些三维图形技术的数学基础、OpenGL 里的三维坐标系、OpenGL 里的光照模型、GLUT 的键盘事件处理。&/p&&p&&b&项目涉及的知识点:&/b&&/p&&ul&&li&C++ 语言基础&/li&&li&基本的 Makefile&/li&&li&基本的 OOP 编程思想&/li&&li&OpenGL GLUT 的结构基本使用&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/v2-1a999ce605ac_b.png& data-rawwidth=&1000& data-rawheight=&805& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&https://pic2.zhimg.com/v2-1a999ce605ac_r.jpg&&&/figure&&h2&&b&2、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/560& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++实现运动目标的追踪&/a&&/b&&/h2&&p&这个项目是在前面一个项目的后续项目,利用 OpenCV 来实现对视频中动态物体的追踪。&/p&&p&&b&项目涉及的知识点:&/b&&/p&&ul&&li&C++ 语言基础&/li&&li&g++ 的使用&/li&&li&图像基础&/li&&li&OpenCV 在图像及视频中的应用&/li&&li&Meanshift 和 Camshift 算法&/li&&/ul&&p&本次实验要实现的效果是追踪太阳系中运动的行星(图中选择了浅绿颜色轨道上的土星,可以看到追踪的目标被红色的椭圆圈住):&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ae535d4c3e21d0ad3766219_b.png& data-rawwidth=&1000& data-rawheight=&864& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&https://pic2.zhimg.com/v2-ae535d4c3e21d0ad3766219_r.jpg&&&/figure&&h2&&b&3、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/557& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 实现银行排队服务模拟&/a&&/b&&/h2&&p&项目使用 C++对银行排队服务进行模拟,以事件驱动为核心思想,手动实现模板链式队列、随机数产生器等内容,进而学习概率编程等知识。作为可选进阶,这个模型同时还能稍加修改的应用到 CPU 资源争夺模型中。&/p&&p&&b&项目涉及知识点:&/b&&/p&&ul&&li&OOP 编程思想&/li&&li&std::rand() 函数原理&/li&&li&概率编程&/li&&li&排队理论&/li&&li&链式队列数据结构及其模板实现&/li&&li&事件驱动的设计&/li&&li&蒙特卡洛方法&/li&&li&CPU 资源争夺模型&/li&&li&时间片轮转调度&/li&&/ul&&p&让我们的程序能够给出类似下面的结果:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-108e5ce75f014ef9248f24_b.png& data-rawwidth=&976& data-rawheight=&520& class=&origin_image zh-lightbox-thumb& width=&976& data-original=&https://pic1.zhimg.com/v2-108e5ce75f014ef9248f24_r.jpg&&&/figure&&h2&&b&4、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/545& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&1小时入门增强现实技术&/a&&/b&&/h2&&p&项目利用C++,基于OpenCV实现一个将3D模型显示在现实中的小例子,学习基于Marker的AR技术。&/p&&p&&b&项目涉及知识点:&/b&&/p&&ul&&li&C++ 语言基础语法&/li&&li&AR 基本概念&/li&&li&基于 Marker 的 AR 技术&/li&&li&OpenCV 程序开发&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/v2-5b1f36077cccfe_b.png& data-rawwidth=&763& data-rawheight=&501& class=&origin_image zh-lightbox-thumb& width=&763& data-original=&https://pic3.zhimg.com/v2-5b1f36077cccfe_r.jpg&&&/figure&&p&一个踩着魔鬼的步伐的漆黑的食人魔&/p&&h2&&b&5、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/565& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&100 行 C++ 代码实现线程池&/a&&/b&&/h2&&p&为了追求性能,在服务器开发中我们经常要面临大量线程任务之间的调度和管理,该项目使用 C++ 及大量 C++11新特性设计并实现一个线程池库。&/p&&p&&b&项目涉及知识点:&/b&&/p&&ul&&li&C++11 标准库特性&/li&&li&C++11 语言特性&/li&&ul&&li&Lambda 表达式&/li&&li&尾置返回类型&/li&&/ul&&li&线程池模型&/li&&li&测试驱动开发思想&/li&&/ul&&p&编译代码并执行,一个可能的结果会向下面这样(显然,你的结果几乎不可能和这里的结果完全一样):&/p&&figure&&img src=&https://pic4.zhimg.com/v2-0c44da28c4b86fd3c510448aed70ce23_b.png& data-rawwidth=&838& data-rawheight=&705& class=&origin_image zh-lightbox-thumb& width=&838& data-original=&https://pic4.zhimg.com/v2-0c44da28c4b86fd3c510448aed70ce23_r.jpg&&&/figure&&h2&&b&6、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/568& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 开发 Web 服务框架&/a&&/b&&/h2&&p&服务器开发中 Web 服务是一个基本的代码单元,将服务端的请求和响应部分的逻辑抽象出来形成框架,能够做到最高级别的框架级代码复用。项目将综合使用 C++11 及 Boost 中的 Asio 实现 HTTP 和 HTTPS 的服务器框架。&/p&&p&&b&项目涉及的知识点:&/b&&/p&&ul&&li&C++基本知识&/li&&ul&&li&面向对象&/li&&li&模板&/li&&li&命名空间&/li&&li&常用 IO 库&/li&&/ul&&li&C++11 相关&/li&&li&Boost Asio 相关&/li&&/ul&&p&过程截图一:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-72a29aa3c0a4fdf40455ac_b.png& data-rawwidth=&774& data-rawheight=&517& class=&origin_image zh-lightbox-thumb& width=&774& data-original=&https://pic1.zhimg.com/v2-72a29aa3c0a4fdf40455ac_r.jpg&&&/figure&&h2&&b&7、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/569& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 打造 Markdown 解析器&/a&&/b&&/h2&&p&Markdown 几乎成为了程序员编写文档的标配,Markdown 的相关语法简单,解析 Markdown 文本能够加深日后编写编译器中词法分析的理解,本项目将使用 C++ 实现 Markdown 解析器,并将解析的内容生成为 HTML。&/p&&p&&b&项目涉及知识点:&/b&&/p&&ul&&li&词法分析技术&/li&&li&语法树&/li&&li&DFS 深度优先搜索&/li&&li&C++11&/li&&li&使用指针进行字符流处理&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/v2-9a62f67f54d2b8ed5f61_b.png& data-rawwidth=&1068& data-rawheight=&923& class=&origin_image zh-lightbox-thumb& width=&1068& data-original=&https://pic2.zhimg.com/v2-9a62f67f54d2b8ed5f61_r.jpg&&&/figure&&h2&&b&8、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/566& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 实现高性能内存池&/a&&/b&&/h2&&p&在 C/C++ 中,内存管理是一个非常棘手的问题,我们在编写一个程序的时候几乎不可避免的要遇到内存的分配逻辑,这时候随之而来的有这样一些问题:是否有足够的内存可供分配? 分配失败了怎么办? 如何管理自身的内存使用情况? 等等一系列问题。&/p&&p&该项目实现一个内存池,并使用一个栈结构来测试我们的内存池提供的分配性能。最终,我们要实现的内存池在栈结构中的性能,要远高于使用 std::allocator 和 std::vector。&/p&&p&&b&项目涉及的知识点:&/b&&/p&&ul&&li&C++ 中的内存分配器 std::allocator&/li&&li&内存池技术&/li&&li&手动实现模板链式栈&/li&&li&链式栈和列表栈的性能比较&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/v2-2e80df6e3ced853be27dc3d8b76ec64e_b.png& data-rawwidth=&644& data-rawheight=&371& class=&origin_image zh-lightbox-thumb& width=&644& data-original=&https://pic3.zhimg.com/v2-2e80df6e3ced853be27dc3d8b76ec64e_r.jpg&&&/figure&&h2&&b&9、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/608& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 实现简易 Docker 容器&/a&&/b&&/h2&&p&Docker 的本质是使用 LXC 实现类似虚拟机的功能,进而节省的硬件资源提供给用户更多的计算资源。本项目将 C++ 与 Linux 的 Namespace 及 Control Group 技术相结合,实现一个简易 Docker 容器。&/p&&p&&b&项目涉及知识点:&/b&&/p&&ul&&li&Linux 相关知识&/li&&ul&&li&Namespace&/li&&li&Control Group&/li&&/ul&&li&Linux 系统调用&/li&&li&C++&/li&&ul&&li&namespace&/li&&li&lambda expression&/li&&li&C/C++ 混合编译&/li&&/ul&&/ul&&p&最后我们将为容器实现下面这些功能:&/p&&ul&&li&独立的文件系统&/li&&li&网络访问的支持&/li&&li&容器资源的限制&/li&&/ul&&figure&&img src=&https://pic4.zhimg.com/v2-0f21e6b738a873a1cbc9d47_b.png& data-rawwidth=&1045& data-rawheight=&907& class=&origin_image zh-lightbox-thumb& width=&1045& data-original=&https://pic4.zhimg.com/v2-0f21e6b738a873a1cbc9d47_r.jpg&&&/figure&&h2&&b&10、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/657& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 实现内存泄露检查器&/a&&/b&&/h2&&p&内存泄漏一直是 C++ 中比较令人头大的问题, 即便是很有经验的 C++程序员有时候也难免因为疏忽而写出导致内存泄漏的代码。除了基本的申请过的内存未释放外,还存在诸如异常分支导致的内存泄漏等等。本项目将使用 C++ 实现一个内存泄漏检查器。&/p&&p&&b&项目涉及的知识点:&/b&&/p&&ul&&li&new 操作符重载&/li&&li&__FILE__、__LINE__ 预定义宏&/li&&li&头文件中的静态变量&/li&&li&std::shared_ptr 智能指针&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/v2-01cdb2c711_b.png& data-rawwidth=&1240& data-rawheight=&596& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic2.zhimg.com/v2-01cdb2c711_r.jpg&&&/figure&&h2&&b&11、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/654& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 使用 Crypto++ 库实现常用的加密算法&/a&&/b&&/h2&&p&该项目利用 Cryto++库 对字符串进行 AES 加密和解密,RSA 加密和解密,生成 MD5 值。其中主要用到了 Crypto++ 库,这是开源的C++数据加密算法库,支持如下算法:RSA、MD5、DES、AES、SHA-256等等。&/p&&p&&b&该项目涉及知识点:&/b&&/p&&ul&&li&安装 Crypto++ 库并检验&/li&&li&学习 MD5 摘要算法&/li&&li&学习 AES 加密算法&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/v2-a23fe25bfa89eff36fa0aaa8fd1a75a6_b.png& data-rawwidth=&999& data-rawheight=&174& class=&origin_image zh-lightbox-thumb& width=&999& data-original=&https://pic3.zhimg.com/v2-a23fe25bfa89eff36fa0aaa8fd1a75a6_r.jpg&&&/figure&&h2&&b&12、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/658& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 实现高性能 RTTI 库&/a&&/b&&/h2&&p&RTTI 是运行时类型信息的英文缩写,C++ 本身提供了运行时类型检查的运算符 dynamic_cast 和 typeid,然而dynamic_cast 的效率其实并不理想,需要牺牲一定性能。本项目将手动实现一个高性能 RTTI 库。&/p&&p&&b&项目涉及的知识点:&/b&&/p&&ul&&li&运行时类型检查 dynamic_cast, typeid&/li&&li&显式类型转换 static_cast, const_cast, reinterpret_cast&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/v2-fcc1dcb69b16_b.png& data-rawwidth=&1240& data-rawheight=&1001& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&https://pic3.zhimg.com/v2-fcc1dcb69b16_r.jpg&&&/figure&&h2&&b&13、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/664& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&c++操作 redis 实现异步订阅和发布&/a&&/b&&/h2&&p&该项目操作 redis 实现异步订阅和发布,其中将介绍 redis 基础知识,在linux中安装和使用 redis ,常用的 hiredis API,并实现一个例程。&/p&&p&&b&该项目涉及知识点:&/b&&/p&&ul&&li&介绍 Redis 的基础知识&/li&&li&安装使用 Redis&/li&&li&安装 hiredis 库,并编写测试程序&/li&&li&发布订阅模式者模式介绍&/li&&li&编写发布者/订阅者相关模块&/li&&li&编写 makefile&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/v2-528efd69a055f77aa42e0d86d1d3d081_b.png& data-rawwidth=&942& data-rawheight=&438& class=&origin_image zh-lightbox-thumb& width=&942& data-original=&https://pic2.zhimg.com/v2-528efd69a055f77aa42e0d86d1d3d081_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-bb5aab5e8e_b.png& data-rawwidth=&979& data-rawheight=&238& class=&origin_image zh-lightbox-thumb& width=&979& data-original=&https://pic4.zhimg.com/v2-bb5aab5e8e_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-feca63f16c70b68171cfb83a956b671d_b.png& data-rawwidth=&982& data-rawheight=&297& class=&origin_image zh-lightbox-thumb& width=&982& data-original=&https://pic2.zhimg.com/v2-feca63f16c70b68171cfb83a956b671d_r.jpg&&&/figure&&h2&&b&14、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/693& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++ 实现基数树 radix tree&/a&&/b&&/h2&&p&对于长整型数据的映射,如何解决 Hash 冲突和 Hash 表大小的设计是一个很头疼的问题。radix 树就是针对这种稀疏的长整型数据查找,能快速且节省空间地完成映射。该项目就带你用C++实现基数树 radix tree。&/p&&p&&b&项目涉及知识点:&/b&&/p&&ul&&li&泛型&/li&&li&析构&/li&&li&运算符重载&/li&&li&双向链表&/li&&li&数据结构&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/v2-f752f705ffab82d4a8af640f3ae4bc5e_b.png& data-rawwidth=&946& data-rawheight=&352& class=&origin_image zh-lightbox-thumb& width=&946& data-original=&https://pic3.zhimg.com/v2-f752f705ffab82d4a8af640f3ae4bc5e_r.jpg&&&/figure&&h2&&b&15、&a href=&http://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/671& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&C++基于OpenCV实现实时监控和运动检测记录&/a&&/b&&/h2&&p&该项目使用C++和OpenCV提供的库函数,实现摄像头的实时监控功能,并通过监控画面的运动检测选择是否记录视频。监控人员可选择输出图像的模式以更容易的分辨监控中的异常情况。&/p&&p&&b&项目涉及知识点:&/b&&/p&&ul&&li&对摄像头数据的捕获&/li&&li&对捕获到的监控帧作背景处理&/li&&li&对监控视频做运动检测并记录视频&/li&&/ul&&p&以下几张分别是程序在不同显示模式下的显示情况,你可以通过切换-mog1,-mog2和-src来自己观察对应的效果。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-fb57ef9e9169d1cdb4fb7_b.png& data-rawwidth=&307& data-rawheight=&262& class=&content_image& width=&307&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-bce98fdb76ad97c2b3f9_b.png& data-rawwidth=&309& data-rawheight=&263& class=&content_image& width=&309&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-b7e6d0bf6b77c281c5fe4d1ee99fea4d_b.png& data-rawwidth=&308& data-rawheight=&260& class=&content_image& width=&308&&&/figure&&figure&&img src=&https://pic3.zhimg.com/v2-da942e674ab9dc37dfaa46e_b.png& data-rawwidth=&309& data-rawheight=&263& class=&content_image& width=&309&&&/figure&&figure&&img src=&https://pic3.zhimg.com/v2-a032dd757177cba007fe_b.png& data-rawwidth=&310& data-rawheight=&262& class=&content_image& width=&310&&&/figure&&p&&br&&/p&&p&以上介绍的15个项目都是用C++来实现的,所以,还在等什么?快去动手开发吧!&/p&
上有很多C++的实战项目,从简单到进阶,学习每个项目都可以掌握相应的知识点。如果你还是C++新手的话,那么这个C++的项目列表你可以拿去练手实战开发,毕竟学编程动手实践是少不了的!如果你不知道C++可以用来做哪些项目,可以应用在哪些地方,那么,…
&figure&&img src=&https://pic3.zhimg.com/v2-bcec84b91e3b9b14f8f94cac56f4093c_b.jpg& data-rawwidth=&1321& data-rawheight=&634& class=&origin_image zh-lightbox-thumb& width=&1321& data-original=&https://pic3.zhimg.com/v2-bcec84b91e3b9b14f8f94cac56f4093c_r.jpg&&&/figure&&p&如图:&/p&&p&&figure&&img src=&https://pic3.zhimg.com/v2-d3cd85be604e6aeea28f6_b.jpg& data-rawwidth=&798& data-rawheight=&876& class=&origin_image zh-lightbox-thumb& width=&798& data-original=&https://pic3.zhimg.com/v2-d3cd85be604e6aeea28f6_r.jpg&&&/figure&
安卓系统框架:一般分为4层 &/p&&p& 第一层:应用层(用来存放应用程序)&/p&&p& home
主界面&/p&&p& contacts
联系人&/p&&p& phone
打电话 &/p&&p& browser
浏览器 &/p&&p&第二层:应用程序框架层(用来支持应用层中软件的运行) &/p&&p& activity manager
活动管理器&/p&&p& Windows
窗口管理 &/p&&p& connect
内容提供器(实现文件的共享)&/p&&p& view system
视图系统 &/p&&p&package
包的管理(一个应用程序是一个包) &/p&&p& telephone
通话管理&/p&&p& resource
资源管理器 &/p&&p&location
定位管理 &/p&&p&notification
通知管理器 &/p&&p&第三层:安卓运行库层(系统运行库&安卓运行时环境) &/p&&p&系统库libraries&/p&&p& surface manager
界面管理 &/p&&p&media framework
多媒体框架 &/p&&p& SQLlite
小型数据库 &/p&&p&openGL|ES
3D图像&/p&&p& freetype
点阵合成矢量图&/p&&p& webkit
浏览器内核( 谷歌浏览器内核) &/p&&p& SGL
2D图像&/p&&p& SSL
通信服务&/p&&p& libc
C语言函数库 &/p&&p&安卓运行时环境 Android run time &/p&&p&core libraries
安卓开发核心库函数&/p&&p& dalvik virtual machine
--dalvik虚拟机&/p&&p& 第四层:Linux内核---Linux Kernel(提供各种驱动程序)&/p&&p& display driver
显卡驱动 &/p&&p&camera driver
相机驱动 &/p&&p& flash memory
内存卡/闪存驱动&/p&&p& binder(IPC)
进程驱动 &/p&&p& keypad driver
键盘驱动&/p&&p& wifi driver
无线驱动 &/p&&p& audio driver
音频驱动&/p&&p& power
management
电源管理&/p&&p& Bluetooth
蓝牙驱动&/p&&p& usb driver
安卓系统框架:一般分为4层 第一层:应用层(用来存放应用程序) home
主界面 contacts
联系人 phone
打电话 browser
浏览器 第二层:应用程序框架层(用来支持应用层中软件的运行) activity manager
活动管理器 Windows
&figure&&img src=&https://pic1.zhimg.com/v2-36ef8ed7b85_b.jpg& data-rawwidth=&436& data-rawheight=&181& class=&origin_image zh-lightbox-thumb& width=&436& data-original=&https://pic1.zhimg.com/v2-36ef8ed7b85_r.jpg&&&/figure&&p&这几天我用C语言自己写了一个交互小程序。这个交互小程序,我精力主要是在友好性方面,美观方面,我实在没啥天赋。&/p&&p&文末会给大家推荐几本书,希望对需要的朋友有帮助。&/p&&p&这个交互小程序其实很简单,现在很多C语言实例项目,像什么学生管理系统、图书管理系统、通讯录等等”XXX管理系统“,大部分都可以套用这个交互小程序。&/p&&p&先给这个程序上个图吧,程序刚开始运行,首先是一个欢迎界面,如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-eabfba5cf000_b.jpg& data-rawwidth=&300& data-rawheight=&68& class=&content_image& width=&300&&&/figure&&p&这是一个非常简陋的,欢迎界面。&/p&&p&按照提示,用户按下“ENTER”键,就可以进入到菜单选择界面,界面如下:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-0e683e90ffaccddbb6133_b.jpg& data-rawwidth=&314& data-rawheight=&135& class=&content_image& width=&314&&&/figure&&p&按照菜单选择界面的提示,输入数字键0退出整个程序,输入数字键1,进入对应的功能模块function1,输入数字键2,进入对应的功能模块function2。比如,我输入数字键1,进入功能模块function1,如下图:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-4c4b4c5cfc4_b.jpg& data-rawwidth=&309& data-rawheight=&60& class=&content_image& width=&309&&&/figure&&p&界面嘛就这样了,美观上来说很简单,很丑陋。不过在友好性方面,背后的逻辑可不像UI看起来这么简单,本文就来分析这背后的逻辑。&/p&&p&&b&完整的代码下载路径:&/b&&a href=&https://link.zhihu.com/?target=http%3A//download.csdn.net/detail/kelehaier/9899803& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&一个用C语言实现的UI框架 - 下载频道 - CSDN.NET&/a&&/p&&h2&一、程序一览&/h2&&p&&b&1. 程序代码预览&/b&&/p&&p&这个小项目的代码文件不多,截图如下:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d8f0d02cc62c4a04ec31_b.jpg& data-rawwidth=&579& data-rawheight=&182& class=&origin_image zh-lightbox-thumb& width=&579& data-original=&https://pic4.zhimg.com/v2-d8f0d02cc62c4a04ec31_r.jpg&&&/figure&&p&
每个文件里的代码也不多,很简单,每个文件的用处大概介绍如下:&/p&&p&
1)main.c&/p&&p&
这个是入口函数文件,用于显示欢迎界面、菜单选择界面,并响应处理用户的输入,调起对应的功能模块;&/p&&p&
2)Common.h&/p&&p&
这里声明了一些公共函数,比如欢迎界面函数、菜单选择界面函数、提示函数等。这些都需要在main.c中用到。如果功能模块函数要使用一些公共的函数与变量,也可以在这个文件中声明。&/p&&p&
3)Common.c&/p&&p&
这里是Common.h文件里函数与变量的实现。&/p&&p&
4)function.h与function.c&/p&&p&
这是功能模块文件。每一个功能模块都有自己的头文件和实现文件。&/p&&p&&b&2.
逻辑结构&/b&&/p&&p&整个程序的逻辑结构也很简单,我画了一个示意图,如下:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-0f45a13ace05fb638baeb_b.jpg& data-rawwidth=&386& data-rawheight=&421& class=&content_image& width=&386&&&/figure&&p&&br&&/p&&p&我在图中也指出了,在这个交互程序上可以很方便地添加功能模块。最后,我会用一个示例来说明如何扩展这个程序。&/p&&p&二、技术点&/p&&p&&b&技术点1. 程序暂停&/b&&/p&&p&我在程序中,在几个地方使用&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&pause&&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&&p&来设置暂停点。&/p&&p&1) 在显示完欢迎界面后使用一次。当欢迎界面显示后,让用户能够看到欢迎信息,再由用户选择是否消失欢迎界面进入菜单选择界面;&/p&&p&2) 在switch语句中的每个case部分使用了一次。当每次运行完一个功能模块时,应该使得程序运行暂停,让用户看看功能模块的运行结果,再由用户按下Enter键返回菜单选择界面;&/p&&p&3) 在用户结束整个程序时使用了一次,让用户看到程序结束界面,再由用户按下Enter键结束程序。&/p&&p&上述设置这些暂停点纯粹是从用户体验出发的,同时也增强了与用户的交互性。&/p&&p&&b&技术点2. 清屏&/b&&/p&&p&我在程序中,有几个地方使用&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&&p&来清屏。&/p&&p&1) 在显示完欢迎界面后使用了一次,目的是用户想进入菜单选择界面了,那么就使得欢迎界面消失,为菜单选择界面腾出显示空间。当然,如果你觉得欢迎界面和菜单选择界面在一起显示更好看,你可以去掉清屏。&/p&&p&2) 在switch语句的每个case部分使用了一次。当一个功能模块运行结束后,应该清屏,腾出显示空间给下一个功能模块。因为下一个功能模块有可能有大量的信息需要显示,你上一个功能模块的输出就不要凑热闹了。&/p&&p&&b&技术点3. 用户输入异常处理&/b&&/p&&p&在程序中,理想状态下,用户按照我的设想输入数字0、1、2,但是实际中,用户总会由于无意或者故意输入不是数字的字符,或者输入不是我想要的数字,那么程序要能够处理这些异常的输入。在本程序中,我写了一个异常处理函数,如下:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&kt&&int&/span& &span class=&nf&&get_a_int&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&input&/span&&span class=&p&&;&/span&
&span class=&k&&while&/span&&span class=&p&&(&/span& &span class=&mi&&1&/span& &span class=&o&&!=&/span& &span class=&n&&scanf&/span&&span class=&p&&(&/span&&span class=&s&&&%d&&/span&&span class=&p&&,&/span& &span class=&o&&&&/span&&span class=&n&&input&/span&&span class=&p&&))&/span& &span class=&p&&{&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&&That is not a number. Please input a number again...&&/span&&span class=&p&&);&/span&
&span class=&n&&ClearBuffer&/span&&span class=&p&&();&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&n&&input&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&get_a_int函数是专门用来处理用户输入异常的。只要用户输入的不是一个数字,而是其他的乱七八糟的东西,我都会给出一行友好的提示”That is not a number. Please input a number again...“,然后给用户重新输入的机会,一直到用户输入的是数字为止。&/p&&p&&b&技术点4. 清除缓冲区&/b&&/p&&p&用户输入什么,你是不可控制的。也许他会按照你要求输入一个数字,也许他会乱输入一个什么其它的字符。虽然我使用了get_a_int函数确保用户输入的是一个数字,但是其它的非法输入还是留在缓冲区。我在get_a_int函数中加入如下函数:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&n&&ClearBuffer&/span&&span class=&p&&();&/span&
&/code&&/pre&&/div&&p&来及时清除掉脏数据。&/p&&p&我们看看,如果把这个函数去掉,会有哪些异常的现象。&/p&&p&在去掉ClearBuffer();之后,我们运行程序,我输入了一个字符'a',来看看运行结果如何,如下:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-36ef8ed7b85_b.jpg& data-rawwidth=&436& data-rawheight=&181& class=&origin_image zh-lightbox-thumb& width=&436& data-original=&https://pic1.zhimg.com/v2-36ef8ed7b85_r.jpg&&&/figure&&p&运行的时候,程序陷入一个无限循环了,用户根本没有机会再次输入。原因很简单,我输入了字符'a'之后,scanf函数会从缓冲区中读取这个字符'a',发现它不是一个数字,于是仍把字符'a'留在缓冲区中,并且继续执行while循环,于是再次从缓冲区中读入这个字符'a',再次留在缓冲区中。。。。。。就这样,读一次,留一次,读一次,留一次,就陷入了无限循环。&/p&&p&使用了ClearBuffer();之后,会从缓冲区中清除掉这个字符'a'以及换行符'\n',这样scanf就可以读取用户新的输入了。所以你看,清除缓冲区是多么的重要!&/p&&p&&b&技术点5. 返回菜单选择界面&/b&&/p&&p&我在程序的几个地方,用到了显示菜单界面的函数&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&n&&show_menu&/span&&span class=&p&&();&/span&
&/code&&/pre&&/div&&p&1) 一个是在程序刚运行时,出现欢迎界面之后;&/p&&p&2) 一个是在switch语句中的每个case部分里,这样每个功能模块运行结束之后,都可以立即回到菜单选择界面,与用户继续交互。&/p&&p&只要用户没有输入数字0,就不应该结束程序。&/p&&p&&b&技术点6. 结束程序&/b&&/p&&p&当用户输入数字0之后,程序会跳出while循环,也就是跳出与用户交互的菜单选择界面。此时程序会暂停下来,向用户显示友好的道别信息”Good Bye“,然后由用户按下Enter键结束程序。&/p&&p&本文原创,转载清注明作者和出处。&/p&&p&所以你看,别看一个简单交互程序,为了用户的友好性,背后确实有不少的复杂逻辑。上述的6个技术点是本程序的关键,也是本文想要重点表达的东西。朋友们在做其它的项目的时候,会遇到与上述6个技术点相似的技术。&/p&&h2&三、功能扩展示例&/h2&&p&你可以很方便的在这个程序上扩展你自己的功能模块。&/p&&p&现在这个结构已经有两个功能模块,一个是function1,它包含一个.h头文件”function1.h“,还包含一个.c实现文件”function1.c“;另一个是function2,它包含一个.h头文件”function2.h“,还包含一个.c实现文件”function2.c“。&/p&&p&原文出处:&a href=&https://zhuanlan.zhihu.com/p//& class=&internal&&知乎专栏&/a&&/p&&p&下面我用一个”学生管理系统“的例子来说明如何扩展这个结构。”学生管理系统“的源码网上有很多,也是很经典的C语言上手实例项目。我们假设学生管理系统有三个功能需要实现,如下:&br&&/p&&p&&b&1. ”学生“类型的定义;&/b&&/p&&p&&b&2. 添加一个学生;&/b&&/p&&p&&b&3. 删除一个学生;&/b&&/p&&p&现在针对这三个功能,我们在这个程序上来扩展。&br&&/p&&p&&b&1. 扩展”学生“类型的定义&/b&&/p&&p&我们可以增加一个.h头文件:student.h,文件内容如下:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&k&&typedef&/span& &span class=&k&&struct&/span& &span class=&n&&student&/span&&span class=&p&&{&/span&
&span class=&kt&&char&/span& &span class=&n&&name&/span&&span class=&p&&[&/span&&span class=&mi&&10&/span&&span class=&p&&];&/span&&span class=&c1&&//学生名&/span&
&span class=&kt&&char&/span& &span class=&n&&sex&/span&&span class=&p&&[&/span&&span class=&mi&&5&/span&&span class=&p&&];&/span&&span class=&c1&&//学生性别&/span&
&span class=&p&&}&/span& &span class=&n&&Stu&/span&&span class=&p&&;&/span&
&/code&&/pre&&/div&&p&&b&2. 扩展”添加学生“的功能模块&/b&&/p&&p&扩展这个功能模块时,需要添加.h头文件AddStu.h,以及一个.c文件AddStu.c。&/p&&p&在AddStu.h文件中,声明如下函数:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&k&&extern&/span& &span class=&kt&&void&/span& &span class=&nf&&AddStu&/span&&span class=&p&&();&/span&&span class=&c1&&//添加一个学生的函数&/span&
&/code&&/pre&&/div&&p&在AddStu.c文件中,实现如下函数:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&kt&&void&/span& &span class=&nf&&AddStu&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&&成功添加一个学生!&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&在菜单选择界面,添加一个”学生添加“选项&puts(& 3. add_stu&);&:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&kt&&void&/span& &span class=&nf&&show_menu&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&&======================================&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& Here is the choice
&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& 1. menu_one&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& 2. menu_two&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& 3. add_stu&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& 0. quit&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&在switch语句中,添加case语句3:调用”AddStu“的模块&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&k&&switch&/span&&span class=&p&&(&/span&&span class=&n&&input&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&case&/span& &span class=&mi&&1&/span&&span class=&o&&:&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&function1&/span&&span class=&p&&();&/span&
&span class=&n&&PauseAndTip&/span&&span class=&p&&();&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&show_menu&/span&&span class=&p&&();&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&mi&&2&/span&&span class=&o&&:&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&function2&/span&&span class=&p&&();&/span&
&span class=&n&&PauseAndTip&/span&&span class=&p&&();&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&show_menu&/span&&span class=&p&&();&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&mi&&3&/span&&span class=&o&&:&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&AddStu&/span&&span class=&p&&();&/span&
&span class=&n&&PauseAndTip&/span&&span class=&p&&();&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&show_menu&/span&&span class=&p&&();&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&default&/span&&span class=&o&&:&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&&b&3. 扩展”删除学生“的功能模块&/b&&/p&&p&扩展这个功能模块时,需要添加.h头文件DelStu.h,以及一个.c文件DelStu.c。&/p&&p&在DelStu.h文件中,声明如下函数:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&k&&extern&/span& &span class=&kt&&void&/span& &span class=&nf&&DelStu&/span&&span class=&p&&();&/span&&span class=&c1&&//删除一个学生&/span&
&/code&&/pre&&/div&&p&在DelStu.c文件中,实现如下函数:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&kt&&void&/span& &span class=&nf&&DelStu&/span&&span class=&p&&()&/span&
&span class=&p&&{&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&&删除一个学生成功&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&在菜单选择界面,添加一个”学生删除“选项&puts(& 4. del_stu&);&:&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&kt&&void&/span& &span class=&nf&&show_menu&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&&======================================&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& Here is the choice
&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& 1. menu_one&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& 2. menu_two&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& 3. add_stu&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& 4. del_stu&&/span&&span class=&p&&);&/span&
&span class=&n&&puts&/span&&span class=&p&&(&/span&&span class=&s&&& 0. quit&&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&在switch语句中,添加一个case语句4:调用”DelStu“的模块&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span&&/span&&span class=&k&&switch&/span&&span class=&p&&(&/span&&span class=&n&&input&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&k&&case&/span& &span class=&mi&&1&/span&&span class=&o&&:&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&function1&/span&&span class=&p&&();&/span&
&span class=&n&&PauseAndTip&/span&&span class=&p&&();&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&show_menu&/span&&span class=&p&&();&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&mi&&2&/span&&span class=&o&&:&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&function2&/span&&span class=&p&&();&/span&
&span class=&n&&PauseAndTip&/span&&span class=&p&&();&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&show_menu&/span&&span class=&p&&();&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&mi&&3&/span&&span class=&o&&:&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&AddStu&/span&&span class=&p&&();&/span&
&span class=&n&&PauseAndTip&/span&&span class=&p&&();&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&show_menu&/span&&span class=&p&&();&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&case&/span& &span class=&mi&&4&/span&&span class=&o&&:&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&DelStu&/span&&span class=&p&&();&/span&
&span class=&n&&PauseAndTip&/span&&span class=&p&&();&/span&
&span class=&n&&system&/span&&span class=&p&&(&/span&&span class=&s&&&cls&&/span&&span class=&p&&);&/span&
&span class=&n&&show_menu&/span&&span class=&p&&();&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&k&&default&/span&&span class=&o&&:&/span&
&span class=&k&&break&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&基本上扩展的套路就是这样。&/p&&p&如果你觉得欢迎界面或者菜单选择界面不够丰富,不够美观,你也可以自行完善里面的信息。如果你美学功底深厚,又有点技术底子,可以考虑使用graphics图形库画个漂亮的界面。&/p&&p&&br&&/p&&p&推荐几本好书:&/p&&p&推荐书籍:&/p&&p&1. 2017年9月全国计算机二级c语言程序设计上机考试新版题库全真模拟试卷全套,购买地址:¥NDby0brslIm¥&/p&&p&2. 程序员面试宝典(第5版)第五版:¥n54V0brtbXi¥&/p&&p&3. C PRIMER PLUS(第6版)中文版,购买地址:¥HWE40brHUcU¥&/p&&p&&/p&
这几天我用C语言自己写了一个交互小程序。这个交互小程序,我精力主要是在友好性方面,美观方面,我实在没啥天赋。文末会给大家推荐几本书,希望对需要的朋友有帮助。这个交互小程序其实很简单,现在很多C语言实例项目,像什么学生管理系统、图书管理系统、…
知乎的各位朋友不好意思,前段时间因为给本科生带了一个Python的培训课程,每天弄得很累,所以没时间前来更新。也很感谢和欢迎猫兄&a href=&http://www.zhihu.com/people/5f6adaa17d61& data-hash=&5f6adaa17d61& class=&member_mention& data-editable=&true& data-title=&@黑猫Q形态& data-tip=&p$b$5f6adaa17d61& data-hovercard=&p$b$5f6adaa17d61&&@黑猫Q形态&/a&在我的专栏发文。&p&我在学校带的Python课程主要是针对低年级的本科生,他们没有任何编程基础,很多人也没有学习很复杂的统计内容。因此我为他们量身订做了相应的课件,保持我的老风格,尽量以轻松简单的模式,把尽可能多的内容教给他们。&/p&&p&我这里把我相应的课件以链接的形式和大家分享一下。因为在国外知乎的服务器经常很难登录,我尝试过在知乎上传课件图片,但最后都搞不好,因此只能给大家我微信公众号里的链接了。在这里跟大家说个抱歉。&/p&&p&我的课件内容主要总共三份,这些课件我参考了很多的资料,有网上资源,也有一些教材,然后自己整理出来的,针对本科生和零基础的人设计的。所以高手们可以忽略的自然。不说多了,所有内容都在下边这三个链接里:&/p&&h2&&b&三天搞定Python基础功,Day 1基础篇&/b&&/h2&&p&&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIxMjM4MjkwMw%3D%3D%26mid%3D%26idx%3D1%26sn%3D4c8fd2ec7b7a13crd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&三天搞定Python基础功,Day 1基础篇&/a&&br&&/p&&h2&&b&三天搞定Python基本功,Day 2科学计算篇&/b&&/h2&&p&&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIxMjM4MjkwMw%3D%3D%26mid%3D%26idx%3D1%26sn%3D96b1f54ac76c6687a20af%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&三天搞定Python基本功,Day 2科学计算篇&/a&&br&&/p&&h2&&b&三天搞定Python基础功,Day 3统计入门篇&/b&&/h2&&p&&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIxMjM4MjkwMw%3D%3D%26mid%3D%26idx%3D1%26sn%3Def84db57f1%23rd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&三天搞定Python基础功,Day 3统计入门篇&/a&&br&&/p&&br&&p&希望能对没有接触过编程,或者没有接触过Python的朋友有个参考。&/p&
知乎的各位朋友不好意思,前段时间因为给本科生带了一个Python的培训课程,每天弄得很累,所以没时间前来更新。也很感谢和欢迎猫兄在我的专栏发文。我在学校带的Python课程主要是针对低年级的本科生,他们没有任何编程基础,很多人也没有学习很复…
&figure&&img src=&https://pic3.zhimg.com/v2-ae2306afd6411e3bdd838e2a0f9d79c7_b.jpg& data-rawwidth=&600& data-rawheight=&337& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-ae2306afd6411e3bdd838e2a0f9d79c7_r.jpg&&&/figure&&h2&转自:菜鸟要飞&/h2&&p&&br&&/p&&p&&br&&/p&&p&先说一下,喜欢的赞赏一下吧!&/p&&ul&&li&一、这多东西啥时候能学完?&/li&&/ul&&p&现在IT新技术日新月异。就常用编程语言而言,有c/c++、汇编、java,c#、Python等;操作系统平台有unix /linux,windows系列;开发工具有VC、VisualStudio2008、Eclipse、NetBeans等;每个大平台下,还有很多的 的方向:如网络、数据库、脚本、HTML、动态网站、游戏开发等;有人还在学Dreamweaver做网页、Flash做动画、Photoshop做美 工、3DMax做三维动画…………是的,我们什么都想学。恨不得把所有的知识统统都塞到肚子里去。看到什么,想学什么!&/p&&p&&br&&/p&&p&?&/p&&p&&br&&/p&&p&
今天看这VC的书,明天又看Java,后天又看C#,东搞西搞!看到别人做网页。自己兴趣了来了。好,学html语言,我也做网页,听说做 网页要会“网页三剑客”,所以又想学Dreamweaver、Flash。后来开始知道有JSP、PHP、&a href=&https://link.zhihu.com/?target=http%3A//asp.xn--net-l00ez4b4zdou3bz3br84ey9ossl9k2c/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://ASP.NET做动态网站这玩意儿&/a&。也想去学, 学学学……&/p&&p&&br&&/p&&p&
这是几乎所有在校大学生的通病。但是,这不是坏事,甚至可以说是好事。说明了你“求知欲”高!总比那些,生活没有激情,整天知道泡妞、上网、打游戏、混日子的强。&/p&&p&&br&&/p&&p&
但是如果你今天想学这个,明天又想学那个。这样你就能永远徘徊在技术的门外。很多人都有过或者正在经历这样的苦闷日子:总觉得有“太多东 西”要学了,然而人的精力是有限的,总有永远学不完的感觉,所以心理特别急,整天惶惶不可终日,不知道先要学哪个,一会儿拿起这本书,一会拿起那本书,折 腾了几个月,突然发现自己什么都没有学到……&/p&&p&&br&&/p&&p&
每一个大方向如果没有上几年的学习,很难能学习出什么来。但程序设计的最根本的东西是相同的。所以我们学习要抓根本。俗话说:通一理,融百里。&/p&&p&&br&&/p&&p&
学程序设计就像习武一样,如果内功学的好,其他功夫就很容易上手。君不见《倚天屠龙记》中的张无忌练了“九阳神功”8年,练“乾坤大挪移”只需12个时辰吗?&/p&&p&&br&&/p&&p&
习武之人,谁不想在“江湖”上扬名立万,谁不想成为万人敬仰的大侠?大侠之所以能成为“大侠”,当然有他们的看家本领。狄云的“神照神功”,金世遗的正邪融合的“乔北冥内功心法”,张无忌的“九阳神功”,段誉的“六脉神剑”,令狐冲的“独孤九剑”,哇,太多了…&/p&&p&&br&&/p&&p&
古人历经千辛万苦才能找到这些“武功秘籍”。我们现在这些后辈,比起古人来说:简直太幸运了。去书店,各种各样的心功心法,剑法,拳法,应 有尽有,看得你眼花缭乱…你选什么呢?今天练“六脉神剑”几式,明天去学“降龙十八掌”几招,后天又去练“发暗器”,这样何时才有个尽头呢?你说,你 什么武功都会,但是“形似而神不似”,不得要领,不够火候。一上擂台,就被别人一掌打趴了。试问哪个软件公司敢要一个号称任何编程语言都会,而是每种语言 只能写出个“helloworld!”的程序员,你不被人家扫地出门才怪。&/p&&p&&br&&/p&&ul&&li&二、学**还是学**更有前途?&/li&&/ul&&p&&br&&/p&&p&
看了上面的话,有的同学已经开始烦了,“知道了知道了,不止一个像你这样的所谓的‘老前辈’跟我说过‘学什么都一样,思想才是最重要’的大 道理,可是你们站着说话不嫌腰疼呀,现实是有很多技术需要学,比如做Web开发就有JSP、PHP、&a href=&https://link.zhihu.com/?target=http%3A//asp.xn--net-933e63u7qaf99dwn3b/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://ASP.NET等好多方向&/a&,我总得选一个吧!到底学哪 个有前途呢?我必须要选择一个有前途的,选错了就麻烦了。”&/p&&p&&br&&/p&&p&
其实像“学**还是学**更有前途”的话没意义,因为“选择JSP还是选择PHP”的前途的差别不像“选择英语还是选择日语”的前途差别那 样大,不存在“选错方向”的问题,因为都是相通的,你也不能保证你毕业以后搞的就是你学的那个方向,更不能保证你靠你学的这点东西就能吃一辈子。比如我上 大学的时候一直在钻研是Delphi语言,可是毕业校园招聘的时候我照样在Java职位的考试取得了第一名,而且工作以后经过简单的学习就掌握了Java 语言,并且后来还写了三本关于Java语言的书;再如我毕业后两年多的时间一直在用Java开发,后来公司要做一套基于.NET的产品,我只用了一个礼拜 熟悉了.NET体系以及C#的语法,然后就开始进行开发。&/p&&p&&br&&/p&&p&
不过就像上边说的“做Web开发就有JSP、PHP、&a href=&https://link.zhihu.com/?target=http%3A//asp.xn--net-933e63u7qaf99dwn3b/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&http://ASP.NET等好多方向&/a&,我总得选一个吧!”这个问题是非常实际的,因为只有先学一 个才能深入这个方向,把这个方向学通了才能想以后“一通百通”。因此我的建议就是学校教过什么语言,你就继续深入学习这么语言,而不要去问“这么语言有没 有前途”这样的傻问题。尽量不要去学一门所谓“有前途”的新语言,因为你去学一门新语言就要把很多精力耗费在语言、语法本身,而耽误了编程的实战,而以一 个已经学过的语言来学习的话,起码语法本身不用再去学、开发工具本身不用再去熟悉,只要研究怎么使用这门语言开发有用的程序就ok了。比如大部分同学都学 过C语言(有的学校直接开了C++的课,但是C++的面向过程编程部分还是C语言),所以咱们就开了《C语言也能干大事》的课程,让同学们把精力放到学以 致用上,而不是学“有前途”的新语言上,这也是这个思想的一个体现。&/p&&p&&br&&/p&&p&
举几个例子。咱们如鹏网的《计算机专业职业发展测评系统》是我用PHP开发的,但是在这之前我从来没写过PHP程序,但是我以前写过 JSP、ASP的程序,因为写网站程序的原理都是相通的,只是语法不同而已,因此我只用了几个小时的时间熟悉了开发PHP用的工具并且快速浏览了一下 PHP的语法,然后用半天时间就开发出了这个测评系统。想像一下一个整天在今天学JSP,明天学ASP,后天学PHP,大后天仰天长叹“到底学哪个有前 途”的人能用半天时间学会一门新语言吗?&/p&&p&&br&&/p&&p&
我大学时有一个同学,他看我当时Delphi学的比较好,写了很多程序,他就说他也想学软件开发,让我教他Delphi,可是我们专业前一 个学期已经开了PowerBuilder的课,因此当时我就建议他还是继续深入学习PowerBuilder,用PowerBuilder写又实用价值的 东西,而不是像上课那样写HelloWorld的程序。当时Delphi还是如日中天的流行的编程语言,而PowerBuilder则市场占有率比较小, 他就说不想继续学PowerBuilder,因为PowerBuilder没前途,我就给他讲了“一通百通,从自己最熟悉的入手”这个道理,然后他就踏实 的深入研究PowerBuilder起来,到了毕业的时候他已经能用PowerBuilder写非常复杂的程序而且还学习了用PowerBuilder写 Web程序。毕业后没多久就应公司的要求用Delphi写程序,他只用了不到一周的时间学习了Delphi,然后就写出了一个符合公司要求的系统,当时他 就给我打电话向我报喜。前一阵子我听说他已经开始指导一些新员工用Java开发一个中型规模的企业级系统了。可以说他的成功就得益于“一通百通,从自己最 熟悉的入手”这个原则。&/p&&p&&br&&/p&&p&
总结一下,不要管“哪门语言好就业、有前途”,因为那些“好就业、有前途”都是纸老虎。尽量不要学新语言,从自己最熟悉的语言入手,深入研究,出山后你就是被用人单位争抢的红人。&/p&&p&&br&&/p&&ul&&li&三、企业里都需要什么方面的才能?&/li&&/ul&&p&&br&&/p&&p&
这个要视用人单位的要求而定了。你现在还没有毕业,也不知道未来要面对什么样的岗位。因此建议大家在上学期间不要偏科,所以的课程都要好好学,学好专业课,培养自己的“内功心法”,然后进入一个大公司,那么大公司自然会为你安排一个人才培养计划,在工作的环境中学习就更有目的性。&/p&&p&&br&&/p&&p&学什么最容易&/p&&p&&br&&/p&&p&
由于现在的快速开发工具的不断推出,使得软件开发越来越容易,进入软件开发的门槛也越来越低。很多人在IDE工具的诱骗之下,快的十天,慢的半个月就可以进入所谓“程序员”的领域,成了一个所谓的“程序员”。这对于IDE提供商来说是乐得合不拢嘴的事情,但是对于软件来说却是一个无形的打击。由于快速工具的盛行,很多人把开发看作小菜一碟,特别是很多在校的大学生,都认为现在教的内容一旦出了学校都已经是落伍,无形中产生了讨学的心理。&/p&&p&&br&&/p&&p&
今后的软件开发逐渐趋于两极化,一方面有越来越多的人将从事简单的重复性开发,而且这部分的开发难度会逐渐降低;另外一方面核心部分的开发会越来越复杂,这部分的入门所涉及的知识内容会逐步增加。所以对于今后希望从事软件开发的同学们,需要好好的努力学习,学校的东西会有他们的用处,只要现在把基础打扎实了,即后你们在软件的领域会有很好的机会,不要盲目的放弃学习的机会。&/p&&p&&br&&/p&&p&有什么速成的办法没有?&/p&&p&&br&&/p&&p&
有一种蛾子名叫“帝王蛾”。帝王蛾的幼虫时期是在一个洞口极其窄小的茧中度过的。当它的生命要发生质的飞跃时,这天定的窄小通道对它来说无疑成了鬼门关。那娇嫩的身躯必须拼尽全力才可以破茧而出。太多太多的幼虫在往外冲杀的时候力竭身亡,不幸成了“飞翔”这个词的悲壮祭品。&/p&&p&&br&&/p&&p&
有人怀着悲悯恻隐之心,企图将那幼虫的生命通道修得宽阔些。他们拿来剪刀,把茧中的洞口剪大。这样一来,茧中的幼虫不必费多大力气,轻易地就从那个牢笼里钻了出来。但是,所有因得到救助而见到天日的蛾子都不是真正的“帝王蛾”,它们无论如何也飞不起来,只能拖着丧失了飞翔功能的累赘的双翅在地上笨拙地爬行。&/p&&p&&br&&/p&&p&
原来,那“鬼门关”般的窄小茧洞恰恰是帮助帝王蛾幼虫两翼成长的关键所在。穿越的时刻,通过用力的挤压,血液才能顺利送到蛾翼的组织中去,惟有两翼充血,帝王蛾才能振翅飞翔。人为地将茧洞剪大,翼翅就失去了充血的机会,生出来的帝王蛾便永远与飞翔无缘。&/p&&p&&br&&/p&&p&
没有谁能够施舍给帝王蛾一双奋飞的翅膀。不惧怕独自穿越狭长墨黑的隧道,不指望一双怜恤的手送来廉价的资助,将血肉之躯铸成一支英勇无畏的箭镞,带着呼啸的风,携着永不坠落的梦想,拼力穿透命运设置的重重险阻,义无反顾射向那寥廓美丽的长

我要回帖

更多关于 2048网页版在线玩 的文章

 

随机推荐