ASCII art «V» в переполнении стека

Я должен написать программу, которая предлагает использовать количество строк, а затем выводит искусство ASCII в форме «V».
Для входа 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 space всегда выходит равным 0.

Кто-нибудь знает, почему это может быть, и что мне нужно сделать, чтобы исправить это?

-1

Решение

Есть некоторые проблемы с вашим кодом:

  1. if (stars = 1) всегда верно, и это меняет значение stars 1. Вам нужно изменить его на if (stars == 1) вместо.

  2. for(int lines = 1; lines == stars; ++lines) неправильно, так как он не будет выполняться, если stars точно 1. Вам нужно изменить его на for(int lines = 1; lines <= stars; ++lines) вместо.

  3. for(int ind_loop = 1; ind_loop < indent; ++ind_loop) должен быть изменен на for(int ind_loop = 0; ind_loop < indent; ++ind_loop) вместо этого, чтобы действовать правильно на второй линии.

  4. Удалить все coutс чем * и пространство от вашего for петля, они сломают ваш V форма.

  5. за последние 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;
}
3

Другие решения

Вы можете сделать то же самое в очень компактной манере, попробуйте понять следующий код, который делает то же самое, что и вы, без необходимости использования 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;
}
}

Вы можете избавиться от переменной я, как?

-1