2015-02-15 2 views
0

Я пытаюсь запустить свою программу в течение четырех вложенных циклов для вычисления относительной ошибки введенного пользователем числа путем рисования из массива {-5, -4, -3, -2, -1, -1/2, -1/3, -1/4, 0, 1/4, 1/3, 1/2, 1, 2, 3, 4, 5}. Вот выдержка из этого задания:Зацикливание через массив для вычисления относительной ошибки

«Рассмотрим формулу де Жагера w^ax^на^cz^d, где каждый из a, b, c и d является одним из 17 чисел {-5, - 4, -3, -2, -1, -1/2, -1/3, -1/4, 0, 1/4, 1/3, 1/2, 1, 2, 3, 4, 5} «Очаровательная теория» утверждает, что формулу де Жагера с вашими четырьмя личными числами можно использовать для приближения μ в пределах от 1% относительной погрешности. Например, предположим, что вы выбираете приблизительное среднее расстояние от Земли до Луны в миль: μ = 238 900. И предположим, что вы являетесь поклонником спорта OSU, поэтому ваши личные номера - это число побед в последнем сезоне национального чемпионата OSU (14, а также рекорд за победы в год любой командой колледжа), посадочная способность стадиона Огайо (102 329), год четырех золотых медалей Джесси Оуэнса в Берлине (1936) и номер вашего трикотажа, когда вы играли в хоккей на средней школе (13). Затем значение 14-5102329119361/2134 составляет около 239,103, что составляет около 0,08% μ.

Ваша задача - создать программу Java, которая запрашивает у пользователя, какая константа μ должна быть аппроксимирована, а затем, в свою очередь, запрашивает каждый из четырех личных чисел w, x, y и z. Затем программа должна вычислять и сообщать значения показателей a, b, c и d, которые приносят формулу де Ягера как можно ближе к μ, а также значение формулы waxbyczd и относительную погрешность приближения к ближайшая сотая часть процента. »

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

import components.simplereader.SimpleReader; 
import components.simplereader.SimpleReader1L; 
import components.simplewriter.SimpleWriter; 
import components.simplewriter.SimpleWriter1L; 


public final class ABCDGuesser1 { 


private ABCDGuesser1() { 
} 


public static void main(String[] args) { 
    SimpleReader in = new SimpleReader1L(); 
    SimpleWriter out = new SimpleWriter1L(); 

    out.print("Enter a positive real-valued universal physical or mathematical constant: "); 
    double mu = in.nextDouble(); 

    out.print("Enter four postitive numbers not equal to 1: "); 
    double w = in.nextDouble(); 
    double x = in.nextDouble(); 
    double y = in.nextDouble(); 
    double z = in.nextDouble(); 

    int[] charm = { -5, -4, -3, -2, -1, -1/2, -1/3, -1/4, 0, 1/4, 
      1/3, 1/2, 1, 2, 3, 4, 5 }; 

    int a = 0; 
    int i = 0; 
    while (i < charm.length) { 
     a = charm[i]; 
     double max1 = (Math.pow(w, a)); 
     i++; 

     int b = 0; 
     int j = 0; 
     while (j < charm.length) { 
      b = charm[j]; 
      double max2 = (Math.pow(x, b)); 
      j++; 

      int c = 0; 
      int k = 0; 
      while (k < charm.length) { 
       c = charm[k]; 
       double max3 = (Math.pow(y, c)); 
       k++; 

       int d = 0; 
       int n = 0; 
       while (n < charm.length) { 
        d = charm[n]; 
        double max4 = (Math.pow(z, d)); 
        n++; 
       } 
       out.print(max1); 
      } 
     } 
    } 

    in.close(); 
    out.close(); 
} 

}

+0

Ну, для одного вы должны работать с двойным [] как int -1/2 или любая фракция 1/4 будет округлена, чтобы быть int. –

+0

В чем вопрос? – immibis

+0

Также вы узнали о циклах 'for'? Они позволят вам немного сократить код. – immibis

ответ

0
  1. как было упомянуто Invexity, двойной [] очарование, не ИНТ [] очарование

  2. в то время как перекручивание, следить за bestEstimate

так закодировать ваш код будет be

package area51; 

import java.io.PrintStream; 

public final class ABCDGuesser1 { 

    private ABCDGuesser1() { 
    } 

