17

我即将(与其他程序员)在我的高中开始一个编程和算法俱乐部。选择的语言是 C++ - 抱歉,我无法更改。我们可以假设学生在上述主题方面几乎没有经验。

你认为我应该关注的最基本的概念是什么?

我知道教一些对我来说已经很明显的东西并不是一件容易的事。我意识到应该对第一次会议给予极大的关注——不要吓跑学生——因此我问你。

编辑:我注意到程序员和初学者之间的主要区别可能是“程序员的思维方式”——我的意思是,将问题概念化为算法。我知道这只是练习的问题,但是您知道任何可以刺激该领域发展的练习/概念/事物吗?

4

23 回答 23

12

让编程变得有趣!

可能要讨论的事情是编程比赛,您的俱乐部可以自己举办或者可以在当地参加。我参加了大学(ACM)级别的编程比赛,我知道他们也有较低级别的比赛。

这类活动真的可以激发一些竞争精神,拉近俱乐部成员的距离。

事情也不一定总是与编程有关。或许建议举办一个局域网聚会,在那里您可以玩游戏、讨论编程等,这也是一个好主意。

就编程/算法相关的实际主题而言,我建议作为一个小组在这个编程竞赛入门“编程挑战”中尝试一些编程问题:亚马逊链接

他们从相当基本的编程问题开始,然后慢慢发展为需要各种数据结构的问题,例如:

  • 堆栈
  • 队列
  • 字典
  • 树木
  • ETC

大多数问题都是用 C++ 给出的。

最终,他们进入更高级的问题,包括图遍历和流行的图算法(Dijkstra等)、组合问题等。每个问题都很有趣,并且以类似“故事”的小格式给出。但请注意,其中一些非常难!

编辑:在让人们出席您的俱乐部会议时,比萨和苏打水也不会受到伤害。我们的 ACM 俱乐部每次会议(每月一次)都有披萨。尽管我们大多数人仍然会出现,但它是一个很好的破冰船。特别是对于新的俱乐部或会员。

于 2008-10-02T19:20:14.557 回答
3

打破它

对我来说,编程的独特之处在于需要将任务分解为计算机足够小的步骤。这因语言而异,但您可能不得不编写一个“for 循环”才能数到 100,这一事实需要您习惯。

“自上而下”的方法可能有助于这个概念。您首先为您的程序创建一个主函数,例如

filterItemsByCriteria();

您不知道这将如何工作,因此您将其分解为进一步的步骤:

(注意:我不懂 C++,所以这只是一个通用示例)

filterItemsByCritera() {
  makeCriteriaList();
  查看项目();
  removeNonMatchingItems();
}

然后你进一步分解每一个。很快您就可以定义制作标准列表等所需的所有小步骤。当所有小功能都起作用时,大功能就会起作用。

这有点像孩子们玩的游戏,他们一直在问“为什么?” 在您说完所有内容之后,除了您必须不断问“如何?”

于 2008-10-02T20:27:08.780 回答
2

链接列表 - 一个经典的面试问题,并且有充分的理由。

于 2008-10-02T19:14:53.007 回答
2

我会尝试使用 C 子集,而不是尝试从 OO 开始。这可以在他们了解一些基础知识后进行介绍。

于 2008-10-02T19:14:58.093 回答
2

问候!

我认为您在强制使用特定语言并研究特定主题和课程方面已经超越了自己。听起来您(和一些响应者)将“为编程俱乐部提供建议”与“领导编程课程”混淆了. 它们是非常不同的东西。

我会把团队召集在一起,团队应该决定他们到底从俱乐部中得到什么。本质上,为俱乐部制定一份“章程”。然后(并且只有那时)您才能做出决定,例如首选语言/平台、见面的频率、会议上会发生什么等。

事实证明,最好的方法是“调查”,探索不同的语言/平台。或者可能会证明最好的方法是“主题”方法,其中定期更改主题(如读书俱乐部)(本月是指针,下个月是排序,以下是递归等)和然后以各种语言进行示例和讨论。

顺便说一句,我会考虑俱乐部的“语言不可知论”方向。鼓励孩子们探索不同的语言和平台。

祝你好运,伟大的工作!

于 2008-10-02T20:43:37.583 回答
1

嗯,这是一个编程俱乐部,所以应该很有趣!所以我会说马上投入一些经验。首先解释什么是 main() 方法,然后让学生编写一个 hello world 程序。逐步改进 hello world 程序,使其具有功能并打印出用户输入。

我想说对于初学者来说不要太快进入算法,让他们先玩 C++。

于 2008-10-02T19:55:06.750 回答
1

上面有人提到,“让编程变得有趣”。今天有趣的是,人们不是为了学习而学习。大多数人想要即时满足

