создать звездочку с помощью C # - PullRequest
0 голосов
/ 06 апреля 2011

Привет всем Я пытаюсь решить проблему дерева звездочек и обнаружил, что мой код не работает правильно и может быть улучшен.

Это ожидаемый вывод

вход: 5

    *
  * * *
* * * * *
  * * *
    *

вход: 4

* * * *
  * *
* * * *

а это мой код

static void Main(string[] args)
        {
            Console.Write("input:");

            char input = Console.ReadKey().KeyChar;

            if (char.IsDigit(input))
            {
                int couter = (int)char.GetNumericValue(input);

                Console.WriteLine();

                if (couter % 2 != 0)
                {

                    for (int i = 1; i <= couter; i++)
                    {

                        for (int j = 3; j > i; j--)
                        {

                            Console.Write("  ");

                        }

                        for (int k = 1; k <= i; k++)
                        {

                            Console.Write(" *");

                        }

                        Console.WriteLine();
                    }

                    for (int i = couter - 1; i >= 3; i--)
                    {
                        for (int j = 1; j <= i; j++)
                        {

                            if (j <= couter - i)
                            {
                                Console.Write("  ");
                            }
                            else
                            {
                                Console.Write("* ");
                            }
                        }

                        Console.WriteLine();
                    }

                }
                else
                {

                    for (int i = couter; i > 3; i--)
                    {
                        for (int j = 1; j <= i; j++)
                        {
                            if (couter - i >= j)
                            {
                                Console.Write("  ");
                            }
                            else
                            {
                                Console.Write("* ");
                            }
                        }

                        Console.WriteLine();


                    }

                    for (int i = couter - 1; i <= couter; i++)
                    {
                        for (int j = 0; j < i; j++)
                        {
                            Console.Write("* ");
                        }

                        Console.WriteLine();
                    }
                }

            }
        }

Пожалуйста, не могли бы вы помочь мне решить эту проблему.

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

Спасибо,

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

Сначала я неохотно публиковал его, потому что он определенно пахнет домашней работой ...

В любом случае, вот фрагмент рабочего кода:

static void Main(string[] args)
{
    Console.Write("input:");

    char input = Console.ReadKey().KeyChar;

    if (char.IsDigit(input))
    {
        int couter = (int)char.GetNumericValue(input);
        Console.WriteLine();
        if (couter % 2 != 0)
            PrintDiamond(couter);
        else
            PrintHourGlass(couter);
    }
    Console.ReadLine();
}

private static void PrintDiamond(int couter)
{
    bool moreAsterisks = true;
    for (int row = 0; row < couter; row++)
    {
        int nAsterisks = moreAsterisks ? (2 * row) + 1 : 2 * (couter - row - 1) + 1;
        int nSpaces = (couter - nAsterisks) / 2;

        if (row == (couter - 1) / 2)
            moreAsterisks = false;

        for (int i = 0; i < nSpaces; i++)
            Console.Write(" ");
        for (int i = 0; i < nAsterisks; i++)
            Console.Write("*");
        for (int i = 0; i < nSpaces; i++)
            Console.Write(" ");
        Console.WriteLine();
    }
}

private static void PrintHourGlass(int couter)
{
    bool moreAsterisks = false;
    for (int row = 0; row < couter - 1; row++)
    {
        int nAsterisks = moreAsterisks ? couter - 2 * (couter - row - 2) : couter - (2 * row);
        int nSpaces = (couter - nAsterisks) / 2;

        if (row == (couter - 2) / 2)
            moreAsterisks = true;

        for (int i = 0; i < nSpaces; i++)
            Console.Write(" ");
        for (int i = 0; i < nAsterisks; i++)
            Console.Write("*");
        for (int i = 0; i < nSpaces; i++)
            Console.Write(" ");
        Console.WriteLine();
    }
}

P.S.: он работает слюбое число, а не только 4-5 ...

1 голос
/ 06 апреля 2011

Проверьте эту страницу для ввода 5 (ромб): http://www.dreamincode.net/forums/topic/126715-diamond-asterisk/

Я перевел его на C # - теперь он отображает алмазы с размером, который вы установили в переменной 'строки':

int rows = 5;
StringBuilder sb = new StringBuilder();
// top part
for (int i = 1; i <= rows; i++)
{
    for (int j = 1; j <= rows - i; j++)
        sb.Append(' ');
    for (int k = 1; k <= 2 * i - 1; k++)
        sb.Append('*');
    sb.AppendLine();
}
//bottom part
for (int n = rows - 1; n > 0; n--)
{
    for (int l = 1; l <= rows - n; l++)
        sb.Append(' ');
    for (int m = 1; m <= 2 * n - 1; m++)
        sb.Append('*');
    sb.AppendLine();
}
Console.Write(sb.ToString());
0 голосов
/ 08 апреля 2011

Вот минимизированное решение LINQ для вашей проблемы:

    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("input: ");
            string line = Console.ReadLine();

            int n;
            if (!int.TryParse(line, out n))
            {
                Console.WriteLine("Enter a valid integer number.");
                return;
            }

            for (int i = 0; i < n; i++)
            {
                int l = Math.Abs(n - i * 2 - 1) + 1;
                if (n % 2 != 0) l = n - l + 1;

                Console.Write(Enumerable.Repeat(" ", n - l).DefaultIfEmpty("").Aggregate((a, b) => a + b));
                Console.WriteLine(Enumerable.Repeat("* ", l).DefaultIfEmpty("").Aggregate((a, b) => a + b));
            }
        }
    }

Это довольно просто;внутри цикла первая строка вычисляет длину i-й строки ромбов, если ввод четный, вторая корректирует расчет для нечетного ввода.Оставшиеся две строки печатают i-ю строку, используя некоторые приемы LINQ.Если вам не нравится хвастаться с помощью LINQ, вы можете заменить строки thoose обычными циклами for (что, вероятно, будет быстрее).Тогда код будет выглядеть так:

class Program
{
    static void Main(string[] args)
    {
        Console.Write("input: ");
        string line = Console.ReadLine();

        int n;
        if (!int.TryParse(line, out n))
        {
            Console.WriteLine("Enter a valid integer number.");
            return;
        }

        for (int i = 0; i < n; i++)
        {
            int l = Math.Abs(n - i * 2 - 1) + 1;
            if (n % 2 != 0) l = n - l + 1;

            //Console.Write(Enumerable.Repeat(" ", n - l).DefaultIfEmpty("").Aggregate((a, b) => a + b));
            //Console.WriteLine(Enumerable.Repeat("* ", l).DefaultIfEmpty("").Aggregate((a, b) => a + b));
            for (int c = 0; c < n - l; c++) Console.Write(" ");
            for (int c = 0; c < l; c++) Console.Write("* ");
            Console.WriteLine();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...