Member 14843380 Ответов: 2

Почему существует бесконечное число элементов, которые можно ввести для значения x в приведенной ниже программе ?


import java.io.*;
import java.util.Scanner;
   class String2
   {
    
    public static void Vowels()
    {
        Scanner scan=new Scanner(System.in);
        System.out.println("Enter the number of elements in the array :");
        int n=scan.nextInt();
        int a[]=new int[n];
        System.out.println("Enter the elements of the array :");
        for(int i=0;i<=n-1;i++)
        {
            a[i]=scan.nextInt();
        }
        System.out.println("Enter the element  be searched :");
        int x=scan.nextInt();//here instead of the compiler allowing to enter only one value it is allowing to enter infinite number of values
        int lb=0,ub=n-1;
        int pos=0;
        while(ub>0)
        {
            int mid=(lb+ub)/2;
            if(a[mid]<x)
            {
                lb=mid-1;
            }
            if(a[mid]==x)
            {
                pos=mid+1;
            }
            if(a[mid]>x)
            {
                ub=mid+1;
            }
        }
    
        if(pos==0)
        {
            System.out.println("Search element not found ");
        }
        else
        {
            System.out.println(x+"is found at the position :"+pos);
        }
    }
    public static void main(String[]args)
    {
        Vowels();
    }
}


Что я уже пробовал:

Приведенный выше код-это то, что я пробовал.

2 Ответов

Рейтинг:
2

CPallini

Как уже указывали наши Грифф, твой while петля никогда не кончается. Таким образом, вы в основном остаетесь с пустой консолью, чтобы играть.
Это потому, что ваша реализация алгоритма бинарного поиска неверна.
Попробуй

while( lb+1 < ub )
{
    int mid = (lb + ub)/2;

    if( a[mid] < x)
    {
        lb = mid;
    }
    else if( a[mid] == x )
    {
        pos = mid + 1;
        break;
    }
    else
    {
        ub = mid;
    }
}


Member 14843380

не могли бы вы сказать мне, пожалуйста, почему компилятор позволяет вводить более одного значения для x?
когда я ввожу значение для x, оно позволяет бесконечно вводить больше значений.x-это число в приведенном выше коде, которое нужно искать.

CPallini

Компилятор не позволяет вводить более одного значения.
Howver, программа (или ОС, или что-то еще..) это позволяет вам свободно печатать в темноте. Попробуйте, например:
класс Фу
{
public static void main( String args[])
{
пробовать
{
для (;;)
Thread.sleep(1000);
}
catch ( InterruptedException ie )
{
Системы.из.код println("до свидания!");
}
}
}

jsc42

You cannot enter an infinite number of numbers - it would take the whole of eternity to do it. Do you mean that you can type more numbers than you want? Does it find the solution for every number that you type or just the first one that you are searching for? My guess is that it will only search for the first one and the rest will be ignored. This is because you are just filling in data into a scan buffer and your program is consuming data from the scan buffer. Data not relevant to the program (e.g. your infinite set of numbers) just sit there waiting in the buffer in case any code wants to scan them. However, if you are entering multiple numbers and each is being searched in turn, please verify that the code that you have posted is what you are running and that there isn't another loop somewhere that is picking up the other numbers.

Рейтинг:
0

OriginalGriff

На первый взгляд, потому что ub всегда больше нуля, поэтому он никогда не покидает ваш while петля.

Но чтобы быть уверенным, вы смотрите на свой код и переменные во время работы вашего приложения и точно узнаете, что оно делает.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!