如何教克服困难,同时写周期

尽管我们将专注于基本主题之一,但本文还是为有经验的专业人士撰写的。 目的是展示初学者在编程中的误解。 对于实践开发人员来说,这些问题早已解决,遗忘或根本没有注意到。 如果您突然需要帮助某个人解决这个问题,可以发一篇文章。 本文与来自Shildt,Straustrup,Okulov的各种编程书籍的内容相似。

选择循环的主题是因为在精通编程时,很多人都放弃了循环。

此技术是为弱势学生设计的。 通常,精通此主题的人员不会被卡住,也不需要为他们发明特殊的技术。 本文的次要目标是将这种方法论从“对所有学生有效,但仅对一位教师有效”的班级转变为“对所有学生有效,对所有教师有效的班级”。 我不假装绝对是原创。 如果您已经在应用类似的技术来教授该主题,请写下您的版本有何不同。 如果您决定申请,请通过结果告诉我们一切进展如何。 如果书中描述了类似的技术,请写下名称。


我练习这项技术已有4年,与接受不同级别培训的学生单独学习。 只有大约五十名学生和两千小时的课时。 最初,学生们坚持不懈,永远留在这门课上。 在每个学生之后,对方法和材料进行了调整。 去年,学生不再局限于这个主题,所以我决定分享自己的最佳实践。

为什么这么多字母? 周期很基本!


如我上面所写,对于开发人员和优秀学生而言,周期概念的复杂性可能会被低估。 例如,您可以安排一个较长的讲座,看点头和聪明的眼睛。 但是,当您尝试解决问题时,就会出现木僵和莫名其妙的问题。 讲座结束后,学生可能只获得了部分理解。 学生本身无法说出自己的错误是什么,这一事实使情况更加恶化。
一旦我意识到学生将我的示例视为象形文字。 也就是说,作为不可分割的文本,您需要在其中添加某种“魔术”字母,然后它才能工作。
有时我注意到学生认为要解决特定的问题,还需要一些其他的构造,而我只是还没有告诉过。 尽管该解决方案仅需要对示例进行一些修改。

因此,我想到了这样一个想法,即主要的重点不应放在表达式的语法上,而应放在使用循环重构重复代码的想法上。 一旦学生掌握了这个想法,只需进行一些练习就可以收紧所有语法。

我向谁以及为什么教


由于没有入学考试,所以在教室里可以有强弱学生。 有关我的学生的更多详细信息,请参见文章夜校学生肖像。
我试图确保每个想要它的人都精通编程。
我的课程是单独举行的,学生为每门课程付钱。 看来学生会优化成本并要求最低限度。 但是,人们并不是为了获得知识本身而是与现场老师一起参加全日制课程,而是为了获得所学的信心,进步的感觉并获得专家(老师)的认可。 如果学生在学习上没有进步,他们将离开。 通常,可以设计课程,以便学生在增加熟悉的设计数量方面感到进步。 就是说,首先我们详细研究,然后学习,然后做一段时间,现在我们有一门课程学习了一千零一夜,其中我们仅学习两个月的周期,最后,一名学生写了一个标准的图书馆。 但是,为了解决实际问题,不仅需要材料的知识,还需要其应用和寻找新信息的独立性。 因此,对于全日制课程,我认为该原则是正确的-教授最少的课程并鼓励对细微差别和相关主题进行独立学习。 在循环主题中,我考虑了while构造的最小值。 在它上面您可以理解原理。 了解了原理,您既可以自己做,也可以在自己做的同时做。

仅仅描述语法以使弱势学生掌握该材料是不够的。 您需要给出更简单但多样化的任务,并详细描述示例。 最终,发展速度受到学生转换表情和搜索模式的能力的限制。 对于聪明的学生来说,大多数作业会很无聊。 与他们一起练习时,您不能坚持要完成100%的任务。 我的资料可以在我的github上查看。 的确,该存储库更像是术士的恶作剧-除了我之外,没有人会理解它所在的位置,如果您未通过检查,就会发疯

以实践为导向的实践


通过解决问题的示例来解释该理论。 在有关编程基础的课程中,将研究分支和循环,您只会在一个小时内就一个主题无法获得有用的演讲。 15至20分钟就足以解释这个概念。 执行实际任务时出现主要困难。
新手老师可以在一次演讲中转储语句,分支,循环和数组。 这只是他们将遇到吸收这些信息的问题的学生。
您不仅需要讲述材料,还需要确保听众理解它。

掌握该主题的事实取决于学生如何应对独立工作。
如果学生在没有老师帮助的情况下设法解决了某个主题的问题,则该主题已被学习。 为了提供自我验证,每个任务都在一个带有测试脚本的表中进行描述。 任务有明确的顺序。 不建议跳过任务。 如果当前任务太复杂,则进行下一个任务是没有用的。 她更加努力。 为了使学生能够掌握当前的艰巨任务,在第一个任务的示例中向他解释了一些技巧。 实际上,该主题的全部内容都简化为克服困难的方法。 周期更可能是副作用。

第一个任务始终是一个示例。 第二个课程略有不同,在第一个课程之后立即在老师的监督下“独立”进行。 随后的所有任务旨在引起人们对可能引起混乱的各种小事情的注意。

该示例的说明是一个对话,在该对话中,学生需要回调传播和交叉验证,以确保获取部分材料。

我会显得平庸,并宣布关于该主题的第一个例子非常重要。 如果有大量独立工作的材料,则可以纠正第一个示例的遗漏。 如果除了示例之外,仅此而已,那么该学生很可能不会精通该主题。

还是为了?


有争议的问题之一是示例的构造选择:while或for。 有一次,我的一个朋友,一个没有任何教学经验的实践开发人员,使我说了一个小时,因为for循环最容易理解。 争论归结为“一切都清楚,并放在适当的地方”。 但是,真正的初学者遇到困难的根本原因在于周期的概念,而不是周期的写作。 如果一个人不理解这个想法,那么他将在语法上遇到困难。 一旦实现了这个想法,代码设计的问题就消失了。

在我的资料中,循环的主题紧随分支的主题。 if和while的外部相似性使我们可以得出一个直接的类比:“当标头中的条件为true时,则满足主体。” 循环的特殊性是人体被执行了很多次。

我的第二个论点是,虽然需要的装饰少于装饰。 更少的样式-更少的缺少逗号和括号的愚蠢错误。 初学者还没有那么专心细致,可以自动避免语法错误。
第三个论点是,在首先解释书籍的同时,许多好东西。

如果学生设法轻松地转换表达式,那么您可以顺便谈论一下。 学生将选择自己最喜欢的东西。 如果转换引起困难,最好不要分散注意力。 让学生借助一会儿解决所有问题。 一旦掌握了循环的主题,就可以重写解决方案以解决从while到for的转换。
后处理周期是一种稀有动物。 我根本没有花时间。 如果学生已经掌握了揭示图案和变换表情的想法,那么他将能够在没有我帮助的情况下弄清楚它。

在向有实力的学生展示第一个示例时,我要注意一个事实,即在第一个示例中,不仅要确定解决方案,而且要确定导致结果的整个动作链,这一点很重要。 懒惰的学生可以忽略著作,而只能将有限算法传递给自己。 他们必须确信,有一天他们会完成一项艰巨的任务。 要解决此问题,您将需要按照本示例中的步骤进行操作。 因此,修复所有阶段很重要。 在以下任务中,将仅保留最终解决方案。

自动化的主要思想是,我们指示计算机每人执行例行工作。 基本技巧之一是编写周期。 当在一个程序中连续写入几个相同的重复动作时,将使用它。

显式胜于隐式


在循环的第一个任务中多次显示一些相同的短语似乎是一个好主意。 例如:
太好了,它有效!
太好了,它有效!
太好了,它有效!
太好了,它有效!
太好了,它有效!
太好了,它有效!
太好了,它有效!
太好了,它有效!

该选项不好,因为输出不显示计数器值。 对于初学者来说这是一个问题。 不要小看它。 首先,此任务是第一个,而第二个任务是按升序输出一系列数字。 我不得不引入附加的术语“ N次循环”和“从A循环到B”,它们基本上是相同的。 为了不产生不必要的实体,我决定仅显示一个带有一系列数字的示例。 很少有人设法学习如何在不做准备的情况下在自己的脑海中积木,并模拟程序的行为。 第一次,一些学生面对以循环为主题的“头脑中”建模。
经过一些练习,我将重复相同文本的任务分配给一个独立的解决方案。 如果先给出一个可见的计数器,然后给出不可见的计数器,那么学生的问题就会减少。 有时提示“不要在屏幕上写计数器”就足够了。

别人怎么解释呢?


在Internet上的大多数教育资料中,循环语法是作为“讲座”的一部分给出的。 例如,在developer.mozilla.org(当前)上,描述了更多构造以及while循环。 在这种情况下,仅以模板形式给出结构本身。 用文字描述了它们启动的结果,但是缺少插图。 我认为,这种专题介绍使这种材料的实用性乘以零。 学生可以重写代码并自己运行它,但是仍然需要进行比较的基准。 如果没有可比较的结果,如何理解示例已正确重写?
当仅给出模板时,没有示例,这对学生来说变得更加困难。 如何理解代码片段正确放置在模板中? 您可以尝试以某种方式编写,然后运行。 但是,如果没有比较结果的标准,那么启动也将无济于事。

