Skip to content

Commit bc04781

Browse files
v03
1 parent cda2587 commit bc04781

File tree

3 files changed

+257
-0
lines changed

3 files changed

+257
-0
lines changed

v03/marfi/main.cpp

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
Napraviti program koji ispituje ispravnost jednog od Marfijevih zakona, koji glasi:
3+
"Vas red je uvek najsporiji.".
4+
5+
Simulirati placanje robe na tri kase. Rad svake kase predstavljen je jednom niti.
6+
Svaka nit dobija parametar koji predstavlja broj kupaca koje kasa treba da opsluzi.
7+
Broj kupaca je slucajan broj izmedju 1 i 30.
8+
Opsluzivanje svakog kupca simulirati uspavljivanjem niti na slucajan vremenski period izmedju 1 i 100 ms.
9+
10+
Izracunati trajanje kupovine na svakoj od kasa.
11+
12+
Na pocetku programa potrebno je pitati korisnika da unese redni broj kase na
13+
kojoj zeli da izvrsi kupovinu.
14+
Na kraju ispisati da li je Marfijev zakon potvrdjen.
15+
Ukoliko je kupovina na kasi koju je kupac izabrao trajala najduze, tada je Marfijev zakon potvrdjen.
16+
*/
17+
18+
#include <iostream>
19+
#include <thread>
20+
21+
using namespace std;
22+
using namespace chrono;
23+
24+
// Broj kasa
25+
const int N = 3;
26+
// Maksimalno vreme cekanja
27+
const int MAX_CEKANJE = 100;
28+
// Maksimalan broj ljudi u redu
29+
const int MAX_LJUDI = 30;
30+
31+
// Funkcija koja simulira cekanje u redu sa n kupaca
32+
void f(int n, duration<double, milli> &v) {
33+
// Uzimanje vremena pre početka izvršavanja
34+
auto t0 = system_clock::now();
35+
36+
// Simuliranje čekanja
37+
for (int i = 0; i < n; i++) {
38+
// Uspavljuje trenutnu nit za prosledjeno vreme
39+
this_thread::sleep_for(milliseconds(rand() % MAX_CEKANJE + 1));
40+
}
41+
42+
// Uzimanje vremena nakon završetka izvršavanja
43+
auto t1 = system_clock::now();
44+
45+
// Ukupno čekanje
46+
v = t1 - t0;
47+
}
48+
49+
int main() {
50+
// Slucajni brojevi se racunaju u odnosu na trnutno vreme
51+
srand(time(NULL));
52+
53+
// Redni broj kase
54+
int n;
55+
cout << "Unesite redni broj kase [0<=n<3]: " << endl;
56+
cin >> n;
57+
58+
// Vremena čekanja na svakoj kasi
59+
duration<double, milli> v[N];
60+
61+
// Niti za simulaciju čekanja
62+
thread t[N];
63+
64+
//Simulacija čekanja
65+
for (int i = 0; i < N; i++) {
66+
t[i] = thread(f, rand() & MAX_LJUDI + 1, ref(v[i]));
67+
}
68+
for (int i = 0; i < N; i++) {
69+
t[i].join();
70+
}
71+
72+
// Pronalaženje reda u kojem se najduže čekalo
73+
auto max = v[0];
74+
for (int i = 0; i < N; i++) {
75+
cout << "Ukupno cekanje reda br. " << i << " je: " << v[i].count() << endl;
76+
// Pronalaženje maksimuma
77+
if (v[i] > max) {
78+
max = v[i];
79+
}
80+
}
81+
82+
// Provera zakona
83+
if (v[n] == max) {
84+
cout << "Marfijev zakon potvrdjen!" << endl;
85+
} else {
86+
cout << "Marfijev zakon nije potvrdjen!" << endl;
87+
}
88+
}

v03/najblizi_nuli_vreme/main.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/*
2+
Napraviti konkurentni program koji pronalazi element najblizi 0 iz zadatog vektora brojeva.
3+
Posao podeliti u 3 niti. Vektor treba da sadrzi 900000 elemenata.
4+
Elementi su pseudoslucajni brojevi dobijeni pozivom funkcije rand().
5+
6+
Za svaku nit, evidentirati trenutke kada je izvrsavanje pocelo i kada je zavrsilo.
7+
Na kraju programa, ispisati koliko je trajalo izvrsavanje svake niti u milisekundama.
8+
*/
9+
10+
#include <iostream>
11+
#include <vector>
12+
#include <thread>
13+
#include <cmath>
14+
15+
using namespace std;
16+
using namespace chrono;
17+
18+
// Broj elemenata niza
19+
const int N = 900000;
20+
// Broj niti
21+
const int BROJ_NITI = 3;
22+
23+
// Funkcija koja traži minimum
24+
void f(vector<double>::const_iterator pocetak, vector<double>::const_iterator kraj, double &min, duration<double, milli> &v) {
25+
// Uzimanje vremena pre početka izvršavanja
26+
system_clock::time_point t0 = system_clock::now();
27+
// Traženje minimuma
28+
min = *pocetak;
29+
for (auto it = pocetak + 1; it != kraj; it++) {
30+
if (abs(*it) < abs(min)) {
31+
min = *it;
32+
}
33+
}
34+
// Uzimanje vremena nakon završetka izvršavanja
35+
system_clock::time_point t1 = system_clock::now();
36+
37+
// Ukupno trajanje je razlika vremena kraja i početka
38+
v = t1 - t0;
39+
}
40+
41+
int main() {
42+
// Slucajni brojevi se racunaju u odnosu na trnutno vreme
43+
srand(time(NULL));
44+
45+
vector<double> A(N);
46+
47+
// Popunjavanje vektora slučajnim brojevima
48+
for (int i = 0; i < N; i++) {
49+
A[i] = rand();
50+
}
51+
52+
// Potrebne niti
53+
thread t[BROJ_NITI];
54+
// Traženi minimumi
55+
double m[BROJ_NITI];
56+
// Vremena izvršavanja
57+
duration<double, milli> v[BROJ_NITI];
58+
59+
// Pokretanje niti
60+
for (int i = 0; i < BROJ_NITI; i++) {
61+
t[i] = thread(f, A.begin() + A.size() * i / BROJ_NITI, A.begin() + A.size() * (i+1) / BROJ_NITI, ref(m[i]), ref(v[i]));
62+
}
63+
64+
// Čekanje da se niti završe
65+
for (int i = 0; i < BROJ_NITI; i++) {
66+
t[i].join();
67+
}
68+
69+
// Traženje minimuma dobijenih minimuma
70+
double min = m[0];
71+
for (int i = 1; i < BROJ_NITI; i++) {
72+
if (abs(m[i]) < abs(min)) {
73+
min = m[i];
74+
}
75+
}
76+
77+
//Ispis rezultata
78+
cout << "Element najblizi nuli: " << min << endl;
79+
80+
// Ispis vremena trajanja
81+
for (int i = 0; i < BROJ_NITI; i++) {
82+
cout << "Nit br. " << i << " se izvrsavala " << v[i].count() << " milisekundi." << endl;
83+
}
84+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
Prosiriti zadatak najbilzi_nuli_vreme.cpp ispisom u sekundama i minutima.
3+
*/
4+
5+
#include <iostream>
6+
#include <vector>
7+
#include <thread>
8+
#include <cmath>
9+
10+
using namespace std;
11+
using namespace chrono;
12+
13+
// Broj elemenata niza
14+
const int N = 900000;
15+
// Broj niti
16+
const int BROJ_NITI = 3;
17+
18+
// Funkcija koja traži minimum
19+
void f(vector<double>::const_iterator pocetak, vector<double>::const_iterator kraj, double &min, duration<double, milli> &v) {
20+
// Uzimanje vremena pre početka izvršavanja
21+
system_clock::time_point t0 = system_clock::now();
22+
// Traženje minimuma
23+
min = *pocetak;
24+
for (auto it = pocetak + 1; it != kraj; it++) {
25+
if (abs(*it) < abs(min)) {
26+
min = *it;
27+
}
28+
}
29+
// Uzimanje vremena nakon završetka izvršavanja
30+
system_clock::time_point t1 = system_clock::now();
31+
32+
// Ukupno trajanje je razlika vremena kraja i početka
33+
v = t1 - t0;
34+
}
35+
36+
int main() {
37+
// Slucajni brojevi se racunaju u odnosu na trnutno vreme
38+
srand(time(NULL));
39+
40+
vector<double> A(N);
41+
42+
// Popunjavanje vektora slučajnim brojevima
43+
for (int i = 0; i < N; i++) {
44+
A[i] = rand();
45+
}
46+
47+
// Potrebne niti
48+
thread t[BROJ_NITI];
49+
// Traženi minimumi
50+
double m[BROJ_NITI];
51+
// Vremena izvršavanja
52+
duration<double, milli> v[BROJ_NITI];
53+
54+
// Pokretanje niti
55+
for (int i = 0; i < BROJ_NITI; i++) {
56+
t[i] = thread(f, A.begin() + A.size() * i / BROJ_NITI, A.begin() + A.size() * (i+1) / BROJ_NITI, ref(m[i]), ref(v[i]));
57+
}
58+
59+
// Čekanje da se niti završe
60+
for (int i = 0; i < BROJ_NITI; i++) {
61+
t[i].join();
62+
}
63+
64+
// Traženje minimuma dobijenih minimuma
65+
double min = m[0];
66+
for (int i = 1; i < BROJ_NITI; i++) {
67+
if (abs(m[i]) < abs(min)) {
68+
min = m[i];
69+
}
70+
}
71+
72+
//Ispis rezultata
73+
cout << "Element najblizi nuli: " << min << endl;
74+
75+
// Ispis vremena trajanja
76+
for (int i = 0; i < BROJ_NITI; i++) {
77+
duration<double, ratio<60>> mins= v[i];
78+
duration<double> secs= v[i];
79+
duration<double, milli> millis= v[i];
80+
cout << "Nit br. " << i << " se izvrsavala " << millis.count() << " milisekundi." << endl;
81+
cout << "Nit br. " << i << " se izvrsavala " << secs.count() << " sekundi." << endl;
82+
cout << "Nit br. " << i << " se izvrsavala " << mins.count() << " minuta." << endl;
83+
cout << endl;
84+
}
85+
}

0 commit comments

Comments
 (0)