Klasa Zespolone - podstawy

Klasa Zespolone - podstawy
futurity92
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

Witam.
Mam takie sobie zadanko:
Liczby zespolone składają się z części rezczywistej i urojonej opisanych przez zmienne typu double. Napisz klasę cplx implementujaca:
-prywatne pola obu liczb, dwuparametrowy konstruktor, funkcję dodawania(add(cplx)), funkcję odejmowania (sub(cplx*)), mnożenia (mul(Cplx&)), funkcję zwiększającą część rzeczywistą o jeden (inc()), funkcję show wyświetlającą daną liczbę zespoloną w formacie 4 + 4i. Działanie zdefiniowanej klasy przedstaw na przykładach przynajmniej trzech różnych liczb.

Przeciąż operator ++ w ciele klasy Cplx tak, aby wykonanie operacji obj++; skutkowało zwiększeniem części rzeczywistej o jeden.

Przeciąż operator + w ciele klasy Cplx tak, aby wykonanie obj1+obj2; zsymowało liczby zespolone obj1 i obj2

Przeciąż operator - poza ciałem klasy Cplx tak, aby wykonanie operacji obj1-obj2 odjęło liczby

Przeciąż operator < tak, aby wyświetlał liczbę zespoloną w formacie 4 + 5i. Wyrzystaj objekt klasy ostream.

Przygotuj klasę Osoba z prywatnymi polami char* imie, char* nazwisko, Osoba** dzieci i int wiek. Zadbaj, aby def tej klasy była całkowicie samowystarczalna i hermetyczna. Przedefiniuj wszystkie domyślnie tworzone elementy tej klasy. Zaimplementuj operacje: -zwiększenia wieku o 1 przez operator ++, -zmiany, dodania lub odsunięcia dowolnej litery przez operatory - i +.

I oto kod który mam na to zadanie. Jednak nie działa od do końca dobrze gdyż bo ponieważ przy " void opertator+(){..." wyświetla mi błąd "variable or field 'opertator' declared void" i nie mam pomysł o co może chodzić:

A oto kod na to zadanie:

Kopiuj
 
#include <cstdlib>
#include <iostream>
using namespace std;

class Cplx{
    double rz;
    double u;
    public:
    Cplx(double rz, double u){
        this->rz=rz;
        this->u=u;
    }
    void add(Cplx l){
        rz+=l.rz;
        u+=l.u;
    }
    void sub(Cplx* l){
        rz-=l->rz;
        u-=l->u;
    }
    void mul(Cplx& l){
        rz=(rz*l.rz)-(u-l.u);
        u=(u*l.rz)+(rz+l.u);
    }
    void inc(){
        rz+=1;
    }
    void show(){
        if(rz!=0);
        cout<<rz;
        if(u>0)
        cout<<"+"<<u<<"i"<<endl;
        else if(u<0)
        cout<<u<<"i"<<endl;
          }
        //ZAD 2
    void operator ++(){
        rz++;
    }
        //ZAD 3
    Cplx operator+ (Cplx& l){
        return Cplx((rz+l.rz),(u+l.u));  
    }
    friend Cplx operator-(Cplx& l, Cplx& l1);
    friend ostream& operator<<(ostream& str, Cplx& l);
};
    Cplx operator-(Cplx& l, Cplx& l1){
         return Cplx((l.rz-l1.rz),(l.u-l1.u));
    }
    ostream& operator<<(ostream& str, Cplx& l){
        if(l.rz!=0);
            str<<l.rz;
        if(l.u>0)
            str<<"+"<<l.u<<"i"<<endl;
        else if(l.u<0)
            str<<l.u<<"i"<<endl;
    return str;
    }
     
