2011-01-12 10 views
0

hey jeder,
Ich schreibe eine kleine Anwendung für meine C++ Klasse Mini-Projekt.
es geht um die Verwaltung von Kunden, Linien und Dienstleistungen bei einem Telekommunikationsunternehmen.
Ich soll eine Consumption Klasse verwenden, die einen monatlichen Verbrauch eines Dienstes/Linie darstellen soll.Datenstruktur zu verfolgen "Verbrauch"

class Consumption 
{ 
private: 
    Ligne* m_line;//the line related to this consumption 
    Service* m_service;//service used by this line 
    int m_month; 
    int m_year; 
    int m_units;//units of m_service used in the m_month of m_year 
public: 
    //some getters and setters 
    double price();//returns m_units * the service's price/unit 
}; 

Eine Leitung kann maximal 2 Dienste/Monat verwenden.
Verbrauch wird verwendet, um eine Rechnung für eine bestimmte Linie zu machen.
meine Frage ist, was ist der beste Weg, um die erstellten Consumptions zu verfolgen? Ich meine, welche Datenstruktur ist am besten zu verwenden? Sollte ich Änderungen an der Klasse vornehmen?
Beachten Sie, dass ich keine Dateien verwende, um irgendetwas zu speichern.
jede Hilfe wird geschätzt ...

+1

Diese weitgehend davon abhängen wird, welche Operationen Sie wollen sich auf die Sammlung von 'Verzehr geeignet Objekte perfrom. Willst du einen zufälligen Zugang? Möchten Sie Insertionen? Was sind typische Aktionen in der Sammlung? – sharptooth

+0

im Grunde, wenn eine Rechnung für eine bestimmte Linie zu machen, muss die Sammlung runned throught, um die Leitung und Service von jedem Verbrauch dann die Zeilennummer ... und auch passenden hinzukommen identifizieren, wenn es sicherstellen, dass alles Zugabe respektiert wird (nicht mehr als 2 Dienste/Line/Monat, usw.) .. so für beste Art und Weise sind auf der Suche diese – meno

+0

nur eine Randnotiz zu organisieren: Ihre 'Klasse Verzehr geeignet ist wahrscheinlich eine destructor, einen Kopierkonstruktor und einen Zuweisungsoperator fehlt. Grund dafür ist, Sie Zeiger Mitglieder haben, und wenn sie im Speicher dynamisch zugewiesen zeigen Sie dann werden Sie den Speicher in der destructor freigeben wollen und definieren tiefKopierVorgänge. – wilhelmtell

Antwort

0

Die beste Struktur für die Speicherung von etwas in Array-artigen Stil mit der konstanten Zugriff auf jedes Element ist Vektor. Es ist genau so, wie Sie eine dynamische Größe haben.

Zweite Option zu gehen ist Deque. Wenn Sie planen, sehr viele Daten zu haben, gehen Sie mit diesem, da es eine bessere Speicherverwaltung hat, und Sie können es sowohl von vorne als auch von hinten bearbeiten, nicht nur zurück wie in Vektoren.

Letzte könnte Liste sein. Wenn Sie eine große Bearbeitung Ihrer Daten planen, wie das Einfügen neuer Elemente löschen (nicht nur auf diese zugreifen), sollten Sie diese als lineare Komplexität beim Einfügen/Löschen von Elementen betrachten, während die vorherigen 2 lineare plus zusätzliche lineare Zeit bis zu haben Anzahl der Elemente zwischen Position und Ende.

So Fazit:

  • Vektor - einfachste
  • deque - gut für große Datenspeicher
  • Liste - gut für große editting Lager

Die STL-Sequenz-Container sind und einschließlich Der Header sollte wie folgt aussehen:

#include <vector> 

here's reference for all STL containers

Edit: Ich sehe, dass Sie etwas anderes gemeint haben, aber ich lasse das hier und fügen Sie es hinzu.

