Sziasztok!
Nem vagyok gyakorlott programozó, ezért lehet, hogy hülye lesz a kérdésem. Miért van az, hogy ha írok egy hurkot, amiben van egy változó (m), aminek minden ciklus során növekszik eggyel az értke, akkor az alábbi két ciklus különböző eredményt ad?
-------------------------------
m=1;
while (feltétel) {
...
műveletek
...
m++;}
-------------------------------
ill.
-------------------------------
m=0;
while (feltétel) {
m++;
...
műveletek
...}
-------------------------------
Az "m" változónak szerepe van a számítások során. Az inkrementálás vagy az összes művelet előtt vagy azok után történik, tehát ilyen módon nem érinti a számításokat. A feltételnek nincs köze "m" értékéhez. Ha kézzel vezetem le a ciklusbeli számításokat, akkor nincs különbség. Valójában mégis van. Miért?
Remélem viszonylag értelmesen fogalmaztam meg a kérdésemet.
- 1118 megtekintés
Hozzászólások
az első résznél m=1, a másiknál m=0 t adtál meg. Ezért ;)
A ciklusok belesje így is úgy is lefut, a while résznél értékelődik ki a feltétel, szóval a ciklus belsejében mindegy hogy előbb van-e az m++ vagy később.
- A hozzászóláshoz be kell jelentkezni
Szerintem nem erted. :)
Azert volt erdekes, hogy a 2. esetben elobb van m++ es utana a muveletek, mivel igy a legelso ciklusban 1. esetben m=1 amikor a szamitasokhoz er, a 2. esetben meg 0+1 amikor a szamitasokhoz er. Igy erte el tehat, hogy a szamitasokban mar tenyleg ugyanaz az m ertek legyen a ciklusok i. lepeseiben.
Engem inkabb az erdekel, hogy mit jelent az, hogy "mas eredmenyre jut".
- A hozzászóláshoz be kell jelentkezni
Köszi a helyreigazítást. Jól látod a problémámat.
A "más eredményre jut" azt jelenti, hogy az egyik esetben lefut a számítás, a mátrixom tele van számokkal ("m" segítségével rendelek értékeket a mátrix egyes elemeihez), míg a másik esetben csak nullák vannak a mátrixban. És kizárólag az "m" kezdeti értékét ill. az inkrementálás helyét változtatom meg.
- A hozzászóláshoz be kell jelentkezni
idézet: "Az "m" változónak szerepe van a számítások során."
Ez ok. Használod az m-et, vagy meg is változtatod az értékét? Úgy már nem mindegy persze. Ha pl. a számításokban van egy m--; akkor számít.
idézet: "A feltételnek nincs köze "m" értékéhez."
Attól függetlenül ha megnézed, a while sornál különbség van a két m érték között. Ha a cikluson belül ugyanúgy változtatod meg -és ezért ha a különbság megmarad- akkor a kilépéskor is megmarad a különbség.
Természetesen pontosabb leírás kellene.
- A hozzászóláshoz be kell jelentkezni
Nem változtatom meg "m" értékét a ciklusban.
- A hozzászóláshoz be kell jelentkezni
A topic indító szerintem nem a számítások közbeni m érték különbségére kíváncsi, hanem a ciklusból való kilépéskor fennmaradó különbségre.
Ha megnézed, akkor a ciklus mag végig lefut a kilépés előtt. Azt meg nem írta, hogy mit csinál közben m értékével. Találgatni persze lehet :)
- A hozzászóláshoz be kell jelentkezni
Ha a feltetelben es a "muveletek" kozott nincs hivatkozas m-re es a "muveletek" koztott nincs elrejtve egy ciklusvezerles (break, continue), akkor ugyanazt kellene adnia. felteve persze hogy az m=...; ertekadas is ugyanaz mindket ciklus elott :]
illetve persze lehet elbujtatva is:
int *p,m;
p=&m;
m=0;
while ( m<10 )
{ ...
(*p)=...;
...
m++;
}
ebben az esetben persze nem mindegy, hogy mi a sorrend a valtozo novelese es a "muveletek" kozott.
A.
- A hozzászóláshoz be kell jelentkezni
A feltételben nincs hivatkozás az "m"-re. A műveletekben közvetve van, ugyanis "m" segítségével rendelek egy mátrix egyes elemeihez értéket (egyébként másodfokú parciális diff. egyenletet számítok). A műveletek között nincs break sem és continue sem.
Köszönöm a választ. Bogarászom még a kódot.
- A hozzászóláshoz be kell jelentkezni
Egyszerubb lenne ha elarulnad a titkot.. :) Mi a feltetel es mik a muveletek?
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.
- A hozzászóláshoz be kell jelentkezni
Differenciál egyenletet oldok meg numerikusan. A feltétel, hogy az aktuális pozíció (l) ne legyen nagyobb, mint a csőreaktor hossza, azaz "while (l<=L)". l minden ciklus során növekszik dz-vel (aminek értéke változhat). A ciklusban egy vegyület két különböző formájának koncentrációját számolom. Az "m"-mel semmi mást nem csinálok, mint egy mátrix "m"-edik sorához értékeket rendelek.
- A hozzászóláshoz be kell jelentkezni
kod? pastebin?
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.
- A hozzászóláshoz be kell jelentkezni
Egy pillanat. Utánanézek mi az a pastebin. :) (blush)
- A hozzászóláshoz be kell jelentkezni
A pastebin.com oldalon feltöltöttem a kódot Rackshee néven. Ebben a formában nem működik. Ha a 86. sorban levő m=0 helyett m=1-et írok, ill. a 130. sort a 90. helyére írom, akkor megy.
Frissítés: http://pastebin.com/m625be2c3#
- A hozzászóláshoz be kell jelentkezni
Biztos a fordító optimalizál... :) Csak rosszul :)
Ez legalább olyan, mint amit én tapasztaltam anno delphiben.
Egy eseménybe van egy for ciklus(Button1Click, tök mind1), menjen i 1-től 50-ig.
Ha i-t globálisként deklarálod, akkor normálisan 1-től 50-ig megy. Ha lokálisként, az eseménynél, akkor pl. visszafele megy a ciklus. 50, 49, 48... Ha teszel egy breakpointot a ciklus belsejébe, ahol meg tudod nézni az i-t, akkor gyönyörűen látszik.
Annyit sikerült megfigyelni, hogy talán csak akkor teszi ezt, ha mindegy melyik irányból járod be. Ha nem mindegy, vagy pl. kiíratod az i értékét, akkor így is előrefele megy.
--
Discover It - Have a lot of fun!
- A hozzászóláshoz be kell jelentkezni
Szerintem mivel m segitsegevel helyezel el adatokat a matrixban igy nagyon nem mindegy hogy a muveletek elvegzese soran hova szurod be az adatokat a matrixba...utana gondolom felhasznalod a matrix elemeit tovabbi szamitasokhoz.
Remelem ertheto mire gondoltam, de itt egy pelda:
ebben az esetben a matrix 0ik sora ures lesz
m=0;
while(feltetel)
{
m++;
matrix[m,x] = ... //x <- [0..m]
...
}
ebben meg nem
m=0;
while(feltetel)
{
matrix[m,x] = ... //x <- [0..m]
...
m++;
}
- A hozzászóláshoz be kell jelentkezni
Értem. Ezek szerint a kódomban nincs a mátrixnak nulladik eleme (nagyon kezdő vagyok). Azt hiszem ez nem igazán baj. Egyébként egyik esetben sincs, mert a második eseted nálam abban különbözik, hogy "m=1;"-gyel indítok.
- A hozzászóláshoz be kell jelentkezni
ha m a sort jeloli akkor szerintem neked igy nez ki a matrixod ha nem a ciklus elejen novelsz es a cikluson belul felhasznalod a matrix valamely elemet amely m-tol fugg
pl: 4x4 matrix a betuk tetszoleges ertekeket jelonek
0 0 0 0
x y z a
v g r t
q w f m
ha a ciklus elejen noveled az m-et akkor csupa 0 lesz a martrixodban, persze csak akkor ha m segitsegevel hivatkozol a matrix egy elemere.
0 0 0 0
0 0 0 0 <- noveles miatt mar ez a sor is csupa 0
0 0 0 0
0 0 0 0 <- a tobbi is 0
mivel felhasznalod a pl: a matrix[3,1] = szamtas ahol hivatkozol matrix[2,x]-re =, ami 0
Felteteleztem hogy Matlab-ban dolgozol es a matrix csupa 0 van inicializalava.
Remelem ertheto mire gondolok hogy a kulonbseget adhatja.
- A hozzászóláshoz be kell jelentkezni
Ahogy fentebb is írtam, az a gond, hogy a ciklusból való kilépésnél más lesz az m értéke.
Átnéztem a pastebin-es kódot, ki-grep-peltem color-ral az m-et, és ahogy látom a műveleteknél csak felhasználod, az értékén nem változtatsz (csak a végén az m++ -szal).
Viszont a ciklusból kilépve a továbbiakban használod az m értékét értékadás nélkül:
...
...
m++;
}
tt[i]=(i+.5)*dt;
xx[i]=x[m][0];
...
...
De mivel a topic indítási leírásod alapján más a kilépéskori értéke az m-nek, ezért a továbbiakban más értékkel számolsz.
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Órákat töltöttem már el ezzel. Csak a cikluson belül gondolkodtam. Fontos dologra hívtad fel a figyelmemet. Köszi mégegyszer neked is és mindenkinek.
- A hozzászóláshoz be kell jelentkezni
mit modellezel?
- A hozzászóláshoz be kell jelentkezni
Kromatográfiás folyamatokat.
Ez egy egyelőre születőben levő kód. Én is folyamatosan tanulok.
- A hozzászóláshoz be kell jelentkezni