Работа с массивами. Подскажите в чем ошибка. - C#
Формулировка задачи:
Доброго времени суток всем.
Помогите найти оптимальный путь решения проблемы.
Дано: Есть массив конечной длинны ARRAY, с элементами типа float. Отсортирован по возрастанию.
Некое число типа float X, которое точно больше самого меньшего элемента массива. И меньше самого большего элемента массива.
Задача: Найти элемент массива ARRAY, который ближе всего к заданному числу X.
Задача кажется простой, но при реализации возникают непредвиденные трудности.
У меня есть два метода. В первом цикл, который тупо перебирает все элементы массива.
Во втором методе, собственно, определяется является ли данный элемент ближайшим к заданному числу
При компиляции выскакивает исключение, говорящие о выходе за рамки массива. Хотя, как он может выйти за рамки массива если цикл по определению не может обратится к индексу, больше размера массива.
for(byte i = 0; i < ARRAY.Length; i++){
if(IsAdjacent(ARRAY,i,X))
Modifier = 4;
..........
}public static bool IsAdjacent(float []ARRAY,byte number, float X){
if(number==0){
if(Math.Abs(X-ARRAY[number]) < Math.Abs(X-ARRAY[number+1])){
return true;
}
}else if(number==ARRAY.Length){
if(Math.Abs(X-ARRAY[number]) < Math.Abs(X-ARRAY[number-1])){
return true;}
}else{
if(Math.Abs(X-ARRAY[number]) < Math.Abs(X-ARRAY[number+1])&&Math.Abs(X-ARRAY[number]) < Math.Abs(X-ARRAY[number-1])){
return true;}
}
return false;
}Решение задачи: «Работа с массивами. Подскажите в чем ошибка.»
textual
Листинг программы
using System;
using System.Linq;
namespace ConsoleApplicationTest {
public static class Program {
private static void Main() {
// Начальные данные.
const int min = 0;
const int max = 50;
const int count = 10;
const int x = 20;
// Создаём массив из случайных упорядоченных элементов.
Random r = new Random();
var array = (from i in Enumerable.Repeat( 0, count )
let n = r.Next( min, max )
orderby n
select n).ToArray();
// Находим элемент с минимальным отклонением от x.
int result = array
.Skip( 1 )
.Aggregate(
new { d = Math.Abs( array.First() - x ), item = array.First() },
( accum, i ) => Math.Abs( i - x ) < accum.d ? new { d = Math.Abs( i - x ), item = i } : accum,
accum => accum.item );
// Выводим результаты.
foreach ( var i in array ) {
Console.WriteLine( i );
}
Console.WriteLine( "Result = " + result );
Console.ReadKey();
}
}
}