2015-04-18 3 views
1

Я создал массив xr_arr, в котором хранятся переменные xr и xr хранит 100 значений. Как я могу вывести первые 24 значения из моего xr_arr без редактирования x+= шаг?Как получить значения из переменной в массиве?

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

Ваш код должен быть изменен, как показано ниже

  1. xr_arr Move снаружи первого for

  2. Move for, что дисплей массива после 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) cast усекает десятичное число, но ops с плавающей запятой может вызвать проблему округления, когда вы нажимаете 0 и 1, а затем перезаписываете 1 или что-то –

+0

@BenKnoble. Если число мало, это не проблема, но с большим числом как вы говорите, может вызвать проблемы округления. Я обновил свой код для лучшего решения. – adricadar

1

В каждую for счетчик; new создается массив. Объявите beofre 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 из за петлю так он будет создан только один раз
  • Разделяемая логика назначения массиву и отображение в 2 для петель
+1

Ошибка в вашем примере: вы не увеличиваете 'x' на' 0.01', а на '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())); 
     } 
    } 
} 
Смежные вопросы