    public static void main(String[] args) { 

     PrintStream out = System.out; 
     //out.print("Enter a positive real-valued universal physical or mathematical constant: "); 
     double mu = 2.567; 

     //out.print("Enter four postitive numbers not equal to 1: "); 
     double w = 123.4; 
     double x = 2.567; 
     double y = 8.9; 
     double z = 12.6; 

     double[] charm = { -5, -4, -3, -2, -1, -1/2, -1/3, -1/4, 0, 1/4, 1/3, 1/2, 1, 2, 3, 4, 5 }; 

     double bestEstimate = 0; 
     String bestIndexes = ""; 
     for (int i = 0; i < charm.length; i++) { 
      double max1 = (Math.pow(w, charm[i])); 
      for (int j = 0; j < charm.length; j++) { 
       double max2 = (Math.pow(x, charm[j])); 
       for (int k = 0; k < charm.length; k++) { 
        double max3 = (Math.pow(y, charm[k])); 
        for (int n = 0; n < charm.length; n++) { 
         double max4 = (Math.pow(z, charm[n])); 
         double currentEstimate = max1 * max2 * max3 * max4; 
         if (Math.abs(mu - currentEstimate) < Math.abs(mu - bestEstimate)) { 
          bestEstimate = currentEstimate; 
          bestIndexes = ""+i+","+j+","+k+","+n; 
         } 
        } 
        //out.print(max1); 
       } 
      } 
     } 
     out.println("Best Estimate = " + bestEstimate); 
     out.println("Best Indexes = " + bestIndexes); 
    } 
} 
+0

Я немного смущен относительно того, как правильно использовать значение bestEstimate. Для шага 6 вы показываете, что я должен вычесть bestEstimate из mu, но если я никогда не дал bestEstimate значение (отличное от 0), это не будет бессмысленным? Кроме того, для шага 5 вы говорите, что имеет оценку = max1 * max2 * max3 * max4, но оценка не была объявлена. Ты хочешь сказать, что здесь есть текущий Эстимейт? – Devasive

+0

@Devasive Я перевел свой ответ в код и да, когда я сказал «оценка», я должен был сказать «currentEstimate». –

+0

Это выход я получаю от запуска программы вы выложили: Введите положительную вещественную универсальную физическую или математическую константу: 238900 Введите четыре postitive числа, не равных 1: 14 наилучшей оценка = 253104.94721879277Exception в теме "главный" java.lang.AssertionError: Нарушение: это открытое \t на components.simplewriter.SimpleWriter1L.print (SourceFile: 114) \t на ABCDGuesser1.main (ABCDGuesser1.java:90) есть ли у вас любая идея, почему она работает неправильно? Кроме того, извините за плохое форматирование здесь, я, похоже, не могу добавить разрывы строк. – Devasive

0
/*Could you tell me why these two programs give different outputs? The only difference between them that I can see is that the first uses while loops with no method, while the second uses for loops and a main method. I don't want to change the for loop program anymore if I have to, I just want the while loop program's output to match that of the for loop one. The output for the first program is: 

Enter a positive real-valued universal physical or mathematical constant: 238900 
Enter four postitive number not equal to 1: 14 
102329 
1936 
13 
Most appropriate exponents for w, x, y and z: 1 14 6 12 
Best Estimate = 253104.94721879277 
Relative error = 0.059459804180798555% 
Exception in thread "main" java.lang.AssertionError: Violation of: this is open 
at components.simplewriter.SimpleWriter1L.println(SourceFile:177) 
at ABCDGuesser1.main(ABCDGuesser1.java:93) 

Second program: 

Enter a positive real-valued universal physical or mathematical constant: 238900 
Enter four postitive number not equal to 1: 14 
102329 
1936 
13 
Most appropriate exponents for w, x, y and z: -4.0 2.0 1.0 -3.0 
Best Estimate = 240193.14762851998 
Relative error = 0.0054129243554624324 
*/  