在C ++直觉课程中,循环语法埋在第4讲的第三页中,主题为“运算符”。 在解释循环的语法时,特别强调术语“运算符”。 该术语以一系列事实表示,例如“符号”; 这是一个运算符”,“ {}这是一个复合运算符”,“循环体必须是一个运算符”。 我不喜欢这种方法,因为它似乎在一个术语中隐藏了重要的关系。 为了使编译器开发人员实现语言规范,必须在这样一个级别上对程序源代码进行术语分析,​​但对于初学者而言则没有必要。 程序设计的初学者很少会如此细心地注意这些术语。 难得的人第一次会记住并理解新单词。 几乎没有人可以正确应用他们刚刚学到的术语。 因此,学生会遇到很多错误,例如“在(a <7)时写; {,但程序不起作用”。
在我看来,一开始最好立即用括号将结构的语法给出。 仅当学生有一个特定的问题“为什么没有括号时才起作用”,才解释不带括号的选项。

在2012年Okulov撰写的“编程基础”一书中,对循环的了解始于for模板,然后给出了使用建议,然后紧随其后的是实验部分。 我知道这本书是为很少见我班的少数有才能的学生写的。

在流行的书中,总是会编写代码片段的结果。 例如,Schildt的“ Java 8. Complete Guide” 2015版。 首先,给出一个模板,然后给出一个示例程序,紧接着是执行结果。
例如,考虑一个while循环,其中反向
从10开始倒计时,精确输出10行“度量”:
//    while class While { public static void main(String args []) { int n = 10; while (n > 0) { System.out.println(" " + n); n--; } } } 

启动此程序后,将显示十个“度量”,如下所示:
10
9
8
7
6
5
4
3
2
1

带有模板描述,示例程序以及该程序结果的方法也用在“ Javascript for children”一书和w3schools.com的js课程中。 网页格式甚至允许您使此示例具有交互性。

在Straustrup的2016年著作《使用C ++的原理和实践》中,作者走得更远。 第一步解释了结果应该是什么,然后-显示程序文本。 举个例子,他们不仅采用随机程序,而且还对历史进行了考察。 它有助于引起人们的注意。“看,这不仅仅是一些无用的文字。 您会看到一些重要的东西。”
作为迭代的示例,请考虑在具有存储程序(EDSAC)的计算机上执行的第一个程序。 它由1949年5月6日在英国剑桥大学计算机实验室的David Wheeler编写。 该程序计算并打印一个简单的正方形列表。
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

在这里,每行包含一个数字,后跟一个制表符('\ t')和该数字的平方。 该程序的C ++版本如下所示:
 //      0-99 int main() { int i = 0; //    while(i < 100){ cout << i << '\t' << square(i) << '\n'; ++i; } } 

奇怪的是,本书中没有描述语法模板。 指导员手册( 翻译 )中的Stroustrup强调,他尊重学生的才智。 在几个示例中识别模式的能力也许被认为是这种智能的体现。

当我解释自己


Straustrup的方法:描述结果,然后解决问题,然后由学生进行独立分析,这似乎是最周到的。 因此,我决定以它为基础,但以一个不太历史的例子来讲述它-得出“目录”的任务。 它形成了一个可识别的锚点,因此稍后它说“记住目录的任务”,以便学生记住它。 在我的示例中,我尝试警告另外两个最常见的误解。 接下来,我将详细介绍它们。
在此任务上,我们熟悉了解决复杂问题的方法。 最初的决定必须简单而原始地做出。 好了,那么您可以考虑如何改进此解决方案。

1
2
3
4
5
6
7

根据我的观察,以不同的组合形式的“模板-实例-结果”方法仍使学生将循环视为象形文字。 这体现在以下事实上:他们不了解为什么要编写条件,如何在i ++和i之间进行选择以及其他看似显而易见的事情。 为了避免这些误解,有关循环的故事的处理方法应强调重复相同动作的含义,然后才可以-使用设计进行设计。 因此,在给出循环的语法之前,您需要解决“前额”问题。 目录问题的原始解决方案如下所示:
 Console.WriteLine(""); Console.WriteLine(" 1"); Console.WriteLine(" 2"); Console.WriteLine(" 3"); Console.WriteLine(" 4"); Console.WriteLine(" 5"); Console.WriteLine(" 6"); Console.WriteLine(" 7"); Console.WriteLine(""); 

如何改善?
用循环替换重复动作。
连续重复执行哪些操作而不更改?
此片段中没有任何内容。 但是,输出带有数字的单词“ Chapter”的命令彼此非常相似。
因此,下一步是寻找片段之间的差异。 只有在此任务中一切都显而易见,然后才会重复执行单个命令,而不会重复5行或更多行的代码块。 您不仅需要在命令列表中进行搜索,还需要在分支或循环结构中进行搜索。
在示例中,团队之间的差异在单词“ Chapter”之后。
一旦发现差异,就需要了解变化的模式。 这个数字是另一个片段吗? 是不断增加还是减少? 两队之间的数字值如何变化?
在示例中,单词“ Chapter”之后的数字随着步骤1的增加而增加。发现差异,显示出图案。 现在,您可以用变量替换不同的片段。
此类变量必须在第一个重复片段之前声明。 这样的变量通常称为I或j或以某种方式扩展。 其初始值应等于屏幕上显示的第一个值。 在示例中,第一个值为1。
输出一系列数字“ 100、101、102、103、104、105”应采用什么初始值?
在此行中,第一个数字是100。
在每个输出命令之后,您需要将此变量的值增加1。此单位是更改步骤。
数字系列“ 100、102、104、106”将走哪一步?
在此行中,执行步骤2。
用变量替换不同的片段后,代码将如下所示:
 Console.WriteLine(""); int i; i = 0; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(""); 

在应用“表达变量定律”技术之后,该代码产生了连续执行的几组相同的动作。 现在,可以将重复动作替换为循环。

解决需要循环使用的问题的顺序包括以下步骤:
  1. 与许多独立的团队一起解决“前额”问题
  2. 寻找图案
  3. 表达变量的规律性
  4. 循环设计


接下来,引入新术语,以使学生不会陷入“我了解一切,但我不能说”的情况:
-计数器始终是跟踪循环中步数所需的变量。 通常是一个与约束条件进行比较的整数。
-计数器步骤-计数器变化模式的描述。
-限制-与计数器进行比较的数字或变量,因此算法是有限的。 计数器值改变以接近极限。
-循环主体-一组将重复的命令。 当它说“命令写在循环内”时,表示主体。
-循环迭代-循环主体的单个执行。
-循环条件是确定是否将执行另一次迭代的逻辑表达式。 (可能会与分支设计混淆)
您需要为以下事实做好准备:一开始,学生会将这些术语用于其他目的。 这适用于强项和弱项。 建立通用语言是一门完整的艺术。 现在,我将简要介绍一下:您需要设置任务“使用<term>选择代码片段”,并在对话中正确使用这些术语。
经过循环转换后,将获得一个片段:
 Console.WriteLine(""); int i = 0; while (i < 7) { Console.WriteLine(" " + i); i = i + 1; } Console.WriteLine(""); 


主要误解


对学生的一种普遍误解是,他们将这样的动作放入循环结构中,这些动作只需要执行一次。 例如,像这样:
 ; int i = 0; while (i < 7) { Console.WriteLine("") Console.WriteLine(" " + i); i = i + 1; Console.WriteLine(""); } 

在开始和更复杂的任务中,学生不断发现这个问题。
在这种情况下的皇冠提示:
您需要重复几次该命令:一次还是多次?

单词“ Introduction”和“ Conclusion”的输出命令以及变量i的声明和初始化与其他重复操作不同。 它们只执行一次,这意味着它们需要写在循环主体之外。

解决方案的所有三个阶段都应保留在代码中,以便在遇到困难时引用它们。 前两个选项足以将其注释掉,以免干扰。
学生应注意以下事实:
-在循环条件下,通常会比较计数器和极限。 计数器可以在循环主体中更改,但限制不变。 要打破此规则,您需要提出充分的理由。
-显示单词“简介”和“结论”的命令不在循环的主体范围内。 我们需要执行它们1次。 “简介”-重复操作之前,“结论”-之后。
在解决这个问题,掌握以下内容以及遇到困难的程序的过程中,即使是坚强的学生也可以这样问这个问题:“但是,该操作需要执行多少次? 一个或多个?”

发展其他技能


在学习周期的过程中,学生仍然具有诊断和解决问题的能力。 要进行诊断,学生需要提供所需的结果并将其与实际结果进行比较。 纠正措施取决于它们之间的差异。
由于现阶段的学生对“期望的”结果仍然不甚了解,因此他们可以专注于测试数据。 通常,在此阶段,没有人仍然了解会出什么问题以及如何处理。 因此,我将描述典型问题以及在笔记本中的条目下解决这些问题的几种方法。 选择最合适的是学生的任务。
需要记录以询问“发生了什么事?”,“现在发生了哪些情况?”,“解决方案有帮助吗?”。
  1. 动作数量比预期的少或多1个。 解决方法:
    -将计数器的初始值增加1。
    -用非严格(<=或> =)替换严格比较运算符(<or>)。
    -将限制值更改为1。
  2. 循环中的动作不停地无休止地执行。 解决方法:
    -如果不存在,请添加计数器更改命令。
    -修正计数器更改命令,使其值更接近限制。
    -如果约束位于循环主体中,则删除用于更改约束的命令。
  3. 循环中的操作数比预期的少1个或更多。 循环中的动作从未执行过。 首先,您需要在循环开始之前找出变量的实际值。 解决方法:
    -更改约束的初始值
    -更改计数器的初始值

通常,问题3与使用错误的变量或未将计数器归零有关。

经过这些解释后,学生可能仍然对自行车的操作有各种误解。
为了消除最常见的情况,我给任务:
  1. 用户在其中输入限制值,计数器的初始值或计数器的步长。
  2. 其中必须在某些算术表达式中使用计数器值。 建议在根部表达式或分母中使用计数器,以使差异为非线性。
  3. 其中循环期间不显示计数器值。 例如,输出所需数量的相同文本片段或使用乌龟图形绘制图形。
  4. 在其中您需要首先执行一些重复的操作,然后再执行其他操作。
  5. 在重复之前和之后,您需要执行其他操作

对于每个任务,您需要提供测试数据和预期结果。

要了解您可以移动多快,您需要阅读这些任务的条件并询问:“它们与示例有何不同?”,“示例中需要更改哪些内容以解决这些问题?”。 如果学生做出有意义的回答,那么让他决定本课中的至少一项,其余的自行决定。 如果解决方案成功,则可以开始解释循环中的条件。
如果可以通过独立的方式解决难题,那么您需要解决本课中的所有问题。 为了使该问题的解决方案不像画猫头鹰一样,我建议您首先非普遍地解决该问题。 也就是说,解决方案通过了第一个测试,并且不使用循环构造。 好了,然后应用转换以实现解决方案的通用性。

循环和分支


我认为,单独给出“分支内的循环”这一主题很有用。 这样一来,您就可以看到多条件检查和单项检查之间的区别。
固定任务将与用户输入的从A到B的数字输出有关:
-总是上升。
-根据A和B的值递增或递减。

只有在学生掌握了技巧之后,才能通过“在周期内分支”的主题:“用变量替换模式”和“用循环替换重复动作”。
在循环内使用分支的主要原因是模式异常。 在中间,它根据源数据而损坏。
对于那些能够通过组合简单技术来寻找解决方案的学生,只需说“分支可以写在循环内”并将任务“例如”完全交给一个独立的解决方案就足够了。
任务例如:
用户输入数字X。在从0到9的列号中显示,并在等于X的数字的对面添加符号“ +”。

如果输入0
0+
1个
2
3
4
5
6
7
8
9

如果输入6
0
1个
2
3
4
5
6+
7
8
9

如果输入9
0
1个
2
3
4
5
6
7
8
9+

如果输入777
0
1个
2
3
4
5
6
7
8
9

如果简短的解释不足以使用循环编写,那么您需要在没有循环的情况下实现对同一问题的通用解决方案。
您将获得以下两种选择之一:
期望的
 string temp; temp = Console.ReadLine(); int x; x = int.Parse(temp); if (x==0) { Console.WriteLine(0 + "+"); } else { Console.WriteLine(0); } if (x==1) { Console.WriteLine(1 + "+"); } else { Console.WriteLine(1); } if (x==2) { Console.WriteLine(2 + "+"); } else { Console.WriteLine(2); } if (x==3) { Console.WriteLine(3 + "+"); } else { Console.WriteLine(3); } if (x==4) { Console.WriteLine(4 + "+"); } else { Console.WriteLine(4); } if (x==5) { Console.WriteLine(5 + "+"); } else { Console.WriteLine(5); } if (x==6) { Console.WriteLine(6 + "+"); } else { Console.WriteLine(6); } if (x==7) { Console.WriteLine(7 + "+"); } else { Console.WriteLine(7); } if (x==8) { Console.WriteLine(8 + "+"); } else { Console.WriteLine(8); } if (x==9) { Console.WriteLine(9 + "+"); } else { Console.WriteLine(9); } 


可能的
 string temp; temp = Console.ReadLine(); int x; x = int.Parse(temp); if (x==0) { Console.WriteLine("0+\n1\n2\n3\n4\n5\n6\n7\n8\n9"); } if (x==1) { Console.WriteLine("0\n1+\n2\n3\n4\n5\n6\n7\n8\n9"); } if (x==2) { Console.WriteLine("0\n1\n2+\n3\n4\n5\n6\n7\n8\n9"); } if (x==3) { Console.WriteLine("0\n1\n2\n3+\n4\n5\n6\n7\n8\n9"); } if (x==4) { Console.WriteLine("0\n1\n2\n3\n4+\n5\n6\n7\n8\n9"); } if (x==5) { Console.WriteLine("0\n1\n2\n3\n4\n5+\n6\n7\n8\n9"); } if (x==6) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6+\n7\n8\n9"); } if (x==7) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6\n7+\n8\n9"); } if (x==8) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6\n7\n8+\n9"); } if (x==9) { Console.WriteLine("0\n1\n2\n3\n4\n5\n6\n7\n8\n9+"); } 


在研究分支主题时,我会预先给出类似的问题。
如果学生有一个“可能”的选择,那么您需要告诉您,针对同一问题可以有很多解决方案。 但是,它们对不断变化的需求的抵抗力有所不同。 问一个问题:“如果必须添加另一个数字,则需要更正代码中的多少个位置?” 在“可能”版本中,您将需要添加另一个分支,并在其他10个地方添加新的号码。 在“所需”中,仅添加一个分支就足够了。
设置任务以重现“所需”选项,然后在代码中找到模式,执行变量替换并编写循环。
如果您有想法如何解决此问题而没有任何其他循环,请在评论中写下。

循环内循环


在此线程中,您需要注意以下事实:
-内循环和外循环的计数器必须是不同的变量。
-内部循环的计数器需要多次重置(即在外部循环的主体中)。
-在文本输出任务中,您不能先在多个行中写一个字母,然后再写第二个字母。 首先,您需要打印第一行的所有字母,然后打印第二行的所有字母,依此类推。

最好从解释重置计数器的重要性开始,对有关循环内部循环的主题进行说明。
任务例如:
用户输入两个数字:R和T。打印两行字符“#”。 第一行应包含R个字符。 第二行是T件。 如果任何数字为负,则显示错误消息。

R = 5,T = 11
#####
############

R = 20,T = 3
######################
###

R = -1,T = 6
R的值必须为非负

R = 6,T = -2
T的值必须为非负

显然,这个问题也至少有两个解决方案。
期望的
 string temp; int R; int T; temp = Console.ReadLine(); R = int.Parse(temp); temp = Console.ReadLine(); T = int.Parse(temp); int i = 0; while (i < R) { Console.Write("#"); i = i + 1; } Console.WriteLine(); i = 0; while (i < T) { Console.Write("#"); i = i + 1; } 


可能的第一
 string temp; int R; int T; temp = Console.ReadLine(); R = int.Parse(temp); temp = Console.ReadLine(); T = int.Parse(temp); int i = 0; while (i < R) { Console.Write("#"); i = i + 1; } Console.WriteLine(); int j = 0; j = 0; while (j < T) { Console.Write("#"); j = j + 1; } 


不同之处在于在“可能”的解决方案中,第二个变量用于显示第二行。 您需要在两个循环中坚持使用相同的变量。 有人会提出这样的限制,因为一个计数器有两个周期的解决方案将是“计数器归零”这一术语的例证。 解决以下问题时,必须理解该术语。 作为一种折衷,您可以保存两种解决方案。

使用单个计数器变量进行两个周期的典型问题如下所示:
R = 5,T = 11
#####
######

