Laborator 9

Problema 1

Se considera o cutie postala care poate contine mesaje. Fiecare mesaj este caracterizat prin prioritate (urgent sau ordinar), destinatar (sir de caractere) si continut (sir de caractere). Un mesaj prioritar va fi plasat intotdeauna pe prima pozitie în cutia postala, unul ordinar va fi plasat astfel incat mesajele ordinare din cutie sa fie in permanenta ordonate alfabetic dupa destinatarul lor. Astfel, pe primele pozitii vor fi mesaje urgente neordonate dupa destinatar, iar cand se termina mesajele urgente in lista vor urma mesaje ordinare ordonate alfabetic dupa destinatar (se va folosi o singura lista pentru toate mesajele). Sa se implementeze urmatorii operatori: • initializare() - initializeaza cutia postala, nici un mesaj; • trimitere_mesaj(prioritate, destinatar, continut) - in cutia postala se adauga un mesaj nou avand campurile date; •primire_mesaj(destinatar) - persoana cu numele precizat isi ridica din cutia postala mesajul cel mai prioritar care-i este adresat; se va afisa continutul mesajului si prioritatea sa; • afisare() – se listeaza mesajele de prioritate mica (mesajele ordinare) in ordine alfabetica inversa, dupa destinatarul lor.

Rezolvare Java cu LinkedList:

Implementare LinkedList simplu circular

class LinkedList<Element> {

private class Node {

Element data;

Node next;

public Node(Element data) {

this.data=data;

this.next=null;

}

public Node(Element data, Node next) {

this.data = data;

this.next = next;

}

public Element getData() {

return this.data;

}

public void setData(Element data) {

this.data = data;

}

public Node getNext() {

return this.next;

}

public void setNext(Node nextNode) {

this.next = nextNode;

}

}

private Node inceput;

private Node sfarsit;

private int size;

public LinkedList() {

inceput = null;

sfarsit = null;

size = 0;

}

private Node getNode(int index){

if(index>size){

throw new IllegalArgumentException("Pozitia este prea mare. Maxim: "+this.size);

}

Node curent = inceput;

for (int i=0;i<index;i++){

curent = curent.getNext();

}

return curent;

}

public void add(int index, Element data) {

if (index > size) {

throw new IllegalArgumentException("Pozitia la care vreti sa inserati este mai mare decat dimensiunea listei" +

"("+this.size+").");

}

else {

Node tmp = new Node(data);

Node current = getNode(index);

if (index==0) {

tmp.setNext(inceput);

inceput = tmp;

sfarsit = inceput;

}

else{

tmp.setNext(current.getNext());

current.setNext(tmp);

}

if (index == size) {

sfarsit.setNext(tmp);

sfarsit = tmp;

}

}

size++;

}

public void add(Element data) {

add(size,data);

}

public void replace(Element data, int index) {

getNode(index).setData(data);

}

public void remove(int index) {

if (index == 0) {

inceput = inceput.getNext();

} else {

getNode(index).setNext(getNode(index).getNext().getNext());

}

this.size--;

}

public boolean contains(Element data){

for(int i=0;i<size;i++)

if(getNode(i).data.equals(data))

return true;

return false;

}

public void remove(){

remove(0);

}

public Element get(int index) {

return getNode(index).getData();

}

public int size() {

return this.size;

}

}

//import java.util.LinkedList;

class Mesaj{

private String prioritate, destinatar, continut;

public Mesaj(String prioritate, String destinatar, String continut){

this.prioritate=prioritate;

this.destinatar=destinatar;

this.continut=continut;

}

public String getPrioritate() {

return prioritate;

}

public String getDestinatar() {

return destinatar;

}

public String toString() {

return "Mesaj "+prioritate+":\n"+continut;

}

}

