Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.22 KB | None | 0 0
  1. /*#include <iostream>
  2. #include <omp.h>
  3. #include <stdio.h>
  4.  
  5. using namespace std;
  6.  
  7. typedef struct pixel {
  8.     float r, g, b;
  9. } pixel;
  10.  
  11. #define kernel_height 5
  12. #define kernel_width 5
  13. #define SIZE 10
  14.  
  15. pixel in[SIZE][SIZE];
  16. pixel out[SIZE][SIZE];
  17.  
  18. float kernel[kernel_height][kernel_width]{
  19.         // TODO: Define the kernel
  20.         {0, 1, 1, 5, 1},
  21.         {1, 0, 1, 1, 1},
  22.         {1, 1, 0, 1, 1},
  23.         {1, 1, 8, 0, 1},
  24.         {1, 1, 1, 1, 0}
  25. };
  26.  
  27. void generate() {
  28.     for (int i = 0; i < SIZE; ++i) {
  29.         for (int j = 0; j < SIZE; ++j) {
  30.             in[i][j].r = 1.0f;
  31.             in[i][j].g = 0.1f;
  32.             in[i][j].b = 0.5f;
  33.         }
  34.     }
  35. }
  36.  
  37. void vypisin() {
  38.     for (int i = 0; i < SIZE; ++i) {
  39.         for (int j = 0; j < SIZE; ++j) {
  40.             printf("(%0.f, %0.f, %0.f)", in[i][j].r, in[i][j].g, in[i][j].b);
  41.         }
  42.         printf("\n");
  43.     }
  44.     printf("--------------------------------------------------------------\n");
  45. }
  46.  
  47. void vypisout() {
  48.     for (int i = 0; i < SIZE; ++i) {
  49.         for (int j = 0; j < SIZE; ++j) {
  50.             printf("(%0.f, %0.f, %0.f)", out[i][j].r, out[i][j].g, out[i][j].b);
  51.         }
  52.         printf("\n");
  53.     }
  54.     printf("--------------------------------------------------------------\n");
  55. }
  56.  
  57. inline float clamp(float value) {
  58.     if (value > 1.0f) return 1.0f;
  59.     if (value < 0) return 0;
  60.     return value;
  61. }
  62.  
  63. int main() {
  64.     generate();
  65.     vypisin();
  66.     int i, j, x, y, tid, nthreads;
  67.     float r = 0, g = 0, b = 0;
  68.     float imageX = 0, imageY = 0;
  69.  
  70. #pragma omp parallel shared(in, out) private(i, j, x, y, r, g, b, imageX, imageY)
  71.     {
  72.         /* Get thread number */
  73.        /* tid = omp_get_thread_num();
  74.  
  75.         /* Only master thread does this */
  76.       /*  if (tid == 0) {
  77.             nthreads = omp_get_num_threads();
  78.             printf("Number of threads = %d\n", nthreads);
  79.         }
  80. /*
  81.         /* Initialization */
  82. /*#pragma omp for
  83.         for (y = 0; y < SIZE; ++y) {
  84.             for (x = 0; x < SIZE; ++x) {
  85.                 // Store sum of colors
  86.                 r = g = b = 0;
  87.                 for (j = 0; j < kernel_height; j++) {
  88.                     for (i = 0; i < kernel_width; i++) {
  89.                         imageX = x + i - kernel_width / 2;
  90.                         imageY = y + j - kernel_height / 2;
  91.  
  92.                         if (imageX < 0) imageX = imageX * (-1);
  93.                         if (imageX >= SIZE) imageX = SIZE - (imageX - (SIZE - 1));
  94.                         if (imageY < 0) imageY = imageY * (-1);
  95.                         if (imageY >= SIZE) imageY = SIZE - (imageY - (SIZE - 1));
  96.  
  97.                         r += (in[j][i].r) * kernel[j][i];
  98.                         g += (in[j][i].g) * kernel[j][i];
  99.                         b += (in[j][i].b) * kernel[j][i];
  100.                     }
  101.                 }
  102.                 // TODO: Compute convolution
  103.  
  104.                 // Store the result divided by factor
  105.                 out[x][y].r = r;
  106.                 out[x][y].g = g;
  107.                 out[x][y].b = b;
  108.  
  109.             }
  110.         }
  111.  
  112.     }  /* End of parallel region */
  113.  
  114.     /*vypisout();
  115.  
  116.     return 0;
  117. }*/
  118.  
  119.  
  120.  
  121.  
  122. #include <math.h>
  123. #include <time.h>
  124. #define MAX_CISLO_1 9
  125. #define MAX_CISLO_2 18
  126. #include <iostream>
  127. using namespace std;
  128.  
  129. struct CPLX { double re, im; };
  130.  
  131. /*  Funkcia ocakava v 1 formalnom argumente ukazovatel na na strukturovu premennu typu 'CPLX'.
  132. Funkcia vygeneruje komplexne cislo pomocou generatora pseudonahodnych cisiel 'rand'.
  133. */
  134. void generujCPLX(CPLX *c)
  135. {
  136.     c->re = 1 + (rand() % MAX_CISLO_1);
  137.     c->im = 1 + (rand() % MAX_CISLO_2);
  138. }
  139.  
  140. /*  Funkcia ocakava v 1. formalnom argumente ukazovatel na strukturovu premennu typu 'CPLX'.
  141. Funkcia vypocita modul komplexneho cisla (cize jeho velkost).
  142. */
  143. double abs(CPLX *x)
  144. {
  145.     return sqrt((x->re * x->re) + (x->im * x->im));
  146. }
  147.  
  148. /*  Funkcia ocakava v 1. a 2. formalnom argumente ukazovatele na strukturove premenne typu 'CPLX'.
  149. Funkcia podla velkosti vzajomne porovna strukturove premenne typu 'CPLX', na ktore ukazuju
  150. ukazovatele 'a' a 'b'.
  151. */
  152. int porovnaj(CPLX *a, CPLX *b)
  153. {
  154.     if (abs(a)>abs(b))
  155.         return 1;
  156.     else
  157.         return 0;
  158. }
  159.  
  160.  
  161.  
  162. /*  Funkcia triedi pole strukturovych premennych algoritmom Quick sort.
  163. Je jedno, ci je jej prvym argumentom 'CPLX **data' alebo 'CPLX *data[]', pretoze oba syntakticky
  164. v nasom pripade predstavuju ukazovatel na pole ukazovatelov na strukturove premenne typu    'CPLX'.
  165. Funkcia s oboma argumentmi funguje spravne.
  166. */
  167. void QuickSort(CPLX **data, int lavy, int pravy)
  168. {
  169.     if (lavy<pravy)
  170.     {
  171.         int i = lavy, j = pravy;
  172.         CPLX *p = data[(lavy + pravy) / 2];
  173.         do
  174.         {
  175.             while (porovnaj(p, data[i])>0) i++;
  176.             while (porovnaj(data[j], p)>0) j--;
  177.             if (i <= j)
  178.             {
  179.                 CPLX *tmp = data[i];
  180.                 data[i] = data[j];
  181.                 data[j] = tmp;
  182.                 i++; j--;
  183.             }
  184.         } while (i <= j);
  185.         QuickSort(data, lavy, j);
  186.         QuickSort(data, i, pravy);
  187.     }
  188. }
  189.  
  190.  
  191.  
  192. /*  Funkcia ocakava v 1 formalnom argumente ukazovatel na pole ukazovatelov na strukturove  premenne typu 'CPLX'. V tele potom pracuje s prvkami 'data[i]' (cize s ukazovatelmi) tohto pola     ukazovatelov na strukturove premenne typu 'CPLX'.
  193. Funkcia skontroluje spravne usporiadanie prvkov pola, na ktore ukazuju ukazovatele 'data[i]',
  194. cize usporiadanie strukturovych premennych typu 'CPLX' vzostupne podla ich velkosti.
  195.  
  196. Je jedno ci je jej prvym argumentom 'CPLX **data' alebo 'CPLX *data[]', pretoze oba syntakticky
  197. v nasom pripade predstavuju ukazovatel na pole ukazovatelov na strukturove premenne typu    'CPLX'.
  198. Funkcia s oboma argumentmi funguje spravne.
  199. */
  200. int skontroluj(CPLX *data[], int n)
  201. {
  202.     for (int i = 1; i<n; i++)
  203.         if (porovnaj(data[i - 1], data[i])>0)
  204.             return 0;
  205.     return 1;
  206. }
  207.  
  208. /*  Funkcia ocakava v 1 a 2 formalnom argumente ukazovatele na polia ukazovatelov na strukturove    premenne typu 'CPLX'. V tele potom pracuje s prvkami 'data1[i]' a 'data2[i]'(cize s ukazovatelmi)   tychto poli ukazovatelov na strukturove premenne typu 'CPLX'.
  209. Funkcia skontroluje zhodnost prvkov poli strukturovych premennych typu 'CPLX', na ktore ukazuju     ukazovatele 'data1[i]' a 'data2[i]'.
  210.  
  211. Je jedno, ci je jej 1. a 2. argumentom 'CPLX **data1' a 'CPLX **data2' alebo 'CPLX *data1[]'
  212. a 'CPLX *data2[]', pretoze oboje syntakticky v nasom pripade predstavuju ukazovatele na polia
  213. ukazovatelov na strukturove premenne typu 'CPLX'. Funkcia s oboma argumentmi funguje spravne.
  214. */
  215. int skontroluj(CPLX *data1[], CPLX *data2[], int n)
  216. {
  217.     for (int i = 0; i<n; i++)
  218.         if (porovnaj(data1[i], data2[i]) != 0)
  219.             return 0;
  220.     return 1;
  221. }
  222.  
  223. //porovnavacia funkcia do kniznicnej funkcie 'qsort'
  224. int porovnajQptp(const void *a, const void *b)
  225. {
  226.     if (abs(*(CPLX **)a) > abs(*(CPLX **)b))
  227.         return 1;
  228.     if (abs(*(CPLX **)a) < abs(*(CPLX **)b))
  229.         return -1;
  230.     return 0;
  231. }
  232.  
  233. void vypis(CPLX **data, int n);  // funkcia vypise 'n' prvkov pola 'data'
  234.  
  235. void vypis(CPLX **data, int n)
  236. {
  237.     for (int i = 0; i < n; i++)
  238.     {
  239.         cout << (*data[i]).re;
  240.         if ((*data[i]).im>0)
  241.             cout << "+" << (*data[i]).im << "i";
  242.         else
  243.             cout << "-" << -(*data[i]).im << "i";
  244.         cout << " (" << abs(data[i]) << ")";             //??????????????????????????????????????????????????????
  245.         cout << endl;
  246.     }
  247. }
  248.  
  249. int main()
  250. {
  251.     int n, i;
  252.     cout << "vlozte pocet komplexnych cisiel, ktore ma program vygenerovat: ";
  253.     cin >> n;
  254.  
  255.     //'ccisla1ptp' je ukazovatel na ukazovatel na CPLX
  256.     CPLX **ccisla1ptp = new CPLX*[n]; //alokovanie miesta pre n-prvkove POLE UKAZOVATELOV na
  257.     //CPLX, na ktore ukazuje ukazovatel 'ccisla1ptp'
  258.     for (i = 0; i<n; i++)
  259.         ccisla1ptp[i] = new CPLX; //inicializacia ukazovatela 'ccisla1ptp[i]', vkladame do neho ukazovatel na
  260.     //pamatove miesto pre premennu typu CPLX
  261.  
  262.     CPLX **ccisla2ptp = new CPLX*[n];
  263.     for (i = 0; i<n; i++)
  264.         ccisla2ptp[i] = new CPLX;
  265.  
  266.     /*  nastavenie startovacieho cisla generatora pseudonahodnych cisiel 'rand' tak, aby toto cislo bolo
  267.     vzdy ine, po novom zavolani funkcie 'main'. Takto tento generator vygeneruje vzdy ine
  268.     pseudonahodne cisla */
  269.     srand((unsigned)time(NULL));
  270.  
  271.  
  272.     /*  plnenie obsahu prvkov pola 'ccisla1ptp' vygenerovanymi komplexnymi cislami
  273.     a kopirovanie prvkov pola 'ccisla1ptp' do prvkov pola 'ccisla2ptp' */
  274.     for (i = 0; i<n; i++)
  275.     {
  276.         generujCPLX(ccisla1ptp[i]);
  277.         ccisla2ptp[i] = ccisla1ptp[i];
  278.     }
  279.  
  280.     cout << "\nneusporiadane pole komplexnych cisel 'ccisla1ptp':";
  281.     vypis(ccisla1ptp, n);
  282.     cout << "\nneusporiadane pole komplexnych cisel 'ccisla2ptp':";
  283.     vypis(ccisla2ptp, n);
  284.  
  285.     int k;
  286.  
  287.     clock_t c1, c2;
  288.  
  289.     c1 = clock();
  290.     QuickSort(ccisla1ptp, 0, n - 1);
  291.     c2 = clock();
  292.     k = skontroluj(ccisla1ptp, n);
  293.     cout << "\nkontrola spravneho usporiadania pola 'ccisla1ptp' funkciou 'QuickSort': " << k << endl;
  294.     cout << "          (trvanie usporiadania pola 'ccisla1ptp' funkciou 'QuickSort': " << (c2 - c1) /
  295.                                                                                           CLOCKS_PER_SEC << " s)\n";
  296.  
  297.     c1 = clock();
  298.     qsort((void *)ccisla2ptp, n, sizeof(ccisla2ptp[0]), porovnajQptp);
  299.     c2 = clock();
  300.     k = skontroluj(ccisla2ptp, n);
  301.     cout << "\nkontrola spravneho usporiadania pola 'ccisla2ptp' funkciou 'qsort': " << k << endl;
  302.     cout << "          (trvanie usporiadania pola 'ccisla2ptp' funkciou 'qsort': " << (c2 - c1) /
  303.                                                                                       CLOCKS_PER_SEC << " s)\n";
  304.  
  305.     k = skontroluj(ccisla1ptp, ccisla2ptp, n);
  306.     cout << "\nkontrola zhodnosti prvkov usporiadanych poli 'ccisla1ptp' a 'ccisla2ptp': " << k;
  307.  
  308.  
  309.     cout << "\nUSPORIADANE pole komplexnych cisel 'ccisla1ptp' funkciou 'QuickSort':";
  310.     vypis(ccisla1ptp, n);
  311.     cout << "\nUSPORIADANE pole komplexnych cisel 'ccisla2ptp' funkciou qsort:";
  312.     vypis(ccisla2ptp, n);
  313.  
  314.     delete ccisla1ptp[n - 1]; //mazeme pole ukazovatelov
  315.     delete[] ccisla1ptp;  //mazeme ukazovatel na toto pole
  316.     delete ccisla2ptp[n - 2];
  317.     delete[] ccisla2ptp;
  318.  
  319.     return 0;
  320. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement