题目内容 这次活动主要是针对循环结构与打印图案进行考验,要打印一个菱形,并可以对其进行旋转操作。 题目分析 对于这个问题,如果从图形变换的规律来写代码的话,会十分繁琐。所以这里我采用二维数组来表示整个图形,可以通过对数组中取不同的值的来改变显示的图形(如:如果数组内值为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;
- }
复制代码 对于这个问题,个人做了一些小改动,添加了一些小功能如图形显示可以选择空心,不空心和半空心等。图形的显示可以不是*,可以替换为其他字符。使用二维数组来表示此图形可以有很好的扩展性,比如可以上下部分选择不一样的图案,边缘图案等。第一次写这样的帖子,有什么不正确的地方欢迎各位黑马朋友们批评与指正。谢谢!!!
阿
|