【问题标题】:I have to do a program that do a square in c++ with incremental letter我必须做一个程序,用增量字母在 c++ 中做一个正方形
【发布时间】:2022-10-25 03:03:38
【问题描述】:

您好,感谢您来到这里。

我必须做一个程序,该程序将绘制用户选择的带有增量字母的一些正方形。 例如,如果用户选择 4 个正方形,它将返回:

DDDDDD

DCCCCCD

DCBBBCD

DCBABCD

DCBBBCD

DCCCCCD

DDDDDD

目前,我的代码如下所示;


#include <iostream>
using namespace std;

int main()
{
 int size;
 int nbsquareletter;
     cout << " How many square ?" << endl;
      cin >> nbsquareletter;
      size = nbsquareletter * 2 - 1;
 char squareletter = 'a';
     for (int row = 1; row <= size; ++row)
      {
          for (int col = 0; col <= size; ++col)
          {

            if (row < col) {
              cout << (char)(squareletter + row - 1) << " ";
            }
            else if (row > col)
            {
              cout << (char)(squareletter + col) << " ";
            }

              /*
              cout << col << " ";
              cout << row << " ";
              */




          }
          cout << endl;
      }
  }


如果您有任何想法可以帮助我,请不要犹豫,我正在努力。已经3.5小时了。感谢您的阅读,祝您有美好的一天!

【问题讨论】:

  • 你会很高兴听到你不需要任何人的帮助来解决这个问题,只需要一个你已经拥有的工具:你的调试器!这正是调试器的用途。 runs your program, one line at a time, and shows you what's happening,这是每个 C++ 开发人员都必须知道的事情。在调试器的帮助下,您将能够快速找到此程序以及您编写的所有未来程序中的所有问题,而无需向任何人寻求帮助。您是否已经尝试过使用调试器?如果不是,为什么不呢?您的调试器向您展示了什么?
  • 我已经使用过它,但我缺乏如何做到这一点的逻辑。我知道这段代码不起作用,也不会做我想做的事。我只是不知道该怎么做,我真的缺乏这样做的方式背后的逻辑
  • @克里斯但我缺乏如何做到这一点的逻辑-- 那你就不应该写一行代码。只有在纸上制定了解决问题的计划后,您才可以编写代码。一旦你有了这个计划,然后您编写程序以遵循计划。你不写你知道不会工作的代码,然后试着从代码中弄清楚如何让它工作。编程不是那样工作的。
  • FWIW,3.5小时不是很多时间。根据我以前大学的指导方针,一个 15 学分的学期相当于每周工作 45-60 小时。我的介绍课程是一门 4 学分的课程。这是每周 12-16 小时的预期工作时间。我们减去 4 小时来考虑讲座和实验,而您仍然有 8-12 小时的课外学习时间,这是预期的。我们还有一个 Calc I pre-req。

标签: c++


【解决方案1】:

尽量保持简单。如果你在清楚地知道如何解决它之前就开始编写代码,你最终会得到令人费解的代码。它会有错误,修复它们会使代码变得更不简单。

一些简单的考虑:

  • (i,j) 位置的字母由与中心的“距离”决定。距离为max(abs(i - i_0), abs(j - j_0)

  • 当我们从左上角(0,0) 开始计数时,中心位于(i,j) = (size-1,size-1)

  • 可以从数组std::string letters = "ABCDEFG..." 中挑选字母。

  • ij[0,2*size-1) 范围内

只需在代码中写下这个(仅此而已)就会导致:

#include <iostream>
#include <string>

void print_square(int size){
    std::string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i_0 = size-1;
    int j_0 = size-1;
    for (int i=0;i< 2*size-1;++i){
        for (int j=0;j< 2*size-1;++j) {
            int index = std::max(std::abs(i-i_0),std::abs(j-j_0));
            std::cout << letters[index]; 
        }
        std::cout << "
";
    }
}


int main() {
    print_square(4);
}

哪个产生输出

DDDDDDD
DCCCCCD
DCBBBCD
DCBABCD
DCBBBCD
DCCCCCD
DDDDDDD

您的代码无法打印正确的输出,因为当row == col 没有输出时,它会错过对角线。我没有再看远了。

【讨论】:

    【解决方案2】:

    我决定向您推荐我自己的解决方案,而不是修复代码中的错误。也许其他一些答案将与您的代码中的错误有关。

    在一张纸上,我为绘制的图片的 4 个部分计算了 4 个不同的公式,这些公式计算了在英文字母表中取什么字母。之后我用字母从数组中取出这封信。

    Try it online!

    #include <iostream>
    
    int main() {
        int n = 0;
        std::cin >> n;
        char const letters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        for (int i = 0; i < 2 * n - 1; ++i) {
            for (int j = 0; j < 2 * n - 1; ++j)
                std::cout << letters[
                    i <= j && i + j <  2 * n - 1 ? n - i - 1 :
                    i <= j && i + j >= 2 * n - 1 ? j - n + 1 :
                    i >  j && i + j <  2 * n - 1 ? n - j - 1 :
                    i >  j && i + j >= 2 * n - 1 ? i - n + 1 : 25
                ];
            std::cout << std::endl;
        }
    }
    

    输入:

    7
    

    输出:

    GGGGGGGGGGGGG
    GFFFFFFFFFFFG
    GFEEEEEEEEEFG
    GFEDDDDDDDEFG
    GFEDCCCCCDEFG
    GFEDCBBBCDEFG
    GFEDCBABCDEFG
    GFEDCBBBCDEFG
    GFEDCCCCCDEFG
    GFEDDDDDDDEFG
    GFEEEEEEEEEFG
    GFFFFFFFFFFFG
    GGGGGGGGGGGGG
    

    【讨论】:

      【解决方案3】:

      让我们定义一些函数,以使递归关系明显。

      std::vector<std::string> WrapInLetter(char letter, std::vector<std::string> lines)
      {
          for (auto & line : lines)
          {
              line.insert(line.begin(), letter);
              line.insert(line.end(), letter);
          }
      
          std::size_t size = (lines.size() * 2) + 1;
          std::string edge(size, letter); // A string formed of size copies of letter
          lines.insert(lines.begin(), edge);
          lines.insert(lines.end(), edge);
      
          return lines;
      }
      
      std::vector<std::string> SquareLetter(char letter)
      {
          if (letter == 'A') return { "A" };
          return WrapInLetter(letter, SquareLetter(letter - 1));
      }
      

      现在main 只需调用该函数并循环结果。

      int main()
      {
          std::cout << "How many square ?" << std::endl;
          int size;
          std::cin >> size;
          for (auto line : SquareLetter('A' + size - 1))
          {
              std::cout << line << std::endl;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 2012-03-31
        • 2020-04-13
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多