Iloczyn wektorowy, C

Iloczyn wektorowy, C
M2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
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:

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

edytowany 2x, ostatnio: Marina25
PanRiK
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Szczecin
  • Postów:104
1
Kopiuj
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.

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

Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 3x, ostatnio: PanRiK
atmal
Chyba 4 elementu tablicy a z indeksem 3.
PanRiK
Zgadza sie. Dziekuje :)
M2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
0
PanRiK napisał(a):
Kopiuj
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.

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

Kiedy poprawiłam na taki wariant:

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

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

Kiedy piszę:

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

wydaję też błędny wynik.

edytowany 2x, ostatnio: Marina25
atmal
  • Rejestracja:około 8 lat
  • Ostatnio:12 dni
  • Postów:913
2

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

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


Failure of one test is a tragedy, failure of fifty is a statistic.
M2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
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:

Kopiuj
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

edytowany 1x, ostatnio: Marina25
PanRiK
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Szczecin
  • Postów:104
2
Kopiuj
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.

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

na

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

Lub tak jak pisal @atmal bez returna

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

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

Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 2x, ostatnio: PanRiK
M2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
0

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

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

edytowany 3x, ostatnio: Marina25
atmal
  • Rejestracja:około 8 lat
  • Ostatnio:12 dni
  • Postów:913
1

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

Kopiuj
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]);
	}
}

Failure of one test is a tragedy, failure of fifty is a statistic.
M2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Postów:5
0
atmal napisał(a):

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

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

edytowany 1x, ostatnio: Marina25
PanRiK
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Szczecin
  • Postów:104
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.


Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.
edytowany 1x, ostatnio: PanRiK
CZ
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:231
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ę:

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

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.