实现一段代码,如何让代码尽可能实现预期效果,和如何把所有尽可能多的可能考虑进代码中???
最近是一边写C代码,一边学C基础,中间出现一个编程的小纠结。
书籍是:《The C Programming Language(second edition)》
边写程序边加基础,这是目前的学习方式,
可是不知道是编程的时间多一点好,还是学习基础的时间多一点。
忘记在哪里看过一篇文章大概是说,编程时间要多,从编程中领会理论的知识。
可是,最近的学习状态是,看理论基础的时间多于写代码,
过程中,觉得这样学习并不好,相当于理论脱离实践。
可是,写程序,要如何写,才能把所有可能都解除让程序达到“完美”。
比方说,以下一个程序编写:(来自上述所提及的书籍)
编写一个程序,以每行一个单词的形式打印其输入。
一开始简单的考虑一般情况,但经过不断地输入不同情况时,发现问题所在。
是不是 所有的程序 要通过不断地编写 才可以把尽可能多的结果 考虑进程序内呢?
是不是每写一个程序要养成先思考再下手呢?
。。。求解!!~~
[解决办法]
看书->写程序->出错->思考->交流->解决错误->思考->看书->... ... 周期为:7,刚好一周, 呵呵
[解决办法]
首先,你要先看书,然后跟着书本上每一个实例都自己编写一次,编写的过程又是学习的过程,是积累的过程,学习别人良好的程序设计风格(风格最重要),然后多收集一些题目,尝试自己编写程序,并对照程序自己调试,并从中学到一些新的算法、风格以及逻辑思路。
[解决办法]
仅供参考
- C/C++ code
#include <sys\stat.h>#include <io.h>#include <fcntl.h>#include <share.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <string.h>#define MAX_CLU_BYTES 65536FILE *fo;int fh;__int64 offs,offs1;__int64 rvi64;int rv,wrv;unsigned char buf[MAX_CLU_BYTES];char ofn[_MAX_PATH];char offstr[80];void strcpybutcomma(char *t,char *s) { char c; while (1) { c = *s++; if (','!=c) *t++ = c; if (0==c) break; }}void main(int argc,char **argv) { if (argc<3) { printf("Copy File Tail.\n"); printf("Usage:\n"); printf(" cft filename.ext offset_begin[-offset_end]\n"); printf("Copy filename.ext offset_begin[-offset_end] to offset_begin[-offset_end]-filename.ext\n"); printf("Note: Byte at offset_end is NOT included.\n"); printf("Example:\n"); printf(" cft abc.rar 12345\n"); printf("Copy abc.rar offset 12345-end to 12345-abc.rar\n"); printf(" cft abc.rar 123-12345\n"); printf("Copy abc.rar offset 123-12345 to 123-12345-abc.rar\n"); printf(" cft abc.rar 0xAB-0xCD\n"); printf("Copy abc.rar offset 0xAB-0xCD to 0xAB-0xCD-abc.rar\n"); return; } strcpybutcomma(offstr,argv[2]); rv=sscanf(offstr,"%I64i-%I64i",&offs,&offs1); if (rv==0) { printf("offset %s is not number\n",argv[2]); return; } fh=_sopen(argv[1],_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYWR); if (fh==-1) { printf("_sopen %s errno=%d\n",argv[1],errno); return; } if (rv==1) { offs1=_filelengthi64(fh); if (offs1==-1i64) { printf("%I64=_filelengthi64 errno=%d\n",offs1,errno); _close(fh); return; } } else {//rv==2 if (offs1<offs) { printf("%s offset_begin>offset_end error\n",argv[2]); _close(fh); return; } } rvi64=_lseeki64(fh,offs,SEEK_SET); if (rvi64!=offs) { printf("%I64u=_lseeki64 %I64u errno=%d\n",rvi64,offs,errno); _close(fh); return; } sprintf(ofn,"%s-",offstr); strcat(ofn,argv[1]); fo=fopen(ofn,"wb"); if (fo==NULL) { _close(fh); printf("fopen %s error\n",ofn); return; } cprintf("\n%I64u\r",offs); while (1) { rv=_read(fh,buf,(unsigned int)__min(offs1-offs,MAX_CLU_BYTES)); if (rv==0) break;// if (rv<0) { fclose(fo); _close(fh); printf("_read %s offset %I64u error\n",argv[1],offs); return; } wrv=fwrite(buf,1,rv,fo); if (wrv!=rv) { fclose(fo); _close(fh); printf("fwrite %s error\n",ofn); return; } else { offs+=rv; cprintf("%I64u\r",offs); if (offs>=offs1) break;// } } fclose(fo); _close(fh); printf("Copy %s offset %s to %s OK.\n",argv[1],argv[2],ofn);}
[解决办法]
楼主的问题我可以分享几条经验与见解:
1, 看的书越多, 你越厉害, 毋庸置疑, 技多不压身, 年轻时候不多看书还指望老了再开始学吗, 所以你懂的。说不用看书的人是因为他们没耐心没习惯看书, 所以就出来误导别人, 你如果信了你就输了.
2, 编程一定是先在脑子里想好的,最起码你要有信心你的解决方案是合理的,可行的,其次你要习惯于在脑海里编程,把代码细节理顺清楚。 但并不是所有的问题都能把代码细节理得非常清楚, 但我相信如你一定能把伪代码写下来,所以我并不抵触在未完全理清的情况下动手,动手的过程其实也是梳理与发现问题的过程,但切忌直接动手,那是非常浪费生命的。
3,完美的程序首先是架构设计清晰,必须抽象出接口,抽象出数据结构,你最终的程序应该是一个白痴都能看懂的函数名,白痴都懂的参数与返回值,白痴照着函数说明都会调用。如何松耦合的设计,如果设计变与不变的程序架构,都是看你是不是看了足够多的优秀设计,是不是做了足够多的思考与总结,自己是否亲自实践过,有自己的什么心得体会,这种东西不是看书能学到的,应该去阅读优秀的开源代码模仿学习。
[解决办法]
没有完美的程序
如果一个程序员觉得自己的程序已经不需要再改了,那这个程序员的职业生命就到此为止了
[解决办法]
作为一个新手,我对楼上的各种说法持有不同意见。首先,书是要尽量多看的,特别是一些特别经典的书籍,这一点是勿庸置疑的。但是诸位说的先思考好在动手写代码,这个对新手是真心的不适合。因为新手掌握的东西有限,一开是写东西的时候,可能根本就没有任何想法,如果选择先思考好,再动手,往往会得出“我不会做”,或者是“太难了”的答案。我对于新手,就是想好一点写一点,中途发现不完美再就补充,这是比较适合的。虽然效率可能会低一些,但是对新手来说,这也是积累经验的一种好方法。