【程序19】
题目:打印出如下图案(菱形)
*
***
*****
*******
*****
***
*
public class lianxi19 {
public static void main(String[] args) {
int H = 7, W = 7;//高和宽必须是相等的奇数
for(int i=0; i<(H+1) / 2; i++) {
for(int j=0; j<W/2-i; j++) {
System.out.print(" ");
}
for(int k=1; k<(i+1)*2; k++) {
System.out.print('*');
}
System.out.println();
}
for(int i=1; i<=H/2; i++) {
for(int j=1; j<=i; j++) {
System.out.print(" ");
}
for(int k=1; k<=W-2*i; k++) {
System.out.print('*');
}
System.out.println();
}
}
}
我看见很多帖子的for循环初适量有的是1,有的是0,中间那个时而<,时而<=,弄得我非常混乱,全部变成0和<不好吗?如下:
public class LinXing {
public static void main(String[] args){
for(int i=0;i<4;i++){
for(int j=0;j<3-i;j++){
System.out.print(" ");
}
for(int j=0;j<i*2+1;j++){
System.out.print("*");
}
System.out.println();
}
for(int i=0;i<3;i++){
for(int j=0;j<i+1;j++){
System.out.print(" ");
}
for(int j=0;j<5-2*i;j++){
System.out.print("*");
}
System.out.println();
}
}
题目:打印出如下图案(菱形)
*
***
*****
*******
*****
***
*
public class lianxi19 {
public static void main(String[] args) {
int H = 7, W = 7;//高和宽必须是相等的奇数
for(int i=0; i<(H+1) / 2; i++) {
for(int j=0; j<W/2-i; j++) {
System.out.print(" ");
}
for(int k=1; k<(i+1)*2; k++) {
System.out.print('*');
}
System.out.println();
}
for(int i=1; i<=H/2; i++) {
for(int j=1; j<=i; j++) {
System.out.print(" ");
}
for(int k=1; k<=W-2*i; k++) {
System.out.print('*');
}
System.out.println();
}
}
}
我看见很多帖子的for循环初适量有的是1,有的是0,中间那个时而<,时而<=,弄得我非常混乱,全部变成0和<不好吗?如下:
public class LinXing {
public static void main(String[] args){
for(int i=0;i<4;i++){
for(int j=0;j<3-i;j++){
System.out.print(" ");
}
for(int j=0;j<i*2+1;j++){
System.out.print("*");
}
System.out.println();
}
for(int i=0;i<3;i++){
for(int j=0;j<i+1;j++){
System.out.print(" ");
}
for(int j=0;j<5-2*i;j++){
System.out.print("*");
}
System.out.println();
}
}
解决方案 »
- 请问如何得到Oracle SQLException的errorCode, 用SQLException.getErrorcode() 总是返回0
- 这段话看不懂,请解释
- 哪位大哥大姐能给我提供下lzw压缩算法啊,急。。。
- 求助:在JAVA里面怎样提取出汉字里的各个字节???
- 如何用java代码来查看某个windows服务的当前状态....在线等.....捏着分等前辈
- 为什么有两个例外___急
- 一个 IO 的弱问题! ----- 再线等待! 立即接分!
- 请问各位JB高手,在用jb建立一个工程的时候分别用jpx和jpr后缀名有什么区别?
- javamail附件名称的问题
- JAVA 使用DES加密字符串,windows系统和linux系统加密后不一样
- 求HttpClient和HtmlParser用法手册或者使用方法,急用
- 问个java gui的问题 frame刷新
public class Test1 {
public static void main(String[] args) {
int i = 11;//总层数,是个奇数
int h = i/2;
for(int n = 0;n<h+1;n++){
int temp = 2*n+1;
for(int j = 0;j<temp;j++){
System.out.print("*");
}
System.out.println();
}
for(int n = h-1;n>=0;n--){
int temp = 2*n+1;
for(int j = 0;j<temp;j++){
System.out.print("*");
}
System.out.println();
}
}
}
printDiamond(7, true);
System.out.println();
printDiamond(7, false);
} /**
* 输出菱形
* @param line 菱形的行数
* @param isSolid 是否为实心
*/
private static void printDiamond(int line, boolean isSolid) {
line = line % 2 == 0 ? line + 1 : line;
for(int k = line / 2, i = -k; i <= k; i++) {
for(int j = -k, m = k - Math.abs(i); j <= m; j++) {
boolean b;
if(isSolid) {
b = Math.abs(j) + Math.abs(i) > k;
} else {
b = Math.abs(j) + Math.abs(i) != k;
}
System.out.print(b ? " " : "*");
}
System.out.println();
}
}
}分析如下:菱形是一个上下、左右对称的图形,行列可以按照下面的方式来进行循环 j=
-3 -2 -1 0 1 2 3
i= +---+---+---+---+
-3 | | | | * |
+---+---+---+---+---+
-2 | | | * | * | * |
+---+---+---+---+---+---+
-1 | | * | * | * | * | * |
+---+---+---+---+---+---+---+
0 | * | * | * | * | * | * | * |
+---+---+---+---+---+---+---+
1 | | * | * | * | * | * |
+---+---+---+---+---+---+
2 | | | * | * | * |
+---+---+---+---+---+
3 | | | | * |
+---+---+---+---+行数为 7,则 7/2 = 3,这个数值很有用处,暂且称为 K。i 和 j 的循环起始均为 -K,而 i 的终止循环为 K,j 的终止循环条件理应为 K,
注意右边,我特意把它挖空了,因为右边的都是空格,为了优化程序就没有必要输
出了,这样 j 的循环终止条件与 i 是有密切关系的,为 K - Math.abs(i),即:
当 i = -1 时,K - Math.abs(i) = 2,因此 j 只要从 -3 循环到 2 就可以了。再看看 * 位置上的规律,注意最左边的 *,在 Math.abs(i) + Math.abs(j) > K 时
输出的是空格,小于等于 K 时,输出的是 *。在 i = -2, j = -2 坐标上,Math.abs(i) + Math.abs(j) = 4,4 是大于 K 的,因此输出空格
若 i = -2, j = -1 坐标上,Math.abs(i) + Math.abs(j) = 3,3 是不大于 K 的,因此输出 *如果需要的是空心菱心,只要把判断条件设为 Math.abs(i) + Math.abs(j) == K 时
才输出 *,否则输出空格。因此,这样我们就利用于图形的对称性完成了菱形的输出。