Atsikartojantis kodas (while)

Pamokos turinys

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:

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