Вопрос проверки номера телефона в США - PullRequest
0 голосов
/ 24 июня 2011

У меня проблемы с этим кодом для моего класса: вот проблемы

1.) Он не зацикливается после успеха

(код компилируется, но когда он спрашивает «какой у вас номер?», И я набираю 909-8930, вывод просто отвечает: правильно до выхода (с номером телефона). Я полагал, что его предполагается зациклить ?)

2.) Выдает ошибку из-за круглых скобок в:

phone = phone.replaceAll("(","");

phone = phone.replaceAll(")","");

но работает нормально, когда я их комментирую и ухожу: phone = phone.replaceAll("-","");

3.) Не имеет максимальной проверки символов с использованием логической команды. (мы должны использовать код, который мы узнали в классе)

Я использую Vista (я знаю, все плохо) cmd для компиляции кода Java.

/* 


 */
import java.util.Scanner; // 
public class PhoneNumber

{

    //********number()******
    public static boolean Number(String str)

    {
        int n=0;
        while(n<str.length()) //while condition for the loop
        {
            char c=str.charAt(n);

            if(!(c>='0'&&c<='9'))return(false);//0 to 9
            n++; // counter and checked loop?

        }   
        return (true);
    }    
    // Phone Number

    public static void main(String[] args)

    {


        // Create a Scanner object to read input.
        String phone;
        Scanner sc = new Scanner(System.in);


        // Get the favorite city
        System.out.print("What is your phone number?");  // no ln
        phone=sc.nextLine( );


        //replace all perenthesis and dashes

        phone = phone.replaceAll("-",""); 
        phone = phone.replaceAll("(","");
        phone = phone.replaceAll(")","");


        // validation of number
        if(Number(phone))
        {

            // sub stuff to add back the dash and whateves
            String first,middle,last;
            first = phone.substring (0,3);
            middle = phone.substring (3,6); 
            last = phone.substring (6);
            String phonea = "("+ first + ")" +"-"+middle+ "-"+last; 


            // print stuff back 
            System.out.println ("correct until exit"+ phonea);

            // condition to exit    
            if (phone.equalsIgnoreCase("quit")); //not working?
            if (phone.equalsIgnoreCase("end"));
            if (phone.equalsIgnoreCase("stop"))System.exit(0); 
        }
        else
        {
            System.err.println("error-incorrect format: "+ phone); //error

        }    
    }
}

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Около 1: если вы хотите, чтобы программа запрашивала второй ввод, вам нужно указать это сделать. Все в основной функции вызывается только один раз. Вы можете поместить все в цикл, где вы спрашиваете

while (!phone.equalsIgnoreCase("quit")) {

}

Это будет цикл, пока вы не введете выход.

Пока что ваши условия выхода не работают, потому что вы оставили точку с запятой после своего оператора if. Из-за этого компилятор считает, что строка окончена и переходит на следующую строку.

 if (phone.equalsIgnoreCase("quit")); //remove the semicolon in this line, otherwise System.exit will never be called.

Также вы помещаете эти строки в оператор if (Number (phone)). Но так как «выход» не является числом, вы никогда не достигнете этой строки кода, когда фактически введете выход.

1 голос
/ 24 июня 2011

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

        // print stuff back 
        System.out.println ("correct until exit"+ phonea);

        // condition to exit    
        if (phone.equalsIgnoreCase("quit")); //not working?
        if (phone.equalsIgnoreCase("end"));
        if (phone.equalsIgnoreCase("stop"))
            System.exit(0);

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

Что нужно сделать после проверки, так это запросить у пользователя правильные данные, чтобы приложение могло определить, каким должно быть следующее состояние.Поскольку мы (пользователи SO) не знаем точно, какова спецификация программы, мы не можем определить, что именно вам нужно делать.Однако это, вероятно, будет выглядеть примерно так:

System.out.println("What would you like to do?");
String nextState = sc.nextLine();

while (!nextState.equals("quit") && !nextState.equals("exit")) {
    //Do what you need to do (read the phone number, validate it, etc)

    System.out.println("What would you like to do?");
    String nextState = sc.nextLine();
}

System.out.println("End of application");

По сути, это дает приложению контроль при определении того, когда приложение должно запускаться и останавливаться.Хотя пользователь не хочет, чтобы приложение было остановлено, вы продолжаете запрашивать у него номера телефонов для проверки.

Хотя это еще не весь ответ на возникающие у вас проблемы, мы надеемся, что оно даст вамнекоторые достойные рекомендации по устранению некоторых проблем с приложениями.

0 голосов
/ 24 июня 2011

В общем, если вы не понимаете, что делает ваш код, я рекомендую:

  • Попробуйте удалить материал из вашей программы (после создания резервной копии), пока у вас не будет короткого простогопример того, что вы не понимаете.Зачем пытаться выяснить большую нечеткую проблему, если вы можете выяснить меньшую ее часть?
  • Поэкспериментируйте, добавив такие выражения, как System.out.println('reached line 17'), по всему коду, чтобы увидеть порядок, в котором ваша программа работает.

Тем не менее, вот некоторые (частичные) ответы.

1) Он не зацикливается после успеха

Цикл многократно выполняет операторы внутри него. Звучит так, как вы хотите бытьповторяется большинство или вся программа:

  1. чтение строки с клавиатуры
  2. удаление определенных символов из строки
  3. , если оставшаяся строка является числом, отделите еена 3 части, затем выведите correct

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

(И где-то внутри этого цикла будет находиться код, выходящий из программы , если , входная строка "выход" и т. Д.)

2) выдает ошибку из-за круглых скобок в: phone = phone.replaceAll("(","");

Чтобы это исправить, нужно знать две вещи.Во-первых, replaceAll обрабатывает свой первый аргумент "(" как регулярное выражение .Не беспокоясь о том, что это такое, просто знайте, что replaceAll придает особое значение символу (, а не трактует его как обычный старый (.Вы можете сказать replaceAll, чтобы он обрабатывался нормально, поставив \ перед (.\ называется «побег».Поэтому содержимое вашего строкового аргумента должно быть: \(

Во-вторых, вы не можете просто ввести "\(" в свой исходный код, потому что сам компилятор Java обрабатывает \ как специальный символ. Вы должны добавить еще одну обратную косую черту, чтобы указать компилятору нормально обрабатывать другую обратную косую черту.Звучит абсурдно, но так оно и есть.

phone = phone.replaceAll("\\(","");

3) не имеет максимальной проверки символов с помощью логической команды.

Не уверен, что вы хотите здесь: проверять, что он имеет больше или меньше , чем определенное количество символов?В любом случае, вы можете написать if, чтобы проверить, больше или меньше phone.length () какое-либо число.

...