Advertisement
Guest User

bajs

a guest
Nov 26th, 2014
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. #include <string>
  5. #include <vector>
  6. #include <map>
  7. #include <iomanip>
  8. #include <algorithm>
  9. using namespace std;
  10.  
  11. bool check_valid_word(string word)
  12. {
  13.   string trash{"!?;,:.)\"'"};
  14.  
  15.   for ( string::iterator i = word.begin() ;  i < word.end() ; i++ )
  16.   {
  17.     if ( ( i > word.begin() ) && (*i == '-' && *(i-1) == '-') )
  18.     {
  19.       return false;
  20.     }
  21.     else
  22.       for ( char c : trash )
  23.       {
  24.         if ( c == *i )
  25.         {
  26.           return false;
  27.         }
  28.       }
  29.    
  30.   }
  31.  
  32.   if ( word.length() < 3 )
  33.   {
  34.     return false;
  35.   }
  36.  
  37.   return true;
  38.  
  39. }
  40.  
  41.  
  42. string clean_word(string word)
  43. {
  44.   string trash{"!?;,:.)\"'"};
  45.  
  46.   for ( string::iterator i = word.begin() ;  i < word.end() ; i++ )
  47.   {
  48.     if ( (i+1) == word.end() )
  49.     {
  50.       if ( (*i == 's' ) && ( *(i-1) == '\'' ) )
  51.       {
  52.         word.erase(i);
  53.         i = i - 1;
  54.       }
  55.       else
  56.       {
  57.         for ( char c : trash )
  58.         {
  59.           if ( *i == c )
  60.           {
  61.             word.erase(i);
  62.             i = i - 1;
  63.           }
  64.         }
  65.       }
  66.     }
  67.     else if ( ( i == word.begin() ) && ( *i == '"' || *i == '(' ) )
  68.     {
  69.       word.erase(i);
  70.       i = i - 1;
  71.     }
  72.   }
  73.   return word;
  74. }
  75.  
  76.  
  77. vector<string> ss_to_vector(stringstream& ss)
  78. {
  79.   string word;
  80.   vector<string> wordholder;
  81.   while ( ss >> word )
  82.   {
  83.  
  84.     word = clean_word(word);
  85.     if ( check_valid_word(word) )
  86.     {
  87.       wordholder.push_back(word);
  88.     }
  89.   }
  90.   return wordholder;
  91. }
  92.  
  93. map<string,int> vector_to_map(vector<string> wordholder)
  94. {
  95.   string tmp;
  96.   map<string,int> wordmap;
  97.   for ( vector<string>::iterator iter = wordholder.begin() ; iter < wordholder.end() ; iter++ )
  98.   {
  99.     tmp = *iter;
  100.     transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
  101.     wordmap[tmp] += 1;
  102.   }
  103.   return wordmap;
  104. }
  105.  
  106.  
  107. void sort_map(map<string, int> wordmap)
  108. {
  109.   //Sorts map by value and prints the new sorted map
  110.   vector<pair<string, int>> sorted_map {wordmap.begin(), wordmap.end()};
  111.   auto sort_lambda = [] (pair<string, int> pair1, pair<string, int> pair2) {return pair1.second > pair2.second;};
  112.   sort(sorted_map.begin(), sorted_map.end(), sort_lambda);
  113.   for (pair<string, int> pair_ : sorted_map)
  114.   {
  115.     cout << setw(25) << pair_.first << " : " << pair_.second << endl;
  116.   }
  117. }
  118.  
  119.  
  120. void print_file(vector<string> words)
  121. {
  122.   //Prints correct words from file with a line length of 40
  123.   int curr_linelen{0};
  124.   string out_str;
  125.  
  126.   auto out_lambda = [&out_str, &curr_linelen](string word)
  127.     {
  128.       if (word.length() + curr_linelen > 40)
  129.       {
  130.         out_str += ('\n' + word + " ");
  131.         curr_linelen = word.length() + 1;
  132.       }
  133.  
  134.       else
  135.       {
  136.         out_str += (word + " ");
  137.         curr_linelen += word.length() + 1;
  138.       }
  139.     };
  140.  
  141.   for_each(words.begin(), words.end(), out_lambda);
  142.  
  143.   cout << out_str << endl;
  144. }
  145.  
  146.  
  147. void print_map(map<string,int> wordmap)
  148. {
  149.   for (map<string,int>::iterator iter = wordmap.begin() ; iter != wordmap.end() ; iter++ )
  150.   {
  151.     cout << setw(25) <<  iter->first << " : " << iter->second << endl;
  152.   }
  153. }
  154.  
  155.  
  156. int main()
  157. {
  158.   ifstream wordfile;
  159.   string filename;
  160.   string line;
  161.   stringstream ss;
  162.   vector<string> wordholder;
  163.   map<string,int> wordmap;
  164.  
  165.   while ( !(wordfile.is_open()) )
  166.   {
  167.     cout << "Mata in korrekt filnamn: ";
  168.     cin >> filename;
  169.     wordfile.open(filename);
  170.   }
  171.  
  172.   while( getline( wordfile, line) )
  173.   {
  174.     ss << line;
  175.   }
  176.  
  177.   wordholder = ss_to_vector(ss);
  178.   wordmap = vector_to_map(wordholder);
  179.   print_map(wordmap);
  180.  
  181.   sort_map(wordmap);
  182.   print_file(wordholder);
  183.  
  184.   return 0;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement