Advertisement
Ihmemies

Untitled

Oct 17th, 2022
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.20 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <array>
  6. #include <functional>
  7. #include <map>
  8.  
  9. namespace needs{
  10.     using std::cin;
  11.     using std::cout;
  12.     using std::endl;
  13.     using std::string;
  14.     using std::function;
  15.     using std::array;
  16.     using std::vector;
  17.     using std::map;
  18. }
  19.  
  20. std::vector<std::string> split(const std::string& s,
  21.                                const char delimiter,
  22.                                bool ignore_empty = false)
  23. {
  24.     std::vector<std::string> result;
  25.     std::string tmp = s;
  26.  
  27.     while(tmp.find(delimiter) != std::string::npos)
  28.     {
  29.         std::string new_part = tmp.substr(0, tmp.find(delimiter));
  30.         tmp = tmp.substr(tmp.find(delimiter) + 1, tmp.size());
  31.         if(not (ignore_empty and new_part.empty()))
  32.         {
  33.             result.push_back(new_part);
  34.         }
  35.     }
  36.     if(not (ignore_empty and tmp.empty()))
  37.     {
  38.         result.push_back(tmp);
  39.     }
  40.     return result;
  41. }
  42.  
  43. using namespace needs;
  44.  
  45. const string BAD_PARAMS = "Erroneus parameters!";
  46. const string BAD_COMMAND = "Erroneus command!";
  47. const string HELP_TEXT =
  48.     "S = store id1 i2\nP = print id\nC = count id\nD = depth id\n";
  49.  
  50. map<string, vector<string>> data;
  51. int counter = 0;
  52. int dots = 0;
  53. int deep = 1;
  54.  
  55. // converts string to lowercase
  56. string to_lower(string str) {
  57.     transform(str.begin(), str.end(), str.begin(), ::tolower);
  58.     return str;
  59. }
  60.  
  61. bool is_bad_input(vector<string> &commands, unsigned long int params) {
  62.     if (commands.size() != params) {
  63.         cout << BAD_PARAMS << endl << HELP_TEXT;
  64.         return true;
  65.     } else {
  66.         return false;
  67.     }
  68. }
  69.  
  70. // saves a relative name2 to a person name1
  71. void save(string name1, string name2) {
  72.     data[name1].push_back(name2);
  73. }
  74.  
  75. // prints out the relation tree of a person
  76. void print(string name) {
  77.     for (auto &val: data[name]) {
  78.         dots += 2;
  79.         if (val.size() > 0) {
  80.             cout << string(dots, '.') << val << endl;
  81.             print(val);
  82.             dots -= 2;
  83.         }
  84.     }
  85. }
  86.  
  87. // counts all relatives of a person
  88. void count(string name) {
  89.     for (auto &val: data[name]) {
  90.         if (val.size() > 0) {
  91.             counter++;
  92.             count(val);
  93.         }
  94.     }
  95. }
  96.  
  97. // counts how deep the relation tree is
  98. void depth(string name) {
  99.     for (auto &val: data[name]) {
  100.         if (val.size() > 0) {
  101.             deep += 1;
  102.             depth(val);
  103.             return;
  104.         }
  105.     }
  106. }
  107.  
  108. int main()
  109. {
  110.     // debug data
  111.     /*
  112.     data["Hugo"].push_back("Laura");
  113.     data["Hugo"].push_back("Jasper");
  114.     data["Laura"].push_back("Helena");
  115.     data["Jasper"].push_back("Maria");
  116.     data["Laura"].push_back("Elias");
  117.     data["Helena"].push_back("Sofia");
  118.     */
  119.  
  120.     while(true)
  121.     {
  122.         // ask input from user
  123.         string user_input;
  124.         cout << "> ";
  125.         getline(std::cin, user_input);
  126.         vector<string> commands = split(user_input, ' ', true);
  127.  
  128.         if(commands.size() == 0) { continue; }
  129.  
  130.         if (to_lower(commands.at(0)) == "s") {
  131.             if (is_bad_input(commands, 3)) {
  132.                 continue;
  133.             }
  134.             string name1 = commands.at(1);
  135.             string name2 = commands.at(2);
  136.             save(name1, name2);
  137.         }
  138.         else if (to_lower(commands.at(0)) == "p") {
  139.             if (is_bad_input(commands, 2)) {
  140.                 continue;
  141.             }
  142.             cout << commands.at(1) << endl;
  143.             print(commands.at(1));
  144.             dots = 0;
  145.         }
  146.         else if (to_lower(commands.at(0)) == "c") {
  147.             if (is_bad_input(commands, 2)) {
  148.                 continue;
  149.             }
  150.             count(commands.at(1));
  151.             cout << counter << endl;
  152.             counter = 0;
  153.         }
  154.         else if (to_lower(commands.at(0)) == "d") {
  155.             if (is_bad_input(commands, 2)) {
  156.                 continue;
  157.             }
  158.             depth(commands.at(1));
  159.             cout << deep << endl;
  160.             deep = 1;
  161.         }
  162.         else if (to_lower(commands.at(0)) == "q") {
  163.             return EXIT_SUCCESS;
  164.         }
  165.         else {
  166.             cout << BAD_COMMAND << endl << HELP_TEXT;
  167.         }
  168.     }
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement