mooris [ Konsul ]
Ktoś czuje się mocny w programowaniu???
Witam.
Zadanie polega na tym:
Program powinien umożliwiać:
• Działania na n wektorach (n=1,..,5),
• Program powinien dawać możliwość: dodawania, odejmowania wektorów oraz wyznaczania ich iloczynów skalarnych, cosinusów kierunkowych, <b>kątów α, β, γ, nachylenia wektora wynikowego względem osi X, Y, Z.
</b>
Wrzucam kod:
program podstawy;
USES CRT;
TYPE
Twektor=record
x : integer;
y : integer;
z : integer;
END;
VAR
wek: array[1..5] of Twektor;
wek_h: array[1..2] of Twektor;
k,l,m,n,o:integer;
p,i,r:byte;
a:char;
PROCEDURE czyt_dane;
BEGIN
writeln('Wprowadz liczbe wektorow <1-5>:');
readln(p);
writeln;
IF (p>=1)AND(p<=5) THEN
BEGIN
FOR i:=1 TO p DO
BEGIN
writeln('Wprowadz wspolrzedna x dla wektora ',i);
readln(k);
wek.x:=k;
writeln('Wprowadz wspolrzedna y dla wektora ',i);
readln(l);
wek.y:=l;
writeln('Wprowadz wspolrzedna z dla wektora ',i);
readln(m);
wek.z:=m;
writeln;
END;
END
ELSE writeln('Liczba wektorow musi byc liczba z przedzialu <1-5>!');
END;
PROCEDURE wyb_wek;
BEGIN
writeln('Program wykona wzkazane dzialanie tylko na dwoch wybranych wektorach.');
writeln('Wprowadz numer pierwszego wektora:');
readln(n);
IF (n>=1)AND(n<=p) THEN
BEGIN
wek_h[1]:=wek[n];
writeln('Wprowadz numer drugiego wektora:');
readln(o);
writeln;
IF (o>=1)AND(o<=p) THEN wek_h[2]:=wek[o]
ELSE writeln('Numer wektora musi byc liczba z przedzialu <1-',p,'>!');
writeln;
END
ELSE writeln('Numer wektora musi byc liczba naturalna z przedzialu <1-',p,'>!');
END;
FUNCTION dod_wek:integer;
VAR
suma_x,suma_y,suma_z:integer;
BEGIN
suma_x:=wek_h[1].x + wek_h[2].x;
suma_y:=wek_h[1].y + wek_h[2].y;
suma_z:=wek_h[1].z + wek_h[2].z;
writeln('Postac wektora wypadkowego sumy wektorow:',suma_x,'i + ',suma_y,'j + ',suma_z,'k');
END;
FUNCTION od_wek:integer;
VAR
roz_x,roz_y,roz_z:integer;
BEGIN
roz_x:=wek_h[1].x - wek_h[2].x;
roz_y:=wek_h[1].y - wek_h[2].y;
roz_z:=wek_h[1].z - wek_h[2].z;
writeln('Postać wektora wypadkowego roznicy wektorow:',roz_x,'i + ',roz_y,'j + ',roz_z,'k');
END;
FUNCTION ilocz_wek:integer;
VAR
ilocz_x,ilocz_y,ilocz_z:integer;
BEGIN
ilocz_x:=wek_h[1].x*wek_h[2].x;
ilocz_y:=wek_h[1].y*wek_h[2].y;
ilocz_z:=wek_h[1].z*wek_h[2].z;
writeln('Postać iloczynu skalarnego wektorow:',ilocz_x,'i + ',ilocz_y,'j + ',ilocz_z,'k');
END;
FUNCTION cos_k:real;
VAR
wyp_x,wyp_y,wyp_z:integer;
cos_x,cos_y,cos_z,alfa,beta,gama,modul:real;
BEGIN
wyp_x:=wek_h[1].x + wek_h[2].x;
wyp_y:=wek_h[1].y + wek_h[2].y;
wyp_z:=wek_h[1].z + wek_h[2].z;
modul:=sqrt(sqr(wyp_x)+sqr(wyp_y)+sqr(wyp_z));
IF modul<>0 THEN
BEGIN
cos_x:=wyp_x/modul;
cos_y:=wyp_y/modul;
cos_z:=wyp_z/modul;
writeln('Cosinus kierunkowy skladowej x wektora wypadkowego wynosi:',cos_x:6:3);
writeln('Cosinus kierunkowy skladowej y wektora wypadkowego wynosi:',cos_y:6:3);
writeln('Cosinus kierunkowy skladowej z wektora wypadkowego wynosi:',cos_z:6:3);
END
ELSE writeln('Wypadkowy wektor jest wetorem zerowym!');
END;
PROCEDURE wybor;
BEGIN
writeln('Wybierz nr. dzialania <1-4>');
writeln('1 - Dodawanie');
writeln('2 - Odejmowanie');
writeln('3 - Iloczyn skalarny');
writeln('4 - Wyznaczanie cosinusow kierunkowych oraz katow nachylenia do osi OX, OY i OZ');
readln(r);
IF r=1 THEN dod_wek;
IF r=2 THEN od_wek;
IF r=3 THEN ilocz_wek;
IF r=4 THEN cos_k;
writeln;
END;
BEGIN
czyt_dane;
IF (p>=1)AND(p<=5) THEN
BEGIN
REPEAT
clrscr;
wyb_wek;
IF ((n>=1)AND(n<=p))AND((o>=1)AND(o<=p)) THEN wybor;
writeln;
writeln('Jezeli chcesz wykonac jakies dzialanie ponownie, wcisnij " T ", w przeciwnym wypadku wcicnij "N".');
readln(a);
writeln;
UNTIL (a='N')OR(a='p');
END;
readln;
END.
A teraz problemy:
1) Jak ruszyć te kąty nachylenia? Czy ktoś mógłby coś dopisać??
2) Jażeli program poprosi o wybór dwóch wektorów na których mają przeprowadzone być działania a użytkownik wprowadzi niepoprawne cyfry zostanie wyświetlony komunikat :"Numer wektora musi byc liczba naturalna z przedzialu <1-',p,'>!" ale wypadało by wtedy zeby program wykonywał jakąś pętle i ponownie prosił o wskazania wektorów...No własnie jak to zrobić???
NIE WIEDZIAŁEM JAKĄ KATEGORIĘ WYBRAĆ !!
nagytow [ Firestarter ]
1. To czysta matematyka - znajdz wzory na te katy i po prostu zapisz w pascalu.
2. Zamknij czytanie liczby wektorow w repeat ... until (n>=1) and (n<=5).
mooris [ Konsul ]
Najgorsze jest t,o że wzory znam i wiem jak to wyliczyć na papierze ale barierą dla mnie jest właśnie kod. Nie jestem biegły w te klocki ale próbowałem oczywiście (co widać po tym do czego udało mi się dojść). Niestety teraz ściana..