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,以便我可以为未来的谷歌用户将其标记为正确:)谢谢我做了更改。