第二行中的字符数与T的值不匹配。如果需要解决此问题,则需要“戳一下鼻子”,以了解有关循环典型问题的摘要。 这是症状3。 诊断是否在第二个循环之前立即添加了计数器值的输出。 通过调零进行校正。 但是最好不要马上讲。 学生应尝试至少提出一种假设。

当然,仍然有这样的解决方案。 但是我从未在学生中见过他。 在研究周期的阶段,有关他的故事会引起注意。 在研究使用字符串的功能时,您可以稍后再返回。
可能的数字2
 string temp; int R; int T; temp = Console.ReadLine(); R = int.Parse(temp); temp = Console.ReadLine(); T = int.Parse(temp); Console.WriteLine(new String('#', R)); Console.WriteLine(new String('#', T)); 



下一个必需的任务:
显示从0到9的数字。每个数字应位于自己的行上。 每行的位数(W)从键盘输入。

W = 1
0
1个
2
3
4
5
6
7
8
9

W = 10
0000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999


如果学生已经掌握了替换变量的技巧,那么他会很快地应对。 可能的问题将再次是将变量清零。 如果您无法应付转换,那么您很着急,需要解决一些更简单的问题。

谢谢您的关注。 喜欢,订阅频道。

附注:如果您发现文字有错别字或错误,请告诉我。 Mac «⌘ + Enter», «Ctrl / Enter», . , . 谢谢你

Source: https://habr.com/ru/post/zh-CN456500/


All Articles