Advertisement
Guest User

123

a guest
Apr 5th, 2020
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <thread>
  6.  
  7. using namespace std;
  8.  
  9. typedef vector<char>::const_iterator ci;
  10.  
  11. void izracunajXOR(ci poc, ci kraj, vector<char>& keys, vector<char>& rezultat) {
  12.     char rez;
  13.     int j = 0;
  14.     while (poc < kraj && j < keys.size()) {
  15.         rez = *poc ^ keys[j];
  16.         rezultat.push_back(rez);
  17.         //cout << "i: " << poc << ", j:" << j << ", i^j:" << (int)rez << endl;
  18.         poc = poc + 1;
  19.         j++;
  20.  
  21.         // Provera da li su iterirani kljucevi do kraja.
  22.         // Ako jesu, resetuj brojac za kljuceve, ali ne i brojac od prvog vektora
  23.         // Na ovaj nacin se nece nastaviti loop ukoliko su iste duzine
  24.         if (j == keys.size()) {
  25.             j = 0;
  26.         }
  27.     }
  28. }
  29.  
  30. vector<char> sumirajXOR(vector<char> ulaz1, vector<char> keys, int brojNiti) {
  31.     vector<char> rezultati[32];
  32.     for (int i = 0; i < 32; i++) rezultati[i] = vector<char>();
  33.     int kolicinaPosla = ulaz1.size() / brojNiti;
  34.     ci begin = ulaz1.begin();
  35.     ci end = ulaz1.begin() + kolicinaPosla;
  36.  
  37.     thread threads[32];
  38.     for (int i = 0; i < brojNiti - 1; i++) {
  39.         threads[i] = thread(izracunajXOR, begin, end, ref(keys), ref(rezultati[i]));
  40.         begin = end;
  41.         end = begin + kolicinaPosla;
  42.     }
  43.     begin = end;
  44.     end = ulaz1.end();
  45.     threads[brojNiti] = thread(izracunajXOR, begin, end, ref(keys), ref(rezultati[brojNiti]));
  46.  
  47.     for (int i = 0; i < brojNiti; ++i) {
  48.         threads[i].join();    
  49.     }
  50.  
  51.     // Spajanje vektora u jedan
  52.     vector<char> rezultat;
  53.     for (int i = 0; i < brojNiti; i++) {
  54.         vector<char>::const_iterator it = rezultati[i].begin();
  55.         while (it <= rezultati[i].end()) {
  56.             char x = *it;
  57.             rezultat.push_back(x);
  58.             it++;
  59.         }
  60.     }
  61.  
  62.     return rezultat;
  63.  
  64. }
  65.  
  66.  
  67.  
  68.  
  69. int main(int argc, char* argv[])
  70. {
  71.  
  72.     // Zadatak 1
  73.     ifstream fajl1(argv[1], ios::binary);
  74.     unsigned int length1;
  75.     vector<char> vektor1;
  76.     fajl1.read((char*)&length1, sizeof(length1));
  77.     cout << argv[1] << endl << length1 << endl << endl;
  78.  
  79.     for (int i = 0; i < length1; i++) {
  80.         char x;
  81.         fajl1.read((char*)&x, sizeof(char));
  82.         vektor1.push_back(x);
  83.         //cout << (int)x << endl;
  84.     }
  85.  
  86.     // Zadatak 2
  87.     ifstream fajl2(argv[2], ios::binary);
  88.     unsigned int length2;
  89.     vector<char> vektor_kljuceva;
  90.     fajl2.read((char*)&length2, sizeof(length2));
  91.     cout << argv[2] << endl << length2 << endl;
  92.  
  93.     for (int i = 0; i < length2; i++) {
  94.         char x;
  95.         fajl2.read((char*)&x, sizeof(char));
  96.         vektor_kljuceva.push_back(x);
  97.         //cout << (int)x << endl;
  98.     }
  99.  
  100.     // Zadatak 3
  101.     vector<char> vektor_rezultat;
  102.     char rez;
  103.     int i = 0, j = 0;
  104.     while (i < length1 && j < length2) {
  105.         rez = vektor1[i] ^ vektor_kljuceva[j];
  106.         vektor_rezultat.push_back(rez);
  107.         cout << "i: " << i << ", j:" << j << ", i^j:" << (int)rez << endl;
  108.         i++;
  109.         j++;
  110.        
  111.         // Provera da li su iterirani kljucevi do kraja.
  112.         // Ako jesu, resetuj brojac za kljuceve, ali ne i brojac od prvog vektora
  113.         // Na ovaj nacin se nece nastaviti loop ukoliko su iste duzine
  114.         if (j == length2) {
  115.             j = 0;
  116.         }
  117.     }
  118.  
  119.     // Zadatak 4
  120.     ofstream fajl3(argv[3], ios::binary);
  121.     fajl3.write((char*)&length1, sizeof(length1));
  122.    
  123.     for (int i = 0; i < length1; i++) {
  124.         fajl3.write((char*)&vektor_rezultat[i], sizeof(char));
  125.     }
  126.     cout << "Pisanje u fajl: " << argv[3] << endl;
  127.  
  128.     // Zadatak paralelizma
  129.     int brojNiti = atoi(argv[4]);
  130.     cout << "Krece paralelno izracunavanje sa sledecim brojem niti: " << brojNiti;
  131.     vector<char> rezultat_paralelizma = sumirajXOR(vektor1, vektor_kljuceva, brojNiti);
  132.     cout << "Paralelno izracunat";
  133.     // Pisanje paralelizma
  134.  
  135.     ofstream fajlParalelizam("paralelizam.dat", ios::binary);
  136.     fajlParalelizam.write((char*)&length1, sizeof(length1));
  137.  
  138.     for (int i = 0; i < length1; i++) {
  139.         fajlParalelizam.write((char*)&rezultat_paralelizma[i], sizeof(char));
  140.     }
  141.     cout << "Pisanje u fajl: paralelizam.dat" << endl;
  142.  
  143.  
  144.  
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement