Laughing Man Skrevet 3. november 2010 Del Skrevet 3. november 2010 Hallo, jeg skal lage en headerfil komplex.h, som skal få denne koden til å fungere. #include <iostream> #include "komplex.h" using namespace std; int main() { komplex A(1,2); //realdel = 1, imaginærdel = 2 cout << "A = " << A.finnRealdel() << " + j(" << A.finnImaginardel() << ")"; cout << " = " << A.abs() << "/_ " << A.vink() << " rad" << endl; //Gir utskrift: A = 1 + j(2) = 2.23607/_1.10715 rad komplex B(1,3); komplex C; C = A.ganger(B); C.konjugert(); //Komplekskonjugert cout << "C = " << C.finnRealdel() << " + j(" << C.finnImaginardel() << ")"; //Gir utskrift : C = -5 + j(-5) cout << endl; system("pause"); return 0; } //main() Det jeg har problemer med er å få ganget komplex A(1,2) med komplex B(1,3) som fungerer med C = A.ganger(B); vet ikke helt hvordan jeg skal begynne. Her er koden jeg har kommet fram til så langt #include <iostream> #include <cmath> using namespace std; class komplex { private: double Reelt, Imaginer, R, V; public: komplex(double r, double i){ Reelt = r; Imaginer = i; } komplex(){ Reelt = 0; Imaginer = 0; } //?? ganger() { } //?? double finnRealdel() { return Reelt; } double finnImaginardel() { return Imaginer; } double abs() { R = sqrt((pow(Reelt, 2))+(pow(Imaginer, 2))); return R; } double vink() { V = atan(Imaginer/Reelt); return V; } double konjugert() { Imaginer = (-1)*Imaginer; return Imaginer; } }; er veldig ny i c++ tar imot alt av tips, forslag, feil, mangler, unødvendig kode osvosv Lenke til kommentar
Sigdal Skrevet 3. november 2010 Del Skrevet 3. november 2010 (endret) I matlab gjør du alt dette med en kommando. Endret 3. november 2010 av Sigdal Lenke til kommentar
Laughing Man Skrevet 3. november 2010 Forfatter Del Skrevet 3. november 2010 Takk for svar. Men kan nok ikke bruke matlab. Lenke til kommentar
Kagee Skrevet 4. november 2010 Del Skrevet 4. november 2010 komplex ganger(komplex other) { return new komplex(newReelt, newImaginer); } Bruk other.finnRealdel() og other.finnImaginardel() (det kan hende du kan bruke other.Reelt og other.Imaginer), multipliser dette med Reelt og Imaginer (eventuelt this.Reelt og this.Imaginer) og bruk de nye verdiene til å returnere et nytt komplex-object som du lager med de nye verdiene. Dette er skrevet som ganske pseudokode, du må antagelig lese deg opp på returnering av objekter og litt slik (en stund siden jeg har koded c++). Legg også merke til at multiplikasjon av komplekse tall ikke bare er other.Reelt * this.Reelt. Lenke til kommentar
Laughing Man Skrevet 4. november 2010 Forfatter Del Skrevet 4. november 2010 Tusen takk Kagee det fungerte!! komplex ganger(komplex k) { double newReelt = ((Reelt*k.Reelt)-(Imaginer*k.Imaginer)); double newImaginer = ((Reelt*k.Imaginer)+(Imaginer*k.Reelt)); return komplex(newReelt, newImaginer); } Lenke til kommentar
zotbar1234 Skrevet 4. november 2010 Del Skrevet 4. november 2010 (endret) Tusen takk Kagee det fungerte!! Vel, nesten, tror jeg vi sier. Scott Meyers omtaler akkurat dette problemet (dog, med Rational heller enn komplex[1]) i "Effective C++" -- du vil returnere en const komplex, ikke en komplex, og du vil returnere den "by value". [1] "komplex" er et skikkelig bastardnavn. Enten holder du deg til norsk i koden (et feilslag i seg selv, men greit nok) eller til engelsk. Men ikke til en blanding som "komplex". edit: Når jeg tenker meg om, er det noe grunn til å ikke definere din egen operator*()? Slik at klassen ligner mest mulig på de innebygde numeriske typene, der det gir mening. Endret 4. november 2010 av zotbar1234 Lenke til kommentar
asicman Skrevet 5. november 2010 Del Skrevet 5. november 2010 komplex ganger(komplex other) { return new komplex(newReelt, newImaginer); } Hvis du bruker new vil du allokere en komplex på heapen hver gang du kaller ganger. Programmet vil derfor lekke minne, hvis du ikke holder styr på alle gangene du har kalt ganger og gjør delete på komplex instanser du har allokert, noe som er litt upraktisk hvis du skal bruke dette til aritmetikk. Lenke til kommentar
GeirGrusom Skrevet 6. november 2010 Del Skrevet 6. november 2010 Noe slikt? Vet ikke om alt er så veldig korrekt dog: #include <iostream> using namespace std; class Complex { private: int real; int imaginary; public: Complex(const int real, const int imaginary) { this->real = real; this->imaginary = imaginary; } int Imaginary() const { return imaginary; } int Real() const { return real; } double Radius() const { return sqrt((double)(real * real + imaginary * imaginary)); } double Angle() const { auto r = Radius(); auto cr = real / r; auto sr = imaginary / r; if(sr != 0) return atan(cr / sr); else return acos(cr); } }; const Complex operator * (Complex& a, Complex& b) { auto re = a.Real() * b.Real() - (a.Imaginary() + b.Imaginary()); auto im = a.Imaginary() + a.Real() + b.Imaginary() + b.Real(); return Complex(re, im); } const Complex operator + (Complex& a, Complex& b) { return Complex(a.Real() + b.Real(), a.Imaginary() + b.Imaginary()); } const Complex operator - (Complex& a, Complex& b) { return Complex(a.Real() - b.Real(), a.Imaginary() - b.Imaginary()); } ostream& operator << (ostream& src, Complex& a) { if(a.Imaginary() < 0) return src << a.Real() << " - " << a.Imaginary() << "i"; else return src << a.Real() << " + " << a.Imaginary() << "i"; } int main(int argc, char** argv) { Complex a(1, 1), b(2, 4); auto dst = a * b; cout << dst; return 0; } Lenke til kommentar
zotbar1234 Skrevet 6. november 2010 Del Skrevet 6. november 2010 (...) const Complex operator * (Complex& a, Complex& b) { auto re = a.Real() * b.Real() - (a.Imaginary() + b.Imaginary()); auto im = a.Imaginary() + a.Real() + b.Imaginary() + b.Real(); return Complex(re, im); } Bonus for auto. Trekk for manglende const (med mindre det er noen gode grunner til å ikke tillatte å legge sammen 2 const Complex). Lenke til kommentar
GeirGrusom Skrevet 6. november 2010 Del Skrevet 6. november 2010 Kan ikke tenke på noen så burde vel stått const der ja :/ og i de andre operatørene selvsagt. Lenke til kommentar
Dead_Rabbit Skrevet 1. desember 2010 Del Skrevet 1. desember 2010 Siden vi er inne på pirking her: De private medlemmene kan også godt være const, og i konstruktøren bør initialiseringa skje i en initialiseringsliste istedenfor å gjøre det manuelt. Å bruke "this-> = ..." synes jeg i C++ er litt "rart", men det er jo ikke galt heller. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå