Advertisement
Guest User

Untitled

a guest
Nov 21st, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <vector>
  5. #include <array>
  6. #include <ctime>
  7. #include <random>
  8.  
  9. void print(const std::vector<int>& v) {
  10.     std::cout << "[ ";
  11.     for (auto i : v) {
  12.         std::cout << i << " ";
  13.     }
  14.     std::cout << "]\n";
  15. }
  16. float sum(const std::vector<float>& v) {
  17.     float sum = 0;
  18.     for (auto i : v) {
  19.         sum += i;
  20.     }
  21.     return sum;
  22. }
  23. float average(const std::vector<float>& v) {
  24.     float sum1 = sum(v);
  25.     float average = 0;
  26.     return average = sum1 / v.size();
  27. }
  28. std::array<float, 2> minmax(const std::vector<float>& v) {
  29.     std::array<float, 2> minmax;
  30.     float max = std::numeric_limits<float>::min();
  31.     float min = std::numeric_limits<float>::max();
  32.     for (auto i : v) {
  33.         if (i > max) {
  34.             max = i;
  35.         }
  36.         if (i < min) {
  37.             min = i;
  38.         }
  39.     }
  40.     minmax[0] = min;
  41.     minmax[1] = max;
  42.     return minmax;
  43. }
  44. void zad1() {
  45.     //Referencja powinna byc stala poniewaz funkcje sluza do analizy tablicy a nie zmiany jej parametrow.
  46.     std::cout << "Ilosc liczb typu float: " << std::endl;
  47.     int n = 0;
  48.     std::cin >> n;
  49.     std::vector<float>v;
  50.     for (int i = 0; i < n; ++i) {
  51.         float value = 0;
  52.         std::cout << "Podaj float nr " << i + 1 << ": " << std::endl;
  53.         std::cin >> value;
  54.         v.push_back(value);
  55.     }
  56.     std::array<float, 2> minmaxfinal = minmax(v);
  57.     std::cout << "\nSuma: " << sum(v) << "\nSrednia: " << average(v);
  58.     std::cout << "\nNajmniejszy wyraz: " << minmaxfinal[0] << "\nNajwiekszy wyraz: " << minmaxfinal[1] << '\n';
  59. }
  60. bool equals(std::vector<int>& v1, std::vector<int>& v2) {
  61.     //Argumenty funkcji najkorzystniej przekazywac w tym przypadku przez referencje zwykla,
  62.     //poniewaz aby uzyskac porownanie w kazdych warunkach potrzebne jest dodanie elementow do wektora.
  63.     //Wynik zwracany przez referencje nie jest tutaj poprawny, dlatego nie uzylem jej w tym przykladzie.
  64.     int size = 0;
  65.     if (v1.size() >= v2.size()) {
  66.         size = v1.size();
  67.         if (v1.size() != v2.size()) {
  68.             int difference = v1.size() - v2.size();
  69.             for (int i = 0; i < difference; ++i) {
  70.                 v2.push_back(0);
  71.             }
  72.         }
  73.     }
  74.     else {
  75.         size = v2.size();
  76.         int difference = v2.size() - v1.size();
  77.         for (int i = 0; i < difference; ++i) {
  78.             v1.push_back(0);
  79.         }
  80.     }
  81.     bool equals = true;
  82.     for (int i = 0; i < size; i++) {
  83.         if (v1[i] != v2[i]) {
  84.             equals = false;
  85.             break;
  86.         }
  87.     }
  88.     return equals;
  89. }
  90. std::vector<int> add(std::vector<int>& v1, std::vector<int>& v2) {
  91.     //Argumenty funkcji najkorzystniej przekazywac w tym przypadku przez referencje zwykla,
  92.     //poniewaz aby uzyskac porownanie w kazdych warunkach potrzebne jest dodanie elementow do wektora.
  93.     //Wynik zwracany jest wektorem, dlatego nie moglem uzyc referencji przy zwrocie.
  94.     std::vector<int> addedVec;
  95.     int size = 0;
  96.     if (v1.size() >= v2.size()) {
  97.         size = v1.size();
  98.         if (v1.size() != v2.size()) {
  99.             int difference = v1.size() - v2.size();
  100.             for (int i = 0; i < difference; ++i) {
  101.                 v2.push_back(0);
  102.             }
  103.         }
  104.     }
  105.     else {
  106.         size = v2.size();
  107.         int difference = v2.size() - v1.size();
  108.         for (int i = 0; i < difference; ++i) {
  109.             v1.push_back(0);
  110.         }
  111.  
  112.     }
  113.     for (int i = 0; i < size; ++i) {
  114.         int value = v1[i] + v2[i];
  115.         addedVec.push_back(value);
  116.     }
  117.     return addedVec;
  118. }
  119. std::vector<int> subtract(std::vector<int>& v1, std::vector<int>& v2) {
  120.     //Argumenty funkcji najkorzystniej przekazywac w tym przypadku przez referencje zwykla,
  121.     //poniewaz aby uzyskac porownanie w kazdych warunkach potrzebne jest dodanie elementow do wektora.
  122.     //Wynik zwracany jest wektorem, dlatego nie moglem uzyc referencji przy zwrocie.
  123.     std::vector<int> subbedVec;
  124.     int size = 0;
  125.     if (v1.size() >= v2.size()) {
  126.         size = v1.size();
  127.         if (v1.size() != v2.size()) {
  128.             int difference = v1.size() - v2.size();
  129.             for (int i = 0; i < difference; ++i) {
  130.                 v2.push_back(0);
  131.             }
  132.         }
  133.     }
  134.     else {
  135.         size = v2.size();
  136.         int difference = v2.size() - v1.size();
  137.         for (int i = 0; i < difference; ++i) {
  138.             v1.push_back(0);
  139.         }
  140.  
  141.     }
  142.     for (int i = 0; i < size; ++i) {
  143.         int value = v1[i] - v2[i];
  144.         subbedVec.push_back(value);
  145.     }
  146.     return subbedVec;
  147. }
  148. std::vector<int> multiply(const std::vector<int>& v, int scale) {
  149.     //Argumenty funkcji najkorzystniej przekazywac w tym przypadku przez referencje stala,
  150.     //poniewaz wystarczy tutaj pomnozyc kazdy wyraz wektora przez skalar.
  151.     //Wynik zwracany jest wektorem, dlatego nie moglem uzyc referencji przy zwrocie.
  152.     std::vector<int> multipliedVec;
  153.     for (auto i : v) {
  154.         multipliedVec.push_back(i*scale);
  155.     }
  156.     return multipliedVec;
  157. }
  158. std::vector<int> vecGen(int dim) {
  159.     std::vector<int> vecGen;
  160.     for (int i = 0; i < dim; ++i) {
  161.         vecGen.push_back((rand() % 2000) - 1000);
  162.     }
  163.     return vecGen;
  164. }
  165. void zad2() {
  166.     std::cout << "Podaj kolejno liczbe wymiarow wektora oraz wartosc skalara: \n";
  167.     int n = 0, scale = 0;
  168.     std::cin >> n >> scale;
  169.     using vecInt = std::vector<int>;
  170.     //a
  171.     vecInt a = vecGen(n);
  172.     std::cout << "a: " << equals(a, a) << '\n';
  173.     //b
  174.     vecInt b1 = vecGen(n);
  175.     vecInt b2 = vecGen(n);
  176.     std::cout << "b: " << equals(b1, b2) << '\n';
  177.     //c
  178.     vecInt c1 = vecGen(n);
  179.     vecInt c2 = vecGen(n);
  180.     vecInt added = add(c1, c2);
  181.     print(added);
  182.     //d
  183.     vecInt d = vecGen(n);
  184.     vecInt multiplied = multiply(d, scale);
  185.     print(multiplied);
  186. }
  187. void writeVector(const std::vector<int>& vec, const std::string& fileName) {
  188.     std::ofstream save;
  189.     save.open(fileName);
  190.     if (save) {
  191.         for (int i = 0; i < vec.size(); ++i) {
  192.             save << vec[i] << ' ';
  193.         }
  194.  
  195.         std::cout << "Plik zapisano pomyslnie.\n";
  196.     }
  197.     save.close();
  198. }
  199. void zad3() {
  200.     int n = 100;
  201.     std::vector<int> v = vecGen(n);
  202.     std::string fileName = "Zadanie 3.txt";
  203.     writeVector(v, fileName);
  204.     //Tak, liczby sa bez problemu widoczne.
  205. }
  206. std::vector<int> readVector(const std::string& fileName) {
  207.     std::ifstream read(fileName);
  208.     std::vector<int> buffer;
  209.     if (read) {
  210.         int value;
  211.         while (read >> value) {
  212.             buffer.push_back(value);
  213.         }
  214.     }
  215.     return buffer;
  216. }
  217. void zad4() {
  218.     std::string fileName = "Zadanie 3.txt";
  219.     print(readVector(fileName));
  220. }
  221. std::vector<int> bubbleSort(std::vector<int>& v) {
  222.     for (int i = 0; i < (v.size() - 1); ++i) {
  223.         for (int j = 0; j < (v.size() - 1); ++j) {
  224.             if (v[j] > v[j + 1]) {
  225.                 std::swap(v[j], v[j + 1]);
  226.             }
  227.         }
  228.     }
  229.     return v;
  230. }
  231. void zad5() {
  232.     //Wygenerowany wektor moze byc bez problemu przekazany do sortowania jako referencja,
  233.     //a po posortowaniu jako stala referencja, poniewaz nie bedzie on juz nigdzie zmieniany.
  234.     int n = 5;
  235.     std::string name = "Zadanie 5.txt";
  236.     std::vector<int> v = bubbleSort(vecGen(n));
  237.     writeVector(v, name);
  238.     print(readVector(name));
  239. }
  240. int randomInt(int min, int max) {
  241.     static std::default_random_engine e{};
  242.     std::uniform_int_distribution<int>d(min, max);
  243.     return d(e);
  244. }
  245. std::vector<std::vector<int>> createMatrix(int col, int row) {
  246.     std::vector<std::vector<int>> matrix;
  247.     matrix.resize(row, std::vector<int>(col, 0));
  248.     return matrix;
  249. }
  250. void printMatrix(const std::vector<std::vector<int>>& matrix) {
  251.     for (int i = 0; i < matrix[0].size(); ++i) {
  252.         for (int j = 0; j < matrix.size(); ++j) {
  253.             std::cout << matrix[j][i] << " ";
  254.         }
  255.         std::cout << std::endl;
  256.     }
  257.     std::cout << '\n';
  258. }
  259. std::vector<std::vector<int>> randomMatrix(int col, int row, int min, int max) {
  260.     std::vector<std::vector<int>> randomMatrix;
  261.     randomMatrix.resize(row, std::vector<int>(col));
  262.     for (int i = 0; i < row; ++i) {
  263.         for (int j = 0; j < col; ++j) {
  264.             randomMatrix[i][j] = randomInt(min, max);
  265.         }
  266.     }
  267.     return randomMatrix;
  268. }
  269. void zad6() {
  270.     //Macierz moze byc przekazywana przez stala referencje w funkcji print.
  271.     using intMatrix = std::vector<std::vector<int>>;
  272.     int col = 3, row = 7;
  273.  
  274.     intMatrix matrixZero;
  275.     matrixZero.resize(row, std::vector<int>(col));
  276.     matrixZero = createMatrix(col, row);
  277.     printMatrix(matrixZero);
  278.  
  279.     int min = 10, max = 100;
  280.     intMatrix matrixRandom;
  281.     matrixRandom.resize(row, std::vector<int>(col));
  282.     matrixRandom = randomMatrix(col, row, min, max);
  283.     printMatrix(matrixRandom);
  284. }
  285. std::vector<std::vector<int>> addMatrix(const std::vector<std::vector<int>>& add1, const std::vector<std::vector<int>>& add2) {
  286.     std::vector<std::vector<int>> C;
  287.     C.resize(add1.size(), std::vector<int>(add1[0].size()));
  288.     for (int i = 0; i < add1.size(); ++i) {
  289.         for (int j = 0; j < add1[0].size(); ++j) {
  290.             C[i][j] = add1[i][j] + add2[i][j];
  291.         }
  292.     }
  293.     return C;
  294. }
  295. std::vector<std::vector<int>> subtractMatrix(const std::vector<std::vector<int>>& add1, const std::vector<std::vector<int>>& add2) {
  296.     std::vector<std::vector<int>> C;
  297.     C.resize(add1.size(), std::vector<int>(add1[0].size()));
  298.     for (int i = 0; i < add1.size(); ++i) {
  299.         for (int j = 0; j < add1[0].size(); ++j) {
  300.             C[i][j] = add1[i][j] - add2[i][j];
  301.         }
  302.     }
  303.     return C;
  304. }
  305. void zad7() {
  306.     std::cout << "Podaj wymiary macierzy: \n";
  307.     int row = 0, col = 0;
  308.     std::cin >> row >> col;
  309.     printMatrix(addMatrix(randomMatrix(row, col, -16, -4), randomMatrix(row, col, -16, -4)));
  310.     printMatrix(subtractMatrix(randomMatrix(row, col, -16, -4), randomMatrix(row, col, -16, -4)));
  311. }
  312. std::vector<std::vector<int>> multiplyMatrix(std::vector<std::vector<int>>& A, std::vector<std::vector<int>>& B) {
  313.     std::vector<int>multiColumn;
  314.     std::vector<std::vector<int>>multiRow;
  315.     for (int row = 0; row < A.size(); ++row) {
  316.         for (int col = 0; col < B[0].size(); ++col) {
  317.             int temp = 0;
  318.             for (int add = 0; add < A[0].size(); ++add) {// or B
  319.                 temp += A[row][add] * B[add][col];
  320.             }
  321.             multiColumn.push_back(temp);
  322.         }
  323.         multiRow.push_back(multiColumn);
  324.         multiColumn.clear();
  325.     }
  326.     return multiRow;
  327. }
  328. void printAlt(const std::vector<std::vector<int>>& matrix) {
  329.     for (int i = 0; i < matrix.size(); ++i) {
  330.         for (int j = 0; j < matrix[0].size(); ++j) {
  331.             std::cout << matrix[i][j] << " ";
  332.         }
  333.         std::cout << std::endl;
  334.     }
  335.     std::cout << '\n';
  336. }
  337. void zad8() {
  338.     std::cout << "Podaj wymiary m, n i p macierzy => m x n & n x p: ";
  339.     int m = 0, n = 0, p = 0;
  340.     std::cin >> m >> n >> p;
  341.     using intMatrix = std::vector<std::vector<int>>;
  342.     intMatrix A = randomMatrix(n, m, 1, 14);
  343.     intMatrix B = randomMatrix(p, n, 1, 14);
  344.     printAlt(A);
  345.     printAlt(B);
  346.     std::cout << "\nPomnozona macierz: \n";
  347.     printAlt(multiplyMatrix(A, B));
  348.  
  349. }
  350. double inv(double x) {
  351.     return x = 1 / x;
  352. }
  353. double inv_square(double x) {
  354.     return 1 / std::pow(x, 2);
  355. }
  356. void printMatrixDouble(const std::vector<std::vector<double>>& matrix) {
  357.     for (int i = 0; i < matrix[0].size(); ++i) {
  358.         for (int j = 0; j < matrix.size(); ++j) {
  359.             std::cout << matrix[j][i] << " ";
  360.         }
  361.         std::cout << std::endl;
  362.     }
  363.     std::cout << '\n';
  364. }
  365. void forEach(std::vector<std::vector<double>> m, double(&fun)(double)) {
  366.     double temp = 0;
  367.     for (int col = 0; col < m.size(); col++) {
  368.         for (int row = 0; row < m[0].size(); row++) {
  369.             temp = m[col][row];
  370.             m[col][row] = fun(temp);
  371.         }
  372.     }
  373.     printMatrixDouble(m);
  374. }
  375. void zad9() {
  376.     std::vector<std::vector<double>> m = { {1.2,4.25},{2.1,5.6},{3.3,6.55} };
  377.     printMatrixDouble(m);
  378.     forEach(m, sqrt);
  379.     forEach(m, inv);
  380.     forEach(m, inv_square);
  381. }
  382. int main() {
  383.     srand(time(NULL));
  384.     std::string endCond;
  385.     do {
  386.         std::cout << "Wybierz numer zadania od 1 do 9 lub 0 aby wyjsc: " << std::endl;
  387.         unsigned short wybor = 0;
  388.         bool check = false;
  389.         while (check == false) {
  390.             std::cin >> wybor;
  391.             if (wybor < 0 || wybor>9) {
  392.                 std::cout << "Niepoprawny wybor, sprobuj ponownie.\n";
  393.                 check = false;
  394.             }
  395.             else {
  396.                 check = true;
  397.             }
  398.         }
  399.         switch (wybor) {
  400.         case 1: {
  401.             std::cout << "Zadanie 1\n";
  402.             zad1();
  403.             break;
  404.         }
  405.         case 2: {
  406.             std::cout << "Zadanie 2\n";
  407.             zad2();
  408.             break;
  409.         }
  410.         case 3: {
  411.             std::cout << "Zadanie 3\n";
  412.             zad3();
  413.             break;
  414.         }
  415.         case 4: {
  416.             std::cout << "Zadanie 4\n";
  417.             zad4();
  418.             break;
  419.         }
  420.         case 5: {
  421.             std::cout << "Zadanie 5\n";
  422.             zad5();
  423.             break;
  424.         }
  425.         case 6: {
  426.             std::cout << "Zadanie 6\n";
  427.             zad6();
  428.             break;
  429.         }
  430.         case 7: {
  431.             std::cout << "Zadanie 7\n";
  432.             zad7();
  433.             break;
  434.         }
  435.         case 8: {
  436.             std::cout << "Zadanie 8\n";
  437.             zad8();
  438.             break;
  439.         }
  440.         case 9: {
  441.             std::cout << "Zadanie 9\n";
  442.             zad9();
  443.             break;
  444.         }
  445.         case 0: {
  446.             break;
  447.         }
  448.         }
  449.         std::cout << "Chcesz zakonczyc program? (tak/nie)\n";
  450.         std::cin >> endCond;
  451.     } while (endCond != "tak");
  452. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement