PC Ekspert Forum

PC Ekspert Forum (https://forum.pcekspert.com/index.php)
-   Web dizajn, programiranje i ostalo (https://forum.pcekspert.com/forumdisplay.php?f=39)
-   -   Funkcije (C++) (https://forum.pcekspert.com/showthread.php?t=149178)

svebee 02.06.2009. 23:19

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
#include
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?

Hari 02.06.2009. 23:46

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ć.

svebee 02.06.2009. 23:56

Citiraj:

Autor Hari (Post 1353584)
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 (Post 1353584)
Koliko ja znam funkcije uvijek vraćaju samo jednu vrijednost.

aha, znači to nije izvedivo? :stoopid:

Citiraj:

Autor Hari (Post 1353584)
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;


Hari 03.06.2009. 00:03

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.

rodney 03.06.2009. 00:06

ako zelis bas sa return vratit onda ti treba nesto tipa ovog:
Code:

struct complex {
    double x, y;
}


boris87 03.06.2009. 00:11

a zašto želiš skratit program..ako radi!?


Šta je M_PI meni nece kompajl...prva sam g računarstva a nemam pojma..

Hari 03.06.2009. 00:11

Jep, bravo rodney! Može se i sa strukturama.
Imaš tu svašta pa se igraj

svebee 03.06.2009. 00:22

Citiraj:

Autor svebee (Post 1353595)
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 (Post 1353601)
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 (Post 1353601)
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 (Post 1353610)
Jep, bravo rodney! Može se i sa strukturama.
Imaš tu svašta pa se igraj

hvala, probat ću :)

Citiraj:

Autor rodney (Post 1353605)
ako zelis bas sa return vratit onda ti treba nesto tipa ovog:
Code:

struct complex {
    double x, y;
}


hmmm..imam materijala za studiranje :beer:

Citiraj:

Autor boris87 (Post 1353609)
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 (Post 1353609)
Šta je M_PI meni nece kompajl...prva sam g računarstva a nemam pojma..

si uključio math header?

Hari 03.06.2009. 00:32

Prototip funkcije

svebee 03.06.2009. 00:37

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:

ime_funkcije ( arg1, 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.

thopok 03.06.2009. 01:44

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…


marsal 03.06.2009. 04:19

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 :fiju: 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++ :)

Dancho 03.06.2009. 10:06

Citiraj:

Autor svebee (Post 1353595)
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

rodney 03.06.2009. 17:23

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:D


Sva vremena su GMT +2. Sada je 01:18.

Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 1999-2024 PC Ekspert - Sva prava pridržana ISSN 1334-2940
Ad Management by RedTyger