首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数字在for循环中发出

数字在for循环中发出
EN

Stack Overflow用户
提问于 2016-11-08 19:12:31
回答 2查看 88关注 0票数 0

我正在制作一个用地形表示来读取栅栏的程序。现在,代码查看数组,并报告需要多少栅栏,每边1 2.5米。问题是我不知道这些数字出了什么问题。它很好地显示角值,但是边值是不正确的,除了最后一列显示正确的值,但这可能只是巧合。我有i's和j's来表示x和y值,到目前为止,这是我所有的代码。

代码语言:javascript
复制
package assignment_2;

public class Fencing {

    public static void main(String[] args) {
        boolean b = true;
        double corner = 0;
        double core = 0;
        double side = 0;
        int i = 0;
        int j = 0;
        int[][] map = { 
            { 0, 1, 1, 0 }, 
            { 1, 1, 1, 1 }, 
            { 1, 1, 1, 1 }, 
            { 1, 1, 0, 1 } 
        };
        for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                if (map[i][j] != 1 && map[i][j] != 0) {
                    b = false;
                    System.out.println("--> A value of " + map[i][j] + " was found at " + i + "," + j);
                }
            }
        }
        if (b == false && i == 4) {
            System.out.println("The map is invalid");
            return;
        } else {
            System.out.println("Map is valid");
        }
        if (map[0][0] == 1) {
            corner += 5;
            if (map[1][0] == 1 && map[0][1] == 1) {
                corner += 0;
            }
            if (map[1][0] != 1 && map[0][1] != 1) {
                corner += 5;
            }
            if (map[1][0] != 1 && map[0][1] == 1 || map[1][0] == 1 && map[0][1] != 1) {
                corner += 2.5;
            }
        } else {
            corner += 0;
        }
        if (map[0][3] == 1) {
            corner += 5;
            if (map[1][3] == 1 && map[0][2] == 1) {
                corner += 0;
            }
            if (map[1][3] != 1 && map[0][2] != 1) {
                corner += 5;
            }
            if (map[1][3] != 1 && map[0][2] == 1 || map[1][3] == 1 && map[0][2] != 1) {
                corner += 2.5;
            }
        } else {
            corner += 0;
        }
        if (map[3][0] == 1) {
            corner += 5;
            if (map[3][1] == 1 && map[2][0] == 1) {
                corner += 0;
            }
            if (map[3][1] != 1 && map[02][0] != 1) {
                corner += 5;
            }
            if (map[3][1] != 1 && map[2][0] == 1 || map[3][1] == 1 && map[2][0] != 1) {
                corner += 2.5;
            }
        } else {
            corner += 0;
        }
        if (map[3][3] == 1) {
            corner += 5;
            if (map[3][2] == 1 && map[2][3] == 1) {
                corner += 0;
            }
            if (map[3][2] != 1 && map[2][3] != 1) {
                corner += 5;
            }
            if (map[3][2] != 1 && map[2][3] == 1 || map[3][2] == 1 && map[2][3] != 1) {
                corner += 2.5;
            }
        } else {
            corner += 0;
        }
        System.out.println("Corner fencing = " + corner);
        for (i = 1; i > 2; i++) { // Top
            if (map[0][j] == 1) {
                side += 2.5;
                if (map[i + 1][0] == 1 && map[i - 1][0] == 1) {
                    side += 0;
                }
                if (map[i + 1][0] != 1 || map[i - 1][0] != 1) {
                    side += 2.5;
                }
                if (map[i + 1][0] != 1 && map[i - 1][0] != 1) {
                    side += 5;
                }
            } else {
                side += 0;
            }
        }
        System.out.println("After the first row, fencing = " + side);
        for (i = 1; i > 2; i++) { // Bottom
            if (map[i][3] == 1) {
                side += 2.5;
                if (map[i + 1][3] == 1 && map[i - 1][3] == 1) {
                    side += 0;
                }
                if (map[i + 1][3] != 1 || map[i - 1][3] != 1) {
                    side += 2.5;
                }
                if (map[i + 1][3] != 1 && map[i - 1][3] != 1) {
                    side += 5;
                }
            } else {
                side += 0;
            }
        }
        System.out.println("After the bottom row, fencing = " + side);
        for (j = 1; j < 3; j++) {// Right
            if (map[3][j] == 1) {
                side += 2.5;
                if (map[3][j + 1] == 1 && map[3][j - 1] == 1) {
                    side += 0;
                }
                if (map[3][j + 1] != 1 || map[3][j - 1] != 1) {
                    side += 2.5;
                }
                if (map[3][j + 1] != 1 && map[3][j - 1] != 1) {
                    side += 5;
                }
            } else {
                side += 0;
            }
        }
        System.out.println("After the first column, fencing = " + side);
        for (j = 1; j < 3; j++) {// Left
            if (map[0][j] == 1) {
                side += 2.5;
                if (map[0][j + 1] == 1 && map[0][j - 1] == 1) {
                    side += 0;
                }
                if (map[0][j + 1] != 1 || map[0][j - 1] != 1) {
                    side += 2.5;
                }
                if (map[0][j + 1] != 1 && map[0][j - 1] != 1) {
                    side += 5;
                }
            } else {
                side += 0;
            }
        }
        System.out.println("After the last column, fencing = " + side);
    }
}

