如何在 asp 中创建等边星号金字塔
How to create equilateral pyramid of asterisks in asp
我的代码打印出一个直角三角形
For i = 1 To 7
For j = 1 to i
response.write(" * ")
Next
for k = 0 < i to 7
response.write(" ")
Next
response.write("</br>")
由于三角形会被浏览器渲染,所以布局可以使用CSS,大概是这样的:
<style>
.triangle {
display: flex;
align-items: center;
flex-direction: column;
}
.triangle div {
letter-spacing: 0.72em;
}
</style>
那么您将需要在 .aspx 页面上使用:
<asp:Literal ID="aTriangle" runat="server"></asp:Literal>
连同 code-behind:
Sub CreateTriangle(maxStars As Integer)
Dim sb As New StringBuilder()
sb.AppendLine("<div class=""triangle"">")
For i = 1 To maxStars
sb.AppendLine("<div>" & New String("*"c, i) & "</div>")
Next
sb.AppendLine("</div>")
aTriangle.Text = sb.ToString()
End Sub
然后您在 Page_Load 子中调用它:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
CreateTriangle(6)
End Sub
好的,这是一道很棒的面试题!
这种方式带回了过去我们有绿屏或基于“控制台”的应用程序时编写代码的“乐趣”。
第一个问题:
spaces(空白)在浏览器中的输出将被忽略。您可以通过使用不中断 space ().
来强制解决这个问题
但是,我们在浏览器中使用的文本不是固定间距的。
因此,您的代码将生成三角形,但问题是假设间距是固定的。如果我们想在左侧(和右侧)space,那么我们必须使用一些复杂的代码来计算左侧所需的 space,然后是“" 然后是 spaces,然后是 ""。 (我们可以跳过右侧的 spaces)。
你得到这样的结果:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim i, j As Integer
Dim NumRows As Integer = TextBox1.Text
Dim triWidth As Integer = (NumRows * 2) - 1
Dim SpaceOnSide As Integer = 0
Dim SpaceInMiddle As Integer = 0
Dim Blank As String = " "
Dim Border As String = "*"
For i = 1 To NumRows
' space on left side
SpaceOnSide = ((triWidth - ((i * 2) - 1))) / 2
For j = 1 To SpaceOnSide
OutPut(Blank)
Next
OutPut(Border)
'SpaceInMiddle = triWidth - (SpaceOnSide * 2) - 2 ' - 1 for border
SpaceInMiddle = (i * 2) - 1 - 2 ' - 2 for border
For j = 1 To SpaceInMiddle
If i = NumRows Then
OutPut(Border)
Else
OutPut(Blank)
End If
Next
If i > 1 Then
OutPut(Border)
End If
Debug.WriteLine("")
Next
End Sub
Sub OutPut(s As String)
Debug.Write(s)
End Sub
和我们的输出(立即 window - 我有工具 [x] 发送所有输出
但是,让我们更改代码以将“*”放入其中,我们得到:
For j = 1 To SpaceInMiddle
If i = NumRows Then
OutPut(Border)
Else
OutPut(Border)
End If
Next
所以我们现在得到这个:
前面的结果也显示了。
好的,但是输出到控制台或绿屏“文本”有点问题。一个问题是,如果我们要制作一个三角形,我们实际上需要“一半”的间距来将线放在下面。
但是,这就是网络变得多么酷的地方。
首先,我们不局限于输出“*”。我们可以输出图像,或任何我们想要的东西!!!
所以,让我们 google - 为此找一个可爱的“球”或“球体”。
我们将用两张图片替换“*”和“”(空白)。
一个用于空白(白色方块),一个用于“*”
所以,我只是将这两个方块放在我的内容文件夹中
让我们加入一个“div”来显示“*”或现在的球。
我们本可以放入一个文本框,并使用固定的“控制台”类型字体。但是,这是网络。
所以,让我们看一下上面的代码 -(很复杂 - 但我们会在一分钟内解决)。
请注意我是如何使用一个名为“输出”的例程的。我这样做是因为我们现在可以将该输出更改为浏览器。
所以,我们的标记现在是这样的:
<div id="mydiv" runat="server">
</div>
我们只是放入一个“东西”或我们想要将结果放入的地方。
现在,我们要代替“*”输出图片到 div。
所以,我们复杂的代码现在是这样的:
Dim Blank As String = GetFileAsPicture("w.jpg") ' white sqaure block
Dim Border As String = GetFileAsPicture("r2.jpg") ' round ball
For i = 1 To NumRows
' space on left side
SpaceOnSide = ((triWidth - ((i * 2) - 1))) / 2
For j = 1 To SpaceOnSide
OutPut(Blank)
Next
OutPut(Border)
'SpaceInMiddle = triWidth - (SpaceOnSide * 2) - 2 ' - 1 for border
SpaceInMiddle = (i * 2) - 1 - 2 ' - 2 for border
For j = 1 To SpaceInMiddle
If i = NumRows Then
OutPut(Border)
Else
OutPut(Border)
End If
Next
If i > 1 Then
OutPut(Border)
End If
OutPut("<br/>") ' start a new line
Next
而 GetFileAsPicture 是这样的:
Function GetFileAsPicture(sFile As String) As String
' get a picture from our Content folder,
' return as picture HTML "image" mark-up
Return "<img src=""" & "../Content/" & sFile & """ />"
End Function
所以,现在当我们 运行 这个时,我们得到这个:
请注意,输出“球”代替“*”真的不需要很多额外工作。
但是,我们在上面仍然固定 font/image 大小。所以真的,这不是我们想要的三角形,因为每个球都排在上面一行的下方。
但是,就像使用文字处理器一样,我们可以转储所有复杂的代码以显示在那些空白处(现在是白色图像),并让“div”为我们的内容居中.
所以我们的 div 将完成添加所有这些额外空白的工作 - 我们只输出球
我们的 div 现在变成了这样:
<div id="mydiv" runat="server" style="text-align:center">
</div>
所以,我们的代码现在变得非常简单。
Dim Blank As String = GetFileAsPicture("W.jpg") ' white sqaure block
Dim Border As String = GetFileAsPicture("r2.jpg") ' round ball
For i = 1 To NumRows
For j = 1 To j + 1
OutPut(Border)
Next
OutPut("<br/>") ' start a new line
Next
我们现在得到这个:(它和以前一样 - 但没有中心代码!!!)
但是,我们不再像绿色控制台那样固定字体或固定大小了,是吗?
所以,我们不关心半间距。所以,我们的代码现在可以每行再添加一个球——它仍然会居中。
所以,我们现在有这个:
Dim Blank As String = GetFileAsPicture("W.jpg") ' white sqaure block
Dim Border As String = GetFileAsPicture("r2.jpg") ' round ball
For i = 1 To NumRows
For j = 1 To i
OutPut(Border)
Next
OutPut("<br/>") ' start a new line
Next
现在我们明白了:
因此,就像使用文字处理器一样 - 文本居中,我们不限于固定宽度,例如控制台或绿屏。
所以,我们说请居中。并且球的宽度是固定的(每个球),但是当我们说请将上下文居中放置在“div”时,浏览器会为我们做这件事——这甚至意味着一半的间距,或者实际上是一样多根据需要。
因此,我们甚至不必将球排成一行(就像我们使用固定文本和绿屏控制台那样)。
所以,我现在的代码是这样的:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim i, j As Integer
Dim NumRows As Integer = TextBox1.Text
Dim Border As String = GetFileAsPicture("r2.jpg") ' round ball
For i = 1 To NumRows
For j = 1 To i
OutPut(Border)
Next
OutPut("<br/>") ' start a new line
Next
End Sub
Sub OutPut(s As String)
Me.mydiv.InnerHtml &= s
End Sub
Function GetFileAsPicture(sFile As String) As String
' get a picture from our Content folder,
' return as picture HTML "image" mark-up
Return "<img src=""" & "../Content/" & sFile & """ />"
End Function
所以,使用 windows 剪切实用程序,从上面抓住我的一个球,然后使用它。
我的代码打印出一个直角三角形
For i = 1 To 7
For j = 1 to i
response.write(" * ")
Next
for k = 0 < i to 7
response.write(" ")
Next
response.write("</br>")
由于三角形会被浏览器渲染,所以布局可以使用CSS,大概是这样的:
<style>
.triangle {
display: flex;
align-items: center;
flex-direction: column;
}
.triangle div {
letter-spacing: 0.72em;
}
</style>
那么您将需要在 .aspx 页面上使用:
<asp:Literal ID="aTriangle" runat="server"></asp:Literal>
连同 code-behind:
Sub CreateTriangle(maxStars As Integer)
Dim sb As New StringBuilder()
sb.AppendLine("<div class=""triangle"">")
For i = 1 To maxStars
sb.AppendLine("<div>" & New String("*"c, i) & "</div>")
Next
sb.AppendLine("</div>")
aTriangle.Text = sb.ToString()
End Sub
然后您在 Page_Load 子中调用它:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
CreateTriangle(6)
End Sub
好的,这是一道很棒的面试题!
这种方式带回了过去我们有绿屏或基于“控制台”的应用程序时编写代码的“乐趣”。
第一个问题: spaces(空白)在浏览器中的输出将被忽略。您可以通过使用不中断 space ().
来强制解决这个问题但是,我们在浏览器中使用的文本不是固定间距的。
因此,您的代码将生成三角形,但问题是假设间距是固定的。如果我们想在左侧(和右侧)space,那么我们必须使用一些复杂的代码来计算左侧所需的 space,然后是“" 然后是 spaces,然后是 ""。 (我们可以跳过右侧的 spaces)。
你得到这样的结果:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim i, j As Integer
Dim NumRows As Integer = TextBox1.Text
Dim triWidth As Integer = (NumRows * 2) - 1
Dim SpaceOnSide As Integer = 0
Dim SpaceInMiddle As Integer = 0
Dim Blank As String = " "
Dim Border As String = "*"
For i = 1 To NumRows
' space on left side
SpaceOnSide = ((triWidth - ((i * 2) - 1))) / 2
For j = 1 To SpaceOnSide
OutPut(Blank)
Next
OutPut(Border)
'SpaceInMiddle = triWidth - (SpaceOnSide * 2) - 2 ' - 1 for border
SpaceInMiddle = (i * 2) - 1 - 2 ' - 2 for border
For j = 1 To SpaceInMiddle
If i = NumRows Then
OutPut(Border)
Else
OutPut(Blank)
End If
Next
If i > 1 Then
OutPut(Border)
End If
Debug.WriteLine("")
Next
End Sub
Sub OutPut(s As String)
Debug.Write(s)
End Sub
和我们的输出(立即 window - 我有工具 [x] 发送所有输出
但是,让我们更改代码以将“*”放入其中,我们得到:
For j = 1 To SpaceInMiddle
If i = NumRows Then
OutPut(Border)
Else
OutPut(Border)
End If
Next
所以我们现在得到这个:
前面的结果也显示了。
好的,但是输出到控制台或绿屏“文本”有点问题。一个问题是,如果我们要制作一个三角形,我们实际上需要“一半”的间距来将线放在下面。
但是,这就是网络变得多么酷的地方。
首先,我们不局限于输出“*”。我们可以输出图像,或任何我们想要的东西!!!
所以,让我们 google - 为此找一个可爱的“球”或“球体”。
我们将用两张图片替换“*”和“”(空白)。
一个用于空白(白色方块),一个用于“*”
所以,我只是将这两个方块放在我的内容文件夹中
让我们加入一个“div”来显示“*”或现在的球。
我们本可以放入一个文本框,并使用固定的“控制台”类型字体。但是,这是网络。
所以,让我们看一下上面的代码 -(很复杂 - 但我们会在一分钟内解决)。
请注意我是如何使用一个名为“输出”的例程的。我这样做是因为我们现在可以将该输出更改为浏览器。
所以,我们的标记现在是这样的:
<div id="mydiv" runat="server">
</div>
我们只是放入一个“东西”或我们想要将结果放入的地方。
现在,我们要代替“*”输出图片到 div。
所以,我们复杂的代码现在是这样的:
Dim Blank As String = GetFileAsPicture("w.jpg") ' white sqaure block
Dim Border As String = GetFileAsPicture("r2.jpg") ' round ball
For i = 1 To NumRows
' space on left side
SpaceOnSide = ((triWidth - ((i * 2) - 1))) / 2
For j = 1 To SpaceOnSide
OutPut(Blank)
Next
OutPut(Border)
'SpaceInMiddle = triWidth - (SpaceOnSide * 2) - 2 ' - 1 for border
SpaceInMiddle = (i * 2) - 1 - 2 ' - 2 for border
For j = 1 To SpaceInMiddle
If i = NumRows Then
OutPut(Border)
Else
OutPut(Border)
End If
Next
If i > 1 Then
OutPut(Border)
End If
OutPut("<br/>") ' start a new line
Next
而 GetFileAsPicture 是这样的:
Function GetFileAsPicture(sFile As String) As String
' get a picture from our Content folder,
' return as picture HTML "image" mark-up
Return "<img src=""" & "../Content/" & sFile & """ />"
End Function
所以,现在当我们 运行 这个时,我们得到这个:
请注意,输出“球”代替“*”真的不需要很多额外工作。
但是,我们在上面仍然固定 font/image 大小。所以真的,这不是我们想要的三角形,因为每个球都排在上面一行的下方。
但是,就像使用文字处理器一样,我们可以转储所有复杂的代码以显示在那些空白处(现在是白色图像),并让“div”为我们的内容居中.
所以我们的 div 将完成添加所有这些额外空白的工作 - 我们只输出球
我们的 div 现在变成了这样:
<div id="mydiv" runat="server" style="text-align:center">
</div>
所以,我们的代码现在变得非常简单。
Dim Blank As String = GetFileAsPicture("W.jpg") ' white sqaure block
Dim Border As String = GetFileAsPicture("r2.jpg") ' round ball
For i = 1 To NumRows
For j = 1 To j + 1
OutPut(Border)
Next
OutPut("<br/>") ' start a new line
Next
我们现在得到这个:(它和以前一样 - 但没有中心代码!!!)
但是,我们不再像绿色控制台那样固定字体或固定大小了,是吗?
所以,我们不关心半间距。所以,我们的代码现在可以每行再添加一个球——它仍然会居中。
所以,我们现在有这个:
Dim Blank As String = GetFileAsPicture("W.jpg") ' white sqaure block
Dim Border As String = GetFileAsPicture("r2.jpg") ' round ball
For i = 1 To NumRows
For j = 1 To i
OutPut(Border)
Next
OutPut("<br/>") ' start a new line
Next
现在我们明白了:
因此,就像使用文字处理器一样 - 文本居中,我们不限于固定宽度,例如控制台或绿屏。
所以,我们说请居中。并且球的宽度是固定的(每个球),但是当我们说请将上下文居中放置在“div”时,浏览器会为我们做这件事——这甚至意味着一半的间距,或者实际上是一样多根据需要。
因此,我们甚至不必将球排成一行(就像我们使用固定文本和绿屏控制台那样)。
所以,我现在的代码是这样的:
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim i, j As Integer
Dim NumRows As Integer = TextBox1.Text
Dim Border As String = GetFileAsPicture("r2.jpg") ' round ball
For i = 1 To NumRows
For j = 1 To i
OutPut(Border)
Next
OutPut("<br/>") ' start a new line
Next
End Sub
Sub OutPut(s As String)
Me.mydiv.InnerHtml &= s
End Sub
Function GetFileAsPicture(sFile As String) As String
' get a picture from our Content folder,
' return as picture HTML "image" mark-up
Return "<img src=""" & "../Content/" & sFile & """ />"
End Function
所以,使用 windows 剪切实用程序,从上面抓住我的一个球,然后使用它。