今天突然想到了自己对for循环的理解,因为之前老师讲过九九乘法表的打印方法,自己却还没真的那么做过,就想着要做一下,顺便就把打印图形再复习一遍。
首先是打印一个九九乘法表
package demo0124;
/**
* 一个九九乘法表
*
* @author Feng 2018年1月24日下午12:24:15
*/
public class ChengFaTable {
public static void main(String[] args) {
// TODO 自动生成的方法存根
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + i * j + "\t");
}
System.out.println();
}
}
}
结果如图示:
接下来就是图形的问题了
关于这个,我把几乎所有的认识都放在了注释里边,觉得那样容易理解些。
package d;
public class Demo01 {
public static void main(String[] args) {
/**
* 用* 打印出图形,使用for 循环嵌套来实现。
* 有直角三角形,等腰三角形,菱形,平行四边形。
*
* 首先来分析:
*1、 for 循环嵌套时,有内层循环和外层循环,首先一定得明白,外层执行一次,内层执行一遍。
*2、程序中打印字符是一行一行打印的。也就是需要在换行的地方多思考
*3、*****
* ****
* ***
* **
* *
* 这个图形的形成是怎样的,我们可以很明显就能看出来,第一行有5个* ,然后换行,再到第二行,*是少了一个的。
* 可以把外层看做是 行数,而内层循环是列数,每一行的列数。
* 这样就能好理解一些了。因为第3、4、5行都是逐层递减的。也就是内层的循环次数是在外层循环每执行一次的时候就减少一次。
* 我们可以先确定行数,以上边这个直角三角形为例,它是外层循环5次,内层循环5次,只是内层每执行一次打印的*就少一个。
* @author Feng
* 2018年1月24日下午12:06:36
*/
//直角三角形方法1
for (int i = 0; i < 5; i++) {//用 i 来表示行数,外层是循环5次。
//每打印完一行的*之后,换行并且i+1换到下一行,这里的j<5-i就表示在i从0到4递增的同时,j是从5到1的递减的
//所以就能出现第一行5个*,第2行4个*,第三行3个*,一直到第5行是1个*,组合起来就刚好是一个直角三角形了。
for (int j = 0; j < 5-i; j++) {//用j 来表示列数,内层也是5次。
System.out.print("*");//在第i行打印*,*的个数由j确定。
}
System.out.println();//当内层循环完一圈之后,就换行,第一次是5个*就换行。
}
//直角三角形方法2
for (int i = 0; i < 5; i++) {
for (int j = i; j < 5; j++) {
System.out.print("*");
}
System.out.println();
}
//尖朝上的直角三角形
System.out.println("======================================");
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
System.out.println("======================================");
//平行四边形,由尖朝上的直角三角形,空白的(我这里用2表示,当输出是" "的时候就能看出是个矩形,不过斜着来了一刀,也是尖朝下的。)
//所以平行四边形是由3部分组成的,3个三角形,一个是空格组成的三角形
/**
* *
* **
* ***
* ****
* *****
* 2****
* 22***
* 222**
* 2222*
* 22222
*
* 分析一下:平行四边形,用1个四行四列得到三角形在底下,5行5列的在上边
* 这里的2是打印的空格的地方,其实就是上边那个尖朝上的三角形了。
*/
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
for (int i = 0; i < 5; i++) {//同样是外循环5次
for (int j = 0; j <= i; j++) {//随着i的增加,j是从0到4的。
System.out.print("2");//5行5列的空白。
}
for (int j = 0; j < (4 - i); j++) {//随着i从0到4的增加,j是从0到3的增加。
System.out.print("*");//4行4列的*。
}
System.out.println();
}
System.out.println("======================================");
//倒等腰三角
/**
* *******
* *****
* ***
* *
*
* 同样是先打印个尖向上的空白三角形
*/
for(int i = 0; i < 4 ; i++){//4行
for(int j =0 ;j <= i; j++){//4列
System.out.print("5");//空白区域是4行4列的三角形
}
for(int k = 0 ;k < (3-i)*2+1 ;k++){//随着i的增加,k的变化是 6+1,4+1,2+1,0+1
//也就是说,第一行除了打印了1个空白之外,还有7个*,第二行是5个*,依次类推。
System.out.print("*");
}
System.out.println();
}
System.out.println("======================================");
//正等腰三角
for(int i = 0; i < 4 ; i++){
for(int j =0 ; j < 4-i;j ++ ){
System.out.print(" ");
}
System.out.print("*");
for(int k = 0 ;k <i*2;k++){
System.out.print("*");
}
System.out.println();
}
System.out.println("======================================");
//菱形的笨蛋方法
//直接用2个等腰三角形拼起来。
for(int i = 0; i < 4 ; i++){
for(int j =0 ; j < 4-i;j ++ ){
System.out.print(" ");
}
for(int k = 0 ;k <i*2+1;k++){
System.out.print("*");
}
System.out.println();
}
for(int i = 0; i < 4 ; i++){
for(int j =0 ;j <= i+1; j++){
System.out.print(" ");
}
for(int k = 0 ;k <(7-2*i) ;k++){//把倒的等腰三角放在正的等腰三角形下边。
System.out.print("*");
}
System.out.println();
}
System.out.println("======================================");
//可以看到,直接拼是不行的,这样只能得到一个平行四边形。还得调整一下条件。
for(int i = 0; i < 4 ; i++){
for(int j =0 ; j < 4-i;j ++ ){
System.out.print(" ");
}
for(int k = 0 ;k <i*2+1;k++){
System.out.print("*");
}
System.out.println();
}
for(int i = 0; i < 4 ; i++){
for(int j =0 ;j <= i+1; j++){
System.out.print(" ");
}
for(int k = 0 ;k <(5-2*i) ;k++){//把倒的等腰三角放在正的等腰三角形下边。
//这时的k变化是:4,3,1,所以就有下边那个3行的三角形。
System.out.print("*");
}
System.out.println();
}
}
}
对了,差点忘记附上截图了。
还有就是
打印输入行数的等腰三角形和菱形
/**
* 等腰三角形
* 输入行数,然后打印所输入行数的三角形。
*
* 思考:
* 8888888
* 888888*
* 88888***
* 8888*****
* 888*******
* 88*********
* 8***********
*
* 这里的8,到时候就是空白区域
*
*
*/
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.println("请输入你所需要打印的三角形的行数:");
int row1 = input.nextInt();//行数
for(int i = 0; i < row1+1 ;i++){//外层循环控制行数
for(int k = row1+1 -i ;k >0 ;k--){//6行就是7行空白,当i等于0的时候,k是行数,而且每次换行之后就把空白个数减去1。
System.out.print("8");
}
for(int j = 1; j <= 2*i-1 ;j++){//当i等于0,j是小于等于
System.out.print("*");
}
System.out.println();
}
System.out.println("===============================");
//打印输入行数的菱形
//将打印输入行数的三角形修改一下。
System.out.println("请输入你要打印的菱形的行数:");
//这里用的是上半个三角形的行数。
@SuppressWarnings("unused")
int row2 = input.nextInt();
//上边部分是将打印三角形的代码拷贝一下。
//可以看到,菱形如果是两个三角形兑着的话,就是奇数行。
/**
* 8***************
* 88*************
* 888***********
* 8888*********
* 88888*******
* 888888*****
* 8888888***
* 88888888*
* 888888888
*
* 还有可能要将这下边的最上面一行去掉。
*/
if(row2%2!=0){
for(int i = 0; i < (row2/2)+1+1 ;i++){//外层循环控制行数
for(int k = row2/2+2 -i ;k >0 ;k--){
System.out.print("8");
}
for(int j = 1; j <= 2*i-1 ;j++){
System.out.print("*");
}
System.out.println();
}
for(int i =0;i < row2/2+1;i++){
for(int k = 0;k <= i+1;k++){//i从0开始,row2是行数,k是打印空白的列数
System.out.print("9");
}
for (int j = 0; j <= (row2/2+1-i)*2-4 ; j++) {
System.out.print("*");
}
System.out.println();
}
}else{
System.out.println("菱形行数不能为偶数!");
System.out.println("正在退出");
System.exit(0);
}
行啦,我的砖就抛到这儿了,哪位帅哥靓妹有好的想法可以交流哦~
记得留言哦。
这最后的图是我修改之前的打印菱形,它的缺点是输入的是菱形上半边的比较大的那个三角形的行数。并不是菱形的行数,所以试了老半天,最后出现的结果就是把这个行数除以2加上1,这样算的就是菱形的行数了。基本就是照着倒三角形的模样修修改改,主要改的就是条件了,其他地方仍然拿来用就行。