2013-03-13 7 views
-1

Это проблема с домашней работой, и у меня возникли проблемы с пониманием того, как я могу создать метод .add() в классе Distance.Как написать метод .add()?

класс Расстояние имеет два целочисленных переменных экземпляра:

private int feet; 
private int inches; 

Он имеет конструктор без аргументов, который инициализирует Расстояние с нулевыми ногами и ноль дюймов.

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

Он также получить/установить методы для экземпляра переменные. Мои получить/установить методы:

public void setFeet(int f){ 
    feet = f; 
} 

public void setInches(int in){ 
    inches = in; 
} 

public int getFeet(){ 
    return feet; 
} 

public int getInches(){ 
    return inches; 
} 

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

Вторая проблема заключается в создании метода add(), который добавляет другой объект Distance к себе. То есть,

w1 = new Distance(4,9); 
w2 = new Distance(3,6); 
w1.add(w2); //w1 becomes 8 feet, 3 inches. 

До сих пор у меня есть это:

public int add(Distance d) { 
    int df = d.getFeet(); 
    int di = d.getInches(); 
    int a = this.feet; 
    int b = this.inches; 
    int c = a.getFeet(); 
    int d = b.getInches(); 
    int sumInches, sumFeet, temp; 
    sumInches =di + d; 
    sumFeet = df + c; 
    if (sumInches>11) { 
     temp = sumInches-11; 
     sumFeet = sumFeet+1; 
     sumInches = temp; 
    } 
    this.feet = sumFeet; 
    this.inches = sumInches; 
} 

Но я не уверен, если это будет даже скомпилировать (я не имею доступа к компьютеру, на котором я могу установить право компилятора Теперь). Может ли кто-нибудь изучить это и объяснить мне, почему это может быть неправильно?

+0

Вы можете инициализировать свои переменные до 0 при объявлении. и ваш метод setInches (int in) неверен. вы должны установить его значение в дюймах, а не значение стопы, public void setInches (int in) { inches = in; } – Abi

+0

@Abi Это была серьезная опечатка, я копировал ее из бумаги. Извини за это. Я внес изменения. Спасибо, что поймали это. Кроме того, какие значения и инициализация I равны 0 и где я это делаю? – Chase

+1

«У меня нет доступа к компьютеру, где я могу установить компилятор прямо сейчас» - я рекомендую вам перейти к одному. Наверняка, это не лучшее использование SO, чтобы кто-то копировал/вставлял ваш код в компилятор для вас, а тем более остальную часть отладки, которую вы еще не получили, пока еще не сделали. – millimoose

ответ

1
int a = this.feet; 
int b = this.inches; 

Это немного многословным ...

int c = a.getFeet(); 
int d = b.getInches(); 

не будет компилировать, напомним, что примитивные значения (int, в нашем случае) не имеет методов.


Вот решение, (добавлена ​​поддержка списков параметров, позволяя бесконечные Distance с):

public void add(Distance... distance) { 
    for(Distance d : distance) { 
     feet += d.getFeet(); 
     if(inches + d.getInches >= 12) 
      feet++; 
     inches += d.getInches() % 12; 
    } 
} 

При этом, вы можете легко добавить, как это:

d1.add(d2, d3, d4, d5); 
+0

Можете ли вы объяснить, что делают первые две строки? Я никогда не видел, чтобы метод принимал аргумент типа «расстояние ...»; и я знаю, что делает цикл for, но я никогда не видел цикл for с этой формой. Что он делает точно? – Chase

+1

_Varargs_ были добавлены к языку версии 1.5, что позволяет добавлять бесконечные объекты в качестве аргументов, затем они преобразуются в массив и передаются как фактический аргумент. Объект _enhanced for-loop_, или обычно называемый _for-each loop_, также был добавлен к языку версии 1.5, предоставляя простой способ перебора массивов и коллекций. – Mordechai

+0

для (расстояние d: расстояние) читается как для d на расстоянии? Почему не просто ноги + = distance.getFeet()? – Chase

0

Основная идея правильно, но вы ошиблись, подумайте:

public int add(Distance d){ 
    feet += d.feet; 
    inches += d.inches; 
    if(inches >= 12){ 
    inches = inches - 12; 
    feet++; 
    } 
} 

Самой большой проблемой я видел, был

int a = this.feet; 
int d = a.getFeet(); 

здесь является ИНТ не объект Расстояние, следовательно, вы не можете назвать getFeet()

+0

'feet = feet ++', что? Подробный. – Mordechai

+0

lol, да, исправлено это сейчас ... –

+0

this.feet не должно быть никаких проблем; – Joe2013

0

Update надстройка(), чтобы: -

