для цикла — Как напечатать ромбовидную форму с переполнением стека

Мне нужна помощь, я недавно создал небольшую небольшую программу, в которой она напечатала бы простую пирамиду с «*», например так:

  *
***
*****

но я решил бросить вызов самому себе и посмотреть, смогу ли я создать простую форму ромба, как это:

  *
***
*****
***
*

Вот мой код до сих пор.
Я также должен добавить, что введенное вами значение, например, 5, определяет размер бриллианта.

#include <iostream>
#include <sstream>
using namespace std;

int main() {int value = 0;
cout << "Please enter in a value: ";
cin >> value;
cout << endl;for (int i = 0; i < value; i++) {
//print spaces v v v
for (int x = 0; x < (value - i - 1); x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (2 * i + 1); y++) {
cout << "*";
}
cout << endl;
}

for (int i = 0; i < value; i++) {
int number = 0;
number+= 2;
//print spaces v v v
for (int x = 0; x < (value - value + i + 1); x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (/*ATTENTION: What do I do here? Plz help*/); y++) {
cout << "*";
}
cout << endl;
}return 0;
}

То, что я пытался сделать, это выяснить, что поместить в круглые скобки, где написано (// ВНИМАНИЕ). Я работал по крайней мере час, пытаясь делать случайные вещи, и один раз это работало, когда я вводил 4, но не для 5, и это было просто очень сложно. Это ключ к построению алмаза, попробуйте просто оценить и собрать, чтобы увидеть, что произойдет. Мне нужно, чтобы это было симметрично.

Мне нужно знать, что поставить в скобках, пожалуйста. Я сожалею, что это очень долго, но помощь будет оценена, спасибо.

Я также прошу прощения, если мой код грязный и трудно читаемый.

-2

Решение

int number = 0; а также number+= 2;

value - value внутри for (int x = 0; x < (value - value + i + 1); x++) {

не требуются.


Внутри скобки вы можете использовать

2*(value-i-1)-1

Однако я бы посоветовал вам сначала проанализировать проблему, а затем попытаться решить ее, а не пробовать случайные вещи. Например, давайте рассмотрим случаи четных и нечетных входов, то есть 2 и 3.

Четный случай (2)

 *
***
***
*

Анализ

Row Index    Number of Spaces    Number of Stars
0            1                   1
1            0                   3
2            0                   3
3            1                   1

Для индекса строки < значение

  1. Количество пробелов = value - row index - 1
  2. Количество звезд = 2 * row index + 1

Для индекса строки> = значение
Количество мест и звезд просто поменялись местами. В нечетных случаях ситуация аналогична за небольшим исключением.

Нечетный случай (3)

  *
***
*****
***
*

Анализ

Row Index    Number of Spaces    Number of Stars
0            2                   1
1            1                   3
2            0                   5
3            1                   3
4            2                   1

Небольшое исключение состоит в том, что при обращении мы должны игнорировать строку index = value.


Теперь, если мы поместим приведенный выше анализ в код, мы получим решение

//Define the Print Function
void PrintDiamond(int rowIndex, int value)
{
//print spaces v v v
for (int x = 0; x < value - rowIndex -1; x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < 2 * rowIndex + 1; y++) {
cout << "*";
}
cout << endl;
}

А потом внутри главной

//Row index < value
for (int i = 0; i < value; i++) {
PrintDiamond(i,value);
}

//For row index >= value reversing the above case
//value-(value%2)-1 subtracts 1 for even and 2 for odd cases
//ignore the row index = value in odd cases
for (int i = value-(value%2)-1; i >=0; i--) {
PrintDiamond(i,value);
}
1

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

#include <iostream>
#include <sstream>
using namespace std;

int main() {

int value = 0;
cout << "Please enter in a value: ";
cin >> value;
cout << endl;for (int i = 0; i < value; i++) {
//print spaces v v v
for (int x = 0; x < (value - i - 1); x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (2 * i + 1); y++) {
cout << "*";
}
cout << endl;
}

for (int i = 0; i < value-1; i++) {
//    int number = 0;
//    number+= 2;
//    //print spaces v v v

for (int x = 0; x < i+1; x++) {
cout << " ";
}
//print * v v v
for (int y = 0; y < (2*(value-1-i)-1); y++) {
cout << "*";
}
cout << endl;
}return 0;
}

Я надеюсь, что вы получите это. Также во втором цикле for вы итерировали его еще один раз, повторяя цикл до value, Но так как пирамида симметрична, то число рядов в пирамиде будет 2*value-1.Так я во втором цикле i должен варьироваться до value -1,

1

Этот код должен решить проблему:

#include <sstream>
using namespace std;

void printSpaces(int howMany) {
for(int i = 0; i < howMany; i++) cout << " ";
}

void figure(int size) {
bool oddSize = size % 2 == 1;
int center = size / 2;
int spaces = size / 2;
// If figure is of an odd size adjust center
if (oddSize) {
center++;
} else { // Else if figure is of even size adjust spaces
spaces--;
}

for (int i = 1; i <= center; i++) {
printSpaces(spaces);
for(int j = 0; j <  1 + (i - 1) * 2; j++) cout << "*";
cout << endl;
spaces--;
}

spaces = oddSize ? 1 : 0; // If the figure's size is odd number adjust spaces to 1
center -= oddSize ? 1 : 0; // Adjust center if it's an odd size figure
for(int i = center; i >= 1; i--) {
printSpaces(spaces);
for(int j = 0; j <  1 + (i - 1) * 2; j++)
cout << "*";
cout << endl;
spaces++;
}

}

int main() {
int value = 0;
while(value < 3) {
cout << "Please enter in a value (>= 3): ";
cin >> value;
cout << endl;
}
figure(value);
return 0;
}
1
По вопросам рекламы [email protected]