Laborator 8

Problema

Un program bibliotecar tine evidenta cartilor imprumutate de diferiti cititori. Informatiile pentru fiecare imprumut includ (primele patru campuri sunt alfanumerice): titlu carte, autor carte, nume cititor, adresa cititor, termen (numar de zile pana la returnare). Sa se implementeze operatorii: •vidare() - se initializeaza evidenta, nici o carte imprumutata; •imprumut_nou(titlu_carte, autor_carte, nume_cititor, adresa_cititor, termen_returnare) - adauga un imprumut nou, daca cititorul cu numele dat nu mai are carti imprumutate; daca are, atunci imprumutul nu va fi efectuat; •actualizare() - pentru fiecare carte imprumutata, se decrementeaza termenul de returnare cu o unitate; dupa decrementare se afiseaza cititorii care nu au returnat cartile la timp in ordine descrescatoare a intarzierilor; •returnare(nume_cititor) - cartea detinuta de cititorul cu numele precizat este returnata, ea trebuind stearsa din evidenta; •afisare() - se afiseaza evidenta.

Rezolvare problema

Rezolvare Java cu LinkedList:

Implementare proprie 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 Cititor{

private String numeCititor,adresaCititor;

public Cititor(String numeCititor, String adresaCititor){

this.numeCititor=numeCititor;

this.adresaCititor=adresaCititor;

}

public String getNumeCititor() {

return numeCititor;

}

public boolean equals(Object o){

if(o instanceof Cititor)

if(this.numeCititor.equals(((Cititor)o).getNumeCititor()))

return true;

return false;

}

public String toString(){

return "Cititor: "+numeCititor+"\nAdresa: "+adresaCititor;

}

}

class Carte{

private String numeCarte,autorCarte;

public Carte(String numeCarte,String autorCarte){

this.numeCarte=numeCarte;

this.autorCarte=autorCarte;

}

public String toString(){

return "Carte: "+this.numeCarte+" de "+this.autorCarte;

}

}

class Imprumut{

private Cititor cititor;

private Carte carte;

private int termenReturnare;

public Imprumut(Cititor cititor, Carte carte, int termenReturnare){

this.cititor=cititor;

this.carte=carte;

this.termenReturnare=termenReturnare;

}

public int getTermenReturnare() {

return termenReturnare;

}

public void decrementTermenReturnare(){

this.termenReturnare=this.termenReturnare-1;

}

public Cititor getCititor() {

return cititor;

}

public String toString(){

return cititor.toString()+"\n"+carte.toString()+"\nTermen de returnare: "+termenReturnare+"\n";

}

}

class Biblioteca{

private LinkedList<Imprumut> imprumuturi=new LinkedList<>();

public void vidare(){

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

imprumuturi.remove();

}

public void imprumutNou(Cititor cititor, Carte carte, int termenReturnare){

boolean contine=false;

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

if(imprumuturi.get(i).getCititor().equals(cititor))

contine=true;

if(false==contine)

imprumuturi.add(new Imprumut(cititor, carte, termenReturnare));

else

System.out.println("Cititorul a imprumutat deja o carte");

}

public void actualizare(){

LinkedList<Imprumut> tmp=new LinkedList<>();

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

imprumuturi.get(i).decrementTermenReturnare();

if(imprumuturi.get(i).getTermenReturnare()<1)

tmp.add(imprumuturi.get(i));

}

int s;

do {

s = 0;

for (int i = 0; i < tmp.size()-1; i++) {

if (Math.abs(tmp.get(i).getTermenReturnare()) < Math.abs(tmp.get(i+1).getTermenReturnare())) {

Imprumut temporar=tmp.get(i);

Imprumut temporar2=tmp.get(i+1);

tmp.remove(i);

tmp.add(i,temporar2);

tmp.remove(i+1);

tmp.add(i+1,temporar);

s=1;

}

}

}while(s!=0);

System.out.println("Lista intarziatilor:");

System.out.println(tmp);

System.out.println("\n");

}

