Аватар для МихаилЗеленски
1 / 1 / 2
Регистрация: 14.10.2015
Сообщений: 95

Метод половинного деления

15.05.2016, 19:53. Показов 4433. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Стоит задача - сгенерировать через RND массив, а затем методом половинного деления найти элемент, который вводится с клавиатуры. Если элемент отсутствует - вывести соответствующее сообщение. Суть вопроса: Когда элемента в массиве нет - сообщение о его отсутствии выводится, а когда вводишь с клавиатуры заведомо существующее в массиве число - курсор просто переходит на следующую строчку. не знаю в чём проблема, ни ошибок, ни исключений....
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
static void Main(string[] args)
        {
            int rows = 10;
            int left = 0;
            int right = rows - 1;
            int middle = 0;
 
            int[] arr = new int[rows];
 
            // Заполняем массив
            Random rnd = new Random();
            Console.WriteLine("Array that was created by RND");
            for (int i = 0; i < rows; ++i)
            {
                arr[i] = rnd.Next(10, 99);
               Console.Write(arr[i] + " ");
            }
            Console.WriteLine("");
            Console.WriteLine("Sorted array");
 
            for (int i = 0; i<rows;++i)
            {
                Array.Sort(arr);
                Console.Write(arr[i] + " ");
            }
            Console.WriteLine("");
 
            // считываем число
            Console.WriteLine("Enter a number you want to search");
            int scanInt = Int32.Parse(Console.ReadLine());
 
            //поиск элемента
            for (int i = 0; i < rows; ++i)
            {
                while(arr[left]<=arr[right])
                {
                    arr[middle] = (arr[left] + arr[right]) / 2;
                    if (arr[middle] == scanInt)
                    {
                        arr[i] = arr[middle];
                        Console.Write("["+i+"]");
                        break;
                    }
                    else if (arr[middle] < scanInt)
                    {
                        arr[left] = arr[middle] + 1;
                    }
                    else arr[right] = arr[middle] + 1;
                }
                if (arr[right] !=scanInt)
                { Console.WriteLine("There is no mathes"); break; }
            }
         
 
            Console.ReadKey();
        }
Попутно вопрос. Эта программа должна быть максимально оптимальной. Я прочёл , что функция Array.Sort() работает по разному при разном кол-ве сортируемых элементов, и во всех случаях оптимально. Вопрос к опытным, так ли это, или лучше написать свою сортировку?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2016, 19:53
Ответы с готовыми решениями:

Метод половинного деления и метод простой итерации
Ребят, помогите пожалуйста написать программу на С#, решение нелинейного уравнения. Уравнение: x-10·sinx = 0 - Сделать Отделение корней...

Метод половинного деления
Доброго времени суток. Есть ли программа для отделения корней уравнения вида x^3 - 3x^2+9x-8=0 Метод половинного деления.

Метод половинного деления
Помогите пожалуйста решить уравнение методом половинного деления: 5sin(x)=x^2, x € , с точностью 10^-4.

3
91 / 90 / 37
Регистрация: 05.08.2011
Сообщений: 428
15.05.2016, 21:20
МихаилЗеленски, По-моему, у Вас нет понимаю, чем отличается индекс элемента в массиве, от самого элемента по данному индексу. Метод половинного деления объясняется на графиках в основном. Так вот, X это индекс элемента arr[X], а Y или f(X) это значение массива при данном X, т.е. Y=f(X)=arr[X].
А откуда вообще этот код? я не понимаю, зачем нужно два цикла (for и while). В методе половинного деления, мы делим отрезок пополам (B+A)/2. Сравниваем значение массива по данному индексу с искомым
C#
1
2
3
4
5
middle = (right+left)/2;
if(arr[middle] < scanInt)
    left = middle;
else
    right = middle;
ну и условия выхода нужно дописать.
0
 Аватар для МихаилЗеленски
