GRY-Online.pl --> Archiwum Forum

zadanie w matlabie.potrzebna pilna pomoc - PLEASE!!

17.01.2003
02:22
[1]

mallekith [ Centurion ]

zadanie w matlabie.potrzebna pilna pomoc - PLEASE!!

taka tresc zadania:
Napisać M-funkcję przelicz(x,...) (o zmiennej liczbie argumentów), realizującą następujące zagadnienie: podaną liczbę całkowitą "małych jednostek" przetworzyć na jej słowne określenie z uwzględnieniem "większych jednostek". Przykład: argument 3287621 powinien generować napis '32 km 876 m 21 cm', argument 300001 - napis '3 km 1 cm', argument 23254 - napis '232 m 54 cm' itd. Funkcja powinna pozwalać na następujące sposoby wywołania:
przelicz(x) - interpretuje x jako liczbę centymetrów i oddaje łańcuch jak w zagadnieniu wyżej.
przelicz(x, Nazwa_1, Wartosc_1, Nazwa_2, Wartosc_2,..'Nazwa_n') interpretuje x jako liczbę jednostek wymienionych w ostatniej nazwie i wyświetla napis jak wyżej, używając odpowiednich nazw i przeliczników;
znaczenie parametrów: jednostka o nazwie Nazwa_1 zawiera Wartosc_1 jednostek o nazwie Nazwa_2 i tak dalej (np. "km" ma 1000 "metrów", a "metr" ma 100 "cm"); oczywiście ostatni parametr łańcuchowy "nie ma pary";
przykłady:
(przeliczanie cali na jardy, stopy i cale):
przelicz(20, 'yd', 3, 'ft', 12, 'in') = '1 ft 8 in' (bo 20 = 0*36+1*12+8)
przelicz(50, 'yd', 3, 'ft', 12, 'in') = '1 yd 1 ft 1 in' (bo 50 = 1*36 +1*12+2)
(przeliczanie gramów na tony, kilogramy, dekagramy i gramy):
przelicz(1024347, 't', 1000, 'kg', 100, 'dag', 10, 'g') = '1 t 24 kg 34 dag 7 g'
wg tej konwencji (patrz pkt a):
przelicz(x) = przelicz(x, 'km', 1000, 'm', 100, 'cm');






a oto przykladowy program (moze sie przydac):

%funkcja przeliczająca liczbę cm na kilometry, metry i centymetry
%i zwracająca wynik w postaci tekstu (bez zerowych wartości jednostek)
%program jest napisany tak, żeby można było łatwo przerobić go
%na inne systemy jednostek (np. cale, jardy i mile)
function y = przeliczcm(x);
y = '';
przeliczniki = [100 1000];%liczba cm w metrze i metrów w kilometrze
nazwy = ‹'km' 'm' 'cm'›;
if ~isequal(round(x),x)
error('Liczba nie jest całkowita');
end;
samecentymetry = rem(x,przeliczniki(1));
zostaje = fix(x./przeliczniki(1));
samemetry = rem(zostaje,przeliczniki(2));
zostaje = fix(zostaje./przeliczniki(2));
samekilometry = zostaje;
liczby = [samekilometry, samemetry, samecentymetry];
gdziezera = find(liczby == 0);
liczby(gdziezera) = [];
nazwy(gdziezera) = [];
if length(liczby) == 0
return
end;
for k = 1 : length(liczby)
y = [y, num2str(liczby(k)), ' ', nazwy‹k›, ' '];
end;




a oto rozwiazanie (to jest bledne, chociaz moze sie przydac):

function y=przelicz(varargin)
n=length(varargin);
dane=varargin‹1›;
if(n==0)
return
end
if (n==1)
m=floor(varargin‹1›/100);
cm=varargin‹1›-(m*100);
fprintf('po przeliczeniu mamy %d m %d cm\n',m,cm),
end
dod=0;
m=0;
fprintf('%d %s to: ',dane, varargin‹end›),
for k = 3:2:n
ile=varargin‹k›;
co=varargin‹k-1›;
m=floor(varargin‹1›/ile);
varargin‹1›=varargin‹1›-m*ile;
dod=dod+1;
podsum(1,dod)=m;
if(m~=0)
fprintf(' %d %s\n',m,co),
end
if(k==(n-1) & varargin‹1›~=0)
fprintf(' %d %s haha',varargin‹1›,varargin‹end›),
end
end



a oto jedno z mozliwych rozwiazan:

function przelicz(x,varargin)
format short
if nargin==1
alfa(3)=mod(x,100); x=fix(x/100);
alfa(2)=mod(x,1000);x=fix(x/1000);
alfa(1)=x;
beta=alfa;
var‹1›='km';var‹2›='m';var‹3›='cm';
else
var=varargin;
n=length(var)-1;j=1;
while n>0
alfa(j)=mod(x,var‹n›) ;
alfa(j+1)=x/var‹n›;x=fix(alfa(j+1));
n=n-2;j=j+1;
end
alfa(j)=x;
i=1;j=1;
while j<=length(var)
tmp_var‹i›=var‹j›;
i=i+1;j=j+2;
end
var=tmp_var;
q=length(alfa);
for i=1:q
beta(i)=alfa(q);
q=q-1;
end
end
for i=1:length(alfa)
if beta(i)~=0
fprintf(1,'%d %s ',beta(i),var‹i›);
end
end




