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

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

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

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

有帮助吗?

解决方案

让编程变得有趣!

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

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

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

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

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

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

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

最终,他们进展到涉及图遍历和流行图算法的更高级问题(迪克斯特拉氏, 等),组合问题等。每个问题都很有趣,并以小“故事”的形式给出。但请注意,其中一些非常困难!

编辑:在吸引人们参加您的俱乐部会议方面,披萨和苏打水也从来没有坏处。我们的 ACM 俱乐部每次会议都会提供披萨(每月一次)。尽管我们大多数人仍然会出现,但这是一个很好的破冰活动。特别是对于新俱乐部或会员。

其他提示

打破它

对我而言,编程的独特之处在于需要将任务分解为足够小的计算机步骤。这取决于语言,但事实上你可能必须写一个“for循环”。只需要数到100就习惯了。

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

filterItemsByCriteria();

你不知道它是如何工作的,所以你把它分解为更进一步的步骤:

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

filterItemsByCritera() {
  makeCriteriaList();
  lookAtItems();
  removeNonMatchingItems();
}

然后你进一步打破每一个。很快你就可以定义制作标准清单等所需的所有小步骤。当所有小功能都工作时,大功能就可以工作。

这有点像孩子们玩的游戏,他们一直在问“为什么?”在你说完的一切之后,除了你必须继续问“怎么样?”

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

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

问候!

我认为你在强迫特定语言和处理特定主题和课程方面领先于 WAY 。听起来你(和一些响应者)混淆“建议“编程俱乐部”与“领导一个编程类”。它们是非常不同的东西。

我会把小组聚集在一起,小组应该决定他们想要离开俱乐部的是什么。从本质上讲,制定一个“宪章”。对于俱乐部。然后(并且只有那时)你能做出决定,例如首选语言/平台,会议频率,会议将会发生什么等等。

可能会发现最好的方法是“调查”,其中探索不同的语言/平台。或者可能结果是最好的方法是“局部”,其中主题变化(如书籍俱乐部)定期(本月是指针,下个月是排序,下面是递归等)然后以各种语言进行实例和讨论。

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

祝你好运,做得好!

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

我想说,对于初学者来说,不要过快地使用算法,让他们先使用C ++。

上面有人提到“让编程变得有趣”。今天有趣的是,人们不再为了学习而学习。大多数人都想要 及时行乐.

使用编程教授一些逻辑。这有助于(并且确实)解决问题。我脑子里的一类是猜谜游戏。

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

制作纸质说明。

  1. 解释“炒鸡蛋”故事。询问听众他们会做些什么来自己做煎蛋。让他们记下他们想到的步骤。可能你会得到少于5步的算法。然后解释如果我们想要教一台计算机来煎鸡蛋,应该记下多少步骤。类似的东西:
  2. 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语法语义e.t.c的基础知识入手,并与其并行解释了基本的算法,如冒泡排序。
    2. 听觉熟悉结构化编程后(这可能需要几周或几个月,具体取决于你上课的次数),你可以进入C ++和OOP。

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

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

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

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

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

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

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

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

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

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

有一本很好的书,如何不用C ++编程,你可以用来开始。

你总是从错误中学到最好的东西,我更愿意从别的东西中学习。

即使代码只能起作用,它也会让那些经验不足的人看到代码。

除了这个问题的答案之外,还有一些重要的问题要涵盖的主题。以下是如何构建课程的示例。

第一课:术语和语法

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

要覆盖的语法:赋值,操作,if / then / else,for循环,while循环,select,input / output

第二课:基本算法构建

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

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

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

最后一课:小组项目

制作一个群组可以参与的项目。

这些不一定是单日课程。您可以在多天内传播主题。

伪代码应该是第一个。

编辑:如果他们是总编程初学者,那么我会在上半部分编程。一旦你达到一个谈论算法有意义的水平,那么伪代码对于得到指甲非常重要。

感谢您的回复!

你怎么教他们实际解决问题?

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

我认为这只是因为他们正在经历的学习过程不佳。在其他科学 - 例如数学 - 它们真的很棒。

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

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

哇。 C ++是开始时最糟糕的语言之一,就你需要让任何东西工作的无关垃圾量而言(我想Java会稍差一些)。

在一个样板沉重的环境中教授初学者时,通常以“这是一个简单的C程序”开头。我们将讨论文件顶部的所有垃圾是为了以后的内容,但是现在,请专注于'int main(void)'和'return'语句之间的界限,这是完成所有有用工作的地方。 ;。

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

让您的分会通过教授构建软件的概念,学习如何使用任何语言进行实际编程。学生们不必为Visual Studio购买十几个许可证,而是使用编译器,制作系统,源文件,对象和库,以便将他们的C代码转换为程序。我觉得这才是真正的开始,实际上让这些孩子能够理解如何在任何平台上制作软件,而不需要许多教育机构喜欢的依赖。

至于选择的语言 - 祝贺 - 你会发现C ++非常丰富,可以让你想到数学快捷方式和数以百万计的方法来让你的代码表现更好(或实现奇特的模式)。

问题:当我开始编程时,我总是会尝试将一个现实生活中的问题分解为几个步骤,然后当我看到他们转换的任务或数据之间的相似性时,我会总是试图找到一个更容易,更容易的,实现它的有意义的方式。

在学习模式和真实算法时,优雅得以实现。

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

我可以看到几种不同的方法:

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

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

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

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

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

5)数学函数。你如何编程一个阶乘,这是从1到n的所有数字的乘积?你如何计算各种算术或几何系列的总和?或者计算一组n中r个元素的组合或排列数?给定一组点,近似满足该要求的多项式,例如:在一个叫做x和y的二维平面上你可以给出2个点并让人们知道如果你已经解决了线性方程对,那么斜率和y截距是多少。

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

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

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

这些是我对各种起点的建议。我认为开始讨论可能会导致一些有趣的地方,如果你可以让一些人在一起一周又一周地谈论相同的主题,在某些情况下,如果你想获得排序可能是一个很好的主题进入更好的事物。

scroll top