цикл while для логического пользовательского ввода - PullRequest
1 голос
/ 21 февраля 2011

После запуска программы по большей части (помощь приветствуется :)). Все, что мне было нужно, это добавить цикл while, чтобы пользователь получал опцию меню столько раз, сколько он хочет. Он начинает выдавать мне ошибки как "; ожидается" в строке, где продолжить переключается в ложь. Вот код.

import java.io.*;
import java.util.*;

class Matrix {

    double[][] element;
    int rows, cols;

    Matrix(int rows, int cols) {
        this.rows = rows;
        this.cols = cols;
        element = new double[rows][cols];
    }

    public double getValue(int row, int col) {
        return element[row][col];
    }

    public void setValue(int row, int col, double value) {
        element[row][col] = value;
    }

    public int getNoRows() {  // returns the total number of rows
        return rows;
    }

    public int getNoCols() { // returns the total number of cols
        return cols;
    }

     // The methods for the main calculations
     public Matrix AddMatrix(Matrix m2) {
        int row1 = getNoRows();
        int col1 = getNoCols();
        Matrix result = new Matrix(row1, col1);

        for (int i = 0; i < row1; i++) {
            for (int j = 0; j < col1; j++) {
                result.setValue(i, j, this.getValue(i, j) + m2.getValue(i, j));
            }
        }
        return result;
    }

    public Matrix MultiplyMatrix(Matrix m2) {
        if (this.getNoCols() != m2.getNoRows()) {
            throw new IllegalArgumentException("matrices can't be multiplied");
        }
        int row2 = this.getNoRows();
        int col2 = m2.getNoCols();
        Matrix result = new Matrix(row2, col2);
        for (int i = 0; i < row2; i++) {
            for (int j = 0; j < col2; j++) {
                result.setValue(i, j, result.getValue(i, j) + this.getValue(i, j) * m2.getValue(i, j));
            }
        }
        return result;

    }

    public Matrix TransposeMatrix() {
        int row3 = this.getNoCols();
        int col3 = this.getNoRows();
        Matrix result = new Matrix(row3, col3);
        for (int i = 0; i < row3; i++) {
            for (int j = 0; j < col3; j++) {
                result.setValue(i, j, this.getValue(j, i));
            }
        }
        return result;

    }

    public void DisplayMatrix() {
        for (int i = 0; i < this.getNoRows(); i++) {
            for (int j = 0; j < this.getNoCols();
                    j++) {
                System.out.print((this.getValue(i, j)) + " ");
            }
            System.out.print("\n");
        }
      }
}


public class Lab1 {

    public static void main(String args[]) throws FileNotFoundException {

        int choice;
        Scanner in = new Scanner(System.in);


        Boolean continue = true;
        while (continue){   

        System.out.println("Enter your choice /n");
        choice = in.nextInt();

        System.out.println("1. Add two matrices \n");
        System.out.println("2. Multiplymatrix two matrices \n");
        System.out.println("3. Take transpose of a matrix \n");
        System.out.println("4. Display a matrix \n");
        System.out.println("5. Exit \n");

        if (choice == 1) {
            Matrix m1 = MatrixReader();
            m1.DisplayMatrix();
            Matrix m2 = MatrixReader();
            m2.DisplayMatrix();
            Matrix m3 = new Matrix(m1.getNoRows(), m1.getNoCols());
            m3 = m1.AddMatrix(m2);
            m3.DisplayMatrix();
        }

        if (choice == 2) {
            Matrix m1 = MatrixReader();
            m1.DisplayMatrix();
            Matrix m2 = MatrixReader();
            m2.DisplayMatrix();
            Matrix m3 = new Matrix(m1.getNoRows(), m2.getNoCols());
            m3 = m1.MultiplyMatrix(m2);
            m3.DisplayMatrix();
        }



        if (choice == 3) {
            Matrix m1 = MatrixReader();
            m1.DisplayMatrix(); 
            Matrix m3 = new Matrix(m1.getNoRows(), m1.getNoCols());
            m3 = m1.TransposeMatrix();
            m3.DisplayMatrix();
        }

        if (choice == 4) {
            System.out.println("Will need to call the DisplyMatrix method for the object \n");
        } 

        if (choice == 5) {
            continue = false;
        }
        else {
            System.out.println("Incorrect input. Kindly enter again \n");
        }
      }
    }

    public static Matrix MatrixReader() throws FileNotFoundException {
        System.out.println("Give the filename for the matrix");
        Scanner filescanner = new Scanner(System.in);
        Scanner scanner = new Scanner(new File(filescanner.nextLine()));
        scanner.nextLine(); // removes the first line in the input file
        String rowLine = scanner.nextLine();
        String[] arr = rowLine.split("=");
        int rows = Integer.parseInt(arr[1].trim());

        String colLine = scanner.nextLine();
        String[] arr2 = colLine.split("=");
        int cols = Integer.parseInt(arr2[1].trim());
        Matrix test = new Matrix(rows, cols);

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                test.setValue(i, j, scanner.nextDouble());
            }
        }


        return test;

   }
}

Ответы [ 4 ]

3 голосов
/ 21 февраля 2011

Все выглядит довольно хорошо, кроме

Boolean continue = true;

и

continue = false;

и т. Д.

continue является зарезервированным словом и можетне должен использоваться в качестве идентификатора.Переименуйте переменную в cont или что-то подобное.

И, кстати, я бы порекомендовал вам использовать boolean вместо Boolean в этом приложении.

Кроме того, я считаю,в ваших if-структурах есть ошибка:

if (choice == 1)
    ...
if (choice == 2)
    ...
if (choice == 5)
    ...
else
    ...

Ветвь else будет использоваться во всех случаях, когда choice != 5 (то есть, даже если выбрано значение 1, 2, 3, .... Так что, возможно, вы захотите изменить его на

if (choice == 1)
    ...
else if (choice == 2)
    ...
else if (choice == 3)
    ...
else
    ...

Наконец, вы также можете рассмотреть возможность использования switch для выбора:

switch (choice) {

case 1:
    ...
    break;

case 2:
    ...
    break;

...

default:
    ...
}
1 голос
/ 21 февраля 2011

Чтобы избежать получения ошибки «m1 уже определен», напишите переключатель следующим образом (включая фигурные скобки):

switch (choice) {

case 1: {
    ...
    break;
  }

case 2: {
    ...
    break;
  }

...

default: {
    ...
  }
}
1 голос
/ 21 февраля 2011

Я не уверен, может ли это вызвать конфликты, но «продолжение» - это тоже утверждение в Java.Возможно, изменив имя переменной continue, ваша проблема будет решена.Прилагаемая ссылка указывает на то, как continue используется в качестве оператора в Java: http://download.oracle.com/javase/tutorial/java/nutsandbolts/branch.html И что вы также можете сделать, это сделать оператор switch () из имеющейся у вас конструкции if (), но это что-то по вкусу:)

0 голосов
/ 21 февраля 2011

Если вы преобразовали в 'switch', объявите 'Matrix m1 = null;' как раз перед оператором switch. И в инициализации каждого «случая» просто используйте «m1 = new MatrixReader ()». Сделайте то же самое для переменной 'm2'.

...