Znakovni Niz-Uc

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 11

Znak

Ako je podatak znak, njegova oznaka tipa je char. Podatak tipa char je predstavljen jednim znakom
unutar jednostrukih navodnika ili ASCII vrijednošću tog znaka.

Znakovni niz
Više znakova čini znakovni niz (engl. character string). Znakovni niz je jednodimenzionalno polje čiji
su članovi znakovi (char).

Kao i svaki drugi niz, string se može inicijalizirati prilikom deklaracije (ali ne kasnije).

char p[10] = {'a','b','c','\0'};

char pozdrav[10] = "Zdravo";

char ime[] = "Ahmed";

char X [] = “Ovo je znakovni niz”

String literali označeni su dvostrukim navodnicima, a char literali jednostrukim navodnicima


(apostrofima).

'A‘ - Jedan znak (ASCII 65)

"A" - Niz znakova dužine 2 čiji su članovi 'A' i '\0'

Znakovni niz se u memoriju sprema ovako:

Svaki znakovni niz završava zaključnim znakom ‘\0’ (engl. null character). Taj znak ne treba posebno
navoditi, ali treba znati da on zauzima jedno mjesto u memoriji.
Pr.
#include<iostream>
using namespace std;
int main()
{
int i;
char rec[30]="Ovo je string";
cout<<"recenica:"<<rec<<endl;
for(i=0;rec[i]!='\0';i++)
cout<<rec[i]<<endl;
return 0;
}

Funkcije za rad sa tekstualnim nizovima - Biblioteka cstring definiše niz korisnih funkcija:
strlen(char[] niza)– vrijednost funkcije je dužina niza bez znaka null

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int i;
char red[30]="Ovo je string";
cout<<"string je:"<<red<<endl;
for(i=strlen(red);i>=0;i--)
cout<<red[i];
return 0;
}

Naredbe ulaza
Naredba cin >> text, čita riječ koja se unosi preko tastature i dodeljuje se
promjenljivoj text. Na kraju teksta se automatski unosi i znak null. Znači cin>> čita podatke
sve do prvog pojavljivanja praznog mjesta.
Ukoliko iz bilo kojeg razloga želimo da izdvojimo znak iz ulaznog toka, bez ikakvog
ignoriranja, ma kakav on bio (uključujući razmake, specijalne znake tipa oznake novog reda
'\n', itd.) možemo koristiti poziv funkcije “get” bez parametara nad objektom ulaznog toka
(“cin.get()”). Ova funkcija izdvaja sljedeći znak iz ulaznog toka, ma kakav on bio, i vraća ga
kao rezultat .
Ako je potrebno pročitati cio red uvodi se funkcija  cin.getline(char[], N). Bilo kakva
iole složenija manipulacija sa tekstualnim podacima bila bi izuzetno mukotrpna ukoliko bi se
oni morali obrađivati isključivo znak po znak. Stoga je pomoću funkcije “getline” nad
objektom ulaznog toka moguće učitati čitav niz znakova odjedanput. Ova funkcija se može
koristiti na više načina, a obično se koristi sa dva ili tri parametra. Ukoliko se koristi sa dva
parametra, tada prvi parametar predstavlja niz znakova u koji se smještaju pročitani znakovi,
dok drugi parametar predstavlja broj koji je za jedinicu veći od maksimalnog broja znakova
koji će se pročitati (smisao ove razlike od jednog znaka je da se može smjestiti i nul-graničnik
koji služi kao oznaka kraja stringa). U slučaju da se prije toga dostigne kraj reda, biće
pročitano manje znakova, odnosno neće biti zatražen unos novih znakova. Drugim riječima,
sekvenca naredbi

char recenica[50]; cin.getline(recenica, 50);

deklarira niz od 50 znakova, a zatim traži od korisnika unos sa ulaznog uređaja (recimo
tastature), nakon čega smješta najviše 49 pročitanih znakova iz ulaznog toka u niz “recenica”
(ukoliko je uneseno manje od 49 znakova smjestiće se svi znakovi). Kao i do sada, pročitani
znakovi se uklanjaju iz ulaznog toka (eventualno nepročitani znakovi ostaju i dalje u ulaznom
toku). Da bismo izbjegli brojanje koliki je kapacitet niza “recenica” i olakšali izmjene
programa u slučaju da se kapacitet promijeni, poželjno je koristiti operator “sizeof” koji,
upotrijebljen nad nekom promjenljivom, daje broj bajtova koja ta promjenljiva zauzima u
memoriji (što je u slučaju nizova znakova upravo jednako kapacitetu niza, jer jedan znak
zauzima tačno jedan bajt). Stoga se kao drugi parametar funkcije “getline” obično zadaje
rezultat operatora “sizeof” primijenjenog na prvi parametar, kao u sljedećem fragmentu, koji
je funkcionalno ekvivalentan prethodnom fragmentu:

