diff --git a/README.md b/README.md index eea4749..17e8af5 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,5 @@ - [Šta su biblioteke u jeziku C++?](./lekcije/sta_su_biblioteke.md) (iostream, iomanip, cmath, ...) - [Matematičke funkcije](./lekcije/matematicke_funkcije.md) (sqrt, pow, min, max i druge) - [Ispis realnih brojeva](./lekcije/ispis_realnih.md) (i lekcija o snalažljivosti!) +- [Uvod u niske - `std::string`](./lekcije/niske_uvod.md) - [Uvod u nizove](./lekcije/nizovi_uvod.md) diff --git a/lekcije/niske_uvod.md b/lekcije/niske_uvod.md new file mode 100644 index 0000000..4cf514d --- /dev/null +++ b/lekcije/niske_uvod.md @@ -0,0 +1,186 @@ +[↩ Nazad na sadržaj](../README.md) + +# 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: +```c++ +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 ``: +```c++ +#include +... +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: +```c++ +#include +#include + +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 `+`: +```c++ +// 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)`: +```c++ +// ispisuje "-----" +cout << string(5, '-') << endl; +``` + +Mozemo sazanti dužinu niske koristeći funkciju `size()`: +```c++ +// 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: +```c++ +#include +#include +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: +```c++ +#include +#include +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`: +```c++ +***** +* * +* * +* * +***** +``` + +### 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`: +``` + * + *** + ***** +******* + ***** + *** + * +```