Grananje i petlje u C#: if, switch, for, while i foreach

Lekcija 4 od 15 · C#

Program ne mora da izvršava naredbe uvek istim redom. Grananje bira koji deo koda će se izvršiti u zavisnosti od uslova, a petlje ponavljaju isti deo koda više puta. Sintaksa je skoro ista kao u jezicima C, C++ i Java, a C# dodaje i switch izraz i petlju foreach.

Pre nego što počneš: potrebno predznanje – podaci i operatori.
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.

Naredba if – else

Uslov u zagradi mora biti tipa bool. Više uslova se nadovezuje sa else if; proverava se redom i izvršava se samo prva grana čiji je uslov tačan.

using System;

class Program
{
    static void Main()
    {
        int poeni = int.Parse(Console.ReadLine());
        int ocena;
        if (poeni >= 90)
            ocena = 5;
        else if (poeni >= 75)
            ocena = 4;
        else if (poeni >= 60)
            ocena = 3;
        else if (poeni >= 45)
            ocena = 2;
        else
            ocena = 1;
        Console.WriteLine($"Ocena: {ocena}");
    }
}

Kada grana ima više naredbi, piše se blok u vitičastim zagradama { … }. Za izbor između dve vrednosti postoji kraći uslovni operator: uslov ? vrednost1 : vrednost2.

Naredba switch i switch izraz

Kada se jedna vrednost poredi sa više konstanti, pregledniji je switch. Svaka grana se završava naredbom break; više oznaka case može deliti istu granu, a od C# 9 dozvoljeni su i uslovi poput case >= 1 and <= 5.

using System;

class Program
{
    static void Main()
    {
        int dan = int.Parse(Console.ReadLine());
        switch (dan)
        {
            case 6:
            case 7:
                Console.WriteLine("Vikend");
                break;
            case >= 1 and <= 5:             // relacioni obrazac (C# 9)
                Console.WriteLine("Radni dan");
                break;
            default:                        // nijedan slučaj nije odgovarao
                Console.WriteLine("Pogresan unos");
                break;
        }
    }
}

switch izraz vraća vrednost: svaki slučaj je oblika obrazac => vrednost, a _ označava „sve ostalo“.

using System;

class Program
{
    static void Main()
    {
        int mesec = int.Parse(Console.ReadLine());
        string godisnjeDoba = mesec switch
        {
            12 or 1 or 2 => "zima",
            3 or 4 or 5 => "prolece",
            6 or 7 or 8 => "leto",
            9 or 10 or 11 => "jesen",
            _ => "nepostojeci mesec"
        };
        Console.WriteLine(godisnjeDoba);
        string parnost = mesec % 2 == 0 ? "paran" : "neparan";   // uslovni operator
        Console.WriteLine($"Broj {mesec} je {parnost}.");
    }
}

Petlje for, while i do-while

for se koristi kada se unapred zna broj ponavljanja. while ponavlja dok je uslov tačan i uslov proverava pre svakog prolaza. do-while uslov proverava posle prolaza, pa se telo izvrši bar jednom.

using System;

class Program
{
    static void Main()
    {
        // for: početak; uslov; korak
        for (int i = 1; i <= 5; i++)
            Console.Write(i * i + " ");
        Console.WriteLine();

        // while: broj cifara broja
        int n = 90210, cifara = 0;
        while (n > 0)
        {
            n /= 10;
            cifara++;
        }
        Console.WriteLine($"Broj cifara: {cifara}");

        // do-while: telo se izvrši bar jednom
        int k = 0;
        do
        {
            Console.Write(k + " ");
            k += 3;
        } while (k < 10);
        Console.WriteLine();
    }
}

Petlje se mogu ugnježdavati: unutrašnja petlja se izvrši cela za svaki prolaz spoljašnje.

using System;

class Program
{
    static void Main()
    {
        for (int i = 1; i <= 4; i++)
        {
            for (int j = 1; j <= 4; j++)
                Console.Write($"{i * j,4}");     // svaki broj zauzima 4 mesta
            Console.WriteLine();
        }
    }
}

Petlja foreach, break i continue

foreach prolazi kroz sve elemente niza ili kolekcije, bez brojača. Naredba continue preskače ostatak tekućeg prolaza, a break odmah prekida petlju.

using System;

class Program
{
    static void Main()
    {
        int[] brojevi = { 4, -2, 7, 0, 9, 12, -5 };
        int zbir = 0;
        foreach (int x in brojevi)
        {
            if (x < 0) continue;        // preskoči negativne
            if (x > 10) break;          // prekini kod prvog broja većeg od 10
            zbir += x;
        }
        Console.WriteLine($"Zbir: {zbir}");
    }
}

Sabrani su 4, 7, 0 i 9; broj −2 je preskočen, a kod broja 12 petlja je prekinuta, pa se −5 ni ne proverava. Nizovi su detaljno objašnjeni u sledećoj lekciji.

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

Najveći i najmanji

U prvom redu je broj n, a u drugom n celih brojeva razdvojenih razmakom. Ispisati najveći i najmanji broj.

Primer

Ulaz

5
3 -8 12 7 0

Izlaz

Najveci: 12
Najmanji: -8
ZADATAK 02Težina: srednje

Prosti brojevi do n

Učitati n (n ≥ 2) i ispisati sve proste brojeve od 2 do n, razdvojene razmakom.

Primer

Ulaz

30

Izlaz

2 3 5 7 11 13 17 19 23 29
Česte greške i saveti
  • Poređenje se piše sa ==; jedno = je dodela i u uslovu je greška.
  • U switch naredbi svaka grana mora da se završi sa break (ili return).
  • Proveri da li se uslov while petlje nekad menja – inače petlja nema kraja.
  • U foreach petlji promenljiva je samo za čitanje; za izmenu elemenata niza koristi for.

Proveri znanje

Otvori kviz

Grananje i petlje u C#

1. Koliko puta se izvrši telo petlje for (int i = 0; i < 5; i++)?




2. Koja petlja sigurno izvrši telo bar jednom?




3. Šta radi naredba continue?




4. Šta znači _ u switch izrazu?