C++ 中的 ASCII 艺术 "V"
ASCII art "V" in c++
我应该编写一个程序,提示使用行数,然后以 "V" 形状输出 ASCII 艺术。
对于输入4,输出为(“-”代表空格):
*-----*
-*---*
--*-*
---*
我的代码是:
// prompt for number of stars
int stars;
std::cin >> stars;
// indent
int indent = 0;
int space = 1;
// find space
if (stars = 1)
{
space = 0;
}
else if (stars == 2)
{
space = 1;
}
else if (stars >= 3)
{
int addspace = stars - 2;
space = space + (2 * addspace);
}
// print spaces to double check calculation
std::cout << "space: " << space << '\n';
// print first star
if (stars == 1)
{
std::cout << "*";
}
// print lines
for (int lines = 1; lines == stars; ++lines)
{
// print indent
std::cout << "indent: " << indent << '\n'
<< "spaces: " << space << '\n';
if (lines > 1)
{
for (int ind_loop = 1; ind_loop < indent; ++ind_loop)
{
std::cout << " ";
}
}
std::cout << "*";
indent += 1;
// print spaces
std::cout << "spaces: " << space << '\n';
for (int sp_loop = 0; sp_loop < space; ++sp_loop)
{
std::cout << " ";
}
space -= 2;
std::cout << "*";
// next line
std::cout << '\n';
}
std::cout << '\n';
每次它给我的只是:
*
并且 int 空格总是等于 0。
有谁知道为什么会这样,我需要做些什么来纠正它?
您的代码存在一些问题:
if (stars = 1)
始终为真,它会将 stars
的值更改为 1。您需要将其更改为 if (stars == 1)
。
for(int lines = 1; lines == stars; ++lines)
是错误的,因为它不会执行,除非stars
正好是1。你需要把它改成for(int lines = 1; lines <= stars; ++lines)
。
for(int ind_loop = 1; ind_loop < indent; ++ind_loop)
需要改为 for(int ind_loop = 0; ind_loop < indent; ++ind_loop)
,才能在第二行正确执行。
从你的 for
循环中删除除 *
和 space 之外的所有 cout
,它们会破坏你的 V
形式.
对于循环中的最后一个std::cout << "*";
,您需要添加一个条件来检查它是否是最后一行(最后一行应该打印一次*
) .
所以,最终的代码应该是这样的:
int main()
{
int stars;
std::cin >> stars;
// indent
int indent = 0;
int space = 1;
// find space
if(stars == 1)
{
space = 0;
}
else if(stars == 2)
{
space = 1;
}
else if(stars >= 3)
{
int addspace = stars - 2;
space = space + (2 * addspace);
}
// print spaces to double check calculation
std::cout << "space: " << space << '\n';
// print first star
if(stars == 1)
{
std::cout << "*";
}
// print lines
for(int lines = 1; lines <= stars; ++lines)
{
// print indent
//std::cout << "indent: " << indent << '\n'
// << "spaces: " << space << '\n';
if(lines > 1)
{
for(int ind_loop = 0; ind_loop < indent; ++ind_loop)
{
std::cout << " ";
}
}
std::cout << "*";
indent += 1;
// print spaces
//std::cout << "spaces: " << space << '\n';
for(int sp_loop = 0; sp_loop < space; ++sp_loop)
{
std::cout << " ";
}
space -= 2;
if(lines != stars)
std::cout << "*";
// next line
std::cout << '\n';
}
system("pause");
return 0;
}
你可以用更紧凑的方式做同样的事情,试着理解下面的代码,它做同样的事情而不需要 if,希望它能帮助你在编程的第一步
#include <iostream>
using namespace std;
int main ()
{
int lines,pad,cnt,i,j;
while(true)
{
cin >> lines;
for(i=lines,pad=0,cnt=(lines-2)*2+1;i>1;i--,pad++,cnt-=2)
{
for(j=0;j<pad;j++)cout<<" ";
cout<<"*";
for(j=0;j<cnt;j++)cout<<" ";
cout<<"*"<<endl;
}
for(j=0;j<pad;j++)cout<<" ";
cout<<"*"<<endl;
}
}
你可以去掉变量 i,怎么做?
我应该编写一个程序,提示使用行数,然后以 "V" 形状输出 ASCII 艺术。 对于输入4,输出为(“-”代表空格):
*-----* -*---* --*-* ---*
我的代码是:
// prompt for number of stars
int stars;
std::cin >> stars;
// indent
int indent = 0;
int space = 1;
// find space
if (stars = 1)
{
space = 0;
}
else if (stars == 2)
{
space = 1;
}
else if (stars >= 3)
{
int addspace = stars - 2;
space = space + (2 * addspace);
}
// print spaces to double check calculation
std::cout << "space: " << space << '\n';
// print first star
if (stars == 1)
{
std::cout << "*";
}
// print lines
for (int lines = 1; lines == stars; ++lines)
{
// print indent
std::cout << "indent: " << indent << '\n'
<< "spaces: " << space << '\n';
if (lines > 1)
{
for (int ind_loop = 1; ind_loop < indent; ++ind_loop)
{
std::cout << " ";
}
}
std::cout << "*";
indent += 1;
// print spaces
std::cout << "spaces: " << space << '\n';
for (int sp_loop = 0; sp_loop < space; ++sp_loop)
{
std::cout << " ";
}
space -= 2;
std::cout << "*";
// next line
std::cout << '\n';
}
std::cout << '\n';
每次它给我的只是:
*
并且 int 空格总是等于 0。
有谁知道为什么会这样,我需要做些什么来纠正它?
您的代码存在一些问题:
if (stars = 1)
始终为真,它会将stars
的值更改为 1。您需要将其更改为if (stars == 1)
。for(int lines = 1; lines == stars; ++lines)
是错误的,因为它不会执行,除非stars
正好是1。你需要把它改成for(int lines = 1; lines <= stars; ++lines)
。for(int ind_loop = 1; ind_loop < indent; ++ind_loop)
需要改为for(int ind_loop = 0; ind_loop < indent; ++ind_loop)
,才能在第二行正确执行。从你的
for
循环中删除除*
和 space 之外的所有cout
,它们会破坏你的V
形式.对于循环中的最后一个
std::cout << "*";
,您需要添加一个条件来检查它是否是最后一行(最后一行应该打印一次*
) .
所以,最终的代码应该是这样的:
int main()
{
int stars;
std::cin >> stars;
// indent
int indent = 0;
int space = 1;
// find space
if(stars == 1)
{
space = 0;
}
else if(stars == 2)
{
space = 1;
}
else if(stars >= 3)
{
int addspace = stars - 2;
space = space + (2 * addspace);
}
// print spaces to double check calculation
std::cout << "space: " << space << '\n';
// print first star
if(stars == 1)
{
std::cout << "*";
}
// print lines
for(int lines = 1; lines <= stars; ++lines)
{
// print indent
//std::cout << "indent: " << indent << '\n'
// << "spaces: " << space << '\n';
if(lines > 1)
{
for(int ind_loop = 0; ind_loop < indent; ++ind_loop)
{
std::cout << " ";
}
}
std::cout << "*";
indent += 1;
// print spaces
//std::cout << "spaces: " << space << '\n';
for(int sp_loop = 0; sp_loop < space; ++sp_loop)
{
std::cout << " ";
}
space -= 2;
if(lines != stars)
std::cout << "*";
// next line
std::cout << '\n';
}
system("pause");
return 0;
}
你可以用更紧凑的方式做同样的事情,试着理解下面的代码,它做同样的事情而不需要 if,希望它能帮助你在编程的第一步
#include <iostream>
using namespace std;
int main ()
{
int lines,pad,cnt,i,j;
while(true)
{
cin >> lines;
for(i=lines,pad=0,cnt=(lines-2)*2+1;i>1;i--,pad++,cnt-=2)
{
for(j=0;j<pad;j++)cout<<" ";
cout<<"*";
for(j=0;j<cnt;j++)cout<<" ";
cout<<"*"<<endl;
}
for(j=0;j<pad;j++)cout<<" ";
cout<<"*"<<endl;
}
}
你可以去掉变量 i,怎么做?