wskazówki do zada« do samodzielnegorozwi¡zania, 13.03.2020
Zadania59zlistyIdoty z¡u»y iatabli jakoparametrówfunk ji.Ró»ni awstosunkudozwykªy hzmien-
ny h polega natym, »e zmienne tabli owes¡ wgrun ie rze zywska¹nikami i tak te» s¡ przekazywanejako
parametryfunk ji. Deklara je
int T[10℄;
double X[20℄;
rezerwuj¡zmienneTiXtypu wska¹nikanaintidouble,nadaj¡ imwarto±¢po z¡tkowegoadresuprzydzie-
lonegodlani hspójnegoobszarupami iorozmiarze10- iu zterobajtowy hli zb aªkowity hiodpowiednio
20-tuo±miobajtowy hli zbzmiennopozy yjny hpodwójnejpre yzji.
Deklara je
int *T;
double *X;
rezerwuj¡dokªadnietakiesamezmienneTiXzt¡ró»ni ¡,»enienadaj¡im»adnejwarto± i.Poznamypó¹niej
metodydynami znej rezerwa jitabli ,gdyadresy iwielko± i potrzebny h obszarówobli zanes¡ inadawane
zmiennym T i X ju» w trak ie dziaªania programu, a ponadto wielko± i tabli mog¡ by¢w dowolnej hwili
zmieniane.
Odwoªaniadoelementówtabli T[0℄, T[2℄, X[2℄, X[k+1℄ itp.s¡ równowa»neopera jom wyªuskania
wska¹nika(odpowiedniopokolei) *T, *(T+2), *(X+2)i*(X+k+1).Wartozauwa»y¢,»epro esprzesuwania
wska¹nikanp.o2miejs a*(T+2)i*(X+2)uwzgldniaautomaty znierozmiarelementutabli y.Wpierwszym
przypadku wska¹nik T przesuwany jest o 2*4 bajty dalej, w drugim X przesuwany jest o 2*8 bajtów do
wªa± iwegoelementutabli y.
U»y ie tabli jednowymiarowy h jakoparametrów funk ji
Wdeklara jinagªówkafunk ji mo»emyrównowa»nienapisa¢
int F(int S[10℄, double Y[20℄, ...)
int F(int S[℄, double Y[℄, ...) lub
int F(int *S, double *X, ...).
Wka»dymzty hprzypadkówpod zaswywoªaniafunk jiFprzekazywanyjestdoniejadres tabli y,dlaktórej
Fjestwywoªywana,np.F(T,X,...):
Wtre± i funk ji odwoªujemysidoelementówtabli przez S[i℄lubrównowa»nieprzez *(S+i).Niezale»nie
niaprogramu.Funk janie znarozmiarutabli y,którajestjejparametrem.Je±limaonaprzetwarza¢tabli e
ró»ny hrozmiarów,rozs¡dnysposóboperowaniaparametramitabli owymijestnastpuj¡ y:
int F(int S[℄, double Y[℄, int m, int n, ...),
gdzie m, n s¡parametramiprzekazuj¡ ymiwielko± i odpowiedni h tabli . Wywoªanie dlatej funk ji wygl¡-
daªobynp.tak: F(T, X, 10, 20,...)
Tabli e odwó h(lub wi ej)wska¹nika h
Deklara jatabli y
int C[10℄[15℄
jestrealizowanajako10- ioelementowatabli awska¹nikówna15-toelementowewiersze zylijakotabli a
tabli .Równowa»niemo»na napisa¢
int *C[10℄,
przy zymtuka»demuwska¹nikowiC[i℄trzebabyªobydopieror znienada¢warto±¢adresu15-toelemen-
towegoblokuli zb alkowity h
U»y ietakiejtabli y wfunk ji jakoparametruozale»ny hodwywoªaniarozmiara hmo»nazrealizowa¢tak:
int F(int m, int n, int A[℄[n℄, ...)
przy zymparametrnmusipoprzedza¢wnagªówkuFodwoªaniedoniegowint A[℄[n℄.Wywoªanietejfun ji
tonp. F(10, 15, C, ...).
Wskazówki
Wzad.8mamytabli zadeklarowan¡np.jako
int A[1000℄,
wktórejelementyA[1℄, ... A[n℄zawieraj¡danedoposortowania.Li zbaty hdany hnniejestzgóryznana
(jestokre±lanawtrak iedziaªaniaprogramu,np.pod zas zytaniaty hdany h)ipoustaleniuprze howywana
jestwsamejtabli y jakoA[0℄.W tensposób wystar zyprzekaza¢ samparametrAdofunk ji sortuj¡ ejbez
konie zno± ipodawaniajejosobnegoparametruzaktualnymrozmiaremsortowany hdany h.
Zad. 9jesttro h bardziej zaso hªonne. Nale»yzaprogramowa¢je tak, byfunk jedziaªaªy dlaukªadów
ró»nejwielko± in.Ma ierzzewspóª zynnikamiukªadudeklarujemynawyrost jakonp.
float A[30℄[31℄
iwykorzystujemytylkopewn¡ jej z±¢A[n℄[n+1℄zale»nieodwielko± irozwi¡zywanegoukªadu.A[i℄[j℄to
wspóª zynnik stoj¡ yprzy zmiennej
x j
w i-tym równaniu (j=0,1,..., n-1),ali zba zostatniej kolumny A[i℄[n℄toprawastronarównania.Musi iePa«stwoprzypomnie¢sobiemetodelimina jiGaussazwykªaduzalgebry.Mo»nate»znale¹¢wiele
materiaªównatentematwsie i,np.https://e.kul.pl/files/10382/publi /aan_w6_1819_1.pdf.W za-
daniu hodziozastosowaniemodyka jiogólnejmetodyGaussanazywanej z± iowym wyboremelementu
gªównego której elemjest unikanie dzieleniaprzez maªeli zby, botakie dziaªania wprowadzaj¡na ogóª
ta polega na tym, »ebydoelimina ji zmiennej
x i
z kolejny h równa«o numera hi+1,...,n-1u»y¢tegoz ni h,wktórymx i
manajwikszy odowarto± ibezwzgldnejwspóª zynnikA[k][i] = max j=i,...,n−1
A[j][i]
.
To jest wªa±nie ten element gªówny. Zamieniamy wów zas miejs ami równanie i-te z k-tym ( o o zywi± ie
niewpªywanarozwi¡zanieukªadu!) zamieniaj¡ wma ierzyA wierszeiorazk.Teraz,eliminuj¡ zrówna«
i+1,...,n-1zmienn¡
x i
,dodajemydoni h stosownewielokrotno± irównaniai-tego,aprzyi hobli zaniu wykonujemydzieleniaprzezA[i℄[i℄,którepowykonanejprzed hwil¡zamianiemaju» najwiksz¡dostpn¡wnaszymukªadziewarto±¢.
Wybórelementugªównegojesttu z± iowy,bomaksymalnegoA[k℄[i℄szukamyjedyniewi-tejkolumnie
w±ród li zb A[i℄[i℄, A[i+1℄[i℄,..., A[n-1℄[i℄. Peªny wybór polega na szukaniu maksymalnego o
do moduªu wspóª zynnika A[k℄[m℄ w aªej podma ierzy k,m=i,i+1,...,n-1i modykuje A zamieniaj¡
tak»e kolumn i-t¡ z m-t¡, tak by nowym elementem A[i℄[i℄ staª si wªa±nie element gªówny A[k℄[m℄.
Zamianakolumn dziaªatak jakgdyb±my zamienilirolamizmienne
x i
ix m
,a wi przystosowaniu peªnegowyborutrzebarejestrowa¢wszystkiezamianykolumn,bynako« uprzywró i¢pierwotn¡numera jzmienny h
x 0 , ..., x n−1
.Naszezadanierealizowa¢majednaktylko z± iowywybór.Rozwi¡zanie bdzie zna znie ªatwiejsze, je±li zastosuje ie Pa«stwo strategi programowania strukturalnego,
dziel¡ algorytmnafunk jewykonuj¡ eposz zególnekrokiobli zeniowe.Mo»nanaprzykªadzaprogramowa¢
kolejnonastpuj¡ efunk je:
•
void zytaj(int n, float A[℄[n+1℄) w zytuj¡ ¡wspóª zynnikiukªadu(nmo»napobra¢zwej± iaw ze-±niej)
•
int glowny(int n, int i, float A[℄[n+1℄) zwra aj¡ ¡jakowarto±¢nrrównaniak,wktórymznalezionoelementgªównyA[k℄[i℄
•
void zamien(int n, int i, int k, float A[℄[n+1℄) zamieniaj¡ ¡miejs amielementywierszyiorazk•
void eliminuj(int n, int i, float A[℄[n+1℄) dokonuj¡ ¡elimina jizmiennejx i
zrówna«i+1,...n-1, zyliprzeksztaª aj¡ ¡ma ierzAtak,abyA[i+1℄[i℄=A[i+2℄[i℄=...=A[n-1℄[i℄=0.Wartoprzyokazjispraw-dza¢ pod zas wyzna zania nowy h warto± i wspóª zynników A[k℄[m℄ zy który± z ni h nie staª si bardzo
maªy (por. pole enie w zad. 9), np.
A[k][m]
< 10 − 6
, a wi porównywalnyz naturalnym poziomem bªdu zaokr¡gleniawarytmety eli zbfloat.Wów zasmo»na nada¢muwarto±¢0.•
int rozwiazanie(int n, float A[℄[n+1℄, float x[n℄) wyzna zaj¡ ¡rozwi¡zaniex[0℄,...,x[n-1℄na podstawiedany hwma ierzyukªaduAdoprowadzonejdoposta itrójk¡tnej.Dodatkowowarto±¢intzwra anaprzezt¡funk jmo»esygnalizowa¢ zyukªadjestniezale»ny(wó zasx[i℄zawierarozwi¡zanie),zale»ny, zy