Skip to content

Commit 0d82d99

Browse files
Merge pull request #14 from Steva0/Nodi-Array-Alberto
LinkedList completata e classi errori + modifiche minime classi michele
2 parents 14195ce + 1a6405b commit 0d82d99

File tree

7 files changed

+352
-3
lines changed

7 files changed

+352
-3
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifndef DISPOSITIVONONTROVATOEXCEPTION_H
2+
#define DISPOSITIVONONTROVATOEXCEPTION_H
3+
4+
#include <stdexcept>
5+
#include <string>
6+
7+
class DispositivoNonTrovatoException : public std::invalid_argument
8+
{
9+
public:
10+
DispositivoNonTrovatoException(): std::invalid_argument("Dispositivo non trovato!") { }
11+
};
12+
13+
#endif // DISPOSITIVONONTROVATOEXCEPTION_H

include/LinkedList.h

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#ifndef LINKED_LIST_H
2+
#define LINKED_LIST_H
3+
#include "CreaDispositivo.h"
4+
#include "DispositivoNonTrovatoException.h"
5+
#include "ListaVuotaException.h"
6+
#include <iostream>
7+
#include <ostream>
8+
9+
10+
class LinkedList
11+
{
12+
friend std::ostream& operator<<(std::ostream& os, const LinkedList& list);
13+
14+
private:
15+
class Node
16+
{
17+
public:
18+
Dispositivo* disp;
19+
Node* prev;
20+
Node* next;
21+
Node(Dispositivo& data);
22+
23+
//copy constructor
24+
Node(const Node& data);
25+
26+
//copy assignment
27+
Node& operator=(const Node& data);
28+
29+
~Node();
30+
};
31+
32+
Node* head;
33+
Node* tail;
34+
35+
//Funzioni private
36+
Node* searchDispositivo(const std::string nome) const; //cerca un dispositivo nella lista
37+
void connectBefore(Node* p, Node* q); //connette prima di p il nodo q
38+
39+
public:
40+
//Costruttore
41+
LinkedList();
42+
LinkedList(Dispositivo& dispositivo);
43+
44+
//Funzioni membro utili
45+
void insert(Dispositivo& dispositivo); //inserisce un dispositivo in coda
46+
Dispositivo* removeDispositivo(const std::string nome); //rimuove un dispositivo dalla lista accettando il nome del dispositivo
47+
std::vector<Dispositivo*> removeAllDispositiviOff(const int currentTime); //rimuove tutti i dispositivi spenti (la cui ora e' prima dell'orario indicato)
48+
void removeTimer(const std::string nome); //rimuove il timer di un dispositivo
49+
void removeAllTimers(); //rimuove tutti i timer
50+
bool isEmpty() const; //controlla se la lista è vuota
51+
double show(std::string nome) const; //mostra il consumo di un dispositivo
52+
double showAll() const; //mostra il consumo totale della lista
53+
54+
//Distruttiri
55+
~LinkedList();
56+
};
57+
58+
//overloading operator<<
59+
std::ostream& operator<<(std::ostream& os, const LinkedList& list);
60+
61+
#endif // LINKED_LIST_H

include/ListaDispositivi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const std::vector<std::pair<std::string, std::tuple<double, int, bool>>> disposi
1818
{"Frigorifero", {-0.4, 0, true}},
1919
{"Forno a microonde", {-0.8, 2, false}},
2020
{"Asciugatrice", {-0.5, 60, false}},
21-
{"Televisore", {-0.2, 0, false}}
21+
{"Televisore", {-0.2, 60, false}}
2222
};
2323

2424
// Mappa per tenere traccia del numero di serie specifico per ogni tipo di dispositivo

include/ListaVuotaException.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#ifndef LISTAVUOTAEXCEPTION_H
2+
#define LISTAVUOTAEXCEPTION_H
3+
4+
#include <stdexcept>
5+
6+
class ListaVuotaException: public std::out_of_range
7+
{
8+
public:
9+
ListaVuotaException(): std::out_of_range("La lista è vuota.") { }
10+
};
11+
12+
#endif // LISTAVUOTAEXCEPTION_H

src/Dispositivo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ void Dispositivo::setTimerOff() {
127127
}
128128

129129
void Dispositivo::setOrarioAccensione(int minuti) {
130-
if (minuti < 0 || minuti >= MAX_MINUTI_GIORNATA) {
130+
if (minuti < 0 || minuti >= MINUTI_GIORNATA) {
131131
throw std::invalid_argument("Orario di accensione non valido.");
132132
}
133133
orarioAccensione = minuti;
@@ -137,7 +137,7 @@ void Dispositivo::setOrarioAccensione(int minuti) {
137137
}
138138

139139
void Dispositivo::setOrarioSpegnimento(int minuti) {
140-
if (minuti < 0 || minuti >= MAX_MINUTI_GIORNATA) {
140+
if (minuti < 0 || minuti >= MINUTI_GIORNATA) {
141141
throw std::invalid_argument("Orario di spegnimento non valido.");
142142
}
143143
if (!sempreAcceso && minuti <= orarioAccensione) {

src/LinkedList.cpp

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
#include "../include/LinkedList.h"
2+
using namespace std;
3+
4+
LinkedList::Node::Node(Dispositivo& data): prev{nullptr}, next{nullptr}, disp{&data}
5+
{ }
6+
7+
LinkedList::Node::Node(const Node& data): prev{data.prev}, next{data.next}, disp{data.disp}
8+
{ }
9+
10+
LinkedList::Node& LinkedList::Node::operator=(const Node& data)
11+
{
12+
prev = data.prev;
13+
next = data.next;
14+
disp = data.disp;
15+
return *this;
16+
}
17+
18+
LinkedList::Node::~Node()
19+
{
20+
delete disp;
21+
}
22+
23+
LinkedList::LinkedList(): head{nullptr}, tail{nullptr}
24+
{ }
25+
26+
LinkedList::LinkedList(Dispositivo& dispositivo)
27+
{
28+
head = tail = new Node(dispositivo);
29+
}
30+
31+
void LinkedList::insert(Dispositivo& dispositivo)
32+
{
33+
Node* newNode = new Node(dispositivo);
34+
if(isEmpty())
35+
{
36+
head = tail = newNode;
37+
return;
38+
}
39+
40+
//Trova il punto di inserimento
41+
Node* current = head;
42+
while(current && current->disp->getOrarioAccensione() <= dispositivo.getOrarioAccensione())
43+
{
44+
current = current->next;
45+
}
46+
47+
if(current == head) //significa che lo aggiungo all'inizio di tutti, quindi prima di head
48+
{
49+
newNode->next = head;
50+
head->prev = newNode;
51+
head = newNode;
52+
}
53+
else if(current == nullptr) //significa che lo aggiungo alla fine di tutti, quindi dopo tail
54+
{
55+
tail->next = newNode;
56+
newNode->prev = tail;
57+
tail = newNode;
58+
}
59+
else
60+
{
61+
connectBefore(current, newNode);
62+
}
63+
}
64+
65+
Dispositivo* LinkedList::removeDispositivo(const string nome)
66+
{
67+
if(isEmpty())
68+
{
69+
throw ListaVuotaException();
70+
}
71+
72+
Node* current = searchDispositivo(nome);
73+
74+
if(current == head)
75+
{
76+
head = head->next;
77+
head->prev = nullptr;
78+
return current->disp;
79+
}
80+
else if(current == tail)
81+
{
82+
tail = tail->prev;
83+
tail->next = nullptr;
84+
return current->disp;
85+
}
86+
else
87+
{
88+
current->prev->next = current->next;
89+
current->next->prev = current->prev;
90+
return current->disp;
91+
}
92+
}
93+
94+
vector<Dispositivo*> LinkedList::removeAllDispositiviOff(const int currentTime)
95+
{
96+
if(isEmpty())
97+
{
98+
throw ListaVuotaException();
99+
}
100+
101+
vector<Dispositivo*> dispositiviSpenti;
102+
Node* current = head;
103+
while(current)
104+
{
105+
if(current->disp->getOrarioSpegnimento() <= currentTime)
106+
{
107+
dispositiviSpenti.push_back(current->disp);
108+
Node* temp = current;
109+
current = current->next;
110+
removeDispositivo(temp->disp->getNome());
111+
}
112+
else
113+
{
114+
current = current->next;
115+
}
116+
}
117+
118+
return dispositiviSpenti;
119+
}
120+
121+
122+
void LinkedList::removeTimer(const string nome)
123+
{
124+
if(isEmpty())
125+
{
126+
throw ListaVuotaException();
127+
}
128+
129+
Node* current = searchDispositivo(nome);
130+
131+
current->disp->setTimerOff();
132+
}
133+
134+
void LinkedList::removeAllTimers()
135+
{
136+
if(isEmpty())
137+
{
138+
throw ListaVuotaException();
139+
}
140+
141+
Node* current = head;
142+
while(current)
143+
{
144+
current->disp->setTimerOff();
145+
current = current->next;
146+
}
147+
}
148+
149+
bool LinkedList::isEmpty() const
150+
{
151+
return (head == nullptr);
152+
}
153+
154+
ostream& operator<<(ostream& os, const LinkedList& list)
155+
{
156+
if(list.isEmpty())
157+
{
158+
os << "Linked List is Empty!";
159+
}
160+
else
161+
{
162+
LinkedList::Node* iteratorList = list.head;
163+
while(iteratorList != nullptr)
164+
{
165+
os << iteratorList->disp->getNome() << " ";
166+
iteratorList = iteratorList->next;
167+
}
168+
169+
}
170+
171+
return os;
172+
}
173+
174+
void LinkedList::connectBefore(Node* p, Node* q)
175+
{
176+
p->prev->next = q;
177+
q->prev = p->prev;
178+
179+
q->next = p;
180+
p->prev = q;
181+
}
182+
183+
LinkedList::Node* LinkedList::searchDispositivo(const std::string nome) const
184+
{
185+
if(isEmpty())
186+
{
187+
throw ListaVuotaException();
188+
}
189+
190+
Node* current = head;
191+
while(current && current->disp->getNome() != nome)
192+
{
193+
current = current->next;
194+
}
195+
196+
if(current == nullptr)
197+
{
198+
throw DispositivoNonTrovatoException();
199+
}
200+
201+
return current;
202+
}
203+
204+
205+
LinkedList::~LinkedList()
206+
{
207+
Node* current = head;
208+
while(current)
209+
{
210+
Node* temp = current;
211+
current = current->next;
212+
delete temp;
213+
}
214+
}

src/mainNode.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//Alberto Bortoletto
2+
#include "../include/LinkedList.h"
3+
#include <iostream>
4+
5+
using namespace std;
6+
7+
int main()
8+
{
9+
Dispositivo Frigorifero = CreaDispositivo::creaDispositivo("Frigrifero", 76); //Manuale
10+
Dispositivo Lavatrice = CreaDispositivo::creaDispositivo("Lavtrice", 8); //110 min
11+
Dispositivo ScaldaBagno = CreaDispositivo::creaDispositivo("Scalda bagno", 9); //Manuale
12+
Dispositivo Televisore = CreaDispositivo::creaDispositivo("Televisre", 4); //60 min
13+
Dispositivo Asciugatrice = CreaDispositivo::creaDispositivo("Asciugatrice", 2); //60 min
14+
Dispositivo FornoMicroonde = CreaDispositivo::creaDispositivo("Forno a microonde", 1); //2 min
15+
16+
LinkedList list = LinkedList();
17+
18+
list.insert(Frigorifero);
19+
cout << list << endl;
20+
21+
list.insert(Lavatrice);
22+
cout << list << endl;
23+
24+
list.insert(ScaldaBagno);
25+
cout << list << endl;
26+
27+
list.insert(Televisore);
28+
cout << list << endl;
29+
30+
list.insert(FornoMicroonde);
31+
cout << list << endl;
32+
33+
list.insert(Asciugatrice);
34+
cout << list << endl;
35+
36+
list.removeDispositivo("Scaldabagno");
37+
cout << list << endl;
38+
39+
cout << Televisore.getOrarioSpegnimento() << endl;
40+
41+
list.removeAllDispositiviOff(5);
42+
cout << list << endl;
43+
44+
list.removeTimer("Asciugatrice");
45+
cout << list << endl;
46+
cout << Asciugatrice.getOrarioSpegnimento() << endl;
47+
48+
49+
}

0 commit comments

Comments
 (0)