※ 引述《powenyu (powen0706)》之铭言:
: 小弟不才 打算在暑假选一本C++的书来啃
: 我本身有稍微碰过C,但是观念非常不扎实,像是指标、阵列、递回之类的
: 我目前是计画把zerojudge的题目A在暑假做完,但是还是希望能配著书来读
我花了十分钟用 Google 爬完你发过的文。
大致上可以知道去年已经是大一,原本是读高中,然后考台科读。
其它私事就先不提,总之光从 IP 看你都是用台科无线网络,所以查不到科系。
但根据读完大一以后只是“稍微碰过 C”和“指标、阵列、递回观念不扎实”,
研判应该不是电资类的科系,不然应该至少已经被资料结构这门课操过了。
因为没什么力气再去翻台科的电资科系的课表,姑且就先当你是个非相关科系学生。
如果你是非相关科系的学生,在学 C++ 之前,你得先搞清楚你为什么要学 C++。
你未来想从事什么方面的研究要用到 C++?你未来想从事什么样的工作会用到 C++?
你现在是大学生,不再是高中生,很快就要出社会工作,要尽量确立目标再决定学什么。
先确立你的目标再来决定要学什么东西,不要觉得自己时间还有很多,剩下三年很快的。
你把你的目标和动机还有自己背景都好好讲出来,我再认真回技术方面的东西。
: 因为我以前的学习方式是拿到题目就写,不会就问同学,或是去网络上看大神的程式码
: 再依题目自己修改,可是常常就会忽略这个用法的观念,招致错误的用法或没效率的
: 用法
先讲这些的原因是因为看到你还是以解题为目标,进行着很国中化、高中化的学习方式。
你没有一个想要制作的作品,而且也没尝试过从无到有写出一支程式,都是透过模仿。
问同学固然跟上网查一样可以快速得到答案,但是你的知识就是片片段段无系统性。
把网络切掉,只给你 C 语言教科书和函式库工具书,你能不能写出个什么来?
是不是没有人问,没有办法透过网络或一堆范例的书抄程式码来改,你就什么都做不到?
你先设法逼自己只有 C 语言教科书和函式库工具书就能写出程式,之后再来谈其它。
C++ 对现在的你来说还是太庞大了,特别是现在这种学习方式,根本没办法把 C++ 学好。
: 想问大神们对这种状况有什么推荐的书籍吗,像有一本:插画学C语言 我觉得图解对我的
: 观念有很大的帮助,但是我觉得他讲太少了,例题不够内文不连贯,蛮可惜的,但是如
: 果有类似的书,欢迎大家推荐。
会找到适合自己的书是好的开始。
学程式的前几本书我从来都不建议叫人推荐,毕竟每个人适合的入门学习法不同。
你先多找到几本可以厘清你观念的书,自学到入了门了,再找人推荐经典书籍才有意义。
你得天独厚人在台北,自己去重庆南路逛一下天珑书局,现场去挑适合你自学的书。
很多县市的学生没有这种环境,只能网络上没看过就买,搞到选书跟抽签一样碰运气。
图书馆也是一个可以利用的地方,但这很看学校及馆藏,去专业电脑书店选书绝对没错。
你也不一定要去选 C 或 C++ 的书,有兴趣的题材跟程式语言你都能翻来看看有无兴趣。
会一直跟你强调这个是因为 C/C++ 在泛软件业里不是大宗,很多公司并不使用 C/C++。
如果你是电资类的本科系学生,因为常需要写中低阶程式,学 C/C++ 我就会觉得还好。
但即使是这类学生跑来问,我一样还是会先问你将来想干嘛。
如果你不想思考或回答我这些问题,你可以直接杀去 C_and_CPP 板再发问一次。
既然你发在 Soft_Job 这种社会人士板,那我会先以入社会后想干嘛为考量来回文。
当然不管你是什么科系,未来想干嘛,想透过 C/C++ 来学程式,有些东西可以在这先讲。
首先,你需要的书只有两种。
一种是打稳基础观念的 C 语言教科书。
另一种就是罗列 C 语言标准函式库所有函式及简易使用范例的工具书。
你需要的书就只有这两种,其它速成类、纯范例类的书,你可以全部跳过。
靠着这两种书写出你想写的东西,解你想解的题目,不要上网查或问人。
如果做不到,那代表你的个性根本就不适合以写程式为业,当日常生活工具玩玩就好。
只是要把程式当日常生活工具玩玩就好,你有更好的选择,C/C++ 绝对不是首选。
你去学个按键精灵的命令稿语言搞不好在把妹上还比较有利,我是很认真在说。
当你用这些方法去土砲实作东西和解题时遇到方法或效能上的障碍,那才需要读其它书。
所谓其它书,就是资工本科系的两大必修课,资料结构和算法。
如果你对背后的数学原理有兴趣,想要自己设计算法,还需要读一下离散数学。
但是这几种书对现在的你来说都还太早,你连程式语言的基础都还没系统化学习过。
说真的如果你是好好读书从基础学起,我不清楚阵列跟指标到底有什么难懂。
阵列名称跟指标名称都是识别字 (identifier),使用前需要先宣告 (declare)。
这些识别字在被定义 (define) 后会在内存被配置一块空间,里面可以存资料。
当这些识别字被拿来当变量 (variable) 使用时,同时也会是算子 (operand)。
而针对算子进行操作的符号称为运算子 (operator),功能当然就是拿算子来运算。
由算子和运算子构成运算式 (expression),譬如 a + b 这样的东西。
由一条运算式再加上分号做结尾,就构成一条简单叙述 (simple statement)。
而使用大括号把好几条叙述包起来的就叫复合叙述 (compound statement)。
叙述 (statement) 在 C/C++ 是真正的基本单位,整个程式由各种叙述完成。
一般人讲的什么 if 语法、switch 语法等等,真正的名称是叫 if 叙述、switch 叙述。
讲这些干嘛?因为程式语言也是语言,只是限制比较多,学起来比自然语言简单而已。
你学英文一样要学文法,要知道如名词、动词、形容词、副词等各种词性。
运算式在英文的文法里如同子句 (clause) 或词组 (phrase),
而叙述在英文的当中就是更浅显易懂的东西,称为句子 (sentence)。
就如同文章是由段落组成,段落是由句子组成一样,
你的整个程式也是由一段一段的叙述所组合出来的。
当然就像一本著作甚至还会区分章节一样,程式其实也有编译单元、模组等概念。
不过这种东西对你现阶段来说还太早,因为你写程式的主要方法还是拿现成的来改。
你要先学的东西,就只是怎么在一张完全空白的白纸上写出无语法错误的一支支小程式。
阵列名称说穿了丢到程式上就是个算子及变量,然后它有特殊的运算子可以对它操作,
也就是下标运算子 (subscript operator),就是中括号 [] 这种东西。
指标名称说穿了丢到程式上还是个算子和变量,它也有个特殊的运算子可以对它操作,
称为提领运算子 (dereference operator),也就是星号 * 这种东西。
这东西你只要稍微了解一下是在干嘛,就算看到 N 个提领运算子在一起,也不会怕它。
N 个提领运算子在一起就是做 N 次提领而已,也没什么,本质都是不变的。
除此之外,运算子作用在不同型别的算子上也有不同意义,
譬如你对一个指标型别的算子做 + 1,实际上运算结果常常不是只是多了 1 而已。
你必须先搞清楚不同型别 (type) 的算子有哪些运算子可以用,它们的作用是什么。
什么叫型别?阵列和指标本身就是一种型别,当然你常看到的 int、float 等等也是。
型别影响到编译器怎么去看待运算子跟算子,转译出来的机械指令也有差别。
两个 double 变量相加,编译器转译出来的是浮点运算指令,
因此这种加法的两个算子里的位元排列方式,CPU 会以浮点数特有的格式来做解读。
两个 int 变量相加,编译器转译出来的是整数运算指令,
因此这种加法的两个算子里的位元排列方式,CPU 会以整数格式来做解读。
当运算子两边的算子型别不同时,编译器还得先暗中把它们转成同型别再决定指令。
其它东西要一口气在这讲完就太多了,多到可以写一本来卖,就留给你自己看吧。
递回是一种程式结构,它的原理就是数学,但是这边可以先不管。
在程式上递回就是一种叫电脑暴力反复做一样的事,直到你设定的条件发生为止的东西。
所以递回的构成元素就只有两项:1. 继续往下用力算的执行部分 2. 终止条件
所以你想要写一个把传入的变量不断递减到 0 的递回函式的话,首先就要放终止条件。
就像我一开始问你想学 C++ 是什么目的,你有什么目标?
程式总是为某个目的而写的,所以你一开始要决定的就是目标。
void decrease_until_zero(unsigned v)
{
if(v == 0) return; /* 终止条件是让 v 变成 0 */
}
然后达到目的的过程是“不断递减”,所以你得加上一行递减的动作:
void decrease_until_zero(unsigned v)
{
if(v == 0) return;
v