弯角工作正常,但问题是边角( for循环)。边沿穿过数组的当前行,如果数字为1,则检查它们旁边的数字,如果为0,则添加2.5m。这个问题似乎与i和j使值不正确有关,但我不太确定它们有什么问题。有人能帮我吗?

以下是当前的输出:

代码语言:javascript
复制
Corner fencing = 12.5

After the first row, fencing = 0.0

After the bottom row, fencing = 0.0

After the first column, fencing = 5.0

After the last column, fencing = 15.0

这是预期的产出:

代码语言:javascript
复制
Corner fencing = 12.5

After the first row, fencing = 5.0

After the bottom row, fencing = 10.0

After the first column, fencing = 15.0

After the last column, fencing = 20.0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-08 20:00:05

我不完全理解代码中的栅栏是什么,或者边角代表什么,但我将指出您的代码存在的几个问题,以及可能出错的地方。

1-共享局部变量:

int i,j;在多个块之间共享,因此在一个块中更改这些块肯定会影响它们在另一个块中的状态。

Sol:如果vars要具有相同的名称,则->使用命名块

2-错误条件:代码中有两个错误的条件-bottom和top for循环-

代码语言:javascript
复制
(i = 1; i > 2; i++)

这里是修改后的代码:

代码语言:javascript
复制
public class Fencing {

