基本编程/算法概念
我要在高中时(与其他程序员一起)建立一个编程和算法俱乐部。选择的语言是C ++,对此感到抱歉,我无法更改。我们可以假设学生对上述主题几乎没有经验。
我们认为我应该关注的最基本概念是什么?
我知道教一些对我来说已经很明显的事情并不是一件容易的事。我意识到第一次会议应该格外注意,不要吓跑学生,所以我问你。
编辑:我注意到程序员和初学者之间的主要区别可能是"程序员的思维方式",我的意思是将问题概念化为算法。我知道这只是实践问题,但是我们知道会刺激该领域发展的任何形式的练习/概念/事物吗?
解决方案
伪代码应该是第一个。
编辑:如果他们是编程的初学者,那么我将只谈编程的前半部分。一旦达到了对算法进行讨论的水平,那么伪代码对于掌握基本知识就非常重要。
链接列出了一个经典的面试问题,这是有充分理由的。
我会尝试使用C子集,而不是尝试使用OO东西。在他们了解一些基本知识之后,可以对其进行介绍。
Deitel&Deitel的C ++编程中的内容是不错的介绍,每章末尾提出的练习都是很好的玩具问题。
基本上,我们是在谈论:
控制结构
功能
数组
指针和字符串
我们可能想跟进STL的介绍("好吧,既然我们已经完成了艰辛的工作,这是一个更简单的选择")
首先让他们理解诸如排序之类的问题。这是非常基本的,他们应该能够很快建立联系。一旦他们看到问题,然后向他们提供解决问题的工具/解决方案。
我还记得当我第一次展示合并排序示例时的感觉。我可以按照所有步骤进行操作,但是我到底是干什么的?然后,Make渴望解决问题,他们将更好地理解工具和解决方案。
让编程变得有趣!
可能要谈的是编程竞赛,俱乐部可以举办自己的比赛,也可以在本地参加。我参加了大学(ACM)级别的编程比赛,并且我知道他们也将其放在较低级别。
这类活动可以真正激发出一定的竞争精神并使俱乐部成员拉近距离。
事情也不一定总是与编程有关。也许建议在我们参加游戏,讨论编程等的局域网聚会时也是一个好主意。
关于与编程/算法相关的实际主题,我建议作为一个小组,在此编程竞赛入门"编程挑战"中尝试一些编程问题:Amazon Link
他们从相当基本的编程问题开始,然后逐渐发展为需要各种数据结构的问题,例如:
- 堆栈
- Queue列
- 辞典
- 树木
- 等等
大多数问题都是用C ++给出的。
最终,他们陷入了更高级的问题,涉及图遍历和流行的图算法(Dijkstra等),组合问题等。每个问题都很有趣,并且以小"故事"形式给出。请注意,其中一些非常难!
编辑:
披萨和苏打水在吸引人们参加俱乐部会议方面从未受到任何伤害。我们的ACM俱乐部在每个会议上(一个月一次)都提供比萨饼。即使我们大多数人仍然会出现,它还是一个不错的破冰船。特别是对于新俱乐部或者会员。
从一个简单的" hello world"程序开始。这介绍了诸如变量,写入流和程序流之类的基础知识。
然后从那里添加复杂性(链接列表,文件io,获取用户输入等)。
我说从" hello world"开始的原因是,孩子很快就会看到正在运行的程序。这几乎是即时的反馈-因为他们将从一开始就编写了一个正在运行的程序。
IMO,Big-O是入门程序员学习的更重要的概念之一。
进行调试比赛。提供包含错误的代码示例。进行竞赛,看看谁能找到最多或者最快的。
有一本非常好的书,《如何不使用C ++编程》,我们可以一开始就使用。
我们总是从错误中学到最好的东西,而我更喜欢从其他错误中学到的东西。
即使代码几乎可以正常工作,它也将使经验不足的人通过学习代码来学习。
除了这个问题的答案之外,还有一些重要的主题需要讨论。这是一个如何组织课程的示例。
第一课:术语和语法
涵盖的术语:变量,运算符,循环(迭代),方法,保留字,数据类型,类
覆盖语法:赋值,操作,if / then / else,for循环,while循环,选择,输入/输出
第二课:基本算法构造
涵盖一些简单的算法,其中涉及一些输入,可能是for或者while循环。
第三课:更高级的算法主题
这是用于递归,矩阵处理和高级数学之类的东西。我们不必进入过于复杂的主题,而是要引入足够的复杂性以在实际项目中有用。
最后一课:小组项目
制定一个小组可以参与的项目。
这些不必是单日课程。我们可以将主题分布多天。
多谢回覆!
我们将如何教他们解决实际问题?
我认识一群了解C ++语法和一些基本算法的学生,但他们在解决实际问题时无法运用他们所知道的知识,他们不知道将方法转化为一套严格的方法的方法脚步。我不是在谈论诸如动态编程,贪婪等"高级"方法,而是在谈论基本的算法思维方式。
我认为这仅仅是因为他们所经历的学习过程很差。例如,在其他科学数学中,它们确实很棒。
好吧,这是一个编程俱乐部,所以应该很有趣!因此,我想说一下立即掌握一些实践经验。首先说明什么是main()方法,然后让学生编写一个hello world程序。逐步改进hello world程序,使其具有功能并打印出用户输入。
我想说的是,对于初学者,不要太快地进入算法,让他们首先使用C ++。
仅仅因为我们熟悉算法并不意味着我们可以实现它们,而仅仅因为我们可以编程并不意味着就可以实现算法。
从每个主题着手(从编程到设计算法的分开编程)开始。一旦它们对每个都有影响,就慢慢开始将这两个概念结合在一起。
哇。就需要使任何东西正常工作而言,C ++是最糟糕的语言之一,从无关的废话来看(我想Java会稍差一些)。
在繁重的环境中教初学者时,通常以"这是一个简单的C程序开始。我们稍后将讨论文件顶部的所有废话,但现在,我们着重于' int main(void)"和" return"语句,这是完成所有有用工作的地方"。
一旦超过了这一点,要涵盖的基本概念将包括基本数据结构(数组,链表,树和字典)以及基本算法(排序,搜索等)。
分解
对我而言,编程的独特之处在于需要将任务分解为足够小的计算机步骤。这因语言而异,但是我们可能不得不编写一个" for循环"以计数到100的事实已经习惯了。
"自上而下"的方法可能有助于此概念。首先,为程序创建一个主函数,例如
filterItemsByCriteria();
我们不知道该如何工作,因此将其分解为更多步骤:
(注意:我不了解C ++,所以这只是一个通用示例)
filterItemsByCritera() { makeCriteriaList(); lookAtItems(); removeNonMatchingItems(); }
然后,我们将每个细分细分。很快我们就可以定义制作标准列表所需的所有小步骤,等等。当所有的小功能都起作用时,大的功能就会起作用。
这有点像孩子们在不断问"为什么"的游戏。在我们说完所有内容后,除了我们必须不断询问"如何?"
上面提到的"使编程变得有趣"。今天有趣的是人们不是为了学习而学习。大多数人都希望得到即时满足。
使用编程来教一些逻辑。这有助于(并且正在)解决问题。我脑子里的分类是猜游戏。
- 让他们制作一个猜测0到100之间数字的程序。
- 让他们制作一个黑色Hyman克隆……我已经在基本的:-(
进行纸质说明。
- 解释"煎蛋"的故事。询问听觉他们将如何做以自己的煎鸡蛋。让他们注意他们考虑的步骤。可能我们会收到少于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. :)
- 从C-语法语义等基础知识开始,并与此同时解释非常基本的算法,例如冒泡排序。
- 听觉熟悉结构化编程后(这可能需要数周或者数月,具体取决于我们上课的频率),然后可以升级到C ++和OOP。
让俱乐部通过教授建筑软件的概念来学习如何用任何语言进行编程。让学生使用大量的编译器,制作系统,源文件,对象和库,而不是为了购买Visual Studio的大量许可证而将其C代码转换为程序。我觉得这确实是一个开始,实际上使这些孩子能够了解如何在任何平台上制作软件,而不会像许多教育机构那样依赖拐杖。
你好!
我认为我们在强制使用特定语言并从事特定主题和课程方面正处于领先地位。听起来我们(和一些响应者)正在将"建议编程俱乐部"与"领导编程班"混淆起来。他们是完全不同的东西。
我会把小组聚在一起,小组应该决定他们到底想离开俱乐部什么。本质上,为俱乐部做一个"章程"。然后(只有那时)我们可以确定诸如首选的语言/平台,开会的频率,会议将要发生的事情等。
可能发现最好的方法是"调查",其中探索了不同的语言/平台。或者,可能最好的方法是"主题"方法,即定期更改主题(例如读书俱乐部)(本月为指针,下个月为排序,以下为递归等),然后以各种语言进行示例和讨论。
顺便说一句,我会考虑俱乐部的"语言不可知"取向。鼓励孩子们探索不同的语言和平台。
祝你好运,辛苦工作!
至于选择语言的祝贺,我们会发现C ++在使我们想到数学捷径方面非常丰富,并且有数百万种方法可以使代码表现得更好(或者实现奇特的模式)。
问题是:当我开始编程时,我总是尝试将一个现实问题分解为几个步骤,然后当我看到任务或者数据之间的相似性时,我总是会尝试找到一种更懒惰,更轻松,更有意义的方法实施它。
当学习模式和实际算法时,优雅就出现了。
汉克:大O ???意思是告诉新手程序员,他们的代码是O(n ^ 2),而代码是n log n?
我可以看到几种不同的方法来做到这一点:
1)基本的编程构建块。什么是条件语句,例如切换,如果/否则?什么是重复陈述,例如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)指针。这只会导致大量的主题,例如如何分配/取消分配内存,什么是内存泄漏?
这些是我对各种起点的建议。我认为,如果我们可以聚集一些不介意在一个星期又一个星期讨论同一主题的人,那么开始讨论可能会导致一些有趣的话题,因为如果我们想得到一个很好的话题,那么分类可能是一个很重要的话题深入了解事物。
你们可以从" Scratch的C ++标准库"构建TinyPIM项目,然后在工作时开始设计自己的扩展。