Avatar billede downunder Nybegynder
18. marts 2006 - 13:41 Der er 53 kommentarer

hjælp hurtig

Jer ved at lave et program som skal arbejde med brøker og jeg skal lave nogle friends til min class men kan ikke få det til at virke. Jeg smider lige koden op her.


Header filen.
class Rational
{
friend Rational &operator+ (int &, Rational &);   
public:
   
    Rational(int = 0, int = 1);   
    void red(void);
    int getOver(void);
    int getNed(void);
    void add(Rational, Rational);
    void sub(Rational, Rational);
    void mul(Rational, Rational);
    void div(Rational, Rational);

private:
    int over,ned;
};

Opsætningsfilen.
#include <iostream>
using namespace std;
#include "brok.h"

Rational::Rational(int o, int n)
{   
    if (n == 1)
    {
        n = 0;
    }
    over = o;
    ned = n;
}
int Rational::getNed()
{
    return ned;
}
int Rational::getOver()
{
    return over;
}
void Rational::red()
{
    int taeller;
    for (taeller = 2; taeller <= over; taeller++)
    {           
        while (over % taeller == 0 && ned % taeller == 0)
        {
        over = over / taeller;
        ned = ned / taeller;
        }   
    }   
}
void Rational::add(Rational brok1, Rational brok2)
{   
    ned = (brok1.getNed() * brok2.getNed());
    over = (brok1.getOver() * brok2.getNed()) + (brok2.getOver()* brok1.getNed());
    red();   
}
void Rational::sub(Rational brok1, Rational brok2)
{   
    ned = (brok1.getNed() * brok2.getNed());
    over = (brok1.getOver() * brok2.getNed()) - (brok2.getOver()* brok1.getNed());
    red();   
}
void Rational::mul(Rational brok1, Rational brok2)
{
    ned = brok1.getNed() * brok2.getNed();
    over = brok1.getOver() * brok2.getOver();
    red();
}
void Rational::div(Rational brok1, Rational brok2)
{   
    ned = (brok1.getNed() * brok2.getOver());
    over = (brok1.getOver() * brok2.getNed());
    red();   
}

//nyt

Rational &operator+(int &left, Rational &right)
{
    Rational tmp;

    tmp.over = (left * right.ned) + right.over;
    tmp.ned = right.ned;

    tmp.red();

    return tmp;
}

Main filen.
#include <iostream>
using namespace std;
#include "Brok.h"

void main(void)
{
    int o1,n1,o2,n2;
    cout << "Indtast forste broks taellerens : ";
    cin >> o1;
    cout << "Indtast forste Naevrens vaerdi : ";
    cin >> n1;
    cout << "Indtast forste broks taellerens : ";
    cin >> o2;
    cout << "Indtast forste Naevrens vaerdi : ";
    cin >> n2;
   
    Rational brok1(o1,n1);
    Rational brok2(o2,n2);
    Rational brok3;

    brok1.red();
    cout << "brok1 = "<< brok1.getOver() << "/" << brok1.getNed() <<endl;
    brok2.red();
    cout << "brok2 = "<< brok2.getOver() << "/" << brok2.getNed() <<endl;
    brok3.add(brok1,brok2);
    cout << "ADD = "<< brok3.getOver() << "/" << brok3.getNed() <<endl;
    brok3.sub(brok1,brok2);
    cout << "SUB = "<< brok3.getOver() << "/" << brok3.getNed() <<endl;
    brok3.mul(brok1,brok2);
    cout << "Mul = "<< brok3.getOver() << "/" << brok3.getNed() <<endl;
    brok3.div(brok1,brok2);
    cout << "Mul = "<< brok3.getOver() << "/" << brok3.getNed() <<endl;

    // nyt

    cout << endl << "brok1+2 = " << brok1+2 << endl;
}

Det er i den sidste linje som giver fejl...
Avatar billede arne_v Ekspert
18. marts 2006 - 14:58 #1
hvilken fejl ?
Avatar billede bertelbrander Novice
18. marts 2006 - 16:41 #2
Jeg har besvaret spørgsmålet i et andet forum.

+ operatoren skal laves om til:
friend Rational operator+ (int , Rational &);

Der mangler en ostream << for rational

Og man er nødt til at lave en midlertidig variabel for brok1+2
Man kunne løse det ved at lave en int constructor til Rational.

main skal returnere en int.
Avatar billede downunder Nybegynder
18. marts 2006 - 17:24 #3
Ja tak så kan jeg godt bruge brok3 af type Rational
Hvad skal man have ostream til???
Avatar billede fiil123 Nybegynder
18. marts 2006 - 18:05 #4
Du bliver nødt til at overloade din operator << (ostream) for at kunne anvende denne på Rational direkte men det synes jeg da heller ikke du har gjort nogen steder...
Avatar billede bertelbrander Novice
18. marts 2006 - 18:27 #5
cout er en ostream, for at kunne streame (<< ) en Rational skal compileren vide hvordan man udskriver en Rational, derfor en ostream << operator.
Avatar billede fiil123 Nybegynder
18. marts 2006 - 18:30 #6
Hvor gør han det i sin kode?
Avatar billede downunder Nybegynder
18. marts 2006 - 18:30 #7
Kan i komme med et e.x på hvordan man laver en ostream og forklare lidt måske.?
Avatar billede bertelbrander Novice
18. marts 2006 - 18:31 #8
Jeg skriver netop at der mangler en ostream << operator.
I det andet forum har jeg postet en compilerbar kode med denne operator.
Avatar billede downunder Nybegynder
18. marts 2006 - 18:32 #9
mange tak
Avatar billede fiil123 Nybegynder
18. marts 2006 - 18:32 #10
friend ostream & operator<<( ostream& , const KlasseNavn & );


ostream & operator<<( ostream &coutRef , const KlasseNavn &KlasseNavnObjRef )
{
coutRef << "(" << KlasseNavn.x << ", " << KlasseNavn.y << ")";
      return coutRef;
}

f.eks
Avatar billede downunder Nybegynder
18. marts 2006 - 18:35 #11
hvad skal x og y
Avatar billede downunder Nybegynder
18. marts 2006 - 18:39 #12
hvad gør const KlasseNavn.
hvad er klasseNavnObjRef til i dette her tilfælde.
hvad er x og y til.
Avatar billede bertelbrander Novice
18. marts 2006 - 20:13 #13
x og y er vist mest et eksempel, i dit tilfælde ville det være over og ned.

KlasseNavn er Rational i dit tilfælde.

KlasseNavnObjRef er blot navnet på parametren.
Avatar billede downunder Nybegynder
18. marts 2006 - 20:35 #14
og hvad skal man bruge parametren til
Avatar billede bertelbrander Novice
18. marts 2006 - 20:41 #15
Denne udgave af ostream << operatoren er ikke en member af class'en, så parameteren er det object der skal udskrives.
Avatar billede fiil123 Nybegynder
18. marts 2006 - 20:41 #16
I dit tilfælde vi det se sådan her ud:

ostream & operator<<( ostream &coutRef , const Rational &RationalObjRef )
{
coutRef << "ned: " << getNed() << " over: " << getOver()<< endl;
  return coutRef;
}
f.eks
Avatar billede fiil123 Nybegynder
18. marts 2006 - 20:44 #17
Hov der var sq da en lille fejl i det der:

ostream & operator<<( ostream &coutRef , const Rational &RationalObjRef )
{
coutRef << "ned: " << RationalObjRef.getNed() << " over: " << RationalObjRef.getOver()<< endl;
  return coutRef;
}

I argument nummer 2 i din operator overloading modtager du en referance til noget af typen Rational som du kalde RationalObjRef. Det vil sige at det er RationalObjRef objektet du arbejder direkte på i din funktion!
Avatar billede fiil123 Nybegynder
18. marts 2006 - 20:47 #18
Du kan også vælge at overloade >> operatoren så at man f.eks kan gøre sådanne:

