Teda, samozřejmě zůstane u main a teoreticky má smysl ještě u NactiInt a NactiString, ale jinde ne.
A ten "pohybu" v menu asi funguje, ale jinak je blbě. Když se chceš z metody vrátit zpátky, tak se z ní vracej zpátky, nevolej z ní nadřazenou metodu. Stejně tak to opakování volby...
public void Volba() {
int i;
do{
i = NactiInt();
switch (i) {
case 1:
VytvoreniZakaznika();
break;
case 2:
VypisZakazniku();
break;
case 3:
System.out.println("Přihlásit se do bankomatu");
break;
case 4:
System.out.println("Program byl ukončen");
System.exit(0);
default:
System.out.println("Neplatný výběr možnosti. Zkuste to znovu");
}
} while (i > 4);
}
a metodu UvodniMenu jsem změnil na Uvodnimenu. Tak jste to myslel?
Snad už naposled. Nerad otravuji ale u výpisu zákazníků mi to hází NullPointerException. Dočetl jsem se, že nastává při práci s proměnnou, která obsahuje hodnotu null.
Používám tento můj paskvil pro pokračování v programu:
System.out.println("Pro navrácení do hlavního menu napište jedničku a stiskněte enter");
do{
menu=nactiInt();
if(menu == 1){
menu1(); /*tam se chci dostat*/
}else{
System.err.println("Špatně zadáno");
}
Prosím jak napsat aby uživatel mohl pro pokračování stisknout pouze enter?
#13Neznalec
Nikdo učený z nebe nespadl. Kdybych to kdysi nevyčetl od Herouta, tak bych to asi také nevěděl.
Těch nesmyslů tam máš víc. Například číslo karty ani PIN nesouvisí se zákazníkem. Proto by měly být v samostatné třídě. Totéž s kontem. Zkoušej varianty.
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Taky právě čtu Herouta (java5) i když nato můj program nevypadá :D.
hlavní třída:
package bankomat;
import java.util.*;
/**
*
* @author marek
*/
public class Bankomat {
int pocetklientu=1;
private int hotovost;
SeznamKlientu[] pole = new SeznamKlientu[50];
public Bankomat(int hotovost) {
this.hotovost = hotovost;
}
public static int nactiInt() {
Scanner sc = new Scanner(System.in);
int i;
do {
try {
i = sc.nextInt();
sc.nextLine(); /* Vyprázdní Buffer klávesnice*/
return i;
} catch (InputMismatchException e) {
System.out.println("Chybné zadání! \n Zkuste to znovu: ");
sc.nextLine(); /* Vyprázdní Buffer klávesnice*/
}
} while (true);
}
public static String nactiString() {
Scanner sc = new Scanner(System.in);
String text = sc.nextLine();
return text;
}
public void menu1() {
System.out.println("---------------------------------\n ZCUBank Vás vítá.\n");
System.out.println(" 1. Vytvoř klienta\n 2. Vypsat klienty\n 3. Přihlásit se do bankomatu\n 4. Odejít \n");
volba();
}
public void volba() {
int i;
do {
i = nactiInt();
switch (i) {
case 1:
vytvorKlienta();
break;
case 2:
vypisKlienty();
break;
case 3:
prihlasKlienta();
break;
case 4:
System.out.println("Program byl ukončen");
System.exit(0);
default:
System.out.println("Neplatný výběr možnosti. Zkuste to příště");
}
} while (i < 4);
}
public int zadejKartu(){
boolean ok = false;
System.out.println("Zadejte prvních pět čísel vaší karty: ");
int cislokarty = nactiInt();
if (cislokarty < 100000 && cislokarty > 9999) {
for (int i = 1; i < pole.length; i++) {
if (pole[i] != null) {
if (((Klient) pole[i]).cislokarty == cislokarty) {
ok = true;
if (ok == true) {
System.err.println("Tato karta už existuje!");
vytvorKlienta();
} else {
return cislokarty;
}
}
}
}
} else {
System.err.println("Vypište pouze prvních pět čísel vaší karty");
vytvorKlienta();
}
return cislokarty;
}
public int zadejPin(){
System.out.println("Zadejte čtyřmístný pin: ");
int pin = nactiInt();
if (pin < 10000 && pin > 999){
return pin;
}else {
System.err.println("Pin kod musí obsahovat pouze čtyři čísla");
zadejPin();
}
return pin;
}
public int zadejStavKonta(){
System.out.println("Zadejte kolik jste vložil peněz na účet: ");
int stavkonta = nactiInt();
if (stavkonta > 0){
return stavkonta;
}else {
System.err.println("stav konta nemůže být záporný");
zadejStavKonta();
}
return stavkonta;
}
public void vytvorKlienta() {
int cislokarty = zadejKartu();
int pin = zadejPin();
int stavkonta = zadejStavKonta();
System.out.println("Zadejte jméno klienta: ");
String jmeno = nactiString();
pole[pocetklientu] = new Klient(cislokarty, pin, stavkonta, jmeno);
pocetklientu = pocetklientu + 1;
System.out.println(" \n *****Právě přibyl nový klient, děkujeme.*****");
menu1();
}
public void vypisKlienty() {
for (int i = 0; i < pole.length; i++) {
if (pole[i] != null) {
System.out.println(+(i) + "." + " Klient: " + ((Klient) pole[i]).getJmeno() + "| karta: " + ((Klient) pole[i]).getCisloKarty() + "| pin: " + ((Klient) pole[i]).getPin() + "| Stav konta: " + ((Klient) pole[i]).getStavKonta());
}
}
System.out.println("Pro navrácení do hlavního menu stiskněte enter");
int menu;
do{ menu=nactiInt();
if(menu == 1){
menu1();}else{
System.err.println("Špatně zadáno");
}
}while(false);
}
public void prihlasKlienta() {
System.out.print("Zadejte číslo vaší karty (prvních pět číslic): ");
int cislokarty = nactiInt();
System.out.print("Zadejte PIN vaší karty: ");
int PIN = nactiInt();
int poradivpoli = 0;
int ok = 0;
for (int i = 0; i < pole.length; i++) {
if (pole[i] != null) {
if (((Klient) pole[i]).getCisloKarty() == cislokarty && ((Klient) pole[i]).getPin() == PIN) {
ok = 1;
poradivpoli = i;
}
}
}
if (ok == 1) {
do {
System.out.println("------------------------\n Vítejte ve svém účtu\n");
System.out.println(" 1. Vložit peníze\n 2. Vybrat peníze\n 3. Vypsat aktulální zůstatek\n 4. Odhlásit se \n-----------------------");
int volba = nactiInt();
if (volba == 1) {
System.out.println("Vložit peníze");
System.out.print("Částka, kterou si přejete uložit: ");
int castka = nactiInt();
((Klient) pole[poradivpoli]).stavkonta += castka;
System.out.println("Na Váš účet byla uložena částka: " + castka + " Kč");
System.out.println("Váš aktuální zůstatek: " + ((Klient) pole[poradivpoli]).getStavKonta() + " Kč");
}
if (volba == 2) {
System.out.println("Vybrat peníze");
System.out.print("Částka, kterou si přejete vybrat: ");
int castka = nactiInt();
int penize = hotovost;
try {
penize -= hotovost;
}catch (BankomatException be) {
System.out.println("Vyhledejte jiný bankomat");
System.out.println(be.getMessage());
be.printStackTrace();
}
if (castka > 0) {
if (pole[poradivpoli] != null) {
if (((Klient) pole[poradivpoli]).getStavKonta() >= castka) {
((Klient) pole[poradivpoli]).stavkonta -= castka;
System.out.println("Z vašeho účtu byla vybráno: " + castka + " Kč");
System.out.println("Váš aktuální zůstatek: " + ((Klient) pole[poradivpoli]).getStavKonta() + " Kč");
}
} else {
System.err.println("Z účtu není možné vybrat tolik peněz");
}
}
}
if (volba == 3) {
System.out.println("Váš aktuální zůstatek: " + ((Klient) pole[poradivpoli]).stavkonta + " Kč");
}
if (volba == 4) {
ok = 0;
break;
}
} while (ok == 1);
} else {
System.err.println("Špatné číslo karty nebo heslo!");
}
}
public static void main(String[] args) {
Bankomat b1 = new Bankomat(200000);
b1.menu1();
}
}
klient.java:
package bankomat;
/**
*
* @author marek
*/
public class Klient implements SeznamKlientu {
int cislokarty;
private int pin;
int stavkonta;
private String jmeno;
public Klient(int cislokarty, int pin, int stavkonta, String jmeno) {
this.cislokarty = cislokarty;
this.pin = pin;
this.stavkonta = stavkonta;
this.jmeno = jmeno;
}
public int getCisloKarty() {
return cislokarty;
}
public void setCisloKarty(int cislokarty) {
this.cislokarty = cislokarty;
}
public int getPin() {
return pin;
}
public void setPin(int pin) {
this.pin = pin;
}
public double getStavKonta() {
return stavkonta;
}
public void setStavKonta(int stav) {
this.stavkonta = stavkonta;
}
public String getJmeno() {
return jmeno;
}
public void setJmeno(String jmeno) {
this.jmeno = jmeno;
}
public String toString() {
return super.toString() + " Klient: " + getJmeno() + ", Cislo karty: " + getCisloKarty() + ", PIN: " + getPin() + ", Stav konta: " + getStavKonta();
}
public void tisk() {
System.out.println("" + toString());
}
}
BankomatException.java:
package bankomat;
/**
*
* @author marek
*/
public class BankomatException extends Exception {
public BankomatException() {
super("Bankomat dočasně mimo provoz");
}
}
Poslední co bych dneska chtěl dořešit. Pokouším se o výjimku kdy dojde k vybrání zásob bankomatu (řádek 197-203).
Hází mi chybu: exception BankomatException is never thrown in body of corresponding try statement
PIN není číslo. Je to řetězec 4 číslic. Mělo by se s ním tak zacházet. Podobně jako číslo karty, rodné číslo ani telefonní číslo nejsou čísla, ale posloupnosti číslic - tedy stringy.
V té nudli se mi fakt nechce hledat chyba. Takhle dlouhé třídy se nedělají. Máš i příliš dlouhé řádky a při rolování ztrácím kontext. Až to budeš psát objektově, tak to rozděl na víc tříd a zkrať řádky - 80 znaků max. Z třídy klient můžeš vyházet zbytečné (všechny) gettery a settery.
Řádek 197 by vůbec neměl existovat. Jak ho mám najít, když tady není číslování řádků? Zkrať třídy tak, aby nepřekročily 60-80 řádek.
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
#19Neznalec
Mně se ta kniha od Eckela líbila tím, že od začátku vysvětlovala principy OOP a na Javu samotnou se dostalo až později. Nevím, jak moc je kvalitní český překlad, ale ta anglická verze je super.
Podle Eckelovy knihy jsem se naučil i psát testy a dnes na ně nedám dopustit. V podstatě pak zapomeneš, co to je "hledat chyby v programu". Te to však pokročilejší technika, časem se k ní také dostaneš.
Javascript s Javou (kromě podobné syntaxe) nemá nic společného.
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.