Java07嵌套循环和方法

嵌套循环和方法

1.嵌套循环

【说明】在后期的编写代码过程中,一些算法中,都会使用到嵌套循环,所以为了更进一步的理解循环嵌套之后的操作,通过以下练习题作为循序渐进的练习过程。其中,重点是需要学会推导过程。

1.1 入门
/*				L		*
	*****		1		5
	*****		2		5
	*****		3		5
	*****		4		5
	*****		5		5
*/

class Demo1 {
	public static void main(String[] args) {
		/* 方法一 */
		System.out.print("*****");
		System.out.print("*****");
		System.out.print("*****");
		System.out.print("*****");
		System.out.print("*****");
		
		System.out.print("========================");
		/* 方法二 */
		//需要显示5行数据
		for (int i = 1; i <= 5; i++) {
			System.out.print("*****");
		}
		
		System.out.print("========================");
		
		/*
		方法三		复用度提升
		*/
		int line = 20;
		// 外层循环控制总行数
		for (int i = 1; i <= line; i++) {
			// 星星个数 = 最大行号
			for (int j = 1; j <= line; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
}
1.2 再入门
/*
    *
    **
    ***
    ****
    *****
    ******
*/
class Demo2 {
	public static void main(String[] args) {
		int line = 10;
		//外层循环总计控制6行
		for (int i = 1; i <= line; i++) {
			//每一行星星个数 == 行号
			for (int j = 1; j <= i; j++) {
				System.out.print('*');
			}
			System.out.println();
		}
	}
}
1.3 再再入门
/*			L  _  *
		*   1  4  1
	   **   2  3  2
	  ***   3  2  3
	 ****   4  1  4
	*****   5  0  5
			_下划线表示空格
			
			_ = 总行数 - 当前行号;
			* = 当前行号
*/
class Demo3 {
	public static void main(String[] args) {
		int line = 30;
		// 外层循环控制总行数
		for (int i = 1; i <= line; i++) {
			// 内层循环1: 控制空格的个数
			for (int j = 1; j <= line - i; j++) {
				System.out.print(' ');
			}
			
			// 内层循环2: 控制星星的个数
			for (int k = 1; k <= i; k++) {
				System.out.print('*');
			}
			
			System.out.println();
		}
	}
}
1.4 难度再增加一丢丢
/*              L  _  *  
     *          1  5  1
    ***         2  4  3
   *****        3  3  5
  *******       4  2  7
 *********      5  1  9 
***********     6  0  11
				
				_ = 总行数 - 当前行号;
				* = 2 * 当前行号 - 1;
*/
class Demo4 {
	public static void main(String[] args) {
		int line = 20;
		// 外层循环控制总行数,这里是6行
		for (int i = 1; i <= line; i++) {
			// 内层循环1:控制空格的个数
			for (int j = 1; j <= line - i; j++) {
				System.out.print(' ');
			}
			
			// 内层循环2:控制星星的个数 星星 = 2 * 当前行号 - 1;
			for (int k = 1; k <= 2 * i - 1; k++) {
				System.out.print('*');
			}
			
			System.out.println();
		}
	}
}
1.5 “再加一点佐料”
/*				L  _  字符 个数
      A         1  6   A   1
     BBB        2  5   B   3
    CCCCC       3  4   C   5
   DDDDDDD      4  3   D   7
  EEEEEEEEE     5  2   E   9 
 FFFFFFFFFFF    6  1   F   11 
GGGGGGGGGGGGG   7  0   G   13
				_个数 = 总行数 - 当前行号;
				字符个数 = 2 * 当前行号 - 1;
				字符本身的递增过程
*/
class Demo5 {
	public static void main(String[] args) {
		// 定义一个字符变量,变量初始化为字符'A'
		char ch = 'A';
		
		// 外层循环控制总行数,总行数7行
		for (int i = 1; i <= 26; i++) {
			// 内存循环1: 控制空格的个数
			for (int j = 1; j <= 26 - i; j++) {
				System.out.print(' ');
			}
			
			// 内存循环2: 控制字符个数
			for (int k = 1; k <= 2 * i - 1; k++) {
				System.out.print(ch);
			}
			
			System.out.println();
			
			// 字符变量需要在每一次展会完毕之后,进行自增
			ch += 1;
		}
	}
}
1.6 “再加点辣椒”
/*				L  _  *
     *			1  5  1	
    ***			2  4  3
   *****		3  3  5
  *******		4  2  7
 *********		5  1  9
***********		6  0  11

 *********      1  1  9
  *******       2  2  7 
   *****       	3  3  5
    ***			4  4  3
     * 			5  5  1
	 
				下半部分 第一行星星个数为9,如何计算得来
				凑!!!
				总行数5
					5 * 2 - (i * 2 - 1) --> 5 * 2 - i * 2 + 1 => (5 - i) * 2 + 1
					(5 - i) * 2 + 1
					10 - 1 = 9;
					10 - 3 = 7;
					10 - 5 = 5;
*/
class Demo6 {
	public static void main(String[] args) {
		// 菱形总行数 ,一旦是单数
		int line = 25;
		
		// 图形一分为二,上半部分为line / 2 + 1行
		// 外层循环控制总行数,这里是line / 2 + 1行
		for (int i = 1; i <= line / 2 + 1; i++) {
			// 内层循环1:控制空格的个数
			for (int j = 1; j <= line / 2 + 1 - i; j++) {
				System.out.print(' ');
			}
			
			// 内层循环2:控制星星的个数 星星 = 2 * 当前行号 - 1;
			for (int k = 1; k <= 2 * i - 1; k++) {
				System.out.print('*');
			}
			
			System.out.println();
		}
		
		// 下半部分一共line / 2行
		// 外层循环控制总行数,总计line / 2行
		for (int i = 1; i <= line / 2; i++) {
			// 内层循环1: 展示空格个数
			for (int j = 1; j <= i; j++) {
				System.out.print(' ');
			}
			
			// 内层循环2: 控制星星的个数
			for (int k = 1; k <= (line / 2 - i) * 2 + 1; k++) {
				System.out.print('*');
			}
			
			System.out.println();
		}
	}
}
1.7 思考题【麻辣】
/*
     A
    BBB
   CCCCC
  DDDDDDD
 EEEEEEEEE
FFFFFFFFFFF
 EEEEEEEEE
  DDDDDDD
   CCCCC
    BBB
     A
*/
1.8 思考题【重辣】
/*
     A
    ABA
   ABCBA
  ABCDCBA
 ABCDEDCBA
ABCDEFEDCBA
*/
1.9 思考题【魔鬼辣】
/*
     A
    ABA
   ABCBA
  ABCDCBA
 ABCDEDCBA
ABCDEFEDCBA
 ABCDEDCBA
  ABCDCBA
   ABCBA
    ABA
     A
*/

【说明】1.1~1.6要求学会 1.7~1.9拔高题,选做题

2.方法【重点】

2.1 为什么使用方法

(1)【引导思考】生活中使用的工具,如螺丝刀,锤子,扳手的优点。

  1. 复用
  2. 提高效率

(2)【方法使用的意义】

开发中,存在代码需要复用的情况,虽然循环可以解决一部分代码复用的问题,但是无法从根本上解决需要使用多处使用的情况。并且在代码中使用循环来解决复用的问题时侯,代码依旧存在代码冗余、维护性差、阅读性差的缺点,于是便需要用到方法。

2.2 比葫芦画瓢
//main 方法,Java中主方法格式
public static void main(String[] args) {
    //代码
}

【说明】

  1. public static :目前当作固定格式即可。后续会了解到。

  2. void :返回值类型。void表示当前方法没有返回值。(返回值类型:当前方法运行完成之后对方法外的一个返回数据)

  3. main :方法名。方法名是一个名字,要求符合命名规范——小驼峰命名法,见名知意,动宾结构。

  4. (形式参数列表) :当前方法运行所需要的外来数据,这里需要告知调用者数据类型。

  5. { } :方法体。

【方法格式】

/* 中文表述 */
public static 返回值类型 方法名(形式参数列表) {
    方法体
}
/* 英文表述 */
public static returnType methodName(Arguments) {
    Method Body
}
2.3 第一次自定义实现方法
  1. 需求:使用方法展示一个Hello world

  2. 方法分析:

(1)固定格式:public static

(2)返回值类型:这里不需要返回值类型,采用void

(3)方法名:printHellWorld (见名知意,动宾结构,小驼峰命名法)

(4)(形式参数列表):当前方法没有任何的外来数据需求,不需要参数

  1. 方法声明
    public static void printHelloWorld();
2.3.2 方法实现过程
/**
* 文档注释
* 	1. 对于方法的功能解释
*	2. 方法所需参数介绍
*	3. 方法返回值类型介绍和含义
*	4. 方法处理过程中出现的异常
*/

/**
* 展示打印到控制台一个Hello World
*/
public static void printHelloWorld() {
    // 方法体
    System.out.println("Hello World!");
}
2.3.3 方法在代码中实现的位置

【方法的位置】

  1. class大括号以内;[目前的要求]
  2. 其他方法之外
/* 自定义实现第一个方法 */
class Method1 {
	public static void main(String[] args) {
		
	}
	
	/**
	* 展示打印到控制台一个Hello World
	*/
	public static void printHelloWorld() {
		// 方法体
		System.out.println("Hello World!");
	}
}
2.3.4 自定义方法调用过程

【顺口溜】方法是条狗,哪里需要哪里吼,吼什么,方法名+括号。

【注意】

  1. 在需要调用方法的位置,使用方法名调用方法。

  2. 方法和变量最大的区别:方法后面一定有小括号。

/* 自定义实现第一个方法 */
class Method1 {
	public static void main(String[] args) {
		//方法是条狗,哪里需要哪里吼,吼什么,方法名+()
		//调用方法一定要有小括号,如果没有参数,小括号内没有内容
		printHelloWorld();
		printHelloWorld();
		printHelloWorld();
		printHelloWorld();
		printHelloWorld();
	}
	
	/**
	* 展示打印到控制台一个Hello World
	*/
	public static void printHelloWorld() {
		// 方法体
		System.out.println("Hello World!");
	}
}
2.3.5 自定义方法小总结
  1. 目前我们有且只考虑在main方法中来调用其他方法
  2. main方法是目前我们程序的唯一入口,如果想要哪一个代码执行,哪一个方法被调用,都需要经过main方法完成
  3. 方法书写一定要注意代码格式
  4. 方法位置在class以内,其他方法之外。
2.4 无形式参数无返回值的方法
  1. 需求:在控制台打印展示十个烤羊排

  2. 方法分析:

​ 固定格式:public static

​ 返回值类型:在控制台展示触触,这里不需要返回值

​ 方法名:BBQ ——烧烤。

​ (形式参数列表):当前方法没有一个对于外数据的需求,即()没有参数。

  1. 方法声明

    public static void BBQ() ;

/**
* 展示十次烧烤内容
*/
public static void BBQ() {
    for (int i = 1; i <= 10; i++) {
       System.out.println(烤羊排~~~); 
    }
}
/* 无形式参数无返回值类型的方法 */
class Method2 {
	public static void main(String[] args) {
		// 方法是条狗,哪里需要哪里吼
		// 方法调用一定有小括号
		BBQ();
	}
	
	// 注释颜色
	/**
	* 展示10次烧烤内容
	*/
	public static void BBQ() {
		for (int i = 1; i <= 10; i++) {
			System.out.println("烤羊排...");
		}
    }
}
2.5 有参数无返回值的方法
2.5.1 方法实现过程
  1. 需求:展示用户告知的int类型数据,用户调用该方法,传入一个int类型,在控制台打印展示

  2. 方法分析:

​ 固定格式:public static 不要问

​ 返回值类型:展示打印一个int类型数据,不需要返回值!

​ 方法名:printIntNumber(小驼峰命名法、见名知意、动宾结构)

​ 形式参数列表: ①该方法需要展示的数据是用户输入的,而且是int类型

​ ②(int num) 参数声明:int 是参数的数据类型,num 是参数的名字,可以认为是方法的一个 个变量,可以供方法使用。

  1. 方法声明

    public static void printIntNumber();

/*
 文档注释细节
 	1. @param num 是告知编译器,这里在解释方法参数num
 	2. 方法功能概述和之后的参数解释,返回值解释需要空一行,标准格式代码
 	3. 文档注释是可以帮助我们后期更好的阅读代码
*/

/**
* 展示用户传入的int类型数据
* 
* @param num 这里需要一个int类型数据
*/
public static void printIntNumber(int num) {
    // 用户调用该方法时,会将数据存储与num中,展示num中的数据就ok了
    System.out.println(num);
}
/* 有参数无返回值的方法 */
class Method3 {
	public static void main(String[] args) {
		// 当前方法需要参数,这里调用时调用者必须给他参数
		printIntNumber(10);
	}
	/**
	* 展示用户传入的int类型数据
	* 
	* @param num 这里需要一个int类型数据
	*/
	public static void printIntNumber(int num) {
		// 用户调用该方法时,会将数据存储与num中,展示num中的数据就ok了
		System.out.println(num);
	}
}
2.5.2 调用带有参数的方法使用注意事项
  1. 方法中如果需要参数,必须在调用过程中给予对应的参数
  2. 方法如果没有给定参数,报错!!!编译不通过!
  3. 方法如果给定的实际参数,数据类型不符合形式参数列表的数据类型,报错!!!编译不通过,数据类型一致化问题。
  4. 方法如果在调用的过程中给定的参数个数,不是方法所预期的参数个数,报错!!!编译不通过。
2.6 形式参数和实际参数(用例子说明)
  1. 形式参数:

​ public static void printIntNumber(int num)

​ int num 只是告诉调用者,这里需要的是一个int类型数据

  1. 实际参数:

​ printIntNumber(10);

​ 10 就是一个当前方法所需要的实际参数,符合方法要求的数据类型

2.7 练一练
2.7.1 ”一顿操作猛如虎“
/*				L  _  字符 个数
      A         1  6   A   1
     BBB        2  5   B   3
    CCCCC       3  4   C   5
   DDDDDDD      4  3   D   7
  EEEEEEEEE     5  2   E   9 
 FFFFFFFFFFF    6  1   F   11 
GGGGGGGGGGGGG   7  0   G   13
				_个数 = 总行数 - 当前行号;
				字符个数 = 2 * 当前行号 - 1;
				字符本身的递增过程
				
	这里需要一个方法,封装这样的实现效果
	
方法分析:
	固定格式:
		public static 不要问
	返回值类型:
		这里就是展示一个图形,不需要返回值
		void
	方法名:
		printPic 展示图像
	形式参数列表:
		图形展示过程中最主要的就是有多少行数据
		需要给用户一个控制方法的途径
		(int line)
【方法声明】
	public static void printPic(int line)
*/
class Method4 {
	public static void main(String[] args) {
		printPic(42);
	}
	
	/**
	* 展示一个等腰梯形字符图形
	*
	* @param line 控制图形展示的行数
	*/
	public static void printPic(int line) {
		// 定义一个字符变量,变量初始化为字符'A'
		char ch = 'A';
       
        // 外层循环控制总行数,总行数7行
        for (int i = 1; i <= line; i++) {
        	// 内存循环1: 控制空格的个数
        	for (int j = 1; j <= line - i; j++) {
        		System.out.print(' ');
        	}
        	
        	// 内存循环2: 控制字符个数
        	for (int k = 1; k <= 2 * i - 1; k++) {
        		System.out.print(ch);
        	}
        	
        	System.out.println();
        	
        	// 字符变量需要在每一次展会完毕之后,进行自增
        	ch += 1;
        }
	}
}
发布了12 篇原创文章 · 获赞 1 · 访问量 292

猜你喜欢

转载自blog.csdn.net/Mr_SunJH/article/details/105667345