char recenica[50];
cin.getline(recenica, sizeof recenica);

Jedina razlika od funkcije “ getline”, funkcija “get” ne uklanja granični znak (oznaku kraja reda ) iz
ulaznog toka, nego ga ostavlja u ulaznom toku.

Primjer 1.
Mogućnost iščitavanja znakova znak po znak pomoću funkcije “ get” demonstriraćemo sljedećim
primjerom. Petlja se izvršava sve dok se ne detektira oznaka kraja reda.

#include<iostream>
using namespace std;
int main()
{
int br=0;
char znak;
do
{
znak=cin.get();
br++;

}while(znak!='\n');
cout<<"Broj znakova iznosi "<<br;
return 0;
}

Primjer 2.
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int br=0;
char recenica[50];
cout<<"Unesi recenicu "<<endl;
cin>>recenica;
cout<<"cin-recenica: "<<recenica<<" Broj znakova iznosi "<<strlen(recenica);
return 0;
}
Primjer 3.

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int br=0;
char recenica[50];
cout<<"Unesi recenicu "<<endl;
cin.getline(recenica,50);
cout<<"getline recenica:"<<recenica<<" Broj znakova iznosi "<<strlen(recenica);
return 0;
}

Bitno je istaći da u slučaju kada se u istom programu naizmjenično koriste operator “>>” i
funkcije “getline” odnosno “get” može veoma lako doći do ozbiljnih problema ukoliko
programer nije oprezan. To se najlakše može dogoditi ukoliko se u istom programu unose i
brojčani i tekstualni podaci. Na primjer, razmotrimo sljedeći program:

#include<iostream>
using namespace std;
int main()
{
int br=0;
char recenica[50];
cout<<"Unesi broj:";
cin>>br;
cout<<"Unesi recenicu "<<endl;
cin.getline(recenica,50);
cout<<"Broj:"<<br<<" recenica:"<<recenica;
return 0;
}
Ovaj program neće raditi kako je očekivano. Naime, probleme pravi operator izdvajanja “>>”
koji prekida izdvajanje na prvom razmaku ili oznaci kraja reda, ali ne uklanja iz izlaznog toka
znak na kojem je izdvajanje prekinuto. Tako, pretpostavimo da je na pitanje “Unesi broj: ”
korisnik unio neki broj (npr. 123) i pritisnuo tipku ENTER. Tada će se u ulaznom toku nalaziti
znakovi '1', '2', '3' i oznaka kraja reda '\n'. Izraz “cin >> broj” će izdvojiti znakove '1', '2', '3' iz
ulaznog toka, ali oznaka kraja reda '\n' i dalje ostaje u ulaznom toku. Kada bi se nakon toga
ponovo koristio operator “>>”, ne bi bilo problema, jer on svakako podrazumijevano ignorira
sve praznine, poput razmaka i oznake kraja reda. Međutim, funkcija “getline” (koja ne
ignorira praznine) odmah na početku pronalazi oznaku kraja reda u ulaznom toku (i pri tom
ga uklanja), čime se njen rad odmah završava, i u niz “recenica” neće se smjestiti ništa osim
nul-graničnika, tako da “recenica” postaje prazan string, što svakako nije ono što bi trebalo
da bude!

Postoji više jednostavnih načina za rješavanje gore opisanog problema. Na primjer, moguće
je nakon učitavanja broja pozvati funkciju “ignore” pomoću koje ćemo forsirano ukloniti sve
znakove iz ulaznog toka, uključujući i problematičnu oznaku kraja reda. Poziv funkcije
“ignore” će zapravo isprazniti čitav ulazni tok, a ne samo ukloniti oznaku za kraj reda.

#include<iostream>
using namespace std;
int main()
{
int br=0;
char recenica[50];
cout<<"Unesi broj:";
cin>>br;
cin.ignore();
cout<<"Unesi recenicu "<<endl;
cin.getline(recenica,50);
cout<<"Broj:"<<br<<" recenica:"<<recenica;
return 0;
}

