【问题标题】:C++ if/else grid systemC++ if/else 网格系统
【发布时间】:2016-01-31 20:23:50
【问题描述】:

我正在尝试创建一个 C++ 程序,该程序将在 4x4 网格上移动 X 并显示每个移动。我们不允许使用数组,因为我们还没有学会如何使用。我知道我应该使用 16 个 if/else 语句,但我不确定从那里该做什么。我知道有一种比列出每个可能的选项更简单的方法,因为这将花费很长时间!!!我该怎么办???

编辑:只允许上/下/左/右移动。我的意思是显示每个动作它首先应该显示用户的起点(我已经设置)然后它应该打印带有连续动作的网格,包括所有先前的动作,直到它到达终点。

【问题讨论】:

  • 4x4 = 16,对吗? ;) 所以我认为你应该这样做,不管这种教学方法有多么可疑……数组才是真正的解决方案。
  • X 应该以什么模式移动? (是否应该根据用户输入一次向上/向下/向左/向右移动一个单元格?)网格上是否还有其他需要显示的内容?
  • 您不必使用数组。仅检查您的移动是否可能在该区域之外结束,并拒绝这些移动。 if ((new_x>=0) || (new_x<=3) || (new_y>=0) || (new_y<=3)) { ..do_move..}; 从确定的位置开始。移动会将坐标移动某个固定值。就是这样。
  • 有趣的是这是一个 C++ 问题,那么你可以创建一个class X,有两个成员int xint y,以及一个移动方法move(int dx, int dy),和一个whereAmI() 方法打印出位置。将网格栅格化为二维数组听起来不太对。
  • @user3528438 如果他们还没有学过数组,很可能他们还没有学过类;)

标签: c++ function loops if-statement


【解决方案1】:

注意:我最初是根据对被证明是错误的任务的假设来写这个答案的。但是,我将保留答案,因为我相信它可能仍然包含对 OP 有用的信息。

当您有 x 个不同的可能情况时,您并不总是需要带有 x 个分支的 if/else。诀窍是找到一种方法来使用 same 计算(通常是一个或多个数学表达式,可能还有循环)来处理所有或大部分情况。

在这种情况下,4x4 网格上确实有 16 个不同的位置,表示位置的一种方法是存储其行号和列号(每个值都在 0 和 3 之间)。通过使用两个循环,一个在另一个内部(嵌套循环),您可以生成行和列位置的所有 16 种组合。我现在假设您应该打印例如. 在网格的空单元格上。在内部循环中,您需要确定应该打印. 还是X。为了弄清楚这一点,你应该问什么问题?简单来说就是“嵌套循环当前所在行列号与X所在位置相同的行列号吗?”

