您的位置:首页 > 编程语言 > Java开发

java中只用三个循环在控制台输出菱形

2016-07-15 21:09 615 查看
在控制台中输出菱形,我们需要用到循环,我们通常用到的是双层循环,即:外层循环控制行数,内层循环分两部分,一部分控制“*”的输出,一部分控制“(空格) ”的输出,这种情况是最常见的,代码如下:

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 控制台