【问题标题】:Basic programming/algorithmic concepts [closed]基本编程/算法概念
【发布时间】:2008-10-02 19:12:45
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: algorithm language-agnostic theory


    【解决方案1】:

    让编程变得有趣!

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

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

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

    就编程/算法相关的实际主题而言,我建议作为一个小组在本编程竞赛入门“编程挑战中尝试其中一些编程问题强>":Amazon Link

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

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

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

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

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

    【讨论】:

    • 如果我们把食物带进 CS 教室,我们的监督老师会直接杀了我们。 ;)
    • 远离 CS 的东西,比如数据结构和算法,以及 OO。只有编码人员认为这些很有趣。做一些项目,比如简单的游戏、科学项目、几何。一个程序,你输入你的名字,然后它就会侮辱你——他们喜欢这个。
    • 我同意你应该远离数据结构和算法,但是 OO 编程的抽象曾经让我这个非程序员着迷。我无法理解一个充满文字的屏幕是如何变成这些可以相互交流的奇怪“物体”的,但我非常想知道。
    【解决方案2】:

    打破它

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

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

    filterItemsByCriteria();

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          您好!

          我认为您在强制使用特定语言并处理特定主题和课程方面比自己领先 WAY。听起来您(和一些响应者)正在混淆“建议编程俱乐部”和“领导编程课”。它们是非常不同的东西。

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

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

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

          祝你好运,干得好!

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

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

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

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

              制作纸质说明。

              【讨论】:

                【解决方案8】:
                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。

                【讨论】:

                  【解决方案9】:

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

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

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

                  【讨论】:

                    【解决方案10】:

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

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

                    【讨论】:

                      【解决方案11】:

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

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

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

                      【讨论】:

                        【解决方案12】:

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

                        【讨论】:

                        • 当然。虽然对于容易害怕的想成为程序员的人来说,我认为它不够有趣:)
                        【解决方案13】:

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

                        有一本很棒的书,《如何不使用 C++ 进行编程》,你可以从它开始。

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

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

                        【讨论】:

                          【解决方案14】:

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

                          第一课:术语和语法

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

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

                          第二课:基本算法构建

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

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

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

                          最后一课:小组项目

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

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

                          【讨论】:

                            【解决方案15】:

                            伪代码应该是第一个。

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

                            【讨论】:

                              【解决方案16】:

                              感谢您的回复!

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

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

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

                              【讨论】:

                              • 我会比较数学证明。你知道你想要的结果是什么,并且你有一套工具可以用来从你的起点开始。在大多数情况下,设计解决问题的算法与证明定理非常相似。
                              • 举例说明其他程序员如何解决问题。想出一个程序,和他们一起一步一步地完成。人们往往从例子中学习得最好。
                              【解决方案17】:

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

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

                              【讨论】:

                                【解决方案18】:

                                哇。 C++ 是最糟糕的语言之一,就你需要的不相关的废话数量而言,你需要让任何东西正常工作(我猜 Java 会稍微糟糕一些)。

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

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

                                【讨论】:

                                  【解决方案19】:

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

                                  【讨论】:

                                    【解决方案20】:

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

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

                                    在学习模式和真正的算法之后,优雅就出现了。

                                    【讨论】:

                                      【解决方案21】:

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

                                      【讨论】:

                                        【解决方案22】:

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

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

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

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

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

                                        【讨论】:

                                          【解决方案23】:

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

                                          【讨论】:

                                            猜你喜欢
                                            • 1970-01-01
                                            • 2013-02-18
                                            • 2012-02-19
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2013-12-08
                                            • 2016-07-06
                                            相关资源
                                            最近更新 更多