Duomenų struktūros: masyvai

Pamokos turinys

Pradinis kodas

Geriausia susikurti naują C# failą ir pavadinti Class6.cs


using UnityEngine;
using UnityEditor;

public class Class6 : MonoBehaviour {
    [MenuItem("MyMenu/Class6")]
    static void Main()
    {
        Debug.Log("Class6 Main()");
    }
}

Masyvų sukūrimas

Kūrimas nurodant masyvo ilgį

Masyvai yra kintamieji, turintys tam tikrą tipą (float int bool string) bei fixuotą narių skaičių.


float[] numbers = new float[5];

Debug.Log(numbers[0]);

Šitaip sukuriamas penkių realių skaičių masyvas. Kadangi įprastinė (default) vertė yra 0, tai konsolėje bus parašomas 0. Masyvų nariai yra numeruojami (indexuojami) kaip vokiečių ar anglų numeruojami namų aukštai: pirmas narys yra nulintas, antras narys yra nurodomas vienetu.


float[] numbers = new float[5];

Debug.Log(numbers[5]); // Index out of bounds exception (bandoma pasiekti narį už ribų)

Kaip ir anot vokiečių ar amerikiečių penkių aukštų namas neturi penkto aukšto, taip ir penkių narių masyvas neturi penkto nario.

Kūrimas nurodant masyvo narius

Masyvus galima sukurti ir nurodant visus pradinius narius:


int[] numbers = { 5, 3, 100 };

Debug.Log(numbers[0]); // 5
Debug.Log(numbers[1]); // 3
Debug.Log(numbers[2]); // 100
Debug.Log(numbers[3]); // Index out of bounds exception (bandoma pasiekti narį už ribų)

Masyvų nariai

Masyvų nariai elgiasi taip pat kaip ir įprasti kintamieji:


int a = 5;
int b = 3;

int[] ab = { 5, 3 };

Debug.Log("Sandauga: " + (a * b));
Debug.Log("Sandauga: " + (ab[0] * ab[1]));
// Abu atspausdina 15;

b = a + 6;
ab[1] = ab[0] + 6;

Debug.Log("b: " + b);
Debug.Log("b: " + ab[1]);
// Abu atspausdina 11;

a++;
ab[0]++;

Debug.Log("a: " + a);
Debug.Log("a: " + ab[0]);
// Abu atspausdina 6;

Algoritmai su masyvais

Masyvo ilgio nustatymas

Kuriant masyvus antruoju metodu su daug narių, iš karto gali nebūti aišku kiek narių yra sąraše, arba kitaip tariant: koks yra masyvo ilgis? Mūsų laimei masyvo ilgis yra lengvai sužinomas skaičius:


int[] numbers = { 5, 3, 100, 7, 13, 5, 0, 2, 6 };

Debug.Log("Masyvo ilgis: " + numbers.Length); // 9

Dinamiškas masyvo nario “pasiekimas”

Masyvo ilgis yra sveikas skaičius (int), o prisimenant analogiją su namų aukštais, namo aukštas taip pat yra sveikas skaičius. Masyvo narį galima “pasiekti” ir naudojant kitą kintamąjį:


int[] numbers = { 5, 3, 100, 7, 13, 5, 0, 2, 6 };
int index = 2;

Debug.Log(numbers[2]); // 100
Debug.Log(numbers[index]); // 100

index = 50;

Debug.Log(numbers[index]); // Index out of bounds exception (bandoma pasiekti narį už ribų)

Standartinis for ciklas: “iteravimas” per visus masyvo elementus

Sudėjus praeitus du faktus galima sukonstruoti for ciklą, kuris “iteruoja” per visus narius:


int[] numbers = { 5, 3, 100, 7, 13, 5, 0, 2, 6 };

for (int i = 0; i < numbers.Length; i++) {
    Debug.Log(numbers[i]); // 5, 3, 100, 7, 13, 5, 0, 2, 6
}

Nesunkiai galima gauti sumą:


int[] numbers = { 5, 3, 100, 7, 13, 5, 0, 2, 6 };
int sum = 0;

for (int i = 0; i < numbers.Length; i++) {
    sum += numbers[i];
}

Debug.Log("Suma: " + sum);

Savarankiškos užduotys


int[] numbers = {1, 7, 5, 8, 20, 4, 17};

int sum = 0; // Suma pradedama nuo nulio
int min = numbers[0]; // Pirmas mažiausio skaičiaus spėjimas
int max = numbers[0]; // Pirmas mažiausio skaičiaus spėjimas
float avg = 0; // Vidurkis yra realus skaičius
int mul = 1; // Sandaugai pradedam nuoą vieneto, nes pradėjus nuo nulio sandauga gaunasi nulinė
int count = 0; // Jeigu skaičiuojam tik lyginius skaičius, reikia patiems nustatyti narių skaičių

Turint pradinius skaičius masyve numbers apskaičiuoti jų sumą, mažiausią narį, didžiausią narį, vidurkį ir sandaugą.

Apskaičiuoti tas pačias vertes ignoruojant nelyginius skaičius. Papildomai suskaičiuoti lyginių skaičių kiekį (count).

Rezultatai skaičiuojant su visais skaičiais

Rezultatai skaičiuojant tik su lyginiais skaičiais