黑马程序员技术交流社区

标题: 周末技术分活动第三期的总结 [打印本页]

作者: X11    时间: 2014-7-7 14:10
标题: 周末技术分活动第三期的总结
之前看到论坛里有关周末技术分活动第三期http://bbs.itheima.com/thread-127326-1-1.html的一些话题,现在对这次活动做一些小总结。
题目内容
这次活动主要是针对循环结构与打印图案进行考验,要打印一个菱形,并可以对其进行旋转操作。
题目分析
对于这个问题,如果从图形变换的规律来写代码的话,会十分繁琐。所以这里我采用二维数组来表示整个图形,可以通过对数组中取不同的值的来改变显示的图形(如:如果数组内值为1则显示,为0则不显示,等等)。然后再通过数组的旋转来得到图形的旋转。这个问题就变成了3个小问题:a.使用数组生成图形数据 b.对图形数据数组显示为图形 c.对图形数据数组进行顺时针旋转。
主要代码分析
a.生成图形矩阵
  1. /**
  2.          * getPatternData(int,int): 生成图形矩阵
  3.          *
  4.          * @param size
  5.          *            :图形矩阵的大小
  6.          * @param fill
  7.          *            :矩阵填充样式
  8.          * @return 图形矩阵
  9.          */
  10.         public static int[][] getPatternData(int size, int fill) {
  11.                 int[][] data = new int[size][size];
  12.                 int num = 0;

  13.                 for (int i = 0; i < size; i++) {
  14.                         if (i <= size / 2)
  15.                                 num = 2 * i + 1;
  16.                         else
  17.                                 num = 2 * (size - i - 1) + 1;
  18.                         switch (fill) {
  19.                         case 0: // 默认图形
  20.                                 for (int j = 0; j < num; j++) {
  21.                                         data[i][((size - num) / 2) + j] = 1;
  22.                                 }
  23.                                 break;
  24.                         case 1:// 空心图形
  25.                                 if (num > 1) {
  26.                                         data[i][((size - num) / 2) + 0] = 1;
  27.                                         data[i][((size - num) / 2) + num - 1] = 1;
  28.                                 } else {
  29.                                         data[i][((size - num) / 2) + 0] = 1;
  30.                                 }
  31.                                 break;
  32.                         case 2: // 半空心图形
  33.                                 if (num > 1) {
  34.                                         if (i < size / 2) {
  35.                                                 data[i][((size - num) / 2) + 0] = 1;
  36.                                                 data[i][((size - num) / 2) + num - 1] = 1;
  37.                                         } else {
  38.                                                 for (int j = 0; j < num; j++) {
  39.                                                         data[i][((size - num) / 2) + j] = 1;
  40.                                                 }
  41.                                         }
  42.                                 } else {
  43.                                         data[i][((size - num) / 2) + 0] = 1;
  44.                                 }
  45.                                 break;
  46.                         default:
  47.                                 for (int j = 0; j < num; j++) {
  48.                                         data[i][((size - num) / 2) + j] = 1;
  49.                                 }
  50.                                 break;
  51.                         }

  52.                 }

  53.                 return data;
  54.         }
复制代码
     b.显示图形
  1.         /**
  2.          * showPattern(int[][],char)
  3.          *
  4.          * @param data
  5.          *            需要显示图形的数据矩阵
  6.          * @param c
  7.          *            显示字符如(*,+,-,....)
  8.          */
  9.         public static void showPattern(int[][] data, String c) {
  10.                 int size = data.length;
  11.                 for (int i = 0; i < size; i++) {
  12.                         for (int j = 0; j < size; j++) {
  13.                                 if (data[i][j] == 1)
  14.                                         System.out.print(c);
  15.                                 else
  16.                                         System.out.print(' ');
  17.                         }
  18.                         System.out.println();
  19.                 }
  20.         }
复制代码
     c.旋转图形
  1. /**
  2.          * rotate(int[][],int):按顺时针旋转图形矩阵
  3.          *
  4.          * @param data
  5.          *            需要旋转的图形矩阵
  6.          * @param rotateTime
  7.          *            旋转次数 >= 0
  8.          * @return 旋转后的图形矩阵
  9.          */
  10.         public static int[][] rotate(int[][] data, int rotateTime) {
  11.                 int size = data.length; // 原矩阵的大小
  12.                 int[][] rotateData = new int[size][size]; // 保存旋转后的图形矩阵

  13.                 if (rotateTime <= 0) // 旋转次数<=0,则不旋转
  14.                         return data;
  15.                 else {
  16.                         for (int time = 1; time <= rotateTime; time++) {
  17.                                 // 顺时针旋转矩阵,得到旋转后的图形数据矩阵
  18.                                 for (int i = 0; i < size; i++) {
  19.                                         for (int j = 0; j < size; j++) {
  20.                                                 rotateData[j][size - 1 - i] = data[i][j];
  21.                                         }
  22.                                 }
  23.                                 // 保存旋转后的图形矩阵,以便进行下一次旋转
  24.                                 for (int i = 0; i < size; i++) {
  25.                                         for (int j = 0; j < size; j++) {
  26.                                                 data[i][j] = rotateData[i][j];
  27.                                         }
  28.                                 }
  29.                         }
  30.                 }
  31.                 return rotateData;
  32.         }
复制代码
    对于这个问题,个人做了一些小改动,添加了一些小功能如图形显示可以选择空心,不空心和半空心等。图形的显示可以不是*,可以替换为其他字符。使用二维数组来表示此图形可以有很好的扩展性,比如可以上下部分选择不一样的图案,边缘图案等。
第一次写这样的帖子,有什么不正确的地方欢迎各位黑马朋友们批评与指正。谢谢!!!


  


RotateDemo.zip

1.31 KB, 下载次数: 336

周末技术分活动第三期源代码


作者: 刘亚东    时间: 2014-7-7 15:02
大神给力!
作者: zimi626    时间: 2014-7-7 18:10
对于如何让带*的菱形按九十度顺时针旋转,还是没理清楚思路。
作者: 跑步先生    时间: 2014-7-7 18:33
楼主,我下了你的代码,在我的Eclipse上运行,翻转过后没有变化啊,怎么回事?能把你运行的结果看下嘛?
作者: X11    时间: 2014-7-7 19:01
跑步先生 发表于 2014-7-7 18:33
楼主,我下了你的代码,在我的Eclipse上运行,翻转过后没有变化啊,怎么回事?能把你运行的结果看下嘛? ...

采用半空心的样式可以更好的显示出图形旋转的变化!!
旋转次数为0:

旋转次数为1(右旋90度)



作者: X11    时间: 2014-7-7 19:16
zimi626 发表于 2014-7-7 18:10
对于如何让带*的菱形按九十度顺时针旋转,还是没理清楚思路。

我把旋转函数rotate(int[][] data,int rotateTime)做一个demo你看一下:
int[][] data = {{1,2,3},{4,5,6},{7,8,9}};
int[][] rotateData0 = rotate(data,0);//不旋转
此时数据矩阵为:


int[][] rotateData1 = rotate(data,1);//旋转一次,(右旋90度)
此时数据矩阵为:


可以发现,整个二维数组右旋了90度。满足题目要求。
在显示图形时采用的方法是如果数组中的值为1则显示*,否则不显示。这样就能显示出要求的图形了。

作者: zimi626    时间: 2014-7-7 23:29
X11 发表于 2014-7-7 19:16
我把旋转函数rotate(int[][] data,int rotateTime)做一个demo你看一下:
int[][] data = {{1,2,3},{4,5,6 ...

刚看到回复,没细看。明天再详细分析下,上班族伤不起。先谢谢了!
作者: 八零、玖羚    时间: 2014-7-8 00:04
楼主思路和我一样呢,我也是为了旋转后看出效果对图形进行小改变,就是代码太乱,排版学习了:lol
作者: lc2015    时间: 2014-7-8 00:17
看看 了!!!
作者: 心者觉也    时间: 2014-7-10 12:24
这个思路给力,代码很nice,大神~~~~
作者: X11    时间: 2014-7-10 16:58
心者觉也 发表于 2014-7-10 12:24
这个思路给力,代码很nice,大神~~~~

一起努力,加油!加油!!:P




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