programiranje 1 programski jezik c

40
Staša Vujičić Čas 12 V 1.2

Upload: zariel

Post on 06-Jan-2016

105 views

Category:

Documents


8 download

DESCRIPTION

Programiranje 1 programski jezik c. Staša Vujičić Čas 12 V 1.2. Stringovi – osnovni pojmovi. Niska karaktera ili string je niz karaktera koji se zavr š ava karakterom '\0'. Karakter '\0' ima ASCII vrednost 0 pa se mo ž e tuma č iti kao logi č ka vrednost ”neta č no”. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Programiranje 1  programski jezik c

Staša VujičićČas 12

V 1.2

Page 2: Programiranje 1  programski jezik c

Niska karaktera ili string je niz karaktera koji se završava karakterom '\0'.

Karakter '\0' ima ASCII vrednost 0 pa se može tumačiti kao logička vrednost ”netačno”.

2

Page 3: Programiranje 1  programski jezik c

Format za ispis niske pomoću funkcije printf je %s.

Konstante tipa niska se navode između znakova navodnika. Na primer:

char s[]="Primer stringa";

Pri tome je s niska od 15 karaktera:{'P', 'r', 'i', 'm', 'e', 'r', ' ', 's', 't', 'r', 'i', 'n', 'g', 'a', '\0'}

3

Page 4: Programiranje 1  programski jezik c

DEKLARACIJA i INICIJALIZACIJA STRINGOVA

char s1[] = {‘s’, ‘t’, ‘r’,’i’,’n’,’g’,’ ’, ‘1’ ‘\0’};

char s2[] = “string 2”;

char *s3 = “string 3”;

String može sadržati sve karaktere, ne samo slova

Svaki string se završava simbolom ‘\0’ – string terminator

Page 5: Programiranje 1  programski jezik c

ŠTAMPANjE STRINGOVA

Bez obzira kako je string deklarisan I inicijalizovan, uvek se može štampati ovako:

printf (“s1 = %s\n”, s1);

Page 6: Programiranje 1  programski jezik c

UČITAVANjE STRINGOVAchar s1[MAX];

char *s2;

scanf(“%s”, s1); OK, ako je učitan string dužine <MAX

scanf(“%s”, s2); !POGREŠNO: “Segmentation fault”

(pogledati primere) ! %s učitava niz neblanko karaktera

Page 7: Programiranje 1  programski jezik c

PRISTUP KARAKTERIMA STRINGAchar s[]=“neki string”;

indeksno: int i;karakteri stringa: s[0],s[1],…poslednji element je uvek ‘\0’adrese karaktera: &s[0], &s[1],…

pokazivački: karakteri stringa: *s, *(s+1), …Adrese karaktera: s, s+1,…

Page 8: Programiranje 1  programski jezik c

Kakva je razlika između ’s’ i ”s”?

’s’ je karakter ”s” je string ili niz od dva karaktera 's' i

'\0'.

8

Page 9: Programiranje 1  programski jezik c

Obrni string - obrće nisku karaktera.

#include <stdio.h>/* Ova funkcija racuna duzinu date niske

karaktera. Umesto nje, moguce je koristiti standardnu funkciju strlen .*/

int duzina_stringa(char s[]){

int i;for (i = 0; s[i]; i++);return i;

}

9

Page 10: Programiranje 1  programski jezik c

/* Funkcija obrce nisku karaktera */void obrni_string(char s[]){

int i, j;for (i = 0, j = duzina_stringa(s)-1; i<j; i++, j--){

int pom = s[i];s[i] = s[j];s[j] = pom;

}}

10

Page 11: Programiranje 1  programski jezik c

main(){

char s[] = "Zdravo svima";obrni_string(s);printf("%s\n", s);

}

Izlaz:amivs ovardZ

11

Page 12: Programiranje 1  programski jezik c

Uklanja beline, tabulatore ili znak za kraj reda sa kraja stringa.

int ukloni(char s[]){

int i;for (i = strlen(s)-1; i >= 0; i--)

if (s[i] != ' ' && s[i] != '\t' && s[i] != '\n')

break;s[i+1] = '\0';return i;

}12

Page 13: Programiranje 1  programski jezik c

Funkcije biblioteke <string.h> strcpy (string copy)

char *strcpy(char *s1, const char *s2);

strcpy kopira string s2 u string s1 strcpy vraća pokazivač na prvi karakter stringa

s1 strcpy podrazumeva da je string s2 dovoljno

velik za smeštanje celog stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)

!!! Stringovi se ne mogu kopirati naredbom dodele (npr s1=s2 je pogrešan način za kopiranje stringova)

(pogledati primer)

strcpy (string copy)

char *strcpy(char *s1, const char *s2);

strcpy kopira string s2 u string s1 strcpy vraća pokazivač na prvi karakter stringa

s1 strcpy podrazumeva da je string s2 dovoljno

velik za smeštanje celog stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)

!!! Stringovi se ne mogu kopirati naredbom dodele (npr s1=s2 je pogrešan način za kopiranje stringova)

(pogledati primer)

strcpy (string copy)

char *strcpy(char *s1, const char *s2);

strcpy kopira string s2 u string s1 strcpy vraća pokazivač na prvi karakter stringa

s1 strcpy podrazumeva da je string s2 dovoljno

velik za smeštanje celog stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)

!!! Stringovi se ne mogu kopirati naredbom dodele (npr s1=s2 je pogrešan način za kopiranje stringova)

(pogledati primer)

Page 14: Programiranje 1  programski jezik c

strcat (string concatanate)

char *strcat(char *s1, const char *s2);

strcat nadovezuje string s2 na string s1 strcat vraća pokazivač na prvi karakter stringa s1 strcat podrazumeva da je string s2 dovoljno velik

za smeštanje svih nadovezanih karaktera stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)

(pogledati primer)

Funkcije biblioteke <string.h>

Page 15: Programiranje 1  programski jezik c

Funkcije biblioteke <string.h>

strcmp (string compare)

int strcmp(const char *s1, const char *s2);

strcmp poredi dva stringa strcmp vraća: 0, ako je su s1 i s2 jednake <0, ako je s1 leksikografski ispred s2 (tj poredak s1,s2 jeste leksikografski ispravan) >0, ako je s1 leksikografski iza s2 (tj poredak s1,s2 nije leksikografski ispravan) !!! Stringovi se ne mogu porediti relacionim operatorima

(npr s1<s2 je pogrešan način za poređenje stringova)

(pogledati primer)

Page 16: Programiranje 1  programski jezik c

Funkcije biblioteke <string.h>

strstr (string string)

char *strstr(const char *s1, const char *s2)

strstr ispituje da li je niska s2 podstring niske s1 Ako jeste, strstr vraća adresu one pozicije u niski

s1 odakle počinje niska s2; u suprotnom, vraća NULL

(pogledati primer)

Page 17: Programiranje 1  programski jezik c

Funkcije biblioteke <string.h>

strchr (string string)

char *strchr(const char *s1, int c)

strchr ispituje da li se karakter c nalazi u niski s1 Ako se nalazi, strchr vraća adresu one pozicije u

niski s1 gde se karakter c prvi put pojavljuje; u suprotnom, vraća NULL

(pogledati primer)

Page 18: Programiranje 1  programski jezik c

#include <stdio.h>

/* Kopira string src u string dest. Pretpostavlja da u dest ima dovoljno prostora. */

void kopiraj_string(char dest[], char src[]){

int i;/* Kopira karakter po karakter, sve dok nije iskopiran

karakter '\0' */for (i = 0; src[i]!='\0'; i++)

dest[i]=src[i]; dest[i]=‘\0’;}

18

Page 19: Programiranje 1  programski jezik c

/* Nadovezuje string t na kraj stringa s.Pretpostavlja da u s ima dovoljno prostora. */void nadovezi_stringove(char s[], char t[]){

int i, j;/* Pronalazimo kraj stringa s */

for (i = 0; s[i]; i++);/* Vrsi se kopiranje, slicno f-ji kopiraj_string

*/for (j = 0; s[i] = t[j]; j++, i++);

s[i]=‘\0’;}

19

Page 20: Programiranje 1  programski jezik c

/* strcmp - Vrsi leksikografsko poredjenje dva stringa.Vraca :

0 - ukoliko su stringovi jednaki<0 - ukoliko je s leksikografski ispred t>0 - ukoliko je s leksikografski iza t

*/int uporedi_stringove(char s[], char t[]){/* Petlja tece sve dok ne naidjemo na prvi razlicit karakter

*/int i;for (i = 0; s[i]==t[i]; i++)

if (s[i] == '\0') /* Naisli smo na kraj oba stringa, a nismo nasli razliku */

return 0;/* s[i] i t[i] su prvi karakteri u kojima se niske razlikuju.Na osnovu njihovog odnosa, odredjuje se odnos stringova*/

return s[i] - t[i]; }

20

Page 21: Programiranje 1  programski jezik c

/* Vraća indeks prvog pojavljivanja karaktera c u niski s ili -1 ako se ne pojavljuje*/

int string_char(char s[], char c){

int i;for (i = 0; s[i]; i++)

if (s[i] == c)return i;

/* Nije nadjeno */return -1;

}

21

Page 22: Programiranje 1  programski jezik c

/* Pronalazi poslednju poziciju karaktera c u stringu s, odnosno -1 ukoliko s ne sadrži c */

int string_poslednji_char(char s[], char c){

/* Pronalazimo kraj stringa s */int i;for (i = 0; s[i]; i++);/* Krecemo od kraja i trazimo c unazad */for (i--; i>=0; i--)

if (s[i] == c)return i;

/* Nije nadjeno */return -1;

}

22

Page 23: Programiranje 1  programski jezik c

/* Proverava da li string str sadrzi string sub. Vraca poziciju na kojoj sub pocinje, odnosno -1 ukoliko ga nema */

int string_string(char str[], char sub[]){

int i, j;/* Proveravamo da li sub pocinje na svakoj poziciji i */for (i = 0; str[i]; i++)/* Poredimo sub sa str pocevsi od poziciji i sve dok ne naidjemo na razliku */for (j = 0; str[i+j] == sub[j]; j++)

/* Nismo naisli na razliku a ispitali smo sve karaktere niske sub */

if (sub[j+1]=='\0')return i;

/* Nije nadjeno */return -1;

}

23

Page 24: Programiranje 1  programski jezik c

main(){char s[100];char t[] = "Zdravo";char u[] = " svima";kopiraj_string(s, t);printf("%s\n", s);nadovezi_stringove(s, u);printf("%s\n", s);printf("%d\n",string_char("racunari", 'n'));printf("%d\n",string_poslednji_char("racunari", 'a'));printf("%d\n",string_string("racunari", "rac"));printf("%d\n",string_string("racunari", "ari"));printf("%d\n",string_string("racunari", "cun"));printf("%d\n",string_string("racunari", "cna"));}

24

Page 25: Programiranje 1  programski jezik c

Izlaz:ZdravoZdravo svima45052-1

25

Page 26: Programiranje 1  programski jezik c

Funkcija koja uklanja znak c kad god se pojavi u stringu s.

#include <stdio.h>void sazimanje(char s[], char c){

int i,j;for(i=j=0; s[i]!='\0';i++)if(s[i]!=c) s[j++]=s[i];s[j]='\0';

}

26

Page 27: Programiranje 1  programski jezik c

main() {

char niz[20];char c;printf("Unesi karakter\n\n");scanf("%c", &c);scanf("%s", niz);sazimanje(niz, c);printf("%s\n", niz);

}

27

Page 28: Programiranje 1  programski jezik c

Program na osnovu niske cifara broja u dekadnom zapisu izračunava vrednost broja, kao i obrnuto: na osnovu vrednosti broja formira string koji sadrži zapis broja u dekadnom sistemu.

