如何教程序员如何用C ++编写代码?

时间:2010-09-17 21:56:46

标签: c++

所以我在这里尝试教我的朋友C ++的艺术。他不是编程新手,但他的专业领域远离C ++。他非常了解html,php和java,但在编写C ++程序时似乎没有用。我们已经完成了基础知识,谈论了指针等。他甚至在他的大学里开了一门关于C ++的课程,但他放弃了一半。看来他真的理解基本理论 - 问题是他在实际使用他所知道的编写程序时失败了。

所以我现在要做的就是给他做作业。任务总是写一个小程序,比如一个原始计算器(输入两个数字和一个确定应该执行操作的字母......)等等。这背后的想法是强迫他实际使用该语言来解决问题,调试它,看看为什么它失败并从中学习。但它似乎不起作用,因为每次我试图让它变得更难并给他一个更复杂的家庭作业,他就无法解决它。我现在应该怎么做?我真的没有家庭作业的想法,我怀疑这种方法是好的。此外,新学期刚开始,他 这次通过C ++课程。所以甚至有一个截止日期 - 今年年底。

那么,你能帮忙吗?

11 个答案:

答案 0 :(得分:11)

问题似乎在其他地方。如果你需要教Java程序员如何编写一个简单的计算器,问题不是语言,问题是对编程的基本理解。

我觉得学习编程的更糟糕的方法是编写没人使用的玩具。根据我的说法,最好的方法是从简单但有用的工具开始,因为这会给程序员带来压力:事情实际上会被其他人使用;它必须工作!

如果任务是管理性的,那么让他写一个disk usage utility并告诉他你将使用它。如果任务是科学的,让他写一个非线性方程求解器。

不确定。 C ++是一门很难掌握的复杂语言(我甚至不是非常接近,我只知道两个人,我会考虑专业的C ++程序员)。但是,这并不像是在教他Haskell,或者是一些完全不同的编程范式。除了内存管理和实际管理指针的细微之处,我看不出编程Java和编程C ++的范式转变。可以肯定的是,它更难,因为它是一种较低级别的语言,但最终它是一种面向对象的软件设计方法。

d。 Knuth有一个诙谐的理由使用他自己的汇编语言教授算法:

  

不仅仅是随便的人   对计算机感兴趣应该有   至少有一些潜在的想法   硬件就好。否则   他们写的程序很漂亮   怪异。

我认为关于内存管理也是如此。即使您使用垃圾收集语言进行编程,您至少应该理解memory这样的事情,并且对象要么由value传递,要么由reference传递。我并不是说它很容易掌握,我说至少应该理解这样的事情发生在幕后,并且在C ++中你管理幕后。

答案 1 :(得分:3)

我想很大程度上取决于他实际上遇到了什么问题。如果他了解Java,我认为他应该知道OOP,集合等的基本概念,对吧?

他能用Java解决相同的任务吗?如果是这样,那么用C ++阻止他的是什么:缺乏对指针的理解(对许多人来说可能很难),内存管理,析构函数或者缺乏关于类库,STL,模板的知识......?

你可以尝试和他一起完成一项任务,看看他有问题,并一步一步地帮助他。

当时我非常喜欢Andrew Koenig的Ruminations in C++ - 它从一开始就对C ++的教学有着非常不同的看法,从优秀的,真实的(虽然简单的)小程序开始,实际上做了一些有用的东西,同时同时教授当时最好的习语。虽然它现在已经过时了,但是在适应最新标准时,它的内容可能仍然有用。

答案 2 :(得分:1)

如果他知道如何编写Java,请让他提供Java和C ++的解决方案,告诉他用Java方式做的时候,他不知道如何在惯用的c ++中做到这一点。然后回顾一下C ++中与Java代码有什么区别,为什么会这样。

答案 3 :(得分:1)

He knows html, php and java fairly well
这句话让我觉得他没有做过适当的编程,他必须理解/可视化他的逻辑流程。是的,他做了一些编程。但他可能从来不知道他的节目如何“流动”。从之前的“编程”经验来看,他更倾向于视觉线索。我非常怀疑他能用Java完成一个完整的程序,甚至是你在C ++中要求他做的那些程序 我学到的第一门编程语言是C ++,我有一位非常优秀的老师,他通过绘制流程图首先想象我们的逻辑流程,让我们开始编程。一旦我们对如何可视化我们的逻辑有了扎实的知识,他就开始教我们C ++的基础知识,整个课程很快就赶上来了。
因此,我想让他学会如何在纸上形象化他的逻辑,然后让他将这种逻辑转化为C ++程序,这将有助于他在没有适当背景的情况下让他学习C ++的所有概念。 一个例子是首先教他流程图中的循环,让他设计一个问题的流程图,比如从1-20打印数字。然后用C ++教他循环,然后让他写一个程序来做同样的事情。

答案 4 :(得分:0)

你做得很好,你甚至自己应该把目标作为开发者,如果他在java方面有经验,那么语法应该没有问题。

此外,他有基础知识,而且他不是初学者,所以你们两个人能做的最好的事情就是获得好的指南,烹饪书和程序,设定一些目标并编写代码。

答案 5 :(得分:0)

当他开始学习如何编程时,他错过了一些基础知识。其中一个基础是,例如,你负责你分配的所有东西 - 就像在现实生活中一样,你必须像成年人那样放弃你所拿出的东西,而不仅仅是把东西扔到地上并期望其他人在你之后清理。

我认为你的做法很好,但已经造成了损害,你必须先修复它才能取得进展。你必须回到基础。什么是变量,真的吗?他可能不知道某处有实际的内存存储,而变量只是指向那里的地址的别名 - 一旦你有了,你就可以解释数组和指针,等等。

真的,首先回到基础,我认为这是他缺乏的。

答案 6 :(得分:0)

我想和你做你正在做的事情;-)。无论如何,我会先弄清楚你的朋友卡在哪里。它是一般解决问题还是使用C ++语言结构&成语?根据您的发现,您可以指导您的朋友提高他的解决问题的能力或语言技能。如果是语言,我肯定会查看C++ Primer book by Lippman, Lajoie and Moo并建议朋友解决练习。虽然这本书有800多页,但任何有过编程语言经验的人都可以阅读。只有最少的C ++经验应该能够在建议的时间范围内阅读本书。

答案 7 :(得分:0)

学习使用现代的,高度抽象化的语言(如C ++和PHP)进行编程意味着随着您对正在发生的事情的了解越来越多,事情变得越来越复杂。要了解更复杂的程序,至少在理论上要了解幕后发生的事情;现代语言旨在隐藏这些细节。因此,试图找出正在发生的事情意味着要与你正在使用的语言范式作斗争。程序员语言所处理的任何低级细节也意味着对程序员隐藏。

现在,如果程序员已经了解了那些低级细节所涉及的内容,以及它们可能产生重大影响的条件,那么程序员也知道何时打破语言抽象面纱。请注意,这是编程语言的开发或发展方式。我们从机器代码和汇编程序开始,然后是非常低级别的便利,然后是一些早期更高级别的可移植语言,如FORTRAN和Lisp。 (注意,不是 Common Lisp和Fortran 2008)。

显然,你可以学习从PHP或C ++开始成为一名有成就的程序员。虽然你可以很快得到一些相当复杂的结果,但我认为成为一名真正高级的程序员可能需要更多的努力。

答案 8 :(得分:0)

网络上有很多关于C ++的免费或付费自学培训课程(免费的例子,Herb Schildt's "C++: A Beginner's Guide";看看“Sams每天一小时教你自己C ++,第六版”付费材料的例子)。还有免费和付费的IDE,使开发体验(编码,构建,测试,调试等)相当容易(!) - 广泛使用的免费IDE是Visual C ++。

向某人教学与学习(前方人行道)一样令人沮丧。一个人必须首先被激励学习。我必须在这里问:你的朋友是否有兴趣学习C ++?他/她是否比学习他/她更有兴趣学习?了解这将使你们两个人生活更轻松。

让我们假设一个最糟糕的情况:既不是你对教学感兴趣,也不是你的朋友想要学习,但他/她必须学习,以便,比方说,申请工作,通过考试或其他任何事情(你想要帮助,因为你的友谊)。因此,学习C ++对于另一个目的来说变得更有意义而不是结束自身。接下来是获得最终目的的一些背景,并尝试将学习过程转变为针对该目标。例如:如果您的朋友对需要为金融行业构建应用程序的工作感兴趣,该怎么办?很可能需要C ++数学库的背景,并且仍然可能需要DB背景(因为这些应用程序保留有关财务索引,客户,余额等的信息)。在这种情况下,将重点放在这些场景上培训课程将落后:从目标到事实。

它只是起作用:在我个人的情况下,我通过编写脑力游戏来学习C ++。这个目标让我处理标准模板库,有一些Windows的UI扩展(在我的情况下是MFC,但取决于操作系统,因为它不是标准的),OOP,基本类型等。我跳过了文件I / O和其他东西为了更好的机会。我还没有学到所有关于C / C ++的知识,但我在游戏方面取得了很大的进步。这有意义吗?

答案 9 :(得分:0)

尝试一些不寻常的事情怎么样:

告诉他教你Java。

通过让他告诉你他对他熟悉的语言有什么了解,你可以深入研究他的思维方式,并且可能有助于了解为什么他很难理解C ++(并且他将不会被激怒他会谈论他已经熟悉的事情。)

告诉他告诉你他对基本Java构造(循环,条件,类)以及这些构造如何工作的看法。你需要非常注意他的每一句话;注意他的看法似乎很可疑。

答案 10 :(得分:-1)

我只是回应Truncheon的答案,但反过来制定。 就个人而言,由于缺乏内存管理,我总是厌恶C ++(以及C)。在这些语言中做字符操作错误的日常事务很容易。如果有人应该告诉我使用C或C ++编程,我有必要(正如我之前所做的那样),但在我能够使用库或解决我使用该语言的基本问题的框架之前,我不会感到高兴。 (与JavaScript相同。)你的朋友可能(或可能不)在同一条船上。