Problema 32
import java.util.NoSuchElementException;
class DimensiuneNegativaCoada extends RuntimeException{
public DimensiuneNegativaCoada(String mesaj){
super(mesaj);
}
}
class NumarMaximElementeAtins extends Exception{
public NumarMaximElementeAtins(String mesaj){
super(mesaj);
}
}
interface Strategie{
public boolean conditie(CardBancar card);
}
class NumeStrategie implements Strategie{
private String numeStrategie;
public NumeStrategie(String numeStrategie){
this.numeStrategie=numeStrategie;
}
public boolean conditie(CardBancar card){
if(numeStrategie.equals(card.getNumeUtilizator()))
return true;
return false;
}
}
class CifreStrategie implements Strategie{
public boolean conditie(CardBancar card){
char[] tmp=card.getNumarCard();
int numbersOf5=0;
for(int i=0;i<tmp.length;i++)
if(String.valueOf(tmp[i]).equals("5"))
numbersOf5++;
if(numbersOf5==3)
return true;
return false;
}
}
class CoadaCarduri{
private final int dimensiuneCoada;
private int numarCarduri;
private CardBancar[] carduri;
private static CoadaCarduri x = null;
public static CoadaCarduri getInstance(int dimensiuneCoada){
if(x==null)x = new CoadaCarduri(dimensiuneCoada);
return x;
}
private CoadaCarduri(int dimensiuneCoada) throws DimensiuneNegativaCoada{
if(dimensiuneCoada<0)
throw new DimensiuneNegativaCoada("Dimensiunea cozii nu poate fi negativa!");
this.dimensiuneCoada=dimensiuneCoada;
carduri=new CardBancar[dimensiuneCoada];
}
public void add(CardBancar cardBancar)throws NumarMaximElementeAtins{
if(numarCarduri==dimensiuneCoada)
throw new NumarMaximElementeAtins("Numarul maxim("+this.dimensiuneCoada+") de carduri a fost atins!");
carduri[numarCarduri]=cardBancar;
numarCarduri++;
}
public CardBancar getPrimulCard()throws NoSuchElementException{
if(dimensiuneCoada==0)
throw new NoSuchElementException("Coada este vida");
return carduri[0];
}
public void stergePrimulCard()throws NoSuchElementException{
if(dimensiuneCoada==0)
throw new NoSuchElementException("Coada este vida");
for(int i=0;i<numarCarduri-1;i++)
carduri[i]=carduri[i+1];
numarCarduri--;
}
public String toString(){
StringBuilder result = new StringBuilder();
for(int i=0;i<numarCarduri;i++)
result.append(carduri[i]).append("\n");
return result.toString();
}
public boolean esteInCoada(Strategie strategie){
for(int i=0;i<numarCarduri;i++)
if(strategie.conditie(carduri[i]))
return true;
return false;
}
}
class CardBancar{
private String numeUtilizator;
private char[] numarCard=new char[16];
public CardBancar(String numeUtilizator, char[] numarCard){
this.numeUtilizator=numeUtilizator;
this.numarCard=numarCard;
}
public String getNumeUtilizator() {
return numeUtilizator;
}
public char[] getNumarCard() {
return numarCard;
}
}
class Maestro extends CardBancar{
public Maestro(String numeUtilizator, char[] numarCard){
super(numeUtilizator,numarCard);
}
public String toString(){
return "Card Maestro:\n"+"Nume utilizator:"+super.getNumeUtilizator()+"\nNumar card:"+String.valueOf(super.getNumarCard())+"\n";
}
}
class VisaMasterCard extends CardBancar{
private char[] numarControl=new char[3];
public VisaMasterCard(String numeUtilizator, char[] numarCard, char[]numarControl){
super(numeUtilizator,numarCard);
this.numarControl=numarControl;
}
public char[] getNumarControl() {
return numarControl;
}
}
class Visa extends VisaMasterCard{
public Visa(String numeUtilizator, char[] numarCard, char[] numarControl){
super(numeUtilizator,numarCard,numarControl);
}
public String toString(){
return "Card Visa:\n"+"Nume utilizator: "+super.getNumeUtilizator()+"\nNumar card: "+String.valueOf(super.getNumarCard())
+"\nNumar control: "+String.valueOf(getNumarControl())+"\n";
}
}
class MasterCard extends VisaMasterCard{
public MasterCard(String numeUtilizator, char[] numarCard, char[] numarControl){
super(numeUtilizator,numarCard,numarControl);
}
public String toString(){
return "Card MasterCard:\n"+"Nume utilizator: "+super.getNumeUtilizator()+"\nNumar card: "+String.valueOf(super.getNumarCard())
+"\nNumar control: "+String.valueOf(getNumarControl())+"\n";
}
}
public class Main {
public static void main(String[] args) {
Maestro maestroCard1=new Maestro("Utilizator1","1555667890123466".toCharArray());
MasterCard masterCard1=new MasterCard("Utilizator2","1234567890123456".toCharArray(),"123".toCharArray());
Visa visaCard1=new Visa("Utilizator3","6543210987654321".toCharArray(),"321".toCharArray());
CoadaCarduri coada1=CoadaCarduri.getInstance(5);
try {
coada1.add(masterCard1);
coada1.add(maestroCard1);
coada1.add(visaCard1);
System.out.println("Primul card:\n"+coada1.getPrimulCard()+"\n");
coada1.stergePrimulCard();
System.out.println("Coada fara primul card:\n"+coada1+"\n");
coada1.add(masterCard1);
System.out.println("Coada dupa reintroducerea primului card la final:\n"+coada1);
} catch (NumarMaximElementeAtins numarMaximElementeAtins) {
numarMaximElementeAtins.printStackTrace();
}
Strategie strategie=new NumeStrategie("Utilizator1");
Strategie strategie1=new CifreStrategie();
Strategie strategie2=new NumeStrategie("Utilizator7");
System.out.println("Utilizator1 se regaseste in coada: "+coada1.esteInCoada(strategie));
System.out.println("Exista cel putin un card care sa aiba de 3 ori cifra 5:"+coada1.esteInCoada(strategie1));
System.out.println("Utilizator7 se regaseste in coada: "+coada1.esteInCoada(strategie2));
}
}