Forumi
Home Pravila i pomoć Članovi Kalendar Današnji postovi


Povratak   PC Ekspert Forum > Računala > Software > Web dizajn, programiranje i ostalo
Ime
Lozinka

Odgovori
 
Uređivanje
Staro 02.06.2009., 23:19   #1
svebee
/
 
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;
}
sad da objasnim što bi trebalo nekako napraviti, ili da dobim neku uputu. je li moguće funkciju broj i funkciju kut uobličiti u jednu jedinu funkciju broj_kut koja bi vraćala dvije vrijednosti - znači sam kut i broj ispred kuta? kako je to izvedivo?

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);
te

Code:
jot_2=atan(a2/a1)*180/M_PI;
te potom te dvije varijable ispisivao. znači mogao sam jednostavno pomoću ovog koda gore koji je pod komentarima to jednostanvo izvesti. ali kako sada to napraviti ako su rezultati "pohranjeni" u funkcijama? valjda će me neko skužit(i)

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.
svebee je offline   Reply With Quote
Staro 02.06.2009., 23:46   #2
Hari
Premium
Moj komp
 
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ć.
Hari je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 02.06.2009., 23:56   #3
svebee
/
 
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
Citiraj:
Autor Hari Pregled postova
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.
mene zanima zašto pisati prototip funkcije ako se cijela funkcija može jednostavno napisati ispred main i sve šljaka kako treba?

Citiraj:
Autor Hari Pregled postova
Koliko ja znam funkcije uvijek vraćaju samo jednu vrijednost.
aha, znači to nije izvedivo?

Citiraj:
Autor Hari Pregled postova
Malo podrobnije opiši zadatak pa ti možda mogu više pomoć.
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;
svebee je offline   Reply With Quote
Staro 03.06.2009., 00:03   #4
Hari
Premium
Moj komp
 
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.
Hari je offline   Reply With Quote
Staro 03.06.2009., 00:06   #5
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
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;
}
__________________
"I intend to live forever. So far, so good."

job security - example
rodney je offline   Reply With Quote
Staro 03.06.2009., 00:11   #6
boris87
Premium
Moj komp
 
boris87's Avatar
 
Datum registracije: Jan 2008
Lokacija: Žepče
Postovi: 407
a zašto želiš skratit program..ako radi!?


Šta je M_PI meni nece kompajl...prva sam g računarstva a nemam pojma..
boris87 je offline   Reply With Quote
Staro 03.06.2009., 00:11   #7
Hari
Premium
Moj komp
 
Datum registracije: Feb 2008
Lokacija: Mursa
Postovi: 87
Jep, bravo rodney! Može se i sa strukturama.
Imaš tu svašta pa se igraj
Hari je offline   Reply With Quote
Staro 03.06.2009., 00:22   #8
svebee
/
 
Datum registracije: Oct 2006
Lokacija: /
Postovi: 2,053
Citiraj:
Autor svebee Pregled postova
mene zanima zašto pisati prototip funkcije ako se cijela funkcija može jednostavno napisati ispred main i sve šljaka kako treba?
^^ i dalje stoji

Citiraj:
Autor Hari Pregled postova
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.
da, zato me i zanimalo kako to riješiti.

Citiraj:
Autor Hari Pregled postova
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.
Citiraj:
Autor Hari Pregled postova
Jep, bravo rodney! Može se i sa strukturama.
Imaš tu svašta pa se igraj
hvala, probat ću

Citiraj:
Autor rodney Pregled postova
ako zelis bas sa return vratit onda ti treba nesto tipa ovog:
Code:
struct complex {
    double x, y;
}
hmmm..imam materijala za studiranje

Citiraj:
Autor boris87 Pregled postova
a zašto želiš skratit program..ako radi!?
a eto, skraćuje mi se želim isprobati nove mogućnosti, nije da mi je od presudne važnosti da se program izvodi par mikro-sekundi brže.

Citiraj:
Autor boris87 Pregled postova
Šta je M_PI meni nece kompajl...prva sam g računarstva a nemam pojma..
si uključio math header?
svebee je offline   Reply With Quote
Staro 03.06.2009., 00:32   #9
Hari
Premium
Moj komp
 
Datum registracije: Feb 2008
Lokacija: Mursa
Postovi: 87
Hari je offline   Reply With Quote
Staro 03.06.2009., 00:37   #10
svebee
/
 
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);
Povratni tip određuje kakvog će tipa biti predznak kojeg će funkcija vraćati pozivatelju kao rezultat svog izvođenja. Argumenti unutar zagrada iza imena funkcije su podaci koji se predaju funkciji prilikom njena poziva. Broj i tip argumenata može biti proizvoljan pa postoje i funkcije bez argumenata.
svebee je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 03.06.2009., 01:44   #11
thopok
Guest
 
Datum registracije: Jun 2008
Lokacija: Splity
Postovi: 3,003
Citiraj:
zašto pisati prototip funkcije ako se cijela funkcija može jednostavno napisati ispred main i sve šljaka kako treba?
To je ispravniji način. Iako kod ovako jednostavnih programa nije ni bitno…

<complex>
thopok je offline   Reply With Quote
Staro 03.06.2009., 04:19   #12
marsal
Premium
 
Datum registracije: Jun 2006
Lokacija: Zagreb
Postovi: 75
Citiraj:
Autor svebee
mene zanima zašto pisati prototip funkcije ako se cijela funkcija može jednostavno napisati ispred main i sve šljaka kako treba?
Nisam čitao cijeli thread pa ako otkrivam toplu vodu sori

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 Zapravo, kad malo bolje pogledam, tvoj program je isključivo proceduralan. Sve je iz C-a, osim ispisa.

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:
}
Probaj proširiti klase dodatnim članovima. Napraviti klasu (ili strukturu) kompleksnih brojeva koja će sadržavati i operacije nad njima. Malo se igraj s nasljeđivanjem, uglavnom, ako te zanima programiranje, C++ je dobra stvar za (na)učiti. Ja se držim C#, jer nemam više toliko živaca za C++
marsal je offline   Reply With Quote
Staro 03.06.2009., 10:06   #13
Dancho
Registered User
 
Datum registracije: Jun 2007
Lokacija: cro
Postovi: 42
Citiraj:
Autor svebee Pregled postova
mene zanima zašto pisati prototip funkcije ako se cijela funkcija može jednostavno napisati ispred main i sve šljaka kako treba?
Kod slozenijih programa pojedine funkcije se pisu u zasebnim modulima cisto radi olaksavanja posla programeru ( debug , odrzavanje koda , patchiranje itd ),
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
Dancho je offline   Reply With Quote
Staro 03.06.2009., 17:23   #14
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
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
__________________
"I intend to live forever. So far, so good."

job security - example
rodney je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Odgovori



Pravila postanja
Vi ne možete otvarati nove teme
Vi ne možete pisati odgovore
Vi ne možete uploadati priloge
Vi ne možete uređivati svoje poruke

BB code je Uključeno
Smajlići su Uključeno
[IMG] kod je Uključeno
HTML je Isključeno

Idi na