cout << "Indtast din brøk, brøkken skal indtastet: nævner tæller "
cin >> RationalObj;
Avatar billede fiil123 Nybegynder
18. marts 2006 - 20:48 #19
Noget helt andet:
æ = \x91        Æ = \x92
ø = \x9B        Ø = \x9D
å = \x86        Å = \x8F
Avatar billede downunder Nybegynder
18. marts 2006 - 20:49 #20
?
Avatar billede fiil123 Nybegynder
18. marts 2006 - 20:50 #21
"koderne" for de danske karakterer hvis du ik lige kendte dem...
Avatar billede downunder Nybegynder
18. marts 2006 - 20:55 #22
okay dem kan jeg ikke bruge til så meget??
Avatar billede fiil123 Nybegynder
18. marts 2006 - 21:00 #23
Bare i dine cout til brugeren
Avatar billede fiil123 Nybegynder
18. marts 2006 - 21:01 #24
Men jeg poster lige noget kode om lidt du nok vil kunne få noget ud af
Avatar billede downunder Nybegynder
18. marts 2006 - 21:01 #25
okay
Avatar billede fiil123 Nybegynder
18. marts 2006 - 21:16 #26
Header fil RationalHead.h:
#pragma once
#include <iostream>
using namespace std;


class Rational
{
   
friend ostream & operator<<( ostream& , Rational & );
friend istream & operator>>( istream& , Rational & );

public:
 
    Rational(int = 0, int = 1); 
    void red(void);
    int getOver(void);
    int getNed(void);
    void add(Rational, Rational);
    void sub(Rational, Rational);
    void mul(Rational, Rational);
    void div(Rational, Rational);
    Rational operator+(const Rational&);

private:
    int over,ned;
};




-----------------------------------------------------------------------------
Class fil RationalClass.cpp:

#include "RationalHead.h"


ostream & operator<<( ostream &coutRef , Rational &RationalObjRef )
{
    RationalObjRef.red();
    coutRef << "Br\x9Bken: " << RationalObjRef.over << " / " << RationalObjRef.ned << endl;
      return coutRef;
}


istream & operator>>( istream &cinRef, Rational & RationalObjRef )
{
    int nedTemp,overTemp;

    cin >> nedTemp >> overTemp;

    RationalObjRef.ned = nedTemp;
    RationalObjRef.over = overTemp;

    return cinRef;
}

Rational::Rational(int o, int n)

    if (n == 1)
    {
        n = 0;
    }
    over = o;
    ned = n;
}
int Rational::getNed()
{
    return ned;
}
int Rational::getOver()
{
    return over;
}
void Rational::red()
{
    int taeller;
    for (taeller = 2; taeller <= over; taeller++)
    {         
        while (over % taeller == 0 && ned % taeller == 0)
        {
        over = over / taeller;
        ned = ned / taeller;
        } 
    } 
}
void Rational::add(Rational brok1, Rational brok2)

    ned = (brok1.getNed() * brok2.getNed());
    over = (brok1.getOver() * brok2.getNed()) + (brok2.getOver()* brok1.getNed());
    red(); 
}
void Rational::sub(Rational brok1, Rational brok2)

    ned = (brok1.getNed() * brok2.getNed());
    over = (brok1.getOver() * brok2.getNed()) - (brok2.getOver()* brok1.getNed());
    red(); 
}
void Rational::mul(Rational brok1, Rational brok2)
{
    ned = brok1.getNed() * brok2.getNed();
    over = brok1.getOver() * brok2.getOver();
    red();
}
void Rational::div(Rational brok1, Rational brok2)

    ned = (brok1.getNed() * brok2.getOver());
    over = (brok1.getOver() * brok2.getNed());
    red(); 
}


Rational Rational::operator+(const Rational &Pref)
{
    Rational temp;

    temp.ned = ned + Pref.ned;
    temp.over = over + Pref.over;

    temp.red();
    return temp;

}


-----------------------------------------------------------------------------
test fil test.cpp:

#include "RationalHead.h"

void main(void)
{
   
    Rational brok1;
    Rational brok2;
    Rational brok3;

    cin >> brok1;
 
    cout << brok1;
}
Avatar billede downunder Nybegynder
18. marts 2006 - 21:50 #27
istream & operator>>( istream &cinRef, Rational & RationalObjRef )
{
    int nedTemp,overTemp;

    cin >> nedTemp >> overTemp;

    RationalObjRef.ned = nedTemp;
    RationalObjRef.over = overTemp;

    return cinRef;
}
man kan ikke ikke tag de her privat data
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:09 #28
Jo det kan du da det er en friend funktion... Kommer den med den fejl?
Avatar billede downunder Nybegynder
18. marts 2006 - 22:09 #29
ja
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:11 #30
Hvordan ser din prototype ud?? og hvor erklære du den?
Avatar billede downunder Nybegynder
18. marts 2006 - 22:13 #31
#include <iostream>
using namespace std;

class Rational
{
    friend Rational &operator+( Rational &, int &);
    friend Rational &operator-( Rational &, int &);
    friend Rational &operator*( Rational &, int &);
    friend Rational &operator/(Rational &, int &);
    friend Rational &operator==(Rational &, int &);
    friend Rational &operator!=(Rational &, int &);
    friend Rational &operator>(Rational &, int &);
    friend Rational &operator<(Rational &, int &);
    friend Rational &operator>=(Rational &, int &);
    friend Rational &operator<=(Rational &, int &);
    friend ostream &operator<<( ostream &, const Rational &);
    friend istream &operator>>(istream &, const Rational &);

public:   
    Rational(int = 0, int = 1);   
    void red(void);
    int getOver(void);
    int getNed(void);
    void add(Rational, Rational);
    void sub(Rational, Rational);
    void mul(Rational, Rational);
    void div(Rational, Rational);

private:
    int over,ned;
};
Avatar billede downunder Nybegynder
18. marts 2006 - 22:13 #32
#include <iostream>
using namespace std;
#include "brok.h"

Rational::Rational(int o, int n)
{   
    if (n == 1)
    {
        n = 0;
    }
    over = o;
    ned = n;
}
int Rational::getNed()
{
    return ned;
}
int Rational::getOver()
{
    return over;
}
void Rational::red()
{
    int taeller;
    for (taeller = 2; taeller <= over; taeller++)
    {           
        while (over % taeller == 0 && ned % taeller == 0)
        {
        over = over / taeller;
        ned = ned / taeller;
        }   
    }   
}
void Rational::add(Rational brok1, Rational brok2)
{   
    ned = (brok1.getNed() * brok2.getNed());
    over = (brok1.getOver() * brok2.getNed()) + (brok2.getOver()* brok1.getNed());
    red();   
}
void Rational::sub(Rational brok1, Rational brok2)
{   
    ned = (brok1.getNed() * brok2.getNed());
    over = (brok1.getOver() * brok2.getNed()) - (brok2.getOver()* brok1.getNed());
    red();   
}
void Rational::mul(Rational brok1, Rational brok2)
{
    ned = brok1.getNed() * brok2.getNed();
    over = brok1.getOver() * brok2.getOver();
    red();
}
void Rational::div(Rational brok1, Rational brok2)
{   
    ned = (brok1.getNed() * brok2.getOver());
    over = (brok1.getOver() * brok2.getNed());
    red();   
}
Rational &operator+(Rational &left, int &right)
{
    static Rational tmp;
    tmp.over = (right * left.ned) + left.over;
    tmp.ned = left.ned;
    tmp.red();
    return tmp;
}
Rational &operator-(Rational &left, int &right)
{
    static Rational tmp;
    return tmp;
}
Rational &operator*(Rational &left, int &right)
{    static Rational tmp;
    return tmp;
}

Rational &operator/(Rational &left, int &right)
{    static Rational tmp;
    return tmp;}

Rational &operator==(Rational &left, int &right)
{    static Rational tmp;
    return tmp;
}
Rational &operator!=(Rational &left, int &right)
{    static Rational tmp;
    return tmp;}

Rational &operator>(Rational &left, int &right)
{    static Rational tmp;
    return tmp;}
Rational &operator<(Rational &left, int &right)
{    static Rational tmp;
    return tmp;}
Rational &operator>=(Rational &left, int &right)
{    static Rational tmp;
    return tmp;
}
Rational &operator<=(Rational &left, int &right)
{    static Rational tmp;
    return tmp;}

ostream &operator<<(ostream &output, const Rational &udskriv)
{
    output << "Br\x9Bken:" << udskriv.over << "/" << udskriv.ned;
    return output;
}





istream &operator>>(istream &input, Rational & indskrivning)
{
    int nedTemp, overTemp;
    cin >> nedTemp >> overTemp;
    //indskrivning.ned = nedTemp;
    //indskrivning.over = overTemp;
    return input;
}
Avatar billede downunder Nybegynder
18. marts 2006 - 22:13 #33
#include <iostream>
using namespace std;
#include "Brok.h"

void main(void)
{
    int o1,n1,o2,n2;
    cout << "Indtast forste broks taellerens : ";
    cin >> o1;
    cout << "Indtast forste Naevrens vaerdi : ";
    cin >> n1;
    cout << "Indtast forste broks taellerens : ";
    cin >> o2;
    cout << "Indtast forste Naevrens vaerdi : ";
    cin >> n2;
   
    Rational brok1(o1,n1);
    Rational brok2(o2,n2);
    Rational brok3;

    brok1.red();
    cout << "brok1 = "<< brok1.getOver() << "/" << brok1.getNed() <<endl;
    brok2.red();
    cout << "brok2 = "<< brok2.getOver() << "/" << brok2.getNed() <<endl;
    brok3.add(brok1,brok2);
    cout << "ADD = "<< brok3.getOver() << "/" << brok3.getNed() <<endl;
    brok3.sub(brok1,brok2);
    cout << "SUB = "<< brok3.getOver() << "/" << brok3.getNed() <<endl;
    brok3.mul(brok1,brok2);
    cout << "Mul = "<< brok3.getOver() << "/" << brok3.getNed() <<endl;
    brok3.div(brok1,brok2);
    cout << "Mul = "<< brok3.getOver() << "/" << brok3.getNed() <<endl;

    // nyt
   
    cout << "____________------NEW------___________";
    int test = 2;
    brok3 = brok1 + test;
    cout << brok3 << endl;

    int a = 2, b= 3;
    int i = (a > b) ? 0 : 1;
    cout << i;
    cout << "Br\x9Bken:";

}
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:15 #34
Oki nu er du da blevet helt crasy... men de fleste af dine overloading skal ikke erklæres som en friend funktion!
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:16 #35
Hvor får du din syntaks fra??
Avatar billede downunder Nybegynder
18. marts 2006 - 22:16 #36
Jeg er ved at lave en opgave hvor man skal gøre sådan
Avatar billede downunder Nybegynder
18. marts 2006 - 22:17 #37
syntaks
Avatar billede downunder Nybegynder
18. marts 2006 - 22:18 #38
jeg er hvis ved at være lidt træt af det her??
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:20 #39
Hehe kan jeg godt forstå... Men gør lidt klart hvad det er du vil så jeg ved hvad jeg skal svare på. Plus du kaster dig ud i meget når du laver så mange funktioner og vil have dem til at virke på en gang!!!
Avatar billede downunder Nybegynder
18. marts 2006 - 22:21 #40
jeg kan ikke få min istream til at virke, den laver fejl på at jeg kan ikke hente data fra privat i classen..
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:24 #41
Det er fordi du erklære den const!!
friend istream &operator>>(istream &, const Rational &);
dette gør jo at du ikke kan ændre i dens medlemsdata!!! Du ved godt betydningen af keyword'et const er ikke?? det skal være:
friend istream &operator>>(istream &, Rational &);
Avatar billede downunder Nybegynder
18. marts 2006 - 22:25 #42
ja sidder bare og sover for hårdt
det er klart når noget er const så kan man ikke ændre i den
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:29 #43
Jeps... standart bong fejl!! Virkede det så?
Avatar billede downunder Nybegynder
18. marts 2006 - 22:30 #44
ja total
hvad laver du dagligt.
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:35 #45
Jeg læser til IKT ingeniør på Ingeniørhøjskolen i århus
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:37 #46
Jeg læser til IKT ingeniør på Ingeniørhøjskolen i århus
Avatar billede downunder Nybegynder
18. marts 2006 - 22:37 #47
okay jeg er ved at læse elektronik ingeniør og så skal jeg have sådan noget her.
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:38 #48
Hvor læser du??
Avatar billede downunder Nybegynder
18. marts 2006 - 22:39 #49
sønderborg sdu...
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:40 #50
Oki på IHA starter ELT og IKT sammen 1. semester så har også haft lidt EL hvor langt er du?
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:41 #51
For synes da at det er rimeligt oki PRG at have som ELT ingeniør
Avatar billede downunder Nybegynder
18. marts 2006 - 22:43 #52
jeg synes det er til grin, hvad kan en mikro controller lige klare
Har du ikke en msn adr eller noget. det er træls det her
Avatar billede fiil123 Nybegynder
18. marts 2006 - 22:45 #53
skriv en mail til fiil @ dwankers . dk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester