Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的显示问题+;如果输入偶数_C++_Visual C++ - Fatal编程技术网

C++ C+中的显示问题+;如果输入偶数

C++ C+中的显示问题+;如果输入偶数,c++,visual-c++,C++,Visual C++,当显示单个“a”时,我有一个非常简单的问题。它应该从右侧开始,而不是从左侧开始。输入奇数时正确,但如果输入偶数时输出错误。 顺便说一句,我必须遵循这个指导方针 准则: 必须使用指针和引用来显示值 显示道路递归运行 循环语句是不允许的 对象实例在使用后必须销毁 请看下面的图片: 错误结果(偶数) 正确结果(奇数) 代码 #include <iostream> #include <string> using namespace std; class myRoad {

当显示单个“a”时,我有一个非常简单的问题。它应该从右侧开始,而不是从左侧开始。输入奇数时正确,但如果输入偶数时输出错误。 顺便说一句,我必须遵循这个指导方针

准则:

  • 必须使用指针和引用来显示值
  • 显示道路递归运行
  • 循环语句是不允许的
  • 对象实例在使用后必须销毁
  • 请看下面的图片:

    错误结果(偶数)

    正确结果(奇数)

    代码

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class myRoad
    {
    private:
     char myChar;
     int myH, myW;
    
    public:
    myRoad(){
      askChar();
      askHeight();
      askWidth();
    }
    void askChar();
    void askHeight();
    void askWidth();
    void recurs_W(char c, int w, int h);
    void recurs_H(char c, int h, int w);
    char getChar(){return myChar;}
    int  getHeight(){return myH;}
    int  getWidth(){return myW;}
    };
    
    void displayRoad(myRoad* mRoad);
    
    int main()
    {
      myRoad* mRoad = new myRoad();
    
      cout << endl << endl;
    
      displayRoad(mRoad);
    
      delete mRoad;
    }
    
    void displayRoad(myRoad* mRoad)
    {
        mRoad->recurs_H(mRoad->getChar(),mRoad->getHeight() * 2 + 1, mRoad->getWidth());
    }
    
    
    void myRoad::askChar()
    {
        char ch;
        cout << "Enter a character: ";
        cin >> ch;
        myChar = ch;
    }
    
    void myRoad::askHeight()
    {
        int h = 0;
        cout << "Enter height: ";
        cin >> h;
        myH = h;
    }
    
    void myRoad::askWidth()
    {
        int w = 0;
        cout << "Enter width: ";
        cin >> w;
        myW = w;
    }
    
    void myRoad::recurs_H(char c, int h, int w)
    {
        if(h == 0)
          return;
        recurs_W(c, w, h);
        recurs_H(c, --h,w);
    }
    
    void myRoad::recurs_W(char c, int w, int h)
    {
       if(w == 0)
       {
            cout << endl;
            return;
        }
       else
       {
         if(h % 2 == 1)
         cout << myChar;
         else
         {
            if (w == myW && h % 4 == 0)
            {
                cout << myChar;
            }
            else if (w == 1  && h % 2 == 0 && h % 4 != 0)
            {
                cout << myChar;
            }
            else
            cout << ' ';
         }
       }
        return recurs_W(c, --w, h);
    }
    
    #包括
    #包括
    使用名称空间std;
    密路
    {
    私人:
    char-myChar;
    int myH,myW;
    公众:
    myRoad(){
    askChar();
    askHeight();
    askWidth();
    }
    void askChar();
    无效askHeight();
    无效askWidth();
    无效递归W(字符c,int W,int h);
    void递归H(字符c,int H,int w);
    char getChar(){return myChar;}
    int getHeight(){return myH;}
    int getWidth(){return myW;}
    };
    道路(myRoad*mRoad);
    int main()
    {
    myRoad*mRoad=新建myRoad();
    cout getChar(),mRoad->getHeight()*2+1,mRoad->getWidth();
    }
    void myRoad::askChar()
    {
    char ch;
    cout>ch;
    myChar=ch;
    }
    void myRoad::askHeight()
    {
    int h=0;
    cout>h;
    myH=h;
    }
    void myRoad::askWidth()
    {
    int w=0;
    cout>w;
    myW=w;
    }
    void myRoad::递归(字符c,int H,int w)
    {
    如果(h==0)
    返回;
    递归W(c,W,h);
    递归H(c,--H,w);
    }
    void myRoad::递归W(字符c,整数W,整数h)
    {
    如果(w==0)
    {
    
    cout根据
    h
    是奇数还是偶数,您可以选择将字符放在右侧还是左侧

    因此,让
    h
    作为奇数(而不是偶数)开始,在第一步就应该改变这种选择,这并不奇怪


    我建议您引入一个新变量
    I
    ,而不是10→0(或5→0),这是0→10(或0→5)

    (在上面的数字示例中,我忽略了基于一的索引和排他范围,但你明白了)

    然后根据
    i
    而不是
    h
    做出左右决定,因为它总是以偶数(0)开始

    该变量将从零开始,并在每次
    h
    递减时递增,因此它就是精确的镜像


    实际上,您不需要将
    i
    存储在任何地方;您可以在需要时计算它:

    int myRoad::currentRowNumber(int h)
    {
       return getHeight() - h;
    }
    
    然后,您不必说,
    h%2
    ,而是执行
    currentRowNumber(h)%2


    有更简单的方法来实现更广泛的目标,但这是一个快速解决问题的方法。

    最好的办法是将算法转换为迭代算法:

    for(int i = 0; i < myH; ++i)
    {
        for(int j = 0; j < myW; ++j)
            std::cout << 'A';
        std::cout << '\n';
    
        if((i & 1) == 0)
        {
            for(int j = 1; j < myW; ++j)
                std::cout << ' ';
        }
        std::cout << "A\n";
    }
    
    if(myH != 0) // drop, if you want to have a single line for height = 0
    {
        // final line:
        for(int i = 0; i < myW; ++i)
            std::cout << 'A';
    
        std::cout << std::endl; // in contrast to simple '\n', std::endl flushes the output
                                // stream as well, assuring user sees output immediately
    }
    
    我个人建议重新组织职能,不过:

    void myRoad::recurs_W(char c, int w)
    {
        if(w < myW)
        {
            std::cout << c;
            recurse_W(c, w + 1);
        }
    }
    
    void myRoad::recurs_H(char c, int h)
    {
        if(h < myH)
        {
            recurse_W(c, 0);
            std::cout << '\n';
            if((h & 1) == 0)
                recurs_W(' ', 1);
            std::cout << c << '\n';
    
            recurs_H(c, h + 1);
        }
    }
    
    void displayRoad(myRoad* mRoad)
    {
        if(mRoad->getWidth() && mRoad->getHeight())
        {
            mRoad->recurs_H(mRoad->getChar(), 0);
            // draw the final line
            mRoad->recurs_W(mRoad->getChar(), 0);
            std::cout << std::endl;
        }
    }
    
    结果是无休止的循环。但这实际上很容易涵盖:

    for(unsigned n = 8; n-- > 0; )
    

    或,如果您认为无符号溢出:

    for(unsigned n = 7; n <= 7; --n)
    

    for(unsigned n=7;n顺便说一句,对它使用递归会很快炸毁您的调用堆栈……这并不是迭代可以实现的最佳解决方案。非主题:如果您更喜欢本地存储持续时间(
    myRoad mRoad;
    ),您不必关心删除(但这是您想到的好!)。如果您发现您的对象对于堆栈来说太大(这里不应该是这种情况),您可以通过使用智能指针获得同样的舒适度:
    auto mRoad=std::make_unique()
    非常赞同“亮度”–除了在递归中,如果要在左侧或右侧绘制A,您可以根据剩余高度而不是当前高度来决定。这会使结构在垂直方向上反转。至于奇数,结构是轴对称的,但您不会注意到。@LightnessRaceswithMonica。没关系。我只是想特德来修正这个错误,你能帮我吗?Thanks@Aconcagua.没关系。我只是想修正错误。你能帮我吗?谢谢你嗨!对不起,我不能使用循环。我已经把它放在我的电脑里了question@Joseph嗯,所以他们想教你递归?否则,这个要求根本没有意义…实际上,你的显示路径不是递归的我也是,它只是调用其他递归函数。这是否仍然满足任务要求?是的。也就是说,实际上,由于递归函数也是成员函数,您不需要传递maxH,您可以始终直接访问myH!很抱歉,我应该将此递归函数放在何处?'A',0,myW)?;抱歉,否:我会让您记住如何编写成员函数。您的程序中已经有八个成员函数,因此您知道如何编写成员函数。
    for(unsigned int n = 7; n >= 0; --n)
    
    for(unsigned n = 8; n-- > 0; )
    
    for(unsigned n = 7; n <= 7; --n)