Java入门必做题:用星星*打印图形(练习循环结构)包教包会!

前言

每当入门一种编程语言,我们往往都会碰到:给你一个图形,让你编程实现打印出该图形。这种打印图形的题,很适合新手用来入门/练手,通过练习该类型题目,我们可以巩固流程控制方面的知识,如:分支结构、循环结构。

本人最近在重温Java语法,做了不少打印图形的题目,总结出了经验,如果你在做这类题目的时候感到吃力,不妨看看本篇教程来梳理梳理思路,看懂以下题目的解法并且自己上手敲一遍,你之后遇到任何打印图形题都会迎刃而解的!

如果你是计算机科学/软件工程专业的新生小盆友,作为过来人的我告诉你,这种题在作业里必出现,期中/期末考试考到的几率也很大!
记在小本本上

打印图形

方法概述

  • 你要知道:这些图形是由星号(*)、空格等符号组成的,从上到下、从左至右地打印符号,就形成了一个图形。
  • 重复地打印符号,我们就要用到循环结构,由于是从上到下、从左至右,我们要用嵌套的循环结构。
  • 从上到下地打印符号,即一行一行地打印,对应了外层循环,外循环变量控制行数。
  • 每一行,从左至右地打印若干个符号,对应了内层循环,内循环变量控制每行打印的符号数量。
  • 这些图形往往是规则的,即每行的符号数量行序号线性关系,即内循环变量与外循环变量成线性关系。
  • 如何得出线性关系?有时候一眼就看得出来,看不出来的话,就列个二元一次方程组(y=kx+b,已知2组(x,y),求k和b)。

打印长方形

我们先来看个最简单的!题目:编程打印出如图所示的图形。
打印长方形
我们来分析一下,这是一个5行7列的长方形,打印过程:打印了5行,每一行都打印了7次星星(*)。

  • 外循环变量i控制行数,一共有5行,所以外循环for (int i=1;i<=5;i++) 。
  • 内循环变量j控制每行打印符号的次数,每行打印7次符号,所以内循环for (int j=1;j<=7;j++) 。
  • 每行该打印多少个符号(内循环变量j的判断条件j<=7),是可以一眼看出来的,不需要分析外循环变量i和内循环变量j的关系。实际上,它们之间也可以看作存在线性关系,将i和j的取值都罗列出来:
    i=1 2 3 4 5
    j=7 7 7 7 7
    可得出:j=0*i+7=7。
// 外循环变量i控制行数,一共有5行
for (int i=1;i<=5;i++) {
	//内循环变量j控制每行打印符号的次数,每行打印7次符号
	for (int j=1;j<=7;j++) {
		//打印*
		System.out.print("*");
	}
	//每打印完一行的符号,需要换行,以进行下一行的打印
	System.out.println();
}

打印直角三角形

难度一点一点增加啰!题目:编程打印出如图所示的图形。

打印直角三角形
我们来分析一下,这是一个直角三角形,打印过程:打印了5行,每一行打印的星星(*)次数分别为:1,2,3,4,5。

  • 外循环变量i控制行数,一共有5行,所以外循环for (int i=1;i<=5;i++) 。
  • 内循环变量j控制每行打印符号的次数,每行打印符号的次数是随行数而变化的,所以我们要寻找j和i之间的关系,将i和j的取值都罗列出来:
    i=1 2 3 4 5
    j=1 2 3 4 5
    可得出j和i之间的线性关系:j=i,即第i行要打印j=i个符号。
    所以内循环for(int j=1;j<=i;j++)。
// 外循环变量i控制行数,一共有5行
for(int i=1;i<=5;i++) {
	//内循环变量j控制每行打印符号的次数,第i行打印j=i次符号
	for(int j=1;j<=i;j++) {
		//打印*
		System.out.print("*");
	}
	//每打印完一行的符号,需要换行,以进行下一行的打印
	System.out.println();
}

打印倒着的直角三角形

