Как отобразить четверть круга в C ++ на самом начальном уровне? - PullRequest
0 голосов
/ 08 сентября 2018

заранее извините, если это грязно, я новичок в этом.
Короче говоря, я только начал программировать для школы, и один из первых вопросов, которые мне задали, был (переведен как можно лучше) следующим образом:

Алгоритм должен отображать четверть круга для данного радиуса (введенного пользователем), используя символ «*» (при условии, что эти символы имеют одинаковое горизонтальное и вертикальное выравнивание). Вот пример для радиуса 8:

img

Так что я извиняюсь, если это расстраивает, но мы сейчас делаем в основном только основы, так что это означает, что у меня очень строгие ограничения:

  • Единственный вход, который мне разрешено использовать, это указанный радиус,
  • Такие понятия, как числа с плавающей запятой, даже не упоминались в теоретическом курсе, поэтому я не могу их использовать,
  • Мои единственные математические операторы +, -, *, / и по модулю,
  • И самое главное (и разочарование), единственные циклы, которые я могу использовать, это циклы while и if, else.

Итак, подумав, я решил, что пойду так:
Поскольку это нижний правый квадрант, который мы рисуем, мы можем сделать следующее:

С радиусом мы можем проверить каждую отображаемую строку, мы можем сделать следующее:

Убедитесь, что текущая позиция на линии находится внутри круга. Это означает, что мы можем использовать соотношение x 2 + y 2 = r 2 , где x и y становятся (независимо от того, что именно) нашей линией и позицией в этой линии.

Когда я пишу это, оно оказалось гораздо более абстрактным и запутанным, чем я хотел, поэтому я просто собираюсь связать свой перевод на c ++:

int main()
{
    int r, i, j;
    cout << "Rayon ?\n";
    cin >> r;
    i = 0;
    while (i < r) {
        j = 0;
        while (i*i + j*j < r*r) {
            cout << "*";
            j = j + 1;
        }
        cout << "\n";
        i = i+1;
    }
}

Так что этот код хорош, но у него есть недостатки. Пока я могу повторить пример результатов:

img ok

но когда я ввожу что-то вроде 2:

img ob

идёт банан.

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

Извините за долгое чтение, и мне очень жаль, если это не место для чего-то подобного. Все отзывы приветствуются!

1 Ответ

0 голосов
/ 08 сентября 2018

Один из способов облегчить эту проблему для себя - немного отойти от идеи печати круга и начать с чего-то более простого: печать прямоугольной сетки.

Например, скажем, вы хотели написать программу, которая распечатывала сплошную сетку звездочек размером 80x40. Я полагаю, что вы могли бы написать эту программу достаточно легко (или, если нет, вот подсказка: вложите цикл while, который перебирает 80 столбцов внутри цикла while, который перебирает 40 строк).

После того, как вы работаете, и видите хороший сплошной прямоугольник 80x40 (или MxN), полный распечатанных звездочек, единственной оставшейся задачей является изменение вашей программы grid-printer, чтобы некоторые из этих позиций сетки печатались как пробелы, а не звездочки. то есть вместо

 cout << "*";

внутри вашего внутреннего цикла, вы бы получили:

 if (IsThisPositionSupposedToContainAnAsterisk(rowIdx, colIdx))
 {
    cout << "*";
 }
 else
 {
    cout << " ";
 }

... и тогда все, что остается, - это придумать саму функцию:

 bool IsThisPositionSupposedToContainAnAsterisk(int rowIdx, int colIdx)
 {
    // [code to return true if the character-position
    //  at (rowIdx,colIdx) is part of the 
    //  quarter-circle-area or false if it is not]
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...