(pogledati primer)

#include <stdio.h>#define MAX 12

28

Page 29: Programiranje 1  programski jezik c

/* Funkcija ucitava string sa ulaza u niz na ciji pocetak pokazuje pokazivac s, duzine max karaktera */

void ucitaj_string (char s[], int max){ int c; int i;

for (i = 0; (c = getchar ()) != EOF && c != ' ' && c != '\t'

&& c != '\n' && i < max - 1; i++) s[i] = c;

s[i] = '\0';

}29

Page 30: Programiranje 1  programski jezik c

/* Funkcija vraca broj koji je zapisan u dekadnom obliku u stringu na koji pokazuje s. Na pocetku stringa su dozvoljene vodece beline, nakon cega sledi opcioni znak, i na kraju same cifre broja. Eventualni karakteri nakon cifara se ignorisu. Ova funkcija je identicna funkciji atoi() iz standardne biblioteke */

int atoi_klon (char s[]){ int a = 0; /* Promenljiva u kojoj akumuliramo

vrednost */ int znak = 1; /* Znak (inicijalno +) */

/* Preskacemo beline */ while (*s == ' ' || *s == '\t') s++;

30

Page 31: Programiranje 1  programski jezik c

/* Prvi ne-blanko karakter je ili cifra, ili znak. Ako je znak u pitanju, tada po potrebi azuriramo promenljivu znak, i prelazimo na sledeci karakter. */

if (*s == '-') { znak = -1; s++; } else if (*s == '+') s++;

31

Page 32: Programiranje 1  programski jezik c

/* Racunamo vrednost broja */ while (*s >= '0' && *s <= '9') { a = 10 * a + *s - '0'; s++; }

/* Vracamo vrednost broja */ return znak * a;}

32

Page 33: Programiranje 1  programski jezik c

/* Funkcija obrni() obrce karaktere stringa */

void obrni (char cifre[]){ char *p = cifre, *q;

/* Petlja postavlja q da pokazuje na poslednji karakter u stringu. Pri tom se pod poslednjim podrazumeva karakter pre znaka '\0', koji se ne smatra delom stringa. */

33

Page 34: Programiranje 1  programski jezik c

for (q = cifre; *q != '\0'; q++); q--;

/* Obrtanje niza */ for (; p < q; p++, q--) { char t = *p; *p = *q; *q = t; }}

34

Page 35: Programiranje 1  programski jezik c

/* Funkcija na osnovu broja a kreira string sastavljen od dekadnih cifara broja a, sa eventualnim predznakom '-' */

void itoa (int a, char cifre[]){ int znak = 1; char *s = cifre;

35

Page 36: Programiranje 1  programski jezik c

/* Racunamo znak i apsolutnu vrednost */ if (a < 0) { a = -a; znak = -1; }

36

Page 37: Programiranje 1  programski jezik c

/* Izdvajamo cifre zdesna u levo i smestamo ih u string. */

do { *s = a % 10 + '0'; a /= 10; s++; } while (a);

37

Page 38: Programiranje 1  programski jezik c

/* Dopisujemo znak, ako je '-' */ if (znak == -1) *s++ = ‘-‘;

/* "Zatvaramo" string, na propisan nacin */ *s = ‘\0‘;

/* Obrcemo karaktere stringa */ obrni (cifre);}

38

Page 39: Programiranje 1  programski jezik c

int main (){ char cifre[MAX]; int a;

/* Ucitavamo string */ printf ("Uneti string oblika (+|-)dddd "); ucitaj_string (cifre, MAX);

/* Dobijamo broj iz stringa */ a = atoi_klon (cifre);

/* Prikazujemo broj */ printf ("Vrednost broja %d\n", a);

39

Page 40: Programiranje 1  programski jezik c

/* Ucitavamo broj */ printf ("Unesite broj: "); scanf ("%d", &a);

/* Kreiramo string sa ciframa */ itoa (a, cifre);

/* Prikazujemo string */ printf ("String sa ciframa broja: "); printf (“%s”, cifre);}

40