Почему это не идеальный треугольник C ++?

введите описание изображения здесьЯ только что закончил прорабатывать этот проект Паскаль Треугольник, и результат не является правильным треугольником, у кого-нибудь есть идеи, почему это происходит, интервал выглядит примерно так, как раз выравнивание это далеко

#include <string>
#include <iostream>
using namespace std;
int factorial(int numPar); //the factorial function will recieve a number, and return that number's factorial
int pascalNum(int rowPar, int elementPar);
int main(){
//declarations
string strOutput = "";
int userNum;
int rowCounter = 0;
int elementCounter = 0;
int columnsPerRow = 1;
int spaces;
int initialSpaces;
int counter = 0;
//get user input
cout << "Enter an integer from 1 to 10: ";
cin >> userNum;
while (userNum > 10 || userNum < 1){
cout << "Invalid entry: " << endl;
cin >> userNum;
}
initialSpaces = userNum + 4; //needed to make the triangle an isoscoles, and keep it away from left
//calculations
while ((rowCounter + 1) <= userNum){
for (counter = initialSpaces; counter > 0; counter--){
strOutput = strOutput + " ";
}
while (elementCounter < columnsPerRow){
strOutput = strOutput + to_string(pascalNum(rowCounter, elementCounter));
if (pascalNum(rowCounter, elementCounter) < 10){
spaces = 3;
}
else if (pascalNum(rowCounter, elementCounter) < 100){
spaces = 2;
}
else if (pascalNum(rowCounter, elementCounter) < 1000){
spaces = 1;
}
while (spaces > 0){
strOutput = strOutput + " ";
spaces = spaces - 1;
}
elementCounter = elementCounter + 1;
}

cout << strOutput << endl;
columnsPerRow = columnsPerRow + 1;
elementCounter = 0;
rowCounter = rowCounter + 1;
//initialSpaces--; //this makes there be less and less space until the triangle starts
strOutput = "";
}

system("pause>nul");
return 0;
}
int factorial(int numPar) {
//declarations
int counter = 1;
int numResult = 1;
int initial = numPar;
if (numPar > 1){
while (counter <= numPar){
numResult = numResult * counter;
counter++;
}
return numResult;
}
else
return 1;
}
int pascalNum(int rowPar, int elementPar){
int answer;
answer = factorial(rowPar) / (factorial(elementPar) * factorial(rowPar - elementPar));
return answer;
}

0

Решение

Ну, вы ошиблись в макете. Сначала вы должны разработать макет ячейки с номером. У вас есть начало кода, который делает это, но вы ставите все лишние пробелы справа.

То, что вы, вероятно, хотите, это что-то в центре. Это означает, что для максимум трех цифр вам понадобится один пробел слева, а для одной цифры — пробел с обеих сторон. И в целом вы хотите один пробел между клетками. Таким образом, ваш код дополнения изменится на:

    for(int elementCounter  = 0; elementCounter < columnsPerRow;
elementCounter = elementCounter + 1){
// Don't Repeat Yourself
int num = pascalNum(rowCounter, elementCounter);
string numStr = to_string(num);
if (num < 10){
numStr = numStr + " ";
}
if (num < 100){
numStr = string(" ") + numStr;
}
strOutput += numStr;
}

Теперь, когда вы знаете, что в вашем коде есть ячейки с тремя возможными цифрами и одним пробелом, выделите, как он должен выглядеть для небольшого тестового примера:

    ###
### ###
### ### ###

Теперь посмотрите на шаблон, и вот, слева в каждом ряду два отступа, или 2 * (9 - r) всего, где r идет от 0 в 9, Зафиксируйте свой внешний (рядный) цикл соответствующим образом и избавьтесь от initialSpaces материал:

while ((rowCounter + 1) <= userNum){
for (counter = 2 * (9 - rowCounter); counter > 0; counter--){
strOutput = strOutput + " ";
}
// ... continue as above ...

И это должно исправить вещи. Мораль истории:

Используйте миллиметровку, если нужно.

2

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

Других решений пока нет …

По вопросам рекламы [email protected]