2015-04-18 31 views
1

我創建了一個數組xr_arr,其中存儲變量xrxr存儲100個值。 如何在不編輯x+=步驟的情況下從我的xr_arr輸出前24個值?如何從數組中的變量中獲取值?

static void xn() 
{ 
    double r = 3.9; 
    for (double x = 0; x <= 1; x+= 0.01) 
    { 
     double xr = r * x * (1 - x); 
     double [] xr_arr= new double[]{xr}; 
     for (int y = 0; y <23; y++) { 
      // Console.WriteLine(xr_arr[y]); 
     } 
    } 
+0

你'xr_arr'只有1個值.. – adricadar

+0

考慮你的方法更好地命名的變量 – khlr

回答

3

您的代碼需要一個建立它for後作如下修改

  1. 移動xr_arr的第一for

  2. 移動for該顯示陣列的外部。

新代碼

double r = 3.9; 
double[] xr_arr = new double[100]; 
// build xr_arr 
for (double x = 0; x <= 1; x += 0.01) 
{ 
    double xr = r * x * (1 - x); 
    int index = (int) (x * 100); 
    xr_arr[index] = xr; 
} 

var length = 23; 
// display xr_arr 
for (int y = 0; y < length; y++) 
{ 
    Console.WriteLine(xr_arr[y]); 
} 

我建議你建造2種方法中的一種建築和一個用於顯示陣列。您將只有才能從此贏得,代碼將爲更易於維護可重複使用

static void xn() 
{ 
    string data = " abc df fd"; 
    var xr_arr = Build(100); 
    Display(xr_arr, 23); 
} 


public static double[] Build(int size) 
{ 
    double r = 3.9; 
    double[] xr_arr = new double[size]; 
    double step = 1.0/size; 
    for (int index = 0; index < size; index++) 
    { 
     var x = index * step; 
     double xr = r * x * (1 - x); 
     xr_arr[index] = xr; 
    } 
    return xr_arr; 
} 

public static void Display(double[] xr_arr, int size) 
{ 
    var length = Math.Min(xr_arr.Count(), size); 
    for (int y = 0; y < length; y++) 
    { 
     Console.WriteLine(xr_arr[y]); 
    } 
} 
+1

難道是值得的陣列建設一個獨立的索引變量?我知道(int)強制轉換十進制數,但浮點運算可能導致一個舍入問題,當你點擊0和1,然後覆蓋1或某些東西 –

+0

@BenKnoble如果數字很小,這不是問題,但數字很大正如你所說,可能會導致舍入問題。我更新了代碼以獲得更好的解決方案。 – adricadar

1

在每個for計數器; new陣列正在創建中。聲明一下for循環,然後繼續!
如下:

static void xn() 
{ 
    double r = 3.9; 
    double [] xr_arr= new double[100]; 
    for (double x = 0; x <= 1; x+= 0.01) 
    { 
     double xr = r * x * (1 - x); 
     xr_arr[x]= xr; 
     for (int y = 0; y <23; y++) { 
      Console.WriteLine(xr_arr[y]); 
     } 
    } 
} 
2
static void xn() 
{ 
    double r = 3.9; 
    int count = 100; 
    double[] xr_arr = new double[count]; 

    for (int x = 0; x < count; x += 1) 
    { 
     var incrementValue = (double)x/(double)100; 
     double xr = r * incrementValue * (1 - incrementValue); 
     xr_arr[x] = xr; 
    } 

    for (int y = 0; y < 23; y++) 
    { 
     Console.WriteLine(xr_arr[y]); 
    } 
} 

變動完成後,

  • 變盤點將持有xr_arr的總長度因此,你可以很容易地改變它
  • 感動xr_arr創造出來的for循環使它將只創建一次
  • 分配邏輯分配給數組並顯示爲2 for循環
+1

您的示例中存在一個錯誤:您不會通過'0.01'增加'x',而是通過'1'來增加其他(不正確)結果。 – khlr

+0

啊我看到了,你通過添加行'var incrementValue = x/100;' – khlr

+0

@khlr解決了這個問題。謝謝 – Nipuna

2

你可能想

  1. 預分配的數組,如果你知道它要包含恰好是100個元素,運用var xr_arr = new double[100];或者,如果你不知道項目前期的確切數量,您可以使用List<double>將新號碼添加到。
  2. 等待嘗試打印值,直到完成添加之後。

所以做到這一點,如:

static void xn() 
{ 
    double r = 3.9; 
    var n = 0; 
    // I think the number of elements could (theoretically) be different from 100 
    // and you could get an IndexOutOufRangeException if it is 101. 
    var increment = 0.01d; // 1.0d/300.0d; // <== try this. 
    var n_expected = 100; // 300 // <= with this. 
    var x_arr = new double[n_expected]; 

    // alternative: if you cannot be absolutely certain about the number of elements. 
    //var x_list = new List<double>(); 

    for (double x = 0; x <= 1; x += increment) 
    { 
     double xr = r * x * (1 - x); 
     x_arr[n++] = xr; 
     // x_list.Add(xr); // alternative. 
    } 

    for (int y = 0; y <23; y++) 
    { 
     Console.WriteLine(xr_arr[y]); 
     // Console.WriteLine(xr_list[y]); // alternative. 
    } 
} 

浮點精度問題

需要注意的是,不同於一般的預期,浮點值仍然存儲在位數量有限,並因此受到編碼分辨率和舍入效應的影響,如果在循環中執行諸如加法之類的操作,會使您失去精度。期望實數在計算機上的工作方式與純數學工作方式相同是一個常見的錯誤。請看what every computer scientist should know about floating point arithmetic,以及它所指的文章。

在這個例子中,如果你增加了1.0/300,期望得到300個元素,你就會遇到問題。

2

您需要使用列表<>對象,以便您可以添加項目。請參見下面的代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      xn(); 
     } 
     static void xn() 
     { 
      double r = 3.9; 
      List<double> xr_arr = new List<double>(); 
      for (double x = 0; x <= 1; x += 0.01) 
      { 
       double xr = r * x * (1 - x); 
       xr_arr.Add(xr); 
      } 
      Console.WriteLine(string.Join(",", xr_arr.Take(24).Select(a => a.ToString()).ToArray())); 
     } 
    } 
}