java中只用三个循环在控制台输出菱形
2016-07-15 21:09
615 查看
在控制台中输出菱形,我们需要用到循环,我们通常用到的是双层循环,即:外层循环控制行数,内层循环分两部分,一部分控制“*”的输出,一部分控制“(空格) ”的输出,这种情况是最常见的,代码如下:
这个是写死的,只能输出7行的菱形,分上半部分与下半部分两部分输出。现在我们对这个代码进行改进,让他可以输出任意奇数行的菱形。代码如下:
这个代码是对Rhombus01代码的进化,即把我们在Rhombus01中写死的n替换成键盘输入的值。现在我再对这个代码进行优化,让他外层循环用总行数n控制,而不是分成上下两部分需要两个双层循环,只用一个双层循环,用if判断是上层还是下层。代码如下:
这个代码对上面两个例子进行了综合,我用总行数n作位控制外层循环的变量,内层循环通过if来判断是上半部分还是下半部分,分别执行不同的逻辑。但是这样还是复杂,那我们能不能只用三个循环来输出菱形呢?答案是可以的,代码如下:
这个方法是利用对称解决的,因为菱形的上下是关于中间对称的,那我们只需要输出一部分的,另外一部分用对称来解决就行了,如题目中,我们要输出一个7行的菱形,那么他的1,2,3行输出的内容跟7,6,5行的内容关于第4行对称,即 (绝对值)|(1-4)| =(7-4),(注:1,7代表行号,4代表对称轴)那换到代码中也是这个道理。我们只需要按照我们前面那三个代码的基础把内层循环中控制的变量改变就可以了。
想到对称轴那我们又会想到为什么不用函数来解决呢?这样当然也是可以的,我们把行数代表x的值,输出的空格数代表Y的值,在坐标系上画图,很明显它关于x=4(这里以7行菱形为例子)对称,那我们就可以找到他的函数表达式,那我们输出空格跟*就是相当于解函数表达式,写在代码中如下:
这里我用了三元表达式,用于判断行数在对称轴前还是后,如果可以理解上面的代码,相信这个也很好理解。
public class Rhombus01{ /* * *** ***** ******* ***** *** * 行数 空格数 星数 n space star 1 3 1 2 2 3 3 1 5 4 0 7 space = 4 - n; star = 2 * n - 1; 1 1 5 2 2 3 3 3 1 space = n; star = 7 - 2 * n */ public static void main(String[] args) { int n = 4; //控制行数 上半部分 for(int i = 1; i <= n; i++){ //控制空格数 for(int x = 1; x <= n - i; x++){ System.out.print(" "); } //控制星数 for(int y = 1; y <= 2 * i - 1; y++){ System.out.print("*"); } System.out.println(); } //控制行数 下半部分 n = 3; for(int i = 1; i <= n; i++){ //控制空格 for(int x = 1; x <= i; x++){ System.out.print(" "); } //控制星数 for(int y = 1; y <= 2 * n - (2 * i - 1); y++){ System.out.print("*"); } System.out.println(); } } }
这个是写死的,只能输出7行的菱形,分上半部分与下半部分两部分输出。现在我们对这个代码进行改进,让他可以输出任意奇数行的菱形。代码如下:
import java.util.Scanner; public class Rhombus02 { /* * *** ***** ******* ***** *** * n space star 1 3 1 2 2 3 3 1 5 4 0 7 space = 4 - n; star = 2 * n - 1; */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个奇数代表菱形的行数:"); int n = scanner.nextInt(); if(n % 2 == 0){ System.err.println("您输入的行数不合法,不是奇数。"); }else{ //控制行数 上半部分 for(int i = 1; i <= n / 2 + 1; i++){ //控制空格数 for(int x = 1; x <= n / 2 + 1 - i; x++){ System.out.print(" "); } //控制星数 for(int y = 1; y <= 2 * i - 1; y++){ System.out.print("*"); } System.out.println(); } //控制行数 下半部分 for(int i = n / 2; i >= 1; i--){ //控制空格 for(int x = 1; x <= n / 2 - i + 1; x++){ System.out.print(" "); } //控制星数 for(int y = 1; y <= 2 * i - 1; y++){ System.out.print("*"); } System.out.println(); } } } }
这个代码是对Rhombus01代码的进化,即把我们在Rhombus01中写死的n替换成键盘输入的值。现在我再对这个代码进行优化,让他外层循环用总行数n控制,而不是分成上下两部分需要两个双层循环,只用一个双层循环,用if判断是上层还是下层。代码如下:
import java.util.Scanner; public class Rhombus03 { /* * *** ***** ******* ***** *** * n space star 1 3 1 2 2 3 3 1 5 4 0 7 5 1 5 6 2 3 7 3 1 */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个奇数代表菱形的行数:"); int n = scanner.nextInt(); if(n % 2 == 0){ System.err.println("您输入的行数不合法,不是奇数。"); }else{ //控制菱形的总行数 for(int i = 1; i <= n; i++){ if(i <= n / 2 + 1){//上半部分 //空格数 for(int x = 1; x <= n / 2 + 1 - i; x ++){ System.out.print(" "); } //星数 for(int y = 1; y <= 2 * i - 1; y++){ System.out.print("*"); } }else{//下半部分 //空格数space = i - (n / 2 + 1) for(int x = 1; x <= i - (n / 2 + 1); x++){ System.out.print(" "); } //星数star = n - 2 * space for(int y = 1; y <= 2 * (n - i + 1) - 1; y++){ System.out.print("*"); } } System.out.println(); } } } }
这个代码对上面两个例子进行了综合,我用总行数n作位控制外层循环的变量,内层循环通过if来判断是上半部分还是下半部分,分别执行不同的逻辑。但是这样还是复杂,那我们能不能只用三个循环来输出菱形呢?答案是可以的,代码如下:
import java.util.Scanner; public class Rhombus04 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个奇数:"); int num = sc.nextInt(); if(num % 2 == 0){ System.err.println("您输入的行数不合法,不是奇数。"); return; } //外层循环控制行数 for(int i = 1; i <= num; i++){ //对temp取绝对值 temp相当于空格数 int temp =(int) Math.abs((i - (num / 2 +1))); //输出空格 for(int j = 1; j <= temp; j++){ System.out.print(" "); } //输出* for(int k = 1; k <= num - temp * 2; k++){ System.out.print("*"); } System.out.println(); } } }
这个方法是利用对称解决的,因为菱形的上下是关于中间对称的,那我们只需要输出一部分的,另外一部分用对称来解决就行了,如题目中,我们要输出一个7行的菱形,那么他的1,2,3行输出的内容跟7,6,5行的内容关于第4行对称,即 (绝对值)|(1-4)| =(7-4),(注:1,7代表行号,4代表对称轴)那换到代码中也是这个道理。我们只需要按照我们前面那三个代码的基础把内层循环中控制的变量改变就可以了。
想到对称轴那我们又会想到为什么不用函数来解决呢?这样当然也是可以的,我们把行数代表x的值,输出的空格数代表Y的值,在坐标系上画图,很明显它关于x=4(这里以7行菱形为例子)对称,那我们就可以找到他的函数表达式,那我们输出空格跟*就是相当于解函数表达式,写在代码中如下:
public class Rhombus05 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); if(num % 2 == 0 || num < 0){ System.err.println("Your enter is error !"); } //控制总行数 for (int i = 1; i <= num; i++) { //控制空格 for (int j = 0; j < (i <= (num / 2 ) ? -i+(num / 2 + 1) : i-(num / 2 + 1)); j++) { System.out.print(" "); } //控制星型 for (int j = 0; j < num - 2 * (i <= (num / 2 ) ? -i+(num / 2 + 1) : i-(num / 2 + 1)); j++) { System.out.print("*"); } System.out.println(); }
这里我用了三元表达式,用于判断行数在对称轴前还是后,如果可以理解上面的代码,相信这个也很好理解。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树