Интервал для правого треугольника - PullRequest
0 голосов
/ 24 июня 2019

Назначение:

Напишите программу, которая запрашивает у пользователя целочисленное значение, представляющее высоту треугольника.Затем программа должна распечатать треугольник O этой высоты с вертикально выровненным правым краем.

Моя проблема:

Я выяснил код для выполнениянормальный треугольник, но у меня есть некоторые трудности при написании кода, чтобы иметь интервал перед моими "0", чтобы выровнять его вправо.

#include <iostream>

using namespace std;

int main()
{
    int triHeight;
    int c = 0;
    int r = 0;
    int k = 0;

    cout << "Enter the triangle height: " << endl;
    cin >> triHeight;

    for (c = 0; c <= triHeight; c = c+1)
    {
        for (r = 0; r < c; r = r + 1)
        {
            cout << "0";
        }
        for (k = 0; k <= c; k = k - 1)
        {
            cout << " ";
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

Ответы [ 3 ]

2 голосов
/ 24 июня 2019

У вас есть две основные проблемы:

  • вы пишете пробелы после 0, а не до того, чтобы иметь отступ 0

  • for (k = 0; k <= c; k = k - 1) никогда не заканчивается возможным эффектом переполнения

Я также рекомендую вам проверить результат >>, чтобы убедиться, что введено правильное целое число, например if (!(cin >> triHeight)) cerr << "invalid height" << endl; else { ... }

Правильный подход к использованию петель для всех (если вы хотите пирамиду):

#include <iostream>

using namespace std; 

int main()
{
  int triHeight;

  cout << "Enter the triangle height: " << endl;
  if (!(cin >> triHeight))
    cerr << "invalid height" << endl;
  else {
    for (int h = 1; h <= triHeight; h += 1) {
      for (int s = triHeight - h; s != 0; s -= 1)
        cout << ' ';
      for (int z = 2*(h-1)+1; z >0; z -=1)
        cout << '0';
      cout << endl;
    }
  }
}

Компиляция и исполнение:

/tmp % g++ -pedantic -Wextra -Wall c.cc
/tmp % ./a.out
Enter the triangle height: 
5
    0
   000
  00000
 0000000
000000000
/tmp % 

Если вы хотите половину пирамиды:

 #include <iostream>

using namespace std; 

int main()
{
  int triHeight;

  cout << "Enter the triangle height: " << endl;
  if (!(cin >> triHeight))
    cerr << "invalid height" << endl;
  else {
    for (int h = 1; h <= triHeight; h += 1) {
      for (int s = triHeight - h; s != 0; s -= 1)
        cout << ' ';
      for (int z = 0; z < h; z += 1)
        cout << '0';
      cout << endl;
    }
  }
}

Компиляция и исполнение:

/tmp % g++ -pedantic -Wall -Wextra c.cc
/tmp % ./a.out
Enter the triangle height: 
5
    0
   00
  000
 0000
00000
/tmp % 

Вы также не можете сделать две внутренние петли самостоятельно:

#include <iostream>

using namespace std; 

int main()
{
  int triHeight;

  cout << "Enter the triangle height: " << endl;
  if (!(cin >> triHeight))
    cerr << "invalid height" << endl;
  else {
    for (int h = 1; h <= triHeight; h += 1)
      cout << string(triHeight - h, ' ') << string(h, '0') << endl;
  }
}

Компиляция и исполнение:

/tmp % g++ -pedantic -Wall -Wextra c.cc
/tmp % ./a.out
Enter the triangle height: 
5
    0
   00
  000
 0000
00000
/tmp % 

это решение короче, но создает временные строки

0 голосов
/ 24 июня 2019

Логика вашей программы неверна. Сначала вы пытаетесь вывести символ 'O'

    for (r = 0; r < c; r = r + 1)
    {
        cout << "0";
    }

и после этого вы пытаетесь вывести пробелы

    for (k = 0; k <= c; k = k - 1)
    {
        cout << " ";
    }

Кроме того, этот цикл недопустим, потому что переменная k уменьшается начиная с 0.

Программа может быть написана с использованием только одного цикла и стандартных манипуляторов ввода / вывода, объявленных в заголовке <iomanip>

Вот демонстрационная программа

#include <iostream>
#include <iomanip>

int main() 
{
    while ( true )
    {
        const char c = 'O';

        std::cout << "Enter the height of a triangle (0 - exit): ";

        int height = 0;

        if ( not ( std::cin >> height ) or ( height <= 0 ) ) break;

        std::cout << '\n';

        for ( int i = 0; i < height; i++ )
        {
            std::cout << std::setw( height - i ) << std::setfill( ' ' ) << c;
            std::cout << std::setw( i + 1 ) << std::setfill( c ) << '\n';
        }

        std::cout << '\n';
    }

    return 0;
}

Вывод программы может выглядеть следующим образом

Enter the height of a triangle (0 - exit): 1

O

Enter the height of a triangle (0 - exit): 2

 O
OO

Enter the height of a triangle (0 - exit): 3

  O
 OO
OOO

Enter the height of a triangle (0 - exit): 4

   O
  OO
 OOO
OOOO

Enter the height of a triangle (0 - exit): 5

    O
   OO
  OOO
 OOOO
OOOOO

Enter the height of a triangle (0 - exit): 6

     O
    OO
   OOO
  OOOO
 OOOOO
OOOOOO

Enter the height of a triangle (0 - exit): 7

      O
     OO
    OOO
   OOOO
  OOOOO
 OOOOOO
OOOOOOO

Enter the height of a triangle (0 - exit): 8

       O
      OO
     OOO
    OOOO
   OOOOO
  OOOOOO
 OOOOOOO
OOOOOOOO

Enter the height of a triangle (0 - exit): 9

        O
       OO
      OOO
     OOOO
    OOOOO
   OOOOOO
  OOOOOOO
 OOOOOOOO
OOOOOOOOO

Enter the height of a triangle (0 - exit): 10

         O
        OO
       OOO
      OOOO
     OOOOO
    OOOOOO
   OOOOOOO
  OOOOOOOO
 OOOOOOOOO
OOOOOOOOOO

Enter the height of a triangle (0 - exit): 0
0 голосов
/ 24 июня 2019

Самый простой способ сделать это - использовать встроенные функции std::iostream:

#include <iostream>
#include <iomanip>
#include <string>

int main()
{
    int triHeight;
    int c = 0;

    std::cout << "Enter the triangle height: \n";
    std::cin >> triHeight;

    std::cout << std::setfill(' ') << std::right;
    for (c = 0; c < triHeight; c++)
    {
        std::cout << std::setw(triHeight) << std::string(c+1,'0') << '\n';
    }
    return 0;
}

. Вы можете вернуться к треугольнику, выровненному по левому краю, просто изменив std::right на std::left.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...