使用编程教一些逻辑。这有助于(并且是)解决问题。我脑海中的分类是猜谜游戏。

  • 让他们编写一个程序来猜测 0 到 100 之间的数字。
  • 让他们做一个黑杰克克隆……我已经基本做到了:-(

制作纸质说明。

于 2008-10-02T20:31:36.553 回答
1
  1. 解释“煎鸡蛋”的故事。询问听觉他们会做什么来让自己煎鸡蛋。让他们记下他们想到的步骤。可能您会收到少于 5 步的算法。然后向他们解释,如果我们要教计算机煎鸡蛋,应该写下多少步骤。就像是:
1) Go to the Fridge 
2) Open the fridge door 
3) Search for eggs 
4) If there are no eggs - go to the shop to buy eggs ( this is another function ;) ) 
5) If there are eggs - calculate how many do you need to fry 
6) Close the fridge door 
7) e.t.c. :)
  1. 从 C 的基础——语法语义等开始,同时解释非常基本的算法,如冒泡排序。
  2. 在听觉熟悉结构化编程之后(这可能需要几周或几个月,具体取决于您上课的频率),您可以进阶到 C++ 和 OOP。
于 2008-10-02T20:38:40.810 回答
0

伪代码应该是第一个。

编辑:如果他们是完全的编程初学者,那么我会让前半部分只是关于编程。一旦你达到了谈论算法有意义的程度,那么伪代码就变得非常重要了。

于 2008-10-02T19:14:52.697 回答
0

Deitel&Deitel 的 C++ 编程中的内容是一个不错的介绍,每章末尾提出的练习都是不错的玩具问题。

基本上,你在谈论: - 控制结构 - 函数 - 数组 - 指针和字符串

您可能想要跟进对 STL 的介绍(“好的,现在我们已经完成了艰难的工作......这是一个更简单的选择”)

于 2008-10-02T19:18:04.623 回答
0

首先让他们了解诸如排序之类的问题。这是非常基本的,他们应该能够很快地联系起来。一旦他们看到问题,然后向他们提供解决问题的工具/解决方案。

我记得当我第一次展示合并排序示例时的感受。我可以按照所有步骤进行操作,但我到底是为了什么?然后渴望解决问题,他们会更好地理解工具和解决方案。

于 2008-10-02T19:19:25.180 回答
0

从一个简单的“hello world”程序开始。这介绍了变量、写入流和程序流等基础知识。

然后从那里添加复杂性(链表、文件 io、获取用户输入等)。

我说从 hello world 开始的原因是因为孩子会很快看到正在运行的程序。这几乎是即时的反馈——因为他们从一开始就编写了一个正在运行的程序。

于 2008-10-02T19:21:07.393 回答
0

IMO,Big-O是初级程序员学习的比较重要的概念之一。

于 2008-10-02T19:21:34.507 回答
0

进行调试比赛。提供包含错误的代码示例。进行比赛,看看谁能找到最多或最快。

有一本很棒的书,How Not to Program in C++,你可以从它开始。

你总是从错误中学到最好的东西,而我更喜欢从别人的错误中学习。

它还可以让那些没有经验的人通过看代码来学习,即使代码几乎可以工作。

于 2008-10-02T19:25:13.687 回答
0

除了这个问题的答案之外,还有一些重要的话题需要讨论。这是一个如何组织课程的示例。

第一课:术语和语法

涵盖的术语:变量、运算符、循环(迭代)、方法、保留字、数据类型、类

涵盖的语法:赋值、操作、if/then/else、for 循环、while 循环、选择、输入/输出

第二课:基本算法构建

涵盖一些简单的算法,涉及一些输入,可能是 for 或 while 循环。

第三课:更高级的算法主题

这适用于递归、矩阵操作和高级数学。您不必涉及太复杂的主题,但要引入足够的复杂性以在实际项目中有用。

最后一课:小组项目

制作一个团队可以参与的项目。

这些不一定是单日课程。您可以将主题分散到多天。

于 2008-10-02T19:29:52.287 回答
0

感谢您的回复!

你将如何教他们解决实际问题?

我认识一群知道C++语法和一些基本算法的学生,但是他们在解决实际问题时无法应用他们所知道的知识——他们不知道方法,将他们的想法转化为一组的方法严格的步骤。我不谈论动态编程、贪心等“高级”方法,而是谈论基本的算法思维方式。

我认为这只是因为他们正在经历糟糕的学习过程。在其他科学领域——例如数学——它们非常出色。

于 2008-10-02T19:45:28.130 回答
0

仅仅因为你熟悉算法并不意味着你可以实现它们,仅仅因为你会编程并不意味着你可以实现算法。

从每个主题开始简单(将编程与设计算法分开)。一旦他们掌握了每个概念,就慢慢开始将这两个概念结合在一起。

于 2008-10-02T19:59:00.843 回答
0

哇。C++ 是最糟糕的语言之一,就你需要的不相关的废话数量而言(我猜 Java 会更糟)。

在样板繁重的环境中教授初学者时,通常从“这是一个简单的 C 程序。我们将讨论文件顶部的所有这些废话是什么,但现在,专注于 ' 之间的行int main(void)' 和 'return' 语句,这是完成所有有用工作的地方”。

一旦你过了这一点,要涵盖的基本概念包括基本数据结构(数组、链表、树和字典)和基本算法(排序、搜索等)。

于 2008-10-02T20:03:18.167 回答
0

通过教授构建软件的概念,让您的俱乐部学习如何用任何语言实际编程。与其用完购买十几个 Visual Studio 许可证,不如让学生使用编译器、制作系统、源文件、对象和库,以便将他们的 C 代码转换为程序。我觉得这确实是一个开始,实际上使这些孩子能够了解如何在任何平台上制作软件,而无需许多教育机构喜欢依赖的拐杖。

于 2008-10-02T20:40:00.790 回答
0

至于选择的语言 - 恭喜 - 你会发现 C++ 非常丰富,可以让你想到数学捷径和数百万种方法来让你的代码表现得更好(或实现花哨的模式)。

对于这个问题:当我开始编程时,我总是试图将一个现实生活中的问题分解成几个步骤,然后当我看到它们转换的任务或数据之间的相似性时,我总是试图找到一种更懒惰、更简单、更简单的方法来解决实施它。

当学习模式和真正的算法时,优雅就出现了。

于 2008-10-02T21:25:48.013 回答
0

汉克:大O???你的意思是告诉初学者他们的代码是 O(n^2) 而你的代码是 n log n ??

于 2008-10-06T17:18:37.963 回答
0

我可以看到几种不同的方法来解决这个问题:

1) 基本的编程构建块。什么是条件语句,例如 switch 和 if/else?什么是重复语句,例如 for 和 while 循环?我们如何将这些结合起来以使程序成为我们想要的步骤序列?您可以采取一些简单的方法,例如添加杂货账单或将温度或距离从公制转换为英制,反之亦然。什么是基本变量类型,例如字符串、整数或双精度?同样在这里,您可以使用布尔代数来获得高级想法,或者可能教如何以 2 或 16 为基数进行算术运算,有些人可能会觉得这很容易,而另一些人觉得很难。

2)算法上什么是相似的构建块。排序是一个非常简单的话题,可以广泛讨论和分析,以试图找出如何使排序更快,而不是仅仅交换看起来无序的元素,如果你学习了冒泡排序,这是最脑残的方法。

3) 编译和运行时元素。什么是调用栈?什么是堆?如何处理内存以运行程序,例如代码片段和数据片段?我们如何打开和操作文件?什么是编译和链接?什么是make文件?其中一些很简单,但也可以让人大开眼界,看看事情是如何运作的,这可能是俱乐部大部分时间所涵盖的内容。

接下来的两个更具挑战性,但可能很有趣:

4)讨论算法背后的各种想法,例如:1)分而治之,2)动态编程,3)蛮力,4)数据结构的创建,5)将问题简化为已经解决的类似问题,例如斐波那契数是给初级程序员的经典递归问题,以及 6) 如果你在一个硬币面额为 a、b 和 c 的国家,那么“贪婪”的想法就像在一个做出改变的例子中一样。如果您想要一些异国情调的东西,您也可以使用一些图论示例,例如最小权重生成树,或者旅行推销员想要一些易于描述但难以解决的东西。

5) 数学函数。你将如何编程一个阶乘,它是从 1 到 n 的所有数字的乘积?您将如何计算各种算术级数或几何级数的总和?或者从一组 n 中计算 r 个元素的组合或排列的数量?给定一组点,逼近满足此要求的多项式,例如,在称为 x 和 y 的二维平面中,您可以给出 2 个点,如果您已经解决了成对的线性方程组,则让人们找出斜率和 y 截距是多少已经。

6) 可以使用链表和数组实现的列表。哪种情况更适合各种情况?如何实现插入、删除、查找和排序等基本功能?

7) 抽象数据结构。什么是栈和队列?你如何构建和测试类?

8) 指针。这只会导致大量的话题,比如如何分配/取消分配内存,什么是内存泄漏?

这些是我对各种起点的建议。我认为开始讨论可能会导致一些有趣的地方,如果你可以让几个不介意一周又一周地谈论同一主题的人在一起,因为如果你想得到分类,分类可能是一个很好的话题进入事物的细微之处。

于 2008-10-18T00:49:57.317 回答
0

你们可以从“从头开始的 C++ 标准库”构建 TinyPIM 项目,然后,当它工作时,开始设计自己的扩展。

于 2009-01-21T22:02:43.207 回答