Uvod u niske
This commit is contained in:
parent
cbe63ecf5a
commit
d8f38080c1
@ -5,4 +5,5 @@
|
|||||||
- [Šta su biblioteke u jeziku C++?](./lekcije/sta_su_biblioteke.md) (iostream, iomanip, cmath, ...)
|
- [Š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)
|
- [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!)
|
- [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)
|
- [Uvod u nizove](./lekcije/nizovi_uvod.md)
|
||||||
|
186
lekcije/niske_uvod.md
Normal file
186
lekcije/niske_uvod.md
Normal file
@ -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!
|
||||||
|
|
||||||
|
<details><summary>Odakle naziv "niska"?</summary>
|
||||||
|
|
||||||
|
> 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.
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## 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 `<string>`:
|
||||||
|
```c++
|
||||||
|
#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:
|
||||||
|
```c++
|
||||||
|
#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 `+`:
|
||||||
|
```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 <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:
|
||||||
|
```c++
|
||||||
|
#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`:
|
||||||
|
```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`:
|
||||||
|
```
|
||||||
|
*
|
||||||
|
***
|
||||||
|
*****
|
||||||
|
*******
|
||||||
|
*****
|
||||||
|
***
|
||||||
|
*
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user