在看到更新后进行编辑:即使在使用网格时,仅当您必须存储有关每个单元格的信息时才需要数组,因此如果您可以生成,有时无需数组即可网格信息来自较少的信息(例如 X 的位置)。但是,如果您需要跟踪以前的位置,则需要一个数组(一维或二维)才能优雅地完成它。我会说这个任务的“无数组”限制没有教育意义,因为它强制使用一种不自然且非常麻烦的方式来解决这个任务。 :-((但是,如果您的讲师随后给出了相同的任务并允许您使用循环,这将很好地说明循环为何有用。)

你可以做的是使用 16 个bool 变量(最初都设置为false),名称如grid00grid01grid02grid03grid10、.. ., grid33.然后制作两个方法,bool isOccupied(int row, int column)void occupy(int row, int column),它们使用 16 路 if/else 语句,让您可以轻松读取和更改与给定位置对应的变量。

【讨论】:

    【解决方案2】:

    我知道我应该使用 16 个 if/else 语句,但我不是 确定从那里做什么。

    如果这是对您的讲师提供给您的解决方案的限制,这意味着您需要在单独的 {} 块中处理 16 个可能的网格位置中的每一个。你必须有一个代表每一对的枚举。喜欢:

    e_1_1、e_1_2、e_1_3、e_1_4、

    e_2_1、e_2_2、e_2_3、e_2_4、

    e_3_1、e_3_2、e_3_3、e_3_4、

    e_4_1、e_4_2、e_4_3、e_4_4、

    并且您必须在 switch 语句中手动将当前位置更新为新位置。在名为“位置”之类的变量中跟踪您当前的位置。

    我知道有一种比列出每个可能的选项更简单的方法 因为那会花很长时间!!!

    欢迎来到编程。 ;-)

    复制和粘贴是您的朋友,必须编写大量相似但略有不同的代码的问题对于许多编程任务来说相当普遍。成为一名优秀的程序员意味着学习如何尽可能避免大量重复的代码。你还不在那里,或者你不必问。所以这第一步对你来说是重要的一课。一点痛苦将帮助您了解下一次使用的方法会有多好。

    但这不是很多工作。一个有经验的 C++ 程序员可以在 5 到 10 分钟内搞定它。经验中等,大概 20 到 30 人。学习程序员可能需要几个小时或更长时间。

    有更简洁的方法来处理这个问题,而不需要 16 个单独的块,但是,没有一个更容易理解。如果这是课堂学习项目的要求,那么您会发现首先这样做是有益的,然后作为下一步,尝试用更复杂的逻辑来做。

    建议

    有经验的程序员会将移动可能性定义为枚举。然后,移动将在 if 语句的 {} 块内使用 switch 语句处理,该语句处理对应于四个移动的四个枚举中的每一个。如果你还不知道 switch 语句,你可以使用 if ... else if ... else if ... 来检查四个动作中的每一个。

    从处理较小的 2 x 2 网格的第一个左上角位置开始。然后为 2 x 2 网格添加其他三个位置中的每一个。完成该工作后,您应该能够轻松理解如何将解决方案扩展到 4 x 4 和任意更大的网格。

    您需要一个函数来打印每次移动后调用的位置数组。现在,您必须检查枚举的值并手动打印。比如:

    1. 位置是否 == e_1_1?打印'*否则打印'_'
    2. 位置是否 == e_1_2?打印'*否则打印'_'
    3. 位置是否 == e_1_3?打印'*否则打印'_'
    4. 位置是否 == e_1_4?打印'*否则打印'_'
    5. 打印换行符
    6. 位置是否 == e_2_1?打印'*否则打印'_'
    7. 位置是否 == e_2_2?打印'*否则打印'_'
    8. 位置是否 == e_2_3?打印'*否则打印'_'
    9. 位置是否 == e_2_4?打印'*否则打印'_'

    一些便于调试的指针:

    将向上、向下、向左和向右的枚举值设置为您可以打印出来并轻松遵循的值,即 e_up = 'u' 和 e_down = 'd'。如果您没有可以让您轻松查看枚举值的 IDE,这将使调试变得更容易,并且您可以在开始时直接打印出动作。

    以较小的增量对代码进行更改。运行代码,一旦你知道你添加的部分有效,继续前进。如果一次添加太多,则很难找出问题所在,尤其是当您是新手时。

    未来的数组解决方案

    一些提示:您需要使用二维数组。

    首先在 2 x 2 阵列上尝试这个,让您的生活更简单。然后当逻辑起作用时,更改数组大小。为了使这个过程更容易,使用一个 const 整数来定义一个值,该值用于定义数组并使用 for 循环进行打印,以便当您更改常量时:

    const int array_size = 2

    const int array_size = 4

    其余代码将正常工作。对于额外的功劳,通过对 array_height 和 array_width 使用单独的常量来支持不同高度和宽度的数组。学会做好它以及专业人士的做法,您将养成专业人士的习惯并更快地赚取专业人士的工资。

    记得使用 for 循环来打印使用您定义的常量的行和列。

    您需要让代码循环运行以查找输入,然后处理移动,然后打印出新网格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-04
      • 2015-04-12
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2018-03-14
      相关资源
      最近更新 更多