Wątek przeniesiony 2016-12-11 21:45 z Java przez bogdans.

Sprawdzanie poprawności wprowadzanego z klawiatury imienia

0

Witam zaczynam dopiero moja przygode z programowaniem, dostalem druga prace do zrobienia i juz na samym poczatku mam problem bo nie wiem jak wpisac dozwolone znaki a w przypadku niedozwolonych znakow poprosic o ponowne wpisanie Imienia.Jezeli ktos moglby pomoc, Z gory dziekuje

0

A co już masz?

0

Coz szczerze mowiac to wlasnie zaczynam i pierwsze bylo to pytanie o Imie i nie wiem czy mam uzyc do tego cos z for loop czy jakis switch statement

1

To na pewno pomogą Ci regexp'y

0

Moglby ktos podpowiedziec jak Ja mam to w ogóle zaczac bo nie za bardzo wiem co zrobic..

0

Jak chcesz sprawdzać czy na wejściu są niedozwolone znaki to zainteresuj się metodami klasy String, a szczególnie equals() i contains().

0

Zrobilem cos takiego ale tez nie do konca mi to dziala..

1
  1. Nie czytałem treści zadania, ale chyba warunek na imię był inny niż Ty stosujesz. Wymagasz żeby imię składało się wyłącznie ze znaków ?- ..
  2. Czytaj imię w pętli
while(true){
  //wypisz podpowiedź
  name = sc.nextLine();
  if(name is valid){
     break;
  } 
}

Nie wstawiaj obrazków z kodem, wstawiaj kod (w znacznikach <code class="java"></code>).

0

Sorry teraz bede dawal w znacznikach. Wiec cos tam naskrobalem, poczatek dziala teraz musze dodac "driving licence number" w formacie DDDDDDDLDLD gdzie D to cyfra a L to Liter. Niewlasciwy wybor musi byc wprowadzony ponownie.Mam cos takiego, ale dziala tylko przy ukladzie DDDDDDDDDLL no i nie mam jeszcze nic o ponownym wpisaniu jezeli numer jest zly. Jakies sugestie?

1

Dziwne wg. mnie jest to, że w metodzie validateCustomerDetails() wiedziałeś jak zrobić pętlę na wypadek gdy ktoś poda złe imię a przy numerze już nie...

Moja propozycja:
przenieś walidację numeru do oddzielnej metody, która jako parametr przyjmie spisany numer i zwróci true/false i zrób to pętle tak jak w sprawdzaniu imienia.
Sprawdzić poprawność możesz najprościej tak:

  1. sprawdź czy wprowadzony ciąg ma określoną długość
  2. podziel wprowadzony ciąg do 3 zmiennych
  3. sprawdź czy w poszczególnych są same cyfry, litery, cyfry (tak jak przy imieniu sprawdzałeś czy są dopuszczalne znaki)
1

Jeśli w numerze licencji nie ma polskich liter, to

        if (Licencenum.matches("\\d\\d\\d\\d\\d\\d\\d[a-z,A-Z]\\d[a-z,A-Z]\\d"))
            validLicence = false;
0

