黑马程序员技术交流社区
标题: 周末技术分活动第三期的总结 [打印本页]
作者: X11 时间: 2014-7-7 14:10
标题: 周末技术分活动第三期的总结
题目内容
这次活动主要是针对循环结构与打印图案进行考验,要打印一个菱形,并可以对其进行旋转操作。
题目分析
对于这个问题,如果从图形变换的规律来写代码的话,会十分繁琐。所以这里我采用二维数组来表示整个图形,可以通过对数组中取不同的值的来改变显示的图形(如:如果数组内值为1则显示,为0则不显示,等等)。然后再通过数组的旋转来得到图形的旋转。这个问题就变成了3个小问题:a.使用数组生成图形数据 b.对图形数据数组显示为图形 c.对图形数据数组进行顺时针旋转。
主要代码分析
a.生成图形矩阵- /**
- * getPatternData(int,int): 生成图形矩阵
- *
- * @param size
- * :图形矩阵的大小
- * @param fill
- * :矩阵填充样式
- * @return 图形矩阵
- */
- public static int[][] getPatternData(int size, int fill) {
- int[][] data = new int[size][size];
- int num = 0;
- for (int i = 0; i < size; i++) {
- if (i <= size / 2)
- num = 2 * i + 1;
- else
- num = 2 * (size - i - 1) + 1;
- switch (fill) {
- case 0: // 默认图形
- for (int j = 0; j < num; j++) {
- data[i][((size - num) / 2) + j] = 1;
- }
- break;
- case 1:// 空心图形
- if (num > 1) {
- data[i][((size - num) / 2) + 0] = 1;
- data[i][((size - num) / 2) + num - 1] = 1;
- } else {
- data[i][((size - num) / 2) + 0] = 1;
- }
- break;
- case 2: // 半空心图形
- if (num > 1) {
- if (i < size / 2) {
- data[i][((size - num) / 2) + 0] = 1;
- data[i][((size - num) / 2) + num - 1] = 1;
- } else {
- for (int j = 0; j < num; j++) {
- data[i][((size - num) / 2) + j] = 1;
- }
- }
- } else {
- data[i][((size - num) / 2) + 0] = 1;
- }
- break;
- default:
- for (int j = 0; j < num; j++) {
- data[i][((size - num) / 2) + j] = 1;
- }
- break;
- }
- }
- return data;
- }
复制代码 b.显示图形 - /**
- * showPattern(int[][],char)
- *
- * @param data
- * 需要显示图形的数据矩阵
- * @param c
- * 显示字符如(*,+,-,....)
- */
- public static void showPattern(int[][] data, String c) {
- int size = data.length;
- for (int i = 0; i < size; i++) {
- for (int j = 0; j < size; j++) {
- if (data[i][j] == 1)
- System.out.print(c);
- else
- System.out.print(' ');
- }
- System.out.println();
- }
- }
复制代码 c.旋转图形- /**
- * rotate(int[][],int):按顺时针旋转图形矩阵
- *
- * @param data
- * 需要旋转的图形矩阵
- * @param rotateTime
- * 旋转次数 >= 0
- * @return 旋转后的图形矩阵
- */
- public static int[][] rotate(int[][] data, int rotateTime) {
- int size = data.length; // 原矩阵的大小
- int[][] rotateData = new int[size][size]; // 保存旋转后的图形矩阵
- if (rotateTime <= 0) // 旋转次数<=0,则不旋转
- return data;
- else {
- for (int time = 1; time <= rotateTime; time++) {
- // 顺时针旋转矩阵,得到旋转后的图形数据矩阵
- for (int i = 0; i < size; i++) {
- for (int j = 0; j < size; j++) {
- rotateData[j][size - 1 - i] = data[i][j];
- }
- }
- // 保存旋转后的图形矩阵,以便进行下一次旋转
- for (int i = 0; i < size; i++) {
- for (int j = 0; j < size; j++) {
- data[i][j] = rotateData[i][j];
- }
- }
- }
- }
- return rotateData;
- }
复制代码 对于这个问题,个人做了一些小改动,添加了一些小功能如图形显示可以选择空心,不空心和半空心等。图形的显示可以不是*,可以替换为其他字符。使用二维数组来表示此图形可以有很好的扩展性,比如可以上下部分选择不一样的图案,边缘图案等。第一次写这样的帖子,有什么不正确的地方欢迎各位黑马朋友们批评与指正。谢谢!!!
阿
-
-
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
采用半空心的样式可以更好的显示出图形旋转的变化!!
旋转次数为0:
旋转次数为1(右旋90度)
作者: X11 时间: 2014-7-7 19:16
我把旋转函数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
一起努力,加油!加油!!:P
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |