初学编程这五月

其实很早就想写博客了只是一直没动手,今天写博客倒也不算心血来潮。然而我绝对想不到的是,我的第一篇博客竟然会发在这儿:因为一直到半年前,我压根就没听说过csdn,平常翻看的书也无非就是专业(会计)相关或者小说。但这半年对我的改变真的太大了。

如果说第一次接触编程语言是什么时候的话那高中就可以算吧!数学必修的QBASIC,以及计算机课的VB,当时自己也试着动手写过一些类似于弹球这样的小游戏,但萌生出系统学习的想法还是在大一。最初好像是想写游戏吧!各种搜索后本来打算学下RPG MAKER,但还没开始学想法又变了:要学就学最高端的!然后那个寒假就买了本清华版的《c++程序设计》,看了半个月就到了开学。因为当时混学生会,事情极多,外加沉迷各种电脑游戏,于是那本《c++程序设计》虽然带到了学校一度打算继续看,但事实上是再也没去翻过。

然后就到了今年7月底。在那个百无聊赖的日子里,那本《c++程序设计》又被我翻了出来。怀揣着一种探索新世界寻找乌托邦的心态,这五个月就这样开始了。

委实是忘的差不多了,一打开书我只认得main函数头,外加我一直都很讨厌复习,所以一开始重拾c++的时候很痛苦。但令我没想到的是,学过毕竟是学过(顺便一提,那个寒假里只学到了指针的概念,自己写过的最难的程序是数组实现的约瑟夫环),我用了大概三四天又看到了指针——太振奋人心了!教材接下来集中讲述c++面向对象的特性,因为从这里开始我完全没接触过因此往后我学得比较慢。看了一周多,到了8月初,此书看完。

现在看来这本书真的不怎么样。比如在还没介绍类之前就冒出了好几处string对象声明(而且不带说明),弄我当时以为string是和char一样的基本数据类型。然后命令行参数只介绍了半页当时完全看不懂。之后链表的实例部分出现了整本书都没提到过的malloc和free。面向对象特性部分只字未提c++标准类库(什么vector和智能指针当时一概不知道。但c标准库函数倒是介绍了一些。其实从整本书来看c风格教学确实非常明显)。书上用的还是void main函数头,包含的是iostream.h头文件。此外,课后习题也编写得很没意义(特别是类和对象开始之后的部分),等等。种种吐槽。但不管怎么说,从这本书上我了解了一点基础的语法。

接下来那段时间比较迷茫。就跟很多新手一样,看完了一本教材感觉什么也做不出来,却又不知道该继续看什么,同时也掺杂着对图形界面的渴求。《c++程序设计》快看完的那段日子,我把所有的上网时间都用来查找相关资料,很多名词都是在这时候才被我所了解,比如API,MFC,GUI,IDE,WIN32,算法,数据结构等等(其实还有CSDN)。但我始终不知道学习的先后顺序,以及适合与新人自学的书目。种种折腾后我买了《windows程序设计》,开始学习win32编程。

老外的书果然不一样。国内的教材往往给人以板着面孔授课之感,但老外写教材却是以撰写个人著作的心态来编写的,这点在《windows程序设计》中我深有体会。比如charles petzold在鼠标消息一章中专门分出一小节来探究鼠标的复数(mouses or mice or mouse devices);然后在“捕获鼠标”(capture the mouse)中又说到:“在屏幕上捕获鼠标要比放置诱饵容易的多……别担心,这只老鼠(mouse)不咬人!”哈哈,真是教材中少见的风趣啊!总而言之这本win32编程圣经出奇的简单易懂(除了第三章初学消息机制时遇到了一点麻烦以外),代码也很丰富,加之语言幽默通俗,阅读此书实在是种享受。

这样到了8月25号,离我踏上返校的路还有三天的时候,我开始试着编写自己第一个稍微大型的程序:win32贪吃蛇,并在返校后的几天内写完了。9月开始,紧接着贪吃蛇,我又尝试编写另一个小游戏:俄罗斯方块,这个写了比较久,用了一周的时间才写完。关于这两个小游戏,毫无技术含量,所以我简单一说吧。贪吃蛇蛇身是链表实现(之前没写过链表,这回为了写贪吃蛇特意花了一天时间实现链表的基本操作,典型的驱动式学习哈),然后用GDI绘制蛇身和食物,简单的贪吃蛇就这样弄出来了,不算太难。俄罗斯方块费了番脑筋。基本框架是把屏幕存为一个大的二维数组用于绘图,然后将所有姿势的(包括各种翻转后的)方块图案每个以二维数组保存,共19种,游戏进行中需要翻转方块时就根据方块ID直接输出相应的图形。这种办法写的代码非常丑陋,因为有19个结构体,每个结构体除了要存二维数组图形以外还要保存本结构体ID,要存下一幅和上一幅形状的ID,而在方块翻转部分对跳转ID的处理也很冗长,直接导致这两部分的代码多达200行,难看死了。。。因为现在电脑上已经没有windows了(这个后面再说吧),因此无法截图,就这么简述一下吧!

到我写完这两个小游戏后,《windows程序设计》一书我看到了计时器,外加跳着看了后面的位图那一章。但我在编程当中渐渐发现自己在语法上的基本功太不扎实了:字符数组和字符串分不清、,数组指针和指针数组分不清,数据类型、字节数等等基本概念都很模糊,因此,我决定接下来把这本书放一放,先看看人称“c语言圣经”的K&R《c程序设计语言》,巩固一下自己稀烂的语法。为什么是c而不是c++呢?这个我后面再说,在此,我最后再感谢一下《windows程序设计》及其作者charles petzold吧!虽然本书我看到此就再也没有往下看了(以后应该也不会看了),但是,正是这本书解了我对图形界面的渴(确实不少像我这样的新手一开始都想摆脱黑色的控制台窗口吧),并让我第一次有了以语法为基础依托某个具体平台来进行程序编写的经历。在此再一次感谢本书及本书作者!

至于为什么是c而不是c++?这跟我在csdn上看到的一篇帖子有关,那篇帖子的楼主就是那个自称“本ID”的(笑)。虽然我无法评价楼主对c++的鞭挞,但有一点是很肯定的,那就是,c++非常复杂,需要投入大量时间去掌握那些复杂的特性;而c在无比简洁的同时保持了不逊于c++的强大。我作为一个非专业的自学者(关键是时间也不多),为了“效益至上”,我觉得还是c比较适合我个人。

于是写完俄罗斯方块后我开始看《c程序设计语言》。前后看了一两周,相当费脑子,有的课后编程习题要想一个多小时才能写出来。更要命的是我的弱项:排序和数据结构,里头都有大量涉及。总之这本书总共看下来并大致能消化的大约不到半本,做出来的习题也只有一半左右,很难想象我如果0基础看此书会被怎样打击到。尽管如此,一遍看下来还是收获良多:理清了很多之前稀里糊涂的概念(数组指针、字符串、数据类型、命令行参数等),代码书写风格规范,最常用的一些算法(如最简单的子串匹配,串中删除特定字符等等。说到此不得不提下俄罗斯方块。关于如何消行当时我想了好久,现在发现消行算法其实就是一个串中删除特定字符的算法),标准库函数(之前那本c++虽然也有介绍,但书上实例很少因此自己没用心学),以及第一次认识到还有UNIX这个windows之外的操作系统。其中我觉得尤赞的是本书的实例,大部分都是简化了的库函数原型,经典而又实用,并能或多或少认识到一些底层的实现(如malloc,不过这个当时没怎么看)。总之,即便对于我这个只摸到了一点皮毛的人来说,这本书的优点都不可胜数!

因为在《c程序设计语言》中被排序打击的太大,接下来就想看数据结构。怕国外经典吃不消,因此先从图书馆借了一本清华版的c描述数据结构。看的很浮躁,总共只看了链表、栈、队列、(KMP没看懂略过,广义数组稀疏矩阵等略过)、二叉树(平衡树往后略过,森林、图、散列表整个没看),三种最基本的排序,及快排、shell排序、堆排、归并。其中堆排和归并没有自己实现过,其它都写了几遍,而且为了保持手感,刚看完此书的那半个多月每隔几天都把链表排序、常用二叉树算法和快排shell排序都写一遍。这回跟很多贴吧新手说不知道数据结构何用不一样,单说栈的应用:表达式求值和迷宫寻路,没学数据接前这两个问题若让我自己解估计是无望的。而且看完后不久,我又用迷宫寻路的方法依样画葫芦来解八皇后问题(之前都没写过),再一次感受到了数据结构对问题抽象的威力。此外,之前很怕写递归(hanoi都写不出来),但二叉树的基本算法练的多了以后,有一天猛然发现想写一个递归版的hanoi简直手到擒来啊。到此书看完,大约已经是国庆后的事情了。

因为专业课考试临近,本来打算到此打住的。但知识的诱惑力实在让人难以阻挡啊!我还是决定先抛开专业课看汇编。我选了网上广受好评的王爽《汇编语言》。本书开篇前言就提出了一个与众不同的概念:知识的屏蔽。果不其然,往下翻,直至结束,不得不感慨,很少有专业书籍(尤其是计算机类书籍)能如此循循善诱。以我为例:我对计算机硬件可以所是一张白纸,然而全书通读下来却没有一点难度。当然,8086CPU是远远不够的,而且王爽老师的这本书貌似也因为过于浅显在网上有一些批评,但不得不说能让我在如此轻松的氛围下迈入汇编学习的大门这的确是王爽老师的过人之处。

看完《汇编语言》已经快11月中旬了。因为想希望实现当初初学c时就想实现的一个程序:24点,就费了几天来写。我不满足于4个数相乘,想写一个任意个数版的,因此判断能否构成24点我用了递归,思路是:n个操作数,任取两个进行四则运算,然后与剩下的n-2个数构成n-1个数,之后对这n-1个操作数进行递归判断,直至只剩下1个操作数为止。判断部分写出来了,但接下来如何将表达式输出却伤了我很大的脑筋:一开始打算把表达式存为数组,之后感觉用链表来存储便于在递归中插入操作数,再后来开始往链表当中加入多个后继节点,渐渐的整个表达式就构成了一个二叉链表,最后我发现这其实就是一个建立和输出表达式二叉树的过程!按照这思路我给程序加上了二叉树部分,结果很满意。但此时还没有括号。后来又用了一个下午琢磨括号的规律,也找出来了。最终程序效果如下:


这是在linuxdeepin虚拟终端下截的图,关于如何用上linux后面再说吧。应该说,这是我目前最满意的一个程序了(甚至比后面的五子棋AI还要满意),因为这个程序的构想是很早以前就萌生了的,现在算是了结了 一个夙愿。而且程序从头到尾都不曾参考任何资料都是自己独立完成的,并用上了自己一直不大熟练的递归,以及刚学不久还未能经历实战的数据结构(其实在学二叉树的时候我就特别喜欢二叉树的各种操作,因此这回能派上用场尤其激动)。一直到现在我还不时的让程序算一算24点聊以自娱。

到了11月底,虽然已经开始复习蛋疼的ACCA全球统考了,但还是耐不住寂寞想写个小程序练手。这回我瞄准了五子棋,人工智能这一块充满了莫大的神秘,自己是处在一种明知山有虎偏向虎山行的感觉。编写的过程及代价其实蛮痛苦的,而且程序并不完美,只用到了alphabeta搜索,没能用到更高级的AI算法。关于五子棋更多的介绍我放到下一篇博文来讲吧,这里先放个图好了。这是我的AI(右边)和另一个从网上下载的五子棋对弈的情形(当然截了一张胜利的图啦,嘿嘿)