public static void main(String[] args) { 
    SimpleReader in = new SimpleReader1L(); 
    SimpleWriter out = new SimpleWriter1L(); 

    out.print("Enter a positive real-valued universal physical or mathematical constant: "); 
    double mu = in.nextDouble(); 

    out.print("Enter four postitive number not equal to 1: "); 
    double w = in.nextDouble(); 
    double x = in.nextDouble(); 
    double y = in.nextDouble(); 
    double z = in.nextDouble(); 

    double[] charm = { -5, -4, -3, -2, -1, -1/2, -1/3, -1/4, 0, 
      1/4, 1/3, 1/2, 1, 2, 3, 4, 5 }; 
    double bestEstimate = 0; 
    double a, b, c, d; 
    double bestIndex1 = 0; 
    double bestIndex2 = 0; 
    double bestIndex3 = 0; 
    double bestIndex4 = 0; 

    int i = 0; 
    while (i < charm.length) { 
     a = (Math.pow(w, charm[i])); 
     i++; 

     int j = 0; 
     while (j < charm.length) { 

      b = (Math.pow(x, charm[j])); 
      j++; 

      int k = 0; 
      while (k < charm.length) { 

       c = (Math.pow(y, charm[k])); 
       k++; 

       int n = 0; 
       while (n < charm.length) { 

        d = (Math.pow(z, charm[n])); 
        double currentEstimate = a * b * c * d; 

        if (Math.abs(mu - currentEstimate) < Math.abs(mu 
          - bestEstimate)) { 
         bestEstimate = currentEstimate; 
         bestIndex1 = charm[i]; 
         bestIndex2 = charm[j]; 
         bestIndex3 = charm[k]; 
         bestIndex4 = charm[n]; 
        } 
        n++; 
       } 
      } 
     } 
     double relError = Math.abs((mu - bestEstimate)/mu); 
     out.println("Most appropriate exponents for w, x, y and z: " 
       + bestIndex1 + " " + bestIndex2 + " " + bestIndex3 + " " 
       + bestIndex4); 

     out.println("Best Estimate = " + bestEstimate); 

     out.println("Relative error = " + relError + "%"); 

     in.close(); 
     out.close(); 
    } 
} 






private static double relError(double constant, double fin) { 
    double estimate = Math.abs((constant - fin)/constant); 

    return estimate; 
} 

/** 
* Main method. 
* 
* @param args 
*   the command line arguments 
*/ 
public static void main(String[] args) { 
    SimpleReader in = new SimpleReader1L(); 
    SimpleWriter out = new SimpleWriter1L(); 

    out.print("Enter a positive real-valued universal physical or mathematical constant: "); 
    double mu = in.nextDouble(); 

    out.print("Enter four postitive number not equal to 1: "); 
    double w = in.nextDouble(); 
    double x = in.nextDouble(); 
    double y = in.nextDouble(); 
    double z = in.nextDouble(); 

    double[] charm = { -5, -4, -3, -2, -1, -1/2, -1/3, -1/4, 0, 
      1/4, 1/3, 1/2, 1, 2, 3, 4, 5 }; 
    double bestEstimate = 0; 
    double bestIndex1 = 0; 
    double bestIndex2 = 0; 
    double bestIndex3 = 0; 
    double bestIndex4 = 0; 

    for (int i = 0; i < charm.length; i++) { 
     double a = (Math.pow(w, charm[i])); 
     for (int j = 0; j < charm.length; j++) { 
      double b = (Math.pow(x, charm[j])); 
      for (int k = 0; k < charm.length; k++) { 
       double c = (Math.pow(y, charm[k])); 
       for (int n = 0; n < charm.length; n++) { 
        double d = (Math.pow(z, charm[n])); 
        double currentEstimate = a * b * c * d; 
        if (Math.abs(mu - currentEstimate) < Math.abs(mu 
          - bestEstimate)) { 
         bestEstimate = currentEstimate; 
         bestIndex1 = charm[i]; 
         bestIndex2 = charm[j]; 
         bestIndex3 = charm[k]; 
         bestIndex4 = charm[n]; 

        } 
       } 
      } 
     } 
    } 
    double error = relError(mu, bestEstimate); 

    out.println("Most appropriate exponents for w, x, y and z: " 
      + bestIndex1 + " " + bestIndex2 + " " + bestIndex3 + " " 
      + bestIndex4); 

    out.println("Best Estimate = " + bestEstimate); 

    out.print("Relative error = "); 
    out.println(error); 

    in.close(); 
    out.close(); 
} 
+0

Существует разница в вашей логике между версиями «для» и «в то время». I, j, k увеличиваются до следующего цикла. В инструкциях «for» i и т. Д. Обновляются после внутреннего цикла. Это повлияет на распечатываемые вами индексы, но я не уверен, почему фактический ответ отличается. Я должен уйти сейчас, но завтра попробую еще раз посмотреть, если это все еще проблема. –

+0

Я нашел свою ошибку. У меня были мои выходные операторы в моем первом цикле while. Я исправил это, и теперь они дают одинаковые ответы. Еще раз спасибо! – Devasive

Смежные вопросы