黑马程序员技术交流社区

标题: Java好难解的题.. [打印本页]

作者: Star-∂ємση    时间: 2014-7-22 17:53
标题: Java好难解的题..
本帖最后由 Star-∂ємση 于 2014-7-22 20:54 编辑


这是Java程序设计教程上,第二章基本数据类型和确定循环的题,所以解决这题的语法仅局限第二章的. 别用后面的语法来解答..
这个题,我首先想的是,把小人抛去一边,打印星号部分. 想了半天没解决..大家帮忙给个思路! 谢谢!用for循环.

作者: fantacyleo    时间: 2014-7-22 19:00
连函数都没用。。。够基础语法了吧
  1. public class PrintStairs {
  2.         public static final int NSTAIRS = 3; // 楼梯数
  3.         public static final int STAIR_WIDTH = 6; // 楼梯宽度
  4.         public static final int STAIR_HEIGHT = 3; // 楼梯所占行数

  5.         public static void main(String[] args) {
  6.                 int wall = (NSTAIRS + 1) * (STAIR_WIDTH - 1) + 1; // 墙,即最右一列的位置
  7.                 // 按行打印楼梯部分,每个楼梯3行,一共3*NSTAIRS行
  8.                 for (int row = 0; row < NSTAIRS * STAIR_HEIGHT; row++) {
  9.                         int col = 0; // 当前行打印到了哪一列
  10.                         int stairNo = row / STAIR_HEIGHT; // 当前打印第几个楼梯(取值0, 1... NSTAIRS -1)
  11.                         int lineInStair = row % STAIR_HEIGHT; // 当前打印楼梯的第几行(取值0, 1, 2)
  12.                         // 打印缩进空格
  13.                         for (; col < (NSTAIRS - stairNo) * (STAIR_WIDTH - 1); col++)
  14.                                 System.out.print(" ");
  15.                         // 根据是楼梯的第几行分别打印
  16.                         if (lineInStair == 0) {
  17.                                 for (int k = 0; k < STAIR_WIDTH; k++)
  18.                                         System.out.print("*");
  19.                                 col += STAIR_WIDTH;
  20.                         }
  21.                         else {
  22.                                 System.out.print("*");
  23.                                 col++;
  24.                         }
  25.                         // 楼梯和墙(最右一列的*)之间的空格
  26.                         for (; col < wall; col++)
  27.                                 System.out.print(" ");
  28.                         // 打印墙,即最右一列的*
  29.                         System.out.println("*");
  30.                 }
  31.                
  32.                 // 打印地板
  33.                 for (int i = 0; i <= wall; i++)
  34.                         System.out.print("*");

  35.         }

  36. }
复制代码

作者: cat73    时间: 2014-7-22 19:40
本帖最后由 cat73 于 2014-7-22 19:55 编辑

http://bbs.itheima.com/thread-131726-1-1.html
基本完全符合楼主的要求
楼主所说的第二章 内本书窝木看过- -
StringBuffer可能超过你要的范围了- -
可以把缓存都换成输出语句来代替
最简单的改法就是把outBuffer函数里面直接替换成不换行的输出语句

作者: dreamseekerkun    时间: 2014-7-22 19:57
哇擦,这个需要看完毕姥爷的视频第几天后,可用所学知识写出来。
作者: Star-∂ємση    时间: 2014-7-22 20:16
fantacyleo 发表于 2014-7-22 19:00
连函数都没用。。。够基础语法了吧

语法很基础, 你也很强大,这个语句可行.需要我学完后面的东西,才能掌握你这些.可烦的是题是在第二章出现,第二章讲了数据类型,有常量,确定循环 也就是for.没有if判断语句. 你这个我收藏了.但是我会找到只用类常量和for循环语句来实现这题
作者: 黎志勇    时间: 2014-7-22 20:18
考虑到你说只到第二章,我就只用String来做了,其实应该用StringBulider来做比较好。
  1. package test;


  2. public class Test3 {

  3.     public static void main(String[] args) {

  4.         print(5);

  5.     }

  6.     /*每次循环将对下面这个图形进行处理
  7.      * -------------------
  8.      *  0  ******
  9.      * /|\ *      
  10.      * / \ *   
  11.      * -------------------
  12.      */
  13.     public static void print(int num) {
  14.         for (int i = 0; i < num; i++) {
  15.             String leftString = " ";//图形左边的内容
  16.             for (int j = 0; j < num - i - 1; j++) {
  17.                 leftString += "     ";
  18.             }
  19.             String rightString = "";//图形右边的内容
  20.             for (int j = 0; j < i; j++) {
  21.                 rightString += "     ";
  22.             }
  23.             rightString += "*";//加上最右边那个*
  24.             System.out.println(leftString + " 0  ******" + rightString);//打印没层的图形
  25.             System.out.println(leftString + "/|\\ *     " + rightString);
  26.             System.out.println(leftString + "/ \\ *     " + rightString);
  27.         }
  28.         String bottomString = "*";//最下面那行*
  29.         for (int i = 0; i <= num; i++) {
  30.             bottomString += "*****";
  31.         }
  32.         bottomString += "*";
  33.         System.out.println(bottomString);//打印最下面的那行*
  34.     }

  35. }

复制代码




作者: Star-∂ємση    时间: 2014-7-22 20:18
cat73 发表于 2014-7-22 19:40
http://bbs.itheima.com/thread-131726-1-1.html
基本完全符合楼主的要求
楼主所说的第二章 内本书窝木看过 ...

好强大的跨语言. 好强大的你,用两种语言实现.对于我只会一种语言的我表示膜拜!
作者: Star-∂ємση    时间: 2014-7-22 20:50
黎志勇 发表于 2014-7-22 20:18
考虑到你说只到第二章,我就只用String来做了,其实应该用StringBulider来做比较好。

我去, 你这个String 我没想到啊. 很巧妙啊!
作者: F@C    时间: 2014-7-22 20:52
进来学习
作者: fantacyleo    时间: 2014-7-22 20:52
Star-∂ємση 发表于 2014-7-22 20:16
语法很基础, 你也很强大,这个语句可行.需要我学完后面的东西,才能掌握你这些.可烦的是题是在第二章出现, ...

不用if的来了~~不用if反而感觉思路更清晰了。。。

  1. public class PrintStairs {
  2.         public static final int NSTAIRS = 3; // 楼梯数
  3.         public static final int STAIR_WIDTH = 6; // 楼梯宽度
  4.         public static final int STAIR_HEIGHT = 3; // 楼梯所占行数

  5.         public static void main(String[] args) {

  6.                 int wall = (NSTAIRS + 1) * (STAIR_WIDTH - 1) + 2; // 墙,即最右一列的位置
  7.                 // 打印楼梯部分,每次循环打印一个楼梯
  8.                 for (int stair = 0; stair < NSTAIRS; stair++) {
  9.                         // 每个楼梯分3行打印,每行前的缩进数
  10.                         int indents = (STAIR_WIDTH - 1) * (NSTAIRS - stair);
  11.                         // 楼梯和墙之间的空格
  12.                         int toWall = (STAIR_WIDTH - 1) * stair;
  13.                         // 打印第一行
  14.                         for (int i = 0; i < indents; i++)
  15.                                 System.out.print(" ");
  16.                         for (int i = 0; i < STAIR_WIDTH; i++)
  17.                                 System.out.print("*");
  18.                         for (int i = 0; i < toWall; i++)
  19.                                 System.out.print(" ");
  20.                         System.out.println("*");
  21.                         // 打印第2、3行
  22.                         for (int i = 0; i < 2; i++) {
  23.                                 for (int j = 0; j < indents; j++)
  24.                                         System.out.print(" ");
  25.                                 System.out.print("*");
  26.                                 // 楼梯本身的空格和楼梯与墙之间的空格合并打印
  27.                                 for (int j = 0; j < STAIR_WIDTH - 1 + toWall; j++)
  28.                                         System.out.print(" ");
  29.                                 System.out.println("*");
  30.                         }
  31.                 }

  32.                 // 打印地板
  33.                 for (int i = 0; i < wall; i++)
  34.                         System.out.print("*");
  35.         }
复制代码

作者: Star-∂ємση    时间: 2014-7-22 20:55
fantacyleo 发表于 2014-7-22 20:52
不用if的来了~~不用if反而感觉思路更清晰了。。。

早聊啊!
作者: 黎志勇    时间: 2014-7-22 20:55
本帖最后由 黎志勇 于 2014-7-22 21:48 编辑
Star-∂ємση 发表于 2014-7-22 20:50
我去, 你这个String 我没想到啊. 很巧妙啊!

本来就不难啊,只要找出该对哪部分进行循环,就很容易了。
把代码修改了下,不用String拼接了,直接打印,不过貌似直接打印操作更加耗时,看来调用方法会比较占资源。
  1. package test;


  2. public class Test3 {

  3.     public static void main(String[] args) {

  4.         print(10);

  5.     }

  6.     public static void print(int num) {
  7.         String[] manParts = {
  8.             " o  ******",
  9.             "/|\\ *     ",
  10.             "/ \\ *     "
  11.         };//小人的图案可以由这个String数组构成
  12.         for (int i = 0; i < num ; i++) {
  13.             for (int j = 0; j < manParts.length ; j++) {//每次循环分别打印每个小人的三行
  14.                 System.out.print(' ');//每一行前面都有一个空位
  15.                 for (int j2 = 0; j2 < num-i-1; j2++) {
  16.                     System.out.print("     ");//打印左边的缩进
  17.                 }
  18.                 System.out.print(manParts[j]);//打印小人的部分
  19.                 for (int j2 = 0; j2 < i; j2++) {
  20.                     System.out.print("     ");//打印右边的空位
  21.                 }
  22.                 System.out.println('*');//打印最后的*,并换行
  23.             }
  24.         }
  25.         //最后一行的*数为:*+*****×(num+1)+*
  26.         for (int i = 0; i <= num ; i++) {
  27.             System.out.print("*****");
  28.         }
  29.         System.out.println("**");
  30.         
  31.     }

  32. }

复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2