Работа с массивами. Подскажите в чем ошибка. - 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();
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д