• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ obiektowo, zadanie, wskaźnik.

Object Storage Arubacloud
0 głosów
1,036 wizyt
pytanie zadane 7 marca 2016 w C i C++ przez Lukasz95 Bywalec (2,160 p.)

Witam , mam pewne zadanie: "Napisz klasę trojkat zawierającą:
1. Prywatne pola height (wysokość) i base (podstawa).
2. Publiczne modyfikatory i akcesory do pól klasy.
3. Publiczną metodę area zwracającą jako wartość pole trójkąta o wymiarach przechowywanych w obiekcie.
4. Napisz funkcję, która dostaje w argumentach dwa obiekty typu trojkat i zwraca wskaźnik na obiekt o większym polu.
5. Napisz funkcję, która dostaje w argumentach tablicę obiektów typu trojkat oraz jej rozmiar i zwraca wskaźnik na obiekt o największym polu."
Pierwsze trzy podpunkty zrobiłem ale mam problem z 4  , a 5 nie wiem jak ruszyć. 
Zwracam się o pomoc.

 

#include <iostream>

using namespace std;
class trojkat
{
    double height;
    double base;
public:
    void set(double a,double b);
    double area();
};
void trojkat::set(double a, double b){
    height=a;
    base=b;
}

double trojkat::area(){
    return height*base/2;

}
trojkat *f(trojkat t1,trojkat t2)
{
    trojkat *wsk;
    if(t1.area()>t2.area())
        wsk=&t1;
    else wsk=&t2;
        return wsk;
}

int main()
{
    trojkat t1,t2;


    t2.set(6,9);
    t1.set(3,5);
    cout<<"Pole t1= "<<t1.area()<<endl;
    cout<<"Pole t2= "<<t2.area()<<endl;
    cout<<f(t1,t2).area();
    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 7 marca 2016 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 7 marca 2016 przez Lukasz95
 
Najlepsza

4. Prześlij te dwa obiekty za pomocą wskaźników lub referencji. Później oblicz pole dla tych dwóch trójkątów (ze wzoru P = a * h / 2) i porównaj. Na końcu zwróć adres obiektu trójkąta o większym polu.

5. Prześlij tablicę obiektów do funkcji oraz ilość jej elementów. Skonstruuj pętlę, w której będziesz obliczał wartości pól dla poszczególnych trójkątów. Na końcu wybierasz największą wartość z możliwych (można również wybierać wartości maksymalne w trakcie samego ich obliczania - wystarczy, że stworzysz sobie zmienną z obiektem, którego trójkąt posiada największe pole i w każdej iteracji pętli będziesz obliczać pola, porównywać wartości i zmieniał odpowiednio obiekt, na który wskazuje zmienna).

komentarz 7 marca 2016 przez Lukasz95 Bywalec (2,160 p.)
Co do 4.) to muszę obliczać pole od nowa, nie mogę posłużyć się metodą już istniejącą ?
A co do samego zwracania wskaźnika na obiekt to służy do tego "->" ?
komentarz 7 marca 2016 przez Patrycjerz Mędrzec (192,320 p.)

Oczywiście, nikt ci nie broni używania metod, które sobie sam utworzyłeś.

Do zwracania adresu (nie wskaźnika) obiektu, jak i każdej innej zmiennej/stałej w C++, służy operator &.

komentarz 7 marca 2016 przez Lukasz95 Bywalec (2,160 p.)

Okk, mam jeszcze kilka pytań ,bo wksaźnik, czyli adres jest w postaci int więc zwraca inta ,a nie typ trojkat... i gdy próbuję tak robić to wywala mi błąd z konwertowaniem na inta.

 

int *f(trojkat t1,trojkat t2)
{


    if(t1.area()>t2.area())
        return &t1;
        else return &t2;

}

 

komentarz 7 marca 2016 przez Patrycjerz Mędrzec (192,320 p.)
Zwracaj więc adres obiektu, a nie wartość liczbową.
komentarz 7 marca 2016 przez Lukasz95 Bywalec (2,160 p.)

Zrobiłem tak, ale nadal miałem problem.  Błąd: cannot convert 'trojkat*' to 'int*' in initialization
     int *wsk1=&t1,*wsk2=&t1;
                ^

zmieniłem wszędzie typ int na typ trójkąt i się kompiluję, jest to poprawne?
 

trojkat *f(trojkat t1,trojkat t2)
{
    trojkat *wsk1=&t1,*wsk2=&t1;

    if(t1.area()>t2.area())
        return wsk1;
        else return wsk2;

}

A jak później posłużyć się tym adresem 
do obliczenia pola chciałem zrobić wyłuskanie 
ale nie działa.
cout<<*(f(t1,t2)).area();
komentarz 7 marca 2016 przez Patrycjerz Mędrzec (192,320 p.)

A dlaczego niby miało by być to niepoprawne? Radzę zwracać adresy bezpośrednio - niepotrzebnie tworzysz jakieś wskaźniki. Także błąd w przypisaniu adresu do wskaźnika wsk2.

Wyłuskanie obiektu należy pisać tak:

(*wsk).metoda();

lub tak (preferowany i popularniejszy sposób):

wsk->metoda();
komentarz 7 marca 2016 przez Lukasz95 Bywalec (2,160 p.)
edycja 8 marca 2016 przez Lukasz95

Co do 5. zrobiłem funkcję i chciałem zobaczyć czy działa i mam problem z inicjalizacją tablicy do tego testu. 
Funkcja:
 

trojkat *ff(trojkat *tab,int x)
{
    trojkat max=tab[0];
    for(int i=0;i<x;x++)
    {
       if(tab[i].area()>tab[i+1].area())
           max=tab[i];
       else max=tab[i+1];
    }
    return &max;
}

 

A w mainie wygląda to następująco:
 

trojkat tab[5]={tab[0].set(1,1),tab[1].set(1,5),tab[2].set(11,1),tab[3].set(11,16),tab[4].set(1,6)};
cout<<"ff : "<<ff(&tab[0],5)->area()<<endl;

 

Podobne pytania

0 głosów
1 odpowiedź 319 wizyt
pytanie zadane 25 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
1 odpowiedź 448 wizyt
pytanie zadane 25 grudnia 2016 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 333 wizyt
pytanie zadane 9 lutego 2020 w C i C++ przez Konrad Gałach Użytkownik (880 p.)

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...