uvod-u-cpp/lekcije/niske_uvod.md
2025-02-08 13:22:49 +01:00

5.5 KiB

↩ Nazad na sadržaj

Niske

Do sada smo isključivo radili sa brojevima i logičkim izrazima, i naučili smo sta su grananje i petlje. Ipak, u modernom svetu, veliki broj podataka nisu brojevi već tekst. Zapravo, smatra se da je oko 80% svih podataka na internetu zapravo tekstualnog formata!

Odakle naziv "niska"?

Niska u programiranju (engl. string) se tako zove jer predstavlja niz znakova (karaktera) koji su povezani kao "nit" ili "konac" (što je jedno od značenja reči „niska” u srpskom jeziku).

U engleskom jeziku, reč string doslovno znači „konopac” ili „niz”, što slikovito opisuje način na koji su slova povezane u sekvencu. Ovaj termin se prenosi u mnoge jezike, a u srpskom je „niska” prirodan prevod jer se koristi i za „niske bisera” ili bilo kakve povezane sekvence elemenata.

Drugim rečima, niska je niz karaktera koji su poređani jedan za drugim u memoriji - baš kao što su perle nanizane na konac.

Niske u C++u

Šta je tekst s tačke gledišta C++a? C++ tekstualne podatke posmatra kao 'nisku' karaktera - pojedinačnih slova. Odavde uvodimo dva nova tipa podataka - tip karaktera (slova) char i tekstualni tip string.

Tip char nam je manje zanimljiv, i gledaćemo ga najviše kao sastavni deo duže niske. Primer deklarisanja promenljive tipa char je:

char slovo = 'A';

Obratite pažnju na jednostruke navodnike! Char se može zapisati samo uz njih, i nešto poput 'ab' ne bi bilo dozvoljeno u jeziku. Dakle, C++ char predstavlja samo jedno slovo (ili neki drugi znak - dozvoljena je interpunkcija, zagrade, razmaci, cifre,...).

S druge strane, string se koristi da prikaže duži niz slova - bilo to reč, rečenica, ili čak čitav duži tekst. Da bismo koristili string-ove potrebno je uključiti zaglavlje <string>:

#include <string>
...
string jezik = "C++";

Obratite pažnju na dvostruke navodnike - tip string se zapisuje baš uz pomoć njih, za razliku od pojedinačnih slova.

String ćemo takođe često zvati niska. Niske mozemo unositi i ispisivati kao i druge tipove koje smo već naucili. Na primer, sledeći program pita korisnika kako se zove pa ga pozdravlja:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string ime;
    cout << "Kako se zoves?" << endl;
    cin >> ime;
    cout << "Cao, " << ime << endl;
}

Naprednije funkcionalnosti

Sa podacima tipa string možemo raditi dosta zanimljivih stvari.

Na primer, možemo nadovezati dve ili više niski koristeći +:

// ispisuje "Volimo C++" (bez navodnika, nadalje takodje)
cout << "Volimo " + jezik << endl; 

// ispisuje "Volimo C++ najvise na svetu"
cout << "Volimo " + jezik + " najvise na svetu" << endl; 

Možemo napraviti nisku koja ponavlja n slova koristeći poseban konstruktor string(duzina, slovo):

// ispisuje "-----"
cout << string(5, '-') << endl;

Mozemo sazanti dužinu niske koristeći funkciju size():

//                       111111111122
//              123456789012345678901
string skola = "Matematicka gimnazija";

cout << skola.size() << endl; // ispisuje 21

Druge naprednije mogućnosti ćemo naučiti kasnije, a sad da vidimo par primera!

Primeri: iscrtavanje pravilnih oblika

Iscrtavanje kvadrata stranice n

Dat je prirodan broj n i potrebno je iscrtati kvadrat sasatvljen iz zvezdica '*' dimenzija n na n. Na primer, za n = 5, kvadrat će izgledati ovako:

*****
*****
*****
*****
*****

Ovo možemo da postignemo tako što n puta iscrtavamo n zvezdica (što možemo da uradimo uz pomoć string-a!), tj zadatak rešavamo red po red:

#include <iostream>
#include <string>
using namespace std;
int main() {
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cout << string(n, '*') << endl;
    }
}

Iscrtavanje šupljeg trougla

Postavka je slična prošlom zadatku, ali ovaj put crtamo trougao čija je kateta duzine n, i koji je šupalj. Na primer, za n = 7, treba iscrtati ovo:

*
**
* *
*  *
*   *
*    *
*******

Ovaj zadatak možemo rešiti iz više delova. Primetimo da se svi redovi trougla sem prvog i poslednjeg mogu predstaviti kao dve zvezdice sa nekim brojem razmaka između njih (0 u drugom redu, 4 u pretposlednjem).

Kako da znamo koliko razmaka ima u redu broj k (brojimo od 1)?

  • Drugi red je dužine 2, i ima 2 zvezdice -> 0 razmaka,
  • Treći red je dužine 3, i ima 2 zvezdice -> 1 razmak,
  • Četvrti red je dužine 4, i ima 2 zvezdice -> 2 razmaka,
  • ...
  • Red k je dužine k i ima 2 zvezdice, odnosno k-2 razmaka.

Iz toga dobijemo rešenje:

#include <iostream>
#include <string>
using namespace std;
int main() {
    int n;
    cin >> n;

    // prvi red - poseban slucaj jer imamo samo jednu zvezdicu
    cout << "*" << endl;

    // od drugog do pretposldnjeg reda radimo gore opisan postupak
    for(int k = 2 ; k <= n - 1; k++) {
        cout << "*" + string(k - 2, ' ') + "*" << endl;
    }

    // poslednji red - poseban slucaj, sadrzi `n` zvezdica
    cout << string(n, '*') << endl;
}

Zadaci za vežbu

Napišite programe koji za date dužine stranica / dijagonala crtaju sledeće oblike:

Šuplji kvadrat

Data je dužina stranice. Na primer za n = 5:

*****
*   *
*   *
*   *
*****

Smešten trougao

Data je dužina stranice. Na primer za n = 6:

      *
     **
    *** 
   ****
  *****
 ******

Romb

Data je dužina dijagonale (uvek neparan broj). Na primer za n = 7:

   *
  ***
 *****
*******
 *****
  ***
   *