Brauchen Sie wirklich Verbrauchsklasse? Ich meine, es wäre viel logischer, wenn Sie alle Daten über die Linie in der Line-Klasse belassen würden. Das bedeutet, dass ich entweder die Dienste, die jeden Monat im Vektor verwendet werden, bei Bedarf speichern würde, oder ich würde sofort den Preis berechnen und mich an die Dienste des letzten Monats erinnern. Ich würde auch eine Klasse namens Programm erstellen, die verwendete Dienste speichern und die Anzahl der verwendeten Dienste verwalten lassen würde. Es könnte entweder neuen Dienst verwerfen, wenn es bereits 2 gibt, oder den alten Dienst neu schreiben. Sie können auch den Preis des Programms zurückgeben und es mit der Zeit multiplizieren. Etwas wie folgt aus:

#include <vector> 

using namespace std; 

class Service{ 
public: 
    int getPrice(){return monthPrice;} 
    void setPrice(const int &p) { monthPrice = p; } 
private: 
    int monthPrice; 
}; 

class Program{ 
public: 
    Program(){servicesUsed = 0; monthTime = 0;} 
    Program(const int &t) : monthTime(t) {servicesUsed = 0;} 
    void setTime(int t){monthTime = t;} 
    void addService(Service &s); 
    int price(); //calculate price of program 
private: 
    int monthTime; //time that program was used 
    Service services[2]; //services used in program 
    int servicesUsed; 
}; 

void Program::addService(Service &s){ 
    if(servicesUsed < 2){ // Discarding solution 
     services[servicesUsed] = s; 
     servicesUsed++; 
    } 
} 

int Program::price(){ 
    int pP = 0; 
    for(int i = 0; i < servicesUsed; i++){ 
     pP += services[i].getPrice(); 
    } 
    pP *= monthTime; 
    return pP; 
} 

class Line{ 
public: 
    Program *addMonth(const int &t); //will return handle for month 
    int consuption(); //calculate full line consuption 
private: 
    vector<Program> monthList; //store data about services per month 
}; 

Program *Line::addMonth(const int &t){ 
    monthList.push_back(Program(t)); 
    return &monthList.back(); 
} 

int Line::consuption(){ 
    int p = 0; 
    for(unsigned int i = 0; i < monthList.size(); i++){ 
     p += monthList[i].price(); 
    } 
    return p; 
} 

int main(){ 
    //showcase 
    Program *handle; 
    Service s1,s2,s3; 
    s1.setPrice(50); 
    s2.setPrice(75); 
    s3.setPrice(100); //probably read from file 
    Line line; 
    handle = line.addMonth(30); // monthTime probably also from file 
    handle->addService(s1); 
    handle->addService(s2); 
    handle->addService(s3); 
    handle = line.addMonth(60); 
    handle->addService(s3); 
    handle->addService(s2); 
    int p = line.consuption(); 
    return 0; 
} 

sollte in Ordnung altought arbeiten Sie es ändern müssen;)

+0

eigentlich ‚Verbrauch‘ wurde im Projektpapier enthalten, aber trotzdem Ihre Antwort war sehr helpfull..the Programmklasse irgendwie Verbrauch ersetzt und Ihre Idee ist viel mehr effective.Thank Sie sehr viel !!! – meno

0

Sie sind ein schlechter Ansatz mit Ihrem Problem zu lösen.

Sie sagen: Welche Struktur ist die beste (Ihr Problem)

Sie zuerst müssen modellieren, zu lösen, dass die Daten gespeichert werden sollen und wie müssen die Daten organisiert werden, werde ich Gebrauch schlagen eine Entity Relationship Model das heißt häufig im Datenbankdesign verwendet.

Und WHEN Sie haben das Diagramm zurück zum Code-Editor, um in C++ zu beschreiben, wie dieses Modell darzustellen.

Dann werden Sie zur Wahl der Lage, die Datenstruktur sind die besten für Sie. Ich schlage vor, schauen Sie in STL diejenigen, sind nicht schön, aber sehr effizient sind und Sie werden nicht das Rad neu erfinden müssen :)

Verwandte Themen