Dr. Željko Jurić: Tehnike programiranja /kroz programski jezik C++/ Tutorijal 2 Zadaci predviđeni za rad na laboratorijskim vježbama uz pomoć tutora Akademska godina 2013/14 Zadaci za Tutorijal 2. NAPOMENA: Studenti bi trebali da razmisle o zadacima koji će se raditi na tutorijalu prije nego što dođu na tutorijal, tako da već u startu imaju osnovne ideje kako riješiti zadatke. U suprotnom, rad na laboratorijskim vježbama neće biti produktivan. Zadaci koje studenti ne stignu uraditi za vrijeme tutorijala, trebali bi samostalno uraditi kod kuće. 1. Napišite funkciju DaLiJeProst sa jednim parametrom n koji predstavlja neki cijeli broj, a koja kao rezultat vraća logičku vrijednost tačno ili netačno u ovisnosti od toga da li je parametar prost broj ili ne (prosti brojevi su oni koji imaju tačno dva djelioca u skupu prirodnih brojeva: jedinicu i samog sebe). Napisanu funkciju iskoristiti u glavnom programu koji traži da se sa tastature unesu dva cijela broja a i b, a zatim za sve cijele brojeve u opsegu od a do b ispisuje informaciju o tome da li su prosti ili ne, u vidu rečenica oblika Broj 5 je prost. odnosno Broj 9 nije prost.. 2. U teoriji električnih kola uvodi se pojam impedanse, koja je kompleksan broj Z definiran kao Z = R + X i, gdje je R tzv. aktivni otpor, a X tzv. reaktivni otpor (ili reaktansa), koji može biti i negativan. Ukoliko imamo paralelni spoj n elemenata čije su impedanse Z 1, Z 2,... Z n, ukupna impedansa paralelne veze Z računa se kao Z = 1 / (1 / Z 1 + 1 / Z 2 +... + 1 / Z n ). Drugim riječima, situacija je slična paralelnom spajanju otpornika, osim što se ovdje radi sa kompleksnim impedansama. a) Napišite program u kojem se korisnika traži da se unese broj elemenata n, a zatim n impedansi Z k za sve k od 1 do n. Impedanse se unose kao kompleksni brojevi, tačnije kao parovi realnih i imaginarnih dijelova unutar zagrada, razdvojeni zarezom. Nakon toga, treba da izračuna i ispiše impedansu paralelne veze svih n elementata, ponovo kao kompleksan broj. Dijalog između programa i korisnika treba da izgleda poput sljedećeg: Unesi broj elemenata: 3 Z_1 = (3.5,2.8) Z_2 = (10,-1.54) Z_3 = (12.37,0.24) Paralelna veza ovih elemenata ima impedansu Z_ = (2.51479,0.897637). Za realizaciju programa koristite kompleksni tip podataka. Nemojte koristiti niti nizove niti vektore, nego sumu 1 / Z 1 + 1 / Z 2 +... + 1 / Z n računajte u hodu, uporedo sa unosom podataka. b) Prepravite prethodni program tako što će se umjesto impedansi Z k sa tastature posebno unositi aktivni i reaktivni otpori R k i X k, i što će se na kraju ispisivati posebno aktivni i reaktivni otpor paralelne veze elemenata. Dijalog između programa i korisnika treba da izgleda poput sljedećeg: Unesi broj elemenata: 3 R1 = 3.5 X1 = 2.8 R2 = 10 X2 = -1.54 R3 = 12.37 X3 = 0.24 Paralelna veza ovih elemenata ima R = 2.51479 i X = 0.897637. c) Prepravite prethodni program tako što će se sve impedanse Z k umjesto preko aktivnog otpora R k i reaktivnog otpora X k zadavati preko tzv. prividnog otpora Z k i faznog pomaka k, pri čemu vrijedi Z k = Z k e i k. Program na kraju treba prikazati prividni otpor i fazni pomak za čitavu 1
Dr. Željko Jurić: Tehnike programiranja /kroz programski jezik C++/ Tutorijal 2 Zadaci predviđeni za rad na laboratorijskim vježbama uz pomoć tutora Akademska godina 2013/14 paralelnu vezu. Fazni pomak treba zadavati ispisivati u stepenima. Dijalog između programa i korisnika treba da izgleda poput sljedećeg: Unesi broj elemenata: 2 Z1 = 10.5 fi1 = 30 Z2 = 2.8 fi2 = -47.6 Paralelna veza ovih elemenata ima Z = 2.57147 i fi = -33.7613. Uputa: trebaće vam funkcije abs, arg i polar. 3. Napišite funkciju koja kao parametar prima vektor realnih brojeva. Funkcija treba da ispita da li elementi vektora čine slijed koji se periodično ponavlja ili ne. Na primjer, za vektor čiji su elementi 5, 9, 7, 2, 5, 9, 7, 2, 5, 9, 7 uočavamo da njegovi elementi čine slijed koji se periodično ponavlja sa dužinom perioda 4. Ukoliko elementi vektora čine periodičan slijed, funkcija treba da vrati kao rezultat dužinu perioda, a u suprotnom, funkcija treba da vrati nulu kao rezultat. Napisanu funkciju demonstrirajte u glavnom programu u kojem ćete unositi elemente sa tastature u neki vektor sve dok se sa tastature ne unese nula, koja označava kraj unosa (tu nulu ne treba smjestiti u vektor). Nakon završetka unosa, program poziva napisanu funkciju sa ciljem da utvrdi da li se elementi periodično ponavljaju ili ne, nakon čega ispisuje odgovarajuči komentar na ekranu (informaciju o dužini perioda, ili da elementi ne čine periodičan slijed). Napomenimo da nije unaprijed poznato koliko će korisnik unijeti elemenata prije nego što unese nulu kao oznaku završetka unosa. 2
1. ZADATAK bool DaLiJeProst (int n) for (int i=2; i<=n-1; i++) if (n%i==0) return false; return true; int a,b; cout << "Unesite dva broja a i b: "; cin >> a >> b; for (int i=a; i<=b; i++) if (DaLiJeProst(i)) cout << "Broj "<<i<<" je prost."<<endl; else cout <<"Broj "<<i<<" nije prost."<<endl;
2. ZADATAK a) #include <complex> int n; cout <<"Unesite broj elemenata: "; cin >> n; complex<double>zk; complex<double> SumaNazivnika,Z; for (int i=1; i<=n; i++) cout <<"Z"<<i<<"="; cin >> Zk; SumaNazivnika=SumaNazivnika+(1./Zk); Z=1./SumaNazivnika; cout << "Paralelna veza ovih elemenata ima impedansu Z = "<<Z<<endl; b) #include <complex> cout << "Unesi broj elemenata: "; int n; cin >> n; double Re,Im; complex<double>zk,z,sumanazivnika; for (int i=1; i<=n; i++) cout << "R"<<i<<"="; cin >> Re; cout << "X"<<i<<"="; cin >> Im; Zk=complex<double>(Re,Im); SumaNazivnika=SumaNazivnika+(1./Zk); Z=(1./SumaNazivnika); cout <<"Paralelna veza ovih elemenata ima R="<<real(Z)<<" i X="<<imag(Z)<<endl;
c) #include <complex> cout << "Unesite broj elemenata: "; int n; cin >>n; double Zm,fi,fik; complex<double>zk,z,sumanazivnika; const double PI=4*atan(1); for (int i=1; i<=n; i++) cout << "Z"<<i<<"="; cin >>Zm; cout << "fi"<<i<<"="; cin>>fi; fik=fi*pi/180; Zk=polar (Zm,fik); Sumanazivnika=Sumanazivnika+(1./Zk); Z=1./Sumanazivnika; cout << "Paralelna veza ovih elemenata ima Z="<<abs(Z)<<" i fi="<<arg(z)*180/pi;
3. ZADATAK #include <vector> int Period (vector<int>v) int p=0; for (int i=1; i<v.size(); i++) if (v[i]==v[0]) p=i; break; for (int i=1; i<v.size()-p; i++) if (v[i]!=v[i+p]) return p; vector<int> NekiVektor; double n; cout << "Unesite elemente u vektor: "; cin >> n; while (n!=0) NekiVektor.push_back(n); cin>>n; if (Period(NekiVektor)==0) cout << "Uneseni niz brojeva nije periodican"; else cout << "Uneseni niz je periodican i ima period: "<<Period(NekiVektor);