Если бы я был вынужден, по-видимому, большим зеленым и особенно уродливым троллем, маскирующимся под учителя программирования, использовать несколько панелей JOption для ввода и вывода, то вот как я бы решил эту проблему.Это предназначено только для вашей информации ... если вы сдадите это как свою собственную работу, ваш учитель почувствует запах крысы, и у троллей тоже есть гугл.
package forums;
import javax.swing.JOptionPane;
import java.text.DecimalFormat;
/**
* Compares total cost of mortgages (aka ordinary annuity certains)
*/
public class MortgageCalculator
{
public static void main(String[] args)
{
// 1. input
final double price = Enter.aDouble("the purchase of the property");
final double deposit = Enter.aDouble("down payment");
Loan.setPrinciple(price - deposit);
int numLoans = Enter.anInteger("number of loans to compare");
Loan[] loans = new Loan[numLoans];
for ( int i=0; i<numLoans; ++i ) {
loans[i] = new Loan(
Enter.aDouble("Annual interest rate for Loan " + (i+1) + " (eg: 6.75)") / 100.0 / 12.0
, Enter.anInteger("number of years for Loan " + (i+1) + " (eg 20)") * 12
);
}
// 3. Output
final String caption =
"Principle " + Format.money(Loan.getPrinciple())
+ " = Price " + Format.money(price)
+ " - Deposit " + Format.money(deposit);
StringBuilder results = new StringBuilder(64 + numLoans * 64);
results.append("Monthly Rate, Months, Monthly Repayment, Total Repayments\n");
for ( Loan l : loans ) {
results.append(String.format("%5s, %d, %13s, %13s\n"
, Format.percent(l.rate)
, l.periods
, Format.money(l.payment())
, Format.money(l.totalPayment())
));
}
JOptionPane.showMessageDialog(null, results.toString(), caption, JOptionPane.INFORMATION_MESSAGE);
}
static class Format
{
static java.text.Format MONEY = new DecimalFormat("$#,###.##");
static String money(double amount) {
return MONEY.format(amount);
}
static java.text.Format PERCENT = new DecimalFormat("0.###%");
static String percent(double amount) {
return PERCENT.format(amount);
}
static StringBuilder join(String between, Object... values) {
StringBuilder result = new StringBuilder(values.length * 16);
if ( values.length > 0 ) {
result.append(values[0].toString());
for ( int i=1; i<values.length; ++i ) {
result.append(between)
.append(values[i].toString());
}
}
return result;
}
} // end class Format
static class Enter
{
public static int anInteger(String fieldDesc) {
return Integer.parseInt(JOptionPane.showInputDialog("Enter the "+ fieldDesc));
}
public static double aDouble(String fieldDesc) {
return Double.parseDouble(JOptionPane.showInputDialog("Enter the "+ fieldDesc));
}
} // end class Enter
} // end class MortgageCalculator
class Loan
{
private static double principle = 34324.121221312432;
final double rate;
final int periods;
static void setPrinciple(double principle) {
if (Loan.principle != 34324.121221312432)
throw new ReadOnlyException("The Principle can't be changed once set.");
Loan.principle = principle;
}
static double getPrinciple() {
return Loan.principle;
}
/**
* Initialises a new loan objects
* @param double rate The interest rate per period, as a percentage.
* eg: 0.00625 is 7.5% per annum.
* @param int periods The number of periods of the loan, typically months.
*/
Loan(double rate, int periods) {
this.rate = rate;
this.periods = periods;
}
// 2. processing
double payment() {
return principle * rate / (1 - 1/Math.pow(1+rate,periods) );
}
double totalPayment() {
return periods * payment();
}
}
class ReadOnlyException extends RuntimeException
{
private static final long serialVersionUID = 0L;
public ReadOnlyException(String message) {
super(message);
}
}
"Список кредитов для сравнения"представленный массивом Loan
объектов ... Т.е.: каждый «вариант ссуды» представлен экземпляром класса Loan
, который группирует все атрибуты определенного ссуды в одну симпатичную «вещь», которую мы можемзатем манипулировать в целом.Это лучшая оценка, чем метод, который вы используете для хранения атрибутов ссуды, который называется «параллельные массивы» ... и, ну, ну, он немного устарел, на самом деле у него есть (жирный) кефаль, на нем надето(слишком обтягивающий) оранжевый костюм для сафари с (сафрон-розовой) повязкой на голову ... В восьмидесятых это было не очень хорошо выглядеть, и в наши дни, вполне вероятно, вас избьют, арестуют или оба;в зависимости от вашей локали ... По сути: у нас есть лучшие способы сейчас!
В классе Loan
также есть пара удобных "вычисляемых полей", чтобы выполнять вычисления для нас.Это означает, что если СПОСОБ, которым мы рассчитываем изменения выплат по какой-либо причине в будущем, у нас есть только одно место, чтобы изменить его, и все, что использует займы (которые могут быть чтением, письмом, перестановкой, суммированием, повторным владением или даже оптовыми займами)НЕ нужно менять ... они просто получают изменения "бесплатно".
В этом надуманном сценарии использования все наши кредиты будут на одну и ту же сумму, меняются только процентные ставки и периоды ...поэтому класс Loan
также имеет переменную static
, называемую «принцип», которая содержит «общий» принцип для ВСЕХ экземпляров класса Loan.Принцип может быть установлен только один раз.Любая последующая попытка установить этот принцип приведет к возникновению исключения ReadOnlyException.
В любом случае, я надеюсь, что вы узнаете что-то из другого способа решения некоторых из подзадач, которые вы могли решить, выполняя это упражнение самостоятельно.,Один совет на будущее: возьмите свой код одноклассников для этого упражнения и прочитайте его ... вы можете узнать много из того, как другие люди решают проблемы.
Приветствия.Кит.