Передача значений переменных из другого метода - PullRequest
4 голосов
/ 27 ноября 2011

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

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

Файл метода:

package Fractions;
import java.util.Scanner;

public class FractionValues
{
    // Declare integer class variables for package Fractions
    int fracNum1;
    int fracDenom1;
    int fracNum2;
    int fracDenom2;

    // Obtain four integers from user input and output to console as two fractions
    public static void getFractions(int fracNum1, int fracDenom1, int fracNum2, int fracDenom2)
    {
        Scanner inInt = new Scanner(System.in);

        System.out.println("Enter an integer for the numerator of the first " +
                                    "fraction:  ");
            fracNum1 = inInt.nextInt();

        System.out.println("Enter an integer for the denominator of the first " +
                                    "fraction:  ");
            fracDenom1 = inInt.nextInt();

        System.out.println("Enter an integer for the numerator of the second " +
                                    "fraction:  ");
            fracNum2 = inInt.nextInt();

        System.out.println("Enter an integer for the denominator fo the second " +
                                    "fraction:  ");
            fracDenom2 = inInt.nextInt();
        System.out.println("===================================================" +
                                    "=================");
    }

    // Return values of variables from input for use in other classes
    public int getFracNum1()        {return fracNum1;}
    public int getFracDenom1()      {return fracDenom1;}
    public int getFracNum2()        {return fracNum2;}
    public int getFracDenom2()      {return fracDenom2;}    
}  

основной файл метода:

package Fractions;
public class TestFractions2
{
    public static void main(String[] args)
    {
        // Call getFractions method to assign variables from user input
        FractionValues newFracNum1 = new FractionValues();
        newFracNum1.getFracNum1();

        FractionValues newFracDenom1 = new FractionValues();
        newFracDenom1.getFracDenom1();

        FractionValues newFracNum2 = new FractionValues();
        newFracNum2.getFracNum2();

        FractionValues newFracDenom2 = new FractionValues();
        newFracDenom2.getFracDenom2();

        System.out.println("You entered " + newFracNum1.getFracNum1() + "/" + newFracDenom1.getFracDenom2() + " and " +
                                     newFracNum2.getFracNum2() + "/" + newFracDenom2.getFracDenom2() + " as your fractions.");
    }
}

По крайней мере, после некоторой борьбы оба файла теперь компилируются. Тем не менее, приложение не работает. Это вывод, который я получаю:

Вы указали 0/0 и 0/0 как свои дроби.

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



Основываясь на ценном отзыве ниже и ограничениях задания, я получил следующее:

package Fractions;
import java.util.Scanner;

public class FractionValues
{
    int fracNum1;
    int fracDenom1;
    int fracNum2;
    int fracDenom2;

    Scanner inInt = new Scanner(System.in);

    // Obtain four integers from user input
    public int getFracNum1()
    {
        System.out.println("Enter an integer for the first numerator:  ");
        return fracNum1 = inInt.nextInt();
    }

    public int getFracDenom1()      
    {
        System.out.println("Enter an integer for the first denominator:  ");
        return fracDenom1   = inInt.nextInt();
    }

    public int getFracNum2()
    {
        System.out.println("Enter an integer for the second numerator:  ");
        return fracNum2     = inInt.nextInt();
    }

    public int getFracDenom2()
    {
        System.out.println("Enter an integer for the second denominator:  ");
        return fracDenom2   = inInt.nextInt();
    }
}

и основной способ применения:

package Fractions;
public class TestFractions2
{
    public static void main(String[] args)
    {
        // Call FractionValues methods to assign variables from user input
        FractionValues newFracNum1 = new FractionValues(); 
        FractionValues newFracDenom1 = new FractionValues(); 
        FractionValues newFracNum2 = new FractionValues(); 
        FractionValues newFracDenom2 = new FractionValues(); 

        System.out.println("You entered " + newFracNum1.getFracNum1() + "/" + 
                newFracDenom1.getFracDenom2() + " and " + newFracNum2.getFracNum2() +
                "/" + newFracDenom2.getFracDenom2() + " as your fractions."); 
    }
}

