曾经想在大三上学期当大一新生的C语言助教,还特地复习了C,但最终因时间冲突未能如愿,大学四年没真正当过助教,好遗憾呢!


起因

有点想当下个学期新生们的C助教;觉得自己基础不太稳想从头复习一遍;再就是感受下自己一年多的进步~

于是重写了下当时的大项目,也是我的代码入门之作


经过

D1

在ubuntu 11.04下,先下载了eclipse CDT,发现有新版本indigo!然后居然没有安JRE,又安了JRE。

在eclipse里,新建C project,想把.h和.c分开放,于是和src同级新建了一个source folder(只是folder的好像不合适,.h文件的图标都灰掉了),然而在.c中一下子找不到.h,最终写成这样是可以的 #include “./../header/xxx”

接下来想要使用SVN,先在eclipse里安装SVN插件:http://subclipse.tigris.org/update,然后在google code里新建托管项目,看这里,但是生成密码的时候一直被重置(F*CK GFW),使用以下办法解决:在/etc/hosts 里添加66.249.89.99code.google.com,于是就可以生成密码了!然后在eclipse里边右键项目->team->share。

嘿嘿~ https://andriy-c-final-project-rework.googlecode.com/svn/trunk/

注:后来我都用git了…这个也被我转移到github上了… (2013/07/16)

D2

.h里边不能有常量定义,可以extern一下,然后在一个.c里边具体定义,我记得linux的源码也是这么用的,有个特别的.h用来声明常量们。不过#define倒是可以,#define不是C的东西,是编译器的东西!

puts()函数会自动加上\n,蛮高级的…

char nextOp = 0;
while (getchar() == '-' && (nextOp = getchar()) != 'q')
{
    while (getchar() != '\n')
    {
        continue;
        //there may be a '\n' when return is pressed, ignore it!
    }
   //
}

这段代码可以接受-x这样形式的输入,-q退出,主要是里边的那个while循环!没有它的话是肯定会报错的,因为有缓冲输入,回车之后flush出来,因此getchar()仍然拿得到那个’\n’,需要把那个\n处理掉,免得影响。(是这样么?)

D3

原来#include “../……”就可以了,不用”./../……”

使用了static xxxxx(),这样的函数声明表示此函数不会供外部调用,就好像private一样,而且eclipse也会在没调用到这个函数的时候给你一个warning,蛮有用的!

使用fgets()和fputs(),之前使用的一直是gets()和puts(),这不好的原因是没有输入个数限制,不安全。而且可以使用stdin和stdout作为文件,不错~

遇到只有C99才能在for loop里边直接定义变量的问题,啊!!!早就习惯直接for(int i=0……)了!于是在项目属性->c/c++ build->settings->GCC C compiler->Miscellaneous的other flags里边添上-std=c99,可以了!

由于-c, -s, -u, -d的输入格式完全一样,使用了函数指针~

在自己的showErrorInput(const char*)函数里边,传入错误说明,就可以针对不同错误说不同的话了。

今天完成了所有的control logic,和一年半前相比,完成的很轻松啊~

晚上又遇到了载入文件找不到路径的问题,这次,先用”w”模式来一下,发现就在项目目录下和src及res文件夹同级的位置,于是./res/*.txt就OK了

D4

把之前的control Logic优化了下,分成了几个小函数,这样便于理解。话说自从在java里头充分分出函数以让每个函数都不太大,这好像归于面向对象的风格哦。

发现C里边的struct定义必须要struct xxx xxx,C++就可以直接XXX XXX了。

这次重做,决定和之前的结构有些不同,之前是一个二维的大链表,现在想表头读入以后,就固定了,于是是一个一维的数据链表,每一个元素内有一个数据数组,这个数组的内容由表头确定。采用链表,indexing采用数组好了。

D5

在识别 float(4)这样的字符串的时候纠结了一段时间,后边干脆就只认()之间没有空格的情形,如果( 4)什么都报错,此外,如果在float和(4)之间有空格,那么经过我的处理,在”float”得到的length字符串会是””,于是判断如果strlen()==0则再fscanf()一遍,不为0就不用再从文件读入了,直接用就好了。

完成了create.txt中一个TableHeader的读入。

算了下,已经1225行代码了~


结果

暂时就写成这样子…… 前前后后写了5天,每天2个小时到3个小时。

遥想当年写C项目是在期末、其他考试都结束了以后,写了3天2夜,除了吃饭都在code,最后写了个2400多行的cpp,deadline前的6个小时左右突破了困扰很久的一个难点,真的好激动哦!那是第一次写这么多的代码,于是就喜欢上了这专业^_^,下学期可以转专业也没转了……不过现在看那cpp,杂乱不堪啊!!!而且四处粘贴代码(我已经深深体会到这样的弊端了!)

重写,真的觉得自己进步了好多,不过大部分是在编程技巧上和工具使用上的,思维方式呢?我也不知道!

写到上周五15号左右就暂停了,毕竟这个是课余,得先把老师那个项目完成!加了个油哦~