打印一个N*N的方阵,N为每边字符的个数,要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,...
例子:当N =5,打印出下面的图形:
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X
用c#写
核心就一句话“textBox1.Text += data[Math.Min(Math.Min(i, (n - 1 - i)), Math.Min(j, (n - 1 - j)))];”
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "";//由于是用C#写的,所以这里是清空字符框
int n = Convert.ToInt16(textBox2.Text);//获取需要打印的层数
char[] data = { 'x', 'y', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };//设置需要打印的字符
for (int i = 0; i < n; i++)//列向递增
{
for (int j = 0; j < n; j++)//行向递增
{
textBox1.Text += data[Math.Min(Math.Min(i, (n - 1 - i)), Math.Min(j, (n - 1 - j)))];
//核心的循环语句,嵌套了两层最小选择,
//当i递增时,Math.Min(i, (n - 1 - i))的输出是0,1,2..n/2,n/2-1,n/2-2...2,1,0
//当j递增时,Math.Min(j, (n - 1 - j))的输出是0,1,2..n/2,n/2-1,n/2-2...2,1,0
//然后在把它们两个套一起,选最小,就会得到一下结果
//第一行最小就一直是0
//第二行i是1,j会一直变化,因为是选最小,所以只有第一个数和最后一个数j=0的时候选j,其它时候都是i最小,得到结果是:0,1,1...1,1,0
//以此类推
}
textBox1.Text += "\r\n";//打印完一行后,换行
}
}
这里面的textBox1.Text就相当于要打印的输出,只不过我这边是用C#写的,
textBox1.Text += data[Math.Min(Math.Min(i, (n - 1 - i)), Math.Min(j, (n - 1 - j)))];
也可以写成printf("%c",data[Math.Min(Math.Min(i, (n - 1 - i)), Math.Min(j, (n - 1 - j)))]);
数组data是要打印的符号,n是符号的数量,程序里面有两个嵌套的循环,相当于执行这个打印语句n*n次
如果不是用C#编程,或者没有相应的库,可以加入下面这个宏定义,选择最小值 #define _min(a,b) (((a) < (b)) ? (a) : (b))
然后Math.Min换为_min
用c写
#define _min(a,b) (((a) < (b)) ? (a) : (b)) //选择最小数的宏
void main (void)
{
n=10;//想打印的层数
char[] data = { 'x', 'y', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g' , 'h' };//设置需要打印的字符
for (int i = 0; i < n; i++)//列向递增
{
for (int j = 0; j < n; j++)//行向递增
{
printf("%c",data[_min(_min(i, (n - 1 - i)), _min(j, (n - 1 - j)))]);
//核心的循环语句,嵌套了两层最小选择,
//当i递增时,_min(i, (n - 1 - i))的输出是0,1,2..n/2,n/2-1,n/2-2...2,1,0
//当j递增时,_min(j, (n - 1 - j))的输出是0,1,2..n/2,n/2-1,n/2-2...2,1,0
//然后在把它们两个套一起,选最小,就会得到一下结果
//第一行最小就一直是0
//第二行i是1,j会一直变化,因为是选最小,所以只有第一个数和最后一个数j=0的时候选j,其它时候都是i最小,得到结果是:0,1,1...1,1,0
//以此类推
}
printf("\n");//打印完一行后,换行
}
}