Pierwszy program na obiektówce - typedef

0

Cześć, zaczynam na studiach Programowanie Obiektowe i kompletnie nie wiem jak zabrać się za to zadanie.

Zadeklaruj typ typedef Figura ..., który może reprezentować figury geometryczne: punkt, koło lub kwadrat* wraz z ich położeniem w dwuwymiarowym układzie współrzędnych. Przyjmij, że pole typfig typu wyliczeniowego wyznacza rodzaj reprezentowanej figury geometrycznej. Zdefiniuj trzy procedury:

narysuj(Figura *f)

(wystarczy, że wypisze odpowiedni komunikat w trybie tekstowym);

przesuń(Figura *f, float x, float y)

(przesuwa figurę o zadany wektor);

int zawiera(Figura *f, float x, float y)

sprawdzającą, czy figura zawiera punkt o zadanych współrzędnych

  • Przyjmujemy że boki kwadratu są równoległe do osi układu współrzędnych
    Może mi ktoś jakoś z tym pomóc? Nie chcę żeby ktoś mi to napisał bo w niczym mi to nie pomoże.
    Na początek może zacznę od tego, że nigdy podobnych rzeczy nie robiłem i nie wiem z czym to się je.

A więc tak: robie sobie typedefa:

typedef stuct Figura{

}

Ale co mam dać w środek struktury? Wszystkie parametry do figur po kolei? W sensie współrzędne do punktu, współrzędne rogów kwadratu, środek i promień koła? Jeśli nie to co? A jeśli tak to co potem? Proszę o jakieś wskazówki.

EDIT. Hej czy może ja muszę zrobić to tak, że definiuję sobie trzy struktury do koła, punktu i kwadratu? Ale co wtedy ze stukturą Figura którą muszę stworzyć..

0

Ale co mam dać w środek struktury? Wszystkie parametry do figur po kolei? W sensie współrzędne do punktu, współrzędne rogów kwadratu, środek i promień koła?

Tak. Ogólnie cel tego zadania to użycie flag (w tym przypadku typ figury w polu typfig, masz zrobić enuma) w celu zmienienia działania funkcji. Prościej mówiąc, funkcja narysuj() inaczej będzie rysować okrąg, kwadrat i punkt. Czyli:

void narysuj(Figura *f){
    switch(f.typfig){
        case PUNKT: // 'narysuj' punkt
        case OKRAG: // 'narysuj okrag itd.
    }
}

BTW jak na "Programowanie Obiektowe" to ten kod średnio obiektowy, ale może to rodzaj jakiegoś wstępu :)

0

Dziękuję za odpowiedź. A mógłbyś pokazać jak miałby wyglądać taki przykładowy enum? Poczytałem o enumie na stronie cpp0x.pl, ale nie potrafię sobie wyobrazić tego jak miałoby to wyglądać w tym zadaniu.

0

enum to tylko takie opakowanie, żeby zamiast nic nie znaczących liczb używać coś znaczące wyrazy. Czyli zamiast przypisywać do pola typfig liczby od 0 do 3 i potem sprawdzać:

if(typfig == 0) // to kwadrat
if(typfig == 1) // to koło itd.

To robisz sobie enuma, dzięki któremu te liczby będą coś znaczyć i sprawdzasz:

if(typfig == KWADRAT) // to kwadrat itd.

Enum to zwyczajne "nadanie nazwy" liczbom.

0

No to w takim wypadku nie widzę sensu stosowania tego. Przecież i tak najpierw muszę nadać wartości w enumie. Dla przykładu

KWADRAT = 1
KOLO = 2

a dopiero potem

if typfig == KWADRAT

To jest takie niepotrzebne pisanie dodatkowej linii kodu

dodanie znaczników <code class="c"> - @furious programming

0

A nie pomyślałeś o czytelności?
Gdzie wartości enuma w większym projekcie może być, strzelam - 30 ?
btw. to ma sens

0
Florian napisał(a):

No to w takim wypadku nie widzę sensu stosowania tego. Przecież i tak najpierw muszę nadać wartości w enumie. Dla przykładu

KWADRAT = 1
KOLO = 2

[...]
To jest takie niepotrzebne pisanie dodatkowej linii kodu

  1. nie musisz nadawać wartości, jeśli nie zależy ci na konkretnych wartościach
  2. enum jest jednocześnie typem, więc jeśli chcesz, by funkcja przyjmowała tylo wartości zdefiniowane w enumie, to dajesz jako typ argumentu funkcji właśnie enum, wtedy masz pewność, że jak sie pomylisz, to kompilator wyrzuci błąd
0

Czyli ogólnie powinno wyglądać to w ten sposób?

void wczytywanie()
{
    int x,y;
    
    cout << "Wybierz typ figury" << endl;
    cout << "0 - KWADRRAT, 1 - KOLO, 2 - PUNKT";
    cin >> typ;
    
    switch (typ)
    {
    case 0:
        cout << "Podaj bok:";
        cin >> Figura.bok;
        cout << "Podaj x:";
        cin >> Figura.x;
        cout "Podaj y:";
        cin >> Figura.y;
        
    case 1:
        cout << "Podaj promien:";
        cin >> Figura.promien;
        cout << "Podaj x:";
        cin >> Figura.x;
        cout "Podaj y:";
        cin >> Figura.y;
    case 2;
        cout << "Podaj x:";
        cin >> Figura.x;
        cout "Podaj y:";
        cin >> Figura.y;
    }
    cout << "Czy chcesz narysowac figure? TAK - 1 NIE - 0";
    cin >> p;
    if (p == 1)
        narysuj(Figura)
        
    cout << "Czy chcesz przesunac figure? TAK - 1 NIE - 0";
    cin >> p;
    if (p == 1)
    {
        cout << "Podaj x:";
        cin >> x;
        cout << "Podaj y:";
        cin >> y;
        przesun(Figura, x, y)
    }
    
    cout << "Czy chcesz sprawdzic czy punkt jest w figurze? TAK - 1 NIE - 0";
    cin >> p;
    if (p == 1)
        cout << "Podaj x:";
        cin >> x;
        cout << "Podaj y:";
        cin >> y;
        cout << zawiera(Figura, x, y)
    
    return 0;
}
void narysuj(Figura *f)
void przesun(Figura *f, float x, float y)
int zawiera(Figura *f, float x, float y) 

EDIT. Nie wiem jeszcze, jak przekazać do funkcji

void narysuj(Figura *f) 

wszystkie parametry ( dwie współrzędne i bok) na raz skoro funkcja przyjmuje jeden argument.

0
Florian napisał(a):

Czyli ogólnie powinno wyglądać to w ten sposób?
....

Nie

void wczytywanie()
{
    int x,y;

Tu przydałoby się coś ala:

Figura lfigura;

Dalej

   [...]
    switch (typ)
    {
    case 0:

Tu powinno być mniej więcej tak:

        lfigura.typ = 0;//albo jesli tym enum to adekwatna wartość
        cout << "Podaj bok:";
        cin >> lfigura.bok;
        cout << "Podaj x:";
        cin >> lfigura.x;
        cout "Podaj y:";
        cin >> lfigura.y;
        break;

Dalej analogicznie - czyli wywołujesz parametr dla typu, ustawiasz rodzaj typu oraz na koniec bloku wstawiasz break;

Następnie zamiast:

  
    if (p == 1)
        narysuj(Figura)

wywołujesz:

   if (p == 1)
      narysuj(&lfigura);

dalej analogicznie.
Tylko ten kod nie jest za bardzo obiektowy...

0
kaczus napisał(a):
Florian napisał(a):

Czyli ogólnie powinno wyglądać to w ten sposób?
....

Nie

void wczytywanie()
{
    int x,y;

Tu przydałoby się coś ala:

Figura lfigura;

To x i y miało być zmiennymi do podania wartości do przesunięcia figury. Ale nie bardzo rozumiem, w jaki sposób taki fragment kodu ma zastąpić dwie zmienne x i y..

Tak wiem że kod nie jest obiektowy :) to zdanie to takie pierwsze zadanie przed rozpoczęciem przedmiotu można powiedzieć.

EDIT.

kaczus napisał(a):

Tu powinno być mniej więcej tak:

        lfigura.typ = 0;//albo jesli tym enum to adekwatna wartość
        cout << "Podaj bok:";
        cin >> lfigura.bok;
        cout << "Podaj x:";
        cin >> lfigura.x;
        cout "Podaj y:";
        cin >> lfigura.y;
        break;

Dalej analogicznie - czyli wywołujesz parametr dla typu, ustawiasz rodzaj typu oraz na koniec bloku wstawiasz break;

Mógłbyś podpowiedzieć mi jeszcze trochę w tej kwestii? Załóżmy że tworzę enuma:

enum typfig {
    KWADRAT = 0,
    KOLO = 1,
    PUNKT = 2
};

Jak teraz powinien wyglądać ten switch?

1 użytkowników online, w tym zalogowanych: 0, gości: 1