Оба файла компилируются правильно, и я получаю следующий ожидаемый результат:


Введите целое число для первого числителя:
2 Введите целое число для второго знаменателя:
5 Введите целое число для второго числителя:
6 Введите целое число для второго знаменателя:
3 Вы ввели 2/5 и 6/3 как свои дроби.


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

Ответы [ 3 ]

3 голосов
/ 27 ноября 2011

Есть несколько проблем с кодом.Во-первых, вывод, который вы видите, является продуктом реализации по умолчанию toString(), которая находится в классе Object (из которого в конечном итоге происходят все классы, включая GetFractions).Переопределите этот метод, чтобы вернуть строковое представление ваших экземпляров:

@Override
public String toString() {
  return ...
}

public static void main(String[] args) {
  ...
  System.out.println("..." + newFracNum1 + "...");
}

или вместо передачи экземпляра в System.out.println() передать результат вызова метода доступа к члену (такие методы известны как getters):

public double getSomeValue() {
  return ...
}

public static void main(String[] args) {
  ...
  System.out.println("..." + newFracNum1.getSomeValue() + "...");
}

Обратите внимание, что double и другие примитивные типы будут автоматически преобразованы в строки.

Во-вторых, ваш статический метод GetFractions() изменяет свои аргументы, что неэффективно (никто не увидит изменения, так какони передаются по значению).Метод должен либо изменять переменные экземпляра с таким же именем существующего экземпляра, и тогда он не должен быть статическим, либо это должен быть фабричный метод, создающий новые экземпляры на основе данных, предоставленных пользователем, и в этом случае он передает значения конструктору.или это должен быть сам конструктор.В любом случае, вы не хотите изменять параметры метода.Вот схема трех решений:

Нестатический метод, который считывает данные из входного потока:

public void fromStream(InputStream inStream) {
  // Read data from inStream into instance variables fracNum1, fracDenom1,...
}

Статический фабричный метод:

public static GetFractions fromStream(InputStream inStream) {
  int fracNum1,... ;
  // Read data from inStream into local variables fracNume1, ...
  return new GetFractions(fracNum1, ...);
}

Конструктор:

public GetFractions(InputStream inStream) {
  // Read data from inStream to initialize instance variables fracNum1, fracDenom1,...
}

Также обратите внимание, что передача InputStream во все эти методы обеспечивает большую гибкость, чем жесткое кодирование System.in.

В-третьих, вам следует пересмотреть соглашение об именах.Вызывать статический метод так же, как и класс, хотя это возможно, обычно плохая практикаТакже желательно вызывать классы и объекты с выражениями существительными, а методы с выражениями глаголов.Это помогает разрабатывать ваши классы и делает код более читабельным.GetFractions больше подходит как имя метода, а не класса.Fractions будет лучше для имени класса.

1 голос
/ 27 ноября 2011

ваш код неявно вызывает метод toString () вашего класса GetFractions. Поскольку вы не перезаписали его, это метод toString () объекта (суперкласса). Метод toString () из объектов возвращает что-то вроде имени класса плюс хэш-код (см. http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#toString%28%29)., это то, что вы видите в своих выходных данных.

у вас есть две возможности: переписать toString или изменить свой код, как упомянул Eng.Fouad.

1 голос
/ 27 ноября 2011

Причина, по которой он печатает 0 с после того, как вы исправили код, заключается в том, что вы на самом деле никогда не вызываете статический метод GetFractions, который НЕ является конструктором.Никогда не называйте метод как конструктор, возможно , только если это статический фабричный метод.

Также с помощью оригинального кода вы печатаете GetFractions объекты, вызывающие вызов toStringВы не перезаписали.Также обратите внимание, что вызовы get ... не имеют никакого эффекта, поскольку возвращаемые значения нигде не хранятся.

...