class CutiePostala{

private LinkedList<Mesaj> cutie=new LinkedList<>();

private static final String urgent="urgent";

public void initializare(){

for(int i=0;i<cutie.size();i++)

cutie.remove();

}

private int getIndexPrioritate(){

int index=0;

while(index<cutie.size()&&cutie.get(index).getPrioritate().equals(urgent))

index++;

return index;

}

private int getIndexDestinatar(String destinatar){

int index=0;

while(index<cutie.size()&&!cutie.get(index).getDestinatar().equals(destinatar))

index++;

if(index<cutie.size())

return index;

else

throw new IndexOutOfBoundsException("Nu exista destinatarul cerut");

}

private void sortMesaje(){

int s,start=getIndexPrioritate(),end=cutie.size();

do{

s=0;

for(int i=start;i<end-1;i++){

Mesaj temp1=cutie.get(i);

Mesaj temp2=cutie.get(i+1);

if(temp1.getDestinatar().compareTo(temp2.getDestinatar())>0){

cutie.remove(i);

cutie.add(i,temp2);

cutie.remove(i+1);

cutie.add(i+1,temp2);

s=1;

}

}

}while(s!=0);

}

public void trimitereMesaj(Mesaj mesaj){

if(mesaj.getPrioritate().equals(urgent))

cutie.addFirst(mesaj);

else{

cutie.add(mesaj);

sortMesaje();

}

}

public void primireMesaj(String destinatar){

int index=getIndexDestinatar(destinatar);

System.out.println(cutie.get(index).toString()+"\n");

cutie.remove(index);

}

public String toString(){

String result="";

int end=getIndexPrioritate();

int start=cutie.size();

for(int i=start-1;i>=end;i--)

result=result+cutie.get(i).toString()+"\n";

return result;

}

}

public class Main {

public static void main(String[] args) {

CutiePostala cutiePostala=new CutiePostala();

cutiePostala.trimitereMesaj(new Mesaj("urgent","destinatar1","continut1"));

System.out.println(cutiePostala);

cutiePostala.primireMesaj("destinatar1");

cutiePostala.trimitereMesaj(new Mesaj("ordinar","destinatar1","continut1"));

cutiePostala.trimitereMesaj(new Mesaj("urgent","destinatar1","continut2"));

cutiePostala.primireMesaj("destinatar1");

cutiePostala.trimitereMesaj(new Mesaj("ordinar","destinatar3","continut3"));

System.out.println(cutiePostala);

}

}

Problema 2

Sa se scrie un program folosind liste simplu inlantuite pentru modelarea cat mai eficienta din punct de vedere al timpului de rulare a situatiei dintr-un campionat de basket. Programul va putea efectua operatii asupra unui numar arbitrat de echipe si va trebui sa implementeze urmatorii operatori:

-vidare() - initializarea sistemului, nici o echipa

-adaugare_echipa(nume)

-eliminare_echipa(nume)

-adaugare_jucator(nume_jucator, nume_echipa, salar) - adaugarea unui jucator intr-o echipa existenta, se va verifica daca jucatorul nu exista in vreo alta echipa

-elimina_jucator(nume) - eliminarea unui jucator de la echipa la care joaca

-listare(nume_echipa) - listare jucatori pentru echipa precizata in ordinea alfabetica a numelui

Rezolvare Java cu LinkedList

import java.util.LinkedList;

class Jucator{

private String nume;

private double salariu;

public Jucator(String nume, double salariu){

this.nume=nume;

this.salariu=salariu;

}

public String getNume() {

return nume;

}

public boolean equals(Object o){

if(o instanceof Jucator)

if(nume.equals(((Jucator)o).nume)&& salariu==((Jucator)o).salariu)

return true;

return false;

}

public String toString(){

return "Jucator: "+this.nume+"\n";

}

}

