2013-07-10 29 views
5

Làm cách nào để bạn tạo phương thức loại trừ nhiệt độ thấp nhất và tính toán nhiệt độ trung bình. tôi chỉ muốn một gợi ý và không phải là giải pháp hoàn chỉnh, vì tôi muốn tự giải quyết vấn đề lập trình của mình. Tôi đã chỉ có khoảng 10 lớp học .. để bình luận về những người bình luận giáo sư của tôi không giảng dạy và tôi đã đọc cuốn sách của tôi nhìn lại qua nó nhiều lần.Làm cách nào để loại trừ giá trị của một mảng?

Tôi đã thực hiện chương trình này để lấy số từ người dùng. Con số đó được thêm vào mảng. Mảng đó được sử dụng để tạo ra một thể hiện của lớp Temp để in temps thấp nhất và cao nhất.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.Write("Enter a Temperature in Degrees:"); 
     string n = Console.ReadLine(); 
     int number = Convert.ToInt32(n); 
     Temp t = new Temp(100, 52, 98, 30, 11, 54, number); 
     Console.WriteLine("Lowest Temperature:{0}", t.lowest()); 
     Console.WriteLine("Highest Temperature: {0}", t.highest()); 
     Console.WriteLine("Average Temperature: {0}", t.Average()); 
    } 

    public class Temp 
    { 
     private int[] temp = new int[7]; // array 
     public Temp(int d1, int d2, int d3, int d4, int d5, int d6, int d7) // constructor with 7 parameters 
     { 
      temp[0] = d1; // assigning constructor parameters to array 
      temp[1] = d2; 
      temp[2] = d3; 
      temp[3] = d4; 
      temp[4] = d5; 
      temp[5] = d6; 
      temp[6] = d7; 
     } 

     public int lowest() // returning the lowest value of the set of numbers 
     { 
      int smallest = 150; 
      for (int c = 0; c < 7; c++) 
      { 
       if (temp[c] < smallest) 
       { 
        smallest = temp[c]; 
       } 

      } 
      return smallest; 
     } 

     public int highest() 
     { 
      int highest = -1; 
      for (int c = 0; c < 7; c++) 
      { 
       if (temp[c] > highest) 
       { 
        highest = temp[c]; 
       } 
      } 

      return highest; 
     } 

     public double Average() 
     { 
      double average = 0; 
      for (int c = 0; c < 7; c++) 
      { 

      } 
      return average; 
     } 
    } 
} 

Trả lời

8

này là rất dễ dàng để làm với một vòng duy nhất:

public double Average() 
{ 
    // Initialize smallest with the first value. 
    // The loop will find the *real* smallest value. 
    int smallest = temp[0]; 

    // To calculate the average, we need to find the sum of all our temperatures, 
    // except the smallest. 
    int sum = temp[0]; 

    // The loop does two things: 
    // 1. Adds all of the values. 
    // 2. Determines the smallest value. 
    for (int c = 1; c < temp.Length; ++c) 
    { 
     if (temp[c] < smallest) 
     { 
      smallest = temp[c];  
     } 
     sum += temp[c]; 
    } 
    // The computed sum includes all of the values. 
    // Subtract the smallest. 
    sum -= smallest; 

    double avg = 0; 
    // and divide by (Length - 1) 
    // The check here makes sure that we don't divide by 0! 
    if (temp.Length > 1) 
    { 
     avg = (double)sum/(temp.Length-1); 
    } 
    return avg; 
} 
+1

+1: Tôi thích câu trả lời này so với câu trả lời tôi đã đề xuất. – Douglas

1

Bạn cần phải thêm xử lý lỗi nhưng điều này có thể giúp cung cấp cho bạn một sự khởi đầu

var ints = new List<int>(); 
var newInts = ints.OrderBy(x => x).ToList(); 
newInts.RemoveAt(0); 
var avg = newInts.Average(); 
0

Bạn có thể làm điều này một cách dễ dàng với một vài chức năng LINQ. Có rất nhiều cách khác để làm điều này nhưng tất cả chúng sẽ giống nhau. Nếu có nhiều hơn một giá trị min, mức trung bình của bạn sẽ không bao gồm bất kỳ giá trị nào trong số đó.

int min = myArray.Min(); // get the min element 
var withoutMin = myArray.Where(x => x != min); // get a new list without the min element 
double mean = withoutMin.Average(); // take the sum and divide it by the count 
+0

điều này sẽ không hợp lệ nếu có nhiều yếu tố bằng Min – Sayse

+0

@Sayse không nhất thiết. Nó phụ thuộc vào đặc điểm của danh sách và cách bạn định nghĩa Min. Tôi nghĩ rằng điều này tuân theo các quy ước toán học/lambda. Tôi đã đưa vào một chỉnh sửa để chỉ ra rằng mặc dù. – evanmcdonnal

+0

Tôi nhận thấy :) trong sự công bằng, bạn có thể sử dụng 'Average()' thay vì dòng cuối cùng của bạn – Sayse

0
public double Average() 
    { 
     var tempsToUse = temp.OrderByDescending(t => t).Take(temp.Length - 1); 

     return tempsToUse.Average(); 
    } 

Edited để bao gồm đầy đủ chức năng chữ ký.

2

Đây là một phiên bản khác nhau chút chút so với Douglas đăng (tất nhiên phiên bản của ông là hoàn toàn tốt đẹp và được mô tả tốt, tôi chỉ cần đặt nó cho bạn ôn tập). Nó không sử dụng gọi phương thức low().

public double Average() 
{ 
    double sum = temp[0]; // sum of temperatures, starting from value of first one in array 
    double lowest = temp[0]; // buffer for lowest temperature value 
    for (int c = 1; c < 7; c++) // start loop from second position in array 
    { 
     if (temp[c] < lowest) // checking if next value in array is smaller than the lowest one so far... 
     { 
      lowest = temp[c]; // ...if so, value of variable lowest is changing 
     } 
     sum = sum + temp[c]; // adding temparatures value to variable sum, one by one 
    } 
    sum = sum - lowest; // at the end we substract lowest value from sum of all temperatures 
    double average = sum/6; // average value calculation 
    return average; 
} 

EDIT: Jim Mischel là lần đầu tiên ;-). Phiên bản của anh cũng linh hoạt hơn nhờ sử dụng temp.Length, không phải số tĩnh (7 trong trường hợp này).

+0

tại sao bạn sử dụng temp [0] .. tôi giả định rằng bạn giả sử rằng nhiệt độ [0] luôn là nhiệt độ thấp nhất. hoặc là bạn chỉ cần khởi tạo giá trị của tổng và thấp nhất? –

+0

@ZachB: Chỉ cần khởi tạo. Đây là cách làm hiệu quả hơn một chút, vì nó làm giảm số lần lặp lại một lần. – Douglas

Các vấn đề liên quan