[megoldva]Loop probléma, kezdő

 ( Rackshee | 2009. június 15., hétfő - 21:05 )

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.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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.

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

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.

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.

Nem változtatom meg "m" értékét a ciklusban.

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

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

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.

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.

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.

Egy pillanat. Utánanézek mi az a pastebin. :) (blush)

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#

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!

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++;
}

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

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.

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.

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.

mit modellezel?

Kromatográfiás folyamatokat.
Ez egy egyelőre születőben levő kód. Én is folyamatosan tanulok.