Pierwszy program na obiektówce - typedef

Pierwszy program na obiektówce - typedef
Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
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:

Kopiuj
narysuj(Figura *f)

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

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

(przesuwa figurę o zadany wektor);

Kopiuj
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:

Kopiuj
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ć..

Wizzie
  • Rejestracja: dni
  • Ostatnio: dni
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:

Kopiuj
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 :)

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
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.

Wizzie
  • Rejestracja: dni
  • Ostatnio: dni
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ć:

Kopiuj
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:

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

Enum to zwyczajne "nadanie nazwy" liczbom.

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

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

Kopiuj
KWADRAT = 1
KOLO = 2

a dopiero potem

Kopiuj
if typfig == KWADRAT

To jest takie niepotrzebne pisanie dodatkowej linii kodu

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

PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pomorskie (Stare Kabaty)
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

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
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

Kopiuj
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
Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0

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

Kopiuj
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

Kopiuj
void narysuj(Figura *f) 

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

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1403
0
Florian napisał(a):

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

Nie

Kopiuj
void wczytywanie()
{
    int x,y;

Tu przydałoby się coś ala:

Kopiuj
Figura lfigura;

Dalej

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

Tu powinno być mniej więcej tak:

Kopiuj
        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:

Kopiuj
  
    if (p == 1)
        narysuj(Figura)

wywołujesz:

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

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

Florian
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 106
0
kaczus napisał(a):
Florian napisał(a):

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

Nie

Kopiuj
void wczytywanie()
{
    int x,y;

Tu przydałoby się coś ala:

Kopiuj
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:

Kopiuj
        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:

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

Jak teraz powinien wyglądać ten switch?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.