public void returnare(Cititor cititor){

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

if(imprumuturi.get(i).getCititor().equals(cititor))

imprumuturi.remove(i);

}

public String toString(){

if(imprumuturi.size()==0)

return "Nu exista niciun imprumut\n";

String result="";

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

result=result+imprumuturi.get(i).toString();

}

return result+"\n";

}

}

public class Main {

public static void main(String[] args) {

Biblioteca biblioteca=new Biblioteca();

biblioteca.imprumutNou(new Cititor("NumeCititor1","AdresaCititor1"),

new Carte("NumeCarte1","AutorCarte1"),5);

biblioteca.actualizare();

System.out.println(biblioteca);

biblioteca.vidare();

System.out.println(biblioteca);

biblioteca.imprumutNou(new Cititor("NumeCititor1","AdresaCititor1"),

new Carte("NumeCarte1","AutorCarte1"),5);

biblioteca.imprumutNou(new Cititor("NumeCititor1","AdresaCititor1"),

new Carte("NumeCarte1","AutorCarte1"),5);

biblioteca.imprumutNou(new Cititor("NumeCititor2","AdresaCititor2"),

new Carte("NumeCarte2","AutorCarte2"),1);

biblioteca.imprumutNou(new Cititor("NumeCititor3","AdresaCititor3"),

new Carte("NumeCarte3","AutorCarte3"),2);

biblioteca.actualizare();

biblioteca.actualizare();

System.out.println(biblioteca);

biblioteca.returnare(new Cititor("NumeCititor2","AdresaCititor2"));

System.out.println(biblioteca);

}

}

Rezolvare C fara liste :

#include <stdio.h>

#include <stdlib.h>

#define capacitateMaxima 1000

int nrImprumuturi=0;

struct imprumut{

char titluCarte[50];

char autorCarte[50];

char numeCititor[50];

char adresaCititor[50];

int termenReturnare;

}im[capacitateMaxima];

void vidare()

{

int i=0;

for(i=0;i<nrImprumuturi;i++)

{

strcpy(im[i].titluCarte,"");

strcpy(im[i].autorCarte,"");

strcpy(im[i].numeCititor,"");

strcpy(im[i].adresaCititor,"");

im[i].termenReturnare=0;

nrImprumuturi=0;

}

}

int gasire(char numeCititor[])

{

int i;

for(i=0;i<nrImprumuturi;i++)

{

if(strcmp(im[i].numeCititor,numeCititor)==0)

return i;

}

return -1;

}

void imprumutNou(char titluCarte[], char autorCarte[], char numeCititor[], char adresaCititor[],int termenReturnare)

{

if(gasire(numeCititor)!=-1)

printf("Imprumutul nu a putut fi realizat deoarece cititorul mai are carti imprumutate");

else

{

strcpy(im[nrImprumuturi].titluCarte,titluCarte);

strcpy(im[nrImprumuturi].autorCarte,autorCarte);

strcpy(im[nrImprumuturi].numeCititor,numeCititor);

strcpy(im[nrImprumuturi].adresaCititor,adresaCititor);

im[nrImprumuturi].termenReturnare=termenReturnare;

nrImprumuturi++;

}

}

void swap(int i, int j)

{

char auxCarte[50],auxAutor[50],auxCititor[50],auxAdresa[50];

int auxTermen;

strcpy(auxCarte,im[i].titluCarte);

strcpy(auxAutor,im[i].autorCarte);

strcpy(auxCititor,im[i].numeCititor);

strcpy(auxAdresa,im[i].adresaCititor);

auxTermen=im[i].termenReturnare;

strcpy(im[i].titluCarte,im[j].titluCarte);

strcpy(im[i].autorCarte,im[j].autorCarte);

strcpy(im[i].numeCititor,im[j].numeCititor);

strcpy(im[i].adresaCititor,im[j].adresaCititor);

im[i].termenReturnare=im[j].termenReturnare;

strcpy(im[j].titluCarte,auxCarte);

strcpy(im[j].autorCarte,auxAutor);

strcpy(im[j].numeCititor,auxCititor);

strcpy(im[j].adresaCititor,auxAdresa);

im[j].termenReturnare=auxTermen;

}

