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;
}