看一下上道题的变体。题目:编程打印出如图所示的图形。
打印倒着的直角三角形
我们来分析一下,这是一个倒着的直角三角形,打印过程:打印了5行,每一行打印的星星(*)次数分别为:5,4,3,2,1。

  • 外循环变量i控制行数,一共有5行,所以外循环for (int i=1;i<=5;i++) 。
  • 内循环变量j控制每行打印符号的次数,每行打印符号的次数是随行数而变化的,所以我们要寻找j和i之间的关系,将i和j的取值都罗列出来:
    i=1 2 3 4 5
    j=5 4 3 2 1
    可得出j和i之间的线性关系:j=6-i,即第i行要打印j=6-i个符号。
    所以内循环for(int j=1;j<=6-i;j++)。
// 外循环变量i控制行数,一共有5行
for(int i=1;i<=5;i++) {
	//内循环变量j控制每行打印符号的次数,第i行打印j=6-i次符号
	for(int j=1;j<=6-i;j++) {
		//打印*
		System.out.print("*");
	}
	//每打印完一行的符号,需要换行,以进行下一行的打印
	System.out.println();
}

打印等腰三角形

题目:编程打印出如图所示的图形。
打印等腰三角形

注意:这道题的符号不只有星星(*)了,还有空格,空格也是一种符号,需要打印出来喔,我们把空格替换成杠(-),看起来就是这样的:
打印等腰三角形,空格被替换
我们来分析一下,这是一个等腰三角形,打印过程:打印了5行,每一行先打印空格,再打印星星,每行的空格个数分别为:4,3,2,1,0;每行的星星个数分别为:1,3,5,7,9。

  • 外循环变量i控制行数,一共有5行,所以外循环for (int i=1;i<=5;i++) 。
  • 由于每行会打印2种不同的符号,所以要设置2个内循环变量:j和k。
  • 内循环变量k控制每行打印空格的次数,每行打印空格的次数是随行数而变化的,所以我们要寻找k和i之间的关系,将i和k的取值都罗列出来:
    i=1 2 3 4 5
    k=4 3 2 1 0
    可得出k和i之间的线性关系:k=5-i,即第i行要打印k=5-i个空格。
    所以第一个内循环for(int k=1;k<=5-i;k++)。
  • 内循环变量j控制每行打印星星的次数,每行打印星星的次数是随行数而变化的,所以我们要寻找j和i之间的关系,将i和j的取值都罗列出来:
    i=1 2 3 4 5
    j=1 3 5 7 9
    j和i的关系似乎难以一眼看出来,我们列个二元一次方程组,设j=a * i+b,代入(1,1)和(2,3)得到方程组:
    1=a+b
    3=2*a+b
    解得a=2,b=-1。
    可得出j和i之间的线性关系:j=2 * i-1,即第i行要打印j=2 * i-1个星星。
    所以第二个内循环for(int j=1;j<=2 * i-1;j++)。
// 外循环变量i控制行数,一共有5行
for(int i=1;i<=5;i++) {
	//内循环变量k控制每行打印空格的次数,第i行打印k=5-i次空格
	for(int k=1;k<=5-i;k++) {
		System.out.print(" ");
	}
	//内循环变量j控制每行打印星星的次数,第i行打印j=2*i-1次星星
	for(int j=1;j<=2*i-1;j++) {
		System.out.print("*");
	}
	//每打印完一行的符号,需要换行,以进行下一行的打印
	System.out.println();
}

打印实心的菱形

题目:编程打印出如图所示的图形。

打印实心的菱形
该菱形可以看作由两部分组成,上半部分是一个正立的等腰三角形(高度为4行),下半部分是一个倒立的等腰三角形(高度为3行),先打印上半部分,再打印下半部分。
我们已经介绍过如果打印正立的等腰三角形,所以不再对打印菱形的上半部分进行讲解,将上一节的代码稍加修改即可。
现在我们来对菱形的下半部分进行分析:

  • 外循环变量i控制行数,一共有3行,所以外循环for (int i=1;i<=3;i++) 。
  • 由于每行会打印2种不同的符号,所以要设置2个内循环变量:j和k。
  • 内循环变量k控制每行打印空格的次数,每行打印空格的次数是随行数而变化的,所以我们要寻找k和i之间的关系,将i和k的取值都罗列出来:
    i=1 2 3
    k=1 2 3
    可得出k和i之间的线性关系:k=i,即第i行要打印k=i个空格。
    所以第一个内循环for(int k=1;k<=i;k++)。
  • 内循环变量j控制每行打印星星的次数,每行打印星星的次数是随行数而变化的,所以我们要寻找j和i之间的关系,将i和j的取值都罗列出来:
    i=1 2 3
    j=5 3 1
    j和i的关系似乎难以一眼看出来,我们列个二元一次方程组,设j=a * i+b,代入(1,5)和(2,3)得到方程组:
    5=1a+b
    3=2
    a+b
    解得a=-2,b=7。
    可得出j和i之间的线性关系:j=-2 * i+7,即第i行要打印j=-2 * i+7个星星。
    所以第二个内循环for(int j=1;j<=-2 * i+7;j++)。
//打印上半部分
for(int i=1;i<=4;i++) {
	for(int k=1;k<=4-i;k++) {
		System.out.print(" ");
	}
	for(int j=1;j<=2*i-1;j++) {
		System.out.print("*");
	}
	System.out.println();
}
//打印下半部分
for(int i=1;i<=3;i++) {
	for(int k=1;k<=i;k++) {
		System.out.print(" ");
	}
	for(int j=1;j<=-2*i+7;j++) {
		System.out.print("*");
	}
	System.out.println();
}

打印空心的菱形

这是上一道题的变体。题目:编程打印出如图所示的图形。
打印空心的菱形
如果你还没有看上一节:打印实心的菱形,请先看上一节的讲解。
空心的菱形,就是把实心的菱形掏空,在打印实心菱形时,每一行会打印若干个连续的星星,如果只打印这些连续星星的首尾2个(如果本来就只有1个星星,那就打印这1个星星),不就把这个菱形掏空了吗?

//打印上半部分
for(int i=1;i<=4;i++) {
	for(int k=1;k<=4-i;k++) {
		System.out.print(" ");
	}
	for(int j=1;j<=2*i-1;j++) {
		//如果位于首尾位置,则打印成*,否则打印成空格
		if(j==1||j==2*i-1) {
			System.out.print("*");
		}else {
			System.out.print(" ");
		}
	}
	System.out.println();
}
//打印下半部分
for(int i=1;i<=3;i++) {
	for(int k=1;k<=i;k++) {
		System.out.print(" ");
	}
	for(int j=1;j<=-2*i+7;j++) {
		//如果位于首尾位置,则打印成*,否则打印成空格
		if(j==1||j==-2*i+7) {
			System.out.print("*");
		}else {
			System.out.print(" ");
		}
	}
	System.out.println();
}

总结

  • 空格也是一种字符,需要打印出来的。
  • 复合式的图形要进行拆分,比如菱形的上半部分是正立的等腰三角形,下半部分是倒立的等腰三角形。
  • 空心的图形,是将实心的图形掏空,即每行只打印首尾符号,将实心图形的代码稍加改动即可。
  • 用嵌套的循环结构打印图形,外循环变量控制行数,内循环变量控制每行打印的符号个数。
  • 罗列出外循环变量的取值,以及内循环变量的取值,寻找两者之间的线性关系,该线性关系是内循环变量的判断条件。
  • 如果一行打印的符号种类有多种,则内循环变量就有多个。

看完以上讲解,并且将以上题目的代码自己敲一遍,你就完全掌握了打印图形题目的做法!以后遇到类似题目,都会迎刃而解哒!

记得收藏本篇教程,方便以后参考喔~博主之后会po更多优质教程的,让我们一起进步⑧!
爱Java

  • 29
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值