void actualizare()

{

int i=0;

for(i=0;i<nrImprumuturi;i++)

im[i].termenReturnare--;

int s=0;

char auxCarte[50],auxAutor[50],auxCititor[50],auxAdresa[50];

int auxTermen;

do{

s=0;

for(i=0;i<nrImprumuturi-1;i++)

if(im[i].termenReturnare>im[i+1].termenReturnare)

{

swap(i,i+1);

s=1;

}

}while(s!=0);

int intarziat=0;

printf("\n\nLista cu cititori intarziati:\n\n");

for(i=0;i<nrImprumuturi;i++)

if(im[i].termenReturnare<0)

{

printf("Nume cititor: %s\nAdresa cititor: %s\nNumar zile de intarziere: %d\n\n",im[i].numeCititor,im[i].adresaCititor,abs(im[i].termenReturnare));

intarziat=1;

}

if(intarziat==0)

printf("Nu avem cititori intarziati");

}

void returnare(char numeCititor[])

{

int j,gasit=gasire(numeCititor);

if(gasit!=-1)

{

for(j=gasit;j<nrImprumuturi;j++)

{

strcpy(im[j].titluCarte,im[j+1].titluCarte);

strcpy(im[j].autorCarte,im[j+1].autorCarte);

strcpy(im[j].numeCititor,im[j+1].numeCititor);

strcpy(im[j].adresaCititor,im[j+1].adresaCititor);

im[j].termenReturnare=im[j+1].termenReturnare;

}

nrImprumuturi--;

}

else

{

printf("Cititorul nu a fost gasit!");

}

}

void afisare()

{

int i;

printf("\n\nAfisare:\n");

for(i=0;i<nrImprumuturi;i++)

{

printf("Titlu carte: %s\nAutor carte: %s\n",im[i].titluCarte,im[i].autorCarte);

printf("Nume cititor: %s\nAdresa cititor: %s\nTermen de returnare: %d\n\n",im[i].numeCititor,im[i].adresaCititor,im[i].termenReturnare);

}

}

int main()

{

printf("Hello world!\n");

vidare();

int i,n,auxTermen;

char auxCarte[50],auxAutor[50],auxCititor[50],auxAdresa[50];

printf("Numarul de carti pe care vreti sa le imprumutati: ");scanf("%d",&n);

for(i=0;i<n;i++)

{

printf("\nTitlul cartii: ");scanf("%s",&auxCarte);

printf("Autorul cartii: ");scanf("%s",&auxAutor);

printf("Numele cititorului: ");scanf("%s",&auxCititor);

printf("Adresa cititorului: ");scanf("%s",&auxAdresa);

printf("Termenul de returnare: ");scanf("%d",&auxTermen);

imprumutNou(auxCarte,auxAutor,auxCititor,auxAdresa,auxTermen);

}

actualizare();

printf("Cititorul care returneaza cartea: ");scanf("%s",&auxCititor);

returnare(auxCititor);

afisare();

return 0;

}

Rezolvare C cu liste(partial corecta) :

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct imprumut {

char titluCarte[50];

char autorCarte[50];

char numeCititor[50];

char adresaCititor[50];

int termenReturnare;

struct imprumut *urmator;

}im;

im *radacina=NULL;

void imprumutNou(char titluCarte[], char autorCarte[], char numeCititor[], char adresaCititor[], int termenReturnare)

{

im *im1,*im2;

int gasit=0;

for(im1=radacina;im1!=NULL;im2=im1=im1->urmator)

if(im1->urmator!=NULL)

if(strcmp(im1->urmator->numeCititor,numeCititor)==0)

gasit=1;

if(gasit)

printf("\nImprumutul nu a putut fi realizat deoarece cititorul are deja o carte imprumutata\n");

else

{

im1=(struct imprumut*)malloc(sizeof(struct imprumut));

strcpy(im1->titluCarte,titluCarte);

strcpy(im1->autorCarte,autorCarte);

strcpy(im1->numeCititor,numeCititor);

strcpy(im1->adresaCititor,adresaCititor);

im1->termenReturnare=termenReturnare;

im1->urmator=radacina;

radacina=im1;

}

}

