|
![]() |
#1 |
/
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
|
Funkcije (C++)
Imam funkciju (točnije 2 funkcije) u C++ koje računaju pretvorbu iz pravokutnog u polarni oblik (ponukan osnovama elektrotehnike ![]() ovo je moj program Code:
#include <math.h> #include <iostream> using namespace std; double broj (float x, float y); double kut (float x, float y); int main() { float a1, a2; cout << "Upisi realni dio: "; cin >> a1; cout << "Upisi imaginarni dio: "; cin >> a2; // if (a1<0 && a2==0) {jot_1=a1; jot_2=0;} // ako je realni dio manji od 0, tada je rezultat taj realni broj pod kutem 0 // else if (a1==0 && a2>0) {jot_1=a2; jot_2=90;} // ako je realni dio jednak 0, a imagirani veći od 0 tada je rezultat imaginarni broj pod kutem 90 // else if (a1==0 && a2<0) {jot_1=a2*-1; jot_2=-90;} // ako je realni dio jednak 0, a imaginarni manji od 0 tada je rezultat imaginarni broj pod kutem -90 // else cout << endl << "Rezultat: " << broj (a1,a2) << " |_" << kut (a1,a2) << endl; char z; cin >> z; return 0; } double broj (float x, float y) { float rezultat; rezultat=sqrt(x*x+y*y); return rezultat; } double kut (float x, float y) { float rezultat; rezultat=atan(y/x)*180/M_PI; return rezultat; } i druga stvar...ovo pod komentarima. to sam prije radio (prijašnji program) ispisivanje rezultata varijable "jot_1" koja je glumila rezultat broj, te "jot_2" koja je glumila rezultat kuta. znači zasebno bi stavio Code:
jot_1=sqrt(a1*a1+a2*a2); Code:
jot_2=atan(a2/a1)*180/M_PI; ![]() EDIT: kad sam već tu da pitam, čemu točno služi prototip funkcije (function prototype)? ako ga maknem javlja grešku ALI u slučaju da su funkcije (broj i kut) iza main funkcije. AKO maknem prototip funkcije i stavim te dvije ispred main funkcije sve najnormalnije radi? Zadnje izmijenjeno od: svebee. 02.06.2009. u 23:36. |
![]() |
![]() |
![]() |
#2 |
Premium
Datum registracije: Feb 2008
Lokacija: Mursa
Postovi: 87
|
Prototip ti je samo deklaracija kako se funkcija zove i što vraća i što su joj argumenti. To je stvar da program unaprijed 'zna' kakve će funkcije koristiti, što će vraćati, kakve argumente će primati; i sl. te koliko si memorije mora za takve funkcije osigurati. Koliko ja znam funkcije uvijek vraćaju samo jednu vrijednost. Zapravo, nadam se da iz matematike znaš, da ako za jedan ili više argumenata funkcije dobiješ dvije vrijednosti funcije, to više nije funkcija nego tzv. relacija. Toga u programiranju nema. Malo podrobnije opiši zadatak pa ti možda mogu više pomoć. |
![]() |
![]() |
|
|
Oglas
|
|
![]() |
#3 | |
/
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
|
Citiraj:
aha, znači to nije izvedivo? ![]() pa neznam što da ti objasnim... cilj programa je da pretvori dva unesena broj (a1,a2) iz pravokutnog (x+yi) u polarni oblik (x|_y) - pomoću funkcija. ja sam napravio taj program sa dvije funkcije i to radi bez problema, no mene zanima mogu li se ta dva rezultata "(po)spremiti" u jednu funkciju te kako riješiti ovaj "problem" sa ifelse? kako ispitati rezultate koji su tek kasnije "pohranjeni" u funkciji, znači ne računaju se zasebno ispred ispisivanja. evo kako je izgledao stari program (također radi bez problema). Code:
// 1. broj (gore lijevo) cout << "Upisi realni dio: "; cin >> a1; cout << "Upisi imaginarni dio: "; cin >> a2; if (a1<0 && a2==0) {jot_1=a1; jot_2=0;} // ako je realni dio manji od 0, tada je rezultat taj realni broj pod kutem 0 else if (a1==0 && a2>0) {jot_1=a2; jot_2=90;} // ako je realni dio jednak 0, a imagirani veći od 0 tada je rezultat imaginarni broj pod kutem 90 else if (a1==0 && a2<0) {jot_1=a2*-1; jot_2=-90;} // ako je realni dio jednak 0, a imaginarni manji od 0 tada je rezultat imaginarni broj pod kutem -90 else jot_1=sqrt(a1*a1+a2*a2); jot_2=atan(a2/a1)*180/M_PI; cout << endl; cout << "--------------------------------------" << endl << endl; cout << " " << "Determinanta iznosi:" << endl; cout << " " << "Gore lijevo: " << jot_1 << " |_" << jot_2 << endl; cout << " " << "Gore desno: " << "UPISI BROJ!" << endl; cout << " " << "Dolje lijevo: " << "0" << endl; cout << " " << "Dolje desno: " << "0" << endl << endl; |
|
![]() |
![]() |
![]() |
#4 |
Premium
Datum registracije: Feb 2008
Lokacija: Mursa
Postovi: 87
|
Ne možeš to strpati u jednu funkciju jer onda kad bi nju pozivao ne bi znao hoće li ti return biti broj ili kut. Ali možeš pokušati stvoriti jedno 1d double polje od 2 elementa (1 za broj i 1 za kut) i da ti funkcija umjesto 2 rezultata vraća polje koje sadrži ta 2 rezultata. Kasnije u ispisu rezultata čitaš prvi član polja za recimo broj a drugi za kut. Samo se treba mal s poljima 'sprijateljiti' =) Deklaracija je ako se sjećam dobro: double polje[2]; //Stvara polje pod imenom polje sa 2 double elementa. Kasnije kad ih želiš pročitati samo napišeš polje[0] za prvi član i polje[1] za drugi član polja. |
![]() |
![]() |
![]() |
#5 |
only fool, not a horse
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,280
|
ako zelis bas sa return vratit onda ti treba nesto tipa ovog: Code:
struct complex { double x, y; } |
![]() |
![]() |
![]() |
#7 |
Premium
Datum registracije: Feb 2008
Lokacija: Mursa
Postovi: 87
|
Jep, bravo rodney! Može se i sa strukturama. Imaš tu svašta pa se igraj |
![]() |
![]() |
![]() |
#8 | |||||
/
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
|
Citiraj:
![]() Citiraj:
Citiraj:
Citiraj:
![]() Citiraj:
![]() a eto, skraćuje mi se ![]() si uključio math header? |
|||||
![]() |
![]() |
![]() |
#9 |
Premium
Datum registracije: Feb 2008
Lokacija: Mursa
Postovi: 87
|
|
![]() |
![]() |
![]() |
#10 |
/
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
|
sve to stoji, ali ja nemrem (ne kužim) odgovor na moje pitanje ![]() imam ja zapisano Deklaracijom funkcije obzanjujemo naziv funkcije, broj i tip parametara, te tip povratne vrijednosti. Deklaracija ne sadrži opis što i kako funkcija radi, ona samo daje prototip funkcije (eng. function prototype). Code:
<povratni_tip> ime_funkcije (<tip> arg1, <tip2> arg2); |
![]() |
![]() |
|
|
Oglas
|
|
![]() |
#11 | |
Guest
Datum registracije: Jun 2008
Lokacija: Splity
Postovi: 3,003
|
Citiraj:
<complex> |
|
![]() |
![]() |
![]() |
#12 | |
Premium
Datum registracije: Jun 2006
Lokacija: Zagreb
Postovi: 75
|
Citiraj:
![]() Dakle, ako se dobro sjećam, prototipove funkcije koristiš da bi dao kompajleru do znanja što da očekuje od funkcija (metoda), čije tijelo može biti bilo gdje "ispod" Main-a. Kompajler čita program liniju po liniju od vrha (početka) i mora znati kako funkcija izgleda prije nego je "sretne" u samom kodu. Znači, jednostavnije rečeno, ti najaviš da ćeš koristiti funkciju prototipom, u Main-u pozoveš tu funkciju, a kompajler zna da će ona biti realizirana u daljnjem programu (inače javi grešku). Korisno (zapravo i više nego korisno) kad imaš složenije programe. Zašto je kompajler tako "glup"? Klik Doduše, najbolje bi bilo kad bi radio sve u OO paradigmi, znači sve funkcije/metode "trpao" u klase i u Main ostavio samo pozive glavnih funkcija. C++ omogućava ovakav "hibridni" pristup, ali to je ![]() Ako želiš zbilja (is)koristiti C++, probaj sad napraviti taj isti program pomoću klasa, tako da u Main-u imaš samo nešto tipa (ovo je bez razmišljanja, samo radi ilustracije, dizajn klasa i metoda može naravno biti drukčiji, mogu i ne moraju biti statičke): Code:
int main() { Prikaz.Unesi("Unesi kompleksni broj oblika x + yi: ", x, y); Prikaz.Ispisi("Rezultat je: ", Pretvorba.PretvoriUPolarni(x,y)); return 0: } ![]() |
|
![]() |
![]() |
![]() |
#13 | |
Registered User
Datum registracije: Jun 2007
Lokacija: cro
Postovi: 42
|
Citiraj:
dakle da pojednostavimo,recimo imas zasebni modul s funkcijom za zbrajanje dva broja, dodajes dvije datoteke u projekt, 1.header - s prototipom funkcije ( ili deklaracija funkcije ) 2.cpp - s tijelom funkcije ( ili definicija funkcije ) e sad da bi glavni ( nazovimo ga main iako se nemora tako zvati ) modul mogao iskoristiti tu funkciju dovoljno je da ukljucis header te funkcije s #include "blabla.h" te kompajler i linker imaju sve potrebne informacije za izvodjenje programa... Nadalje bitna stvar kod pisanja headera je da se ukljuci tzv header guardiani, radi zastite od multideklaracija... recimo ovako to izgleda za header blabla.h #ifndef BLABLA // obicno se uzima naziv datoteke #define BLABLA int foo(int , int); #endif // BLABLA i tu sad mozes bez problema ukljuciti sve potrbene headere za tu funkciju,bez straha da ce doci do multideklaracije pojedinih headera... pozdrav |
|
![]() |
![]() |
![]() |
#14 |
only fool, not a horse
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,280
|
ako ces se upustat u ucenje klasa i struktura imas tu poprilicno lijepo poslozene materijale za pocetak rada u c++ -u: http://web.math.hr/nastava/rp1/slideovi.php (vjezbe te vise zanimaju :P) a ako ce te i dalje mozda kojim slucajem zanimat klase imas tu svega: http://web.math.hr/nastava/opepp/Slides/slides0.html#(1) http://web.math.hr/~vpetrice/OP/ a ako ce ti trebat rjesit zadacu, odi vamo: kljik ![]() |
![]() |
![]() |
|
|
Oglas
|
|
![]() |
|
|