基本编程/算法概念

时间:2008-10-02 19:12:46

标签: algorithm language-agnostic theory

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

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

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

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

23 个答案:

答案 0 :(得分:12)

让编程变得有趣!

可能要讨论的事情是编程竞赛,你的俱乐部可以自己保留,也可以在本地进入。我参加了大学(ACM)级别的编程竞赛,我知道他们也有较低级别的编程竞赛。

这些事件确实可以吸引一些竞争精神,让俱乐部成员更加接近。

事情并不总是与编程有关。或许建议你参加一个局域网聚会,你可以在这里玩游戏,讨论编程等等。

关于与编程/算法相关的实际主题,我建议作为一个小组在这个编程竞赛入门中尝试一些编程问题“ 编程挑战 “:Amazon Link

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

  • 队列
  • 字典

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

最终,他们会遇到更高级的问题,包括Graph Traversal和流行的Graph算法(Dijkstra's等),Combinatrics问题等。每个问题都很有趣,并以小型“故事”格式给出。但要注意,其中一些非常难!

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

答案 1 :(得分:3)

打破它

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

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

filterItemsByCriteria();

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

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

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

问候!

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

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

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

顺便说一句,我会考虑为俱乐部提供“与语言无关”的定位。鼓励孩子们探索不同的语言和平台。

祝你好运,做得好!

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

  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。

答案 7 :(得分:1)

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

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

  • 让他们制作一个猜测0到100之间数字的程序。
  • 让他们做一个黑杰克克隆......我已经基本完成了这个: - (

制作纸质说明。

答案 8 :(得分:0)

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

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

你总是从错误中学得最好,我更愿意从其他人那里学习。

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

答案 9 :(得分:0)

this question的答案外,还有一些重要的主题需要涵盖。以下是如何构建课程的示例。

第一课:术语和语法

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

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

第二课:基本算法构建

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

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

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

最后一课:小组项目

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

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

答案 10 :(得分:0)

感谢您的回复!

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

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

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

答案 11 :(得分:0)

伪代码应该是第一个。

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

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

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

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

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

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

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

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

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

答案 19 :(得分:0)

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

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

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

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

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)指针。这只会导致大量的主题,比如如何分配/取消分配内存,什么是内存泄漏?

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

答案 22 :(得分:0)

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

相关问题