class Osoba{
    char* imie;
    char* nazwisko;
    int wiek;
    Osoba* dzieci;
public:
    Osoba(){
    	char input[100];
        cout << "podaj imie: ";
        cin >> input;
        imie = new char[ strlen(input) + 1];
        memcpy( imie, input, strlen(input) + 1);
        cout << "podaj nazwisko: ";
        cin >> input;
    	nazwisko = new char[ strlen(input) + 1];
        memcpy( nazwisko, input, strlen(input) + 1);
    	cout << "podaj wiek: ";
        cin >> wiek;
    }
    Osoba(char* imie, char* nazwisko, int wiek, Osoba* dzieci){
        this->imie = new char[ strlen(imie) + 1];
        memcpy( this->imie, imie, strlen(imie) + 1);
        this->nazwisko = new char[ strlen(nazwisko) + 1];
        memcpy( this->nazwisko, nazwisko, strlen(nazwisko) + 1);
    	this->wiek=wiek;
        }
    Osoba(Osoba &o){
        this->imie = new char[ strlen(o.imie) + 1];
        memcpy( this->imie, o.imie, strlen(o.imie) + 1);
        this->nazwisko = new char[ strlen(o.nazwisko) + 1];
        memcpy( this->nazwisko, o.nazwisko, strlen(o.nazwisko) + 1);
        addDzieci(o.dzieci);
        wiek=o.wiek;
    }
    Osoba(Osoba *o){
        this->imie = new char[ strlen(o->imie) + 1];
        memcpy( this->imie, o->imie, strlen(o->imie) + 1);
    	this->nazwisko = new char[ strlen(o->nazwisko) + 1];
        memcpy( this->nazwisko, o->nazwisko, strlen(o->nazwisko) + 1);
        addDzieci(o->dzieci);
        wiek=o->wiek;
    }
    void addDzieci(Osoba* dz){
        int counter=0;
    	while(dz!=null){
        	counter++;
        }
        dzieci=new (*Osoba)[counter];
    	for(int i=0;i<counter;i++){
            dzieci[i]=dz[i];
        }
    }
    ~Osoba(){
        delete[] imie;
        delete[] nazwisko;
    	int a =0;
        while(dzieci != null){
        	delete dzieci[a];
            a++;
        }
	}
    void opertator+(){
    	wiek++;
    }
    void operator-(char pattern){
        char* copy=new char[strlen(imie)+1];;
        for(int i=0;i<strlen(imie);i++)
            if(imie[i]!=pattern){
            	copy[i]=imie[i];
        	}
            imie=new char(strlen(copy));
            strcpy(imie,copy);
    }
	void operator +(char pattern){
        int counter=0;
        char*copy=imie;
        while(imie!=NULL)
            counter++;
            imie=new char[strlen(imie)+2];
        	strcpy(imie,copy);
            imie[counter-1]=pattern;
        }
        bool operator==(Osoba& o){
        	if(o.wiek == wiek && o.nazwisko == nazwisko && o.imie==imie){
            	int c=0;
            	while(dzieci != null){
                	c++;
            	}
        		int c1=0;
            	while(o.dzieci != null){
            	c1++;
            	}
            	if(c==c1){
                	int a=0;
                	while(dzieci != null){
                		if(dzieci[a] == o.dzieci[a])
                		a++;
                		else return false;
                	}      
                	return true;
            	}else return false;
        	}else return false;
        }
    bool operator==(Osoba* o){
        if(wiek == o->wiek && nazwisko == o->nazwisko && imie==o->imie){
        	int c=0;
            while(dzieci != null){
            	c++;
            }
            int c1=0;
            while(o->dzieci != null){
                c1++;
            }
            if(c==c1){
                int a=0;
                while(dzieci != null){
                	if(dzieci[a] == o->dzieci[a])
                    a++;
                    else return false;
                }      
            	return true;
            }else return false;
        }else return false;
    }
};

int main(int argc, char *argv[]){
        Cplx l=Cplx(10,3);
        cout<<l;
}
edytowany 1x, ostatnio: futurity92
robcio
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Opole
  • Postów:533
0

Zrób dziedziczenie z klasy complex do swojej klasy: class MyComlex : public std::complex<typ> później tylko dopisz lub przesłoń właściwe funkcje. Zaoszczędzisz trochę kodu.


Nie odpowiadam na PW z prośbą o pomoc programistyczną.
edytowany 2x, ostatnio: robcio
SL
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 2 lata
  • Postów:236
0
  1. Musisz zwrócić jakiś typ jak sam błąd wskazuje. Nie może być to void. Bo po co przeciążać operator, jeśli funkcja nie miałaby nic zwracać - zamień to na nazwę klasy, czy jaki tam potrzebujesz typ.
  2. Przeciążyłeś operator pre-inkrementacji (++obj), a zadanie mówi o operatorze post-inkremenracji. Żeby użyć obj++; musisz użyć przeciążenia w takiej formule
Kopiuj
typ operator++(int)
edytowany 2x, ostatnio: Slashy
futurity92
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

Jeśli chodzi o kod dotyczący liczb zespolonych to już wszystko jest OK :)

Jeszcze tylko cześć kodu odpowiedzialna za ostatni podpunkt zadania klasa Osoba:
Poniżej oddzielny kod tego zadania:

Kopiuj
 #include <iostream>
#include <string.h>
#include <cstdlib>
using namespace std;

class Osoba{
    char* imie;
    char* nazwisko;
    int wiek;
    Osoba* dzieci;
public:
    Osoba(){
    	char input[100];
        cout << "Podaj imie: ";
        cin >> input;
        imie = new char[ strlen(input) + 1];
        memcpy( imie, input, strlen(input) + 1);
        cout << "Podaj nazwisko: ";
        cin >> input;
    	nazwisko = new char[ strlen(input) + 1];
        memcpy( nazwisko, input, strlen(input) + 1);
    	cout << "Podaj wiek: ";
        cin >> wiek;
    }
    Osoba(char* imie, char* nazwisko, int wiek, Osoba* dzieci){
        this->imie = new char[ strlen(imie) + 1];
        memcpy( this->imie, imie, strlen(imie) + 1);
        this->nazwisko = new char[ strlen(nazwisko) + 1];
        memcpy( this->nazwisko, nazwisko, strlen(nazwisko) + 1);
    	this->wiek=wiek;
        }
    Osoba(Osoba &o){
        this->imie = new char[ strlen(o.imie) + 1];
        memcpy( this->imie, o.imie, strlen(o.imie) + 1);
        this->nazwisko = new char[ strlen(o.nazwisko) + 1];
        memcpy( this->nazwisko, o.nazwisko, strlen(o.nazwisko) + 1);
        addDzieci(o.dzieci);
        wiek=o.wiek;
    }
    Osoba(Osoba *o){
        this->imie = new char[ strlen(o->imie) + 1];
        memcpy( this->imie, o->imie, strlen(o->imie) + 1);
    	this->nazwisko = new char[ strlen(o->nazwisko) + 1];
        memcpy( this->nazwisko, o->nazwisko, strlen(o->nazwisko) + 1);
        addDzieci(o->dzieci);
        wiek=o->wiek;
    }
    void addDzieci(Osoba* dz){
        int counter=0;
    	while(dz!=0){
        	counter++;
        }
        dzieci=new (*Osoba)[counter];
    	for(int i=0;i<counter;i++){
            dzieci[i]=dz[i];
        }
    }
    ~Osoba(){
        delete[] imie;
        delete[] nazwisko;
    	int a =0;
        while(dzieci != null){
        	delete dzieci[a];
            a++;
        }
	}
    void opertator(){
    	wiek++;
    }
    void operator-(char pattern){
        char* copy=new char[strlen(imie)+1];;
        for(int i=0;i<strlen(imie);i++)
            if(imie[i]!=pattern){
            	copy[i]=imie[i];
        	}
            imie=new char(strlen(copy));
            strcpy(imie,copy);
    }
	void operator +(char pattern){
        int counter=0;
        char*copy=imie;
        while(imie!=NULL)
            counter++;
            imie=new char[strlen(imie)+2];
        	strcpy(imie,copy);
            imie[counter-1]=pattern;
        }
        bool operator==(Osoba& o){
        	if(o.wiek == wiek && o.nazwisko == nazwisko && o.imie==imie){
            	int c=0;
            	while(dzieci != null){
                	c++;
            	}
        		int c1=0;
            	while(o.dzieci != null){
            	c1++;
            	}
            	if(c==c1){
                	int a=0;
                	while(dzieci != null){
                		if(dzieci[a] == o.dzieci[a])
                		a++;
                		else return false;
                	}      
                	return true;
            	}else return false;
        	}else return false;
        }
    bool operator==(Osoba* o){
        if(wiek == o->wiek && nazwisko == o->nazwisko && imie==o->imie){
        	int c=0;
            while(dzieci != null){
            	c++;
            }
            int c1=0;
            while(o->dzieci != null){
                c1++;
            }
            if(c==c1){
                int a=0;
                while(dzieci != null){
                	if(dzieci[a] == o->dzieci[a])
                    a++;
                    else return false;
                }      
            	return true;
            }else return false;
        }else return false;
    }
};

int main(int argc, char *argv[]) {
	return 0;
}

Wywala mi błąd w tym miejscu

Kopiuj
dzieci=new (*Osoba)[counter];
    	for(int i=0;i<counter;i++){
            dzieci[i]=dz[i];
        } 

Jakieś propozycje naprawienia tego?

robcio
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Opole
  • Postów:533
1

Rozumiem ,że chcesz utworzyć tablicę wskaźników na osoby. W takim razie powinno być Osoba ** dzieci.
następnie:
dzieci = new (osoba*)[counter]


Nie odpowiadam na PW z prośbą o pomoc programistyczną.
futurity92
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

A sprawdzałeś czy po zrobieniu w ten sposób kompiluję się? Bo mi nie chce przejść :/

futurity92
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 5 lat
  • Postów:49
0

Sorry :) Już wszystko działa dzięki wielkie :D

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)