Nizovi i stringovi u C#

Lekcija 5 od 15 · C#

Niz čuva više vrednosti istog tipa pod jednim imenom; elementima se pristupa preko indeksa koji počinje od 0. String je niz znakova sa mnogo gotovih metoda za rad sa tekstom. U ovoj lekciji su jednodimenzionalni i dvodimenzionalni nizovi, metode klase Array, metode stringova i klasa StringBuilder.

Pre nego što počneš: potrebno predznanje – grananje i petlje.
Kako da učiš: svaki primer prekucaj i pokreni, a zadatke na kraju prvo reši sam/a; uputstvo i rešenje otvori tek posle toga. Svi programi su konzolne aplikacije u C#-u (.NET 8 ili noviji, bez „top-level statements“); svaki je proveren i daje navedeni izlaz.

Nizovi: deklaracija i prolazak

using System;

class Program
{
    static void Main()
    {
        int[] ocene = { 5, 3, 4, 5, 2, 4 };    // niz sa početnim vrednostima
        int[] kvadrati = new int[5];             // 5 elemenata, svi su 0
        for (int i = 0; i < kvadrati.Length; i++)
            kvadrati[i] = (i + 1) * (i + 1);

        int zbir = 0;
        foreach (int o in ocene)
            zbir += o;

        Console.WriteLine($"Broj ocena: {ocene.Length}");
        Console.WriteLine($"Prosek: {(double)zbir / ocene.Length:F2}");
        Console.WriteLine("Kvadrati: " + string.Join(", ", kvadrati));
        Console.WriteLine($"Prva ocena: {ocene[0]}, poslednja: {ocene[^1]}");
    }
}

Svojstvo Length daje broj elemenata, pa su indeksi od 0 do Length - 1. Oznaka ^1 znači „prvi od kraja“, tj. poslednji element. Pristup indeksu van granica prekida program greškom IndexOutOfRangeException.

Ceo red brojeva najlakše se učitava u niz metodom Array.ConvertAll, koja svaki deo teksta pretvara u broj:

using System;

class Program
{
    static void Main()
    {
        // ulaz: 3 8 10 5 6
        int[] niz = Array.ConvertAll(Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries), int.Parse);
        int parnih = 0;
        foreach (int x in niz)
            if (x % 2 == 0) parnih++;
        Console.WriteLine($"Ucitano {niz.Length} brojeva, parnih: {parnih}");
    }
}

Metode klase Array i kopiranje niza

using System;

class Program
{
    static void Main()
    {
        int[] a = { 7, 2, 9, 4, 1 };
        Array.Sort(a);                              // rastući poredak
        Console.WriteLine(string.Join(" ", a));
        Array.Reverse(a);                           // obrtanje redosleda
        Console.WriteLine(string.Join(" ", a));
        Console.WriteLine(Array.IndexOf(a, 4));     // pozicija vrednosti 4

        int[] kopija = (int[])a.Clone();            // nov niz sa istim vrednostima
        kopija[0] = 100;
        int[] b = a;                                // NIJE kopija – isti niz pod drugim imenom
        b[1] = -1;
        Console.WriteLine($"a: {string.Join(" ", a)}");
        Console.WriteLine($"kopija: {string.Join(" ", kopija)}");
    }
}
Pazi: naredba int[] b = a; ne pravi nov niz. Obe promenljive pokazuju na isti niz u memoriji, pa promena preko b menja i a. Za pravu kopiju koristi Clone().

Dvodimenzionalni nizovi (matrice)

Matrica se u C#-u deklariše kao int[,], a elementu se pristupa sa m[red, kolona]. Broj redova daje GetLength(0), a broj kolona GetLength(1).

using System;

class Program
{
    static void Main()
    {
        int[,] m = new int[3, 4];                   // 3 reda, 4 kolone
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 4; j++)
                m[i, j] = i * 4 + j + 1;

        for (int i = 0; i < m.GetLength(0); i++)
        {
            int zbirReda = 0;
            for (int j = 0; j < m.GetLength(1); j++)
            {
                Console.Write($"{m[i, j],3}");
                zbirReda += m[i, j];
            }
            Console.WriteLine($"  | zbir: {zbirReda}");
        }
    }
}

Stringovi i njihove metode

using System;

class Program
{
    static void Main()
    {
        string s = "Programiranje u C#";
        Console.WriteLine(s.Length);                    // broj znakova
        Console.WriteLine(s[0]);                        // prvi znak (char)
        Console.WriteLine(s.ToUpper());
        Console.WriteLine(s.Contains("C#"));
        Console.WriteLine(s.IndexOf('r'));              // prva pozicija znaka
        Console.WriteLine(s.Substring(0, 7));           // od pozicije 0, 7 znakova
        Console.WriteLine(s.Replace("C#", "Javi"));

        string[] voce = "jabuka,kruska,sljiva".Split(',');
        Console.WriteLine(voce.Length + " " + voce[1]);
        Console.WriteLine(string.Join(" - ", voce));
    }
}

Stringovi se ne menjaju: ToUpper, Replace i ostale metode vraćaju nov string, a originalni ostaje isti. Zato se rezultat mora sačuvati: s = s.Trim();.

using System;

class Program
{
    static void Main()
    {
        string a = "ana", b = "Ana";
        Console.WriteLine(a == b);                       // razlikuje velika i mala slova
        Console.WriteLine(a.Equals(b, StringComparison.OrdinalIgnoreCase));

        int slova = 0, cifre = 0;
        foreach (char c in "Lozinka2026!")
        {
            if (char.IsLetter(c)) slova++;
            else if (char.IsDigit(c)) cifre++;
        }
        Console.WriteLine($"slova: {slova}, cifre: {cifre}");
    }
}

Za razliku od Jave, u C#-u se stringovi porede operatorom == – upoređuje se sadržaj teksta.

StringBuilder: tekst koji se gradi deo po deo

Kada se tekst gradi u petlji, svako s = s + … pravi nov string. Klasa StringBuilder (prostor imena System.Text) dodaje delove u isti objekat i mnogo je brža za dug tekst.

using System;
using System.Text;

class Program
{
    static void Main()
    {
        var sb = new StringBuilder();
        for (int i = 1; i <= 5; i++)
        {
            sb.Append(i);
            if (i < 5) sb.Append('-');
        }
        Console.WriteLine(sb.ToString());

        char[] znakovi = "racunar".ToCharArray();   // string -> niz znakova
        Array.Reverse(znakovi);
        Console.WriteLine(new string(znakovi));     // niz znakova -> string
    }
}

Zadaci za vežbu

Za svaki zadatak postoji primer, uputstvo i rešenje. Rešenja su provereno tačna na primerima iz teksta.

ZADATAK 01Težina: lako

Palindrom

Učitati red teksta i ispisati DA ako se isto čita sa obe strane (ne računajući razmake i razliku između velikih i malih slova), a NE u suprotnom.

Primer 1

Ulaz

Ana voli Milovana

Izlaz

DA

Primer 2

Ulaz

programiranje

Izlaz

NE
ZADATAK 02Težina: srednje

Iznad proseka

U redu su celi brojevi razdvojeni razmakom. Ispisati koliko je brojeva veće od proseka svih brojeva, a u sledećem redu te brojeve, redom kojim su uneti.

Primer

Ulaz

4 8 15 16 23 42

Izlaz

2
23 42
Česte greške i saveti
  • Indeksi niza počinju od 0; poslednji je Length - 1.
  • int[] b = a; ne kopira niz – za kopiju koristi Clone().
  • Metode stringa vraćaju nov string; sačuvaj rezultat (s = s.ToLower();).
  • Za tekst koji se gradi u petlji koristi StringBuilder.

Proveri znanje

Otvori kviz

Nizovi i stringovi u C#

1. Koji je indeks poslednjeg elementa niza a?




2. Šta se dešava posle int[] b = a; b[0] = 5;?




3. Kako se u C#-u porede dva stringa po sadržaju?




4. Koja klasa je najbolja za građenje dugog teksta u petlji?