#ifndef __PROGTEST__ #include <cstring> #include <cstdlib> #include <cstdio> #include <cctype> #include <cmath> #include <cassert> #include <iostream> #include <iomanip> #include <string> #include <vector> #include <list> #include <algorithm> #include <memory> using namespace std; #endif /* __PROGTEST__ */ class Company { public: Company(const string &id, size_t nameAddr,const string &add,const string &name); string getId() const; size_t getNameAddr() const; bool operator == (Company cmpx) const; bool operator < (Company cmpx) const; void saveInvoice(unsigned int amount); unsigned int getTotalIncome() const; bool static compareByNA(const Company &a, const Company &b); private: string id; size_t nameAddr; string add; string name; unsigned int totalIncome; unsigned int numberOrders; unsigned int amount; }; void Company::saveInvoice(unsigned int amount) { numberOrders++; totalIncome+=amount; } string Company::getId() const { return id; } size_t Company::getNameAddr() const { return nameAddr; } Company::Company(const string &id, size_t nameAddr,const string &add,const string &name) :id(id), nameAddr(nameAddr), add(add), name(name), totalIncome(0), numberOrders(0), amount(0) { } unsigned int Company::getTotalIncome() const { return totalIncome; } /* bool Company::operator == (Company cmpx) const { return ( ( (strcasecmp(addr.c_str(), cmpx.addr.c_str()) == 0) && (strcasecmp(name.c_str(), cmpx.name.c_str()) == 0) ) || (id == cmpx.id) ); }*/ bool Company::operator < (Company cmpx) const { return id < cmpx.id; } bool Company::compareByNA(const Company &a, const Company &b) { return a.getNameAddr() < b.getNameAddr(); } class CVATRegister { public: CVATRegister ( void ); ~CVATRegister ( void ); bool newCompany ( const string & name, const string & addr, const string & taxID ); bool cancelCompany ( const string & name, const string & addr ); bool cancelCompany ( const string & taxID ); bool invoice ( const string & taxID, unsigned int amount ); bool invoice ( const string & name, const string & addr, unsigned int amount ); bool audit ( const string & name, const string & addr, unsigned int & sumIncome ) const; bool audit ( const string & taxID, unsigned int & sumIncome ) const; bool firstCompany ( string & name, string & addr ) const; bool nextCompany ( string & name, string & addr ) const; unsigned int medianInvoice ( void ) const; void sortC (vector<Company> &c) const; void sortI (vector<unsigned int> &TotalInvoice) const; private: vector<Company> CompanyIDList; vector<Company> CompanyNameList; vector<unsigned int> TotalInvoice; }; void CVATRegister::sortI (vector<unsigned int> &TotalInvoice) const { sort(TotalInvoice.begin(), TotalInvoice.end(), greater<unsigned int>()); } unsigned int CVATRegister::medianInvoice (void) const { vector<unsigned int> c = TotalInvoice; sortI(c); unsigned int n = c.size(); if(!n) return 0; if(!(n%2)) { return c[(n/2)-1]; } return c[n/2]; } CVATRegister::CVATRegister (void) { } CVATRegister::~CVATRegister (void) { } /* bool CVATRegister::cancelCompany ( const string &name, const string &addr ) { Company cmp(name, addr, "-1"); auto itr = find(CompanyIDList.begin(), CompanyIDList.end(), cmp); if(itr != CompanyIDList.end()) { CompanyIDList.erase(itr); return true; } return false; } bool CVATRegister::cancelCompany ( const string &taxID ) { Company cmp("", "", taxID); auto itr = lower_bound(CompanyIDList.begin(), CompanyIDList.end(), cmp); if(itr != CompanyIDList.end() && itr->getId() == taxID ) { CompanyIDList.erase(itr); return true; } return false; }*/ bool CVATRegister::newCompany ( const string &name, const string &addr, const string &taxID ) { string _name = name; string _addr = addr; std::transform(_name.begin(), _name.end(), _name.begin(), ::tolower); std::transform(_addr.begin(), _addr.end(), _addr.begin(), ::tolower); size_t _nameAddr = std::hash<std::string>{}(_name + _addr); Company cmp(taxID, _nameAddr, addr, name); if ( (! binary_search(CompanyIDList.begin(), CompanyIDList.end(), cmp)) && (! binary_search(CompanyNameList.begin(), CompanyNameList.end(), cmp, Company::compareByNA)) ) { cout << _nameAddr << endl; CompanyIDList.insert(lower_bound(CompanyIDList.begin(), CompanyIDList.end(), cmp), cmp); CompanyNameList.insert(lower_bound(CompanyNameList.begin(), CompanyIDList.end(), cmp, Company::compareByNA), cmp); return true; } return false; } bool CVATRegister::invoice ( const string &taxID, unsigned int amount ) { Company cmp(taxID, -1, "", ""); auto itr = lower_bound(CompanyIDList.begin(), CompanyIDList.end(), cmp); if(itr != CompanyIDList.end() && itr->getId() == taxID) { TotalInvoice.push_back(amount); CompanyIDList[distance(CompanyIDList.begin(), itr)].saveInvoice(amount); return true; } return false; } /* bool CVATRegister::invoice ( const string &name, const string &addr, unsigned int amount ) { Company cmp(name, addr,"-1"); auto itr = find(CompanyIDList.begin(), CompanyIDList.end(), cmp); if(itr != CompanyIDList.end()) { TotalInvoice.push_back(amount); CompanyIDList[distance(CompanyIDList.begin(), itr)].saveInvoice(amount); return true; } return false; } bool CVATRegister::audit ( const string &name, const string &addr, unsigned int &sumIncome ) const { Company cmp(name, addr,"-1"); auto itr = find(CompanyIDList.begin(), CompanyIDList.end(), cmp); if(itr != CompanyIDList.end()) { sumIncome = itr->getTotalIncome(); return true; } return false; } bool CVATRegister::audit ( const string &taxID, unsigned int &sumIncome) const { Company cmp(taxID, -1, "", ""); auto const itr = lower_bound(CompanyIDList.begin(), CompanyIDList.end(), cmp); if(itr != CompanyIDList.end() && itr->getId() == taxID) { sumIncome = CompanyIDList[distance(CompanyIDList.begin(), itr)].getTotalIncome(); return true; } return false; } void CVATRegister::sortC (vector<Company> &c) const { sort(c.begin(), c.end()); } */ /*bool CVATRegister::firstCompany ( string &name, string &addr ) const { //sesortovat vector<Company>tmp = CompanyIDList; sort(tmp.begin(), tmp.end(), [](const Company & a, const Company & b) { string s1 = a.getName(); string s2 = b.getName(); transform(s1.begin(), s1.end(), s1.begin(), ::tolower); transform(s2.begin(), s2.end(), s2.begin(), ::tolower); if(s1.compare(s2) == 0) { string d1 = a.getAddr(); string d2 = b.getAddr(); transform(d1.begin(), d1.end(), d1.begin(), ::tolower); transform(d2.begin(), d2.end(), d2.begin(), ::tolower); return d1.compare(d2) < 0; } return s1.compare(s2) < 0; }); if( tmp.size() > 0 ) { name = tmp[0].getName(); addr = tmp[0].getAddr(); return true; } return false; } bool CVATRegister::nextCompany ( string &name, string &addr ) const { Company cmp(name,addr,"-1"); //sesortovat vector<Company>tmp = CompanyIDList; sort(tmp.begin(), tmp.end(), [](const Company & a, const Company & b) { string s1 = a.getName(); string s2 = b.getName(); transform(s1.begin(), s1.end(), s1.begin(), ::tolower); transform(s2.begin(), s2.end(), s2.begin(), ::tolower); if(s1.compare(s2) == 0) { string d1 = a.getAddr(); string d2 = b.getAddr(); transform(d1.begin(), d1.end(), d1.begin(), ::tolower); transform(d2.begin(), d2.end(), d2.begin(), ::tolower); return d1.compare(d2) < 0; } return s1.compare(s2) < 0; }); auto itr = find(tmp.begin(), tmp.end(), cmp); if(itr == tmp.end()) return false; unsigned int i = distance(tmp.begin(), itr); i++; if( i == tmp.size() ) return false; name = tmp[i].getName(); addr = tmp[i].getAddr(); return true; } */ #ifndef __PROGTEST__ int main ( void ) { string name, addr; unsigned int sumIncome; CVATRegister b1; assert ( b1 . newCompany ( "ACME", "Thakurova", "666/666" ) ); assert ( b1 . newCompany ( "ACME", "Kolejni", "666/666/666" ) ); assert ( b1 . newCompany ( "Dummy", "Thakurova", "123456" ) ); assert ( b1 . invoice ( "666/666", 2000 ) ); assert ( b1 . medianInvoice () == 2000 ); assert ( b1 . invoice ( "666/666/666", 3000 ) ); /* assert ( b1 . medianInvoice () == 3000 ); assert ( b1 . invoice ( "123456", 4000 ) ); assert ( b1 . medianInvoice () == 3000 ); assert ( b1 . invoice ( "aCmE", "Kolejni", 5000 ) ); assert ( b1 . medianInvoice () == 4000 ); assert ( b1 . audit ( "ACME", "Kolejni", sumIncome ) && sumIncome == 8000 );*/ /* assert ( b1 . audit ( "123456", sumIncome ) && sumIncome == 4000 ); assert ( b1 . firstCompany ( name, addr ) && name == "ACME" && addr == "Kolejni" ); assert ( b1 . nextCompany ( name, addr ) && name == "ACME" && addr == "Thakurova" ); assert ( b1 . nextCompany ( name, addr ) && name == "Dummy" && addr == "Thakurova" ); assert ( ! b1 . nextCompany ( name, addr ) ); assert ( b1 . cancelCompany ( "ACME", "KoLeJnI" ) ); assert ( b1 . medianInvoice () == 4000 ); assert ( b1 . cancelCompany ( "666/666" ) ); assert ( b1 . medianInvoice () == 4000 ); assert ( b1 . invoice ( "123456", 100 ) ); assert ( b1 . medianInvoice () == 3000 ); assert ( b1 . invoice ( "123456", 300 ) ); assert ( b1 . medianInvoice () == 3000 ); assert ( b1 . invoice ( "123456", 200 ) ); assert ( b1 . medianInvoice () == 2000 ); assert ( b1 . invoice ( "123456", 230 ) ); assert ( b1 . medianInvoice () == 2000 ); assert ( b1 . invoice ( "123456", 830 ) ); assert ( b1 . medianInvoice () == 830 ); assert ( b1 . invoice ( "123456", 1830 ) ); assert ( b1 . medianInvoice () == 1830 ); assert ( b1 . invoice ( "123456", 2830 ) ); assert ( b1 . medianInvoice () == 1830 ); assert ( b1 . invoice ( "123456", 2830 ) ); assert ( b1 . medianInvoice () == 2000 ); assert ( b1 . invoice ( "123456", 3200 ) ); assert ( b1 . medianInvoice () == 2000 ); assert ( b1 . firstCompany ( name, addr ) && name == "Dummy" && addr == "Thakurova" ); assert ( ! b1 . nextCompany ( name, addr ) ); assert ( b1 . cancelCompany ( "123456" ) ); assert ( ! b1 . firstCompany ( name, addr ) ); CVATRegister b2; assert ( b2 . newCompany ( "ACME", "Kolejni", "abcdef" ) ); assert ( b2 . newCompany ( "Dummy", "Kolejni", "123456" ) ); assert ( ! b2 . newCompany ( "AcMe", "kOlEjNi", "1234" ) ); assert ( b2 . newCompany ( "Dummy", "Thakurova", "ABCDEF" ) ); assert ( b2 . medianInvoice () == 0 ); assert ( b2 . invoice ( "ABCDEF", 1000 ) ); assert ( b2 . medianInvoice () == 1000 ); assert ( b2 . invoice ( "abcdef", 2000 ) ); assert ( b2 . medianInvoice () == 2000 ); assert ( b2 . invoice ( "aCMe", "kOlEjNi", 3000 ) ); assert ( b2 . medianInvoice () == 2000 ); assert ( ! b2 . invoice ( "1234567", 100 ) ); assert ( ! b2 . invoice ( "ACE", "Kolejni", 100 ) ); assert ( ! b2 . invoice ( "ACME", "Thakurova", 100 ) ); assert ( ! b2 . audit ( "1234567", sumIncome ) ); assert ( ! b2 . audit ( "ACE", "Kolejni", sumIncome ) ); assert ( ! b2 . audit ( "ACME", "Thakurova", sumIncome ) ); assert ( ! b2 . cancelCompany ( "1234567" ) ); assert ( ! b2 . cancelCompany ( "ACE", "Kolejni" ) ); assert ( ! b2 . cancelCompany ( "ACME", "Thakurova" ) ); assert ( b2 . cancelCompany ( "abcdef" ) ); assert ( b2 . medianInvoice () == 2000 ); assert ( ! b2 . cancelCompany ( "abcdef" ) ); assert ( b2 . newCompany ( "ACME", "Kolejni", "abcdef" ) ); assert ( b2 . cancelCompany ( "ACME", "Kolejni" ) ); assert ( ! b2 . cancelCompany ( "ACME", "Kolejni" ) ); return EXIT_SUCCESS;*/ } #endif /* __PROGTEST__ */
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
}