Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

KillerBee

Iloczyn Skalarny for spoj

Polecane posty

Witajcie wszyscy. Mam problem z kolejnym zadaniem z programowania:

Zadanie:

Napisz program, który oblicza iloczyn skalarny wektorów.

Wejście

W pierwszej linii liczba testów. Następnie dla każdego testu długość wektorów n<=100 i dwa wektory n-elementowe [x1,...,xn],[y1,...,yn],xi<=1000,yi<=1000.

Wyjście

Iloczyn skalarny wektorów.

Przykład

Wejście:

2

3

1 1 1

1 1 1

2

2 3

1 1

Wyjście:

3

5

KOD:

#include <cstdlib>

#include <iostream>

using namespace std;

class wektor2d

{

float x,y,w,z;

int s,t,u;

public:

friend wektor2d &operator*(int ile, wektor2d &wek);

friend wektor2d &operator*(float ile, wektor2d &wek);

friend ostream &operator<<(ostream &ost, wektor2d &wek);

wektor2d &operator*(wektor2d &wek) //pierwszy operator* dla mnozenia: wektor*wektor

{

return *(new wektor2d(x*wek.x, y*wek.y));

}

wektor2d &operator*(int s) //drugi oeprator* dla mnożenia: wektor*calkowita

{

return *(new wektor2d(x*s, y*s));

}

wektor2d &operator*(float z) //drugi oeprator* dla mnożenia: wektor*calkowita

{

return *(new wektor2d(x*z, y*z));

}

wektor2d operator=(wektor2d &wek) //operator=

{

x=wek.x;

y=wek.y;

}

wektor2d &operator-(wektor2d wek) //operator- dla: wektor- wektor

{

return *(new wektor2d(x-wek.x, y-wek.y));

}

wektor2d &operator+(wektor2d wek) //operator+ dla wektor+wektor

{

return *(new wektor2d(x+wek.x, y+wek.y));

}

float operator^(wektor2d wek) {return x*wek.x+y*wek.y;}

/*float operator^(wektor2d &wek) //iloczyn skalarny

{

s=0;

for (int i=0;i<=1;i++)

{s+=x*y;}

return s;

}*/

wektor2d(float xx,float yy)

{

x=xx;

y=yy;

}

void wypisz()

{

cout<<x<<" "<<y;

}

wektor2d()

{

x=0;

y=0;

}

~wektor2d(){};

};

wektor2d &operator*(int ile, wektor2d &wek) //trzeci operator* dla int*wektor2d

{

return *(new wektor2d(ile*wek.x,ile*wek.y));

}

wektor2d &operator*(float ile, wektor2d &wek) //czwarty operator* dla float*int

{

return *(new wektor2d(ile*wek.x,ile*wek.y));

}

ostream &operator<<(ostream &ost, wektor2d &wek)

{

ost<<"["<<wek.x<<","<<wek.y<<"]";

return ost;

}

int main(int argc, char *argv[])

{

wektor2d c(0,0);

wektor2d v(7,11);

wektor2d w(8,10);

// wektor2d d(2);

/* cout<<"Wypisuje podane wektory:\n";

cout<<"Wektor v: "<<"[";

v.wypisz();

cout<<"]\n"<<"Wektor w: [";

w.wypisz();

cout<<"]\n\n\n";

cout<<" Co chcesz zrobic?? Wybierz \n";

cout<<" ________________________________________\n";

cout<<" |1.Dodawanie dwoch wektorow |\n";

cout<<" |2.Roznica dwoch wektorow |\n";

cout<<" |3.Mnozenie liczby przez wektor: |\n";

cout<<" | a) typu int |\n";

cout<<" | b) typu float |\n";

cout<<" |4.Mnozenie wektor przez liczbe: |\n";

cout<<" | a) typu int |\n";

cout<<" | b) typu float |\n";

cout<<" |5.Mnozenie dwoch wektorow |\n";

cout<<" |6.Iloczyn skalarny dwoch wektorow |\n";

cout<<" |________________________________________|\n";

*/

int o;

cin>>o;

switch (o)

{

case 1:

// cout<<"Podany wektor jest suma v+v: ";

c=v+v;

cout<<c<<"\n";

break;

case 2:

// cout<<"\nPodany wektor jest roznica v-w: ";

c=v-w;

cout<<c<<"\n";

break;

case 3:

// cout<<"Mnozenie liczby przez wektor: \n";

// cout<<" a) typu int \n";

// cout<<" b) typu float \n";

//cout<<"Wybierz a albo b:";

char p;

cin>>p;

if (p=='a')

{//cout<<"Podaj liczbe przez jaka chcesz pomnozyc wektor (liczba musi byc typu int): ";

int r;

cin>>r;

//cout<<"\nMnozenie liczby przez wektor v: ";

c=r*v;

cout<<c<<"\n";

//cout<<"\nMnozenie liczby przez wektor w: ";

c=r*w;

cout<<c<<"\n";

break;

}

if (p=='b')

{

// cout<<"Podaj liczbe przez jaka chcesz pomnozyc wektor (liczba musi byc typu float)";

float l;

cin>>l;

// cout<<"\nMnozenie liczby przez wektor v: ";

c=l*v;

cout<<c<<"\n";

// cout<<"\nMnozenie liczby przez wektor w: ";

c=l*w;

cout<<c<<"\n";

break;

}

else if (p!='a' and p!='b')

{//cout<<"\nBlad!! wybrales litere spoza zakresu\n";

break;}

break;

case 4:

//cout<<"Mnozenie wektora przez liczbe: \n";

//cout<<" a) typu int \n";

//cout<<" b) typu float \n";

//cout<<"Wybierz a albo b: ";

char s;

cin>>s;

if (s=='a')

{//cout<<"Podaj liczbe przez jaka chcesz pomnozyc wektor (liczba musi byc typu int): ";

int t;

cin>>t;

//cout<<"\nMnozenie wektora v przez liczbe: ";

c=v*t;

cout<<c<<"\n";

//cout<<"\nMnozenie wektora w przez liczbe: ";

c=w*t;

cout<<c<<"\n";

break;

}

if (s=='b')

{

// cout<<"Podaj liczbe przez jaka chcesz pomnozyc wektor (liczba musi byc typu float)";

float u;

cin>>u;

// cout<<"\nMnozenie wektora v przez liczbe: ";

c=v*u;

cout<<c<<"\n";

// cout<<"\nMnozenie wektora w przez liczbe: ";

c=w*u;

cout<<c<<"\n";

break;

}

else if (p!='a' and p!='b')

{//cout<<"\nBlad!! wybrales litere spoza zakresu";

break;}

break;

case 5:

// cout<<"\nMnozenie wektorow v*w: ";

c=w*v;

cout<<c<<"\n";

cout<<"\n";

break;

case 6:

// cout<<"\nIloczyn skalarny v i w: ";

cout<<(v^w)<<endl;

cout<<c<<"\n";

break;

}

system("PAUSE");

return EXIT_SUCCESS;

}

Proszę o pomoc.

Link do komentarza
Udostępnij na innych stronach

Problemem może być zbudowanie menu. Jeśli w zadaniu stoi 'iloczyn skalarny', masz liczyć tylko iloczyn skalarny, bez żadnych tekstów i innych takich (chyba, że będzie konkretne żądanie). Zadanie jest takie: użytkownik (w tym przypadku sędzia) ma najpierw wprowadzić ile chce razy wykonać mnożenie, później ile elementów (wymiarów) ma pierwsza para wektorów, którą następnie wprowadza w kolejnych liniach oddzielając wymiary spacjami, później powtarza cały proces dla kolejnych par wektorów. Tu masz dwie drogi, wyświetlanie wyników od razu albo po wprowadzeniu wszystkich danych. Pierwszy sposób jest mniej pamięciożerny, choć w tym przypadku to prawdopodobnie jest pomijalna ilość.

W każdym razie, bez specjalnej biblioteki NIE MA potęgowania, a ta biblioteka to cmath, funkcja pow(). Pominę już fakt, że jest to najzwyczajniej w świecie niepotrzebne w tym programie - iloczyn skalarny to suma iloczynów kolejnych elementów zadanych wektorów (np. dla wektorów (2,7) i (5,4) to jest 2*5+7*4=10+28=38), co jest osiągalne i proste do zrozumienia na początku artykułu o iloczynie skalarnym na Wikipedii. Pauza na zakończenie zbędna. Wystarczy ci return 0, albo nawet main jako void. Pamiętaj, że twój program sprawdza maszyna, nie człowiek. Menu można skonstruować nawet na obsługę głosem, zaś całe zadanie umieścić jako część hiperrozbudowanego programu, ale nie o to chodzi - maszyna chce, żeby robić to i tylko to, co trzeba. Tak więc, zrobiłeś program całkowicie niezgodny z założeniami, w dodatku nie znając iloczynu skalarnego. Przykro mi, ale to nie ma szans przejścia.

Link do komentarza
Udostępnij na innych stronach

Tak jak napisal piotrekn, po co liczysz tyle rzeczy, kombinujac strasznie, jesli zeby policzyc iloczyn skalarny wystarczy Ci zrobic klase wektor, w private umiescisz wspolrzedne wektora. Zrob jakis konstruktor tworzacy wektory, potem przeladuj jakis operator, ktory bedzie odpowiedzialny za iloczyn skalarny wektorow i wyswietl go w mainie. I jak ktos prosi o komunikat o bledzie to daj komunikat badz napisz co wyswietla kompilator , a nie pisz tekstu w stylu:"nie pasuje mu cin>>r;" albo "wszystkie cout'y są zanegowane". Pozdro

Link do komentarza
Udostępnij na innych stronach

Więc nie bierz się za takie programy. SPOJ jest pełen mniej wymagających zadań. Poza tym, tu nawet nie trzeba żadnych klas ani nic tworzyć - prawdopodobnie wystarczy jednowymiarowa tablica z określaną przez użytkownika długością. Wot, i cała filozofia.

Link do komentarza
Udostępnij na innych stronach

Zatem przykro mi, że trafiłeś na takiego a nie innego nauczyciela. Jeśli nie masz pieniędzy na kupno bądź nie chcesz kupować podręczników papierowych, spróbuj przebrnąć przynajmniej przez pierwszych naście działów megatutoriala, tam powinieneś znaleźć niemało informacji przydatnych przy nauce. Uważaj jednak przy pisaniu, gdy dojdziesz do kwestii pisania gry w kółko i krzyżyk - osobiście uważam, że ten etap to zbyt duży skok do przodu, połączony z przeładowaniem informacjami. Niemniej jednak, jako źródło teorii warto przeczytać przynajmniej część, tobie może się przydać rozdział o tablicach. Radzę ściągnąć pełną wersję PDF i pomagać sobie wyszukiwarką i oskryptowanym spisem treści. Jeśli jednak dysponujesz środkami na książki, jest specjalny temat oraz specjaliści, którzy pomogą ci wybrać najlepszą pozycję (o ile się nie mylę, jest to Symfonia).

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...