Massiivid ja System.Collection.Generic nimeruum CSharp keeles: Difference between revisions
Line 12: | Line 12: | ||
mass[1]=1; | mass[1]=1; | ||
for (int i = 2; i <= 9; i++) | for (int i = 2; i <= 9; i++) | ||
mass[i] = mass[i - 1] + mass[i - 2]; | mass[i] = mass[i - 1] + mass[i - 2]; | ||
for (int i = 0; i <= 9; i++) | for (int i = 0; i <= 9; i++) | ||
Console.WriteLine(mass[i]); | Console.WriteLine(mass[i]); | ||
</source> | </source> |
Revision as of 20:15, 13 September 2010
Massiivide kasutamine C# programmeerimiskeeles
Massiivid
Massiiv on ühetüübiliste muutujate kogum, millistel on üks nimi ja mis on üksteisest eristatavad indeksi poolest. Massiivid lihtsustavad oluliselt ühetüübiliste andmete töötlemist. Lihtsustamine tuleneb sellest, et programmi täitmise käigus on võimalik indeksit lihtsalt muuta ja seega on lihtsam pöörduda vajaliku muutuja poole.
Massiivid võivad olla ühemõõtmelised (jada, rida), kahemõõtmelised (tabel, maatriks), kolmemõõtmelised (kuup), jne.
Näide
int[] mass = new int[10];
mass[0]=1;
mass[1]=1;
for (int i = 2; i <= 9; i++)
mass[i] = mass[i - 1] + mass[i - 2];
for (int i = 0; i <= 9; i++)
Console.WriteLine(mass[i]);
Selles näites luuakse ühemõõtmeline massiiv mass, millel on kümme liiget, antakse kahele esimesele liikmele väärtus „1” ja täidetakse ülejäänud liikmed kahe eelneva liikme summaga.
Seejärel trükitakse kõik väärtused järjest (alustades nullindast liikmest ja lõpetades üheksandaga) konsooliaknasse.
Massiivi hea ja vead
Massiivi näol on tegemist kiire, kuid suhteliselt jäiga andmeobjektiga. Nii ei saa näiteks massiivi täitumisel massiivi mõõtmete pikkuseid hiljem muuta, massiiv peab alati koosnema ühte tüüpi muutujatest ning massiivi liikmed ei saa olla kirjutamiskaitsega (read-only).
Massiivi loomiseks tuleb näidata ära massiivi liikmete tüüp, massiivi mõõtmete arv ning massiivi nimi.
Näide
int[] taisArvud; // deklareeritakse ühemõõtmeline Int32 tüüpi massiiv taisArvud
long[,] komaArvudeTabel; // deklareeritakse kahemõõtmeline long tüüpi massiiv komaArvudeTabel
Massiivide loomisel on nõutav mõõtmete pikkuste määramine (ehk mitu liiget ühte mõõtmesse mahub), kusjuures erinevad mõõtmed võivad olla erineva pikkusega.
Näide
int[] taisArvud = new int[10];
// luuakse uus ühemõõtmeline int massiiv, pikkusega 10
long[,] komaArvudeTabel = new long[2,3];
//luuakse uus kahemõõtmeline long massiiv, mõõtmete pikkused 2 ja 3, kokku kuus liiget
Massiivi loomisel võib kasutada võimalus mõõtmete pikkuste defineerimiseks läbi algväärtustamise.
Näide
int[,] grid = {
{5, 4, 3},
{2, 1, 0}
};
Konkreetse massiivi liikme poole pöördumiseks tuleb kasutada massiivi nime ja õiget indeksit. Arvestada tuleb siinkohal, et liikmete indeksid algavad nullist, seega on massiivi esimene liige indeksiga null. Kindlasti tuleb arvestada, et pöördudes liikme poole, mida reaalselt ei eksisteeri, saadakse viga.
Näide
int[] taisArvud = new int[10];
taisArvud[0] = 45; // massiivi taisarvud esimesele liikmele omistatakse väärtus 45
taisArvud[10] = 11; // Tekib viga, sest massiivil taisArvud ei ole üheteistkümnendat liiget
Massiivi mõõtmete pikkused Massiivide mõõtmete pikkuste kindlakstegemiseks on võimalik kasutada Length parameetrit ning GetLength meetodit.
Näide
int[] taisArvud = {2, 1, 0};
int pikkus = taisArvud.Length; // pikkus = 3
Kui mõõtmeid on mitu, siis annab parameeter Length teada kogu liikmete arvu massiivis, Rank annab teada mõõtmete arvu ning GetLength konkreetse mõõtme sügavuse.
Näide
int[,] grid = {
{5, 4, 3},
{2, 1, 0}
};
for(int i = 0; i < grid.Rank;i++)
Console.WriteLine("Massiivi {0}. mõõde on pikkusega {1}", i+1,grid.GetLength(i));
//Selle koodi väljund:
//Massiivi 1. mõõde on pikkusega 2
//Massiivi 2. mõõde on pikkusega 3
Massiivi meetodid
System.Array enimkasutatavateks meetoditeks on
- Sort – sorteerib massiivi liikmed eeldusel, et liikmed on IComparable liidesega.
Näide
int[ ] data = {4,6,3,8,9,3}; // Sorteerimata
System.Array.Sort(data); //Sorteeritud
- Clear – tühjendab massiivi (ehk väärtustab massiivi liikmed väärtusega 0 või viitega null)
Näide
int[ ] data = {4,6,3,8,9,3};
System.Array.Clear(data, 0, data.Length); // data sisaldab nüüd {0,0,0,0,0,0}
- Clone – see meetod loob uue massiivi ning kopeerib muutujate väärtused massiivist, mida kloonitakse. Kui massiivi liikmed sisaldavad viiteid, siis kopeeritakse viited, mitte objektid.
Näide
int[ ] data = {4,6,3,8,9,3};
int[ ] clone = (int [ ])data.Clone( );
- IndexOf – see meetod tagastab esimese massiivi liikme, mis sisaldab otsitavat väärtus, indeksi. Kui otsitavat väärtus massiivis ei ole, siis tagastatakse -1.
Näide
int[ ] data = {4,6,3,8,9,3};
int where = System.Array.IndexOf(data, 9); // == 4
Massiivi meetodite pikema loetelu leiad siit: http://msdn.microsoft.com/en-us/library/system.array_members.aspx
System.Collection.Generic nimeruum
System.Collection.Generic nimeruum sisaldab mitmeid liideseid ja klasse, mis defineerivad tüübikindlaid kollektsioone. Mitmed neist on kasutatavad samadel eesmärkidel kui massiivid, kuid pakuvad siinjuures suuremat paindlikkust.
Kõik System.Collection.Generic nimeruumis leiduvad klassid ja liidesed on loetletud siin: http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx
Lisaks võib vaadata ka System.Collection nimeruumi klasse ja liideseid: http://msdn.microsoft.com/en-us/library/system.collections.aspx
List(T) klass
Realiseerib tüübikindla listi. List sarnaneb nii mõneski mõttes massiivile, kuid pakub võimalust liikmeid lisada ning eemaldada. Sisaldab muuhulgas meetodeid sorteerimiseks ja otsimiseks.
Näide
List<string> nimed = new List<string>(); // luuakse list nimed, string tüüpi liikmetega
nimed.Add("Jaan"); // lisatakse liige väärtusega „Jaan“
nimed.Add("Peeter");
nimed.Add("Sass");
nimed.Add("Ants");
nimed.Add("Kaur");
nimed.Add("Heiki");
nimed.Sort(); //sorteeritakse list
foreach (string nimi in nimed)
Console.WriteLine(nimi); //trükitakse konsooli listi liikme väärtus Console.WriteLine(nimed.ElementAt(1)); // tükitakse konsooli listi teise liikme väärtus
Lisalugemist: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx
Queue(T) klass
FIFO (first-in, first-out) tüüpi objektide kollektsioon. Sisuliselt on tegemist järjekorraga, kuhu on võimalik liikmed panna ning neid siis panemise järjekorras jälle välja võtta
Näide
Queue<int> numbrid = new Queue<int>(); // luuakse uus järjekord
numbrid.Enqueue(33); // lisatakse järjekorda 33
numbrid.Enqueue(22); // lisatakse järjekorda 22
Console.WriteLine(numbrid.Dequeue()); // võetakse järjekorrast liige ja trükitakse konsooli
Console.WriteLine(numbrid.Dequeue());// võetakse järjekorrast liige ja trükitakse konsooli
Stack(T) klass
Stack on LIFO (last-in, first-out) tüüpi objektide kollektsioon. Sisuliselt on tegemist pinu ehk magasintüüpi andmeobjektiga. See tähendab seda, et sinna viimasena lisatud liige võetakse välja esimesena.
Näide
Stack<string> numbers = new Stack<string>(); // luuakse uus pinu
numbers.Push("one"); // lisatakse pinusse „one“
numbers.Push("two");
numbers.Push("three");
numbers.Push("four");
numbers.Push("five");
//Pinu liikmed vaadatakse läbi ilma, et neid eemaldataks
foreach( string number in numbers )
{
Console.WriteLine(number);
}
Console.WriteLine("Popping '{0}'", numbers.Pop()); // võetakse välja viimasena sisestatud väärtus
Console.WriteLine("Popping '{0}'", numbers.Pop());// võetakse välja eelviimasena sisestatud väärtus
Koodinäited
Õppetüki koodinäited
int[,] grid = {
{5, 4, 3},
{2, 1, 0}
};
for(int i = 0; i < grid.Rank;i++)
Console.WriteLine("Massiivi {0}. mõõde on pikkusega {1}",
i+1,grid.GetLength(i));
List<string> nimed = new List<string>();
nimed.Add("Jaan");
nimed.Add("Peeter");
nimed.Add("Sass");
nimed.Add("Ants");
nimed.Add("Kaur");
nimed.Add("Heiki");
nimed.Sort();
foreach (string nimi in nimed)
Console.WriteLine(nimi);
Console.WriteLine(nimed.ElementAt(1));
Queue<int> numbrid = new Queue<int>();
numbrid.Enqueue(33);
numbrid.Enqueue(22);
Console.WriteLine(numbrid.Dequeue());
Console.WriteLine(numbrid.Dequeue());
Sisestus
int[] intMassiiv = new int[5];
for (int index = 0; index <= 4; index++)
{
Console.Write("Sisesta {0} arv: ", index + 1);
intMassiiv[index] = int.Parse(Console.ReadLine());
}
Suurima leidmise näide
int[] intMassiiv = new int[5];
for (int index = 0; index <= 4; index++)
{
Console.Write("Sisesta {0} arv: ", index + 1);
intMassiiv[index] = int.Parse(Console.ReadLine());
}
int suurim = intMassiiv[0];
for (int index = 0; index <= 4; index++)
{
if (intMassiiv[index] > suurim)
suurim = intMassiiv[index];
}
Console.WriteLine("Suurim on: {0}", suurim);