public int add(Distance d) { 
    int df = d.getFeet(); 
    int di = d.getInches(); 
    int a = this.feet; 
    int b = this.inches; 

ОШИБКА: c и dintegers и не Distance объекты.Вам не требуются целые числа c and d.

int sumInches, sumFeet, temp; 
    sumInches =di + b; 
    sumFeet = df + a; 
    if (sumInches>11) { 
     temp = sumInches-11; 
     sumFeet = sumFeet+1; 
     sumInches = temp; 
    } 
    this.feet = sumFeet; 
    this.inches = sumInches; 
0

Ваша проблема здесь,

int a = this.feet; 
int b = this.inches; 
int c = a.getFeet(); 
int d = b.getInches(); 

Поскольку а и Ь являются ИНТ переменной. У них нет методов getFeet() и getInches(). Измените метод Add() для

public int add(Distance d) { 
    int df = d.getFeet(); 
    int di = d.getInches(); 
    int sumInches, sumFeet, temp; 
    sumInches =di + this.inches; 
    sumFeet = df + this.feet; 
    if (sumInches>11) { 
     temp = sumInches-11; 
     sumFeet = sumFeet+1; 
     sumInches = temp; 
    } 
    this.feet = sumFeet; 
    this.inches = sumInches; 
} 
1

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

Ваш геттер/сеттер выглядит правильно; точка их равна encapsulate переменным-членам, чтобы они не были «модифицированы» случайно (ограничивая доступ). Вероятно, вы хотите инициализировать переменные-члены до некоторого значения «по умолчанию» - в этом случае я инициализировал их ниже 0. Примечание: По умолчанию компилятор будет инициализировать их в 0.

private int feet = 0; 
private int inches = 0; 

public void setFeet(int f){ 
    feet = f; 
} 

public void setInches(int in){ 
    feet = in; 
} 

public int getFeet(){ 
    return feet; 
} 

public int getInches(){ 
    return inches; 
} 

Моя вторая проблема заключается в создании метода Add().

О вашем методе «добавить» вы, вероятно, захотите изменить свои локальные переменные как нечто более «описательное», что в долгосрочной перспективе поможет «читаемости» и «ремонтопригодности».

Поскольку ваш класс «Расстояние» уже содержит переменные-члены «ноги» и «дюймы», нет смысла устанавливать эти значения в локальную переменную. Вы можете просто получить к ним доступ непосредственно - вместе с любым из получателей/сеттеров класса.

public int add(Distance newDistance) { 

    int newDistanceFeet = newDistance.getFeet(); 
    int newDistanceInches = newDistance.getInches(); 

    int sumInches = newDistanceInches + this.getInches(); 
    int sumFeet = newDistanceFeet + this.getFeet(); 

    // Now we can check to see if any conversion are needed.. Note: 12 inches = 1 foot 
    // 
    sumInches += (sumInches % 12); 
    sumFeet += (sumInches/12); 

    // Now set the newly added inches/feet to the class's member variables 
    // 
    this.setFeet(sumFeet); 
    this.setInches(sumInches); 
} 
+1

Переменные экземпляра 'int' автоматически присваиваются 0. – Mordechai

0

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

public void add(Distance distance) { 

     int extraFeet=0; /*Intializing the extra Feet*/ 
     extraFeet = (this.inches+distance.getInches())/11; /*Calculating the additional feet*/ 
     if(extraFeet >0) 
      this.inches = (this.inches+distance.getInches())%11; /*if extra feet is greater than zero thn the remainder is the inches*/ 
     else 
      this.inches +=distance.getInches(); /*else teh remainder is the sum of the inches*/ 
     this.feet += (distance.getFeet()+extraFeet); 


    } 
1
public void setInches(int in){ 
    feet = in; 
} 

Я предполагаю, что это опечатка, потому что вы присваивающие по стоимости ноги вместо дюймов.

public int getInches(){ 
    return Inches; 
} 

Другая опечатка. Java чувствительна к регистру, поэтому «Inches» не совпадает с «дюймами». Помимо этого, геттеры/сеттеры выглядят прекрасно.

Что касается метода Add() ... Там нет причин, чтобы создать эти «а», «б», «в» и «г» переменные

int a = this.feet; 
int b = this.inches; 
int c = a.getFeet(); 
int d = b.getInches(); 

Вы можете просто использовать this.feet и это напрямую. Это не неправильно, просто лишний и загромождает код. Кроме того, я настоятельно рекомендую всегда создавать значимые имена переменных. «a», «b», «c» код трудно читать. Имена переменных должны быть выразительными. Кроме того, в вашем алгоритме вам нужно будет вычесть 12 из суммированных дюймов. Таким образом, метод дополнения может быть написан более кратко, как это:

public void add(Distance d) 
{ 
    int newFeet = this.feet + d.feet; 
    int newInches = this.inches + d.inches; 
    if (newInches > 11) 
    { 
    newFeet++; 
    newInches = newInches - 12; 
    } 
    this.feet = newFeet; 
    this.inches = newInches; 
} 

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