void vidare()

{

im *im1,*im2;

for(im1=radacina;im1!=NULL;im1=im2)

{

free(im1->titluCarte);

free(im1->autorCarte);

free(im1->numeCititor);

free(im1->adresaCititor);

im2=im1->urmator;

free(im1);

}

radacina=NULL;

}

void actualizare()

{

im *im1;

char auxCarte[50],auxAutor[50],auxCititor[50],auxAdresa[50];

int auxTermen,s;

for(im1=radacina;im1!=NULL;im1=im1->urmator)

(im1->termenReturnare)--;

do{

s=0;

for(im1=radacina;im1!=NULL;im1=im1->urmator)

if(im1->urmator!=NULL)

if(im1->termenReturnare>im1->urmator->termenReturnare)

{

strcpy(auxCarte,im1->titluCarte);

strcpy(auxAutor,im1->autorCarte);

strcpy(auxCititor,im1->numeCititor);

strcpy(auxAdresa,im1->adresaCititor);

auxTermen=im1->termenReturnare;

strcpy(im1->titluCarte,im1->urmator->titluCarte);

strcpy(im1->autorCarte,im1->urmator->autorCarte);

strcpy(im1->numeCititor,im1->urmator->numeCititor);

strcpy(im1->adresaCititor,im1->urmator->adresaCititor);

im1->termenReturnare=im1->urmator->termenReturnare;

strcpy(im1->urmator->titluCarte,auxCarte);

strcpy(im1->urmator->autorCarte,auxAutor);

strcpy(im1->urmator->numeCititor,auxCititor);

strcpy(im1->urmator->adresaCititor,auxAdresa);

im1->urmator->termenReturnare=auxTermen;

s=1;

}

}while(s!=0);

}

void afisare()

{

im *im1;

printf("\n\nAfisare:\n\n");

for(im1=radacina;im1!=NULL;im1=im1->urmator)

{

printf("\nTitlu carte: %s\nAutor carte: %s\nNume cititor: %s\n",im1->titluCarte,im1->autorCarte,im1->numeCititor);

printf("Adresa cititor: %s\nTermen de returnare: %d\n\n",im1->adresaCititor,im1->termenReturnare);

}

printf("\n\n");

}

void returnare(char numeCititor[])

{

im *im1,*im2;

for(im1=radacina;im1!=NULL;im2=im1=im1->urmator)

if(im1->urmator!=NULL)

if(strcmp(im1->urmator->numeCititor,numeCititor)==0)

{

im1->urmator=im1->urmator->urmator;

free(im1->urmator->titluCarte);

free(im1->urmator->autorCarte);

free(im1->urmator->numeCititor);

free(im1->urmator->adresaCititor);

free(im1->urmator);

}

}

int main()

{

int i,n,auxTermen;

char auxCarte[50],auxAutor[50],auxCititor[50],auxAdresa[50];

vidare();

printf("Numarul de carti pe care vreti sa le imprumutati: ");scanf("%d",&n);

for(i=0;i<n;i++)

{

printf("\nTitlul cartii: ");scanf("%s",&auxCarte);

printf("Autorul cartii: ");scanf("%s",&auxAutor);

printf("Numele cititorului: ");scanf("%s",&auxCititor);

printf("Adresa cititorului: ");scanf("%s",&auxAdresa);

printf("Termenul de returnare: ");scanf("%d",&auxTermen);

imprumutNou(auxCarte,auxAutor,auxCititor,auxAdresa,auxTermen);

}

actualizare();

printf("Cititorul care returneaza cartea: ");scanf("%s",&auxCititor);

returnare(auxCititor);

afisare();

return 0;

}