主题:【原创】三年级也可以学编程 -- 月色溶溶
复杂性体现在两个方面:概念和运用。C语言像围棋,规则寥寥数语,落子千变万化。C涉及到的概念都是绝大部分编程语言(lisp之类的函数式语言不算)都要涉及到的(类型,址/值,栈,条件,循环);而还有许多其他的重要的概念,C语言不涉及,而其他主流语言必不可少。在概念的角度,实在不能说C语言复杂,甚至可以说是极为简单。
另外,给楼主的这个程序提若干建议:
一、标准化
(1)#include "stdio.h":标准写法是#include <stdio.h>。尖括号表示这个头文件在系统目录里找,双引号表示先在用户目录里找,找不到了再找系统目录。可是你要的这个stdio.h的的确确是系统文件,没必要先在用户目录(楼主暂时可以理解为main函数所在的文件所在的目录)先找找吧?楼主可以试试在用户目录下新增一个空白的stdio.h,重新编译一下这个程序,看会有什么妖蛾子。
(2)void main是不规范的写法,标准写法是int main(void)或int main( int argc, char *argv[] ),并且main函数最末要return 0。
在此建议楼主远离国内出版的C语言教材。
二、排版
代码一多,一团乱麻,缩进是必须的,不然看不清流程。建议新逻辑块增加4个空格或者1个tab。
花括号用厂式对齐或者匚式对齐。
我慢慢会注意的.
那我就谈谈目前国内c语言教学的现状。我本人在工作中经常使用C++/python,也在大学里教过C语言。目前国内大学面向非计算机专业的编程课仍然以C语言为主,造成这种现象的主要原因是:1,国家二级考试仍然以C和basic为主,不过basic现在用得实在不多,所以学生们更愿意选c语言;2,c语言的教师很好找,计算机系出来的人都会。不过在教学实践上,目前国内教授的基本是经过“阉割”的C,对于c语言比较复杂的地方比如指针,内存分配,宏等,都不做重点要求,少讲,浅讲甚至回避,重点还是放在C语言的基本语法上。这也是经过多年的教学实践,大家对于现实所做的一个妥协。对于初学者而言,面临的主要困难有2个地方:1, 如何用计算机的方式去解决问题,也就是设计计算机算法;2,学会并使用编程语言实现算法。对于编程者而言,前者最重要,后者不过是为了实现前面的目的而附带学习的技能。
在有限的时间内(16周,2节(课堂学习)+2节(上机实践)),通过学习c语言而达到上述两个目标事实上是比较困难的。所以目前的教育者们通过减少第二项的难度来节省出时间来提高第一项的学习效果。所以大家虽然还是在学C语言,但在计算机专业出身的人来看,这个C并不是真正的C。
这样的效果如何呢?我认为并不是很好,对于以后需要用到c的专业来说,比如数学,物理以及一些工科,这样讲得太浅,受得训练不足。以后需要的时候还得自己花时间学习。所以这些专业很多时候要求为他们单独开设c语言课程,提高难度和深度。对于其他的专业来说,他们花了很多时间学习c语言,其成果不过是帮助他们拿了个二级证书。对于他们的工作意义不大。这是因为C语言是一种很适合造轮子的工具,但是大多数人更需要的是把现成的轮子按照自己的要求组装成汽车的工具。造轮子不但需要很多时间,还需要很多很专业的知识和经验,光会个c语言是远远不够的,所以对于非计算机的人从头造轮子并不实际。如果学完c语言,却不学数据结构之类的课程,用c语言做不了什么有意义的工作。至于其他的很有用的工具,例如网络,文本处理,图形界面,图形图像处理等等,就更得寻找第三方的程序库了。c可以使用的程序库确实很多,但是关于这些库的学习资料却很少,即使有大部分也是外文资料,对于使用者来说非常不方便。事实上大多数人找都找不到。相比之下,一些高级的脚本语言,例如python,不但内置常用的数据结构作为语法的一部分,也提供了很强大的标准程序库,学习资料也比较多。所以从使用的角度来看,学习python,c#/java的效益比c语言高得多。
从学习的角度来看,c语言即使经过阉割后,学习难度依然高于python,以及经过类似阉割的c#和java。主要是c语言语法太灵活,针对初学者的陷阱比较多。我见过相当多的学生即使写过比较多的程序后,依然有时会把“==”写作“=”,或者在case后面忘了写break,在臭名昭著的scanf上栽跟头的人更是不计其数。python的语法则很简单不易写错,还可以养成良好的缩进习惯,内置的数据结构更是十分的方便有用。而且同样地功能用python实现,即使不用库函数,代码行数绝对要大大少于c语言。所以现在我如果能用python,绝对不会用c++的。
所以我觉得如果想做长线投资,可以考虑学c语言,虽然java/C#可能更好一些。对于楼主的情形,python足够了。你自己也许有足够的意志和C语言各种陷阱做斗争,学完c语言古怪的语法(对于初学者而言),3年级的学生会不会用这种意志就很难说了,对于这个年龄段的孩子,培养他们的兴趣比教他们知识更有价值。
最后我再补充一点,c语言的学习对于计算机工作原理的理解帮助十分有限。我当年学c的时候,对计算机如何工作仍然不理解,直到学了汇编语言之后,我才明白c语言为什么要设计成那样,c语言程序是如何工作的。因为它们的对应关系十分明显。单学习c是不会有太大的帮助的。
c最重要的是体现一种工程哲学。许多人都知道c是和unix相伴相生的,c/unix搭配,体现了一种精神境界,或者说一种工程哲学。所以c是有内涵的。这一点其它语言都难以相比。
培养小学生计算机科学,要看面向的目标是什么,如果面向的是网络程序员之类的普通IT从业人员,则c未必可取,如果瞄准Ken Thompson、Linus Torvalds那样的天才,那么c是非学不可的。
楼主是从量子力学、相对论那边一路走过来的,您觉得到计算机这地界了,是该学c还是python呢? :-))
目前的现状是,即使专业人士进行计算和仿真也大多采用专门的计算软件,例如matlab。从头开发代价过于高昂了。简单的计算python完全可以胜任,复杂的计算还是调用一些专业软件或者程序库吧,比如scilab。
至于教育,正如我前面所说,对于普通小学生而言,培养兴趣比传授知识更重要,初学者学C容易纠缠于语法细节的陷阱,从而带来挫折感,不利于兴趣的培养。而对于天才来说,从哪里起步都没有问题,c还是python根本不是问题。另外,我也不是说不应该学C,计算机,一些理工科当然应该学,还应该深入的学。其他的专业学C的意义不大。
大部分科学问题,包括许多面向消费者的应用软件,以及计算机的核心软件、系统软件等等还是c/c++为主。
别的不说,MS Windows,Mac OS X,以及linux这几个目前主流的操作系统和各个平台上的主要系统程序和应用程序(killer app),我没有专门调查过,但是无疑的是,主要都是基于c/c++, 太底层的东西可能有些汇编。
其实哪个语言最有用,看看纯软件公司招人考什么就知道了,我觉得还是c/c++为主.
matlab这方面正好我有点了解,对于某些应用还是比较方便的,但是对于许多前沿课题,matlab提供的功能只能算是个小玩具。
c到底有多难,这个真的很难讲,不好量化。总之我觉得不难。也有人说c反而是简单的。其实计算机高级语言,就入门而言,就没有难的。计算机的入门,是个几个主要理工科里面,最最容易的,因为象编程这种活,压根就不需要高等数学,中学数学都不要,专业基础知识也几乎没有要求,所以小学生学编程确实是可行可信的,但是天份也比较重要。反之,物理、数学、化学那样的专业门槛太高。入门之后,深入下去,那么每个专业都难。
天才,确实从哪里起步没有问题,但不论从哪里起步,总归是要走向c/c++的。
您这点说的道理自然是很有的,但也不能绝对。
就是C要真的用起来,需要深度研究,我这样的就比较难了...
那如果是小孩子想学点编程,学了python,对他们以后深入学习编程有用吗?要培养小孩子这方面的兴趣,应该学什么怎么学呢?
什么语言好,国内计算机教育等等问题。这个一扯开就没完没了了。每个人的经历不同看法肯定是大相径庭的。我的看法其实有些偏激,如果你们去翻我以前的帖子,你们会发现我建议初学者从汇编开始。【原创】程序员的入门语言 我一直认为熟悉计算机解决问题的方式才是程序员趋向成熟的标志。
对于初学者来说,任何语言其实都没太大区别(尤其对于成年的文科生)。也许解释型的Python会好一点。但几乎所有初学者都要经历让第一个程序跑起来的痛苦——打字错误、语法问题、陌生的开发环境等等。不管什么语言,这些东西对于一个完全空白的初学者区别真的不大。只有当我们掌握的两种以上的语言和开发环境,回过头来才能品味出其中的区别。而通常在那时候这些问题都不再关键。我们那时候更多地会关注这个语言实现什么东西会更方便——或者说更有用。但这个问题对于初学者来说还太早。
有兴趣往下走的初学者还需要经历许多很基本的东西,比如敲入别人的程序或例题,让他们跑起来;学会使用基本的语法单元——表达式、数组、循环等等;学会用语法元素表达一个指定的过程;这期间还需要掌握初步的排错能力;这些东西其实所有语言都没有太大的分别。
接下来到如何写出好程序的时候,分歧就十分严重了。然而在我的观点里,我只会说那些语言容易写出好的代码。没有糟糕的语言,只有糟糕的程序员。因此我认为更接近底层的C是一个不错的入门选择。我承认对于初学者来说C里面的指针是一个难点,但是谁能够说让初学者了解什么是对象比了解指针更容易?
楼上说的阉割的C真是一个很精彩的词。其实何止阉割的C,大部分用Java的、甚至用Python也同样是阉割的(阉割了OO——所以不能XX)。不过C被阉割之后就真没什么用了,而其他的语言由于自身的库和语言特性还不至于惨不忍睹。所以现在职场中充斥着大量被阉割了而不自知的程序员。
我之前提过一句所有语言都不好学,事实上支撑初学者走下去的通常只能是兴趣,这些兴趣在一开始的时候并不是搞出什么功能,而是——哇靠,终于正确运行了!有这些兴趣支撑,什么难点都有机会跨过。而C出师之后路就要宽很多。这就是为什么我觉得C是一门不错的入门语言。
python可不是玩具,目前的应用非常广泛。mit那个编程的公开课也是以python作为起点的。学习编程最重要的是学习用计算机的方式来解决问题,用哪种语言学习起不到决定性作用,选一种简单易上手的语言可以把注意力更集中到要解决的问题上,而不是纠缠于语言的各种细节。当然想深入学习的话,光学一门python,到了某个阶段之后可能还得学习其他的语言,比如c/c++, java之类的。不过一旦入了门之后(掌握一种语言之后),再学习其他原理类似的语言也比较容易了。计算机软件行业是个高速发展的行业,指望一种技术/语言吃到老,那是不可能的。另外,我觉得现在的程序开发人员至少应该掌握一种开发高效的脚本语言(python/lua/javascript)和一种运行高效编程语言(c++/java/c#),从这个角度来看选择python作为起点是合适的。
培养小孩子兴趣什么的我也没什么经验。python上手非常简单,基本的语法几天就可以学会。然后可以结合小孩子的兴趣或者他们学习的课程写一些小程序什么的。c的那一套教学方法拿到python上都可以,如果他们有更高的要求,利用标准库,python比c也更容易满足。另外给你个建议,小孩子模仿能力强,你费劲心思解释让他们理解,不如让他们动手做做说不定效果更好。开始讲语法前你可以让他们抄一段程序,然后结合这个程序讲一下语法,然后再在这个基础上教他们不断地改进增加功能。即使他们不一定完全能懂你所讲的,也可以让他们对编程有个直观的感受,破除神秘感,增强信心。语法什么并不是最重要的,通过阅读程序,让他们理解甚至习惯用计算机解决问题的思维方式更重要。
很多事情在于解决问题的能力。
编程也是一样。
你这段程序,最主要是调试。
你运行你的程序必然会有错误。
能够找到错误,改正错误就是专业和业余的区别。
也曾经玩过一段时间的MATLAB,对于计算还是比较牛叉的,也一直奇怪于为什么成不了流行的工具,以此请教过很多人,他们大多的回答都是运算的效率不行,今天见您的说法好像是MATLAB的函数库不充足。
还是想请教一下MATLAB的缺点,以至于没能成为流行的编程工具。
(我记得有一次央视报道科学院还是哪里的机器人项目,当时他们演示的就是MATLAB的M文件。)
大概20年前吧,折腾过一个叫BORLAND C++的东西,后来好像还有个VISUAL C++。
这第一步,应该是培养出他们编程的兴趣。让他们觉得编程好玩,而不是枯燥。
python三言两语就能弄出个图形界面来,C呢?
基本是一个商业化的工具。商业化的工具离科学前沿一般都比较远,这应该是一个规律。
其实matlab应用还是比较广的。
效率低那是显然的。解释执行的语言都这样。matlab函数库中计算复杂的部件可能是编译过的,具体懒得再去核实了。现在matlab和c/c++也可以混合运用,各自发挥自身的优势。