用C#编写一个程序,用显示如下数字金字塔

qq_33126873 2015-11-28 01:24:00
要求:能够按照实例规格打印数字三角形,输入框能够根据KeyPress事件响应数字三角形高度,并要求输入的数字满足1-18的范围


...全文
1815 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

Text中亲测对齐,不需要GDI+,就只是将8L代码的Console.Write换成了StringBuilder
caojinrong 2015-11-30
  • 打赏
  • 举报
回复
楼上的,不要误导新朋友,奇数行中间的数刚好居中,通过TextBox是无论如何都达不到效果的,只有通过Graphics直接画才行
完整的代码:
    public class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void txtLevel_TextChanged(object sender, EventArgs e)
{
int rowHeight = (int)(pnlDisplay.Font.Size * 4 / 3 * 1.3); //1.3倍行距,字体大小(磅)与像素的关系为3/4

Graphics g = pnlDisplay.CreateGraphics();
Brush brush = new SolidBrush(Color.Black);
g.Clear(pnlDisplay.BackColor); //清除原有图像

int level;
//判断是否为数字,且介于1-18之间
if (int.TryParse(txtLevel.Text, out level) && level > 0 && level < 19)
{
//循环处理每行
for (int i = 0; i < level; i++)
{
//获取每行文本
StringBuilder line = new StringBuilder();
for (int j = 0; j <= i; j++)
{
if (j != 0) line.Append(i < 9 ? " " : " ");
line.Append(i + 1);
}

g.DrawString(line.ToString(), pnlDisplay.Font, brush, (Width - TextRenderer.MeasureText(line.ToString(), pnlDisplay.Font).Width) / 2, rowHeight * i);
}
}
g.Dispose();
}

#region Windows 窗体设计器生成的代码

/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.panel1 = new System.Windows.Forms.Panel();
this.txtLevel = new System.Windows.Forms.TextBox();
this.pnlDisplay = new System.Windows.Forms.Panel();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.txtLevel);
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(384, 78);
this.panel1.TabIndex = 0;
//
// txtLevel
//
this.txtLevel.Location = new System.Drawing.Point(125, 42);
this.txtLevel.Name = "txtLevel";
this.txtLevel.Size = new System.Drawing.Size(100, 21);
this.txtLevel.TabIndex = 0;
this.txtLevel.TextChanged += new System.EventHandler(this.txtLevel_TextChanged);
//
// pnlDisplay
//
this.pnlDisplay.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.pnlDisplay.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlDisplay.Location = new System.Drawing.Point(0, 78);
this.pnlDisplay.Name = "pnlDisplay";
this.pnlDisplay.Size = new System.Drawing.Size(384, 284);
this.pnlDisplay.TabIndex = 1;
this.pnlDisplay.Resize += new System.EventHandler(this.txtLevel_TextChanged);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(384, 362);
this.Controls.Add(this.pnlDisplay);
this.Controls.Add(this.panel1);
this.Name = "Form1";
this.Text = "数字三角";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);

}

#endregion

private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.TextBox txtLevel;
private System.Windows.Forms.Panel pnlDisplay;
}
angel6709 2015-11-30
  • 打赏
  • 举报
回复
作业还是自己做的好。
  • 打赏
  • 举报
回复
为了使字母能够对齐,所以字母与字母之间要有一个空格,这样无论当偶数行时还是奇数行时,都可以正确的划分中间位 然后因为你显示的是数字,而不是一般显示的*号,所以这里在算长度时还需要长度纠正
int value = 18;
int maxValueLength = value.ToString().Length;
string space = string.Empty.PadLeft(maxValueLength);
for (var i = 1; i <= value; i++)
{
    var n = string.Join(space, Enumerable.Repeat(i.ToString().PadLeft(maxValueLength/*, '0'*/), i));
    Console.WriteLine(n.PadLeft((value + i) * maxValueLength));
}
秋的红果实 2015-11-30
  • 打赏
  • 举报
回复
2个18次循环,最简单的,空白用空格代替,找规律
zhanzhp 2015-11-30
  • 打赏
  • 举报
回复
引用 4 楼 qq_33126873 的回复:
求大神教一下思路,刚刚接触C#
作业要自己做
莫_问 2015-11-30
  • 打赏
  • 举报
回复
引用 8 楼 starfd 的回复:
为了使字母能够对齐,所以字母与字母之间要有一个空格,这样无论当偶数行时还是奇数行时,都可以正确的划分中间位 然后因为你显示的是数字,而不是一般显示的*号,所以这里在算长度时还需要长度纠正
int value = 18;
int maxValueLength = value.ToString().Length;
string space = string.Empty.PadLeft(maxValueLength);
for (var i = 1; i <= value; i++)
{
    var n = string.Join(space, Enumerable.Repeat(i.ToString().PadLeft(maxValueLength/*, '0'*/), i));
    Console.WriteLine(n.PadLeft((value + i) * maxValueLength));
}
狗屎版主,带坏学生
csdnFUCKINGSUCKS 2015-11-30
  • 打赏
  • 举报
回复
引用 4 楼 qq_33126873 的回复:
求大神教一下思路,刚刚接触C#
两层循环
qq_33126873 2015-11-30
  • 打赏
  • 举报
回复
非常感谢............................
crystal_lz 2015-11-30
  • 打赏
  • 举报
回复
引用 10 楼 caojinrong 的回复:
楼上的,不要误导新朋友,奇数行中间的数刚好居中,通过TextBox是无论如何都达不到效果的,只有通过Graphics直接画才行
你这才是误导。。。我是不知道 你是什么样的思维 导致的 通过TextBox是无论如何都达不到效果的,只有通过Graphics直接画才行
xuzuning 2015-11-30
  • 打赏
  • 举报
回复
没有那么复杂,使用 RichTextBox 可轻松搞定
窗体中拖入一个 TextBox (textBox1),一个 RichTextBox (richTextBox1)
设置 textBox1 的 TextChanged 事件
        private void textBox1_TextChanged(object sender, EventArgs e)
{
richTextBox1.Clear();
if (textBox1.Text == string.Empty) return;
var n = Convert.ToInt32(textBox1.Text);

for (var i = 1; i <= n; i++)
{
for (var j = 0; j < i; j++)
{
if(i<10) richTextBox1.AppendText(String.Format("{0,2} ", i));
else richTextBox1.AppendText(String.Format(" {0,2}", i));
}
richTextBox1.AppendText(Environment.NewLine);
}
richTextBox1.SelectAll();
richTextBox1.SelectionAlignment = HorizontalAlignment.Center;
}


学生就是要学会综合利用已知的知识
qq_33126873 2015-11-28
  • 打赏
  • 举报
回复
求大神教一下思路,刚刚接触C#
yygyjgmhje1987 2015-11-28
  • 打赏
  • 举报
回复
18个 ,switch
Poopaye 2015-11-28
  • 打赏
  • 举报
回复
作业要自己做

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