#ifndef __PROGTEST__ #include <cstring> #include <cstdlib> #include <cstdio> #include <cassert> #include <iostream> #include <iomanip> #include <string> #include <vector> #include <map> #include <list> #include <set> #include <queue> #include <stack> #include <deque> #include <algorithm> #include <unordered_map> #include <unordered_set> #include <memory> using namespace std; #endif /* __PROGTEST__ */ struct cmpByCnt { bool operator() (int a, int b) const { return a < b; } }; struct cmpByCnt2 { bool operator() (int a, int b) const { return a > b; } }; class CDate { public: CDate(const int &y,const int &m,const int &d); int m_Day; int m_Month; int m_Year; int m_Time; }; CDate::CDate(const int &y,const int &m,const int &d) : m_Day(d), m_Month(m), m_Year(y), m_Time(0) { time_t rawtime; struct tm timeinfo; time ( &rawtime ); timeinfo = *localtime ( &rawtime ); timeinfo.tm_year = y - 1900; timeinfo.tm_mon = m - 1; timeinfo.tm_mday = d; timeinfo.tm_sec = 1; timeinfo.tm_min = 1; timeinfo.tm_hour = 1; m_Time = mktime ( &timeinfo ); } class CItem { public: CItem(const string &name, const CDate &expireDate, const int &cnt); string m_Name; CDate m_Date; int m_Cnt; }; CItem::CItem(const string &name, const CDate &expireDate ,const int &cnt) :m_Name(name), m_Date(expireDate), m_Cnt(cnt) { } class CSupermarket { public: CSupermarket(); CSupermarket& store(const string &name,const CDate &date,const int &cnt); list<pair<string,int>> expired(const CDate &date); void sell(list<pair<string,int>> &list); map<string, map<int, CItem, cmpByCnt>> m_Items; }; CSupermarket::CSupermarket() { } CSupermarket& CSupermarket::store(const string &name,const CDate &date,const int &cnt) { CItem a(name, date, cnt); auto itr = m_Items.find(name); if ( itr != m_Items.end()) itr->second.emplace(a.m_Date.m_Time, a); else m_Items.emplace(name, std::map<int, CItem, cmpByCnt>{{a.m_Date.m_Time, a}}); return *this; } list<pair<string,int>> CSupermarket::expired(const CDate &date) { map<string, int> beforeExp; // Vytvoření mapy podle data for(auto itr = m_Items.begin(); itr != m_Items.end(); ++itr) { for(auto i = itr->second.begin(); i != itr->second.end(); ++i) { if( date.m_Time > i->first ) { if( beforeExp.find(itr->first) == beforeExp.end() ) beforeExp.emplace( itr->first, i->second.m_Cnt); else { auto f = beforeExp.find(itr->first); f->second += i->second.m_Cnt; } } } } map<int, string, cmpByCnt2> beforeExpSorted; // Seřazení for(auto itr = beforeExp.begin(); itr != beforeExp.end(); ++itr) beforeExpSorted.emplace(itr->second, itr->first); list<pair<string,int>> ex; //Přesunutí do listu for(auto itr = beforeExpSorted.begin(); itr !=beforeExpSorted.end(); ++itr) ex.emplace_back(itr->second, itr->first); // Vypsání listu /*for(auto itr = ex.begin(); itr !=ex.end(); ++itr) cout << itr->first << " " << itr->second << endl;*/ return ex; } void CSupermarket::sell(list<pair<string,int>> &list) { for(auto listIterator = list.begin(); listIterator != list.end(); ++listIterator) { auto itemIterator = m_Items.find(listIterator->first); if( itemIterator != m_Items.end() ) { for(auto itr = itemIterator->second.begin(); itr != itemIterator->second.end(); ++itr) { //Ošetřit if( listIterator->second > itr->second.m_Cnt) { int odecteno = itr->second.m_Cnt; listIterator->second -= odecteno; itr->second.m_Cnt -= odecteno; //auto toDelete = m_Items.find(itemIterator->first)->second.find(itr); } else if ( listIterator->second < itr->second.m_Cnt ) { int odecteno = listIterator->second; listIterator->second -= odecteno; itr->second.m_Cnt -= odecteno; break; } else { listIterator->second = 0; itr->second.m_Cnt = 0; break; } // cout << "List: " << listIterator->first << " Kolik chci: " << listIterator->second << endl; // cout << "Jmeno: " << itr->second.m_Name << " time: " << itr->first << " na skladu: " << itr->second.m_Cnt << endl; } } // Odstraneni polozek s nulou /*for(auto itr = itemIterator->second.begin(); itr != itemIterator->second.end(); ++itr) { if(itr->second.m_Cnt == 0) { cout <<"Tohle: " << m_Items.find(itemIterator->first)->second.find(itr->first)->second.m_Name << endl; //auto r = itemIterator->second.find(itr->first); //cout << r->second.m_Cnt << endl; itr = itemIterator->second.erase(itr); } cout << "d" << endl; }*/ } } int main() { CSupermarket s; s . store ( "bread", CDate ( 2016, 4, 30 ), 100 ) . store ( "butter", CDate ( 2016, 5, 10 ), 10 ) . store ( "beer", CDate ( 2016, 8, 10 ), 50 ) . store ( "bread", CDate ( 2016, 4, 25 ), 100 ) . store ( "okey", CDate ( 2016, 7, 18 ), 5 ); for(auto itr = s.m_Items.begin(); itr != s.m_Items.end(); ++itr) { cout << itr->first << " "; for(auto i = itr->second.begin(); i != itr->second.end(); ++i) { cout << " date: " << i->first << " cnt: " << i->second.m_Cnt; } cout << endl; } cout << "-------" << endl; list<pair<string,int> > l0 = s . expired ( CDate ( 2018, 4, 30 ) ); assert ( l0 . size () == 4 ); assert ( ( l0 == list<pair<string,int> > { { "bread", 200 }, { "beer", 50 }, { "butter", 10 }, { "okey", 5 } } ) ); list<pair<string,int> > l1 { { "bread", 100}, { "bread", 20 }, { "butter", 20 } }; s . sell ( l1 ); for(auto itr = s.m_Items.begin(); itr != s.m_Items.end(); ++itr) { cout << itr->first << " "; for(auto i = itr->second.begin(); i != itr->second.end(); ++i) { cout << " date: " << i->first << " count: " << i->second.m_Cnt; } cout << endl; } return 0; }
Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++
and start coding!
OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "Enter name:";
getline (cin, name);
cout << "Hello " << name;
return 0;
}
C++ is a widely used middle-level programming language.
When ever you want to perform a set of operations based on a condition If-Else is used.
if(conditional-expression) {
//code
}
else {
//code
}
You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to If-Else-If ladder.
switch(conditional-expression){
case value1:
// code
break; // optional
case value2:
// code
break; // optional
......
default:
code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
//code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while (condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.
return_type function_name(parameters);
function_name (parameters)
return_type function_name(parameters) {
// code
}