• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie z "Silnikami" przy użyciu Smart Pointers - C++

Object Storage Arubacloud
0 głosów
298 wizyt
pytanie zadane 25 stycznia 2020 w C i C++ przez polskiPiter Początkujący (370 p.)
Dzień Dobry.

Ostatnio dostałem takie o to zadanie:

"Silniki

Napisz program zawierający definicje dwóch klas:

ZbiornikPaliwa, inicjowaną w konstruktorze ilością dostępnego paliwa (unsigned int). Klasa powinna mieć metodę unsigned int pobierz(unsigned int), która zwróci żądaną ilość paliwa (zmniejszając ilość w zbiorniku) jeśli jest dostępna lub zero.

Silnik, zawierającą listę podłączonych zbiorników z paliwem (lista odpowiednich smart pointerów) oraz metodę służącą do podłączenia zbiornika do silnika (dodającą smart pointer wskazujący na zbiornik do listy). Obiekt tej klasy w konstruktorze powinien startować wątek pobierający co zadany czas pewną ilość paliwa z jednego z dostępnych zbiorników (konstruktor ma mieć dwa argumenty - interwał i ilość paliwa). Jeśli ze zbiornika nie da się pobrać potrzebnej ilości paliwa, należy go odłączyć od silnika (usunąć z listy). Wątek powinien się zakończyć jeśli lista zbiorników przy próbie pobrania paliwa będzie pusta. Zbiorniki mogą być współdzielone przez kilka silników.

W funkcji main stwórz trzy silniki pobierające: - pięć jednostek paliwa co dwie sekundy, - jedną jednostkę paliwa co sekundę, - dwie jednostki paliwa co trzy sekundy, oraz dziesięć zbiorników zawierających po nie mniej niż dziesięć jednostek paliwa, które zostaną podłączone do wszystkich silników i pozwolą na ich pracę przez co najmniej 10 sekund.

W rozwiązaniu proszę nie stosować jawnie operatorów new i delete. "

Z tym zadaniem mam duże problemy (jest ono najtrudniejsze ze wszystkich jakie miałem oraz niewiele z niego zrozumiałem).

Dla tego proszę aby ktoś mi rozjaśnił o co chodzi i jak ma mniej więcej wyglądać rozwiązanie tego zadania krok po kroku. W szczególnie w następujących kwestiach:

#1. W podpunkcie ze ZbiornikiemPaliwa :
       + W sensie czy mam ilość paliwa inicjować w konstruktorze (lista inicjalizacyjna ) czy mam zapodać dane normalnie przy tworzeniu obiektu ?

#2. W podpunkcie Silnik:    
        + Lista podłączonych zbiorników z paliwem to ma być np.wektor z obiektami czy wektor z smart pointerami?
        + Metoda służąca do podłączenia zbiorników z paliwem - jak ma wyglądać ?
        + Obiekt tej klasy w konstruktorze powinien
            startować wątek pobierający co zadany czas pewną ilość paliwa z jednego z dostępnych
            zbiorników - jak zrobić ?
        
Zaznaczam też, że pierwszy raz spotykam się z smart pointerami, dlatego niech ktoś mi też wyjaśni o co z nimi chodzi i jak je wykorzystać.

Z góry przepraszam, jeśli nieodpowiednio sformułowałem swój problem.

Będe wdzięczny za jaką kolwiek pomoc.

2 odpowiedzi

+2 głosów
odpowiedź 25 stycznia 2020 przez tangarr Mędrzec (154,860 p.)

Zbiorniki mają być współdzielone przez kilka silników. Dlatego użyj wskaźnika std::shared_ptr.
Jeżeli nie możesz jawnie używać new to musisz użyć funkcji std::make_shared to tworzenia nowych silników.
Silnik musi zawierać wektor (lub listę) zawierający wskaźniki inteligentne na zbiorniki paliwa.
Do stworzenia wątków możesz użyć std::thread (więcej informacji https://en.cppreference.com/w/cpp/thread/thread/thread).
Pamiętaj, żeby metoda pobierz była zabezpieczona muteksem (https://en.cppreference.com/w/cpp/thread/mutex).
Do oczekiwania przed pobraniem paliwa użyj funkcji std::this_thread::sleep_for (https://en.cppreference.com/w/cpp/thread/sleep_for).

Przygotowałem kod, który może posłużyć za bazę do twojego programu:
 

#include <iostream>
#include <memory>
#include <chrono>
#include <vector>

class ZbiornikPaliwa {
public:
    ZbiornikPaliwa(unsigned int pojemnosc) {};
    int pobierz(unsigned int pojemnosc) {};
};

class Silnik {
public:
    Silnik(std::chrono::seconds interwal, unsigned int iloscPaliwa) {};
    void dodajZbiornik(std::shared_ptr<ZbiornikPaliwa> zbiornik) {};
};

int main()
{
    std::vector<Silnik> silniki;
    silniki.emplace_back(std::chrono::seconds(2), 5);
    silniki.emplace_back(std::chrono::seconds(1), 1);
    silniki.emplace_back(std::chrono::seconds(3), 2);
    
    for (const int &pojemnosc : {10, 11, 12, 13, 14, 15, 16, 17, 18, 19}) {
        auto zbiornik = std::make_shared<ZbiornikPaliwa>(pojemnosc);
        for (auto &silnik : silniki) {
            silnik.dodajZbiornik(zbiornik);
        }
    }
    
    // poczekaj na zakończenie wątków
    
    return 0;
}

 

komentarz 26 stycznia 2020 przez polskiPiter Początkujący (370 p.)
edycja 26 stycznia 2020 przez polskiPiter
Dzięki. Jak będe miał jakąś wątpliwość to podrzuce to co zrobiłem do tej pory.
komentarz 30 stycznia 2020 przez polskiPiter Początkujący (370 p.)

@tangarr,

Udało mi się zrobić narazie tylko tyle 

#include <iostream>
#include <vector>
#include <memory>
#include <chrono>
#include <thread>
 
class ZbiornikPaliwa {
private:	
	unsigned int poj;
public:
    ZbiornikPaliwa(unsigned int pojemnosc) 
	{
		poj = pojemnosc;
	}
    int pobierz(unsigned int pobierane) 
	{
        if(poj < pobierane)
        {
            return 0;
        }
        poj -= pobierane;
        return pobierane;
	}
    ~ZbiornikPaliwa()
    {}
};
 
class Silnik {
private:
	std::vector<std::shared_ptr<ZbiornikPaliwa>>zbiorniki;
public:
    Silnik(std::chrono::seconds interval, unsigned int iloscPaliwa) 
	{
        //std::this_thread::sleep_for(interval);
        //std::thread(ZbiornikPaliwa::pobierz,iloscPaliwa);
        //WHile wewnątrz thread
	}
    void dodajZbiornik(std::shared_ptr<ZbiornikPaliwa>zbiornik) 
	{
		zbiorniki.push_back(zbiornik);
	}
};
 
int main()
{
    return 0;
}

 

+1 głos
odpowiedź 25 stycznia 2020 przez mokrowski Mędrzec (155,460 p.)

Podobne pytania

0 głosów
1 odpowiedź 182 wizyt
pytanie zadane 15 stycznia 2019 w C i C++ przez KonradH Nowicjusz (220 p.)
0 głosów
1 odpowiedź 256 wizyt
0 głosów
1 odpowiedź 368 wizyt
pytanie zadane 30 listopada 2022 w C i C++ przez Pysa6 Nowicjusz (220 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...