Member 13200081 Ответов: 3

Как нарисовать узор, похожий на бриллиант с#


Напишите программу на языке C# , чтобы отобразить ромбовидный узор, показанный ниже. Пользователь указывает номер строки, которая находится в середине алмаза. Обратите внимание, что количество звезд в строках равно 1, 3, 5 и т. д. Соответственно, а затем вниз ....5, 3, 1.
   *   
  *** 
 ***** 
******* 
 ***** 
  *** 
   *

Обратите внимание, что все звезды расположены по центру.

Что я уже пробовал:

if (radioButton2.Checked) //full diamond
            {
                int i, j, k, n;
                //Convert Text Box TOINT32
                n = Convert.ToInt32(textBox1.Text);  
                string line = ""; // for individual output

                for (i = 1; i <= n; i++)//Upper Diamond
                {
                    
                    for (k = 1; k <= n-i; k++) 
                    {
                        line = "";
                    }
                    for (j = 1; j <= i; j++)
                    {
                        line +=  "* " ;
                    }
                    richTextBox1.SelectionAlignment = HorizontalAlignment.Center;
                    richTextBox1.Text += line + "\n";
                }
                for (i = 1; i <= n - 1; i++) //Bottom Diamond
                {
                    for (k = 1; k <= i; k++)
                    {
                        line = "";
                    }
                    for (j = n - 1; j >= i; j--)
                    {
                        line += "* ";
                    }
                    richTextBox1.SelectionAlignment = HorizontalAlignment.Center;
                    richTextBox1.Text += line + "\n";
                }

            } 


Мои результаты таковы
      *  
     * * 
    * * * 
* * * * * * * 
    * * * 
     * * 
      *

Обратите внимание, что все звезды расположены по центру

мой бриллиант выходит неправильным в формарте 1 2 3 7 и 3 2 1. пожалуйста помочь

3 Ответов

Рейтинг:
21

Mehedi Shams

Привет ,
В этой строке есть ошибка:

for (i = 1; i <= n; i++)//Upper Diamond
Так и должно быть:
for (i = 1; i < n; i+=2)//Upper Diamond - change in comparison and increment
То же самое относится и к нижнему алмазу. Там должна быть пара корректировок для нижнего алмаза; я оставляю это на ваше усмотрение, поскольку я могу только направить вас к решению, но вы должны сделать домашнюю работу.

Плюс очистка линии, участвующая в цикле for, не нужна.
for (k = 1; k <= n-i; k++) 
{
   line = "";
}
Это может быть просто одна строка; цикл FOR неоправданно наказывает компилятор делать то же самое пару раз.
line = "";


Рейтинг:
1

Patrice T

Тщательно проверьте, где вы очищаете line переменная.

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

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
0

George Swan

Я бы начал с анализа того, что происходит. На мой взгляд, существует ряд линий фиксированной длины. Длина каждой строки равна общему количеству строк. Количество линий должно быть нечетным числом и > 1, чтобы у вас была средняя линия для придания алмазного эффекта. Сначала есть центральный символ‘*", а затем новый * добавляется слева и справа от существующих звезд по мере увеличения номера строки. Это продолжается до тех пор, пока не будет напечатана средняя строка, затем процесс меняется на обратный и последний добавленный * слева и справа заменяется пробелом.

Несмотря на веревочке char массив, он доступен только для чтения. Однако вы можете использовать char[], манипулируйте этим, а затем преобразуйте его в строку перед печатью. Что-то вроде

var currentLine = new string(' ', lines); //fill line with spaces
char[] characters = currentLine.ToCharArray();

Затем вы можете добавить ‘*’ к characters массив путем индексации в него. Вам понадобится leftposition и rightposition переменная вместе с increment переменная. Приращение устанавливается равным -1 после печати средней строки.
characters[lpos] = charToPaste;
characters[rpos] = charToPaste;
 Console.WriteLine(new string(characters));
lpos -= increment;
rpos += increment;

Для этого вам понадобится всего один цикл.