diff options
| author | Syndamia <kamen@syndamia.com> | 2024-03-20 12:30:52 +0200 |
|---|---|---|
| committer | Syndamia <kamen@syndamia.com> | 2024-03-20 12:30:52 +0200 |
| commit | 6b7a20b652bd3388ceaac60c96479419ac2c4859 (patch) | |
| tree | 84d920137bcd967b4ea886dfa64a1c2d16ee411a | |
| parent | c3560a20048e982cff795de0085ab3a76cdd591a (diff) | |
| download | oop-2023-solutions-6b7a20b652bd3388ceaac60c96479419ac2c4859.tar oop-2023-solutions-6b7a20b652bd3388ceaac60c96479419ac2c4859.tar.gz oop-2023-solutions-6b7a20b652bd3388ceaac60c96479419ac2c4859.zip | |
[w2/ex4] Added solution
| -rw-r--r-- | week02/Exercise4.cpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/week02/Exercise4.cpp b/week02/Exercise4.cpp new file mode 100644 index 0000000..c2d6d75 --- /dev/null +++ b/week02/Exercise4.cpp @@ -0,0 +1,120 @@ +struct Material { + int id; + int startingType; + int endingType; +}; + +struct MaterialArray { +private: + Material* elems; + int size; + int last; + +public: + MaterialArray(int size) { + this->size = size; + elems = new Material[size]; + last = 0; + } + + void Append(const Material& m) { + if (size == last) return; + elems[last++] = m; + } + + int GetSize() { + return size; + } + + Material* GetByID(int id) { + for (int i = 0; i < last; i++) { + if (elems[i].id == id) { + return &elems[i]; + } + } + return nullptr; + } + + Material* GetByStartingType(int type) { + for (int i = 0; i < last; i++) { + if (elems[i].startingType == type) { + return &elems[i]; + } + } + return nullptr; + } +}; + +struct Machine { +private: + struct MaterialEfficiency { + int id; + float percentage; + }; + MaterialEfficiency *efficiency; + int knownMaterials; + + int availableThroughput; + +public: + int ConvertMaterial(int materialID, int quantity) { + if (availableThroughput == 0) { + return 0; + } + + int converts = quantity * GetEfficiency(materialID); + availableThroughput -= converts; + // Губим материал, понеже машината се е счупила по средата на обработка + if (availableThroughput < 0) { + converts += availableThroughput; + availableThroughput = 0; + } + return converts; + } + + int WillConvert(int materialID, int quantity) { + if (availableThroughput == 0) { + return 0; + } + + int converts = quantity * GetEfficiency(materialID); + int newThroughput = availableThroughput - converts; + if (newThroughput < 0) { + converts += newThroughput; + } + return converts; + } + + void FixFor(int quantity) { + availableThroughput += quantity; + } + + float GetEfficiency(int id) { + for (int i = 0; i < knownMaterials; i++) { + if (efficiency[i].id == id) { + return efficiency[i].percentage; + } + } + return 0; + } +}; + +MaterialArray& materialPath(MaterialArray& materials, int startid, int endid) { + MaterialArray* path = new MaterialArray(materials.GetSize()); + + Material* current = materials.GetByID(startid); + path->Append(*current); + while(current->id != endid) { + current = materials.GetByStartingType(current->endingType); + path->Append(*current); + } + + return *path; +} + +MachineArray& bestMachinePath(MaterialArray& mpath) { + +} + +int main() { +} |
