Почему эта линия печатается дважды? - PullRequest
0 голосов
/ 14 ноября 2018

Поэтому я помогаю репетитору по классу алгебры 2 в моей местной средней школе, и в настоящее время класс просматривает матрицы.Хотя не там, они в конечном итоге доберутся до умножения матриц.После прохождения курса компьютерных наук в прошлом году и изучения Java учитель, которому я помог, подумал, что мне следует попытаться написать программу для нескольких матриц.

В настоящий момент мне нужно определить числа для первого массива, который содержитинформация для первой матрицы.Однако у меня есть небольшая проблема.Как показано на этом рисунке: enter image description here

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

Код:

package matrixmultiplication;
import java.util.*;

public class MatrixMultiplication {

public static void main(String[] args) {
    System.out.println("What is the size of the first matrix?");
    int matrix1Rows = matrixRows();
    int matrix1Columns = matrixColumns();
    int[] matrix1 = new int[matrix1Rows * matrix1Columns];
    doubleSpace();
    System.out.println("What is the size of the second matrix?");
    int matrix2Rows = matrixRows();
    int matrix2Columns = matrixColumns();
    int[] matrix2 = new int[matrix2Rows * matrix2Columns];
    doubleSpace();
    if (matrix1Columns != matrix2Rows){
        System.out.println("These cannot be multiplied!");
        System.exit(0);
    } else {
        matrix1Numbers(matrix1Rows, matrix1Columns);
    }
}

public static int matrixRows(){
    System.out.print("Rows:");
    Scanner rowSc = new Scanner(System.in);
    int rows = rowSc.nextInt();
    return rows;
}

public static int matrixColumns(){
    System.out.print("Columns:");
    Scanner colSc = new Scanner(System.in);
    int cols = colSc.nextInt();
    return cols;
}

public static int[] matrix1Numbers(int rows, int cols){
    int[] numb = new int[rows * cols];
    for (int j = 0; j <= numb.length; j += rows){
        for (int i = 1; i <= cols; i++){
            for (int k = 1; k <= rows; k++){
                System.out.println("What is the value for index (" + k + "," + i + ")?");
                Scanner inp = new Scanner(System.in);
                if (j + k <= numb.length){
                    numb[j + k - 1] = inp.nextInt();
                }
            }
        }
    }
    for (int i = 0; i < numb.length; i++){
        System.out.println(numb[i]);
    }
    return numb;
}

public static void doubleSpace(){
    System.out.println();
    System.out.println();
}

}

Я использую NetBeans 8.2 и последнюю рабочую версию Java для NetBeans.

1 Ответ

0 голосов
/ 14 ноября 2018

Я не знаком с пакетом матричного умножения, так что я могу быть здесь бессвязным.

for (int j = 0; j <= numb.length; j += rows){

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

Кроме того, Кевин Андерсон упоминает об этом выше.Вы могли бы полностью избежать этой проблемы, если бы вы возвращали массив типа int двойным вместо хранения всех значений в матрице в одном измерении.Лично я чувствую, что это имеет больше смысла.

Просто придираюсь, но я не буду делать новый сканер каждый раз, когда вы захотите использовать его в другом методе.Вы можете просто создать поле в верхней части вашего класса, один раз создать его экземпляр в методе main, а затем передать его в качестве параметра всем методам, использующим сканер.

...