2013-12-17 2 views
0

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

Проблема здесь состоит в том, что каждый раз, когда я иду, чтобы скомпилировать программу, я получаю сообщение, что говорит: Sum.java:51: не может найти символ символ: переменная Сумах местоположение: класс Sum Сумах [J] = x [j] + y [j]; ^ 1 ошибка

import java.util.*; 

class Sum 
{ 
    public static void main (String [] args) 
    { 
     double [] a1 = {4.5, 2.8, 3.4, 0.8}; 
     double [] a2 = {1.4, 8.9, -1.0, 2.3}; 

     arraySum (a1, a2); 

     System.out.println (Arrays.toString (arraySum (a1, a2))); 
    } 

    public static double [] arraySum (double [] x, double [] y) 
    { 
     int length = 0; 

     if (x.length < y.length) 
     { 
      double [] sumY = new double [y.length]; 
      length = y.length; 

      for (int i = 0; i <= y.length - 1; i++) 
      { 
       for (int j=0; j <= x.length-1; j++) 
       { 
        sumY [j] = x[j] + y[j]; 
       } 

       sumY [(x.length -1) + i] = y[i]; 
      } 

      return sumY;   
     } 

     if (x.length > y.length) 
     { 
      double [] sumX = new double [x.length]; 
      length = x.length; 

      for (int i = 0; i <= x.length - 1; i++) 
      { 
       for (int j=0; j <= y.length-1; j++) 
       { 
        sumY[j] = x[j] + y[j]; 
       } 

       sumX [(y.length -1) + i] = y[i]; 
      } 

      return sumX; 
     } 

     else 
     { 
      double [] sum = new double [x.length]; 
      length = x.length; 

      for (int i = 0; i <= length - 1; i++) 
      { 
       sum[i] = x[i] + y[i]; 
      } 

      return sum; 
     } 

    } 
} 
+2

Вы, кажется, задаете два вопроса. Не могли бы вы задать им отдельные вопросы? В противном случае возможно, что один человек предоставит лучший ответ на один вопрос, а кто-то другой предоставит лучший ответ для другого; и вы не сможете вознаградить их обоих соответственно. –

ответ

0

Это потому, что ближайший double до 2,3 и ближайшего double до 0,8, при добавлении вместе, не дают ближайшие к double 3.1.

Если вы собираетесь делать арифметические операции с точными десятичными знаками и рассчитывать на правильные ответы, вы должны использовать класс BigDecimal вместо double.

+0

вне темы вопрос @ Давид, что это за символ, который вы используете в качестве аватара? Потому что дело в том, что я египтянин, и это означает огромную большую вещь здесь и ... интересно посмотреть парня по имени Дэвид из Новой Зеландии, используя этот логотип: D –

+0

@AhmadAlfy Если вы египтянин, то почему вы спрашиваете меня, что такое знак Рабии? Ты знаешь что это! Мир вам, брат мой. –

+0

Мир вам, брат, просто был уверен :) –

1

1: Вместо использования Arrays.toString используйте

System.out.printf("["); 
double[] sum = arraySum(a1, a2); 
for (int i = 0; i < sum.length; i++) { 
    System.out.printf("%0.1f", sum[i]); 
    if(i != sum.length - 1) { 
     System.out.printf(", "); 
    } 
} 
System.out.printf("]\n"); 

2: Во втором случае блок, вы используете Сумах, где я собираю вы имеете в виду SumX. sumY не определен в этой области, поэтому он дает вам ошибку.

1

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

import java.util.Arrays; 

public class MySum { 

    public static void main (String [] args) { 
     double [] a1 = {4.5, 2.8, 3.4, 0.8}; 
     double [] a2 = {1.4, 8.9, -1.0, 2.4}; 

     System.out.println (Arrays.toString (arraySum(a1, a2))); 
    } 

    public static double [] arraySum (double [] x, double [] y) { 

     if (x.length < y.length) { 
      return altMethod(x, y); 
     } 

     if (x.length > y.length) { 
      return altMethod(y, x); 
     } 

     else { 
      return altMethod(x, y); 
     } 

    } 

    public static double[] altMethod(double[] smaller, double[] bigger) { 
     int length = 0; 
     double[] answer = new double[bigger.length]; 

     for(int i = 0; i < smaller.length ; i++) { 
      answer[i] = smaller[i] + bigger[i]; 
      length++; 
     } 

     for(;length < bigger.length; length++) { 
      answer[length] = bigger[length]; 
     } 

     return answer; 
    } 
} 

The altMethod действительно должны принимать аргументы в определенном порядке, хотя. Быть (smaller, bigger), но не наоборот (bigger, smaller).

+0

Спасибо за редактирование SkyLuke :) – brat

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