Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2015, 19:30   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Сортировка -ошибка:выход за пределы массива

Добрый день. Нужно выполнить сортировку подсчетом, при запуске программы выдает ошибку: индекс находился вне границы массива. Проблема может быть из-за того,что главный массив с числами имеет тип double. Подскажите пожалуйста,что исправить?Спасибо

Код:
private void button1_Click(object sender, EventArgs e)
        {
            String[] arr = textBox1.Text.Split(new[] { ',' });
            Double[] arr1=new Double[arr.Length];
            for (int i = 0; i < arr.Length; i++)
                arr1[i] = Double.Parse(arr[i]);
         
           fact(arr1);
           
        }
 
        void fact(double []a)
        {
       
            int i1=0,i2=0;
            int[] a2 = new int[a.Length];
            for (int i = 0; i < a.Length; i++)
            {
                a2[i] = 0;
            }
           for (int i = 0; i < a.Length-1; i++)
            {
                i1 = (int)a[i];
                a2[(int)a[i]] = a2[(int)a[i]] + 1; //Здесь что-то не так
            }
            int k = 0;
           for (int j = 0; j < a.Length; j++)
            {
                while (a2[j] != 0)
                {
                    a[i] = j;
                    a2[j]--;
                    k++;
                }
            }
 
 
 
            for (int i = 0; i < a.Length; i++)
            {
               
                textBox2.AppendText(String.Format("{0,3:N2}",a[i]));
                if (!(i == a.Length - 1))
                    textBox2.AppendText(";");
            }
             
        }
Вероника99 вне форума Ответить с цитированием
Старый 19.11.2015, 19:40   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так а в массиве какие числа? Вы ж пытаетесь использовать значение элемента массива в качестве индекса. Видимо они не попадают в диапазон 0...arr.Length-1

Если это сортировка, то это вообще странная идея. Скорее всего вам что-то другое сделать надо было.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.11.2015 в 19:46.
Alex11223 вне форума Ответить с цитированием
Старый 19.11.2015, 19:49   #3
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Вот функция ввода. Ввожу целые числа 3,9,7
Код:
private void button1_Click(object sender, EventArgs e)
        {
            String[] arr = textBox1.Text.Split(new[] { ',' });
            Double[] arr1=new Double[arr.Length];
            for (int i = 0; i < arr.Length; i++)
                arr1[i] = Double.Parse(arr[i]);
         
           fact(arr1);
           
        }
Вероника99 вне форума Ответить с цитированием
Старый 19.11.2015, 19:53   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну так все три числа больше максимально допустимого индекса (2) в массиве из трех элементов.

Если это сортировка, то вам явно не надо ничего такого с ними делать, вы неправильно поняли алгоритм.
Сортировки ж работают с любыми сравниваемыми элементами (например, строки), а не только с числами из диапазона 0...кол-во_элементов_-1
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.11.2015, 20:04   #5
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Не поняла,так как же тогда можно мне реализовать сортировку подсчетом? Говорили,что вообще к вещественным числам эта сортировка не применяется...
Вероника99 вне форума Ответить с цитированием
Старый 19.11.2015, 20:12   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А, ну я думал там какая-нибудь более часто встречаемая сортировка, а не такая экзотика.

Тогда надо либо значения задавать в диапазоне от 0 до количество-1 (например 0, 2, 1) либо тут https://ru.wikipedia.org/wiki/%D0%A1...82%D0%BE%D0%BC внизу вроде есть пример с передачей параметров min и max для указания диапазона.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.11.2015, 20:30   #7
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Я думала применить приведение типов double к int,но не получается,ошибку выдает. Не знаете как исправить?
Вероника99 вне форума Ответить с цитированием
Старый 19.11.2015, 20:48   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут приведение. В предыдущем сообщении все написано.

(но вообще для не-целых при таком преобразовании оно не будет корректно сортировать для случаев когда одновременно есть числа типа 6.1 и 6.2)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.11.2015, 21:10   #9
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Решила все таки преобразовать базовый массив к int.Cоздала сначала новый массив а1,который хранит приведенные к int значения,потом создала вспомогательный массив уже для сортировки a2, а вот как начать эту сортировку не доходит, в конце проблема с a2[a1[i]] = a2[a1[i]] + 1; опять пишет что индекс за пределами массива,хотя я уже нашла максимальный элемент и в цикле он применен
Код:
 int[] a1 = new int[a.Length];
            for (int i = 0; i < a.Length - 1; i++)
            {
                a1[i] = (int)Math.Round(a[i]);
            }
 
            int i2 = a1[0]; //вспомогательный массив
            for (int i = 0; i < a.Length - 1; i++)
            {
                if (i2 < a1[i])
                    i2 = a1[i];
            }
       
            int i1=0;
 
            int[] a2 = new int[i2]; //вспомогательный массив
            for (int i = 0; i < a.Length; i++)
            {
                a2[i] = 0;
            }
        for (int i = 0; i < i2; i++)
            {
            
           //  i1 = Math.Abs(i1);
            // textBox3.AppendText(String.Format("{0,3:N2}", i1));
               //a2[a1[i]] = a2[a1[i]] + 1;    //ПРОБЛЕМА ТУТ
            }
Вероника99 вне форума Ответить с цитированием
Старый 19.11.2015, 21:24   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В сообщении #6 написано что надо делать для решения этой проблемы. Она не связана с обрезанием double до int.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход за пределы массива NFXrus Помощь студентам 10 09.12.2011 23:13
выход за пределы массива(с++) Lazy maximka Помощь студентам 2 13.11.2011 16:11
ListBox, выход текста за пределы видимости _-Re@l-_ Общие вопросы Delphi 3 31.08.2011 14:51
C++ выход за пределы строки (char) Alex11223 Помощь студентам 4 20.04.2011 20:27
C++ - выход за пределы массива kefir Помощь студентам 5 12.06.2010 14:09