私が取り組んでいるこのプログラムのパート 3 に少し行き詰まっています。要件は次のとおりです。
プログラムは、ユーザーに有効な姓を入力するように求め、有効な姓が入力されるまで再プロンプトを出します。姓は、文字とスペースのみを含み、最初と最後が文字であり、2 つの連続するスペースが含まれていない場合に有効です。
次に、プログラムは生年月日のプロンプトを表示します。有効な生年月日は 1900 年から 1999 年までの整数ですが、プログラムは数値以外の入力に対して再プロンプトを出す必要があります。これは暗黙的に、データを文字列として読み取る必要があることを意味します。
最後に、プログラムは有効なウィスコンシン州の運転免許証番号の入力を求めます。LDDD-DDDD-DDDD-DD という形式で、L は大文字、D は数字です。たとえば、A123-4567-8901-23 です。プログラムは、ダッシュを含む有効な数字が入力されるまで再プロンプトを出します。
これらの入力に一貫性を持たせるには、姓の最初の文字が運転免許証番号の最初の文字と一致する必要があります。大文字と小文字は区別されないため、「el Guapo」という姓は、「E」で始まる運転免許証番号と一致します。また、生年月日の下 2 桁は、運転免許証番号 (Y で示されます) でエンコードされます: LDDD-DDDY-YDDD-DD。したがって、A123-4567-8901-23 は 1978 年生まれの人に属します。姓、生年月日、および運転免許証番号が一致している場合、プログラムは一致して出力します。そうしないと、不正に印刷されます。
これが私がこれまでに持っているものです:
import java.util.Scanner;
public class Program06
{
public static void main(String[] args)
{
Scanner stdIn = new Scanner(System.in);
boolean legal = false;
boolean space = false;
String name;
String yearStr = null;
String licenseNumber;
int yearInt;
// while legal is false, loop
while (!legal)
{
System.out.print("Enter a last name: ");
name = stdIn.nextLine();
legal = true; // legal will be true, until illegal input found
if (Character.isLetter(name.charAt(0))
&& Character.isLetter(name.charAt(name.length() - 1)))
{
// if first and last characters are letters, check rest, else is
// illegal
for (int i = 0; i < name.length() && legal; i++)
{
// walking through name, checking each letter.
// if legal = false, will break loop
if (Character.isLetter(name.charAt(i)))
{
space = false; // resetting space
}
else if (name.charAt(i) == ' ')
{
// making sure not 2 spaces in a row
if (!space)
{
space = true;
}
else
{
legal = false;
}
}
else
{
legal = false;
}
}
else
{
legal = false;
}
}
legal = false;
while (!legal)
{
System.out.println("Enter year of birth: ");
yearStr = stdIn.nextLine();
if (yearStr.matches("19[\\d][\\d]"))
{
legal = true;
}
}
legal = false;
while (!legal)
{
System.out.println("Enter driver's license number: ");
licenseNumber = stdIn.nextLine();
// Here
if (licenseNumber.matches("\\p{Lu}"))
{
legal = true;
}
}
}
}
一番下の 3 番目の while ループ ( としてマーク) で、ステートメント内で
// Here
使用したことがわかります。これは明らかに、「運転免許証番号」の残りの有効性ではなく、大文字のみをテストします。どのような条件が機能しますか?\\p{Lu}
if (licenseNumber.matches("\\p{Lu}")){