[C++] Dodawanie wektorów

jadwiziga
Użytkownik
Użytkownik
Posty: 30
Rejestracja: 2 sie 2013, o 15:48
Płeć: Kobieta
Lokalizacja: Polska

[C++] Dodawanie wektorów

Post autor: jadwiziga »

Z pomocą prowadzącego zaczęliśmy pisać program na dodawanie wektorów czy ktoś mógłby wskazać moje błędy + co trzeba jeszcze dopisać, mój poziom jest początkujący. Z góry dziękuję....

Kod: Zaznacz cały

#include<cstdio>


class wektor {
            float x,y,z;
            public:
                   void suma(wektor,wektor);
                   wektor(float,float,float);
                   wektor();
};

 main()
{
wektor A(1,2,3);
wektor B;
     system("PAUSE")  ;
}    
                  
                   void wektor :: suma(wektor a,wektor b)
                   {
                        x=a.x+b.x;
                        y=a.y+b.y;
                        z=a.z+b.z;
                        }
                        
Ostatnio zmieniony 7 paź 2013, o 22:19 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[C++] Dodawanie wektorów

Post autor: lukequaint »

Ok.
Po pierwsze: wrzucając kod na forum czy pokazując gdziekolwiek lub nawet pisząc dla siebie, zadbaj o czytelność. Podstawowa zasada - wcięcia jednakowej wielkości po każdej klamrze otwierającej, np:

Kod: Zaznacz cały

// wciecia na cztery spacje
int a = 0;
if (a > 0)
{
    a -= 1;
    if (a == 0)
    {
        std::cout << "a bylo jedynka";
    }
}
Po drugie: w C++ poprawniej (i łatwiej) jest korzystać ze strumieni, tzn. std::cin, std::cout:

Kod: Zaznacz cały

#include <iostream>
...
    std::cout << "jakis napis"; // do wypisywania
    int a = 0;
    std::cin >> a; // wczytywanie do zmiennej a
...
Po trzecie, w C++ funkcja main powinna być zapisywana w ten sposób:

Kod: Zaznacz cały

int main(void) // istnieja tez odmiany z argumentami, ale to nieco wyzszy poziom
{

    return 0; // zwracanie rezultatu programu - C++ domyslnie zwraca zero, mimo wszystko warto to pisac
}
Następnie, przy deklaracji funkcji, nazywaj argumenty. Mimo że to niepotrzebne i wymaga więcej pisania, poprawia czytelność kodu:

Kod: Zaznacz cały

// tak
void suma(wektor a, wektor b);
// zamiast
void suma(wektor, wektor);
W końcu, suma() nie działa, ponieważ próbujesz w niej uzyskać dostęp do prywatnych składowych klasy. Aby tak móc tak zrobić, dodaj metody X(), Y(), Z() zwracające kolejne współrzędne wektora lub przerzuć te atrybuty (x, y, z) do części 'public:'.Napisana przez Ciebie metoda suma oblicza sumę wektorów podanych jako argumenty. Jeśli chcesz ją zachować w obecnej postaci, wystaw ją poza klasę i zwracaj wektor. Tak jak teraz stoi, zapisuje ona w wektorze, dla którego jest wywoływana, wynik dodawania dwóch innych. To rzadko przeze mnie spotykane podejście i sądzę, że niezbyt dobre. Zrobiłbym to raczej tak:

Kod: Zaznacz cały

wektor suma(wektor a,wektor b)
{
    // tu sa opisane przeze mnie metody dostepu do atrybutow x, y, z
    double x=a.X()+b.X();
    double y=a.Y()+b.Y();
    double z=a.Z()+b.Z();
    return wektor(x, y, z);
}

// i w funkcji main:
int main(void)
{
    wektor a(1, 2, 3);
    wektor b(3, -1, 5);
    wektor c = a + b; // wektor c jest równy (4, 1, 8)
}
Innym pomysłem może być zostawienie tej funkcji wewnątrz klasy i wywoływanie jej z jednym argumentem (w tym przypadku dla danego wektora - zostanie do niego dodany wektor podany jako argument):

Kod: Zaznacz cały

void wektor::suma(wektor a)
{
    // tu sa opisane przeze mnie metody dostepu do atrybutow x, y, z
    x += a.X();
    y += a.Y();
    z += a.Z();
}

// a w funkcji main:
int main(void)
{
    wektor a(1, 2, 3);
    wektor b(3, -1, 5);
    a.suma(b); // wektor a jest równy (4, 1, 8)
}
Jeśli coś jest nie do końca jasne, pytaj śmiało :)
Gouranga
Użytkownik
Użytkownik
Posty: 1594
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 247 razy

[C++] Dodawanie wektorów

Post autor: Gouranga »

co do samej konstrukcji funkcji main() pozwolę sobie rozwinąć myśl
1. funkcja musi mieć typ, dla main jest to int
2. funkcja main powinna zwracać do środowiska status wykonania programu, umownie jeśli wszystko idzie ok zwracamy 0. Tak zwróconą wartość możemy w środowisku znaleźć pod zmienną $PIPESTATUS, używa się przy skryptach masowo uruchamiających programy dla różnych danych wejściowych
więc z tych dwóch punktów wynika poprawna forma:

Kod: Zaznacz cały

int main(...){
...
return 0;
}
druga rzecz to wnętrze nawiasu czyli argumenty dla funkcji main()
jeśli chcemy do programu przekazać coś z zewnątrz musimy w tym miejscu przygotować sobie odpowiednie zmienne (pewnie kiedyś dobrniesz do tego etapu pisania), jeśli natomiast nie zamierzamy stosować argumentów z zewnątrz to są 2 możliwości
-zostawić puste
-wpisać void
różnica jest taka, że puste to nieokreślona ilość argumentów, void konkretnie uniemożliwia stosowanie argumentów. Dla prostych programów nie ma to dużego znaczenia, chodzi o to, że jak zostawiasz puste to jest to luka w kodzie przez którą stosując różne zaawansowane rzeczy włącznie z dekompilacją programu można władować do twojego kodu szkodliwe dane, void to zwyczajnie kwestia bezpieczeństwa, której w praktyce nie wykorzystasz bo nikt nie będzie się włamywał do twoich programów na których się uczysz pisać, ale jest to dobry nawyk
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] Dodawanie wektorów

Post autor: Afish »

Gouranga pisze:różnica jest taka, że puste to nieokreślona ilość argumentów
W C tak, w C++ nie. Tam aby przekazać nieokreśloną liczbę argumentów trzeba użyć elipsy.
ODPOWIEDZ