Dziekuje za pomoc, Bogdan zmienilem if na while, bo wyswietlalo true przy wprowadzonej innej kombinacji niz dddddddldld.ale kolejny maly kroczek zrobiony.Dzieki

 static void validateDriverLicencenumber(){
	
	Scanner sc = new Scanner(System.in);
	System.out.println("Enter your Driving Licence num:");
	String Licencenum = sc.nextLine();
		
while (!Licencenum.matches("\\d\\d\\d\\d\\d\\d\\d[a-z,A-Z]\\d[a-z,A-Z]\\d")){
    System.out.println("Re-enter Licence number:");
	Licencenum = sc.nextLine();
	}
0

A credit Card number is compromised of 16 digits. The Expiry date of their credit card consist of two numeric characters for the month and two numeric characters for the year. The month and year are entered separated by a slash e.g 11/17.

Zrobilem to na podobnej zasadzie jak wyzej. A teraz expiry date dzielone / ? No i miesiac w dacie powinien chyba byc max do 12, nie wiem.

static void validateCreditCard(){
	Scanner sc = new Scanner(System.in);
	String  CCnum,Expiredate;
	
	do{
	
	System.out.println("Enter your Credit Card Number(16 digits only):");
	 CCnum = sc.nextLine();
	 if (!CCnum.matches("\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d"))
	System.out.println("Invalid Credit Card number, please reenter:");
	}
while (!CCnum.matches("\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d")); 
	
	System.out.println("Expire date ?");
	Expiredate= sc.nextLine();
	
	
	
	}
 
1

zamiast 16 razy pisać \d, możesz użyć \d{16},
jeśli chodzi o date na karcie w formacie mm/YY to miesiące będą w przedziale 01, 02...12, potem / , potem rok - zakładając, że mają to być dwie cyfry po prostu (00-99)
wtedy regex może wyglądać np tak:

"(0[1-9]|1[012])\\/\\d{2}"
0

Dzieki Pablito przydatne info, pomoglo.

0

Staram sie zrobil petle (do while ) wokol switcha, cos tam udalo mi sie zrobic ale nie dziala do konca tak jak powinno bo wystarczy ze wprowadze 1 litere z zawartych slow to program przechodzi dalej a powinien wrocic do poczatku, powinno akceptowac tylko Economy albo Premium itd.., Moglby ktos cos doradzic?

System.out.println("Type in which type of car would you like");
	System.out.println("economy,\ncompact,\nintermediate,\npremium");
	String cartype;
	do{
	cartype=sc.next();
	switch(cartype){
	case"Economy":case"economy":
		price =14;
		;break;
	case"Compact":case"compact":
		price = 17;
		;break;
	case"Intermediate":case"intermediate":
		price= 23;
		break;
	case"Premium":case"premium":
		price = 26;
		break;
	}
			if (!cartype.matches("[Economy,Compact,Intermediate,Premium]+"))
			System.out.println("Invalid Choice, please reenter:");
	 }
	while (!cartype.matches("[Economy,Compact,Intermediate,Premium]+"));`
0

może wystarczy po pierwszej literze z każdej opcji - użytkownicy są zazwyczaj leniwi i nikomu nie będzie się chciało wklepywać całych opcji, poza tym zrób sobie walidację danych od użytkownika w pętli while zanim użyjesz switcha - już robiłeś to wcześniej - zobacz.

System.out.println("Type in which type of car would you like");
    System.out.println(" e: economy,\n c: compact,\n i: intermediate,\n p: premium");
    String cartype = sc.next();
    while(!cartype.matches("[ecipECIP]")){
    	System.out.println("Invalid Choice, please reenter:");
    	cartype = sc.next();
    }
    
    switch(cartype){
    case"E":case"e":
//cd

przydałaby się jeszcze klauzula default w tym switchu

0

Ale na koncu zadania mam wyswietlic rachunek i wydaje mi sie ze powinienem miec cala nazwe danego typu auta.Jak zrobie twoim sposobem to wyswietli mi sie tylko e,c,i albo p.

```Car Type		c
Number of days		10
Insurance Type		cdw
Cost of Hire		0
Total Insurance cost	120
Discount		18.0
Cost-Discount		102.0
Vat			23.4
Handling Charge		3
Total Cost		128.4 


Chyba ze tutaj na koncu w output moge cos zmienic zeby wyswietlalo cala nazwe?
1

ok, to możesz np dodać w klasie pole String carType; i przypisywać mu wartość wartość w switch tak jak robisz to ze zmienną price , a potem z tego skorzystać w paragonie , możesz też pozostawić te nazwy jak miałeś wcześniej - to Twój program, ale wygodniej jest stuknąć "i" niż za każdym razem wklepywać "intermediate" :).
Poza tym nie przejmuj się tym tak bardzo, jeśli będziesz robił kiedyś jakieś gui do tego to sprawę sobie załatwisz jakimś radiobutton-em czy innym checkbox-em

1

Możesz też tak:


    switch(cartype){
    case"E":case"e":
        price = 14;
        cartype = "Economy";
        break;
 ...
0

Dziekuje, pomoglo:)

0

Jak moge ukryc pierwsze 12 cyfr z numeru karty kredytowej?

0

Ale kiedy ukryć, podczas wpisywania czy podczas wyświetlania?

0

podczas wyswietlania. Caly program juz dziala wszystko wpisane wszystkie obliczenia mam zrobione, ja pokazuje sie paragon/rachunek musze zakryc 12 cyfr z karty kredytowej. xxxx-xxxx-xxxx-dddd. Tak to ma wygladac

1

A co jest złego w takim rozwiązaniu:

 "xxxx-xxxx-xxxx-" + creditCard.substring(12);
0

Dzieki Bogdan, wlasnie o takie cos mi chodzilo;))

0

Swieta minely nowy rok sie zaczal trzeba wrocic do pisania i dokonczyc program. Ale o ile sam w Sobie program udalo mi sie skonczyc i wszystko ladnie liczy to musze zrobic dzienny raport do niego i nie wiem jak to ugryzc.Moglbym dostac jakas podpowiedz.?Dziekuje

Raport:

"Kiedy operator zdecyduje sie wyjsc z programu, dzienny raport bedzie wyswietlony na ekranie"

  • Ilość każdego rodzaju samochodu, który został wynajety
  • Calkowita suma wynajetych samochodow
  • Numer wynajetych urzadzen GPS
    -Numer wynajetych fotelikow dzieciecych
  • Calkowita suma znizki
  • Suma zaplaconego podatku

Nie wiem za bardzo od czego zaczac przy tworzeniu tego raportu, bylbym wdzieczny za jakies wskazowki.

0

Program skonczony, dzisiaj oddany.Dziekuje wszystkim za pomoc:) Temat do zamkniecia

1 użytkowników online, w tym zalogowanych: 0, gości: 1