图案打印: 记法与解释器


      童鞋们应该对“打印星形图案”的编程题记忆犹新吧? 那就像我们的编程童年一样的美好。 打印边长为 n 个菱形, HO, 有的人立马就刷刷刷写出来了:

      

package patterns.interpretation;

public class FigurePrinting {
	
	/**
	 * 根据给定 n 值打印菱形图案
	 * @param n 菱形的边数
	 */
	public void printDiamond(int n)
	{
		if (n < 2) {
			throw new IllegalArgumentException("参数 n = " + n + " 错误, 给定参数必须不小于 2!");
		}
		int midRow = n-1; 
		for (int row = 0; row <= midRow; row++) {
			printLine(new int[] { midRow-row , midRow+row}, 2*n-1, '*');
		}
		for (int row = midRow+1; row < 2*n-1; row++) { // 对称性: row = midRow+i 与 row = midRow-i 的图案是一样的
			printLine(new int[] { row - midRow, midRow + (2*midRow - row)}, 2*n-1, '*');
		}
	}

	/**
	 * printLine: 在指定的若干位置上,打印符号; 不打印符号的位置打印空格
	 * @param indexes 指定要打印符号 symbol 的位置数组
	 * @param n 一行总共要打印的字符数
	 * @param symbol 要打印出的符号
	 */
	public void printLine(int[] indexes, int n, char symbol)
	{
		if (indexes == null || indexes.length == 0) { // 如果位置数组为空,则直接换行
			System.out.println();
			return ;
		}
		if (n < indexes.length) {
			throw new IllegalArgumentException("要打印的符号数超过一行的总字符数!");
		}
		int k = 0;
		for (int i=0; i < n; i++) 
		{
			if (i != indexes[k]) {
				System.out.printf("%c", ' ');
			}
			else {
				System.out.printf("%c", symbol);
				k++;
				if (k == indexes.length) { 
					for (i = indexes[k-1]; i < n; i++) {
						System.out.printf("%c", ' &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值