Személyes eszközök
Keresés

 

A InfoWiki wikiből

(Változatok közti eltérés)
45. sor: 45. sor:
 +
= FOR fejrésze =
 +
 +
A ''for'' ciklus fejrésze három részre osztható, melyeket kettő darab pontosvessző határol. A részek szerepe:
 +
* az inicializáló utasítás (mely a ciklus kezdetekor egyszer hajtódik végre
 +
* a ciklus vezérlő feltétele (pozitív vezérlésű a for ciklus)
 +
* a léptető utasítás (mely a ciklusmag lefutása után automatikusan kerül végrehajtásra)
 +
 +
Példa:
 +
 +
<code lang="csharp">
 +
for(int i=0; i<10; i++)
 +
{
 +
  Console.Write(i);
 +
}
 +
</code>
 +
 +
A fenti példa teljesen megfelel a korábban ismertetet while ciklus példában szereplő kód működésével. Az
 +
''i'' változó azonban itt a ciklusra lokális, tehát a for ciklus törzsén túl már nem terjed a hatásköre.
 +
A ciklusmag minden lefutása után végrehajtódik az inkrementáló utasítás, vagyis az ''i'' értéke nő 1-el.
 +
 +
A példában szereplő for ciklus fejrészében minden információ szerepel, melyből meghatározható, hogy
 +
ez a for ciklus pontosan 10-szer fog lefutni. A ciklusmagban az ''i'' változó értéke kiolvasható,
 +
de megváltoztatása tilos. Ennek oka, hogy az ''i'' változó értékének átírása a pontos 10 ismétlést
 +
módosítaná (vagy kevesebbszer, vagy többször kerülne végrehajtásra).
 +
 +
<box type="warn">A ciklusváltozó ciklusmagon belüli módosítása nem szintaktikai, hanem elvi hiba. A fordító
 +
eltűri, de ezen tevékenység ellentmond a for ciklus lényegének. Akinek ilyenre van szüksége, az használjon
 +
while ciklust.</box>
 +
 +
= Példa =
 +
 +
Hibás tehát az alábbi példa (bár nem szintaktikailag, hanem elvi, stílusbeli hiba). A programban
 +
a 10 elemű tömböt csak pozitív számokkal kívánjuk feltölteni. Amennyiben a program kezelője valamely
 +
elem értékének negatív számot kíván megadni, azt az elemet újra bekérjük:
 +
 +
<code lang="csharp">
 +
int[] tomb = new tomb[10];
 +
for(int i=0;i<10;i++)
 +
{
 +
  Console.Write("{0}. szám értéke:");
 +
  tomb[i] = int.Parse(Console.ReadLine());
 +
  if (tomb[i]<0) i--;
 +
}
 +
</code>
 +
 +
A feltételben az ''i--'' utasítás az ''i'' értékét csökkenti 1-el, amit
 +
az inkrementáló utasítás (''i++'') meg fog növelni 1-el. E miatt negatív
 +
szám beírása esetén az ''i'' értéke gyakorlatilag nem fog változni - a ciklus
 +
következő lefutásakor is ugyanazon ''i'' tömbelem kerül feltöltésre.
 +
 +
Ez elegánsabban megoldható while ciklussal:
 +
 +
<code lang="csharp">
 +
int[] tomb = new tomb[10];
 +
int i=0;
 +
while (i<10)
 +
{
 +
  Console.Write("{0}. szám értéke:");
 +
  tomb[i] = int.Parse(Console.ReadLine());
 +
  if (tomb[i]>0) i++;
 +
}
 +
</code>
 +
 +
Vagyis csak akkor lépünk a következő tömbelem bekérésére, ha ezen tömbelemmel
 +
elégedettek vagyunk.
 +
 +
Másik lehetséges megoldás:
 +
 +
 +
<code lang="csharp">
 +
int[] tomb = new tomb[10];
 +
for(int i=0;i<10;i++)
 +
{
 +
  do
 +
  {
 +
    Console.Write("{0}. szám értéke:");
 +
    tomb[i] = int.Parse(Console.ReadLine());
 +
  }
 +
  while (tomb[i]<0);
 +
}
 +
</code>
 +
 +
Ez esteben az ''i''-edik tömbelem bekérésől addig nem lépünk tovább, amíg
 +
annak értékével elégedettek nem vagyunk.
<alairas>Hernyák Zoltán</alairas>
<alairas>Hernyák Zoltán</alairas>
__NOTOC__
__NOTOC__

A lap 2009. november 14., 19:18-kori változata


Előírt lépésszámú ciklusok

Tekintsük meg az alábbi kódot:

int i=0;
while (i<10)
{
  ...
  i++;
}

A fenti while ciklus a ciklusmagját 10-szer fogja végrehajtani, mivel az i változó induló értéke 0, minden menetben az i értéke pontosan 1-el nő, és akkor fogja elhagyni a ciklust, ha az i értéke elérte (vagy meghaladta) a 10 értéket.

Gyakoriak azok az esetek, amikor előre ismert, hogy a ciklusmag hányszor kerül majd végrehajtásra. Ez esetben a fentihez hasonló while ciklus alkalmazható, de nem túl szerencsés az alkalmazása. Az információk, amelyből a kiderül, hogy ez a ciklus 10-szer ismétlődik majd - a kódban szétszórtan helyezkedik el. Ráadásul az i változó deklarációja meg kell előzze a while ciklus indulását, így hatásköre (és az élettartama) nem a ciklusra korlátozódik, hanem a ciklus lefutása után is megmarad.

A fenti problémák kezelésére speciális ciklusfajta szolgál, a for ciklus.

A FOR ciklus akkor alkalmazható, ha a ciklus futása előre ismert darabszámú, mely darabszám

a ciklus indításakor már kiszámolható, és később sem változik. Ha a ciklus futási darabszáma nem előre kiszámítható,

vagy esetleg az változhat, akkor inkább WHILE ciklust kell alklamazni.


FOR fejrésze

A for ciklus fejrésze három részre osztható, melyeket kettő darab pontosvessző határol. A részek szerepe:

  • az inicializáló utasítás (mely a ciklus kezdetekor egyszer hajtódik végre
  • a ciklus vezérlő feltétele (pozitív vezérlésű a for ciklus)
  • a léptető utasítás (mely a ciklusmag lefutása után automatikusan kerül végrehajtásra)

Példa:

for(int i=0; i<10; i++)
{
  Console.Write(i);
}

A fenti példa teljesen megfelel a korábban ismertetet while ciklus példában szereplő kód működésével. Az i változó azonban itt a ciklusra lokális, tehát a for ciklus törzsén túl már nem terjed a hatásköre. A ciklusmag minden lefutása után végrehajtódik az inkrementáló utasítás, vagyis az i értéke nő 1-el.

A példában szereplő for ciklus fejrészében minden információ szerepel, melyből meghatározható, hogy ez a for ciklus pontosan 10-szer fog lefutni. A ciklusmagban az i változó értéke kiolvasható, de megváltoztatása tilos. Ennek oka, hogy az i változó értékének átírása a pontos 10 ismétlést módosítaná (vagy kevesebbszer, vagy többször kerülne végrehajtásra).

A ciklusváltozó ciklusmagon belüli módosítása nem szintaktikai, hanem elvi hiba. A fordító

eltűri, de ezen tevékenység ellentmond a for ciklus lényegének. Akinek ilyenre van szüksége, az használjon

while ciklust.


Példa

Hibás tehát az alábbi példa (bár nem szintaktikailag, hanem elvi, stílusbeli hiba). A programban a 10 elemű tömböt csak pozitív számokkal kívánjuk feltölteni. Amennyiben a program kezelője valamely elem értékének negatív számot kíván megadni, azt az elemet újra bekérjük:

int[] tomb = new tomb[10];
for(int i=0;i<10;i++)
{
  Console.Write("{0}. szám értéke:");
  tomb[i] = int.Parse(Console.ReadLine());
  if (tomb[i]<0) i--;
}

A feltételben az i-- utasítás az i értékét csökkenti 1-el, amit az inkrementáló utasítás (i++) meg fog növelni 1-el. E miatt negatív szám beírása esetén az i értéke gyakorlatilag nem fog változni - a ciklus következő lefutásakor is ugyanazon i tömbelem kerül feltöltésre.

Ez elegánsabban megoldható while ciklussal:

int[] tomb = new tomb[10];
int i=0;
while (i<10)
{
  Console.Write("{0}. szám értéke:");
  tomb[i] = int.Parse(Console.ReadLine());
  if (tomb[i]>0) i++;
}

Vagyis csak akkor lépünk a következő tömbelem bekérésére, ha ezen tömbelemmel elégedettek vagyunk.

Másik lehetséges megoldás:


int[] tomb = new tomb[10];
for(int i=0;i<10;i++)
{
  do
  {
    Console.Write("{0}. szám értéke:");
    tomb[i] = int.Parse(Console.ReadLine());
  } 
  while (tomb[i]<0);
}

Ez esteben az i-edik tömbelem bekérésől addig nem lépünk tovább, amíg annak értékével elégedettek nem vagyunk.

Hernyák Zoltán
A lap eredeti címe: „http://wiki.ektf.hu/wiki/Mp1/page320
Nézetek
nincs sb_18.223.196.59 cikk