Нужно исправить для цикла - PullRequest
       2

Нужно исправить для цикла

0 голосов
/ 11 октября 2019

Я беру онлайн-классы, что затрудняет получение помощи, поэтому я здесь. На этой неделе лекция о вложенных циклах. Они сбивают меня с толку. Я в настоящее время застрял на этой проблеме.

С учетом numRows и numColumns выведите список всех мест в театре. Строки пронумерованы, столбцы обозначены буквами, как в 1A или 3E. Напечатайте пробел после каждого места, в том числе после последнего. Используйте отдельные операторы печати для печати строки и столбца. Пример: numRows = 2 и numColumns = 3 отпечатков:

1A 1B 1C 2A 2B 2C>

Я испробовал множество возможных решений, которые дали много неправильных результатов. Это моё текущее решение

    int numRows;
      int numColumns;
      int currentRow;
      int currentColumn;
      char currentColumnLetter;

      numRows = scnr.nextInt();
      numColumns = scnr.nextInt();

      currentColumnLetter = 'A'; 

         for (currentRow = 1; currentRow <= numRows; currentRow++)
         {

             for (currentColumn = 1; currentColumn < numColumns; currentColumn++)

             {
               System.out.print(currentRow);
               System.out.print(currentColumnLetter + " "); 

             }

              if( currentColumn == numColumns)
               {
                  currentColumnLetter++;
               }
         }

Код даёт такой результат

1A 1A 2B 2B 

Желаемый результат:

1A 1B 2A 2B

Я работаю над этим уже двадни и это делает меня серьезно разочарован. Заранее благодарен за любую помощь.

Ответы [ 3 ]

1 голос
/ 11 октября 2019

Эй, дело глубже, чем можно подумать. Я всегда находил эти циклы над примерами персонажей мерзкими, я получил это на моем последнем собеседованииИтак, мы идем:

Если упражнение будет таким: строки, полученные из 1..n, столбцы для 1..n, выходные данные должны быть "1/1, 1/2 ... 3 /1, 3/2 ... ", это было бы прямо, не так ли?

public void seatnumbersNumbersOnly() {
        int numRows = 3;
        int numColumns = 3;

        for (int currentRow = 1; currentRow <= numRows; currentRow++) {
            for (int currentColumn = 1; currentColumn < numColumns; currentColumn++) {
                System.out.print(currentColumn + "/" + currentRow + " ");
            }
        }
    }

Но задача другая, им нужны буквы для столбцов. Давайте грубо форсировать его на той же основе.

public void seatnumbersNumbersMappedAgain() {
String[] seatLetters = new String []{"A", "B", "C"}; // so many letters as there are columns. Note: array index is 0-based
int numRows = 3;
int numColumns = 3;

for (int currentRow = 1; currentRow <= numRows; currentRow++) {
    for (int currentColumn = 1; currentColumn < numColumns; currentColumn++) {
        // seatLetters[i] is a string "s", not a char 'c', so everything's fine
        System.out.print(seatLetters[currentColumn - 1] + currentRow + " "); // -1: seatLetters indexing is zero based
    }
}

}

Но тогда: в Java символы и байты взаимозаменяемы, пока вы находитесь в диапазоне ascii, вы можете назначитьсимвол, буквальный для байта, и наоборот.

@Test
public void charByteEquivalence() {
    // check out http://www.asciitable.com/
    char ca = 'A';
    byte ba = 0x41;
    assertEquals(ca, ba);

    ca = 0x41;
    ba = 'A';
    assertEquals(ca, ba);
}

Это означает, что вы также можете использовать переменную char непосредственно для зацикливания. Но будьте осторожны, сборка выходной строки становится беспорядочной, так как вам нужно следить за тем, что получает "+", с чем. Требуются значения String / char для столбцов и числа для строк. A "string" + char/byte/int ... становится строкой. char + int становится и int? байт? символ? Просто, конечно, не строка. Раскрытие: Я пробовал и ошибался конкатенацию строк, и она становится int. Некоторые примеры неявных преобразований типов: здесь , официальная ссылка здесь .

    public void seatnumbersChar() {
    int numRows = 3;
    int numColumns = 3;

    char firstColumnLetter = 'A';
    for (int currentRow = 1; currentRow <= numRows; currentRow++) {
        for (char currentColumn = firstColumnLetter; currentColumn < firstColumnLetter + numColumns; currentColumn++) {
            // at this point you have to watch out currentColumn + currentRow + " " will get evaluated left to right

            // currentRow is an int
            // currentColumn becomes an int when "+"ed with currentRow 
            // so currentRow + currentColumn would add two numbers instead of concatenating 2 strings, therefore
            // an explicit conversion to string is needed for one of the arguments
            System.out.print(currentColumn + String.valueOf(currentRow) + " ");
        }
    }
}

Тот же пример прохождения байтового маршрута, похожий беспорядок с конкатенацией строк,но не совсем то же самое.

public void seatnumbersByte() {
    int numRows = 3;
    int numColumns = 3;

    byte firstColumnLetter = 'A';
    for (int currentRow = 1; currentRow <= numRows; currentRow++) {
        for (byte currentColumn = firstColumnLetter; currentColumn < firstColumnLetter + numColumns; currentColumn++) {
            // same case other trick: (currentRow + " ") forces the result to be a string due to the + " "
            // currentColumn here is declared as byte, when concatenated to a string the numeric representation would be taken (wtf...?)
            // therefore a cast to char is needed "(char) currentColumn"
            // what's left now ? (currentRow + " ") is a string
            // "(char) currentColumn" is a char
            // a char "+" a string is a string
            System.out.print((char) currentColumn + (currentRow + " "));
        }
    }
}

Надеюсь, я отомстил за последнее интервью. Все равно получили работу;)

1 голос
/ 11 октября 2019

Вы довольно близки.

Однако вы неправильно обрабатываете имя столбца. Когда начинается каждая строка, вам нужно возвращаться к A и увеличивать его на единицу для каждого столбца:

for (currentRow = 1; currentRow <= numRows; currentRow++) {
    currentColumnLetter = 'A'; //Starting a new row, reset the column to `A`
    for (currentColumn = 1; currentColumn < numColumns; currentColumn++){
        System.out.print(currentRow); 
        System.out.print(currentColumnLetter + " ");
        currentColumnLetter++;
    }
}

Также довольно странно использовать индексирование на основе 1. Индексирование в Java (как и во многих других языках) должно начинаться с 0. Ваш цикл столбцов в результате не выполняет достаточное количество итераций - если вы установите numColumns в 2, вы напечатаете только один столбец.

Было бы более идиоматично писать циклы так:

for (currentRow = 0; currentRow < numRows; currentRow++) {
    currentColumnLetter = 'A';
    for (currentColumn = 0; currentColumn < numColumns; currentColumn++) {
        System.out.print(currentRow + 1);
        System.out.print(currentColumnLetter + " ");
        currentColumnLetter++;
    }
}
0 голосов
/ 11 октября 2019

Вам нужно увеличить currentColumnLetter внутри внутреннего цикла. Помните, что для каждой строки вам нужно пройти через каждый столбец. Вот почему вы вкладываете циклы, верно?

Попробуйте:

for (currentRow = 1; currentRow <= numRows; currentRow++) {
    currentColumnLetter = 'A';
    for (currentColumn = 1; currentColumn <= numColumns; currentColumn++) {
        System.out.print(currentRow);
        System.out.print(currentColumnLetter + " "); 
        currentColumnLetter++ 
    }
}

Вам не нужно это условие во внешнем цикле:

if( currentColumn == numColumns)
{
    currentColumnLetter++;
}
...