Često nam je potrebno da se znakovi iščitavaju jedan po jedan, i zatim izvrše razna
pretvaranja. Pretvorbe se obavljaju sitnim manipulacijama sa ASCII šiframa znakova ili
primjenom funkcija iz biblioteke „cctype“.

ZNAKOVI (CHAR)
Svaki znak (tip char oznaka ' ') pohranjuje se u memoriji u vidu niza 0 i 1 dužine 8 bita (1 Bajt)
prema ASCII standardu (americko standardno kodiranje za razmjenu podataka) Ova tabela
ima 28=256 znakovnih vrijednosti. Vrijednosti u intervalu od 0-31 te 127 spadaju u neispisive
znakove na ekranu. Vrijednosti od 32 do 126 su znakovi koje koristimo, a vrijednosti od 128-
255 nisu definisana osnovnom ASCII tabelom ali su koristena za internacionalne znakove koji
ne postoje u engleskom alfabetu.Ova primjena je danas napustena, te se za prikaz
nacionalnih karaktera obično koristi Unicode, koji koristi više od jednog bajta.
Velika slova: 65-90 Mala slova:97-122 Razlika je 32
Prebacivanje velikih u mala:
If(znak>=65 && znak<=90) znak+=32;
If(znak>='A' && znak<='Z') znak+=32;
If(znak>='A' && znak<='Z') znak+='a'-'A';

Alternativno, pretvorbu malih slova u velika možemo ostvariti pozivom funkcije “toupper” iz
biblioteke “cctype” (za njeno korištenje, neophodno je uključiti zaglavlje ove biblioteke u
program).
if(islower(znak)) znak=toupper(znak);

FUNKCIJE IZ DATOTEKE <CCTYPE>


Datoteka zaglavlja <cctype>sadrži deklaraciju niza funkcija koje služe testiranju znakova.
Svaka od tih funkcija uzima jedan argument tipa int koji treba biti znak ili EOF i vraća
vrijednost tipa int koja je različita od nule (istina) ako je uvjet ispunjen ili nula ako nije.
Neke od funkcija su sljedeće:

 isalnum() Alfanumerički znak


 isalpha() Alfabetski znak
 iscntrl() Kontrolni znak
 isdigit() Znamenka
 isgraph() Printabilni znak osim razmaka
 islower() Malo slovo
 isprint() Printabilni znak
 ispunct() Printabilni znak osim razmaka, slova i brojeva
 isspace() Razmak
 isupper() Veliko slovo
Dvije funkcije koje omogućavaju konverziju velikih slova u mala i obratno. Ostale znakove ne
mijenjaju .
tolower() Veliko slovo u malo
toupper() Malo slovo u veliko

Primjer 1: Prebrojavanje velikih slova


#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int i,br=0;
char znak[50];
cout<<"Unesi recenicu "<<endl;
cin.getline(znak,50);
for(i=0;i<strlen(znak);i++)
if(znak[i]>='A'&&znak[i]<='Z')br++;
cout<<"Ukupno velikih slova ima:"<<br;
return 0;
}

Primjer 2-Prebacivanje velikih u mala slova manipulacijama ASCII siframa


#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int i,br=0;
char znak[50];
cout<<"Unesi recenicu "<<endl;
cin.getline(znak,50);
for(i=0;i<strlen(znak);i++)
if(znak[i]>='A'&&znak[i]<='Z') znak[i]+=32;
cout<<"recenica je:"<<znak;
return 0;
}
Primjer 3- Prebacivanje velikih u mala slova pozivom funkcija iz biblioteke “cctype”
#include<iostream>
#include<cstring>
#include<cctype>
using namespace std;
int main()
{
int i;
char znak[50];
cout<<"Unesi recenicu "<<endl;
cin.getline(znak,50);
for(i=0;i<strlen(znak);i++)
if(isupper(znak[i])) znak[i]=tolower(znak[i]);
cout<<"recenica je:"<<znak;
return 0;
}

#include <iostream>

#include <cstring>

using namespace std;

int main()

char rec[50];

int i,br=0;

cout<<"unesi recenicu "<<endl;

cin.getline(rec,50);

for(i=0;i<strlen(rec);i++){

switch(rec[i]){

case('1'):br++;break;

case('3'):br++;break;

case('5'):br++;break;

case('7'):br++;break;

case('9'):br++;break;

}
cout<<"neparnih cifara je "<<br<<endl;

return 0;

You might also like