C# Konspekt

See programm kuvab esmalt tervituse ja küsib kasutajalt eesnime. Pärast nime sisestamist näitab programm isiklikku tervitust: “Tere, [eesnimi]”.

C# puhul näeb lühim tervikprogramm välja ligikaudu järgmine:

class Startclass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Tere tulemast!");
        }
    }

Käivitus klassi ja ikooni määramine

Teeme lahti Menü Project -> Kordamine Properties

    Startup object valime Startclass.cs
    Icon valime mingi fail *.ico formaadis

Kasutame muutuja eesnimi tekstilises formaadis. Lihtsaim dialoogi pidav programm näeb välja järgmine:

class Startclass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Tere tulemast!");
            string eesnimi = Console.ReadLine();
            Console.WriteLine("Tere, " + eesnimi);
            Console.ReadLine();
        }
    }

See programm tervitab kasutajat, kontrollib nime ja annab vastuse vastavalt sellele, kas nimi on “juku” või mitte. Seejärel küsitakse kahte arvu ja kuvatakse nende korrutis ekraanile.

Ehk võimalus otsustamiseks, kui on vaja, et programm käituks kord üht-, kord teistmoodi.

public static void Main(string[] args)
        {
            Console.WriteLine("Tere tulemast!");
            string eesnimi = Console.ReadLine();
            Console.WriteLine("Tere, " + eesnimi);
            if (eesnimi.ToLower()=="juku")
            {
                Console.WriteLine("Tule minu juurde külla!");
            }
            else
            {
                Console.WriteLine("Täna mind kodus pole!");
            }
            int arv1 = int.Parse(Console.ReadLine());
            int arv2 = int.Parse(Console.ReadLine());
            Console.WriteLine("Arvude {0} ja {1} korrutis võrdub {2}", arv1, arv2, arv1 * arv2);
            Console.ReadLine();
        }

Programm ütleb järjest viiele matkajale tere, kasutades korduskäske nagu while, for ja do...while. Erinevad kordusviisid aitavad kontrollida, mitu korda tervitust kuvatakse, sõltuvalt tingimusest ja muutuja väärtusest.

Järgnevalt näide, kuidas arvuti vastu tulevale viiele matkajale tere ütleb. Täisarvuline muutuja nimega nr näitab, mitmenda matkaja juures parajasti ollakse. Käskluse while juurde kuuluvat plokki saab korrata. Plokk läbitakse üha uuesti juhul, kui ümarsulgudes olev tingimus on tõene. Et kordusi soovitud arv saaks, on juba programmeerija hoolitseda. Selleks on siin igal korral pärast tervitust käsklus nr=nr+1, ehk siis suurendatakse matkaja järjekorranumbrit.

public class Kordus1{

   public static void Main(string[] arg){

      int nr=1;

      while(nr<=5){

         Console.WriteLine("Tere, {0}. matkaja!", nr);

         nr=nr+1;}}}

Sama tulemuse aga saab mõnevõrra lühemalt kirja panna for-i abil. Levinud kordusskeemi jaoks on välja mõeldud omaette käsklus, kus algul luuakse muutuja ja antakse talle algväärtus; seejärel kontrollitakse, kas järgnevat plokki on vaja täita; lõpuks võetakse ette toiming andmete ettevalmistamiseks uue ploki jaoks. nr++ on sama, mis nr=nr+1 - ehk siis suurendatakse muutuja väärtust ühe võrra.

for(int nr=1; nr<=5; nr++){

         Console.WriteLine("Tere, {0}. matkaja!", nr);

      }

Nii for-i kui while puhul kontrollitakse alati ploki algul, kas seda on vaja täita. Mõnikord on aga teada, et plokk tuleb kindlasti läbida. Lihtsalt pole teada, kas sama teed tuleb ka teist või kolmandat korda käia. Tüüpiline näide selle juures on sisestuskontroll.

int nr=0;

do{

         Console.WriteLine("Tere, {0}. matkaja!", nr);

         nr=nr+1;

      } while(nr!=5);

Programm küsib kasutajalt teksti ja salvestab selle faili nimega kuud.txt
Kui faili salvestamisel tekib viga, siis kuvatakse teade: “Mingi viga failiga”.

try
{
    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Kuud.txt"); //@"..\..\..\Kuud.txt"
    StreamWriter text = new StreamWriter(path, true); // true = lisa lõppu
    Console.WriteLine("Sisesta mingi tekst: ");
    string lause = Console.ReadLine();
    text.WriteLine(lause);
    text.Close();
}
catch (Exception)
{
    Console.WriteLine("Mingi viga failiga");
}

Kui kasutad StreamWriter-i faili kirjutamiseks, siis pead faili kindlasti sulgema käsuga sw.Close(), et andmed salvestuks õigesti. Parem lahendus on kasutada using-plokki, mis sulgeb faili automaatselt pärast kirjutamist, isegi kui tekib viga.

Siis pead kindlasti faili sulgema, näiteks:

StreamWriter sw = new StreamWriter(path);
sw.WriteLine("Midagi");
sw.Close(); // Vajalik!


Või parem lahendus:

using (StreamWriter sw = new StreamWriter(path))
{
    sw.WriteLine("Midagi");
} // Fail suletakse automaatselt siin

See programm otsib Kuud.txt faili ja proovib selle sisu lugeda. Kui fail leitakse, loetakse kogu tekst ja kuvatakse ekraanile. Kui faili pole või tekib lugemisel viga, siis kuvatakse veateade.

try
{
    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Kuud.txt");
    StreamReader text = new StreamReader(path);
    string laused = text.ReadToEnd();
    text.Close();
    Console.WriteLine(laused); 
}
catch (Exception)
{
    Console.WriteLine("Mingi viga failiga, ei saa faili lugeda");
}

See programm loob tühja nimekirja kuude_list ja proovib lugeda kuud.txt faili. Kui fail leitakse, lisatakse iga rida faili seest nimekirja. Kui faili lugemisel tekib viga, kuvatakse teade Viga failiga.

List<string> kuude_list = new List<string>();
try
{
    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Kuud.txt");
    foreach (string rida in File.ReadAllLines(path))
    {
        kuude_list.Add(rida);
    }
}
catch (Exception)
{
    Console.WriteLine("Viga failiga!");
}

See programm kuvab kõigepealt kõik kuud nimekirjast ekraanile. Seejärel eemaldatakse “Juuni”, muudetakse esimene element nimekirjas ja kuvatakse uuendatud nimekiri uuesti.

foreach (string kuu in kuude_list)
{
    Console.WriteLine(kuu);
}

// Eemalda "Juuni"
kuude_list.Remove("Juuni");

// Muuda esimest elementi
if (kuude_list.Count > 0)
    kuude_list[0] = "Veeel kuuu";

Console.WriteLine("--------------Kustutasime juuni-----------");

foreach (string kuu in kuude_list)
{
    Console.WriteLine(kuu);
}

See programm küsib kasutajalt kuu nime ja kontrollib, kas see nimi on olemas kuude_list nimekirjas. Kui kuu on nimekirjas, kuvatakse teade et see on olemas, kui ei ole, siis öeldakse et sellist kuud pole.

Console.WriteLine("Sisesta kuu nimi, mida otsida:");
string otsitav = Console.ReadLine();

if (kuude_list.Contains(otsitav))
    Console.WriteLine("Kuu " + otsitav + " on olemas.");
else
    Console.WriteLine("Sellist kuud pole.");

See programm salvestab kuude_list nimekirja sisu faili nimega kuud.txt. Kui salvestamine õnnestub, kuvatakse teade Andmed on salvestatud.

string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Kuud.txt");
File.WriteAllLines(path, kuude_list);
Console.WriteLine("Andmed on salvestatud.");

Path.Combine abil saab faili tee määrata nii, et see töötab igas operatsioonisüsteemis. Enne faili kasutamist tasub kontrollida, kas see üldse olemas on. Kui ei ole, saab luua uue faili ja lisada sinna algandmed. Faili kasutamisel tuleb see kindlasti sulgeda käsitsi või kasutada using-plokki, mis teeb seda automaatselt.



    Kasuta Path.Combine failitee määramisel – töötab igas süsteemis.

    Faili olemasolu kontroll:

if (!File.Exists(path)) File.WriteAllLines(path, new string[] { "Jaanuar", "Veebruar", "Märts" });

    Sulge failid alati (või kasuta using plokki).

Õppematerjali kokkuvõte

OskusÕpitud tegevus
FailikirjutusStreamWriter, WriteLine()
FaililugemineStreamReader, ReadToEnd(), File.ReadAllLines()
Vigade käsitleminetry-catch
AndmestruktuuridList<string>, lisamine, muutmine, kustutamine
Failitee kasutaminePath.Combine, AppDomain.CurrentDomain.BaseDirectory
Otsing ja salvestusContains(), WriteAllLines()

📋 1. ArrayList (System.Collections)

ArrayList on lihtne viis andmete kogumiseks, mille suurust ei pea ette määrama. See kohandub automaatselt lisatavate elementide arvuga.

🔧 Peamised meetodid:

  • Add() – lisab elemendi lõppu
  • Contains() – kontrollib, kas element on olemas
  • Count – tagastab elementide arvu
  • Insert(index, item) – lisab elemendi kindlale kohale
  • IndexOf() – otsib elemendi indeksit
  • Sort() – järjestab elemendid kasvavalt

Näide:

ArrayList nimed = new ArrayList();
nimed.Add("Kati");
nimed.Add("Mati");
nimed.Add("Juku");

if (nimed.Contains("Mati"))
    Console.WriteLine("Mati olemas");

Console.WriteLine("Nimesid kokku: " + nimed.Count);

nimed.Insert(1, "Sass");

Console.WriteLine("Mati indeks: " + nimed.IndexOf("Mati"));
Console.WriteLine("Mari indeks: " + nimed.IndexOf("Mari"));

foreach (string nimi in nimed)
    Console.WriteLine(nimi);

Tuple (järjendid)

Tuple on kindla suurusega ja tüübitüübiga andmestruktuur, mille elemendid võivad olla eri tüüpi.

Tuple<float, char> route = new Tuple<float, char>(2.5f, 'N');
Console.WriteLine($"Vahemaa: {route.Item1}, Suund: {route.Item2}");

List (System.Collections.Generic)

Tugeva tüübiga geneeriline kogumik. Kõige enam kasutatav andmetüüp igapäevases arenduses.

🔧 Peamised meetodid:

  • Add(), AddRange() – lisa element või mitu
  • IndexOf(), Remove(), RemoveAt()
  • Insert(index, item) – lisa kindlasse kohta
  • Sort() – sorteerib andmed
  • BinarySearch() – kiire otsing (peab olema sorteeritud)

Näide:

class Person
{
    public string Name { get; set; }
}

List<Person> people = new List<Person>();
people.Add(new Person() { Name = "Kadi" });
people.Add(new Person() { Name = "Mirje" });

foreach (Person p in people)
    Console.WriteLine(p.Name);

LinkedList (System.Collections.Generic)

Jadana korraldatud andmestruktuur. Sobib hästi, kui on vaja tihti lisada või eemaldada elemente listi alguses või keskel.

🧰 Võimalused:

  • AddFirst(value), AddLast(value)
  • AddBefore(node, value), AddAfter(node, value)
  • RemoveFirst(), RemoveLast(), Remove(value)

Näide:

LinkedList<int> loetelu = new LinkedList<int>();
loetelu.AddLast(5);
loetelu.AddLast(3);
loetelu.AddFirst(0);

foreach (int arv in loetelu)
    Console.WriteLine(arv);

loetelu.RemoveFirst();
loetelu.RemoveLast();
loetelu.AddLast(555);
loetelu.Remove(555);

Dictionary<TKey, TValue> – Sõnastik

Sõnastik (dictionary) võimaldab hoida võtme-väärtuse paare. Kiire otsing ja mugav struktuur, kui vaja seoseid kirjeldada (nt ID ja nimi, riik ja pealinn).

🧰 Peamised meetodid:

  • Add(key, value)
  • Remove(key)
  • ContainsKey(key), ContainsValue(value)
  • Keys, Values
  • dictionary[key] = newValue;

Näide:

Dictionary<int, string> riigid = new Dictionary<int, string>();
riigid.Add(1, "Hiina");
riigid.Add(2, "Eesti");
riigid.Add(3, "Itaalia");

foreach (var paar in riigid)
    Console.WriteLine($"{paar.Key} - {paar.Value}");

string pealinn = riigid[2];
riigid[2] = "Eestimaa";
riigid.Remove(3);

Klasside näide:

Dictionary<char, Person> inimesed = new Dictionary<char, Person>();
inimesed.Add('k', new Person() { Name = "Kadi" });
inimesed.Add('m', new Person() { Name = "Mait" });

foreach (var entry in inimesed)
    Console.WriteLine($"{entry.Key} - {entry.Value.Name}");

Kokkuvõte: millal millist kasutada?

AndmetüüpMillal kasutada?
ArrayListLihtsaks prototüüpimiseks (mitte soovitatav uues koodis)
List<T>Enamiku tavaliste andmekogumite jaoks
LinkedList<T>Kui vaja palju lisada/teha muudatusi jada keskel
Dictionary<K,V>Kiire võtme alusel andmete leidmine
Tuple<T1,T2>Kui vaja ajutiselt hoida mitme erineva tüübi väärtusi koos