Atsikartojantis kodas (while
)
Pamokos turinys
- Prisimenam praeitą pamoką
while
raktinis žodisbreak
raktinis žodiscontinue
raktinis žodis
Pradinis kodas
Geriausia susikurti naują C# failą ir pavadinti Class4.cs
using UnityEngine;
using UnityEditor;
public class Class4 : MonoBehaviour {
[MenuItem("MyMenu/Class4")]
static void Main()
{
Debug.Log("Class4 Main()");
}
}
Ciklų pagrindai
Ciklai struktūriškai aprašomi panašiai kaip sąlyginis kodas su raktiniu žodžiu if
. Iš tiesų vienintelis skirtumas naudojant while
ir if
yra tai, kad baigus vykdyti kodo bloką (tarp skliaustelių { /* code */ }
), sąlyga yra vėl patikrinama, jeigu sąlyga teigiama (true
)- vykdomas kodas ir taip toliau.
Dažnai naudojamas terminas “begalinis ciklas” apibūdina situaciją, kai sąlyga niekad neįgauna neigiamos vertės (false
):
while(true)
{
Debug.Log("vėl ir "); // vėl ir vėl ir vėl...
}
Iš principo, kodas, vykdomas while
ciklo viduje turi pakeisti programos būseną (kol kas tik kintamuosius), kad tikrinama sąlyga ankščiau ar vėliau būtų neigiama (false
). Trumpai tariant kol kažkas (sąlyga), tol darom taip (vykdomas kodo blokas).
Sekų sumos
Tarkime turime seką: 1, 2, 3, 4… ir norime sudėti pirmus n elementų (int n = 8
)
int n = 8; // narys, iki kurio bus sumuojama
int i = 1; // pradedame sumuoti nuo pirmojo sekos nario
int sum = 0; // pradedame sumą skaičiuoti nuo nulio
while (i <= n)
{
sum += i;
i++; // i += 1; arba i = i + 1;
}
Debug.Log("Sekos suma: " + sum);
Šaknies traukimas
Procesoriai gali atlikti elementarius veiksmus su kintamaisiais: sudėtis, atimtis, daugyba, dalyba (atitinkamai: +-*/
). Tam jiems nereikia kodo, nes operacijų algoritmas yra atspausdintas tiesiogiai ant silicio.
Norint ištraukti šaknį naudojant tik šiuos veiksmus galima bandyt spėliot, tik turėt taktiką, kaip su kiekvienu spėjimu priartėt artyn. Užduoties aprašymas:
- Skaičius, kurio šaktį norime rasti:
a
- Dabartinis spėjimas:
x
- Paskutinis spėjimas:
lastX
- Spėjimo tikslumas:
e
Tarkime aR
yra tikroji šaknies vertė, su kuria galioja lygybė: a/aR = aR
.
Jeigu x > aR
, tai x > aR > a/x
.
Kitaip tariant šaknis yra kažkur tarp mūsų dabartinio spėjimo ir dalmens (a/x
).
Dalmuo kode žymimas b = a / x
.
Spėjame, kad x
ir b
vidurkis bus arčiau tikrosios šaknies vertės, nei dabartinis vidurkis: lastX > x > aR
.
Jeigu absoliutus skirtumas tarp x
ir lastX
yra pakankamai mažas, gavome skaičių pakankamai arti šaknies, jei sutampa: gavome šaknį.
const float a = 100; // Skaičius, iš kurio traukiama šaknis
const float e = 0.01f; // Skaičiavimo tikslumas
float x = a / 2; // Pirmas spėjimas
float lastX = a; // Praeitas spėjimas
int i = 1; // Kelinta algoritmo iteracija
while (Mathf.Abs(x - lastX) > e) // Skirtumo modulis yra didesnis už e: vykdomas kodo blokas
{
lastX = x; // Įsimename dabartinį spėjimą, kuris bus vėliau naudojamas, kaip praeitas spėjimas
float b = a / x; // Daliname skaičių, iš kurio traukiame šaknį
x = (x + b) / 2; // Naujas spėjimas yra dabartinio spėjimo ir dalmens vidurkis
Debug.Log(i + ": " + x); // Atspasusdiname iteracijos numerį ir naujajį spėjimą
i++; // Padidiname iteracijos numerį
if (i > 1000) // Jeigu įvykdėme tūkstantį iteracijų, bet šaknis nebuvo apskaičiuota norimu tikslumu
break; // Nutraukiame ciklą
}
Debug.Log(a + " šaknis yra: " + x); // Atspausdiname šaknies traukimo rezultatą
Savarankiškos užduotys
- Apskaičiuoti sumą teigiamų lyginių skaičių, mažesnių už 13
- Apskaičiuoti 9 faktorialą
- Apskaičiuoti sumą pirmų 10 skaičių kvadratų: 1 + 4 + 9 + …
- Padaryti 100 virtualių monetos metimų ir suskaičiuot kiek kartų atsivertė herbas (
Random.value > 0.5f
) - Patikrinti ar 277 yra pirminis skaičius (man pačiam įdomu)