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