接下来就没再写过什么程序了。讲讲我是怎么用上linux的吧!以前一直只知道windows,直到看了the c programming language才对unix以及命令行接口的操作系统有了个初步的概念。一开始我装的是ubuntu,wubi安装,很不稳定,不时的会死机。后来卸掉了装在虚拟机里,但毕竟缺乏真机使用的动力因此用的非常少,没能学到什么。后来听说deepin在保持界面友好的同时系统又相对比较稳定,于是就尝试真机装deepin。装的过程也费了点周折,U盘安装两次都卡在安装界面了,然后换光盘刻录安装,参照网上的教程手动指定分区,总算双系统成功了。但渐渐用着发现(大概一个月吧)似乎是因为deepin装到了逻辑分区的缘故,两个系统都受到了影响:deepin启动非常慢,而win7死机/无法启动的次数也越来越频繁乃至于无法忍受,最后一狠心把全盘格了裸奔deepin单系统直到现在。

》==============================《坑爹分割线》=============================《

2013-01-23

本人的处女博客真是好事多磨啊~其实当时写五子棋的时候就想动笔了,但一直拖到了年底。年底后遭遇期末考,考完后又和一直懒得再续,于是拖到了现在,虽然还有很多话没说完,但这样拖着总不是个办法,一狠心也关不上衔接不衔接,就这样草草了结好了:

后来我又断断续续看了大半本《鸟哥的linux私房菜》,其中正则表达式、ACL权限、磁盘配额、SELinux等等跳过了,算是看到了开机启动,感觉甚爽:因为我一向喜欢比较系统的学习,而这本书对读者正是绝对的零基础要求,并因此一脉渐进,加之我在之前使用linux当中经常被迫上网搜索才能解决的问题基本上后来都可以在这本书里找到,有种相见很晚的感觉,总而言之真不愧是入门神作啊。

说一下假期的规划吧!说真的,20年了,我从来没有对任何一个假期有过任何正经的规划,但今年这个寒假开始,一切绝对不一样了。假期的计划是:《unix/linux编程实践教程》(目前已看百来页,感觉棒极了!),以获得对特定平台进行应用编程的能力,同时也加深对系统运作的理解;《80x86汇编语言程序设计教程》(杨季文),向32位汇编迈进,这对今后操作系统的学习是必须的;《计算机网络》(Krose&Rose),半年前,我基本可以说是一个彻头彻尾的电脑盲,现在若抛开网络的话我自诩已经可以勉强入菜,但就是网络这一块,我仍然是一无所知白得可以,于是一本网络的书是必须的~此外还有《编码的奥秘》(charles petzold),当小说看好了;《linux程序设计》,开学再说吧;《数据结构与算法分析》,神书不解释,现在虽然我在算法这一块还是不入门,但数据结构已经向我展现了巨大的威力,可以说我的兴趣已经被彻底地激发了(一想链表二叉树等等心中就会涌起一种莫名的激动),同时我也不会再像初学时那样对算法抱有极大的恐惧。无奈确实排不上日程啊,毕竟跟数据结构比起来,我在前面那3本书所代表的方面上更是欠缺,因此本书也打算开学后再看吧。。。

中期规划:到约今年9月份开学前,我还将学习完以下课程:计算机组成原理,这方面我暂时不打算看太专门的书,准备就看《深入理解计算机系统》,算是浅尝辄止;然后,《现代操作系统》,操作系统的神书也不解释;《数据结构与算法分析》,正式提上日程;其余的,如《linux程序设计》,《unix环境高级编程》,《c专家编程》,《unix网络编程》,离散数学……如果吃得消,到时候不妨都随便挑几本翻翻吧~

长期规划:嘿嘿,再说吧~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值