Мне нужно сделать эту форму (или похожую) из звездочек:
* *
* * * *
* * * * * * *
* * * *
* *
Я немного знаю, как сделать «вложенные для циклов». Я могу сделать только один треугольник, и мне нужно два рядом друг с другом …
#include <iostream>
using namespace std;
int main()
{
cout<<"Insert A Number...\n" <<endl;
int i;
int j;
int size;
cin >> size;
for(i=1;i<size*2;i+=2)
{
cout<<endl;
for(j=(size-i)/2+1;j>=0;j--)
{
cout<<' ';
}
for(j=0;i>j;j++)
{
cout<<'$';
}
}
cin.get();
return 0;
}
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
cout << "Insert A Number...\n" << endl;
int size;
cin >> size;
int user_rows = size;
int user_cols = ceil(user_rows / 2.0)*2;
for (int row = 1; row <= user_rows; row++) { //print each row of asterisks
int asterisksPerSide = (row * 2 <= user_rows) ? row : user_rows - row + 1;
int spacesTotal = user_cols - (2 * asterisksPerSide);
for (int asterisksPrinted = 0; asterisksPrinted < asterisksPerSide; asterisksPrinted++) { //print first part of row
cout << "*";
}
for (int spacesPrinted = 0; spacesPrinted < spacesTotal; spacesPrinted++) { //print spaces
cout << " ";
}
for (int asterisksPrinted = 0; asterisksPrinted < asterisksPerSide; asterisksPrinted++) { //print last part of row
cout << "*";
}
cout << endl;
}
}
Несколько замечаний, чтобы помочь вам:
Например, если N равно 10:
В строке 1 1 звездочка, 10-1 пробел, 10-1 пробел, 1 звездочка.
Линия 2 имеет 2 звездочки, 10 — 2 пробела, 10 — 2 пробела, 2 звездочки.
В строке 3 есть 3 звездочки, 10 — 3 пробела, 10 — 3 пробела, 3 звездочки.
Строка 4 имеет 4 звездочки, 10 — 4 пробела, 10 — 4 пробела, 4 звездочки.
// …
Линия 11 имеет 9 звездочек, 10 — 9 пробелов, 10 — 9 пробелов, 9 звездочек.
Линия 12 имеет 8 звездочек, 10 — 8 пробелов, 10 — 8 пробелов, 8 звездочек.
Линия 13 имеет 7 звездочек, 10 — 7 пробелов, 10 — 7 пробелов, 7 звездочек.
Видишь какие-то шаблоны?
Ваш код печатает треугольник с вершиной вверху. То, что вы хотите, это боковой треугольник — два из них, на самом деле. Чтобы понять, как это сделать, проработайте пример на бумаге.
В случае, который вы отобразили выше, предполагая, что ввод был 3
как бы вы напечатали каждую строку?
Простой способ узнать количество звезд на каждой стороне — это сосчитать 1
в 3
, затем обратный отсчет от 2
в 1
, Теперь вам просто нужно рассчитать количество пробелов в строке. Существует также проблема одинокой звезды в центре самой длинной линии, что означает, что вам придется иметь дело с этой линией отдельно.
Программа ниже выводит на экран именно тот результат, который вы отображали в своем вопросе, когда пользователь вводит 3
, Обратите внимание, как я определил пару вспомогательных функций, repeat()
а также printRow()
, чтобы избежать написания одного и того же кода несколько раз.
#include <iostream>
#include <string>
using namespace std;
void repeat(int n, string s) {
for (int i = 0; i < n; ++i) {
cout << s;
}
}
void printRow(int size, int i) {
repeat(i, "* ");
repeat(2*(size-i)+1, " ");
repeat(i-1, "* ");
cout << "*" << endl;
}
int main() {
cout << "Enter a number:" << endl;
int size;
cin >> size;
for (int i = 1; i < size; ++i) { // Rows of increasing length.
printRow(size, i);
}
repeat(2*size, "* "); // Middle row.
cout << "*" << endl;
for (int i = size-1; i >= 1; --i) { // Rows of decreasing length.
printRow(size, i);
}
return 0;
}
Подумайте, как вы можете это сделать построчно вместо того, чтобы думать слева направо, если вы собираетесь использовать для циклов.