class Echipa{

private String numeEchipa;

private LinkedList<Jucator> jucatori=new LinkedList<>();

public Echipa(String numeEchipa){

this.numeEchipa=numeEchipa;

}

public void adaugareJucator(Jucator jucatorNou){

if(jucatorNou==null)

System.out.println("Nu se poate adauga jucatorul");

else

jucatori.add(jucatorNou);

}

private int gasireJucator(Jucator jucator){

int index=0;

for(int i=0;i<jucatori.size();i++)

if(jucatori.get(i).equals(jucator))

index=i;

return index;

}

public boolean existaJucator(Jucator jucator){

int end=jucatori.size();

for(int i=0;i<end;i++)

if(jucatori.get(i).equals(jucator))

return true;

return false;

}

public void eliminareJucator(Jucator jucator){

if(existaJucator(jucator))

jucatori.remove(gasireJucator(jucator));

else

System.out.println("Nu exista jucatorul "+jucator.getNume()+"\n");

}

private void sortareJucatori(){

int s,end=jucatori.size();

do{

s=0;

for(int i=0;i<end-1;i++){

Jucator tmp1=jucatori.get(i);

Jucator tmp2=jucatori.get(i+1);

if(tmp1.getNume().compareTo(tmp2.getNume())>0){

jucatori.remove(i);

jucatori.add(i,tmp2);

jucatori.remove(i+1);

jucatori.add(i+1,tmp1);

s=1;

}

}

}while(s!=0);

}

public boolean equals(Echipa echipa) {

if(numeEchipa.equals(echipa.numeEchipa))

return true;

return false;

}

public String toString(){

sortareJucatori();

StringBuilder result=new StringBuilder();

result.append("Echipa: ").append(this.numeEchipa).append("\n");

int end=jucatori.size();

for(int i=0;i<end;i++)

result.append(jucatori.get(i).toString());

return String.valueOf(result);

}

}

class Campionat{

private LinkedList<Echipa> echipe=new LinkedList<>();

public void adaugaEchipa(Echipa echipaNoua){

if(echipaNoua==null)

System.out.println("Nu se poate adauga echipa");

else

echipe.add(echipaNoua);

}

public void adaugareJucator(Jucator jucatorNou, Echipa echipa){

int end=echipe.size();

boolean found=false;

for(int i=0;i<end;i++)

if(echipe.get(i).existaJucator(jucatorNou))

found=true;

if(found==false)

echipa.adaugareJucator(jucatorNou);

else

System.out.println("Nu se poate adauga jucatorul "+jucatorNou.getNume()+". Acesta face parte din alta echipa\n");

}

//contains

public boolean existaEchipa(Echipa echipa){

int end=echipe.size();

for(int i=0;i<end;i++)

if(echipe.get(i).equals(echipa))

return true;

return false;

}

private int gasireEchipa(Echipa echipa){

int end=echipe.size(),index=0;

for(int i=0;i<end;i++)

if(echipe.get(i).equals(echipa))

index=i;

return index;

}

public void eliminareEchipa(Echipa echipa){

if(existaEchipa(echipa))

echipe.remove(gasireEchipa(echipa));

else

System.out.println("Echipa nu exista");

}

public void initializare(){

int end=echipe.size();

for(int i=0;i<end;i++)

echipe.remove();

}

public void listare(Echipa echipa){

if(existaEchipa(echipa))

System.out.println(echipe.get(gasireEchipa(echipa)));

else

System.out.println("Nu se poate afisa echipa deoarece aceasta nu exista in campionat");

}

}

public class Main {

public static void main(String[] args) {

Campionat campionat=new Campionat();

Echipa echipa1=new Echipa("Echipa1");

echipa1.adaugareJucator(new Jucator("nume1",1000));

echipa1.adaugareJucator(new Jucator("nume2",2000));

Echipa echipa2=new Echipa("Echipa2");

echipa1.adaugareJucator(new Jucator("nume2",2200));

echipa1.adaugareJucator(new Jucator("nume2",2200));

campionat.adaugaEchipa(echipa1);

campionat.adaugaEchipa(echipa2);

campionat.listare(echipa1);

campionat.adaugareJucator(new Jucator("nume3",3000),echipa1);

campionat.adaugareJucator(new Jucator("nume4",4000),echipa2);

campionat.adaugareJucator(new Jucator("nume4",4000),echipa2);

campionat.eliminareEchipa(echipa2);

campionat.eliminareEchipa(echipa2);

echipa1.eliminareJucator(new Jucator("nume3", 3000));

echipa1.eliminareJucator(new Jucator("nume1", 1000));

campionat.listare(echipa1);

campionat.listare(echipa2);

}

}