Почему для l oop in java не будет никакой разницы, присутствует он или нет - PullRequest
0 голосов
/ 20 июня 2020

В моей программе в определенной функции мне нужно заполнить квадрат 3x3 массива 9x9. На первый взгляд это кажется таким же тривиальным, как кажется, но почему-то один for () l oop не работает должным образом. Я спросил двух своих друзей и несколько раз проверил код, но все еще не могу найти ни одной ошибки, все работает нормально, если мы не считаем одну для функции. Я попытался поменять его на другой l oop, но он тоже не работал. Ниже я привожу свой код и результат. Я пытался поискать в Интернете аналогичную проблему, но не нашел. Заранее спасибо!

Код:

import java.util.Random;

public class ttabela
{

    public static void main(String[] args) {
        boolean bylo[] = new boolean[10];
        int tabela[][] = new int[9][9];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                tabela[i][j] = 0;
            }
        }

        wypelnianiePrzekatnych(bylo, tabela,0,2);
        clear(bylo);
        System.out.println("");
        for(int i=0;i<3;i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(tabela[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println("");
        for(int x=0;x<9;x++)
            System.out.print(tabela[0][x]+" ");
    }
    static int RandomBeetween ( int min, int max)
    {
        Random random = new Random();
        int a1 = random.nextInt(max - min);
        int a2 = a1 + min;
        return a2;
    }
        static void wypelnianiePrzekatnych(boolean[] bylo, int[][] tabela,int i,int j){//i=0 j=2

            int  a = i,b=i ;

            for (;a < (j+1);a++) { //This one doesnt make any difference
                for (;b < (j+1); b++) {
                    System.out.println("p "+a+" "+b+" k");

                    tabela[a][b] = RandomBeetween(1, 10);
                    System.out.println(tabela[a][b]);
                    if (bylo[tabela[a][b]] == true) {
                        do {
                            tabela[a][b] = RandomBeetween(1, 10);

                        }while (bylo[tabela[a][b]] == true);
                        bylo[tabela[a][b]] = true;
                        System.out.println(tabela[a][b]);
                    }
                    else {
                        if (bylo[tabela[a][b]] == false)
                            bylo[tabela[a][b]] = true;
                        System.out.println(tabela[a][b]);


                    }

                }
            }
        }
        static void clear(boolean[] bylo)
        {
            for(int h=0;h<10;h++)
                bylo[h]=false;
        }
        /*public static void wypelnianieReszty()
            {

            }*/
    }

Результат:

p 0 0 k
7
7
p 0 1 k
8
8
p 0 2 k
3
3

7 8 3 
0 0 0 
0 0 0 

7 8 3 0 0 0 0 0 0 

1 Ответ

0 голосов
/ 20 июня 2020

Проблема в том, что ваш внутренний l oop будет выполняться только один раз, поэтому внешнему l oop нечего запускать после первой итерации.

Я объясню более подробно.

Вы начинаете с:

 int  a = i,b=i ;

Допустим, мы передали (..., 0, 2), как вы. Итак, a = 0, b = 0.

Внешний для l oop будет работать нормально, как и ожидалось - код будет работать до a > (j+1), и здесь нет ничего плохого.

Проблема на самом деле со вторым для l oop:

for (;b < (j+1); b++) {

Для первой итерации это будет работать, как ожидалось. Но в любое время после этого он никогда не запустится - потому что вы уже увеличили b, так что b == (j+1).

Я считаю, что есть довольно простое решение, если я правильно интерпретировал ваши требования:

int  a = i;
int b;

for (;a < (j+1);a++) { //This one doesnt make any difference
    b = i
    for (;b < (j+1); b++) {

Это работает, потому что он сбрасывает значение b перед каждой итерацией для l oop, поэтому он не останавливается немедленно.

Надеюсь, это поможет! Не стесняйтесь задавать любые вопросы в комментариях.

...