Gå til innhold

Problemer med objektorientert programmering, klasser, objekter, funksjoner.


Anbefalte innlegg

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
Videoannonse
Annonse

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

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 av zotbar1234
Lenke til kommentar

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

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

(...)
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
  • 4 uker senere...

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...