    public static void main(String[] args) {
        boolean b = true;
        double corner = 0;
        double core = 0;
        double side = 0;

        int[][] map = { 
            { 0, 1, 1, 0 }, 
            { 1, 1, 1, 1 }, 
            { 1, 1, 1, 1 }, 
            { 1, 1, 0, 1 } 
        };

        firstBlock:{
            int i = 0;
            int j = 0;
            for (i = 0; i < 4; i++) {
            for (j = 0; j < 4; j++) {
                if (map[i][j] != 1 && map[i][j] != 0) {
                    b = false;
                    System.out.println("--> A value of " + map[i][j] + " was found at " + i + "," + j);
                }
            }
        }
        if (b == false && i == 4) {
            System.out.println("The map is invalid");
            return;
        } else {
            System.out.println("Map is valid");
        }
        if (map[0][0] == 1) {
            corner += 5;
            if (map[1][0] == 1 && map[0][1] == 1) {
                corner += 0;
            }
            if (map[1][0] != 1 && map[0][1] != 1) {
                corner += 5;
            }
            if (map[1][0] != 1 && map[0][1] == 1 || map[1][0] == 1 && map[0][1] != 1) {
                corner += 2.5;
            }
        } else {
            corner += 0;
        }
        if (map[0][3] == 1) {
            corner += 5;
            if (map[1][3] == 1 && map[0][2] == 1) {
                corner += 0;
            }
            if (map[1][3] != 1 && map[0][2] != 1) {
                corner += 5;
            }
            if (map[1][3] != 1 && map[0][2] == 1 || map[1][3] == 1 && map[0][2] != 1) {
                corner += 2.5;
            }
        } else {
            corner += 0;
        }
        if (map[3][0] == 1) {
            corner += 5;
            if (map[3][1] == 1 && map[2][0] == 1) {
                corner += 0;
            }
            if (map[3][1] != 1 && map[02][0] != 1) {
                corner += 5;
            }
            if (map[3][1] != 1 && map[2][0] == 1 || map[3][1] == 1 && map[2][0] != 1) {
                corner += 2.5;
            }
        } else {
            corner += 0;
        }
        if (map[3][3] == 1) {
            corner += 5;
            if (map[3][2] == 1 && map[2][3] == 1) {
                corner += 0;
            }
            if (map[3][2] != 1 && map[2][3] != 1) {
                corner += 5;
            }
            if (map[3][2] != 1 && map[2][3] == 1 || map[3][2] == 1 && map[2][3] != 1) {
                corner += 2.5;
            }
        } else {
            corner += 0;
        }
        System.out.println("Corner fencing = " + corner);
        }
       secondBlock:{ 
            int i = 0;
            int j = 0;
            for (i = 1; i < 2; i++) { // Top
            if (map[0][j] == 1) {
                side += 2.5;
                if (map[i + 1][0] == 1 && map[i - 1][0] == 1) {
                    side += 0;
                }
                if (map[i + 1][0] != 1 || map[i - 1][0] != 1) {
                    side += 2.5;
                }
                if (map[i + 1][0] != 1 && map[i - 1][0] != 1) {
                    side += 5;
                }
            } else {
                side += 0;
            }
        }
        System.out.println("After the first row, fencing = " + side);}
        thirdBlock:{
            int i = 0;
            int j = 0;
            for (i = 1; i < 2; i++) { // Bottom
            if (map[i][3] == 1) {
                side += 2.5;
                if (map[i + 1][3] == 1 && map[i - 1][3] == 1) {
                    side += 0;
                }
                if (map[i + 1][3] != 1 || map[i - 1][3] != 1) {
                    side += 2.5;
                }
                if (map[i + 1][3] != 1 && map[i - 1][3] != 1) {
                    side += 5;
                }
            } else {
                side += 0;
            }
        }
        System.out.println("After the bottom row, fencing = " + side);}
        fourthBlock:{
            int i = 0;
            int j = 0;
        for (j = 1; j < 3; j++) {// Right
            if (map[3][j] == 1) {
                side += 2.5;
                if (map[3][j + 1] == 1 && map[3][j - 1] == 1) {
                    side += 0;
                }
                if (map[3][j + 1] != 1 || map[3][j - 1] != 1) {
                    side += 2.5;
                }
                if (map[3][j + 1] != 1 && map[3][j - 1] != 1) {
                    side += 5;
                }
            } else {
                side += 0;
            }
        }
        System.out.println("After the first column, fencing = " + side);}
        lastBlock:{
            int i = 0;
            int j = 0;
        for (j = 1; j < 3; j++) {// Left
            if (map[0][j] == 1) {
                side += 2.5;
                if (map[0][j + 1] == 1 && map[0][j - 1] == 1) {
                    side += 0;
                }
                if (map[0][j + 1] != 1 || map[0][j - 1] != 1) {
                    side += 2.5;
                }
                if (map[0][j + 1] != 1 && map[0][j - 1] != 1) {
                    side += 5;
                }
            } else {
                side += 0;
            }
        }
        System.out.println("After the last column, fencing = " + side);}
    }
}

产出如下:

代码语言:javascript
复制
Map is valid
Corner fencing = 12.5
After the first row, fencing = 0.0
After the bottom row, fencing = 5.0
After the first column, fencing = 10.0
After the last column, fencing = 20.0

我必须指出,first row fencing is equal to 0.0而不是5,这是因为(map[i + 1][0] != 1 && map[i - 1][0] != 1),所以您必须相应地改变这一点。

票数 0
EN

Stack Overflow用户

发布于 2016-11-08 20:44:28

我将假设您想要计算每个元素的所有外部面,即数组中的1,每个面构成一个重为2.5m的栅栏。

这并不是说它很漂亮,但它基本上应该能做你想做的事情:

代码语言:javascript
复制
public class Fencing {

public static void main(String[] args) {

  double totalFencingUnits = 0;
  double fencingUnitWeight = 2.5;

    boolean b = true;
    double corner = 0;
    double core = 0;
    double side = 0;
    int i = 0;
    int j = 0;
    int[][] map = { 
        { 0, 1, 1, 0 }, 
        { 1, 1, 1, 1 }, 
        { 1, 1, 1, 1 }, 
        { 1, 1, 0, 1 } 
    };


  for (i = 0; i < map.length; i++) {
        for (j = 0; j < map[0].length; j++) {

            if (map[i][j] != 1 && map[i][j] != 0) {
                b = false;
                System.out.println("--> An invalid value of " + map[i][j] + " was found at " + i + "," + j);
            }

          if ( map[i][j] == 1){

            //do the outer corners
            if((i == 0 && (j == 0 || j == map.length - 1)) || (i == map.length - 1 && (j == 0 || j == map.length - 1))){
              System.out.println("A corner " + map[i][j] + " was found at " + i + "," + j);
              totalFencingUnits += 2;
              switch (2*i - j  ) {
                case -3:  
                  totalFencingUnits += map[i][j - 1] > 0?0:1;
                  totalFencingUnits += map[i + 1][j] > 0?0:1;
                 break;
                case 6:  
                 totalFencingUnits += map[i - 1][j] > 0?0:1;
                 totalFencingUnits += map[i ][j + 1] > 0?0:1;
                 break;
                case 0:  
                 totalFencingUnits += map[i][j + 1] > 0?0:1;
                 totalFencingUnits += map[i +1 ][j] > 0?0:1;
                 break;
                case 3:  
                 totalFencingUnits += map[i - 1][j] > 0?0:1;
                 totalFencingUnits += map[i ][j - 1] > 0?0:1;
                 break;
                default:
                break;
              }
            }
            //do the outer sides
            else if((i == 0 && (j != 0 && j != map.length - 1)) || (i == map.length - 1 && (j != 0 && j != map.length - 1))
              || (j == 0  && (i != 0 && i != map.length - 1)) || (j == map.length - 1 && (i != 0 && i != map.length - 1))){
              System.out.println("A side " + map[i][j] + " was found at " + i + "," + j);
              totalFencingUnits ++;
              if ( i == 0){
                totalFencingUnits += map[i][j - 1] > 0?0:1;
                 totalFencingUnits += map[i + 1][j] > 0?0:1;
                totalFencingUnits += map[i][j +  1] > 0?0:1;
              }
              if (i == map.length - 1){
                totalFencingUnits += map[i][j - 1] > 0?0:1;
                 totalFencingUnits += map[i -1 ][j] > 0?0:1;
                totalFencingUnits += map[i][j +  1] > 0?0:1;
              }
              if ( j == 0){
                totalFencingUnits += map[i - 1][j] > 0?0:1;
                 totalFencingUnits += map[i][j + 1] > 0?0:1;
                totalFencingUnits += map[i + 1][j ] > 0?0:1;
              }
              if ( j == map.length - 1){
                totalFencingUnits += map[i - 1][j] > 0?0:1;
                 totalFencingUnits += map[i][j - 1] > 0?0:1;
                totalFencingUnits += map[i + 1][j ] > 0?0:1;
              }

            }
            //now do the internals blocks
            else {

              System.out.println("An internal " + map[i][j] + " was found at " + i + "," + j);
              totalFencingUnits += map[i - 1][j] > 0?0:1;
                 totalFencingUnits += map[i][j - 1] > 0?0:1;
                totalFencingUnits += map[i ][j + 1] > 0?0:1;
              totalFencingUnits += map[i + 1][j ] > 0?0:1;

            }

          }
        }
    }

    if (b == false && i == 4) {
        System.out.println("The map is invalid");
        return;
    } else {
        System.out.println("Map is valid");
        System.out.println("TOTAL FENCING UNITS: " + totalFencingUnits );
        System.out.println("TOTAL FENCING WEIGHT: " + totalFencingUnits * fencingUnitWeight);
    }



    }
}

我在编译做了这个

得到了这个输出:

地图有效

在0,1处发现侧1

在0,2处发现侧1

在1,0处发现侧1

在1,1处发现一个内部1

在1,2处发现一个内部1

在1,3处发现了侧1

在2,0发现了一侧1

在2,1发现了一个内部1

在2,2处发现了一个内部1

发现侧1在2,3处

在3,0发现了一个拐角处

发现侧1在3,1

在3,3处发现了一个拐角处

击剑单位总数: 18.0

击剑总重量: 45.0

而且,看起来我的输入的输出实际上应该是45 (即。18张脸)。你应该也考虑一下外面的边缘吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40494695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档