Podaci i operatori u C#: tipovi, promenljive, unos i ispis

Lekcija 3 od 15 · C#

Svaki podatak u programu čuva se u promenljivoj određenog tipa. Tip određuje koje vrednosti promenljiva može da ima i koje operacije su dozvoljene. U ovoj lekciji su osnovni tipovi C#-a, operatori, unos sa tastature (Console.ReadLine), pretvaranje teksta u broj i lepo formatiran ispis.

Pre nego što počneš: potrebno predznanje – prva aplikacija u Visual Studiju.
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.

Promenljive i konstante

Promenljiva se pre upotrebe deklariše: navodi se tip, pa ime. Vrednost se zadaje operatorom dodele =, odmah ili kasnije.

using System;

class Program
{
    static void Main()
    {
        int brojUcenika;              // deklaracija
        brojUcenika = 28;             // dodela vrednosti
        double prosek = 4.37;         // deklaracija sa početnom vrednošću
        char ocena = 'A';             // jedan znak – jednostruki navodnici
        bool polozio = true;          // logička vrednost: true ili false
        string ime = "Marija";        // tekst – dvostruki navodnici

        Console.WriteLine(ime + " ima prosek " + prosek);
        Console.WriteLine($"U odeljenju je {brojUcenika} ucenika.");
        Console.WriteLine($"Ocena: {ocena}, polozio: {polozio}");
    }
}

Tekst koji počinje znakom $ je interpolirani string: izraz u vitičastim zagradama {…} zamenjuje se svojom vrednošću. To je pregledniji način od spajanja delova operatorom +. Primeti da se logička vrednost ispisuje kao True, velikim početnim slovom.

Ime promenljive počinje slovom ili znakom _; po dogovoru lokalne promenljive se pišu camelCase (brojUcenika), a metode i klase PascalCase (WriteLine, Program). Velika i mala slova se razlikuju.

using System;

class Program
{
    static void Main()
    {
        var brojac = 10;              // kompajler sam zaključuje tip: int
        var poruka = "Zdravo";        // string
        const double PI = 3.14159;    // konstanta – vrednost se ne može menjati
        double r = 2;

        Console.WriteLine($"{poruka}! brojac = {brojac}");
        Console.WriteLine($"Obim kruga: {2 * r * PI}");
        // PI = 3;                    // greška: konstanti se ne može dodeliti nova vrednost
    }
}

Ključna reč var ne znači „bilo koji tip“: tip se određuje iz početne vrednosti i posle se ne menja. Zato var uvek mora imati početnu vrednost.

Osnovni tipovi podataka

TipVeličinaVrednostiPrimer
int4 bajtaoko ±2,1 milijardeint n = 150000;
long8 bajtovaoko ±9,2 · 1018long l = 8000000000;
double8 bajtovarealni brojevi, oko 15 značajnih cifaradouble d = 3.14;
decimal16 bajtovatačni decimalni brojevi (novac)decimal c = 99.90m;
char2 bajtajedan znak (Unicode)char z = 'Ž';
bool1 bajttrue ili falsebool ok = false;
string–tekst proizvoljne dužinestring s = "C#";

Za cele brojeve najčešće se koristi int, a kada vrednosti mogu preći 2 milijarde – long. Za realne brojeve koristi se double, a za novčane iznose decimal (broj se završava slovom m), jer on decimalne vrednosti pamti tačno.

using System;

class Program
{
    static void Main()
    {
        Console.WriteLine($"int:  {int.MinValue} .. {int.MaxValue}");
        Console.WriteLine($"long: {long.MinValue} .. {long.MaxValue}");
        int x = int.MaxValue;
        x = x + 1;                    // prekoračenje: rezultat "preskoči" na najmanji int
        Console.WriteLine($"int.MaxValue + 1 = {x}");
        Console.WriteLine(0.1 + 0.2 == 0.3);       // double nije tačan
        Console.WriteLine(0.1m + 0.2m == 0.3m);    // decimal jeste
    }
}
Pazi na prekoračenje! C# ne javlja grešku kada rezultat ne stane u tip – vrednost se tiho „prelije“. Ako očekuješ velike brojeve, koristi long.

Operatori

Aritmetički operatori su + - * / %. Kada su oba operanda celi brojevi, / je celobrojno deljenje (decimale se odbacuju), a % daje ostatak.

using System;

class Program
{
    static void Main()
    {
        int a = 17, b = 5;
        Console.WriteLine($"{a} + {b} = {a + b}");
        Console.WriteLine($"{a} - {b} = {a - b}");
        Console.WriteLine($"{a} * {b} = {a * b}");
        Console.WriteLine($"{a} / {b} = {a / b}");           // celobrojno deljenje
        Console.WriteLine($"{a} % {b} = {a % b}");           // ostatak pri deljenju
        Console.WriteLine($"{a} / {b} = {(double)a / b}");   // realno deljenje

        int n = 10;
        n += 5;                       // isto što i n = n + 5
        n++;                          // uvećanje za 1
        Console.WriteLine($"n = {n}");

        bool uslov = a > b && b != 0; // relacioni i logički operatori
        Console.WriteLine($"a > b i b != 0: {uslov}");
        Console.WriteLine($"Koren iz 2: {Math.Sqrt(2):F4}");
        Console.WriteLine($"2 na 10: {Math.Pow(2, 10)}");
    }
}
VrstaOperatoriPrimer
relacioni== != < <= > >=x >= 18
logički&& (i), || (ili), ! (ne)x > 0 && x < 10
dodela= += -= *= /= %=suma += x
uvećanje i umanjenje++ --i++

Klasa Math sadrži matematičke funkcije: Math.Sqrt, Math.Pow, Math.Abs, Math.Max, Math.Min, Math.Round i konstantu Math.PI.

Unos podataka sa tastature

Console.ReadLine() učitava ceo red teksta i vraća ga kao string. Da bismo dobili broj, tekst pretvaramo metodom int.Parse (ili double.Parse, long.Parse…).

using System;

class Program
{
    static void Main()
    {
        Console.Write("Unesi ime: ");              // Write ne prelazi u novi red
        string ime = Console.ReadLine();
        Console.Write("Unesi godinu rodjenja: ");
        int godina = int.Parse(Console.ReadLine()); // tekst -> ceo broj
        int starost = 2026 - godina;
        Console.WriteLine($"{ime}, ove godine punis {starost}.");
    }
}

Kada je više brojeva u istom redu, red se deli na delove metodom Split, pa se svaki deo pretvara u broj:

using System;

class Program
{
    static void Main()
    {
        // ulaz: 12 30
        string[] delovi = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries);
        int a = int.Parse(delovi[0]);
        int b = int.Parse(delovi[1]);
        Console.WriteLine($"Zbir: {a + b}");
        Console.WriteLine($"Proizvod: {a * b}");
    }
}

Ako korisnik unese nešto što nije broj, int.Parse prekida program greškom. Bezbedniji je int.TryParse: vraća true ako je pretvaranje uspelo, a broj upisuje u promenljivu iza reči out.

using System;

class Program
{
    static void Main()
    {
        Console.Write("Unesi ceo broj: ");
        string unos = Console.ReadLine();
        if (int.TryParse(unos, out int broj))      // uspelo -> broj ima vrednost
            Console.WriteLine($"Dvostruko: {2 * broj}");
        else
            Console.WriteLine($"\"{unos}\" nije ceo broj.");
    }
}

Naredba if detaljno je objašnjena u sledećoj lekciji.

Konverzije i formatiran ispis

Iz „manjeg“ u „veći“ tip (npr. int u long ili double) vrednost se pretvara automatski. U suprotnom smeru se piše eksplicitna konverzija – tip u zagradi – i deo vrednosti može da se izgubi.

using System;

class Program
{
    static void Main()
    {
        double cena = 1499.75;
        int ceo = (int)cena;                // decimale se odbacuju
        long veliki = ceo;                  // int -> long ide automatski
        int izStringa = int.Parse("250");
        string uString = 42.ToString();

        Console.WriteLine(ceo);
        Console.WriteLine(veliki * 1000000);
        Console.WriteLine($"{Math.Round(2.5)} {Math.Round(3.5)}");  // zaokruživanje na paran broj
        Console.WriteLine(izStringa + 1);   // sabiranje brojeva
        Console.WriteLine(uString + 1);     // spajanje teksta
        Console.WriteLine($"{cena:F1} din");        // jedna decimala
        Console.WriteLine($"[{ceo,8}]");            // širina 8, poravnato desno
        Console.WriteLine($"[{"C#",-6}]");           // širina 6, poravnato levo
    }
}

Math.Round vrednost tačno na sredini zaokružuje ka parnom broju (2,5 → 2, a 3,5 → 4). Za „školsko“ zaokruživanje koristi Math.Round(x, MidpointRounding.AwayFromZero).

Decimalni zarez ili tačka? Ispis i unos realnih brojeva zavise od regionalnih podešavanja računara. Ako Windows koristi srpska podešavanja, program će ispisati 1499,8 umesto 1499.8, a double.Parse će očekivati zarez. Izlazi u ovim lekcijama su prikazani sa tačkom.
Slova č, ć, š, ž, đ u konzoli. Ako se umesto njih pojave upitnici, na početak metode Main dodaj Console.OutputEncoding = System.Text.Encoding.UTF8;. U primerima ispis zato ide bez dijakritika.

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

Sekunde u sate

Učitati broj sekundi n (0 ≤ n < 86400) i ispisati vreme u obliku h:mm:ss – minuti i sekunde uvek sa dve cifre.

Primer 1

Ulaz

3725

Izlaz

1:02:05

Primer 2

Ulaz

86399

Izlaz

23:59:59
ZADATAK 02Težina: lako

Cifre trocifrenog broja

Učitati trocifreni broj i ispisati zbir njegovih cifara i broj zapisan obrnutim redosledom cifara.

Primer 1

Ulaz

472

Izlaz

Zbir cifara: 13
Obrnuto: 274

Primer 2

Ulaz

105

Izlaz

Zbir cifara: 6
Obrnuto: 501
Česte greške i saveti
  • Tekst je u dvostrukim navodnicima ("A" je string), a znak u jednostrukim ('A' je char).
  • 7 / 2 je 3, a 7.0 / 2 ili (double)7 / 2 je 3,5.
  • Console.ReadLine() uvek vraća tekst – pre računanja ga pretvori u broj.
  • Za novac koristi decimal, ne double.

Proveri znanje

Otvori kviz

Podaci i operatori u C#

1. Koliko je 17 / 5 ako su oba broja tipa int?




2. Koji tip je najbolji za čuvanje cene proizvoda?




3. Šta vraća Console.ReadLine()?




4. Šta radi int.TryParse kada tekst nije broj?