C# C语言中沙钟的字符串格式化#

C# C语言中沙钟的字符串格式化#,c#,string,recursion,C#,String,Recursion,假设我有一个如下所示的字符串: ***** *** * *** ***** ***** *** * *** ***** 我正试图以这样的方式对其进行格式化: ***** *** * *** ***** ***** *** * *** ***** 我使用递归构建这个字符串,长度为5,但它可以接收任何奇数作为高度,代码为: public static StringBuilder GenerateSandClockWithInput(StringBuilder stringBu

假设我有一个如下所示的字符串:

*****
***
*
***
*****
*****
 ***
  *
 ***
*****
我正试图以这样的方式对其进行格式化:

*****
***
*
***
*****
*****
 ***
  *
 ***
*****
我使用递归构建这个字符串,长度为5,但它可以接收任何奇数作为高度,代码为:

public static StringBuilder GenerateSandClockWithInput(StringBuilder stringBuilder, uint height)
{
    if (height == 1)
    {
        stringBuilder.AppendLine("*");
        return stringBuilder;
    }

    string aestricsLine = NumberToAestrics(height);
    stringBuilder.AppendLine(aestricsLine);
    GenerateSandClockWithInput(stringBuilder, height - 2);
    stringBuilder.AppendLine(aestricsLine);
    return stringBuilder;
}

public static string NumberToAestrics(uint numberOfAestrics)
{
    StringBuilder stringBuilder = new StringBuilder();
    for (int i = 0; i < numberOfAestrics; i++)
    {
        stringBuilder.Append("*");
    }
    return stringBuilder.ToString();
}
公共静态StringBuilder生成并使用输入计时(StringBuilder StringBuilder,uint高度)
{
如果(高度==1)
{
stringBuilder.AppendLine(“*”);
返回stringBuilder;
}
字符串aestricsLine=数字AESTRICS(高度);
stringBuilder.AppendLine(埃斯特里斯林);
使用输入生成和计时(stringBuilder,高度-2);
stringBuilder.AppendLine(埃斯特里斯林);
返回stringBuilder;
}
公共静态字符串NumberToFaestrics(uint numberOfAestrics)
{
StringBuilder StringBuilder=新的StringBuilder();
for(int i=0;i
计算每行之前应添加的空白数量,并使用
新字符串(char,count)
构造函数在每行之前添加空字符串

您可以使用
String.Split
Linq
String.Join
来完成。这是代码

生成原始字符串:

static string Make(int height)
{
    var lines = Enumerable.Range(-height, 2 * height + 1)
                          .Where(i => Math.Abs(i) % 2 == 1)
                          .Select(i => new string('*', Math.Abs(i)));

    return string.Join(Environment.NewLine, lines);
}
居中对齐

static string AlignCenter(string input)
{
    var lines = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();

    var maxLength = (int)(lines.Max(i => i.Length));

    var result = lines.Select(i => $"{new string(' ', (maxLength - i.Length + 1) / 2) }{i}").ToList();

    return string.Join(Environment.NewLine, result);
}
用法

Console.WriteLine(Make(5));

Console.WriteLine(AlignCenter(Make(5)));

计算每行之前应添加的空白数量,并使用
新字符串(char,count)
构造函数在每行之前添加空字符串

您可以使用
String.Split
Linq
String.Join
来完成。这是代码

生成原始字符串:

static string Make(int height)
{
    var lines = Enumerable.Range(-height, 2 * height + 1)
                          .Where(i => Math.Abs(i) % 2 == 1)
                          .Select(i => new string('*', Math.Abs(i)));

    return string.Join(Environment.NewLine, lines);
}
居中对齐

static string AlignCenter(string input)
{
    var lines = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();

    var maxLength = (int)(lines.Max(i => i.Length));

    var result = lines.Select(i => $"{new string(' ', (maxLength - i.Length + 1) / 2) }{i}").ToList();

    return string.Join(Environment.NewLine, result);
}
用法

Console.WriteLine(Make(5));

Console.WriteLine(AlignCenter(Make(5)));

您可以这样尝试,如果这不是必需的,您不必返回字符串生成器。它是引用类型,在此代码中始终具有相同的引用类型:

class Program
{
    public static void Main()
    {
        var clockBuilder = new StringBuilder();
        GenerateSandClock( clockBuilder, 13 );
        Console.Write(clockBuilder.ToString() );
        Console.ReadKey();
    }

    private static void GenerateSandClock(StringBuilder stringBuilder, uint height, uint indentionLevel = 0)
    {
        var line = NumberToSpaces( indentionLevel ++ ) + NumberToAestrics( height );
        stringBuilder.AppendLine(line);

        if (height == 1)
        {
            return;
        }

        GenerateSandClock(stringBuilder, height - 2, indentionLevel);
        stringBuilder.AppendLine(line);
    }

    private static string NumberToSpaces( uint indentionLevel)
    {
        return new string( ' ', (int)indentionLevel);
    }

    private static string NumberToAestrics(uint numberOfAestrics)
    {
        return new string( '*', (int)numberOfAestrics );
    }
}

您可以这样尝试,如果这不是必需的,您不必返回字符串生成器。它是引用类型,在此代码中始终具有相同的引用类型:

class Program
{
    public static void Main()
    {
        var clockBuilder = new StringBuilder();
        GenerateSandClock( clockBuilder, 13 );
        Console.Write(clockBuilder.ToString() );
        Console.ReadKey();
    }

    private static void GenerateSandClock(StringBuilder stringBuilder, uint height, uint indentionLevel = 0)
    {
        var line = NumberToSpaces( indentionLevel ++ ) + NumberToAestrics( height );
        stringBuilder.AppendLine(line);

        if (height == 1)
        {
            return;
        }

        GenerateSandClock(stringBuilder, height - 2, indentionLevel);
        stringBuilder.AppendLine(line);
    }

    private static string NumberToSpaces( uint indentionLevel)
    {
        return new string( ' ', (int)indentionLevel);
    }

    private static string NumberToAestrics(uint numberOfAestrics)
    {
        return new string( '*', (int)numberOfAestrics );
    }
}
试试福洛维

        static void Main(string[] args)
        {
            StringBuilder stringBuilder = new StringBuilder();
            int height = 5;
            stringBuilder =  GenerateSandClockWithInput(stringBuilder, 0, height);
        }
        public static StringBuilder GenerateSandClockWithInput(StringBuilder stringBuilder, int row, int height)
        {
            if (row == height) return stringBuilder;
            if (row < height / 2)
            {
                stringBuilder.AppendLine(new string(' ', row) + new string('*', height - (2 * row)));
            }
            else
            {
                stringBuilder.AppendLine(new string(' ', height - row - 1) + new string('*', (2* row) - height + 2));
            }
            GenerateSandClockWithInput(stringBuilder, row + 1, height);
            return stringBuilder;
        }
static void Main(字符串[]args)
{
StringBuilder StringBuilder=新的StringBuilder();
整数高度=5;
stringBuilder=GenerateSandClockWithInput(stringBuilder,0,高度);
}
公共静态StringBuilder GenerateSandClockWithInput(StringBuilder StringBuilder,整型行,整型高度)
{
如果(行==高度)返回stringBuilder;
如果(行<高度/2)
{
AppendLine(新字符串('',行)+新字符串('*',高度-(2*行));
}
其他的
{
AppendLine(新字符串(“”,高度-行-1)+新字符串(“”*,(2*行)-高度+2));
}
使用输入生成和计时(stringBuilder,行+1,高度);
返回stringBuilder;
}
ng:

试试下面的方法

        static void Main(string[] args)
        {
            StringBuilder stringBuilder = new StringBuilder();
            int height = 5;
            stringBuilder =  GenerateSandClockWithInput(stringBuilder, 0, height);
        }
        public static StringBuilder GenerateSandClockWithInput(StringBuilder stringBuilder, int row, int height)
        {
            if (row == height) return stringBuilder;
            if (row < height / 2)
            {
                stringBuilder.AppendLine(new string(' ', row) + new string('*', height - (2 * row)));
            }
            else
            {
                stringBuilder.AppendLine(new string(' ', height - row - 1) + new string('*', (2* row) - height + 2));
            }
            GenerateSandClockWithInput(stringBuilder, row + 1, height);
            return stringBuilder;
        }
static void Main(字符串[]args)
{
StringBuilder StringBuilder=新的StringBuilder();
整数高度=5;
stringBuilder=GenerateSandClockWithInput(stringBuilder,0,高度);
}
公共静态StringBuilder GenerateSandClockWithInput(StringBuilder StringBuilder,整型行,整型高度)
{
如果(行==高度)返回stringBuilder;
如果(行<高度/2)
{
AppendLine(新字符串('',行)+新字符串('*',高度-(2*行));
}
其他的
{
AppendLine(新字符串(“”,高度-行-1)+新字符串(“”*,(2*行)-高度+2));
}
使用输入生成和计时(stringBuilder,行+1,高度);
返回stringBuilder;
}

ng:

您将沙钟图形所需的
*
前的空格输出到哪里?我没有,我的代码已显示,我不确定实现此目的的正确方法您的
numbertostarisks
函数需要获取星号数和行的总长度。然后进行数学运算,计算出在第一个星号之前需要打印多少个空格,但在递归中效果不太好。假设线的长度是5。然后,当我发送3时,我需要记住5是一个常数。您是否在沙钟图形所需的
*
之前输出空格?我没有,我的代码已显示,我不确定实现此目的的正确方法您的
NumberToAsterisks
函数需要获取星号的数量和行的总长度。然后进行数学运算,计算出在第一个星号之前需要打印多少个空格,但在递归中效果不太好。假设线的长度是5。然后,当我发送3时,我需要记住5是一个常数,这比原始代码倒退了一步,因为它依赖于一个硬编码的沙漏,有5行。在这种情况下,LINQ解决方案的可读性可能不如for循环。这是原始代码的倒退,因为它依赖于具有5行的硬编码沙漏。在本例中,LINQ解决方案的可读性可能不如for循环。它非常接近:)请在stringBuilder.AppendLine中更改高度行(新字符串(“”,高度行)为高度行-1,以便我可以为未来的谷歌用户将其标记为正确:)谢谢我做了更改。非常接近:)请将stringBuilder中的高度-行更改为高度-行。AppendLine(新字符串(“”,高度-行)更改为高度-行-1,以便我可以为未来的谷歌用户将其标记为正确:)谢谢我做了更改。