no i problem polega na tym ze nie mam pojecia jak zrobic to zadanie dla podpunkyu b.
jezeli moglbys mi pomoc - bardzo cie prosze. z gory dziekuje.

17.01.2003
02:38
[2]

norbi071 [ Legionista ]

kurde kolego........ mam podobny prolem
hmmmmmmm
Napisać M-funkcję okręgi(x,y,r), która działa następująco:
Rysuje okrąg O o środku w punkcie (x,y) i promieniu r;
Ustawia osie układu tak, aby układ współrzędnych był prostokątem
[-2r, 2r] x [-2r, 2r]. (Użyj axis equal, aby okręgi wyglądały jak okręgi, a nie jak elipsy).
Czeka na kliknięcie myszą w dowolny punkt P układu współrzędnych (przypomnienie: funkcja ginput).
Rysuje okrąg o środku w punkcie P, styczny do okręgu O. (wewnętrznie lub zewnętrznie, w zależności od tego, gdzie się kliknęło)
Wraca do punktu c.
Może nie mieć profesjonalnej obsługi końca pracy (wystarczy Ctrl+C). Natomiast przy rysowaniu drugiego okręgu osie mają się nie zmieniać! Jeśli drugi okrąg nie mieści się cały na ekranie, to trudno.


Przestudiuj dokładnie przykład kulka.m i pobaw się nim. Następnie napisz skrypt odbijanie(alfa) (można pracować modyfikując odpowiednio sam przykład), który działa następująco:
Układ współrzędnych – jak w przykładzie; położenie startowe kulki – jak w przykładzie; zamykanie okna przez użytkownika - jak w przykładzie (klawisz ESC). (Na razie dostajesz punkty za darmo...).
Parametr alfa zawiera kąt początkowy, pod którym kulka zacznie się poruszać (w przykładzie ten kąt wynosi 60 stopni – jak to wyczytać z kodu?). Można założyć, że kąt alfa jest z przedziału [-pi/2, pi/2] (bo kulka i tak startuje z lewej ściany). Potrzebna wiedza: równania parametryczne prostej na płaszczyźnie i rozdział 0 z podręcznika trygonometrii.
Teraz właściwe zadanie: kulka ma się odbijać od ścian prostokąta wg prawa „kąt padania = kąt odbicia”. Jest to jedyny punkt, gdzie trzeba pomyśleć.
Uwaga. Zostawić klawisz ESC jako ten, który zatrzymuje program


[Wzór: przykład ambitnewykresy.m]. Napisać skrypt expsinusy, który kolejno:
Wyświetla okno graficzne, a w nim wykres funkcji
y = exp(-x/a).*sin(b*x)
dla a=10 i b=2 w przedziale [0,10*pi]. Układ współrzędnych ma zawierać tytuł „Wykres funkcji y = exp(-x/10).*sin(2*x)”.
Umieszcza w wyświetlonym oknie trzy przyciski działające następująco:
i. Pierwszy przycisk powoduje cykliczną zmianę wartości parametru a w zakresie od 10 do 30 skokiem co 10. Po każdej zmianie wykres funkcji i tytuł mają być odpowiednio zmodyfikowane (stary wykres zastąpiony przez nowy).

ii. Drugi przycisk powoduje cykliczną zmianę wartości parametru b w zakresie od 2 do 5. Po każdej zmianie wykres funkcji i tytuł mają być odpowiednio zmodyfikowane (stary wykres zastąpiony przez nowy).

iii. Trzeci przycisk zamyka okno graficzne

Uwaga. Zadanie to zostało tak pomyślane, aby do jego oprogramowania wystarczyło dokładne zrozumienie działania przykładu podanego jako wzór. Można wręcz zacząć od prób modyfikacji przykładu (byle robić to z głową).

Zapoznać się z działaniem funkcji Matlaba obliczających przybliżone wartości całki oznaczonej funkcji 1 zmiennej: quad i trapz. Napisać M-funkcję rysujcalke(f,a,b), która rysuje wykres funkcji F(x) będącej całką oznaczoną funkcji f od a do x, gdzie a<=x<=b.

Wskazówki. Rysowanie można przeprowadzić następująco. Funkcją linspace podzielić przedział [a,b] na n podprzedziałów In, tak jak to robimy szykując dane dla funkcji plot. Obliczyć za pomocą funkcji całkującej Matlaba całkę oznaczoną w każdym podprzedziale In. Niech całka na podprzedziale In wynosi Fn. Wartości funkcji pierwotnej, potrzebne do użycia funkcji plot można teraz otrzymać jako sumy częściowe ciągu ‹Fn› (przypominam funkcję cumsum). Takie podejście (zamiast całkowania w narastających przedziałach o lewych końcach równych a, a prawych x) znacznie przyspiesza działanie programu.
Zastosować funkcję napisaną w poprzednim zadaniu w programie porownaj, który wizualnie zilustruje nam dokładność naszego całkowania na jednym przykładzie. Program ma działać następująco:
Wywołuje funkcję napisaną w poprzednim zadaniu z parametrami
f(x) = 1/(1+x^2), a = -10, b = 10;
W uaktywnionym oknie graficznym dorysowuje wykres funkcji y = arctg(x) w innym kolorze.
prosze o odpowiedz tzn zrobienie zadan!!!!!!!!

© 2000-2025 GRY-OnLine S.A.