Iloczyn wektorowy, C

0

Dzień dobry, mam pytanie "dla początkujących". Trzeba napisać program, który liczy iloczyn wektorowy dwóch wektorów.
Napisałam w wyniku coś takiego:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void read (int tablica[3])
{
for(int i = 0; i < 3; i++)
scanf("%d", &tablica[i]);
}
int iloczyn(int tab_a[3], int tab_b[3], int wynik[3])
{
wynik[0]=tab_a[1]*tab_b[2]-tab_a[2]*tab_b[1]; 
wynik[1]=tab_a[2]*tab_b[0]-tab_a[0]*tab_b[2]; 
wynik[2]=tab_a[0]*tab_b[1]-tab_a[1]*tab_b[0]; 
return wynik[3];
}

int main()
{
int tab_a[3];
int tab_b[3];
int wynik[3];
printf ("Podaj wspolrzedne wektorow:\n"); 

read(tab_a);
read(tab_b);
printf("iloczyn wektorowy:\n");
printf("%d\n", iloczyn(tab_a, tab_b, wynik));
}

ale nie działa -- w tym sensie, że nie podaje prawidłowy wynik.
Jak rozumiem, program musi podawać 3 współrzędne wynikowego wektora jako wynik, ale podaje 1 liczbę. Co ja robię nie tak?
Z góry dzięki.

1
return wynik[3];

To zwraca wartosc trzeciego czwartego elementu z tablicy wynik. Czyli jakis smiec, bo jest po za rozmiarem tablicy.

Twoja funkcja powinna zwracac wskaznik na pierwszy element tablicy wynik.

int *fun (int tab[5])
{
//operacje na tablicy
return tab;
}
0
PanRiK napisał(a):
return wynik[3];

To zwraca wartosc trzeciego elementu z tablicy wynik. Czyli jakis smiec, bo jest po za rozmiarem tablicy.

Twoja funkcja powinna zwracac wskaznik na pierwszy element tablicy wynik.

int *fun (int tab[5])
{
//operacje na tablicy
return tab;
}

Kiedy poprawiłam na taki wariant:

int iloczyn(int tab_a[3], int tab_b[3], int wynik[3])
{
wynik[0]=tab_a[1]*tab_b[2]-tab_a[2]*tab_b[1]; 
wynik[1]=tab_a[2]*tab_b[0]-tab_a[0]*tab_b[2]; 
wynik[2]=tab_a[0]*tab_b[1]-tab_a[1]*tab_b[0]; 
return wynik;
}

nie chcę kompilować, mówi że:

In function 'iloczyn':
il.c:15:8: warning: return makes integer from pointer without a cast [-Wint-conversion]
 return wynik;

Kiedy piszę:

return wynik[0], wynik[1], wynik[2];

wydaję też błędny wynik.

2

Jeżeli przekazujesz tablicę to nie potrzebujesz jej ponownie zwracać dlatego że już pracujesz na niej. Dla przykładu prosty program:

void do_something(int tab[3])
{
	tab[0] = 5;
	tab[1] = 7;
	tab[2] = 1;
}

int main() 
{
	int tabka[3];

	do_something(tabka);
	
	for (int i = 0; i < 3; i++)
	{
		printf("%d\n", tabka[i]);
	}
}

Program wyświetli:
5
7
1
mimo że nie zwracamy tablicy.

0
atmal napisał(a):

Jeżeli przekazujesz tablicę to nie potrzebujesz jej ponownie zwracać dlatego że już pracujesz na niej. Dla przykładu prosty program:

void do_something(int tab[3])
{
	tab[0] = 5;
	tab[1] = 7;
	tab[2] = 1;
}

int main() 
{
	int tabka[3];

	do_something(tabka);
	
	for (int i = 0; i < 3; i++)
	{
		printf("%d\n", tabka[i]);
	}
}

Program wyświetli:
5
7
1
mimo że nie zwracamy tablicy.

A można przykład z wielu tablicami?
U mnie wciąż wydaje zły wynik (nie tablicę, ale 1 liczbę). Naprzykład: http://ibb.co/ct8i76

2
int iloczyn(int tab_a[3], int tab_b[3], int wynik[3])
{
wynik[0]=tab_a[1]*tab_b[2]-tab_a[2]*tab_b[1]; 
wynik[1]=tab_a[2]*tab_b[0]-tab_a[0]*tab_b[2]; 
wynik[2]=tab_a[0]*tab_b[1]-tab_a[1]*tab_b[0]; 
return wynik;
}

nie zwracasz wskaznika.

int iloczyn(int tab_a[3], int tab_b[3], int wynik[3])

na

int *iloczyn(int tab_a[3], int tab_b[3], int wynik[3])

Lub tak jak pisal @atmal bez returna

void iloczyn(int tab_a[3], int tab_b[3], int wynik[3])
{
wynik[0]=tab_a[1]*tab_b[2]-tab_a[2]*tab_b[1]; 
wynik[1]=tab_a[2]*tab_b[0]-tab_a[0]*tab_b[2]; 
wynik[2]=tab_a[0]*tab_b[1]-tab_a[1]*tab_b[0]; 
}

i wtedy wyswietlasz wynik:

for(int i=0; i < wynik.size(); i++)
    cout << wynik[i]
0

Ok, zrobiłam taki kod (kiedy staram się zwracać "return wynik;" zawsze podaje jakiś bład i nie chce kompilować):

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void read (int tablica[3])
{
for(int i = 0; i < 3; i++)
scanf("%d", &tablica[i]);
}
int iloczyn(int tab_a[3], int tab_b[3], int wynik[3])
{
wynik[0]=tab_a[1]*tab_b[2]-tab_a[2]*tab_b[1]; 
wynik[1]=tab_a[2]*tab_b[0]-tab_a[0]*tab_b[2]; 
wynik[2]=tab_a[0]*tab_b[1]-tab_a[1]*tab_b[0]; 
}

int main()
{
int tab_a[3];
int tab_b[3];
int wynik[3];
printf ("Podaj wspolrzedne wektorow:\n"); 

read(tab_a);
read(tab_b);
printf("iloczyn wektorowy:\n");
for (int i=0; i<3; i++)
printf("%d\n", iloczyn(tab_a, tab_b, wynik));
}

teraz podaje 3 współrzędne w wyniku, ale to każdy raz jest trzecia współrzędna wynikowego wektora. Naprzykład, iloczyn wektorowy dla wektorów o wsp. (5,3,8) a (7,3,3) musi być = (-5, 41, -6), a program podaje 3 razy: (-6, -6, -6)
Czyli tak: http://ibb.co/karyqR
Czyli tam wciąż jest jakiś błąd, ale jaki nie mogę wymyślić.

1

Nie zwracasz żadnego int (int iloczyn(...))a go wyświetlasz powodując Undefined Behaviour.
Powinnaś zrobić coś takiego:

void iloczyn(...) { ... }

int main()
{
	// Wczytaj tab_a, tab_b
	printf("iloczyn wektorowy:\n");
	iloczyn(tab_a, tab_b, wynik);
	
	for(int i = 0; i < 3; i++)
	{
		printf("%d\n", wynik[i]);
	}
}
0
atmal napisał(a):

Nie zwracasz żadnego int (int iloczyn(...))a go wyświetlasz powodując Undefined Behaviour.
Powinnaś zrobić coś takiego:

void iloczyn(...) { ... }

int main()
{
	// Wczytaj tab_a, tab_b
	printf("iloczyn wektorowy:\n");
	iloczyn(tab_a, tab_b, wynik);
	
	for(int i = 0; i < 3; i++)
	{
		printf("%d\n", wynik[i]);
	}
}

Dziękuję, wreszcie działa. Jak rozumiem, nie jest obowiązkowo wyzwanie funkcji "Iloczyn" w "Printf'e", a można wyzwać ją na początku 1 raz, i potem trzeba po prostu zrobić pętlę dla wyświetlania wyników.
Jeszcze raz dziękuję wszystkim za bardzo pomocne odpowiedzi!

1

Ten "iloczyn" wywołujesz w pierwszej kolejności, bo on Ci zmienia wartości tablicy "wynik".
Dopiero po tej zmianie wartości z "wynik" wyświetlasz.

Próbowałaś wyświetlać wartość z funkcji, która nic nie zwracała.

2

To całe zwracanie i przyjmowanie tablic przez funkcje bywa czasami naprawdę upierdliwe, już prościej chyba nauczyć się tworzyć własne typy danych (struktury, obiekty).
Tutaj można by zastosować prostą strukturę:

struct wektor3d
{
    float x;
    float y;
    float z;
};

wektor3d iloczyn(wektor3d a, wektor3d b)
{
    wektor3d wynik;
    wynik.x = a.y*b.z - a.z*b.y;
    wynik.y = a.x*b.z - a.z*b.x;
    wynik.z = a.x*b.y - a.y*b.z;
    return wynik;
}

i problem z głowy.

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