如何在 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 剪切实用程序,从上面抓住我的一个球,然后使用它。