1 / 1 / 2
Регистрация: 14.10.2015
Сообщений: 95
16.05.2016, 09:55  [ТС]
попробовал сделать как вы сказали. Вот код.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
        static void Main(string[] args)
        {
            int rows = 10;
            int left = 0;
            int right = rows - 1;
            int middle = 0;
 
            int[] arr = new int[rows];
 
            // Заполняем массив
            Random rnd = new Random();
            Console.WriteLine("Array that was created by RND");
            for (int i = 0; i < rows; ++i)
            {
                arr[i] = rnd.Next(10, 99);
               Console.Write(arr[i] + " ");
            }
            Console.WriteLine("");
            Console.WriteLine("Sorted array");
 
            for (int i = 0; i<rows;++i)
            {
                Array.Sort(arr);
                Console.Write(arr[i] + " ");
            }
            Console.WriteLine("");
 
            // считываем число
            Console.WriteLine("Enter a number you want to search");
            int scanInt = Int32.Parse(Console.ReadLine());
 
            //поиск элемента
            while (arr[left]!=arr[right]) {
                middle = (right + left) / 2;
                if (arr[middle] < scanInt)
                {
                    left = middle; 
                    Console.WriteLine("[" + left + "]");
                    break;
                }
                else
                {
                    right = middle;
                    Console.WriteLine("[" + right + "]");
                    break;
                }
            }
            if (arr[right] !=scanInt)
            { Console.WriteLine("There is no mathes"); }
            
         
 
            Console.ReadKey();
        }
А вот что выводит (скрин)
П.С. Код писал сам, алгоритм давал преподаватель. Возможно я не правильно понял суть,поэтому и код написан плохо.
Миниатюры
Метод половинного деления  
0
 Аватар для МихаилЗеленски
1 / 1 / 2
Регистрация: 14.10.2015
Сообщений: 95
16.05.2016, 13:53  [ТС]
Проблема решена
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
static void Main(string[] args)
        {
            int rows = 10;
            int left = 0;
            int right = rows - 1;
            int middle = 0;
            int output;
            int k = -1;
 
            int[] arr = new int[rows];
 
            // Заполняем массив
            Random rnd = new Random();
            Console.WriteLine("Array that was created by RND");
            for (int i = 0; i < rows; ++i)
            {
                arr[i] = rnd.Next(10, 99);
               Console.Write(arr[i] + " ");
            }
            Console.WriteLine("");
            Console.WriteLine("Sorted array");
            Array.Sort(arr);
            for (int i = 0; i < rows; ++i)
            {
                
               Console.Write(arr[i] + " ");
            }
            Console.WriteLine("");
 
            // считываем число
            Console.WriteLine("Enter a number you want to search");
            int scanInt = Int32.Parse(Console.ReadLine());
 
            //поиск элемента
 
            while (left <= right)
            {
                middle = (left + right) / 2;
                if (arr[middle] == scanInt)
                {
                    output = middle;
                    Console.Write("[" + output + "]");
                    k = arr[output];
                    break;
                }
                else if (arr[middle] < scanInt)
                    left = middle + 1;
                else
                {
                    right = middle - 1;
                }
            }
            if (k != scanInt)
            { Console.WriteLine("There is no mathes"); }
 
            Console.ReadKey();
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2016, 13:53
Помогаю со студенческими работами здесь

Метод половинного деления на С#
Ребят, помогите пожалуйста написать программу на С#, решение нелинейного уравнения методом половинного деления, найти корень ...

Метод половинного деления
помогите пожалуйста написать программу для решения уравнения методом половинного деления. уравнение F(x)=0. как описать это уравнение в...

метод половинного деления
Необходим решить уравнение, например х-2, методом половинного деления. Вот код using System; class Bis { static void Main() ...

Метод половинного деления
Ребят помогите пожалуйста составить программу, чтобы найти все корни уравнения x^3 + 12 = x(3x − 4) using System; ...

Метод половинного деления, исправить код
Господа программисты,помогите пожалуйста поправить программу,она должна считать 4 корня. А также,если можно,то проверку в эксели и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru