2012-08-17 27 views
6

Tôi có một bài tập về nhà và tôi đã tự hỏi nếu có ai có thể giúp tôi vì tôi mới làm quen với Java và lập trình và bị mắc kẹt trong một câu hỏi. Câu hỏi đặt ra là:Cách thao tác mảng. Tìm mức trung bình. Người mới bắt đầu Java

Phương pháp đầu tiên tìm thấy tỷ lệ trung bình của các phần tử của một mảng số nguyên:

public double average(int[] data) 

Đó là, đưa ra một mảng số nguyên, dữ liệu, tính toán tỷ lệ trung bình của các yếu tố của nó là trả về giá trị trung bình . Ví dụ: mức trung bình của {1, 3, 2, 5, 8} là 3,8.

Dưới đây là những gì tôi đã làm cho đến nay:

public double average(int[] data) { 
    int sum = 0; 

    while(int i=0; i < data.length; i++) 

    sum = sum + data[i]; 
    double average = sum/data.length;; 

    System.out.println("Average value of array element is " " + average); 
} 

Khi biên dịch nó tôi nhận được một thông báo lỗi ở phần int i=0 nói '.class dự kiến'. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

u có thể gửi đầy đủ các lớp học? –

+2

@DanglingPiyush Không cần. Câu hỏi là rõ ràng. –

+2

Khoảng trắng của bạn khá là gây hiểu nhầm. Nó thường được coi là thực hành tốt để sử dụng niềng răng xung quanh cho/trong khi vòng cho rõ ràng, trong khi những gì bạn có bây giờ là gây hiểu lầm. Xem [pastebin này] (http://pastebin.com/HLpFv8zw) để biết ví dụ về ý tôi. –

Trả lời

4
-while(int i=0; i < data.length; i++) 
+for(int i=0; i < data.length; i++) 
+0

LOL. Làm thế nào không ai có thể nhận thấy điều này? – RAY

+0

@RAY Đó là một phần của định dạng khác biệt thống nhất http://en.wikipedia.org/wiki/Diff#Unified_format – CyberDem0n

+0

Tôi biết. Nó chỉ là buồn cười mà không ai dường như đã nhận thấy một cái gì đó rất rõ ràng. – RAY

13

Sử dụng tăng cường cho sẽ càng đẹp hơn:

int sum = 0; 
for (int d : data) sum += d; 

Một điều mà có thể sẽ cung cấp cho bạn một bất ngờ lớn là kết quả sai mà bạn sẽ có được từ

double average = sum/data.length; 

Reason : ở phía bên tay phải, bạn có phân chia số nguyên và Java sẽ không tự động đẩy nó vào phân chia dấu phẩy động. Nó sẽ tính toán thương số nguyên của sum/data.length và chỉ sau đó quảng bá số nguyên đó thành một số double. Một giải pháp sẽ là

double average = 1.0d * sum/data.length; 

Điều này sẽ buộc cổ tức thành một số double, sẽ tự động truyền cho số chia.

+1

Và người ta có thể sửa chữa các vấn đề phân chia số nguyên hoặc bằng cách chỉ định 'tổng hợp' như là một 'đôi' ban đầu; hoặc bằng cách đúc một trong hai đối số trên đường phân chia một cách rõ ràng, ví dụ: 'double average = ((double) sum)/data.length;' –

+1

@AndrzejDoyle Tôi sẽ không đề nghị 'double sum' như một giải pháp chung vì nó sẽ dẫn đến mất chính xác cho các số nguyên trên 2^54 (hoặc là 2^56?). Dù sao, một số lượng khá lớn, nhưng vẫn còn, tại sao làm nó khi có một thay thế sạch hơn. –

+0

Đồng ý, chuyển đổi trước khi chia là cách "thích hợp" để thực hiện. (Tôi nghĩ trong ví dụ của bạn, tôi muốn thêm các dấu ngoặc, để làm cho nó rõ ràng rằng nó được đánh giá là '(1.0d * sum)/data.length' và không phải là' 1.0d * (sum/data.length) ', như Tôi nhận ra rằng ngay cả khi không có dấu ngoặc Java sẽ có cách tiếp cận trước đây, nhưng các dấu ngoặc là một loại tài liệu sẽ loại bỏ bất kỳ nghi ngờ nào đó cho người đọc. thực sự được phân công lại.) –

0
for(int i=0; i < data.length; i++) 
{ 
    sum = sum + data[i]; 
} 

or 

int i=0; 
while(i < data.length) 
{ 
    sum = sum + data[i]; 
    i++; 
} 
-1

Couple của các vấn đề:

Các while phải là một for You are not trả về giá trị nhưng bạn đã tuyên bố một kiểu trả về của đôi

double average = sum/data.length;; 

sum và data.length được cả hai ints để phân chia sẽ trả về một int - kiểm tra các loại của bạn

đôi dấu chấm phẩy, có lẽ sẽ không phá vỡ nó, trông kỳ lạ.

0

Hãy thử cách này

public void average(int[] data) { 
    int sum = 0; 
    double average; 

    for(int i=0; i < data.length; i++){ 
     sum = sum + data[i]; 
    } 
    average = (double)sum/data.length; 
    System.out.println("Average value of array element is " + average);  
} 

nếu bạn cần phải trả lại giá trị trung bình bạn cần phải sử dụng đôi từ khóa Thay vì các từ khóa trống và cần phải trả lại giá trị trở lại trung bình.

public double average(int[] data) { 
    int sum = 0; 
    double average; 

    for(int i=0; i < data.length; i++){ 
     sum = sum + data[i]; 
    } 
    average = (double)sum/data.length; 
    return average;  
} 
-1

Nếu chúng tôi muốn thêm số của mảng và tìm mức trung bình của chúng theo cách dễ dàng này! .....

public class Array { 

    public static void main(String[] args) { 

     int[]array = {1,3,5,7,9,6,3}; 
     int i=0; 
     int sum=0; 
     double average=0; 
     for(i=0;i<array.length;i++){ 
      System.out.println(array[i]); 
      sum=sum+array[i]; 
     } 
     System.out.println("sum is:"+sum); 
     System.out.println("average is: "+(double)sum/vargu.length); 



    } 

} 
+0

Vargu đến từ đâu? Tại sao bạn khai báo một biến số trung bình và không sử dụng nó? Tại sao bạn khai báo biến lặp vòng lặp fori bên ngoài vòng lặp? – skubski

0

Cách tốt nhất để tìm ra trung bình của một số con số đang cố gắng Lớp ......

public static void main(String[] args) { 
    average(1,2,5,4); 

} 

public static void average(int...numbers){ 
    int total = 0; 
    for(int x: numbers){ 
     total+=x; 
    } 
    System.out.println("Average is: "+(double)total/numbers.length); 

} 
0

Vâng, để tính toán tỷ lệ trung bình của một mảng, bạn có thể xem xét sử dụng for loop thay vì trong khi vòng lặp.

Vì vậy, theo câu hỏi của bạn cho tôi giả định một mảng như arrNumbers (ở đây tôi đang xem xét các yếu tố mảng giống như trong câu hỏi của bạn)

int arrNumbers[] = new int[]{1, 3, 2, 5, 8}; 
int sum = 0; 

for(int a = 0; a < arrNumbers.length; a++) 
{ 
    sum = sum + arrNumbers[a]; 
} 

double average = sum/arrNumbers.length; 

System.out.println("Average is: " + average); 

Bạn có thể sử dụng scanner lớp là tốt. Nó còn lại cho bạn.

4

Java 8 luồng api cung cấp một thay thế thanh lịch:

public static void main(String[] args) { 
    double avg = Arrays.stream(new int[]{1,3,2,5,8}).average().getAsDouble(); 

    System.out.println("avg: " + avg); 
} 
Các vấn đề liên quan